Как я могу установить страницу приветствия для действий Struts? - PullRequest
38 голосов
/ 02 сентября 2008

У меня есть веб-приложение на основе Struts, и я бы хотел, чтобы стандартная страница приветствия была действием. Единственными решениями, которые я нашел для этого, являются варианты создания страницы приветствия JSP, которая содержит перенаправление на действие. Например, в web.xml:

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

и в index.jsp:

<% 
  response.sendRedirect("/myproject/MyAction.action");
%> 

Конечно, есть лучший способ!

Ответы [ 15 ]

22 голосов
/ 04 сентября 2008

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

Так, в частности, я бы заменил

<% 
  response.sendRedirect("/myproject/MyAction.action");
%>

в index.jsp с

<jsp:forward page="/MyAction.action" />

Другой эффект этого изменения заключается в том, что пользователь не увидит, как URL в адресной строке изменится с "http://server/myproject" на" http://server/myproject/index.jsp",, поскольку пересылка происходит внутри сервера. 1013 *

17 голосов
/ 30 января 2011

Это довольно старая тема, но обсуждаемая тема, я думаю, все еще актуальна Для этого я использую тег Struts - s: action. Я создал index.jsp, в котором я написал это ...

<s:action name="loadHomePage" namespace="/load" executeResult="true" />
11 голосов
/ 26 ноября 2008

Начиная с версии 2.4 спецификации сервлета, вам разрешено иметь сервлет в списке файлов приветствия. Обратите внимание, что это может быть не URL (например, /myproject/MyAction.action). Это должен быть именованный сервлет, и вы не можете передать строку запроса сервлету. У вашего сервлета контроллера должно быть действие по умолчанию.

<servlet>
  <servlet-name>MyController</servlet-name>
  <servlet-class>com.example.MyControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>MyController</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
  <welcome-file>MyController</welcome-file>
</welcome-file-list>
6 голосов
/ 21 ноября 2009

Что-то, что я делаю, это помещаю пустой файл с тем же именем, что и ваше действие Struts, и обманываем контейнер, чтобы вызвать действие Struts.

Ex. Если ваше действие Struts - welcome.do, создайте пустой файл с именем welcome.do. Это должно обмануть контейнер для вызова действия Struts.

6 голосов
/ 04 сентября 2008

«Конечно, есть лучший способ!»

Нет. Спецификации сервлета (например, спецификация Java сервлета 2.4, "Файлы приветствия SRV.9.10"):

Цель этого механизма - дать возможность развертывателю указать упорядоченный список частичных URI для контейнера, чтобы использовать для добавления к URI, когда есть запрос URI, который соответствует записи каталога в WAR, не сопоставленной с веб-компонент.

Вы не можете отобразить Struts на '/', потому что Struts вроде требует работы с расширением файла. Таким образом, вам остается использовать неявно сопоставленный компонент, такой как JSP или статический файл. Все остальные решения - просто взломы. Так что держите свое решение, оно отлично читаемо и обслуживаемо, не беспокойтесь о том, чтобы смотреть дальше.

1 голос
/ 10 августа 2013

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

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <url-pattern>*.tiles</url-pattern>
</servlet-mapping>

А в index.jsp я просто пишу:

<jsp:forward page="index.tiles" />

И у меня есть определение индекса с именем index, и все это прекрасно работает и не зависит от пути к контексту веб-приложения.

1 голос
/ 21 марта 2013

Вот два блога с одинаковой техникой:

Требуется Servlet API> = v2.4:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
    <url-pattern>/index.htm</url-pattern>    <<==  *1*
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.htm</welcome-file>   <<== *2*
</welcome-file-list>

, поэтому вам больше не нужен redirect.jsp в не- WEB-INF каталоге !!

1 голос
/ 03 сентября 2008

Я бы создал фильтр и отослал бы все запросы к корню обратно с прямым ответом. Хаки с созданием домашней страницы home.do выглядят уродливыми (еще одна вещь, которую нужно помнить для вас и исследовать для того, кто будет поддерживать ваш код).

1 голос
/ 02 сентября 2008

Похоже, что популярное решение не будет работать во всех контейнерах ... http://www.theserverside.com/discussions/thread.tss?thread_id=30190

0 голосов
/ 28 апреля 2016

Для загрузки страницы приветствия можно использовать приведенный ниже код в struts.xml.

Выполните действие перед загрузкой страницы приветствия.

<!-- welcome page configuration -begin -->
    <action name="" class="com.LoginAction">
        <result name="success">login.jsp</result>
    </action>
<!-- welcome page configuration -end -->

Вернуть напрямую JSP без выполнения действия.

<!-- welcome page configuration -begin -->
    <action name="">
        <result name="success">login.jsp</result>
    </action>
<!-- welcome page configuration -end -->

Нет <welcome-file-list> не требуется в web.xml

...