Struts 2 динамическое связывание параметров - PullRequest
1 голос
/ 20 октября 2010

В стеке по умолчанию есть перехватчик parms, который привязывает параметры к установщикам, найденным в вызываемом действии. Это прекрасно работает, когда вы знаете имя параметра. Например, если параметром запроса является «employee.name», его можно связать со свойством моего действия, у которого есть свойство «employee» со свойством «name». Чтобы заставить его работать, мне нужно знать, каким именем будет имя параметра запроса, и добавить в моё действие set -mployee () объекта типа Employee, или это тоже может быть Map.

Что если я хочу позволить действию связать этот параметр с другим свойством, которое я не знаю, каким будет. Допустим, действие получает в качестве параметра имя, для которого будет задан параметр запроса.

<s:action name="showEmployee" executeResult="true">
   <s:param name="employeePrefix">xyz.wz.empl</s:param>
</s:action>

Это означает, что действие связывает все параметры сотрудника с xyz.wz.empl. Например, скажем, параметр запроса имеет следующее: xyz.wz.empl.name = Alfredo xyz.wz.empl.lastName = Осорио

Я бы хотел привязать это к свойству моего действия, скажем, сотруднику Map, но это не сработает, потому что параметр запроса - xyz.wz.empl. Как связать этот динамический параметр с вызванным действием, используя параметр, который был отправлен в действие (employeePrefix).

Я мог бы попросить параметры запроса

ActionContext.getContext().getParameters()

и выполнить преобразование самостоятельно, но я думаю, что должен быть другой способ явного вызова чего-либо из инфраструктуры Struts 2 для преобразования, как это делает com.opensymphony.xwork2.interceptor.ParametersInterceptor.

Спасибо.

1 Ответ

0 голосов
/ 01 сентября 2011

На мой взгляд, это не идеальное решение, но оно будет делать то, что вам нужно.

  1. В вашем действии Struts 2 потребуется реализовать интерфейсы SessionAware и ParameterAware.
  2. Создатьзакрытое поле, которое называется картой «параметры» и создайте для него метод получения / установки.
  3. Теперь, когда вы вызываете getParameters (), у вас будет карта ваших пар имя / значение.

Теперь для следующей части вам нужно будет использовать отражение.

Так, например, вам нужно будет сделать следующее:

Map myParams = getParameters()
Employee e = new Employee()

Class clas = null;
try {
    clas = Class.forName("Employee");
    Field fieldlist[] = clas.getDeclaredFields();
    for (int i = 0; i < fieldlist.length; i++) {
        Field fld = fieldlist[i];
        if(myParams.containsKey(fld.getName()))
            fld.set(e, myParams.get(fld.getName())
    }

} catch (ClassNotFoundException ex) {
// handle exception case
}

Это должно отобразить все параметры в этой карте на поле в объекте сотрудника, если он существует на карте.Это, конечно, может быть перенесено в отдельный метод, который будет принадлежать к чему-то вроде класса Util, где вы передаете класс, который вы хотите отразить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...