如何访问 Struts 2 中不在 ValueStack 上的另一个操作的属性?

问题描述 投票:0回答:3

我有两个 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>
java jsp struts2 parameter-passing valuestack
3个回答
1
投票

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

您应该为要传递的属性创建 getter 和 setter。通常通过

param
标签传递参数,可用于参数化其他标签。

在您的情况下,您可以在结果配置中使用

param
标签来创建动态参数

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

有关详细信息,请参阅动态结果配置。


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>

这里是Struts 2的所有结果类型。


0
投票

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

struts.ognl.logMissingProperties=true

struts.el.throwExceptionOnFailure=true

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

© www.soinside.com 2019 - 2024. All rights reserved.