2013-06-20 2 views
1

У меня есть две страницы JSP, содержащие два списка из двух разных действий: страница A отображает список сотрудников, страница B отображает список отделов.Struts 2 - Могу ли я получить доступ к свойствам другого действия, которое не находится на ValueStack?

Обе страницы имеют общее текстовое поле (в комплекте с третьей страницы 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> 
+0

Показать конфигурацию вашего действия. –

+0

Думаю, у вас есть проблемы с разными пространствами имен. Попробуйте использовать атрибут 'namespace' в теге' '. –

ответ

1

действий создаются по запросу и не разделяют контекст, потому что это локальные их нить. Если вам нужно свойство, заданное действием, то вы должны указать его с параметром в URL-адресе или взять его из сеанса. Вы должны создать геттеры и сеттеры для свойства, которое вы хотите передать. Обычно параметры параметров, выполняемые с тегом param, могут использоваться для параметризации других тегов.

В вашем случае вы можете использовать param тег в конфигурации результата для создания динамических параметров

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

См Dynamic Result конфигурацию.

0

ognl.NoSuchPropertyException бросается, когда свойство пытается извлечь из объекта, который не имеет такого свойства.

Таким образом, для вашего выражения OGNL, созданного для вашего класса Action, не могут быть методы getter и setter.

Вы можете использовать цепочку типа результата (не рекомендуется) в своем теге результатов для доступа к свойствам одного действия в другим.

вы также можете использовать тип результата redirectAction.

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

Here все типы результатов для Struts 2.

0

Спасибо всем за ваши ответы. Я решил это, комментируя эти строки в struts.properties:

struts.ognl.logMissingProperties=true 

struts.el.throwExceptionOnFailure=true 

Хотя я до сих пор не понимаю, почему Struts судимы найти employeeName.

Смежные вопросы