一個簡單的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,避免亂碼。