在Struts2应用中提供验证的方式有两种——编程式和声明式。
编程式验证
要提供编程式验证的话,action就要实现Validateable接口。该接口只有一个方法,在方法中需要执行验证操作:void validate();
为了将验证中出现的问题反馈给用户,action还需要实现ValidationAware接口。这个接口更为复杂一些,它里面的方法可以用来添加验证错误,判断当前是否有验证错误,等等。
如果可能的话,你的action可以继承ActionSupport类,在该类中提供了以上这些接口的缺省实现。只有当验证操作极其复杂的时候,我们才该使用编程式验证。更好的解决方案是采用声明式验证。下面是一个编程式验证的小例子:
public class UserAction extends ActionSupport{
private String userName;
private String password
public void validate() {
if(userName ==null || userName.trim().equals("")){
this.addFieldError("userName", "用户名不能为空");
// this.addFieldError("userName", this.getText("error.login.username.null"));
//从配置文件得到数据
}else if(!Pattern.matches( "^[a-zA-Z][a-zA-Z0-9_]{3,14}$" , userName)){
this.addFieldError("userName", "用户名必须以字母开始,字母、数字或_, ");
// this.addFieldError("userName", this.getText("error.login.username.match"));
}
if(password == null || password.equals("")){
this.addFieldError("password", "密码不能为空");
// this.addFieldError("password", this.getText("error.login.password.null"));
}else if(!Pattern.matches("^[a-zA-Z0-9!@#]{4,15}$", password)){
this.addFieldError("password", "密码可以由字母、数字和! @ # 组成 ");
// this.addFieldError("password", this.getText("error.login.password.match"));
}
}
public String login() throws Exception {
if(this.hasFieldErrors()){ //判断是否有错误信息
return INPUT;
}
return SUCCESS;
}
}
|
验证会与执法方法配置:比如:login
它的执行顺序为:validate() à validateLogin()
声明式验证
每一个需要声明式验证的action都需要在类中进行注解或者要有一个相应的XML文件。对于MyAction这个类,其XML文件就是“MyAction-validation.xml”,并会和它放在同一个包(package)下面。处理这个action的拦截器栈需要包含有“validation”(用来进行验证)和“workflow”(当验证失败时用来进行重定向,以返回到“input”结果)拦截器。这样的拦截器栈有以下几个:“validationWorkflowStack”,“paramsPrepareParamsStack”,“defaultStack”和“completeStack”。
下面是验证文件的一个例子:
<!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="count">
<field-validator type="int" short-circuit="true">
<param name="min">1</param>
<param name="max">100</param>
<message key="invalid.count">
Value must be between ${min} and ${max}
</message>
</field-validator>
</field>
<field name="name">
<field-validator type="requiredstring">
<message>You must enter a name.</message>
</field-validator>
</field>
<validator type="expression" short-circuit="true">
<param name="expression">email.equals(email2)</param>
<message>Email not the same as email2</message>
</validator>
</validators>
|
1、 每一个字段都可以含有一个或多个“field-validator”节点
2、 每一个字段的validator是按照定义顺序执行的
3、 每一个字段的validator都有一个“short-circuit”属性;如果其值为true而验证失败,那么剩下的所有验证都会被跳过,该字段就会直接返回一个失败的结果
4、 Message节点可以包含一个“key”属性,用来从message bundle中查找需要显示给用户的消息;如果找不到对应的message bundle key的话,那么就返回节点的value属性的值
5、 Validator的配置信息(例如min和max)和值栈中的值一样,都可以通过把值放在“${”和“}”之间,来显示到验证消息中。
6、 Validators 的作用域可以是“field”或者“expression”;具有“expression”作用域的validator可以同时作用于多个字段
下面是关于validator类型和相应描述的一个完整列表。在http://struts.apache.org/2.x/docs/validation.html可以得到包括配置相关的更多信息。
名称
|
描述
|
required
|
确保该属性不是null
|
requiredstring
|
确保一个String类型的属性不是null,并且非空
|
stringlength
|
检查String的长度范围是否与所期望的一致
|
int
|
检查int类型的数字是否超出所期望的大小范围
|
double
|
检查double类型的数字是否超出所期望的大小范围
|
date
|
检查date类型的属性是否超出所期望的范围
|
expression
|
使用值栈来估算一个ONGL表达式(必须要返回boolean值)
|
fieldexpression
|
使用OGNL表达式来验证字段
|
email
|
保证该属性是一个有效的email地址
|
url
|
保证该属性是一个有效的URL
|
conversion
|
检查该属性是否有转换错误
|
regex
|
检查该属性的值是否与某个正则表达式相匹配。
|
visitor
|
Visitor validator可以把对字段的验证动作推迟到这个字段所属的类的特有的另一个验证文件中执行。
比如说,你在使用模型驱动的action,在模型中有一个对应于Person类的“person”属性。如果该模型正在被多个Action使用,那么你大概就会想要把验证信息抽取出来进行重用。Visitor 验证提供了这样的功能
|
另外,你还可以创建自己的validator。你自定义的validator需要实现Validator接口(用于表达式验证)或FieldValidator接口(用于字段验证)。
新的validator需要在“validators.xml”中注册,该文件存在于classpath的根目录下。通常这个文件可以从发行的JAR包中访问到,但是如果人为提供了这个文件的话,那么发行包中的文件就会被忽略。所以在添加新的validator之前,你需要从Struts2 JAR包中把“validators.xml”这个文件拷贝出来,放到项目classpath的根目录下,然后再把新的validator添加进去。这样当前已有的validator才会被包含到应用中来。和其他配置一样,validator的配置信息也很简单,只需要一个统一标识符和validator的类名。
<validators>
<validator name="postcode" class="com.validators.PostCodeValidator"/>
…
</validators>
|
分享到:
相关推荐
2. **拦截器(Interceptors)**:Struts2的核心功能之一,拦截器可以插在Action调用之前和之后,实现如日志、事务管理、验证等通用功能,增强了代码的可复用性。 3. **动态方法调用(Dynamic Method Invocation,DMI...
通过Struts 2-Spring 插件,我们可以将Struts 2 的Action 对象交给Spring 来管理,Spring 负责初始化、配置和销毁这些对象。这样,Action 类不再需要自己去创建依赖的对象,而是通过构造函数或setter 方法接收Spring...
Struts2的核心功能包括:Action映射、结果映射、拦截器机制、强大的表单验证和国际化支持等。通过使用Struts2,开发者可以更专注于业务逻辑的实现,而非底层的HTTP请求处理。 **Spring框架** Spring 是一个全面的...
Struts2提供了一套强大的表单验证机制,可以在服务器端对用户输入的数据进行验证,并将错误信息反馈给用户。 **10. 插件系统** Struts2的插件系统使得扩展框架功能变得简单,例如,Spring插件可以方便地将Struts2与...
1. **Action结果类型**:在Struts2中,Action的结果类型决定了如何处理Action的返回值。`struts2-json-plugin`添加了JSON结果类型,当Action返回此类型时,会将结果转换为JSON格式。 2. **JSONResult类**:这是实现...
- **拦截器**:拦截器是Struts2的核心机制之一,通过定义拦截器链,可以实现如权限验证、日志记录、性能监控等功能。 - **配置方式**:可以选择传统的XML配置,也可以使用更加灵活的注解和Conventions配置。 - **...
9. `s:action`: 运行Struts2 Action,通常用于页面间的跳转。 10. `s:i18n`: 国际化标签,支持多语言环境。 三、Struts2标签API Struts2的标签API文档详细列出了每个标签的用法、属性、示例以及它们如何与Action上...
Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。然而,Struts2在历史上曾出现过多个安全漏洞,其中之一就是著名的“Struts2-057”漏洞。这个漏洞属于远程代码执行(Remote ...
2. **拦截器(Interceptor)**:这是Struts2的一个强大特性,它可以拦截Action调用前后,实现事务管理、日志记录、权限验证等功能。通过配置拦截器栈,开发者可以灵活控制请求处理流程。 3. **OGNL(Object-Graph ...
通过这个插件,你可以直接在JUnit测试用例中执行Struts2的Action,验证业务逻辑,无需启动完整的Web服务器。 在使用`struts2-junit-plugin-2.1.8.1.jar`之前,你需要确保已经安装并配置了以下组件: 1. **JDK**:...
这个核心库提供了Action类,这是Struts2中处理用户请求的中心组件。Action类与控制器的概念相似,负责业务逻辑的执行。此外,还包括了Interceptor(拦截器)机制,这是一种AOP(面向切面编程)的实现,允许在Action...
- **Interceptor(拦截器)**:这些是Struts2中的重要组件,它们在Action调用前后执行,提供了事务控制、日志记录、权限验证等功能。 - **配置文件**:通常有struts.xml或类似的配置文件,用于定义Action、结果...
1. **Action类**:这些类通常会继承自`org.struts2.StrutsAction`或实现`com.opensymphony.xwork2.Action`接口。Action类定义了业务逻辑,比如用户登录、注册等操作。 2. **配置文件**:主要指`struts.xml`,这是...
2. **拦截器**:Struts 2的拦截器是AOP(面向切面编程)概念的应用,允许在Action执行前后插入自定义逻辑,如日志、权限验证、性能统计等。这些拦截器通过在struts.xml中配置并组合成拦截器栈。 3. **Action**:...
在实际开发中,Struts2 JSON Plugin还可以与其他插件和拦截器结合使用,例如Validation插件进行表单验证,Interceptor进行业务逻辑处理等。此外,它还支持自定义JSON输出,例如忽略某些属性、格式化日期等。 总的来...
Struts2是一个非常著名的Java ...开发者可以利用Struts2的Action、Interceptor、Result等机制,结合Apache Commons库和FreeMarker模板引擎,轻松地管理业务逻辑、处理用户输入、呈现视图,从而提高开发效率和应用质量。
1. **Action类和结果映射**:在Struts2中,Action类是业务逻辑的载体,它负责处理来自视图层的请求并更新模型。结果映射定义了Action执行后跳转到哪个视图。 2. **拦截器**:Struts2使用拦截器实现AOP(面向切面...
`struts2-core-2.3.32.jar`是Struts2的核心库,包含了许多关键组件,如Action类、Interceptor拦截器、Result结果类型等。它负责处理HTTP请求,解析请求参数,执行业务逻辑,并将结果返回给用户。在这个版本中,针对...
2. **Interceptor拦截器**:类似于Servlet的Filter,拦截器是Struts2的一大特色,可以在Action执行前后插入自定义的逻辑,如日志记录、权限验证等。 3. **Tiles**:Struts2集成了Tiles框架,用于页面布局和组合,使...
1. **Action调度**:Struts2的核心在于Action类,它是业务逻辑的入口点。在`xwork-core-2.1.6`中,Action的调度机制是由`ActionInvocation`实现的,它负责调用Action的各个方法并管理拦截器链。`ActionProxy`则负责...