【问题标题】:a little question of action based on struts2基于struts2的一个小动作问题
【发布时间】:2011-08-25 04:37:09
【问题描述】:

朋友们!我正在通过 vaannila 的 Struts 2 Spring Integration 学习 struts2 框架 ,在运行应用程序时,我对success.jsp感到困惑,部分文件如下:

<body>

  ${message}  

</body>

按照教程一步步调试后,tomcat启动时,浏览器显示 正是 success.jsp ${message} 的意义所在。但从逻辑上讲,它应该表明 Spring 强大的依赖注入功能。我检查了如下配置:

  • 动作(这里是 helloWorld.action
  • 这个类确实做了需要做的事情(这里是 HelloWorld.java
  • 行动与工人阶级之间的联系

    applicationContext.xml 做类似配置的spring bean

      <bean id="helloWorldClass" class="com.vaannila.HelloWorld" >
        <property name="message" value="Hello World!" />
      </bean>
    

    struts.xml 确实命名了一个名为 helloWolrd 的操作,用于引用 applicationContext.xml 中定义的 bean helloWorldClass 喜欢:

     <action name="helloWorld" class="helloWorldClass">
           <result name="SUCCESS">/success.jsp</result>
     </action>
    

但似乎在 applicationcontext.xml 中定义的用于显示 DependancyInjection 的 bean 属性不起作用,为什么?

【问题讨论】:

  • downloadable source 工作正常。
  • 如果您完全按照本教程进行操作,请对文件进行比较(来自 Ischin 提供的可下载源)。
  • 朋友四元数,你给了一个好主意:) 朋友 Ischin 应该是对的,但如果你更改了 bean helloWorldClass 中的消息,它似乎不起作用。

标签: spring struts2


【解决方案1】:

${message} 应该可以工作。看起来您的 jsp 无法解析 EL。首先检查你的jsp是否可以解析EL。尝试使用 ${1+2}。如果它直接在浏览器上打印,请在您的 jsp 页面顶部添加以下内容。

<%@ page isELIgnored="false"%> 

你也可以用这个!

<s:property value="message"/>

【讨论】:

  • ${ } 很好,比&lt;s:property /&gt; 有更好的性能。我从不使用&lt;s:property /&gt;,除非处理type conversionOGNL
  • 使用 在转义 HTML 标记时提供了很大的灵活性。此外,如果属性为空,${} 将抛出异常。但 不会打印任何内容。
  • 需要澄清你的误导:如果property 不存在,${ } 不会抛出异常,如果property 的值为空,${ } 将不打印任何内容。另见:Performance Tuning
  • @lschin 非常感谢您澄清误导。你强迫我测试我评论的内容,发现你是对的!!!
  • 图萨尔,谢谢!你的解决方案有效:) 我会密切关注这个机制。并感谢其他所有朋友:)
【解决方案2】:

设置器是否在您的操作中到位 - 即 setMessage(String) ??

如果是,查看 spring 是否真的随时调用它 - 在此方法中使用调试器。

如果所有这些都是真的,请发布文件?


PS - Spring 的设置是否完成?就像您定义了 Spring 配置文件一样,web.xml 中确实包含 Spring 上下文侦听器,并且不要忘记在您的 Web 应用程序中推送 Spring jar。

【讨论】:

    【解决方案3】:

    message”有setter 和getter 方法吗?它必须是 setMessagegetMessage

    【讨论】:

      【解决方案4】:

      我认为你必须添加

      <constant name="struts.objectFactory" value="spring" />
      

      到您的 struts.xml 配置中,以使 spring 集成正常工作。

      <struts>
          <constant name="struts.objectFactory" value="spring" />
          ...
      </struts>
      

      【讨论】:

        【解决方案5】:

        我猜你想在这里混合两种东西。

        1. Spring 依赖注入和
        2. JSP 范围变量

        ${message} 将尝试在从 PageScope 到 applictionScope 的各种范围内查找变量“消息”。

        在哪里做

        <bean id="helloWorldClass" class="com.vaannila.HelloWorld" >
            <property name="message" value="Hello World!" />
          </bean>
        

        将在com.vaannila.HelloWorld 实例中注入一个属性。这对 jsp 不可用。为此,您需要将此变量放在操作类的某个范围内(在请求、会话或应用程序中)。

        【讨论】:

        • 在 S2 的情况下,${} 实际上会在检查正常的 servlet 范围之前首先查看 S2 值堆栈。您的第二个陈述在很大程度上也是不正确的;如果动作类具有可访问的属性(早期版本中的公共 getter,后期版本中的任何内容,包括没有访问器的私有属性),则该值将通过 EL S2 标记在 JSP 中可用。
        • 你能举个例子来支持你所说的吗?
        • 举个例子?回复:JSP EL,这就是 S2 请求包装器的编写方式。回复:OGNL 属性访问,这就是 OGNL 的工作原理。
        • (我认为可能只是你不需要 getter,属性本身仍然必须是公共的;OGNL 更改为允许在没有公共 getter 的情况下访问属性。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 2011-11-26
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多