示例→基於Struts2的用戶註冊模塊html
1.用戶註冊模塊需求描述java
在用戶註冊頁面中填寫用戶信息,包括用戶名、用戶密碼、確認密碼、姓名等信息,填寫完成後提交註冊表單給Struts 2的業務控制器Action,控制器處理提交的參數並決定跳轉頁面,若頁面跳轉到用戶信息顯示頁面,則在該頁面中顯示用戶信息。apache
2.模塊實現瀏覽器
咱們用以下表所示的代碼文件來實現「用戶註冊模塊」session
(1)首先添加一個註冊表單頁面,該頁面用來提交用戶註冊信息app
Register.jsp:jsp
<%@page language="java" pageEncoding="gb2312"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>用戶註冊頁面</title> </head> <body> <form action="register.action" method="post"> <table> <tr><td colspan="2"><s:actionerror/></td></tr> <tr><td>用戶名:</td> <td><input type="text" name="username"></td></tr> <tr><td>密碼:</td> <td><input type="password" name="upassword"></td></tr> <tr><td>確認密碼:</td> <td> <input type="password" name="repassword"></td></tr> <tr><td>姓名:</td> <td><input type="text" name="name"></td></tr> <tr><td>年齡:</td> <td><input type="text" name="age"></td></tr> <tr><td>出生日期:</td> <td><input type="text" name="birth"></td></tr> <tr><td>郵箱地址:</td> <td><input type="text" name="email"></td></tr> <tr><td><input type="submit" value="提交"></td> <td><input type="reset" value="重置"></td></tr> </table> </form> </body> </html>
(2)添加註冊Action,該Action用來接收用戶提交的參數,並進行業務邏輯處理,最後進行頁面跳轉,在這裏咱們添加以下的判斷處理post
A、密碼和確認密碼必須輸入,不然提示錯誤信息測試
B、密碼和確認密碼必須相同,不然提示錯誤信息this
package com.sanqing.action; import com.opensymphony.xwork2.ActionSupport; public class RegisterAction extends ActionSupport{ private String username; //用戶名信息 private String upassword; //密碼信息 private String repassword; //確認密碼 private String name; //姓名 private String age; //年齡 private String birth; //出生日期 private String email; //email地址 public String getUsername() { //得到用戶名 return username; } public void setUsername(String username) {//設置用戶名 this.username = username; } public String getUpassword() {//得到密碼 return upassword; } public void setUpassword(String upassword) {//設置密碼 this.upassword = upassword; } public String getRepassword() {//得到重複密碼 return repassword; } public void setRepassword(String repassword) {//設置重複密碼 this.repassword = repassword; } public String getName() {//得到姓名 return name; } public void setName(String name) {//設置姓名 this.name = name; } public String getAge() {//得到年齡 return age; } public void setAge(String age) {//設置年齡 this.age = age; } public String getBirth() {//得到出生日期 return birth; } public void setBirth(String birth) {//設置出生日期 this.birth = birth; } public String getEmail() {//得到email地址 return email; } public void setEmail(String email) {//設置email地址 this.email = email; } public void validate() { if(upassword == null || "".equals(upassword)){ this.addActionError("密碼必須輸入"); } if(repassword == null || "".equals(repassword)) { this.addActionError("確認密碼必須輸入"); } if(upassword != null && repassword != null && !repassword.equals(upassword)){ this.addActionError("密碼和確認密碼必須相同"); } } public String execute() throws Exception {//執行方法 return "success"; } }
解說:上述代碼中添加了一個execute()方法,該方法是Action的執行方法,能夠經過在該方法中添加業務邏輯代碼或調用業務邏輯方法來完成邏輯操做,同時該方法返回一個普通的字符串,這個字符串對應着配置文件struts.xml中的一個視圖文件。
上述代碼中RegisterAction繼承了ActionSupport,其目的是爲了可以使用ActionSupport中定義的一些方法來完成校驗操做,如上述代碼中RegisterAction實現了ActionSupport的validate()方法,在validate()方法中添加輸入校驗代碼來判斷密碼和確認密碼是否輸入及是否相同,其中經過ActionSupport的addActionError()方法來添加錯誤信息。
(3)添加完Action後,須要在struts.xml文件中配置該Action,包括請求地址和處理結果與視圖資源之間的關係
<?xml version="1.0" encoding="UTF-8" ?><!-- XML聲明 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><!-- 指定Struts 2配置文件的DTD信息 --> <struts><!-- 根節點 --> <constant name="struts.i18n.encoding" value="gb2312"></constant> <package name="struts2" extends="struts-default"> <!-- 定義register的Action,其實現類爲com.sanqing.action.RegisterAction--> <action name="register" class="com.sanqing.action.RegisterAction"> <!-- 定義處理結果與視圖資源之間的關係--> <result name="success">/ShowUserInfo.jsp</result> <result name="input">/Register.jsp</result> </action> </package> </struts>
解說:上述代碼定義了一個"input"處理結果,其對應的頁面爲Register.jsp,也就是用戶註冊頁面。在前面的業務控制器RegisterAction中並無返回「input」結果,如何會自動跳轉到註冊頁面呢?這個與Struts 2的攔截機制有關,當代碼中使用了addActionError()方法添加錯誤信息時,Struts 2會自動發現這些錯誤信息,並返回結果「input」,在前面的Register.jsp頁面中有輸出校驗錯誤語句:<s:actionerror/>。
<s:actionerror/>是屬於Struts 2標籤庫中的標籤,用來輸出ActionError中的錯誤信息,由於在用戶註冊頁面Register.jsp中使用了Struts 2的標籤庫,因此還須要使用taglib指令來引入標籤庫,代碼以下:
<%@taglib prefix="s" uri="/struts-tags"%>
該標籤指令表示Struts 2的全部標籤都是用"s"做爲前綴,Struts的標籤庫的URI爲"/struts-tags"。
(4)添加結果顯示頁,在該結果頁面中顯示用戶提交的全部參數
ShowUserInfo.jsp:
<%@page language="java" pageEncoding="gb2312"%> <html> <head> <title>用戶信息</title> </head> <body> 用戶名:${username}<br> <!-- 顯示用戶名信息 --> 密碼:${upassword}<br> <!-- 顯示密碼信息 --> 確認密碼:${repassword}<br> <!-- 顯示確認密碼信息 --> 姓名:${name}<br> <!-- 顯示姓名信息 --> 年齡:${age}<br> <!-- 顯示年齡信息 --> 出生日期:${birth}<br> <!-- 顯示出生日期信息 --> 郵箱地址:${email}<br> <!-- 顯示郵箱地址信息 --> </body> </html>
解說:在上述代碼中使用了EL表達式,使用時沒有指定範圍,而是直接使用${username},這時EL將默認從page範圍開始查找,若是找不到,再依次到request、session、application範圍中找,若是沒有找到就返回null,在網頁中也就沒有顯示。
3.功能測試
打開瀏覽器,在瀏覽器地址欄中輸入 http://localhost:8080/StrutsPro/Register.jsp打開用戶註冊頁面,不輸入任何用戶信息,單擊「提交」按鈕進行註冊,彈出錯誤提示頁面,提示「密碼必須輸入」和「確認密碼必須輸入」等信息
小結
(1)爲何在struts.xml中定義包時須要繼承struts-default包?
答:Struts 2中的全部Action都必須定義在包(package)下,在struts-default包中定義了許多Struts 2的默認配置,如攔截器、返回結果類型等,經過繼承struts-default包能夠使用這些默認配置。
(2)Struts 2的Action爲何能自動得到參數值?
答:這個與Struts2的攔截器有關,Struts 2經過攔截器機制對參數進行攔截,並經過參數名稱在相應Action中尋找匹配的setter方法將參數值設置上,Action中的屬性名稱必須和表單提交參數保持一致。
(3)提交中文參數值時獲得的是亂碼,該如何處理?
答:須要在配置文件struts.xml中配置參數編碼格式,在package包前添加以下代碼:
<constant name="struts.i18n.encoding" value="gb2312"></constant>