Struts2数据校验
数据校验分为客户端校验和服务器端校验,客户端校验是指通过JavaScript或jQuery等前端手段,对提交前的数据进行一些格式的校验;服务器校验是指服务器端通过检查客户端的提交信息是否符合要求。这里主要讲解的是服务器端校验。
在Struts2中服务器端校验有两种方式:通过Action的validate()方法校验和使用XWork检验框架实现校验。
1.通过Action的validate()方法校验
Struts2提供了一个com.opensymphony.xwork2.Validateable接口,通过实现该接口中的validate()方法,我们可以把校验输入信息的代码写入到validate()方法里。
ActionSupport类就实现了Validateable接口,因此,我们的Action只要继承了ActionSupport类,就可以通过重写validate()方法,在validate()方法中进行输入信息的校验。
validate()方法会对Action中所有处理逻辑实现相同的校验规则进行数据校验。
validateX()方法可以精确的对Action中的某一个方法进行校验,其中X表示处理逻辑的方法名。
注意:validate()方法在execute()(也可以是其他方法)方法前被执行,仅当数据校验正确,才执行execute()方法,如果校验出错,则将错误信息添加到ActionSupport类的fieldErrors域中,再在JSP页面中输出。
示例如下:
(1)编写输入信息页面register.jsp,核心代码如下(需要引入struts-tags):
<body> <s:fielderror /> <form action="${pageContext.request.contextPath}/register.action" method="post"> 姓名:<input type="text" name="name"/><br> 年龄:<input type="text" name="age" /><br> <input type="submit" value="submit" /> </form> </body> |
(2)编写继承了ActionSupport类的Action:
publicclass RegisterAction extends ActionSupport { private String name; privateintage; @Override public String execute() throws Exception { return"hello"; } public String register(){ return"hello"; } @Override publicvoid validate() { System.out.println("这里是validate()方法"); } publicvoid validateRegister() { System.out.println("这里是validateRegister()方法"); if(name==null||name.length()<=0){ addFieldError("name", "姓名不能为空"); } if(age<=0||age>150){ addFieldError("age", "年龄输入错误"); } } public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(intage) { this.age = age; } } |
(3)在struts.xml中注册Action:
<action name="register" class="com.chen.action.RegisterAction" method="register"> <result name="input">/register.jsp</result> <result name="hello">/show.jsp</result> </action> |
(4)注册成功后,显示用户信息show.jsp,核心代码如下:
<body> ${name}<br> ${age} </body> |
通过运行可以看到validateX()方法在validate()方法前面调用。一般来说,在调用Action的某个业务逻辑处理方法前,会先查看有没有与该处理逻辑对应的validateX()方法
,然后在查看validate()方法。
如果数据校验时出现了错误信息,Struts2框架就不会在调用业务逻辑处理了,而是转到struts.xml文件中找到该Action对应的name属性为input的result,进入该元素指定的视图中。