一個簡單的struts例子
1、 生成一個新的Web應用,假設我們生成的應用程序的根目錄在/Webapps/mystruts目錄。
2、 到http://jakarta.apache.org/ 下載Struts的安裝文件
3、 在/Webapps/mystruts目錄下新建WEB-INF/lib目錄從解壓的文件中拷貝下列jar文件到/Webapps/mystruts/WEB-INF/lib目錄。按照struts-example的lib文件夾應該是以下幾個jar文件(或者直接從struts-example的lib文件夾拷貝過來),并將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目錄,在這個目錄下在建立lib和classes目錄
2、 在WEB-INF目錄下我們做如下操作:
建立web.xml文件
建立struts-config.xml文件
拷貝tld文件
3、 在lib目錄下拷貝struts的jar文件
4、 在classes目錄下建立類文件和ApplicationResources.properties資源文件。
5、 將ActionForm,Action添加到struts-config.xml文件中
6、 建立JSP文件
7、 編譯類文件,運行。
注:native2ascii -encoding GBK ApplicationResources.properties ApplicationResources_zh.properties可以將中文的資源文件轉換成unicode,避免亂碼。