struts2的数据校验详解编程语言

数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,服务器端数据验证主要特点:

·数据提交后在服务器端验证

·防止绕过客户端验证提交的非法数据

·可以在服务器端处理数据前保证数据的合法性

Struts2中有两种实现服务器端验证的方式。采用手工编写代码实现、基于XML配置方式实现。本文主要介绍基于XML配置方式实现。

在实际开发中,很多验证是相同的,对于这些许重复实现的验证,完全可以统一实现,struts2的验证框架就实现了这一功能。使用验证框架时,所有的验证规则是写在配置文件中,便于开发与维护,所以这里详细介绍一下验证框架。

1、jsp代码编写

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<!-- 加载struts2标签库 --> 
<%@ taglib uri="/struts-tags" prefix="s"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<base href="<%=basePath%>"> 
<s:head/> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>注册</title> 
</head> 
<body> 
    <form action="register" method="post"> 
        <table> 
            <tr> 
                <td>邮箱:</td> 
                <td><input type="text" name="email"/></td> 
                <!-- 使用<s:fielderror/>标签输入相应的字段错误信息 --> 
                <td><s:fielderror > 
                		<s:param>email</s:param> 
                	</s:fielderror></td> 
            </tr> 
            <tr> 
                <td>密码:</td> 
                <td><input type="password" name="password"/></td> 
                <td><s:fielderror> 
                		<s:param>password</s:param> 
                	</s:fielderror> 
            </tr> 
            <tr> 
                <td>重复密码:</td><td> 
                <input type="password" name="repassword"/></td> 
                <td><s:fielderror> 
                		<s:param>repassword</s:param> 
                	</s:fielderror></td> 
            </tr> 
            <tr> 
                <td>电话:</td> 
                <td><input type="text" name="phone"/></td> 
                <td><s:fielderror> 
                		<s:param>phone</s:param> 
                	</s:fielderror></td> 
            </tr> 
            <tr> 
                <td><input type="submit" value="提交"/></td> 
                <td></td> 
                <td></td> 
            </tr> 
        </table> 
    </form> 
</body> 
</html>

2、编写Action类和struts.xml配置文件

package struts.org; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
public class RegisterAction extends ActionSupport{ 
    //需要校验的字段必需在类中提供相应的字段和相应的get,set方法 
    private String email; 
    private String password; 
    private String repassword; 
    private String phone; 
     
    public String execute() throws Exception { 
    	System.err.println(111); 
        return SUCCESS; 
    } 
 
    public String getEmail() { 
        return email; 
    } 
 
    public void setEmail(String email) { 
        this.email = email; 
    } 
 
    public String getPassword() { 
        return password; 
    } 
 
    public void setPassword(String password) { 
        this.password = password; 
    } 
 
    public String getRepassword() { 
        return repassword; 
    } 
 
    public void setRepassword(String repassword) { 
        this.repassword = repassword; 
    } 
 
    public String getPhone() { 
        return phone; 
    } 
 
    public void setPhone(String phone) { 
        this.phone = phone; 
    } 
 
}

<!DOCTYPE struts PUBLIC 
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
        "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
	 
	<constant name="struts.i18n.encoding" value="UTF-8" /> 
	<constant name="struts.devMode" value="true"></constant> 
	<!-- <constant name="struts.ui.theme" value="simple"></constant> --> 
	<package name="/" extends="struts-default"> 
		 
        <action name="register" class="struts.org.RegisterAction"> 
            <result name="success">success.jsp</result> 
            <!-- 校验失败后,struts2会把页面转到名为"input"的页面中 --> 
            <result name="input">register.jsp</result> 
        </action> 
 
	</package> 
</struts> 

3、编写
validation配置文件

配置文件的命名必须为Xxx-yyy-validation.xml,Xxx为对应的action类名,yyy为配置文件中action元素的name属性值,这个文件只要与对应action类放在同一目录下就会被自动识别,这里命名为RegisterAction-register-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> 
    <!-- name值为需要被校验的字段,这里对email字段进行校验 --> 
    <field name="email"> 
        <!-- type值为校验器名,requiredstring:非空字符串校验器 --> 
        <field-validator type="requiredstring" short-circuit="true"> 
            <message>${getText("email.not.empty")}</message> 
        </field-validator> 
        <!-- 一个字段可以配置多个校验器,email:校验邮箱格式 --> 
        <field-validator type="email"> 
            <message>${getText("email.form.error")}</message> 
        </field-validator> 
    </field> 
     
    <field name="password"> 
        <field-validator type="requiredstring" short-circuit="true"> 
            <message>${getText("pass.not.empty")}</message> 
        </field-validator> 
        <!-- stringlength:字符串长度校验 --> 
        <field-validator type="stringlength"> 
            <!-- 为校验器指定参数实现不同的校验规则,minlength:最少长度 --> 
            <param name="minLength">6</param> 
            <message>${getText("pass.min.lenght")}</message> 
        </field-validator> 
    </field> 
     
    <!-- 校验两次密码是否一致,使用 fieldexpression 校验器。expression参数指定判断用的表达式--> 
    <field name="repassword"> 
        <field-validator type="fieldexpression"> 
            <!-- 表达式要写在   <![CDATA[]]>   内 --> 
            <param name="expression"><![CDATA[repassword==password]]></param> 
            <message>${getText("repass.not.same")}</message> 
        </field-validator> 
    </field> 
     
    <!-- 校验电话格式,使用regex正则表达示校验,regexExpression参数指定正则表达式 --> 
    <field name="phone"> 
        <field-validator type="regex"> 
            <!-- 注意!2.3.15后的版本使用 regexExpression 参数 2.3.15之前的版本为expression<span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;"> <span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;">--> 
            <param name="regexExpression"><![CDATA[/d{11}]]></param> 
            <message>${getText("tel.form.error")}</message> 
        </field-validator> 
    </field> 
     
</validators>

实现效果:

struts2的数据校验详解编程语言
另外可以使用Dojo插件实现类似于Ajax提交校验的效果

1、首先引入struts2-dojo-plugin-2.3.15.3.jar包

2、修改jsp页面(此处我使用的是另一个新的jsp)

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<!-- 加载struts2标签库 --> 
<%@ taglib uri="/struts-tags" prefix="s"%> 
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<base href="<%=basePath%>"> 
<sx:head/> 
<s:head/> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>注册</title> 
</head> 
<body> 
    <s:form action="register" method="post" validate="false"> 
    <table> 
     
    	<tr> 
	      	<td>邮箱</td> 
	      	<td><s:textfield name="email"></s:textfield></td> 
	      	<td><s:fielderror fieldName="email" cssStyle="color:blue"></s:fielderror> 
	      	</td> 
	    </tr> 
	    <tr> 
	       	<td>手机</td> 
	       	<td> 
	       		<s:textfield name="phone"></s:textfield> 
	       	</td> 
	       	<td> 
	       		<s:fielderror fieldName="phone"></s:fielderror> 
	       	</td> 
       	</tr> 
       	<tr> 
       	<td colspan="3"> 
       		<sx:submit validate="true"/> 
       	</td> 
       	</tr> 
         
    </table> 
    </s:form> 
</body> 
</html>

重要的是添加<sx:head/>和<sx:submit validate=”true”/>部分

实现效果:

struts2的数据校验详解编程语言

struts客户端校验很简单,在要提交的表单<s:form>上加上validate=”true”属性即可实现。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<!-- 加载struts2标签库 --> 
<%@ taglib uri="/struts-tags" prefix="s"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<base href="<%=basePath%>"> 
<s:head/> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>注册</title> 
</head> 
<body> 
    <s:form action="register" method="post" validate="true"> 
        <s:textfield label="邮箱" name="email"></s:textfield> 
        <s:textfield label="电话" name="phone"></s:textfield> 
        <s:submit ></s:submit> 
    </s:form> 
</body> 
</html>

不过需要注意两点:

1、不能配置<constant name=”struts.ui.theme” value=”simple”></constant>;

2、form标签必须使用struts的标签,即<s:form></s:form>和<s:textfield></s:textfield>等;

3、不能直接访问jsp页面,否则会出现如下错误,需要经过action进入jsp。

struts2的数据校验详解编程语言

如果不想使用通过action进入jsp的方法,那么还有另一个解决办法:

<s:form action="register.action" method="post" validate="true">

即在action属性值后面加.action

实现效果:

struts2的数据校验详解编程语言

资源下载

struts2.3.15.3.all包下载包含了struts2-dojo-plugin-2.3.15.3.jar包

项目源码下载

参考资料:

struts2中服务器端数据校验

Struts2.3 Ajax校验配置

struts2 form标签加上validate=”true”就出错的解决办法

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11186.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论