java - 在Prepare()方法中找不到高级通配符映射参数

标签 java xml regex struts2 interceptor

来自文档:Struts2's Advanced Wildcard Mappings :

Advanced Wildcards

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" />

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>

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())中读取这些变量,则效果很好。

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

来自文档: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. -->

这对于来自页面的参数非常有用,但对于高级通配符设置的参数不起作用。它们仍然为空。

如何解决这个问题?

最佳答案

该参数不是由 ParametersInterceptor 设置的(就像来自 JSP 的那些),但是StaticParametersInterceptor
要将它们填充到 prepare() 方法中,必须应用 paramsPrepareParamsStack 的相同技巧。
由于没有现成可用的拦截器堆栈,因此您必须定义它。
defaultStack 开始,我们应该创建一个像这样的堆栈:

<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,仅包含供将来使用。

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

关于java - 在Prepare()方法中找不到高级通配符映射参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19495332/

相关文章:

java - 渲染期间引发异常 : TabHost requires a TabWidget with id "android:id/tabs"

xml - 独特的粒子归因 - XSD 问题

java - 您如何向用户表示 XML 文档中的位置?

regex - 如何用bash中变量的值替换第i行的第j列

MySQL Regexp匹配图片链接

java - 有意停止服务

java - 如何在jsp表中显示Json字符串

c# - 将 html 字符串拆分为 N 部分

java - 模拟器 Oreo 和真实设备上的 INSTALL_FAILED_NO_MATCHING_ABIS

java - Spring Boot 项目中的 application.properties 文件在哪里?