`

Struts2的输入校验

 
阅读更多

Struts2中的多个验证方法的共存细节一
在Struts2中默认的,使用validateAbc()作为abc()的验证方法,所以,如果还存在xyz()方法的话,那么它的验证方法就是validateXyz()方法。执行时,首先执行validateAbc()方法,而无论validateAbc()方法执行后的结果如何,都会去执行validate()方法,也就是说,如果一个Action中提供validate()方法的话,那么它是一定会被执行的,执行完validate()之后,如果没有发现存在Field或者Action级别的ERROR的话,那么才会执行相应的业务逻辑的方法,如abc()方法


Struts2中的多个验证方法的共存细节二
很显然这种机制不是很合理。因为不同的业务逻辑存在着不同的验证方式,如果不同的验证方式验证完之后,还要去验证一下validate()的话,显然这是不合理的。
这种情况下有两种解决的策略
1..不再复写validate()方法,由于父类的validate()方法的方法体是空的,尽管它也会被调用,但是它什么也不会做,不会对我们的程序造成任何影响
2..重命名validate()方法,即命名为validateExecute(),所以本例若需执行execute()的话,则可通过validateExecute()验证表单


提示Struts2的默认错误信息
如果intlong发生类型转换错误的话,Struts2会将该属性值自动设为零。如果String发生类型转换错误的话,它会将该属性值自动设为null。但若前台页面输入的age是字符串的话,那么它是无法转换成int型的,这时在前台页面就会提示Invalid field value for field "age".信息,在这个错误提示信息中的age对应的是前台页面中<input name="">为age的值。这是因为Struts2在遇到类型转换错误的时候,也就是说无法进行类型转换的时候,struts2框架会自动生成一条错误信息,并将该错误信息放到addFieldError()中,然后就可以通过全局或局部的国际化资源转换文件来自定义更为人性化的错误提示信息,然后就可以在前台使用<s:fielderror/>标签输出资源文件中自定义的错误提示信息。

全局的国际化资源转换文件自定义Struts2提示的错误信息
类型转换出现错误时Struts2中的conversionError拦截器负责将错误封装成表单错误中的Fielderror。xwork-2.0.4.jar中的com.opensymphony.xwork2包里面有一个xwork-messages.properties文件,将它里面的xwork.default.invalid.fieldvalue属性在资源文件中覆盖就可以输出人性化的信息了。在struts.xml中配置了message.properties之后,就可以建立该文件了。建好后输入xwork.default.invalid.fieldvalue = {0} error,由于是进行资源转换,所以xwork.default.invalid.fieldvalue写法是固定的,而{0}则对应前台页面中<input name="">里面的name值。比如在age输入域中输入字符串之后,就会提示age error,如果在birthday输入域中输入字符串的话,同样会提示birthday error


局部的国际化资源转换文件
全局的资源文件有些时候并不是特别好用,因为它显示的效果过于单一古板,而Struts2也已经认识到了这一点,因此它又给我们提供了使用局部的资源文件的方式。局部的国际化资源转换文件也是在项目开发中使用的最多的,虽然它显得比较麻烦,但是它能够为用户提供一种更友好的视图表现方式。局部的资源文件必须与它所要验证的类在同一个目录下,并且要与类同名。比如验证RegisterAction的某些属性,那么它必须与RegisterAction位于同一目录下,并且的它名字也必须是RegisterAction.properties,然后编辑它的内容
比如相对于age属性来说invalid.fieldvalue.age = age conversion error,其中invalid.fieldvalue.是固定的后面跟RegisterAction类中的属性。所以这句话的意思就是:当age发生类型转换错误时,则显示age conversion error信息。并且局部的先级要高于全局的国际化资源转换文件,所以将优先显示局部资源文件中的提示信息。

 

实例:

首先是web.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<welcome-file-list>
		<welcome-file>validateInput.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 然后是用于提供表单输入的validateInput.jsp页面

 

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<s:fielderror cssStyle="font-size:20px;color:red;text-align:left;font-weight:bold"/>

<s:form action="validateInput" theme="simple">
	<table border="9">
		<tr>
			<td>姓名</td>
			<td><s:textfield name="username"/></td>
		</tr>
		<tr>
			<td>密码</td>
			<td><s:password name="password"/></td>
		</tr>
		<tr>
			<td>重复密码</td>
			<td><s:password name="repassword"/></td>
		</tr>
		<tr>
			<td>年龄</td>
			<td><s:textfield name="age"/></td>
		</tr>
		<tr>
			<td>出日</td>
			<td><s:textfield name="birthday"/></td>
		</tr>
		<tr>
			<td>毕业时间</td>
			<td><s:textfield name="graduation"/></td>
		</tr>
		<tr>
			<td>&nbsp;</td>
			<td><s:submit value="输入校验"/></td>
		</tr>
	</table>
</s:form>
<!--
================================================================================================
也可以使用普通<form/>替代<s:form/>来编写上面的第6--37行的表单内容,一样可以实现相同的功能
================================================================================================
【类型转换与输入校验的流程】
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法,调用商业逻辑
注意:如果类型转换不成功,也同样要进行输入校验
================================================================================================
几乎Struts2的每一个标签都有它的theme属性
如果未设置该属性的话,在运行时Struts2会自动生成表格,这样不便于排版
我们可以通过设置标签的theme="simple"属性使得它不自动生成表格
这是很重要的一个属性,有了它就可以很方便的布局了
================================================================================================
【theme="simple"】
当将<s:form/>设置为theme="simple"时,它的子标签也就不会自动生成表格了
而且此时<s:form/>中的自动输出FieldError信息的功能就会失效
这时我们可以在页面中添加<s:fielderror/>或者<s:actionerror/>标签来统一显示错误信息
并且这个时候所显示的错误提示信息中,总会在前面出现一个黑色圆点
如果想把这个圆点去掉的话,是一件比较困难的事情
可以查看struts2-core-2.0.11.jar中的template.simple中的fielderror.ftl
打开这个模板之后可以发现,我们页面显示的信息都是由这个模板定义的
我们也可以手工写这个模板,但这将会是一件相当困难的事情
如果想把这个黑色圆点去掉的话,就只能修改这个模板,不过挺困难的,很不好改
一般情况下都不会去手动的写这个模板,我们多数都是参考已有模板,然后对其稍稍加工
================================================================================================
-->

 当表单输入域均正确时显示的validateSuccess.jsp页面

 

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
姓名:<s:property value="username"/><br/>
密码:<s:property value="password"/><br/>
年龄:<s:property value="age"/><br/>
生日:<s:property value="birthday"/><br/>
毕业:<s:property value="graduation"/>

 然后是struts.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>
<!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.custom.i18n.resources" value="message"/>
	<package name="struts2" extends="struts-default">
		<action name="validateInput" class="com.jadyer.action.ValidateInputAction" method="abc">
			<result>/validateSuccess.jsp</result>
			<result name="input">/validateInput.jsp</result>
		</action>
	</package>
</struts>

 用到的核心验证逻辑的ValidateInputAction.java

 

package com.jadyer.action;

import java.util.Calendar;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings({"serial", "unused"})
public class ValidateInputAction extends ActionSupport {
	private String username;
	private String password;
	private String repassword;
	private int age;
	private Date birthday;
	private Date graduation;
	
	/* 以上六个属性对应的setter和getter略 */

	
	public String abc() throws Exception {
		return SUCCESS;
	}
	
	/**
	 * public void addFieldError(String fieldName, String errorMessage)
	 * 第一个参数是页面中表单里的输入域的name值,如<input/>或<s:textfield/>等等
	 * 第二个参数是提示信息。这个提示信息显示在第一个参数所对应的字段的正上方居中位置
	 * 若页面中提供了<s:fielderror/>标签,那么在<s:fielderror/>的位置就会显示相应的提示信息
	 */
	public void validateAbc() {
		if (null == username || username.length() < 6 || username.length() > 10) {
			this.addFieldError("username", "用户名不能为空,且长度必须为6--10位");
		}
		if (null == password || password.length() < 6 || password.length() > 10) {
			this.addFieldError("password", "密码不能为空,且长度必须为6--10位");
		} else if (null == repassword || repassword.length() < 6 || repassword.length() > 10) {
			this.addFieldError("repassword", "重复密码不能为空,且长度必须为6--10位");
		} else if (!password.equals(repassword)) {
			this.addFieldError("password", "输入的重复密码与设定密码不一致");
		}
		if (null != birthday && null != graduation) {
			Calendar c1 = Calendar.getInstance();
			c1.setTime(birthday);
			Calendar c2 = Calendar.getInstance();
			c2.setTime(graduation);
			if (!c1.before(c2)) {
				this.addFieldError("birthday","出生日期应该在毕业时间的前面");
			}
		}
	}
}

 用到的局部的国际化资源转换文件ValidateInputAction.properties

 

invalid.fieldvalue.age        = /u5E74/u9F84/u5E94/u8BE5/u662F/u4ECB/u4E8E 1 /u5230 100 /u4E4B/u95F4/u7684/u6B63/u6574/u6570
invalid.fieldvalue.birthday   = /u51FA/u751F/u65E5/u671F/u8F93/u5165/u6709/u8BEF
invalid.fieldvalue.graduation = /u6BD5/u4E1A/u65F6/u95F4/u8F93/u5165/u6709/u8BEF

 用到的全局的国际化资源转换文件message.properties

 

xwork.default.invalid.fieldvalue = {0} /u8F93/u5165/u6709/u8BEF

 

 

 

 

分享到:
评论

相关推荐

    Struts2输入校验总结

    ### Struts2输入校验深度解析 #### 一、手动输入完成校验 在Struts2框架中,输入校验是确保数据完整性和安全性的重要环节。对于手动输入完成校验,Struts2提供了灵活的机制。 1. **普通处理方式**:在Action类中...

    Struts 2 输入校验

    Struts 2 输入校验

    Struts2 输入校验

    本篇文章将深入探讨Struts2中的输入校验机制。 一、Struts2 输入校验概述 Struts2提供了多种进行输入校验的方式,包括Action级别校验、Validator框架校验、拦截器校验以及使用JSR303/JSR349 Bean Validation标准。...

    struts2输入校验

    本文将深入探讨Struts2中的输入校验机制,以及如何对指定方法进行输入校验。 在Struts2中,输入校验通常分为两种方式:客户端校验和服务器端校验。客户端校验主要通过JavaScript在用户端进行,可以提供即时反馈,但...

    struts2输入校验深入总结

    本文将深入探讨Struts2中的输入校验机制,帮助开发者更好地理解和应用。 一、Struts2输入校验概述 在Struts2中,输入校验主要用于验证用户通过表单提交的数据,防止无效或恶意数据进入系统。Struts2提供了多种方式...

    [原]Struts2输入校验

    在Struts2中,输入校验是确保数据安全性和应用稳定性的重要环节。它帮助开发者防止非法或无效的数据进入系统,从而减少潜在的错误和安全漏洞。 **Struts2输入校验机制** 1. **内置验证框架**: Struts2提供了内置的...

    Struts2输入校验

    要求使用Struts2的内建校验器校验“书名”、“作者”、“出版日期”、“价格”和“库存数量”字段;要求手动编写代码校验“书号”的有效性;要求手动编写代码校验“出版社”字段中是否包含了“出版社”三个字。

    struts2输入校验总结

    Struts2是一个流行的Java web开发框架,它提供了一套强大的输入校验机制,确保用户提交的数据符合业务逻辑的要求。在本文中,我们将深入探讨Struts2的输入校验功能,包括手动输入校验和基于验证框架的输入校验。 ##...

    Struts2的输入校验实例代码

    在Struts2中,输入校验是确保数据完整性和安全性的重要环节。输入校验可以防止恶意用户提交无效或有害的数据,并确保应用程序的稳定运行。以下是关于Struts2输入校验的详细知识: 1. **客户端校验**: 客户端校验...

    struts2的输入校验

    struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...

    Struts2数据校验与国际化

    Struts2作为一款流行的Java Web框架,其在处理用户输入数据和实现多语言支持方面具有强大的功能。在“Struts2数据校验与国际化”这一主题中,我们将深入探讨Struts2如何通过不同的验证机制确保数据的有效性,以及...

    Struts2 校验器

    在Struts2中,校验器(Validator)是处理用户输入验证的核心组件,确保提交到服务器的数据符合预设的业务规则。这篇博客文章可能是关于如何使用Struts2的内置校验机制以及自定义校验规则的探讨。 Struts2的校验框架...

    浪曦_Struts2应用开发系列_第5讲.Struts2的输入校验.rar

    在Struts2框架中,输入校验是一个关键环节,它确保了用户提交的数据符合应用的要求,从而避免了无效数据导致的错误或安全问题。本讲将深入探讨Struts2的输入校验机制。 1. **Struts2输入校验概述** - 输入校验是...

    使用struts2进行输入校验

    在Struts2中,输入校验是一个至关重要的部分,它确保了用户从客户端提交的数据符合预设的业务规则,从而避免了无效或不合法数据进入系统。本篇文章将详细介绍如何在Struts2中进行输入校验,包括两种主要实现方式:...

Global site tag (gtag.js) - Google Analytics