一個(gè)struts工程的創(chuàng )建過(guò)程及運行原理文章分類(lèi):
Java編程1 在Myeclipse 中新建一個(gè)Web project,如圖,點(diǎn)擊Finish。
2 右擊項目名z-myfirstproject,選擇Myeclipse---Add Struts Capabilities
3 在出現的如下界面中,將包名稱(chēng)改為自己的包名稱(chēng):yan.struts,其他的默認即可,點(diǎn)擊確定。
4 完成以上步驟后,會(huì )在項目目錄中自動(dòng)添加一些jar包和文件等,如圖。
5 點(diǎn)擊打開(kāi) strust-config.xml,如下,右擊空白處,選擇 New ---Form Action and JSP,
6 在出現的Add Struts Capabilities界面中,輸入user case為login,因為要做一個(gè)登錄的用例。同時(shí)可以在下面的optional Details中的form Properties中點(diǎn)擊Add按鈕添加屬性。
7 這里添加兩個(gè)Form表單屬性,一個(gè)是username ,一個(gè)password,如下圖。
8 如下圖,選中Create JSP form選項,Superclass選擇 ActionForm。點(diǎn)擊Next
9 在出現的界面中的Optional Details中,選擇Forwards,點(diǎn)擊Add添加一個(gè)Forward。
10 點(diǎn)擊Add ,在出現的界面中填寫(xiě)Forward,點(diǎn)擊Add按鈕。然后在A(yíng)dd Struts Capabilities界面中點(diǎn)擊finish 按鈕。
11 以上操作完成后,會(huì )在項目中添加幾個(gè)文件,如下圖。
12 打開(kāi)WebRoot目錄下的form下的login.jsp頁(yè)面,可以看到系統自動(dòng)生成了登錄頁(yè)面,代碼如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title><bean:message key="login.hello"/></title>
</head>
<body>
<html:form action="/login.do">
username : <html:text property="username"/><html:errors property="username"/><br/>
password : <html:password property="password"/><html:errors property="password"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
13 在src目錄下的yan.struts.form目錄下自動(dòng)生成LoginForm.java,在該Java類(lèi)中編寫(xiě)validate()函數,進(jìn)行表單驗證,它完成的功能是:如果表單中輸入的username為空或者password為空,則生成表單驗證錯誤。返回錯誤結果給login頁(yè)面。代碼如下:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
ActionErrors errors=new ActionErrors();
if(username==null||username.length()<1)
{
errors.add("username",new ActionMessage("login.error.username"));
//這里username對應的是login.jsp中<html:errors property="username"/> }
if(password==null||password.length()<1)
{
errors.add("password",new ActionMessage("login.error.userpassword"));
//這里password對應的是login.jsp中<html:errors property=" password "/>
}
return errors;
}
當用戶(hù)提交了HTML表單后,struts框架將自動(dòng)把表單數據組裝到ActionForm中,Actionform中的屬性和HTML表單中的字段一一對應。ActionForm還提供數據驗證方法,以及把屬性重新設置為默認值的方法。Struts框架中定義的ActionForm類(lèi)是抽象的,必須在應用中創(chuàng )建它的子類(lèi),來(lái)存放具體的HTML表單數據。
ActionForm實(shí)質(zhì)是一種JavaBean,不過(guò)它除了具有javabean的常規方法,還有兩種特殊方法:validate()用于表單驗證;reset()把屬性重新設置為默認值。
當用戶(hù)提交了HTML表單后,struts框架會(huì )自動(dòng)把表單數據組裝到ActionForm中,如果在
Struts-config.xml配置文件中mapping配置中有 validate=true這一選項,則接下來(lái)struts框架會(huì )自動(dòng)調用ActionForm中vlidate()方法進(jìn)行表單驗證。如果Validate()方法返回的ActionErrors對象為null,或者不包含任何ActionMessage對象,就表示沒(méi)有錯誤,數據驗證通過(guò)。如果ActionErrors中包含ActionMessage對象,就表示發(fā)生了錯誤,Struts框架會(huì )把ActionErrors對象保存到request范圍內,然后把請求轉發(fā)到恰當的視圖組件,視圖組件通過(guò)
<html:errors>標簽把request范圍內的ActionErrors對象中包含的錯誤消息顯示出來(lái),提示用戶(hù)修改錯誤。
14 上面的代碼中用到了 new ActionMessage("login.error.username"),這里的
login.error.username 需要在A(yíng)pplicaitonResources.properties中定義。
打開(kāi)ApplicaitonResources.properties(它在src----yan.struts目錄下)
右擊 ApplicaitonResources.properties,選擇Openwith ------Myeclipse Property Editor,打開(kāi)編輯器,點(diǎn)擊Add 按鈕添加
15 打開(kāi)LoginAction.java,在該類(lèi)中有一個(gè)execute()方法,它完成對表單信息的業(yè)務(wù)邏輯驗證以及對相關(guān)處理。編輯該方法如下:
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
String username1=loginForm.getUsername();
String username=null;
try {
username=new String(username1.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//以上將form表單中獲得用戶(hù)名轉換為UTF-8格式。
String password=loginForm.getPassword();
ActionMessages errors=new ActionMessages();
String badusername="admin";
String badpassword="123456";
if(username.equals(badusername))
{
errors.add("username",new ActionMessage("login.error.badusername",badusername));
//如果用戶(hù)名驗證失敗,將ActionMessage對象保存到ActionMessages對象errors中。
//login.error.badusername對應消息資源文件中的login.error.badusername的值。
saveErrors(request,errors);
//保存ActionMessages對象errors到request范圍。
return new ActionForward(mapping.getInput());
//返回ActionForward對象,Struts框架會(huì )把請求轉發(fā)到視圖組件login.jsp中,通過(guò)來(lái)顯示錯誤信息。
}
if(password.equals(badpassword))
{
errors.add("password",new ActionMessage("login.error.badpassword",badpassword));
saveErrors(request,errors);
return new ActionForward(mapping.getInput());
}
request.setAttribute("username",username);
request.setAttribute("password",password);
//將username和password的值存入request范圍內,可以傳遞到下一頁(yè)面。
return mapping.findForward("login-success");//返回下一頁(yè)面,login-success對應struts-config.xml中<forward>屬性
}
}
所有的Action類(lèi)都是org.apache.struts.action.Action的子類(lèi),Action子類(lèi)應該覆蓋父類(lèi)的execute()方法,當ActionForm被創(chuàng )建,并且表單驗證順利通過(guò)后,struts框架就會(huì )調用Action類(lèi)的execute()方法,該方法的包含如下參數:
ActionMapping:包含了這個(gè)Action的配置信息,和struts-config.xml文件中的<action>元素對應。
ActionForm:包含了用戶(hù)的表單數據,當struts框架調用execute()方法時(shí),ActionForm中的數據已經(jīng)通過(guò)了表單驗證。
HttpServletRequest:當前的HTTP請求對象。
HttpServletResponse:當前的Http相應對象。
16 在WebRoot下新建success.jsp文件,代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>