论坛首页 Java企业应用论坛

对《可以处理多个请求的Action》一文有点疑问

浏览 5543 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-02-22  
http://www.iteye.com/pages/viewpage.action?pageId=870
《可以处理多个请求的Action》中介绍了两种方法,用于同一个action处理不同请求。

robbin提到:
引用
对于Action的验证文件来说,也是每个method对应一个: actionName-methodName-validation.xml,对于execute方法,则是 actionName-validation.xml



但我在使用中发现个小问题,

我为我的 save() 方法配置了验证文件TestAction-save-validation.xml,却没法正常工作。但当我配置TestAction-validation.xml 时却发现在无论用
/test.action 还是 /test!save.action 才能正常校验了。

我想问一下,有人成功运用过每个method对应一个: actionName-methodName-validation.xml这个功能吗?
也就是 test!save.action -->校验于  -->TestAction-save-validation.xml
          test.action -->校验于  -->TestAction-save-validation.xml


当然如果某个action中某些方法不想被ww拦截,可以加
<interceptor-ref name="component">
                    <param name="excludeMethods">input,cancel</param>
</interceptor-ref>
   发表时间:2006-02-22  
应该是
ActionClassName-actionName-validation.xml,ActionClassName-validation.xml,然后
ActionSuperClassName-actionName-validation.xml,
ActionSuperClassName-validation.xml,ActionImplementedInterfaceName-actionName-validation.xml,ActionImplementedInterfaceName-validation.xml,...这样一直下去。
对同一个Action class定义多个actionName好像是没太大意思,我也正需要对不同的method定义不同的validation rule,似乎可以参照com.opensymphony.xwork.validator.ValidationInterceptor定义一个新的ValidationInterceptor,把
ActionValidatorManagerFactory.getInstance();.validate(action, context);;
改为
ActionValidatorManagerFactory.getInstance();.validate(action, method);;
明天试试看
0 请登录后投票
   发表时间:2006-02-23  
Class(or super class or interface)Name[-context]-validation.xml

context = actionName[!methodName]
0 请登录后投票
   发表时间:2006-02-23  
context does not contain !methodName

code from com.opensymphony.xwork.validator.ValidationInterceptor, you can also enable its logger...
protected void before(ActionInvocation invocation); throws Exception {
    	String method = invocation.getProxy();.getMethod();;
        if (excludeMethods.contains(method); && !includeMethods.contains(method);); {
            log.debug("Skipping validation. Method ["+method+"] found in exclude list.");;
            return;
        }

        if ( includeMethods.size(); == 0 || includeMethods.contains(method); ); {
            Object action = invocation.getAction();;
            String context = invocation.getProxy();.getActionName();;

            if (log.isDebugEnabled();); {
                log.debug("Validating "
                        + invocation.getProxy();.getNamespace(); + "/" + invocation.getProxy();.getActionName(); + ".");;
            }

            ActionValidatorManagerFactory.getInstance();.validate(action, context);;
        }
    }
0 请登录后投票
   发表时间:2006-02-23  
根据楼上介绍再次做了试验.
1. TestAction :
public class TestAction extends ActionSupport {
	private String name;
	
	public String getName(); {
		return name;
	}

	public void setName(String name); {
		this.name = name;
	}

	public String save(); throws Exception {
		if(hasFieldErrors(););{
			return INPUT;
		}
		return SUCCESS;
	}
}

校验文件有:
1. TestAction-validation.xml
2. TestAction-save-validation.xml
3. TestAction-test!save-validation.xml

xwork.xml配置
<action name="test" class="cn.TestAction">
            <result name="input">form.jsp</result>
            <result name="success">test.jsp</result>
        </action>
        <action name="save" class="cn.TestAction" method="save">
            <result name="input">formMethod.jsp</result>
            <result name="success">test.jsp</result>
        </action>


form.jsp文件
<ww:form action="test!save.action" name="test">
    	<ww:textfield name="name"></ww:textfield>
    	<ww:submit></ww:submit>
    </ww:form>

formMethod.jsp
<ww:form action="save.action" name="test">
    	<ww:textfield name="name"></ww:textfield>
    	<ww:submit></ww:submit>
    </ww:form>


测试:
1 . form.jsp
     测试目的: test!save.action 相应的校验文件是哪个?
     结果:   只有 1. TestAction-validation.xml 有作用.
     结论: 1. 每个method对应一个: actionName-methodName-validation.xml 不成立!
             2. Class(or super class or interface)Name[-context]-validation.xml

context = actionName[!methodName]
也不行!

2. formMethod.jsp
    测试目的:save.action 相应的校验文件是哪个?
    结果:   有 1. TestAction-validation.xml
                   2. TestAction-save-validation.xml 同时发生作用.
    结论: 当在xwork.xml中为每个method配置一个action时,校验文件的规则应该是,  Class(or super class or interface)Name[-actionName]-validation.xml ,而不要用 className-validation.xml,如果同时存在会发生两次校验.

没看过源代码,暂妄下定论,不要吐口水!

至此我的疑问还没得到解决,
每个method对应一个: actionName-methodName-validation.xml
???
0 请登录后投票
   发表时间:2006-02-23  
It is clear that webwork performs validation according to action name(action alias in your xwork.xml) instead of method name by default, but you can change this by yourself.
0 请登录后投票
   发表时间:2006-02-23  
如果只能通过 action name 映射,那《可以处理多个请求的Action》一文本中提到actionName-methodName-validation.xml也只能算是笔误了??
0 请登录后投票
   发表时间:2006-02-23  
已经写了一个TestCase,在2.1.7版
Class(or super class or interface)Name[-context]-validation.xml

context = actionName[!methodName]
这个规则是对的。

补充说明下,如果同时有
Class(or super class or interface)Name-validation.xml
Class(or super class or interface)Name-context-validation.xml
两个文件,那么验证器是这两者的总和。

测试代码见附件,两份相同的,多发了一份:)
0 请登录后投票
   发表时间:2006-02-23  
我用的是2.2,这个月才下载的,对于
Class(or super class or interface)Name-actionName!methodName -validation.xml

这个规则真的不行,试了好多次了.
0 请登录后投票
   发表时间:2006-02-23  
我查了一下xwork源代码和wiki文档,webwork2.2(xwork1.1)确实改了,不支持针对method单独声明验证文件了,而是针对actionName单独声明验证文件了。

这样的话,针对处理多个请求的Action来说,我们就应该倾向于对于一个ActionClass在xwork中定义为多个action的方式来实现。这样就会避免两个问题:

1、验证文件无法针对method单独定义规则
2、RestfulActionMapper不支持actionName!method方式的URL请求。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics