一。
1.继承 ActionSupport
ActionSupport 已经实现了 Action 接口,还实现了 Validateable 接口,提供数据校验功能。
在 Validateble 接口定义了一个 validate() 方法,重写该方法,如果校验表单输入域出现出错,则将错误添加到 ActionSupport 类的 fieldErrors 域中,然后通过 OGNL 表达式负责输出。
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionContext; //继承ActionSupport来实现Struts 2的Action类 public class LoginAction extends ActionSupport { //下面是Action内用于封装用户请求参数的两个属性 private String username; private String password; //username属性的getter和setter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //password属性的getter和setter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //处理用户请求的execute方法 public String execute() throws Exception { //当用户请求参数的username等于crazyit,密码请求参数为leegang时, //返回success字符串,否则返回error字符串 if (getUsername().equals("crazyit") && getPassword().equals("leegang")) { //通过ActionContext对象访问Web应用的HTTP Session ActionContext.getContext().getSession() .put("user" , username); return SUCCESS; } else { return ERROR; } } //完成输入校验需要重写的validate方法 public void validate() { //如果用户名为空,或者用户名为空字符串 if (getUsername() == null || getUsername().trim().equals("")) { //添加校验错误提示,使用getText方法来使提示信息国际化 //非国际化 addFieldError("username", "失败!")); addFieldError("username", getText("user.required")); } //当密码为空,或者密码为空字符串时,添加表单校验错误 if (getPassword() == null || getPassword().trim().equals("")) { addFieldError("password", getText("pass.required")); } } }
下面的 Action 类重写了 validate 方法,该方法会在 execute 方法之前执行,如果执行该方法之后,Action 类的 fieldErrors中已经包含了数据校验错误,请求将被转发 到 input 逻辑视图出,所以 在 struts.xml 中 要配置 input ,如下:
<?xml version="1.0" encoding="GBK"?> <!-- 指定Struts 2配置文件的DTD信息 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <!-- struts是Struts 2配置文件的根元素 --> <struts> <!-- Struts 2的Action必须放在指定的包空间下定义 --> <package name="strutsqs" extends="struts-default"> <!-- 定义login的Action,该Action的实现类为lee.LoginAction类 --> <action name="login" class="lee.LoginAction"> <!-- 定义处理结果和视图资源之间映射关系 --> <!-- 定义input的逻辑视图名,对应login.jsp页面 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <!-- 定义获取图书的Action,对应实现类为lee.GetBooksAction --> <action name="getBooks" class="lee.GetBooksAction"> <!-- 如果处理结果返回login,进入login.jsp页面 --> <result name="login">/login.jsp</result> <!-- 如果处理结果返回success,进入showBook.jsp页面 --> <result name="success">/showBook.jsp</result> </action> </package> </struts>
支持国际化
getText(key) 方法可以根据资源文件加载获得国际化提示信息
public void validate() { //如果用户名为空,或者用户名为空字符串 if (getUsername() == null || getUsername().trim().equals("")) { //添加校验错误提示,使用getText方法来使提示信息国际化 //非国际化addFieldError("username", "失败!")); addFieldError("username", getText("user.required")); } //当密码为空,或者密码为空字符串时,添加表单校验错误 if (getPassword() == null || getPassword().trim().equals("")) { addFieldError("password", getText("pass.required")); } }
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!-- 导入Struts 2标签库 --> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><s:property value="getText('loginPage')"/></title> <meta name="website" content="http://www.crazyit.org" /> </head> <body> <!-- 使用form标签生成表单元素 --> <s:form action="login"> <!-- 支持国际化 --> <!-- 生成一个用户名文本输入框 --> <s:textfield name="username" key="user"/> <!-- 生成一个密码文本输入框 --> <s:textfield name="password" key="pass"/> <!-- 不支持国际化 --> <!-- 生成一个用户名文本输入框 --> <s:textfield name="username" label="用户名"/> <!-- 生成一个密码文本输入框 --> <s:textfield name="password" label="密 码"/> <!-- 生成一个提交按钮 --> <s:submit key="login"/> </s:form> </body> </html>
2.使用 Struts2 的校验框架
Action (不重写 validate 方法),却增加一个校验配置文件,配置文件通过 Struts2 已有的校验器,完成表单校验。Struts2 提供了大量的数据校验器,包括表单域校验器和飞表单域校验器2种。
以下使用了 requiredstring 校验器,该校验器是一个必填校验器------指定某个表单域必须输入
<?xml version="1.0" encoding="GBK"?> <!-- 指定校验规则文件的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <!-- 校验规则定义文件的根元素 --> <validators> <!-- 校验第一个表单域:username --> <field name="username"> <!-- 该表单域必须填写 --> <field-validator type="requiredstring"> <!-- 如果校验失败,显示user.required对应的信息 --> <message key="user.required"/> </field-validator> </field> <!-- 校验第二个表单域:password --> <field name="password"> <field-validator type="requiredstring"> <!-- 如果校验失败,显示pass.required对应的信息 --> <message key="pass.required"/> </field-validator> </field> </validators>
ActionName-validation.xml:其中 ActionName 就是需要校验的 Action 的类名。
因此上面的校验规则文件应该命名为 "LoginAction-validation.xml",并且该文件应该与 Action 类的 class 文件位于同一个路径下。增加该检验规则文件后, LoginAction 不必重写 validate() 方法也可完成输入校验。
在 struts.xml 文件的 Action 定义中,一样需要为 input 逻辑视图指定物理视图资源,将 input 逻辑视图映射到 login.jsp
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionContext; //继承ActionSupport来实现Struts 2的Action类 public class LoginAction extends ActionSupport { //下面是Action内用于封装用户请求参数的两个属性 private String username; private String password; //username属性的getter和setter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } //password属性的getter和setter方法 public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //处理用户请求的execute方法 public String execute() throws Exception { //当用户请求参数的username等于crazyit,密码请求参数为leegang时, //返回success字符串,否则返回error字符串 if (getUsername().equals("crazyit") && getPassword().equals("leegang")) { //通过ActionContext对象访问Web应用的HTTP Session ActionContext.getContext().getSession() .put("user" , username); return SUCCESS; } else { return ERROR; } } }
<!-- 定义login的Action,该Action的实现类为lee.LoginAction类 --> <action name="login" class="lee.LoginAction"> <!-- 定义处理结果和视图资源之间映射关系 --> <!-- 定义input的逻辑视图名,对应login.jsp页面 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action>
<s:form action="login"> <!-- 生成一个用户名文本输入框 --> <s:textfield name="username" key="user"/> <!-- 生成一个密码文本输入框 --> <s:textfield name="password" key="pass"/> <!-- 生成一个提交按钮 --> <s:submit key="login"/> </s:form>