【问题标题】:How prepare interceptor works in struts2?准备拦截器如何在struts2中工作?
【发布时间】:2012-06-02 21:37:03
【问题描述】:

请告诉我准备拦截器是如何工作的 我现在正在使用它并发现了策略行为

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>

【问题讨论】:

  • 请发布您如何定义拦截器堆栈更好地发布完整的 struts.xml 文件。
  • 不久前发布了这样一个问题,OP 不小心执行了 3 次 ajax 调用...如果您使用的是默认堆栈,我也在这里猜测。

标签: java struts2 validation


【解决方案1】:

关于这个问题的一些提示可能会对寻找有关 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() 中有你的参数。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多