一个简单的struts例子

1、  生成一个新的Web应用,假设我们生成的应用程序的根目录在/Webapps/mystruts目录。

2、  http://jakarta.apache.org/ 下载Struts的安装文件

3、  /Webapps/mystruts目录下新建WEB-INF/lib目录从解压的文件中拷贝下列jar文件到/Webapps/mystruts/WEB-INF/lib目录。按照struts-examplelib文件夹应该是以下几个jar文件(或者直接从struts-examplelib文件夹拷贝过来),并将struts.jar填入classpath路径(编译Action需要引用)

commons-beanutils.jar

commons-collections.jar

commons-digester.jar

commons-fileupload.jar

commons-logging.jar

commons-validator.jar

jakarta-oro.jar

struts.jar

4、  创建一个web.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3
//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <taglib>
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>

</web-app>

5、  创建一个基本的struts-config.xml文件,并把它放在/Webapps/mystruts/WEB-INF/目录中,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1
//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <message-resources parameter="ApplicationResources" />

</struts-config>

6、  tld文件拷贝到WEB-INF目录下,包括:

struts-html.tld

struts-logic.tld

struts-nested.tld

struts-tiles.tld

struts-bean.tld

7、  建立logon.jsp,保存在mystruts目录下

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<HTML>
<HEAD>
<TITLE><bean:message key="logon.jsp.title"/></TITLE>
<html:base/>
</HEAD>
<BODY>
<h3><bean:message key="logon.jsp.page.heading"/></h3>
<html:errors/>
<html:form action="/logonAction.do" focus="username">
<TABLE border="0" width="100%">
<TR>
<TH align="right"><bean:message key="logon.jsp.prompt.username"/></TH>
<TD align="left"><html:text property="username"/></TD>
</TR>
<TR>
<TH align="right"><bean:message key="logon.jsp.prompt.password"/></TH>
<TD align="left"><html:password property="password"/></TD>
</TR>
<TR>
<TD align="right">
  <html:submit><bean:message key="logon.jsp.prompt.submit"/></html:submit>
</TD>
<TD align="left">
  <html:reset><bean:message key="logon.jsp.prompt.reset"/></html:reset>
</TD>
</TR>
</TABLE>
</html:form>
</BODY>

</HTML>

 

8、  建立main.jsp文件,保存在mystruts目录下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
 
<HTML>
<HEAD>
<TITLE><bean:message key="main.jsp.title"/></TITLE>
<html:base/>
</HEAD>
<BODY>
<logic:present name="userInfoForm">
<H3>
  <bean:message key="main.jsp.welcome"/> 
  <bean:write name="userInfoForm" property="username"/>!
</H3>
</logic:present>
</BODY>

</HTML>

9、  在你的应用程序的WEB-INF目录下再建一个classes目录,在新建的这个classes目录下再建如下几个目录entity(用于存放ActionForm)action目录(用于存放Action类)、bussness目录(用于存放作为Model的业务对象类)。

10、              建立ActionForm,编译后存放在entity目录下:

package entity;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
 
public class UserInfoForm extends ActionForm{
 
  private String username;
  private String password;
 
 
  public String getUsername() {
    return (this.username);
  }
  public void setUsername(String username) {
    this.username = username;
  }
 
  public String getPassword() {
    return (this.password);
  }
  public void setPassword(String password) {
    this.password = password;
  }

}

 

把如下代码添加到/webapps/mystruts/WEB-INF/struts-config.xml文件中:

<form-beans>
    <form-bean name="userInfoForm" type="entity.UserInfoForm" />

</form-beans>

第二步,我们建一个名为ApplicationResources.properties的文件(注意,名字要和struts-config文件中的名字相同),并把它放在/webapps/mystruts/WEB-INF/classes目录下。它在struts-config.xml的配置。

#Application Resource for the logon.jsp
logon.jsp.title=The logon page
logon.jsp.page.heading=Welcome World!
logon.jsp.prompt.username=Username:
logon.jsp.prompt.password=Password:
logon.jsp.prompt.submit=Submit
logon.jsp.prompt.reset=Reset
 
#Application Resource for the main.jsp
main.jsp.title=The main page

main.jsp.welcome=Welcome:

 

11、              建立Action.

package action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import bussness.UserInfoBo;
import entity.UserInfoForm;
public final class LogonAction extends Action {
  
  public ActionForward execute(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws IOException, ServletException {
    UserInfoForm userInfoForm = (UserInfoForm) form;         
    //web层获得用户名和口令
    String username = userInfoForm.getUsername().trim();
    String password = userInfoForm.getPassword().trim();
    //声明错误集对象
    ActionErrors errors = new ActionErrors();
    //校验输入
    if(username.equals("")){
      ActionError error=new ActionError("error.missing.username");
      errors.add(ActionErrors.GLOBAL_ERROR,error);
    }
    if(password.equals("")){
      ActionError error=new ActionError("error.missing.password");
      errors.add(ActionErrors.GLOBAL_ERROR,error);
    }
    
    //调用业务逻辑
    if(errors.size()==0){
      String validated = "";
      try{
        UserInfoBo userInfoBo=new UserInfoBo();
        validated =userInfoBo.validatePwd(username,password);
        if(validated.equals("match")){
          //一切正常就保存用户信息并转向成功的页面  
          HttpSession session = request.getSession();
          session.setAttribute("userInfoForm", form);          
           return mapping.findForward("success");
        } 
      }
      
      catch(Throwable e){
        //处理可能出现的错误
        e.printStackTrace();
        ActionError error=new ActionError(e.getMessage());
        errors.add(ActionErrors.GLOBAL_ERROR,error);
      }
    }  
    //如出错就转向输入页面,并显示相应的错误信息
    saveErrors(request, errors);    
    return new ActionForward(mapping.getInput());    
  } 

}

这个action类中有两个错误消息键要加到ApplicationResources.properties文件中,清单如下:


#Application Resource for the LogonAction.java
error.missing.username=<li><font color="red">missing username</font></li>
error.missing.password=<li><font color="red">missing password</font></li>>

struts-config.xml文件中定义Views Controller的关系,也就是配置所谓的ActionMapping。它们在struts-config.xml中的位置是排在… 标签后,我们的登录程序的配置清单如下:


<action-mappings>
    <action input="/logon.jsp" name="userInfoForm" path="/logonAction" scope="session" 
         type="action.LogonAction" validate="false">
      <forward name="success" path="/main.jsp" />      
    </action>
  </action-mappings>

生成应用程序所需要的model组件,该组件是完成应用程序业务逻辑的地方,现在我的登录程序的业务逻辑很简单,就是判断用户是不是test并且其口令是不是test如果是就返回一个表示匹配的字符串"match",否则,就抛出出错信息。其代码清单如下:


package bussness;
 
import entity.UserInfoForm;
 
public class UserInfoBo {
 
  public UserInfoBo(){
    
  }      
 
  public String validatePwd(String username,String password){
         
    String validateResult=""; 
       
    if(username.equals("test")&&password.equals("test")){
      validateResult="match";
    }
    else{
      
      throw new RuntimeException("error.noMatch");
    }            
    
    return validateResult;   
    
  }
}

我们同样要将其表示错误信息的键值设置在ApplicationResources.properties文件中,清单如下:


#Application Resource for the UserInfoBo.java
error.noMatch=<li><font color="red">no matched user</font></li>

编译运行应用程序: http://localhost:8080/mystruts/logon.jsp

 

最后让我们回顾一下我们都做了些什么:

1、  建立应用程序目录,在目录下建立WEB-INF目录,在这个目录下在建立libclasses目录

2、  WEB-INF目录下我们做如下操作:

建立web.xml文件

建立struts-config.xml文件

拷贝tld文件

3、  lib目录下拷贝strutsjar文件

4、  classes目录下建立类文件和ApplicationResources.properties资源文件。

5、  ActionForm,Action添加到struts-config.xml文件中

6、  建立JSP文件

7、  编译类文件,运行。

注:native2ascii -encoding GBK ApplicationResources.properties ApplicationResources_zh.properties可以将中文的资源文件转换成unicode,避免乱码。