一、概述
在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验。
下面通过两种方式来阐述Struts 2的数据校验功能。
二、重写validate方法
我们编写的Action一般继承与ActionSupport,而ActionSupport不仅实现了Action接口,还实现了Validatable接口,提供了数据校验功能。在Validatable接口中定义一个validate方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldError域中,然后通过OGNL表达式输出。
下面是用户登录界面:
<%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>???????</title> </head> <body> <s:form action="login"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="登录"></s:submit> </s:form> </body> </html>
用户输入数据后,提交到loginAction中:
public class LoginActionexample extends ActionSupport { private static final long serialVersionUID = -849990804545358129L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String execute() throws Exception { if (getUsername().equals("xujian")&&getPassword().equals("123456")) { return SUCCESS; } else return ERROR; } @Override public void validate() { if(getUsername()==null||getUsername().trim().equals("")) { addFieldError("username","用户名不能为空"); } if(getPassword()==null||getPassword().trim().equals("")) { addFieldError("password","密码不能为空"); } } }
上面的LoginAction类重写了validate方法,该方法会在执行excute方法之前执行,如果执行该方法之后,Action类的filedError中包含了数据校验错误,请求将被转发到input逻辑视图。
struts.xml配置如下:
<action name="loginexample" class="com.LoginActionexample"> <result name="input">/login.jsp</result> <result name="success">/welcome.jsp</result> <result name="error">/error.jsp</result> </action>
如果输入为空,则会提示:
这是因为<s:form>标签和Struts2表单控件标签具备了输出校验提示的能力。
三、使用Struts2的校验框架
我们还可以不重写validate方法,而通过增加校验配置文件来进行数据校验。这个校验配置文件通过使用Struts2已有的校验器来完成对表单域的校验,下面以requiredstring校验器为例,这个校验器是一个必填校验器,指定某个表单域必须输入。
下面是这个校验配置文件的写法:
<?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="username"> <field-validator type="requiredstring"> <message key="用户名不能为空"></message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <message key="密码不能为空"></message> </field-validator> </field> </validators>
注意:这个校验配置文件必须遵守下面两个规则:
1、该文件命运格式必须是Action类名-validation.xml,例如本例中该文件名为:LoginActionexample-validation.xml。
2、该文件必须与Action类的class文件位于同一路径下,本例中文件位于
本例中的LoginAction类为:
public class LoginActionexample extends ActionSupport { private static final long serialVersionUID = -849990804545358129L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String execute() throws Exception { if (getUsername().equals("xujian")&&getPassword().equals("123456")) { return SUCCESS; } else return ERROR; } }
最后不要忘记,在struts.xml文件中依然要为input逻辑视图指定物理视图资源。