在struts2中有validate()方法,可以用于实现在服务器端对用户输入信息进行校验。
该方法需要类继承ActionSupport类,通过重写validate()方法实现。
struts2框架在执行Action类时,会在调用该Action类中的罗技处理方法之前,调用validate()方法。
validate()方法的父类中还有一个addFieldError()方法,可以在该方法传入fieldErrror值。放执行完validate(),进入execute()方法前,系统会检查有没有fieldError,如果有,则不执行execute()方法,而是返回一个input逻辑视图。
这个流程大致如下:
1. 在jsp的form表单如下:
<form action="login" method="POST" id="form" >
<div class="inputText"><span>用户名: </span>
<span><s:fielderror/></span>
<input type="text" name="username" id="username" class="username"></div>
<input type="button" value="提交">
</form>
其中s标签<s:fielderror/>可以显示validate()返回的错误信息,也就是在validate()方法中调用其父类方法addFieldError()传递的值。
2. action文件中代码如下:
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String Login(){
……
}
public void validate() {
// TODO Auto-generated method stub
if(user.getUsername().trim()==null || "".equals(user.getUsername().trim())){
this .addFieldError("usernameError", "用户名不能为空");
}
}
在跳转该action时,先执行了validate()方法,当符合条件user.getUsername().trim()==null || "".equals(user.getUsername().trim())时,通过父类的addFieldError()方法添加一条错误信息,并通过struts.xml中的配置跳转进入处理页面。
3. 在struts.xml文件中也需要在该action下配置name="input"的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="cr.mypackage" extends="struts-default">
<action name="login" class="com.cr.service.LoginAction" method="Login">
<result name="success" type="redirect">/page/ChatRoom.jsp</result>
<result name="input">/MainPage.jsp</result>
</action>
<action name="webSocket" class="com.cr.service.WebSocketDemo">
</action>
</package>
</struts>
只有配置了<result name="input">/MainPage.jsp</result> ,在action的validate()中被拦截后才会跳转到input指定的jsp页面——/MainPage.jsp。
=====================================================
上面这种调用validate()方法会对该方法所在的整个action()生效。如果想对该action中的特定方法生效而不对传入其它方法的参数进行校验,可以使用validateXxxx()。例如上例中如果仅对LoginAction类中的 Login()方法起效,则将“Xxxx”用“Login”代替。注意第一个字母需要大写。
以上文中为例,只需要将action中修改如下:
public class LoginAction extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public String Login(){
……
}
public void validateLogin() {
// TODO Auto-generated method stub
if(user.getUsername().trim()==null || "".equals(user.getUsername().trim())){
this .addFieldError("usernameError", "用户名不能为空");
}
}
struts.xml和MainPage.jsp中代码无需做改动。即可实现仅针对LoginAction类中Login()方法的输入校验。