Как выполнить поиск настроенного действия Struts

#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) .