高级通配符映射在Prepare()方法中找不到参数 [英] Advanced Wildcard Mappings Parameters not found in Prepare() method

查看:129
本文介绍了高级通配符映射在Prepare()方法中找不到参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从文档中: Struts2的高级通配符映射


高级通配符

从2.1开始。可以在动作
名称中定义9个正则表达式。要使用这种形式的通配符,以下常量必须是
set:

From 2.1.9+ regular expressions can be defined defined in the action name. To use this form of wild card, the following constants must be set:

<constant name="struts.enable.SlashesInActionNames" value="true"/> 
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />

正则表达式有两种形式,最简单的一种是
{FIELD_NAME} ,在这种情况下,
操作中包含 FIELD_NAME 的字段将填充匹配的文字,示例:

The regular expressions can be in two forms, the simplest one is {FIELD_NAME}, in which case the field with the FIELD_NAME in the action will be populated with the matched text, for example:

<package name="books" extends="struts-default" namespace="/">
    <action name="/{type}/content/{title}" class="example.BookAction">
        <result>/books/content.jsp</result>
    </action> 
</package>

在此示例中,如果网址 / fiction / content / Frankenstein
请求,BookAction的字段 type 将设置为 fiction
字段 title 将设置为 Frankenstein

In this example, if the url /fiction/content/Frankenstein is requested, BookAction's field "type" will be set to "fiction", and the field "title" will be set to "Frankenstein".

这绝对是好的,如果你在常规的Action方法中读取这些变量就可以正常工作,比如 execute()

This is absolutely great, and works fine if you read those variables in a regular Action method, like execute().

如果您尝试从 prepare()方法中读取它们,它们为空,因为 PrepareInterceptor 在其他负责设置参数的拦截器之前运行;解决此问题的常用方法是使用适当的拦截器堆栈来获取在执行 prepare()方法时已经填充的参数...

If you try to read them from the prepare() method, they are null, because the PrepareInterceptor runs before the other Interceptors responsibles for setting the parameters; the usual way to resolve this issue is to use the apposite Interceptor Stack to get the parameters already populated when executing the prepare() method...

来自文档: ParamsPrepareParamStack

<!-- An example of the paramsPrepareParams trick. This stack
     is exactly the same as the defaultStack, except that it
     includes one extra interceptor before the prepare interceptor:
     the params interceptor.

     This is useful for when you wish to apply parameters directly
     to an object that you wish to load externally (such as a DAO
     or database or service layer), but can't load that object
     until at least the ID parameter has been loaded. By loading
     the parameters twice, you can retrieve the object in the
     prepare() method, allowing the second params interceptor to
     apply the values on the object. -->

这适用于来自页面的参数,但对参数不起作用由Advanced Wildcards设置。它们仍为空。

This works great for parameters coming from the page, but it does not work for the parameters set by Advanced Wildcards. They are still null.

如何解决此问题?

推荐答案

该参数不是由 ParametersInterceptor (类似于来自JSP的那些),但 StaticParametersInterceptor
要让它们填入 prepare()方法,必须应用 paramsPrepareParamsStack 的相同技巧。

因为没有拦截器堆栈来执行此操作开箱即用的,你必须定义它。
defaultStack 开始,我们应该像这样创建一个堆栈:

That parameters are not set by the ParametersInterceptor (like those coming from the JSP), but by the StaticParametersInterceptor.
To have them filled in the prepare() method, the same trick of the paramsPrepareParamsStack must be applied.
Since there is not an Interceptor Stack that does that out-of-the-box, you must define it.
Starting from the defaultStack, we should create a Stack like this:

<interceptor-stack name="allYourParamsAreBelongToUsStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="i18n"/>
 <!-- THE TRICK: NOW PREPARE() WILL FIND EVERYTHING SET -->     
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
    </interceptor-ref>
 <!-- END OF THE TRICK -->
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
    </interceptor-ref>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
</interceptor-stack>

注意: ActionMappingParams 不是需要,仅供未来使用。

Note: ActionMappingParams is not needed, just included for future uses.

如果您发现任何与此相关的问题,请发表评论。 AFAIK,它完美无瑕。

Please comment in case you discover any problem related to this. AFAIK, it works flawlessly.

这篇关于高级通配符映射在Prepare()方法中找不到参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆