`
fan
  • 浏览: 143710 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2的validate错误跳转与chain配合使用的要点

阅读更多
本文基于struts2.1.8.1
        按照struts2的官方文档,chain类型默认的目标Action跳转方法是execute(),摘录xwork的doc: method - used to specify another method on target action to be invoked. * If null, this defaults to execute method * * 在一般情况下,这没有问题。在使用validate拦截器拦截到错误,希望转到目标Action的特定方法时,却发现根本不执行。
        为了描述方便清晰,先定义以上使用场景: FooAction有触发validate拦截器的相关验证代码,验证不通过触发workflow的跳转功能,默认转入FooAction的input结果指定的去向,即BarAction的某个方法,定义为someMethod()。网上有一则相关文章提到:如果在定向到input视图前有错误(如action的hasError方法返回true)和异常发生,且返回的input视图的type为"chain"(即返回到另一个action)时,这个action的方法必须为input,否则这个方法不会执行,而是会直接定位到物理视图。按照这个做法,的确可以进入指定input方法并且执行,可是并没有官方文档有类似说明,这是为什么呢?经过对validate、workflow拦截器的调试分析,终于揭秘了真相。
        FooAction的validate拦截器执行相关的验证方法并得到了errors,通过workflow再chain到BarAction时,会过一遍BarAction的拦截器栈,也就是说,workflow拦截器会再次被执行,只不过此次是针对BarAction。看workflow的代码:
@Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();

        if (action instanceof ValidationAware) {
            ValidationAware validationAwareAction = (ValidationAware) action;

            if (validationAwareAction.hasErrors()) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Errors on action " + validationAwareAction + ", returning result name 'input'");
                }

                String resultName = inputResultName;

                if (action instanceof ValidationWorkflowAware) {
                    resultName = ((ValidationWorkflowAware) action).getInputResultName();
                }

                InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), new Class[0]).getAnnotation(InputConfig.class);
                if (annotation != null) {
                    if (!annotation.methodName().equals("")) {
                        Method method = action.getClass().getMethod(annotation.methodName());
                        resultName = (String) method.invoke(action);
                    } else {
                        resultName = annotation.resultName();
                    }
                }


                return resultName;
            }
        }

        return invocation.invoke();
    }

        在本场景中,由于FooAction验证的结果会通过chain传过来,validationAwareAction.hasErrors()的结果就是true,最终会走return resultName;也就是直接走了return "input",而不会进入action的someMethod方法。那为什么方法更名为input就可以了呢?原来,我们的配置文件里,对validate及workflow配置了
<param name="excludeMethods">input,back,cancel,browse</param>

input恰好就名列其中。也就是说,转向BarAction的input时,workflow是不进行拦截的,所以能进入BarAction的input方法。实际上,按照struts2的设计思想,input等方法就是用于错误处理的,不直接对前端提供服务,所以应该排除在validate和workflow之外。
        这样,解决问题的方法就是:
1,利用struts2现有的机制,更改someMethod方法名为excludeMethods中现有的,最好是input,同时,chain的配置里,明确指定method参数为input,而不是默认的executed
2,把someMethod加入到validate和workflow的excludeMethods配置中
推荐第一种方法,不破坏struts2的设计思想。
分享到:
评论
5 楼 fan 2012-02-29  
虽然是很久以前的帖子了 ,但我还是要更正您的解决方法, 我认为不是很恰当。


很久没上来了。这个解决方案看起来很不错,没有试用。关键是要明白问题的原因。感谢你的回复。
4 楼 chenchangqun11 2011-11-23  
虽然是很久以前的帖子了 ,但我还是要更正您的解决方法, 我认为不是很恰当。

出现这中情况是因为在 chain 之前,fieldError!=null  chain后  actionContext 中仍有 fielidError ,执行目标action前 还会 执行验证  validationAwareAction.hasErrors() 此时
为 true 当然返回input
我提供的解决方法

在目标action中在全局验证方法 validate( ) 如下

@Override
	public void validate()
	{
		this.clearErrorsAndMessages();//一定要写在该方法第一行
		 
	}
3 楼 thinkingmysky 2011-09-04  
博主,我有个问题哦,在目标action上加入一个input方法,然后再配置里面加入method="input" 也根本不起作用啊?、

代码如下:
<action name="login" class="login_LoginAction">
<result name="success" type="chain">logon</result>
<result name="input" type="dispatcher">
<param name="location">/login.jsp</param>
</result>
</action>


<action name="logon" class="com.samilpower.action.base.DispatcherAction" method="input">
<result name="input" type="dispatcher">
<param name="location">/view/index.jsp</param>
</result>
</action>
2 楼 psjay 2010-10-11  
多谢博主,这个问题终于解决了
1 楼 angelgreen 2010-08-09  
嗯 大神  小弟今天也遇到这问题 

不错

相关推荐

    jquery.validate 与 struts2的整合使用

    可以使用Struts2的拦截器来统一处理验证错误,并将错误消息返回到视图层,或者在JSON响应中包含错误信息,由前端展示。 通过以上步骤,我们可以实现jQuery Validate与Struts2的有效整合,达到前端和后端双重验证的...

    Struts2的validate验证框架

    这个validate验证框架中的actiionerror级别的错误的验证提示,并包含了如何在一个Action中处理多个业务逻辑,(struts1.x 中的DispatcheAction),例子比较简单,希望对大家学习struts有所帮助。

    struts中ActionForm的validate方法使用小得

    这样,如果验证失败,ActionErrors就会包含至少一个ActionMessage,从而导致请求不会继续执行Action的`execute`方法,而是根据`struts-config.xml`中的配置跳转到预设的错误处理页面,如"reg.jsp"。 在Struts的配置...

    struts2 validate 验证

    你提到的`TestValidate`可能是一个测试用例,用于演示如何在Struts2中使用`validate`进行数据验证。通常,它会包括一个Action类,里面包含验证方法,以及对应的配置文件条目。测试时,模拟用户输入,检查验证是否按...

    struts的validate框架验证

    Struts的Validate框架是Java Web开发中用于处理用户输入验证的一种工具,它是Struts框架的重要组成部分,主要用于在MVC(Model-View-Controller)架构中确保用户提交的数据满足应用程序设定的规则。在MyEclipse 6.0...

    struts1.2 validate 源代码 实现

    总的来说,`struts1.2 validate`源代码实现涉及到了ActionForm的创建、验证方法的编写、Struts配置文件的更新以及错误处理机制。通过这种方式,可以有效地对用户输入进行控制,提高应用的安全性和用户体验。

    jquery validate配合struts2简单整改

    《jQuery Validate与Struts2整合应用详解》 在Web开发中,前端验证用户输入的数据是必不可少的一环,jQuery Validate插件就是一款强大的JavaScript验证工具,它可以帮助我们方便地实现表单验证。与此同时,Struts2...

    Struts 结合 Validate框架验证详解

    这个方法通常是根据业务逻辑来定义的,如果验证失败,Struts会将错误消息添加到ActionErrors容器中,并跳转回表单页面显示这些错误信息。 Validate框架是Struts提供的一种轻量级验证解决方案,它允许开发者通过XML...

    更加复杂的Struts validate验证

    8. ** strut2-struts1-plugin**:如果你的项目中同时有Struts1和Struts2,可以使用这个插件进行兼容,使得Struts1的validate机制也能在Struts2中正常工作。 9. **注解驱动的验证**:在Struts2中,除了传统的...

    在Eclipse中配置Struts2项目(html)手把手教会你 +struts2 标签库介绍(html) + STRUTS2学习文档.pdf + Struts2―表单验证validate(html) + struts2和struts的比较 + struts教程(html)

    在Eclipse中配置Struts2...Struts2―表单验证validate(html)对validate的type属性校验类型以及param 做了详细的解释说明。 struts2和struts的比较 让你更清楚的知道struts2和struts的不同之处。 struts教程(html)

    struts2错误显示

    ### Struts2错误显示知识点详解 #### 一、Struts2简介及验证机制 Struts2是一个基于MVC模式的开源Web应用框架,用于构建企业级的Java Web应用程序。相较于Struts1.x版本,Struts2提供了更为强大的功能,尤其是在...

    Struts的验证框架Validate使用[2]

    在本文中,我们将深入探讨Struts的验证框架Validate的使用方法,以及它在实际开发中的应用。 1. **验证框架概述** Struts的验证框架是Struts 1.x中的核心功能之一,它允许开发者定义一组验证规则,并在用户提交...

    Struts2用validate方法进行表单验证

    在Struts2中,我们可以利用validate方法进行高效且灵活的前端数据验证,确保用户输入的数据满足业务规则,从而提升应用的安全性和用户体验。 在Struts2中,表单验证主要依赖于两个核心组件:Action类和Validator...

    Validate_code.rar_struts valida_struts valida_struts validate_v

    2. **ValidatorForm**:继承自Struts的`org.apache.struts.action.ActionForm`类,用于封装请求参数并进行验证。 3. **ValidatorRules**:在运行时读取`Validation.xml`文件并生成验证规则的对象。 4. **...

    struts框架validate的应用

    在Struts2中,虽然不再直接使用`Validator`,但类似的验证功能可以通过拦截器(Interceptors)和注解实现。 总结起来,Struts框架的`validate`功能是处理表单验证的关键机制,它使得开发者能够轻松地对用户输入的...

    validate in struts2

    2. 如果有验证规则,Struts2会先调用`validate()`方法进行验证。 3. 如果验证失败,Struts2会填充Action的错误消息并返回当前Action的`INPUT`结果。 4. 如果验证成功,`execute()`方法将继续执行并返回相应结果。 #...

    Struts-Validate-Reset

    "Struts-Validate-Reset"主题主要关注的是在Struts验证框架中如何实现表单数据的重置操作。 验证(Validate)在Struts中通常是通过ActionForm类的子类来完成的。ActionForm是MVC模式中的模型层组件,它负责接收并...

    struts1跳转大全

    在Struts1框架中,页面跳转机制是其核心特性之一,它允许开发者灵活地控制应用程序的流程,实现从一个页面到另一个页面的导航。本文将深入解析Struts1中的五种不同类型的跳转方法,这包括了完整action、仅有Form的...

    Java struts2 validate用户登录校验功能实现

    在本教程中,我们将深入探讨如何使用Struts2的`validate`方法实现用户登录的校验功能。 首先,我们来看一下环境配置。为了运行Struts2项目,你需要Eclipse IDE 4.3.2、Java JDK 1.7_45或更高版本,以及MySQL 5.0或...

Global site tag (gtag.js) - Google Analytics