struts2源码学习一验证框架

struts的验证框架项目中用的可能比较少,我们用的比较多的方式是在页面前端使用js的验证框架来对表单进行初步的验证,然后可能利用异步技术对数据进行有效性验证。所以这部分只是我们只知道怎么用感觉就可以了,需要学习的就是验证拦截器的工作方式,以及国际化的处理。
 
验证可以采取两种方式,如果我们的Action继承了ActionSupport,那么就默认实现了Validateable接口。
(1)重写validate方法:
package com.struts.action;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.struts.domain.User;

public class UserAction extends BasicAction{

	private static final long serialVersionUID =6096623410113055655L;
	private static final Log logger = LogFactory.getLog(UserAction.class);
	private User user;
	
	@Override
	public String execute() throws Exception {
		session.put("from", user);
		return SUCCESS;
	}
	
		@Override
		public void validate() {
			if(StringUtils.isBlank(user.getName())){
				addFieldError("user.name", getText("user.required"));
			}
		}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	
}
 在action中,我们重写了validate方法,并且在它的值为空时,我们添加了错误信息,注意getText方法是在取国际化的信息,这个稍后再讲。

在页面当中是这样的
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<s:form action="userAction" method="post">
		<s:label for="user.name" value="姓名"></s:label>   <s:textfield name="user.name"></s:textfield>
		<s:label for="user.age" value="年龄"></s:label> <s:textfield name="user.age"></s:textfield>
		<s:submit value="提交"></s:submit>
	</s:form>
</body>
</html>
 struts.xml中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
<struts>
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.custom.i18n.resources" value="messageResource"/>
	<package name="struts" extends="struts-default" namespace="/">
		<action name="index">
			<result>index.jsp</result>
		</action>
		
		<action name="successAction" class="com.struts.action.SuccessAction">
			<result>success.jsp</result>
		</action>
		
		<action name="userAction" class="com.struts.action.UserAction">
			<result type="chain">successAction</result>
			<result name="input">index.jsp</result>
		</action>
		
	</package>
</struts>
 当验证出错时,会返回input视图,这时在user.name上方会添加错误信息
(2)利用xml配置验证信息
当需要验证多个字段时,复写validate方法就显得比较麻烦了,我们需要写很多段类似的验证代码,所以,struts提供了另一种验证方式即采用xml配置的方式,struts的验证是基于xwork的验证,所以,我们在xwork的包中,能找到validate的dtd,把它上面拷贝下来,然后我们在需要进行验证的Action的同一个包中,写一个xml文件,本例中我们对UserAction进行验证,所以xml的名字应该是UserAction-validation.xml

<?xml version="1.0" encoding="UTF-8"?>

  <!DOCTYPE validators PUBLIC 
  		"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
  		
<validators>
	<field name="user.name">
		<field-validator type="requiredstring">
			<message key="user.required"></message>
		</field-validator>
	</field>
</validators>
 同样,message中的key也是取的国际化资源包中的值
当我们提交一个空的表单时,同样会出现错误提示。

二、国际化
struts会根据请求头中的local,进行区域定位,然后定位到我们的国际化资源文件,我们可以在struts.properties中或者在struts.xml中添加常量的方式来指定国际化资源的名字比如我们在struts.xml中,配置了如下的常量:
<constant name="struts.custom.i18n.resources" value="messageResource"/>
 那么在类路径下,我们建立如下两个文件
messageResource_en_US.properties
messageResource_zh_CN.properties
username=\u7528\u6237\u540D
password=\u5BC6\u7801
user.required=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
 这是key-value的形式,然后我们就可以引用这些国际化信息了。
(1)在jsp中用<s:text name="XXX">
(2)在xml中,用key的方式
(3)在action中用getText()的方式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值