2

请告诉我准备拦截器的工作原理我现在正在使用它并发现了意外行为

prepare()
validate()
execute()

这些是方法

所以当我点击请求时,它调用了 3 次

prepare()
validate()
execute()
prepare()
validate()
execute()
prepare()
validate()
execute()

我不知道它有什么问题根据我的理解,它应该只运行准备方法并显示预填充的数据表单,当用户单击提交时,它应该提交数据。

请解释

<action name="updatebusinessinfo" class="com.controller.UpdateBusinessDetails">

            <interceptor-ref name="params"/>
            <!--
            <interceptor-ref name="prepare"/> 

            <interceptor-ref name="basicStack"/>
            -->

            <interceptor-ref name="fileUpload">
                    <param name="maximumSize">2097152</param>
                    <param name="allowedTypes">image/png,image/gif,image/jpeg,image/pjpeg</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="success">businessinfo.jsp</result>
            <result name="input">businessinfo.jsp</result>
            <result name="error">businessinfo.jsp</result>
        </action>

是的朋友,我在 struts.xml 文件中犯了错误。现在请告诉我应该如何在prepare()方法中接收 url 参数? http://www.myweb.com/updatebusinessinfo/23

我尝试关注但不工作

<action name="updatebusinessinfo/*" class="com.controller.UpdateBusinessDetails">
<param name="id">{1}</param>

            <interceptor-ref name="params"/>
            <!--
            <interceptor-ref name="prepare"/> 

            <interceptor-ref name="basicStack"/>
            -->

            <interceptor-ref name="fileUpload">
                    <param name="maximumSize">2097152</param>
                    <param name="allowedTypes">image/png,image/gif,image/jpeg,image/pjpeg</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="success">businessinfo.jsp</result>
            <result name="input">businessinfo.jsp</result>
            <result name="error">businessinfo.jsp</result>
        </action>
4

2 回答 2

3

只是一些关于这个问题的提示,对于寻找有关 Prepare Interceptor 信息的人们可能会派上用场:

  • struts2 中的 DefaultStack 已经包含了 Prepare 拦截器,因此如果将它们都包含在内,您将有 2 次调用 prepare()。通常你不希望那样。
  • 在 DefaultStack 中,Prepare 拦截器在 Params 拦截器之前调用,因此您不会在 prepare() 方法中拥有请求参数。如果您想在此处使用参数做某事(例如,从带有 ID 的数据库中获取某些内容),您将无法做到。

在这里查看 struts2 中的基本/默认堆栈:http: //struts.apache.org/release/2.0.x/docs/struts-defaultxml.html

有一个“paramsPrepareParamsStack”在 Prepare 之前和之后使用 Params,所以你在 prepare() 中有你的参数。

于 2013-04-09T08:13:53.970 回答
1

好吧,如果没有任何进一步的信息,真的很难说出这是什么以及为什么会发生。我们仍然希望您提供有关您正在尝试做什么的更多详细信息?您点击的 URL、有关配置的信息以及有关您的应用程序的任何其他信息。

只有实现了 Preparable 接口时才会调用 Prepare 方法。简而言之,它是一种 init 方法,允许我们在实际繁重的工作开始之前进行任何初始化工作。

Prepare 方法将在您的 execute 方法之前被调用。我建议您了解 Prepare 方法的工作原理以及堆栈实际上是如何调用它的。

以类似的方式,S2 将调用您的操作类的 validate 方法,如果您已实现它,并将根据方法内部提供的实现来验证数据。

这只是流程的概述,我仍然建议提供有关您的上下文的更多信息以获得任何好的输入。

于 2012-05-28T14:36:13.270 回答