示例→基于Struts2的用户注册模块
1.用户注册模块需求描述
在用户注册页面中填写用户信息,包括用户名、用户密码、确认密码、姓名等信息,填写完成后提交注册表单给Struts 2的业务控制器Action,控制器处理提交的参数并决定跳转页面,若页面跳转到用户信息显示页面,则在该页面中显示用户信息。
2.模块实现
我们用如下表所示的代码文件来实现“用户注册模块”
(1)首先添加一个注册表单页面,该页面用来提交用户注册信息
Register.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用来接收用户提交的参数,并进行业务逻辑处理,最后进行页面跳转,在这里我们添加如下的判断处理
A、密码和确认密码必须输入,否则提示错误信息
B、密码和确认密码必须相同,否则提示错误信息
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>