#java #servlets #struts-1
#java #сервлеты #struts-1
Вопрос:
Я хочу сделать следующее:
final Action myAction = getActionDefinedInStrutsConfig(param);
myAction.execute(params);
Есть ли способ выполнить поиск действий, которые ActionServlet
были инициализированы?
Я могу создать новый следующим образом:
final Action myAction = new ActionImpl();
myAction.execute(params);
но в этом случае новое действие инициализируется неправильно, подключенный сервлет не установлен, и getServlet() возвращает null.
Небольшое разъяснение о том, зачем мне это нужно:
Проблема в том, что в настоящее время у меня есть 2 страницы входа. Один для обычных пользователей и один для администраторов. Они должны быть полностью отдельными системами, но факт в том, что в настоящее время это не так. Мне нужно создать страницу входа ‘proxy’, которая решает, на какую страницу входа перенаправлять в соответствии с запросом. Однако, если я перенаправлю на URL-адрес, пользовательский интерфейс будет отрисован. Мне нужно вызвать действия пользователя или администратора для входа в систему, чтобы обработать запрос моей прокси-страницы. Кроме того, перемещение логики внутри сервиса, хотя и является правильным подходом, в настоящее время не является вариантом.
Комментарии:
1. Что именно вы хотите сделать и с какой именно целью?
2. Вызовите другое действие из моего действия. Потому что я хочу вызвать его логику, не рисуя его пользовательский интерфейс.
3. Вы можете перенаправить свое действие на другое действие в
struts-config.xml
4. Разве это не всегда отображало бы пользовательский интерфейс действия, на которое я перенаправляю? В моих тестах я, похоже, не могу заставить его не рисовать пользовательский интерфейс. Я хочу, чтобы вызываемое действие обрабатывало мой запрос, без создания собственного пользовательского интерфейса.
Ответ №1:
Хорошо, поскольку я понимаю, что вы имеете в виду, вот что я бы предложил:
- Используйте свое действие для целей проверки, т.е. для извлечения данных из
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);
Комментарии:
1. Это стандартный способ сделать это, да. Однако в устаревшей системе я хочу сделать это на уровне контроллера. Не на уровне бизнес-сервиса (где есть логика), способ, который вы предлагаете, является правильным. Я могу объяснить, зачем мне это нужно на уровне контроллера, если хотите, но я не хочу тратить ваше время.
2. Продолжайте, Симеон, мы понятия не имеем, как настроена ваша система, и я бы не предлагал менять уровень контроллера вещей…..
3. Проблема в том, что в настоящее время у меня есть 2 страницы входа. Один для обычных пользователей и 1 для администраторов. Они должны быть полностью отдельными системами, но факт в том, что в настоящее время это не так. Мне нужно создать страницу входа ‘proxy’, которая решает, на какую страницу входа перенаправлять в соответствии с запросом. Однако, если я перенаправлю на URL-адрес, пользовательский интерфейс будет отрисован. Мне нужно вызвать действия пользователя или администратора для входа в систему, чтобы обработать запрос моей прокси-страницы. Кроме того, перемещение логики внутри сервиса, хотя и является правильным подходом, в настоящее время не является вариантом.
4. Затем добавьте другой параметр, который вы можете получить с помощью запроса, и добавьте прокси для пересылки такого запроса.
Ответ №2:
Вы можете определять действия в своих пересылках:
<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")
в другом.
Комментарии:
1. У меня это не работает, поскольку я не хочу рисовать пользовательский интерфейс действия, на которое я перенаправляю. Есть ли способ пересылки без рисования пользовательского интерфейса действия, на которое вы пересылаете?
2. Если я правильно понял, вы хотите повторно использовать код, верно? Разве вы не можете обработать запрос во втором действии и перенаправить его в первое действие? Вы также могли бы иметь оба действия, наследуемые от класса с
doStuff(Request req)
.