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><span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;">--></span>
            <param name="regexExpression"><![CDATA[\d{11}]]></param>
            <message>${getText("tel.form.error")}</message>
        </field-validator>
    </field>
    
</validators>
实现效果:


另外可以使用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"/>部分

实现效果:


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。


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

<s:form action="register.action" method="post" validate="true">
即在action属性值后面加.action

实现效果:


资源下载

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

项目源码下载

参考资料:

struts2中服务器端数据校验

Struts2.3 Ajax校验配置

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



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Struts2面试题包括以下内容: 1. SpringMVC与Struts2的主要区别。 2. Struts2中如何访问HttpServletRequest、HttpSession和ServletContext三个域对象? 3. Struts2中的拦截器有什么用途? 4. Struts2中的默认包struts-default有什么作用? 5. Struts2中,Action并没有直接收到用户的请求,那它为什么可以处理用户的请求?又凭什么知道一个请求到底交给哪一个Action来处理? 6. Struts2中,Action通过什么方式获取用户从页面输入的数据,又是通过什么方法把数据传给视图层显示的? 7. struts2的执行流程。 8. 具有相同名称的一组值,struts2如何实现封装? 9. 简述struts2值栈的原理和生命周期? 10. 简述Struts2异常处理机制? 11. 谈一下你的项目选择Struts2的理由? 12. 阐述Struts2中的Action如何编写,是否采用单例?[1] Struts2是一个经典的MVC框架,与Struts1相比,有以下区别: 1. 核心控制器改成了过滤器,比Servlet的级别要高。 2. Struts1要求业务类必须继承Action或dispatchAction,而Struts2只需要提供一个POJO类。 3. 绑定值到业务类时,Struts1是通过ActionForm,而Struts2是通过模型或属性驱动直接绑定到Action属性。 4. Struts1严重依赖于Servlet的API,而Struts2则脱离了Servlet的API。 5. 管理Action时,Struts1是单例模式,而Struts2是每个请求产生一个实例。 6. 在表达式的支持上,Struts2不仅有JSTL,还有功能更加强大的OGNL表达式。 7. Struts1的类型转换是单向的,而Struts2是双向的。 8. Struts2提供了拦截器,可以在访问Action之前或之后增加如权限拦截等功能。 9. Struts2提供了国际化资源文件管理实现。 10. Struts2支持多种视图类型,如JSP、Freemarker、Velocity等。[2] 在使用Struts2时,可能会遇到一些常见的问题,例如: 1. 表单重复提交的问题可以通过使用令牌机制来解决。 2. 国际化必须经过Action来实现。 3. 使用模型驱动时,可能会出现地址内存不一致的问题,可以通过对象拷贝来解决。 4. 在页面使用转发时可能会报404错误,可以通过过滤器改变请求地址来解决。 5. 在使用字符串时需要注意使用双引号而不是单引号。 6. 当校验出错时,需要跳转到相应的页面,可以使用通配符来解决。[3] 总结起来,Struts2面试题主要涉及Struts2与其他框架的区别、Struts2的核心概念和特性,以及在实际使用中可能遇到的问题和解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值