【问题标题】:Can I access properties of another action which is not on the ValueStack in Struts 2?我可以访问不在 Struts 2 中的 ValueStack 上的另一个动作的属性吗?
【发布时间】:2013-06-20 08:13:14
【问题描述】:

我有两个 JSP 页面显示来自两个不同操作的两个列表:页面 A 显示员工列表,页面 B 显示部门列表。

两个页面的顶部都有一个共同的文本字段(包含在第三个 JSP 页面中),用于按姓名搜索员工:

<s:form action="searchEmployeesByName">
    <s:textfield name="employeeName" />
    <s:submit>
</s:form>

搜索操作是 EmployeeAction 类的一部分,我可以加载页面 A 并毫无问题地执行搜索。

但是,在加载页面B时,我遇到了ognl.NoSuchPropertyException,因为属性employeeName不在DepartmentActionValueStack上。

我该如何解决这个问题?有什么方法可以从DepartmentAction 访问EmployeeAction 中的employeeName?或者我应该如何重新组织我的操作来执行常见的搜索功能?

这是我的动作配置文件:

<struts>   
    <package name="employee" namespace="/employee" extends="tiles-default">    
        <action name="getEmployeeList" class="my.package.EmployeeAction"
            method="getEmployeeList">
            <result name="success">/employee_list.tiles</result>
        </action>    
        <action name="searchEmployeesByName" class="my.package.EmployeeAction"
            method="searchEmployeesByName">
            <result name="success">/search_results.tiles</result>
        </action>    
    </package>      
    <package name="department" namespace="/department" extends="tiles-default">   
        <action name="getDepartmentList" class="my.package.DepartmentAction"
            method="getDepartmentList">
            <result name="success">/department_list.tiles</result>
        </action>    
    </package>    
</struts>

【问题讨论】:

  • 显示您的操作配置。
  • 我认为您在使用不同的命名空间时遇到了麻烦。尝试在&lt;s:form&gt; 标签中使用namespace 属性。

标签: java jsp struts2 parameter-passing valuestack


【解决方案1】:

操作是根据请求创建的,并且不共享上下文,因为它是线程本地的。如果您需要操作设置的属性,则应在 URL 中为其提供参数或从会话中获取。

您应该为要传递的属性创建 getter 和 setter。通常使用param标签完成传递参数,可用于参数化其他标签。

在您的情况下,您可以在结果配置中使用param 标签来创建动态参数

<result name="searchEmployeesByName" type="redirectAction">
  <param name="actionName">department</param>
  <param name="employeeName">${employeeName}</param>
</result>

详见Dynamic Results配置。

【讨论】:

    【解决方案2】:

    当试图从不具有此类属性的对象中提取属性时,将引发 ognl.NoSuchPropertyException

    因此,您的相应 Action 类上可能没有为您的 OGNL 表达式创建的 getter 和 setter 方法。

    你可以在你的结果标签中使用结果类型链(不推荐)来访问一个动作的属性 另一个。

    你也可以使用redirectAction Result Type。

     <action name="getEmployeeList" class="...">
        <!-- Chain to another namespace -->
        <result type="chain">
            <param name="actionName">getDepartmentList</param>
        </result>
    </action>
    

    Here 是 Struts 2 的所有结果类型。

    【讨论】:

      【解决方案3】:

      谢谢大家的回答。我通过在 struts.properties 中注释这些行来解决这个问题:

      struts.ognl.logMissingProperties=true
      
      struts.el.throwExceptionOnFailure=true
      

      虽然我仍然不明白为什么 Struts 之前试图找到employeeName。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多