Struts 2 - 我可以访问ValueStack上没有的其他操作的属性吗?

时间:2013-06-20 08:13:15

标签: java jsp struts2 parameter-passing valuestack

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

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

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

搜索操作是类EmployeeAction的一部分,我可以加载页面A并执行搜索而不会出现问题。但是,在加载页面B时,我遇到了ognl.NoSuchPropertyException,因为employeeName ValueStack上没有DepartmentAction属性。

我该如何解决这个问题?有没有办法从employeeName访问EmployeeAction DepartmentAction?或者我应该如何重新组织我的行为以执行常见搜索功能?

这是我的动作配置文件:

<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>

3 个答案:

答案 0 :(得分:1)

根据请求创建操作,并且不共享上下文,因为它是其线程的本地。如果您需要通过操作设置的属性,那么您应该在URL中提供参数或从会话中获取它。您应该为要传递的属性创建getter和setter。通常,使用param标记传递的参数可用于参数化其他标记。

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

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

请参阅Dynamic Result配置。

答案 1 :(得分:0)

尝试从没有此类属性的对象中提取属性时,抛出ognl.NoSuchPropertyException

因此,可能不会在各自的Action类中为您的OGNL表达式创建getter和setter方法。

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

您也可以使用redirectAction结果类型。

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

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

答案 2 :(得分:0)

谢谢大家的回答。我通过在 struts.properties

中注释这些行来解决这个问题
struts.ognl.logMissingProperties=true

struts.el.throwExceptionOnFailure=true

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