版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106698780
文章目录
本篇博客主要给大家讲解 数据有效性 和 国际化,关于 国际化 我们可以只做了解即可,因为我们开发的系统大部分都是在国内使用,一般不会涉及到国外,所以 国际化 这一块简单了解即可。
一、数据有效性
关于 数据有效性,其实就是对数据进行校验,过滤掉不符合的数据。
1、数据校验
数据校验 可以分为 前台校验 和 后台校验,如果一个项目的 数据校验 只有 前台校验 没有 后台校验 的话是不安全的,因为 前台校验 是通过 JS 完成的,JS 可以被绕行,比如我们直接通过地址栏传参的方式就可以轻而易举的绕过 JS 了,但是我们使用 JS 校验可以很大程度上提升用户体验度。
本章主要为大家介绍如何使用 Struts2 框架进行 后台校验。
Struts2 框架中提供了两种 数据校验 的方式:
- 手动编码的方式进行校验;
- 采用配置文件的方式进行校验。
2、手动编码方式
1)步骤
- 继承
ActionSupport
类; - 重写
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
-
引入 DTD 约束
DTD 约束文件在
xwork-core-2.3.24.jar
中,名叫xwork-validator-1.0.3.dtd
的约束文件。 -
进行配置
<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 提供的校验器
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)注册校验规则
-
在
src
下创建一个validators.xml
; -
引入 DTD 约束,在
xwork-core-2.3.24.jar
下的xwork-validator-config-1.0.dtd
; -
配置
validators.xml
:<validators> <validator name="ages" class="com.demo.web.action2.MyAgeValidator"></validator> </validators>
-
使用校验规则:
RegisterAction-validation.xml
<validators> <field name="ages"> <field-validator type="age"> <message>年龄不能为负数!</message> </field-validator> </field> </validators>
二、国际化
软件的 国际化 是指软件根据来访者的不同,可以自动切换语言进行显示。
它提供一组资源包,这组资源包要满足一定的规则:
- 资源包需要有相同的基本名称;
- 命名规则:
基本名称_语言_国家.properties
,如中国:message_zh_CN.properties
,美国:message_en_US.properties
;
1、Struts2 中的国际化
1)全局的国际化
-
提供一组资源包:放在
src
下-
message_zh_CN.properties
name=张三
-
message_en_US.properties
name=ZhangSan
-
-
需要在
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>