【Struts2笔记整理十】数据有效性与国际化

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106698780







本篇博客主要给大家讲解 数据有效性国际化,关于 国际化 我们可以只做了解即可,因为我们开发的系统大部分都是在国内使用,一般不会涉及到国外,所以 国际化 这一块简单了解即可。


一、数据有效性

关于 数据有效性,其实就是对数据进行校验,过滤掉不符合的数据。

1、数据校验

数据校验 可以分为 前台校验后台校验,如果一个项目的 数据校验 只有 前台校验 没有 后台校验 的话是不安全的,因为 前台校验 是通过 JS 完成的,JS 可以被绕行,比如我们直接通过地址栏传参的方式就可以轻而易举的绕过 JS 了,但是我们使用 JS 校验可以很大程度上提升用户体验度。

本章主要为大家介绍如何使用 Struts2 框架进行 后台校验

Struts2 框架中提供了两种 数据校验 的方式:

  1. 手动编码的方式进行校验;
  2. 采用配置文件的方式进行校验。

2、手动编码方式

1)步骤

  1. 继承 ActionSupport 类;
  2. 重写 validate() 方法。

我们在 validate() 方法中就可以编写 数据校验 的代码了,但是 validate() 方法针对 Action 中的所有方法,也就是说用户请求这个 Action 时,不管请求的是哪个方法,都会先执行 validate() 方法进行 数据校验

这个时候问题来了,如果有的方法根本不需要 数据校验,执行 validate() 方法就会显得多此一举,浪费资源。我们针对这个问题也有专门的解决方案,我们可以编写一个与 validate() 方法签名相同的方法。比如我们需要校验 Action 中的 add() 方法,那我们就编写一个方法名为:validateAdd() 的校验方法。


2)小栗子

/**
 * 数据的校验:
 * 		继承 ActionSupport 之后才会有一些功能:数据校验、国际化、设置错误信息。
 */
public class LoginAction extends ActionSupport {
	private String username;
	private String password;
	
	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(username);
		System.out.println(password);
		return NONE;
	}
	
	// 数据校验的方法:
	// 拦截器会先完成校验才会执行 execute方法
	@Override
	public void validate() {
		// 判断用户名不能为空
		if (username == null || username.trim().length() == 0) {
			// 阻止 execute方法执行
			this.addFieldError("username", "用户名不能为空!");
		}
		
		// 判断密码不能为空
		if (password == null || password.trim().length() == 0) {
			this.addFieldError("password", "密码不能为空!");
		}
	}
	
	// 针对某一个方法的校验,只针对 execute() 方法
	public void validateExecute() {
		if (password.length() < 6 || password.length() > 12) {
			this.addFieldError("password", "密码需要在 6-12 位之间!");
		}
	}
}

3、XML 配置方式

我们除了 手动编码方式,还可以通过 XML 配置方式 完成 数据校验。但是 XML 配置方式 需要提供对应属性的 get() 方法才能使用。

1)针对 Action 中的所有方法校验

我们只需要在 Action 所在的包下创建一个与 Action 类名相同的 XML 文件即可。

文件名格式: Action 类名-validation.xml

如: LoginAction-validation.xml

  1. 引入 DTD 约束

    DTD 约束文件在 xwork-core-2.3.24.jar 中,名叫 xwork-validator-1.0.3.dtd 的约束文件。

  2. 进行配置

    <validators>
    	<!-- name:要校验的字段名 -->
    	<field name="username">
    		<field-validator type="requiredstring">
    			<message>用户名不能为空!(XML)</message>
    		</field-validator>
    	</field>
    	<field name="password">
    		<field-validator type="requiredstring">
    			<message>密码不能为空!(XML)</message>
    		</field-validator>
    	</field>
    </validators>
    

    其中 requiredstring 是校验规则,意思是 必须的字符串类型,我们可以从 com/opensymphony/xwork2/validator/validators/default.xml 中可以查看各种校验规则。


2)针对 Action 中的某一个方法校验

我们需要在 Action 所在的包下创建一个 XML 文件即可。

文件名格式: Action 类名-Action 配置名-validation.xml

如: <action name="addLogin" class="com.action.demo.LoginAction" method="add" />

那么文件名应该是: LoginAction-addLogin-validation.xml

<validators>
	<field name="password">
		<field-validator type="stringlength">
			<param name="minLength">6</param>
			<param name="maxLength">12</param>
			<message>密码的长度为6~12位!(XML)</message>
		</field-validator>
	</field>
</validators>

4、Struts2 提供的校验器

10Struts2提供的校验器列表


5、综合案例

<!DOCTYPE validators PUBLIC
  		"-//Apache Struts//XWork Validator 1.0.3//EN"
  		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
	<!-- 校验用户名 -->
	<field name="username">
		<field-validator type="requiredstring">
			<message>用户名不能为空!</message>
		</field-validator>
	</field>
	
	<!-- 校验密码 -->
	<field name="password">
		<field-validator type="requiredstring">
			<message>密码不能为空!</message>
		</field-validator>
		
		<field-validator type="stringlength">
			<param name="minLength">6</param>
			<param name="maxLength">12</param>
			<message>密码的长度为6~12位!</message>
		</field-validator>
	</field>
	
	<!-- 校验确认密码 -->
	<field name="repassword">
		<field-validator type="fieldexpression">
			<param name="expression"><![CDATA[(password==repassword)]]></param>
			<message>两次密码输入不一致!</message>
		</field-validator>
	</field>
	
	<!-- 校验年龄 -->
	<field name="age">
		<field-validator type="int">
			<param name="min">18</param>
			<param name="max">40</param>
			<message>年龄输入不合法!必须是18~40岁之间的!</message>
		</field-validator>
	</field>
	
	<!-- 校验邮箱 -->
	<field name="email">
		<field-validator type="email">
			<message>邮箱格式不正确!</message>
		</field-validator>
	</field>
	
	<!-- 校验电话 -->
	<field name="phone">
		<field-validator type="regex">
			<param name="expression"><![CDATA[^18\d{9}$]]></param>
			<message>电话不合法!</message>
		</field-validator>
	</field>
	
	<!-- 校验生日 -->
	<field name="birthday">
		<field-validator type="date">
			<param name="min">1974-01-01</param>
			<param name="max">1996-01-01</param>
			<message>生日不合法!</message>
		</field-validator>
	</field>
</validators>

6、自定义校验规则(了解)

除了 Struts2 给我们提供的校验规则外,我们还可以 自定义校验规则

自定义校验规则 有两种方式,大家可以根据自己的需求进行选择:

  • 若需要普通的验证程序,可以继承 ValidatorSupport 类(校验的时候不是针对一个字段的);
  • 若需要字段验证程序,可以继承 FieldValidatorSupport 类(针对一个字段的校验)

1)编写一个类继承 FieldValidatorSupport 类

/**
 * 自定义的校验规则
 */
public class MyAgeValidator extends FieldValidatorSupport {
	@Override
	public void validate(Object obj) throws ValidationException {
		// 获得字段名称
		String name = this.getFieldName();
		// 获得字段的值
		Object value = this.getFieldValue(name, obj);
		
		if (value instanceof Integer) {
			int age = (Integer) value;
			if (age < 0) {
				this.addFieldError(name, obj);
			}
		}
	}
}

2)注册校验规则

  1. src 下创建一个 validators.xml

  2. 引入 DTD 约束,在 xwork-core-2.3.24.jar 下的 xwork-validator-config-1.0.dtd

  3. 配置 validators.xml

    <validators>
    	<validator name="ages" class="com.demo.web.action2.MyAgeValidator"></validator>
    </validators>
    
  4. 使用校验规则:RegisterAction-validation.xml

    <validators>
    	<field name="ages">
    		<field-validator type="age">
    			<message>年龄不能为负数!</message>
    		</field-validator>
    	</field>
    </validators>
    


二、国际化

软件的 国际化 是指软件根据来访者的不同,可以自动切换语言进行显示。

它提供一组资源包,这组资源包要满足一定的规则:

  1. 资源包需要有相同的基本名称;
  2. 命名规则: 基本名称_语言_国家.properties,如中国:message_zh_CN.properties,美国:message_en_US.properties

1、Struts2 中的国际化

1)全局的国际化

  1. 提供一组资源包:放在 src

    • message_zh_CN.properties

      name=张三
      
    • message_en_US.properties

      name=ZhangSan
      
  2. 需要在 struts.xml 中开启一个常量,value 写的是国际化文件的基本名称,我这里叫 message

    <constant name="struts.custom.i18n.resources" value="message" />
    
  • Action 类中:

    String name = this.getText("name");
    
  • 在 JSP 中:

    <s:text name="name" />
    
  • 在数据校验配置文件中:

    <validators>
    	<field name="names">
    		<field-validator type="string">
    			<message key="name" />
    		</field-validator>
    	</field>
    </validators>
    

2)Action 范围的国际化

Action 类中使用。

Action 所在的包下创建一个属性文件(名字与 Action 的类名一致,如:Action类名_语言_国家.properties)。


3)包范围的国际化

在当前包以及当前包的子包下使用。

在某个包下创建属性文件(包名_语言_国家.properties)。


4)临时的国际化

在页面 JSP 中的使用。

<!-- 读包下的国际化文件 -->
<s:i18n name="com/demo/web/action">
    <s:text name="package" />
</s:i18n>


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小异常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值