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

2024-02-14 12:58

本文主要是介绍【Struts2笔记整理十】数据有效性与国际化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

  • 一、数据有效性
    • 1、数据校验
    • 2、手动编码方式
      • 1)步骤
      • 2)小栗子
    • 3、XML 配置方式
      • 1)针对 Action 中的所有方法校验
      • 2)针对 Action 中的某一个方法校验
    • 4、Struts2 提供的校验器
    • 5、综合案例
    • 6、自定义校验规则(了解)
      • 1)编写一个类继承 FieldValidatorSupport 类
      • 2)注册校验规则
  • 二、国际化
    • 1、Struts2 中的国际化
      • 1)全局的国际化
      • 2)Action 范围的国际化
      • 3)包范围的国际化
      • 4)临时的国际化






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


一、数据有效性

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

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;}@Overridepublic String execute() throws Exception {System.out.println(username);System.out.println(password);return NONE;}// 数据校验的方法:// 拦截器会先完成校验才会执行 execute方法@Overridepublic 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 {@Overridepublic 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>


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



这篇关于【Struts2笔记整理十】数据有效性与国际化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708561

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查