类需要继承ActionSupport,重写execute方法,
详细:在Struts2应用中,我们发现,如果通过验证框架验证录入后,如果出现错误,应用会自动回到录入页面,这是为什么?在Struts2中,Action、Interceptor 需要返回String类型的result,框架才能通过配置好的转向来决定下一个视图是哪个页面。那么验证框架是怎么做到的呢?
源代码分析:
第一、
通过struts2-core-2.0.11.jar中的struts-default.xml文件我们可以看到
程序代码<package name="struts-default" abstract="true">
<interceptor-stack name="defaultStack">
...
<interceptor-ref name="validation"/> 验证框架Interceptor
<interceptor-ref name="workflow"/> 工作流Interceptor
</interceptor-stack>此处的指出的两个Interceptor是和我们讨论的问题有关系的两个Interceptor。
程序代码<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>由此我们知道了需要看的源代码的路径。
第二、
分析AnnotationValidationInterceptor:
AnnotationValidationInterceptor继承自ValidationInterceptor(package com.opensymphony.xwork2.validator)
在AnnotationValidationInterceptor中的doIntercept方法中我们看到
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
//此处框架只是用了Annotation的方式来查看,现在触发Action方式是否是不需要验证的,如果不需要就直接触发
//否则使用父类的方法
if (action != null) {
Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());
SkipValidation skip = (SkipValidation) method.getAnnotation(SkipValidation.class);
if (skip != null) {
return invocation.invoke();//直接触发
}
}
return super.doIntercept(invocation);//使用父类的方法
}那么我们继续来看父类的方法
在ValidationInterceptor中
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {
doBeforeInvocation(invocation);
return invocation.invoke();
}此处有个核心方法doBeforeInvocation,注意是在触发Action之前执行的方法,这也是为什么验证框架不通过就进不了Action方法的原因所在。
程序代码 protected void doBeforeInvocation(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
String context = invocation.getProxy().getActionName();
String method = invocation.getProxy().getMethod();
if (log.isDebugEnabled()) {
log.debug("Validating "
+ invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName() + " with method "+ method +".");
}
//此处是初始化AnnotationActionValidatorManager类(静态初始化)
//通过这个类的validate方法来验证的
//此方法不具体解释,主要是根据已经配置好的验证规则(XML)来验证,如果出现错误就会addFieldError
if (validateAnnotatedMethodOnly) {
ActionValidatorManagerFactory.getInstance().validate(action, context, method);
} else {
ActionValidatorManagerFactory.getInstance().validate(action, context);
}
}
第三、
好,到此为止我们已经知道验证器是如何工作的,如何添加验证错误的了,那么回到我们的问题,Struts2是怎么回到原有页面的?我们还有一个类没有解释,就是DefaultWorkflowInterceptor,来看代码:
程序代码 public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {
...
private String inputResultName = Action.INPUT;//"input"
...
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof Validateable) {
//这里会触发Action中validate和validateDo开头的方法,来进行验证
...
}
if (action instanceof ValidationAware) {
ValidationAware validationAwareAction = (ValidationAware) action;
if (validationAwareAction.hasErrors()) {
//如果之前addFieldError后,这里就会捕捉到
if (_log.isDebugEnabled()) {
_log.debug("Errors on action "+validationAwareAction+", returning result name 'input'");
}
return inputResultName;//关键在此处
}
}
return invocation.invoke();
}
}应该看到了吧,其实回到原来页面只是一种假象,Struts2中默认input是录入页面,这样这里就默认回到了“原来的页面”,如果我们的录入页面不是input所指的页面,恐怕就会有问题了。因此在做Struts2应用的时候,最好一个action只有一个录入页面,否则会有些麻烦了。因此如果想做一个业务异常的拦截器的话,最好也是返回input,从这里也能看出Struts2也在向ROR学习,约定高过配置的思想。
详细:在Struts2应用中,我们发现,如果通过验证框架验证录入后,如果出现错误,应用会自动回到录入页面,这是为什么?在Struts2中,Action、Interceptor 需要返回String类型的result,框架才能通过配置好的转向来决定下一个视图是哪个页面。那么验证框架是怎么做到的呢?
源代码分析:
第一、
通过struts2-core-2.0.11.jar中的struts-default.xml文件我们可以看到
程序代码<package name="struts-default" abstract="true">
<interceptor-stack name="defaultStack">
...
<interceptor-ref name="validation"/> 验证框架Interceptor
<interceptor-ref name="workflow"/> 工作流Interceptor
</interceptor-stack>此处的指出的两个Interceptor是和我们讨论的问题有关系的两个Interceptor。
程序代码<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>由此我们知道了需要看的源代码的路径。
第二、
分析AnnotationValidationInterceptor:
AnnotationValidationInterceptor继承自ValidationInterceptor(package com.opensymphony.xwork2.validator)
在AnnotationValidationInterceptor中的doIntercept方法中我们看到
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
//此处框架只是用了Annotation的方式来查看,现在触发Action方式是否是不需要验证的,如果不需要就直接触发
//否则使用父类的方法
if (action != null) {
Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());
SkipValidation skip = (SkipValidation) method.getAnnotation(SkipValidation.class);
if (skip != null) {
return invocation.invoke();//直接触发
}
}
return super.doIntercept(invocation);//使用父类的方法
}那么我们继续来看父类的方法
在ValidationInterceptor中
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {
doBeforeInvocation(invocation);
return invocation.invoke();
}此处有个核心方法doBeforeInvocation,注意是在触发Action之前执行的方法,这也是为什么验证框架不通过就进不了Action方法的原因所在。
程序代码 protected void doBeforeInvocation(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
String context = invocation.getProxy().getActionName();
String method = invocation.getProxy().getMethod();
if (log.isDebugEnabled()) {
log.debug("Validating "
+ invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName() + " with method "+ method +".");
}
//此处是初始化AnnotationActionValidatorManager类(静态初始化)
//通过这个类的validate方法来验证的
//此方法不具体解释,主要是根据已经配置好的验证规则(XML)来验证,如果出现错误就会addFieldError
if (validateAnnotatedMethodOnly) {
ActionValidatorManagerFactory.getInstance().validate(action, context, method);
} else {
ActionValidatorManagerFactory.getInstance().validate(action, context);
}
}
第三、
好,到此为止我们已经知道验证器是如何工作的,如何添加验证错误的了,那么回到我们的问题,Struts2是怎么回到原有页面的?我们还有一个类没有解释,就是DefaultWorkflowInterceptor,来看代码:
程序代码 public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {
...
private String inputResultName = Action.INPUT;//"input"
...
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof Validateable) {
//这里会触发Action中validate和validateDo开头的方法,来进行验证
...
}
if (action instanceof ValidationAware) {
ValidationAware validationAwareAction = (ValidationAware) action;
if (validationAwareAction.hasErrors()) {
//如果之前addFieldError后,这里就会捕捉到
if (_log.isDebugEnabled()) {
_log.debug("Errors on action "+validationAwareAction+", returning result name 'input'");
}
return inputResultName;//关键在此处
}
}
return invocation.invoke();
}
}应该看到了吧,其实回到原来页面只是一种假象,Struts2中默认input是录入页面,这样这里就默认回到了“原来的页面”,如果我们的录入页面不是input所指的页面,恐怕就会有问题了。因此在做Struts2应用的时候,最好一个action只有一个录入页面,否则会有些麻烦了。因此如果想做一个业务异常的拦截器的话,最好也是返回input,从这里也能看出Struts2也在向ROR学习,约定高过配置的思想。
发表评论
-
初学者学习linux
2012-12-19 17:53 657http://wuhaoshu.blog.51cto.com/ ... -
jquery选择器总结
2012-11-21 11:43 9461.<script type="text/ja ... -
外网的压力测试
2012-11-07 10:32 1136外网的压力测试,可以使用apache的ab或curl-load ... -
试着学学object-c
2012-11-05 15:50 7961.http://www.neatstudio.com/sho ... -
栈的基本原理,实现自己的堆栈
2012-10-23 10:16 1245栈是重要的数据结构,从数据结构角度看,栈也是线性表,其特殊性在 ... -
java双括弧初始化
2012-10-22 17:39 137501. Map map = new HashMap() {{ ... -
学习java单例模式
2012-10-22 16:16 697http://calmness.iteye.com/blog/ ... -
JsonUtil错误总结
2012-09-26 10:10 1054java.lang.Integer cannot be cas ... -
struts2总结错误
2012-09-25 10:40 7241.数据类型的不对应,一般是,后台要求int而前端的zoneI ... -
Jquery总结
2012-09-18 14:08 0$.toJSON(); $.parseJson(unescap ... -
mysql学习总结
2012-08-23 17:19 8371.<![CDATA[ select ifnull(su ... -
学习强者的成长之路
2012-08-09 10:25 835http://xwnet.blog.51cto.com/233 ... -
MD5正规的写法
2012-07-20 10:26 876public static String getMD5(byt ... -
引用:异常处理!
2012-07-20 09:37 705... -
关于网站的设计
2012-07-19 10:08 740网站的性能优化:http://www.cnblogs.com/ ... -
eval用法
2012-07-12 10:12 877在函数中改变全局变量 var X2={} X2.Eval= ... -
错误总结
2012-07-11 10:38 6361.missing ) in parenthetical错误可 ... -
学习js的好地方
2012-06-28 13:16 792http://www.zhuoda.org/lunzi/dir ... -
登陆页面
2012-06-26 18:42 976http://themeforest.net/item/dre ... -
学习Session 基类
2012-06-26 16:48 852package com.ruangao.framework.w ...
相关推荐
在这个“struts2连接mysql数据库登录验证程序”中,我们主要探讨以下几个关键知识点: 1. **Struts2框架**:Struts2作为MVC设计模式的实现,负责处理HTTP请求,通过Action类将用户请求映射到业务逻辑,并将结果传递...
通过以上步骤,我们可以构建一个基本的Struts2登录验证系统。不过,实际项目中可能会更复杂,需要考虑多因素认证、密码加密存储、会话超时、记住我功能、以及前后端分离等更多细节。同时,随着技术的发展,现在的...
Struts2、jQuery和Ajax是Web开发中的三大关键技术,它们结合使用可以构建高效、动态且用户友好的登录验证系统。以下是对这些技术及其在登录验证中的应用的详细说明。 Struts2是一个基于MVC(Model-View-Controller...
总的来说,通过这个简单的Struts2登录验证项目,我们可以学习到如何使用Struts2框架进行动作映射、数据校验、业务逻辑处理以及与视图层的交互。这仅仅是Struts2功能的一个冰山一角,随着对框架的深入理解,我们可以...
在这个“Struts2登录验证实例”中,我们将探讨如何利用Struts2实现用户登录功能,包括用户输入验证、会话管理以及错误处理等关键环节。 首先,我们需要在项目中引入Struts2的核心库。这通常通过在`pom.xml`(如果...
Struts2 验证框架详解 Struts2 验证框架是基于 Java 语言的 Web 应用程序框架,提供了一个强大的验证机制,以确保用户输入的数据满足业务逻辑的要求。在 Struts2 中,验证机制是通过 validator 来实现的,该机制...
用户登录验证,struts 2实例教程,一步步教你如何实现一个示例
在Struts2中,表单验证是非常重要的一个环节,它确保了用户输入的数据符合预设的规则,从而保证了应用程序的数据质量和安全性。本示例主要讲解的是使用XML文件进行表单验证的方法。 首先,让我们理解表单验证的基本...
这个"struts2简单的登陆验证"项目是一个基础入门级别的教程,适合初学者学习理解Struts2的核心概念和工作原理。 在Struts2中,登陆验证是常见的功能,涉及到用户身份的确认和权限控制。下面我们将详细探讨Struts2...
总结来说,Struts2提供了完善的框架和工具,使得开发登录注册功能变得容易,同时通过验证机制保证了数据的准确性和安全性。通过学习和实践这个主题,开发者可以掌握Struts2的核心概念和实际操作,提升在企业级应用...
Struts2是一个流行的Java web开发框架,其在处理用户表单数据时提供了强大的验证功能,确保输入的数据符合预期的格式和规则。本文将深入探讨Struts2的表单验证机制。 首先,Struts2的输入验证分为两种方式:手动...
这个标题提到的“Struts2远程命令执行验证工具”就是专门针对这类漏洞设计的检测和分析软件。 Struts2远程命令执行漏洞,通常被称为S2-045或CVE-2017-5638,是由于Struts2框架在处理特定的HTTP头信息时存在缺陷,...
登录验证是Web应用中常见的安全需求,Struts2通过拦截器可以实现对用户登录状态的有效控制。 在Struts2中,拦截器可以分为手动验证和自动验证两种方式。手动验证通常由开发者编写代码来检查用户是否已登录,如果未...
一个简单的例子是使用`$.ajax()`函数,指定URL为Struts2 Action的路径,方法为GET或POST,根据你的需求来传递参数,如待验证的用户名。 3. **服务器端验证**:在Action类中,你需要编写一个方法来检查用户名是否已...
在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合Servlet Filter进一步加强安全性。 首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们...
在"struts2_1.7_validator"这个压缩包中,可能包含了实现Struts2用户登录验证的示例代码。 Struts2的Validator框架是基于Apache Commons BeanUtils和Apache Commons DBCP的,它可以自动将表单字段映射到Action类的...
"Apache+Struts2验证"这个话题涉及到的是针对Apache Struts2框架的安全漏洞检测,特别是S2-053漏洞。 S2-053漏洞全称为"Struts2 REST Plugin远程代码执行",是Apache Struts2框架中的一个严重安全缺陷。该漏洞主要...
在深入探讨Struts2验证框架参数之前,我们首先简要回顾一下Struts2框架本身。Struts2是基于MVC(Model-View-Controller)设计模式的Java Web应用框架,它提供了一种灵活的方式来构建可扩展的企业级Web应用程序。...
这可以通过在Action类中实现这些验证逻辑来完成,或者使用Struts2提供的验证框架,通过XML或者注解定义验证规则。 登录功能相对简单,主要是比较用户输入的用户名和密码与数据库中的记录是否匹配。这里,Action类...
在登录验证系统中,Struts主要负责处理用户请求,调度控制流程,并将数据传递给模型和视图。控制器(Action)类会解析用户的登录请求,执行相应的业务逻辑,并根据结果返回不同的视图。 **Hibernate ORM** ...