Struts2 OGNL - Порядок отправки параметров запроса - PullRequest
0 голосов
/ 09 марта 2011

Я использую jsp и struts2, и у меня есть следующий сценарий:

<s:form>
<s:hidden name="empId" value="123"/>
<s:textfield name="employee.name"/>
<s:submit action="save"/>
</s:form>

Когда эта форма отправлена, выражение employee.name (эквивалентно getEmployee (). SetName ()) получаетвыполняется перед "сохранить" метод.И значение «empId» не доступно внутри метода getEmployee ().Значение «empId» доступно только внутри метода «save».Можно ли получить значение empId внутри getEmployee ()?

Ниже приведен код в моем классе действий:

public String save() {
  //empId is available here
  return SUCCESS;
}

public Employee getEmployee(){
  if (employee == null){
    //empId is not available here
    employee = employeeService.get(empId);
  }
  return employee;
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Во-первых, я предполагаю, что у вас do есть установщик для поля empId (вы его не показывали), и что ваша проблема в том, что порядок, в котором устанавливаются параметры, является произвольным .

Для ParametersInterceptor есть опция, которая заставляет его сначала устанавливать свойства верхнего уровня. Вы можете включить его, настроив свой стек перехватчиков для определения параметров перехватчика с набором свойств ordered.

<interceptor-ref name="params">
    <param name="ordered">true</param>
</interceptor-ref>

Затем в вашем классе действий измените метод setEmpId на:

public void setEmpId(Integer empId) { // or whatever type it is
    this.empId = empId;
    employee = employeeService.get(empId);
}

В качестве альтернативы подходу сеттера вы также можете создать конвертер типов для класса Employee и затем изменить свою форму на:

<s:form>
    <s:hidden name="employee" value="123"/>
    <s:textfield name="employee.name"/>
    <s:submit action="save"/>
</s:form>
0 голосов
/ 09 марта 2011

Я не уверен, что понимаю, так что для ясности, вы хотите вызвать getEmployee () и не знаете, как получить идентификатор сотрудника в методе?

Допустим, у вас есть таблицаиз сотрудников.Предположим также, что в таблице приведены следующие данные:

  • имя сотрудника
  • идентификатор сотрудника

Предположим, что в каждой строке есть ссылкакоторый при нажатии приведет вас к экрану сведений о сотруднике для этого сотрудника.Поскольку вы только что напечатали идентификатор сотрудника, вы также можете создать HTML-элемент привязки с необходимыми параметрами get, чтобы при вызове действия у вас было то, что вам нужно.Тег <s:a> вместе с тегом <s:param> делают это простым.

См. Мой ответ здесь Локализация переключателя Struts Tiles2 для примера использования тега привязки struts2 и тега свойств.Хотя в этом примере используются статические свойства, просто замените атрибут value в теге параметра на переменную id.

См. http://struts.apache.org/2.2.1.1/docs/a.html для получения более подробной информации.

Редактировать : Теперь я вижу, что до вашего редактирования я был далеко.

Я думаюпроще всего было бы создать метод getEmployee (int id).Тогда вы можете избавиться от скрытого значения поля тоже.После этого он должен быть прямым ...

Ваш JSP будет выглядеть примерно (не проверено):

<s:form>
   <s:textfield name="%{employee[123].name}"/>
   <s:submit action="save"/>
</s:form>
...