Struts2提供了一个Action接口,该接口定义了Struts2的Action处理类应该实现的规范。
Struts2还为Action接口提供了一个实现类:ActionSupport,该类提供了若干默认方法:
默认的处理用户请求的方法(excute()方法)
数据校验的方法
添加校验错误信息的方法
获取国际化信息的方法等
1.ActionSupport类的重要方法validate()
validate()是空的输入校验方法,常被各Action类覆盖
例:下面这个Action类继承了ActionSupport类
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
……
public void validate() {
String account = loginUser.getAccount();
String pwd = loginUser.getPassword();
if (account == null || account.equals("")) {
this.addFieldError("loginUser.account", "请输入您的用户名!");
}
if (pwd == null || pwd.equals("")) {
this.addFieldError("loginUser.password", "请输入您的密码!");
}
}
}
当用户按下提交按钮时,Struts2 将自动执行validate方法(在执行execute()方法之前),如果方法中列出的任何if语句为真,Struts2 将调用addFieldError方法,不会调用其他方法。Struts2 框架将返回input作为调用操作的结果。
然后我们在struts.xml文件中配置返回结果input:
(即如果调用了addFieldError则又跳转到登录页面login.jsp
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 上面这行需要联网环境,没联网需要把http://struts.apache.org/dtds/struts-2.3.dtd对应到本地struts-2.3.dtd文件路径 -->
<!-- 这个配置有助于开发中的提示和检错,对Struts配置没有影响 -->
<struts>
<package name="strutsBean" extends="struts-default" namespace="/">
<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
<result name="{1}success" type="redirect">/{1}Success.jsp</result>
<result name="{1}fail">/{1}Fail.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
运行之后的结果是这样的:
什么都不填直接提交:
如果在login.jsp的前面加入<s:fielderror />
<body>
<s:fielderror />
<s:form action="loginAction" method="post">
<s:textfield name="loginUser.account" label="请输入用户名" />
<s:password name="loginUser.password" label="请输入密码" />
<s:submit value="登录" method="login"/>
</s:form>
</body>
那么显示结果是这样的:
2. 通过addActionMessage来增加消息
如果输入通过了validate方法的校验没有抛出fielderror,那么就会进入到处理方法中,这里以login为例,我们可以在UserAction类的login方法中添加addActionMessage:
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
……
public String login() {
count++;
UserService userServ = new UserService();
if(userServ.login(loginUser)) {
this.addActionMessage("登录成功!");
return "loginsuccess";
}
this.addActionError("用户名或密码错误,请重新输入!");
return "loginfail";
}
}
然后在登录成功页面增加<s:actionmessage />
将登录失败页面也改至跳转到login.jsp 再在login.jsp中增加<s:actionerror />
则若用户名或密码为空则显示fielderror的内容,若不匹配则显示actionerror的内容
3.使用.xml文件(校验规则文件)
如果需要在Action中对某个特定的方法进行校验,则需要为此特定方法专门定义一个校验文件(否则,调用默认的)。
该文件应该与action类的文件位于同一个路径下。
命名规则:Action名-处理方法名-validation.xml
同时,还需要在struts.xml文件配置action时指定其method属性(否则,调用默认的)。
UserAction-login-validation.xml文件代码如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="loginUser.account">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="loginUser.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
</field>
</validators>
常用校验规则:
field-validator type | 描述 |
---|---|
required | 必填校验器 |
requiredstring | 必填字符串校验器 |
int | 整数校验器 |
double | 双精度浮点数校验器 |
date | 日期校验器 |
stringlength | 字符串长度校验器 |
例:
……
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message>必须在1-10之间</message>
</field-validator>
……
<field name="birth">
<field-validator type="date">
<param name="min">1950-01-01</param>
<param name="max">2020-01-01</param>
<message key="birth.range"/>
</field-validator>
……
<field-validator type="stringlength">
<param name="minlength">4</param>
<param name="maxlength">20</param>
<message>输入长度必须在4到20之间</message>
</field-validator>