Как найти настроенное действие Struts

Я хочу сделать следующее:

final Action myAction = getActionDefinedInStrutsConfig(param);
myAction.execute(params);

Есть ли способ найти действия, которые были инициализированы ActionServlet?

Я могу создать новый так:

 final Action myAction = new ActionImpl();
 myAction.execute(params);

но таким образом новое действие не инициализируется должным образом, присоединенный сервлет не устанавливается и getServlet() возвращает значение null.


Небольшое пояснение, зачем мне это нужно:

Проблема в том, что у меня в настоящее время есть 2 страницы входа. Один для обычных пользователей и один для администраторов. Они должны быть полностью отдельными системами, но на самом деле это не так. Мне нужно создать страницу входа «прокси», которая решает, на какую страницу входа перенаправить в соответствии с запросом. Однако если я перенаправлю URL-адрес, пользовательский интерфейс будет нарисован. Мне нужно вызвать действия входа пользователя или администратора для обработки моего запроса прокси-страницы. Кроме того, перемещение логики внутри службы, хотя и является правильным подходом, в настоящее время не является вариантом.


person Simeon    schedule 01.06.2011    source источник
comment
Что именно вы хотите сделать и с какой целью?   -  person Buhake Sindi    schedule 01.06.2011
comment
Вызвать другое действие из моего действия. Потому что я хочу вызвать его логику, не рисуя его пользовательский интерфейс.   -  person Simeon    schedule 01.06.2011
comment
Вы можете перенаправить свое действие на другое действие в struts-config.xml   -  person Buhake Sindi    schedule 01.06.2011
comment
Разве это не всегда будет отображать пользовательский интерфейс действия, на которое я перенаправляюсь? В моих тестах я не могу заставить его не рисовать пользовательский интерфейс. Я хочу, чтобы вызываемое действие обрабатывало мой запрос, не рисуя собственный пользовательский интерфейс.   -  person Simeon    schedule 01.06.2011


Ответы (2)


Хорошо, поскольку я понимаю, что вы имеете в виду, вот что я бы предложил:

  • Используйте свое действие для целей проверки, т. е. для получения данных от ActionForm и проверки их достоверности. Как только вся информация будет готова, отправьте информацию в службу.
  • Служба (не обязательно веб-служба, а простой POJO) будет иметь бизнес-логику приложения с соответствующими исключениями и возвращаемыми типами. Как только вы вызовете соответствующую службу с ее методом, получите результат и, наконец,
  • Заполните необходимые ActionForm или выполните mapping.findForward().

Таким образом, если вам нужна другая бизнес-логика, используемая другим действием Struts, скорее вызовите службу, которую использует второе действие. Это эффективный способ повторного использования кода и хорошей практики ООП.

Надеюсь это поможет.


Взломанный способ состоял бы в том, чтобы сделать это:

final Action myAction = new ActionImpl();
myAction.setServlet(getServlet());
/* ONLY if your form enctype is "multipart/request-data". */
myAction.setMultipartRequestHandler(getMultipartRequestHandler());

//Finally
myAction.execute(params);
person Buhake Sindi    schedule 01.06.2011
comment
Это стандартный способ сделать это да. Однако в устаревшей системе я хочу сделать это на уровне контроллера. Не на уровне бизнес-обслуживания (где логика), то, как вы предлагаете, - правильный путь. Я могу объяснить, зачем мне это нужно на уровне контроллера, если хотите, но я не хочу тратить ваше время. - person Simeon; 01.06.2011
comment
Давай, Симеон, мы понятия не имеем, как настроена твоя система, и я бы не советовал менять уровень контроллера..... - person Buhake Sindi; 01.06.2011
comment
Проблема в том, что у меня в настоящее время есть 2 страницы входа. Один для обычных пользователей и один для администраторов. Они должны быть полностью отдельными системами, но на самом деле это не так. Мне нужно создать страницу входа «прокси», которая решает, на какую страницу входа перенаправить в соответствии с запросом. Однако если я перенаправлю URL-адрес, пользовательский интерфейс будет нарисован. Мне нужно вызвать действия входа пользователя или администратора для обработки моего запроса прокси-страницы. Кроме того, перемещение логики внутри службы, хотя и является правильным подходом, в настоящее время не является вариантом. - person Simeon; 01.06.2011
comment
Затем добавьте еще один параметр, который можно получить через запрос, и добавьте прокси для пересылки такого запроса. - person Buhake Sindi; 01.06.2011

Вы можете определить действия в своих форвардах:

    <action parameter="command" path="/firstAction"
        input="firstAction.tiles" name="someForm" scope="session" validate="true" type="com.mycompany.FirstAction">
        <forward name="toSecond" path="/secondAction.do?command=someMethod" redirect="true"/>
    </action>

    <action parameter="command" path="/secondAction" input="secondAction.tiles" name="someForm"
        scope="session" validate="true" type="com.mycompany.SecondAction">
        <forward name="backToFirst" path="/firstAction.do?command=myMethod" redirect="true" />
    </action>

Теперь вы можете использовать mapping.findForward("toSecond") в первом действии и mapping.findForward("backToFirst") в другом.

person iruediger    schedule 01.06.2011
comment
Это не работает для меня, так как я не хочу рисовать пользовательский интерфейс действия, на которое я перенаправляюсь. Есть ли способ переслать без рисования пользовательского интерфейса действия, на которое вы перенаправляете? - person Simeon; 01.06.2011
comment
Если я правильно понял, вы хотите повторно использовать код, верно? Разве вы не можете обработать запрос во втором действии и перенаправить его в первое действие? Вы также можете наследовать оба действия от класса с doStuff(Request req). - person iruediger; 01.06.2011