当前位置: 首页 > 面试题库 >

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

章宏恺
2023-03-14
问题内容

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

高级通配符

从2.1.9+开始,可以在操作名称中定义正则表达式。要使用这种形式的通配符,必须设置以下常量:

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

正则表达式可以有两种形式,最简单的一种是
{FIELD_NAME},在这种情况下,FIELD_NAME将使用匹配的文本填充操作中带有的字段,例如:

<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请求了url ,则BookAction的字段“ type”将设置为“
fiction”,而字段“ title”将设置为“ Frankenstein”。

绝对好,如果您使用常规的Action方法(例如)读取这些变量,则效果很好execute()

如果尝试从prepare()方法中读取它们,则它们为null,因为PrepareInterceptor在其他Interceptor之前的运行负责设置参数。解决此问题的常用方法是在执行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. -->

这对于来自页面的参数非常有用,但 不适用于Advanced Wildcards设置的参数 。它们仍然为空。

如何解决这个问题?


问题答案:

该参数不是由ParametersInterceptor设置的(就像来自JSP的那些参数一样),而是

StaticParametersInterceptor设置的

为了将它们填充到prepare()方法中,paramsPrepareParamsStack必须使用相同的技巧。
由于没有 现成 的Interceptor Stack ,您必须对其进行定义。
从开始defaultStack,我们应该创建一个这样的Stack:

<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,它可以完美地工作。



 类似资料:
  • JPA是一个随Java规范发布的库。 因此,它支持实体持久性的所有面向对象的概念。 到目前为止,我们已经完成了对象关系映射的基础知识。 本章将指导您完成对象和关系实体之间的高级映射。 继承策略 继承是面向对象语言的核心概念,因此我们可以使用实体之间的继承关系或策略。 JPA支持三种类型的继承策略,例如SINGLE_TABLE,JOINED_TABLE和TABLE_PER_CONCRETE_CLAS

  • 我有两种将实体映射到域的方法。 当我试图定义实体列表到域的映射方法时,我发现了用于映射集合元素的模糊映射方法。 有没有一种方法可以定义用于映射对象集合的方法

  • 我正在使用mapstruct从一个DTO映射到另一个DTO。我有多个默认方法,但其中2个返回值为String,并且使用相同的类作为输入参数,这给我带来了“使用java MapStruct的模糊映射方法”错误。 错误:(16,7)Java:在将属性“java.lang.String StatusHistory”映射到java.util.Map:java.util.Map toMap(java.lan

  • 我无法从列表映射器(字符串公司)向对象映射器传递一些公共参数 起初,我使用的是接口而不是抽象类。而且没有@AfterMapping方法。事实上,我不知道如何正确地将其作为String公司@Context传递。有没有@Context和@AfterMapping,或者至少有它,所以我的问题是,当列表映射器getEmployeeFromDTO按顺序调用“item”mapper getEmployeeFr

  • 我安装了最新版本的Android Studio,并导入了一个较旧的项目。当我尝试打开它时会出现以下错误: