Как настроить страницу приветствия на действие struts?
У меня есть webapp, основанный на struts, и я хотел бы, чтобы страница приветствия по умолчанию была действием. Единственные решения, которые я нашел для этого, похоже, являются вариациями в том, чтобы сделать страницу приветствия JSP, которая содержит перенаправление на действие. Например, в web.xml
:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
и в index.jsp
:
<%
response.sendRedirect("/myproject/MyAction.action");
%>
Конечно, лучший способ!
Ответы
Ответ 1
Лично я бы сохранил ту же настройку, что и сейчас, но изменил перенаправление для пересылки. Это позволяет отказаться от отправки заголовка обратно клиенту и сделать их другим запросом.
Итак, в частности, я бы заменил
<%
response.sendRedirect("/myproject/MyAction.action");
%>
в index.jsp с
<jsp:forward page="/MyAction.action" />
Другим эффектом этого изменения является то, что пользователь не увидит URL-адрес в адресной строке с " http://server/myproject" " http://server/myproject/index.jsp", поскольку пересылка происходит внутри сервера.
Ответ 2
Это довольно старый поток, но обсуждаемая тема, я думаю, по-прежнему актуальна. Для этого я использую тег struts - s: action. Я создал index.jsp, в котором я написал это...
<s:action name="loadHomePage" namespace="/load" executeResult="true" />
Ответ 3
Как и в версии версии Servlet версии 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>
Ответ 4
"Конечно, лучший способ!"
Нет. Спецификации сервлета (Java Servlet Specification 2.4, "SRV.9.10 Приветственные файлы", например):
Цель этого механизма - дать возможность установщику указать упорядоченный список частичных URI для контейнера, который будет использоваться для добавления к URI, когда есть запрос для URI, который соответствует записи каталога в WAR, не сопоставленному веб-компонент.
Вы не можете сопоставить Struts в '/', потому что Struts для работы с расширением файла требуется. Таким образом, вам остается использовать неявно сопоставленный компонент, такой как JSP или статический файл. Все остальные решения - это просто хаки. Поэтому держите свое решение, оно отлично читается и поддерживается, не смотрите дальше.
Ответ 5
Что-то, что я делаю, это поместить пустой файл с тем же именем, что и ваше действие struts, и обмануть контейнер, чтобы вызвать действие struts.
Ex. Если ваше действие struts приветствуется. Do, создайте пустой файл с именем welcome.do. Это должно обмануть контейнер, чтобы вызвать действие Struts.
Ответ 6
Похоже, что популярное решение не будет работать во всех контейнерах... http://www.theserverside.com/discussions/thread.tss?thread_id=30190
Ответ 7
Я бы создал фильтр и отскакивал все запросы, чтобы вернуть его обратно с помощью прямого ответа. Взломы с созданием страницы home.do кажутся уродливыми для меня (еще одна вещь, которую нужно помнить для вас и расследовать для тех, кто будет поддерживать ваш код).
Ответ 8
Здесь два блогов с одинаковой техникой:
Требуется 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
!
Ответ 9
есть этот ответ выше, но неясно о контексте веб-приложения
так
Я делаю это:
<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
, и все это togather работает нормально и не зависит от пути контекста webapp.
Ответ 10
Просто добавьте фильтр выше фильтра Strut в web.xml
следующим образом:
<filter>
<filter-name>customfilter</filter-name>
<filter-class>com.example.CustomFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>customfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
И добавьте следующий код в метод doFilter этого класса CustomFilter
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
if (! httpResponse.isCommitted()) {
if ((httpRequest.getContextPath() + "/").equals(httpRequest.getRequestURI())) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/MyAction");
}
else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
Таким образом, фильтр будет перенаправлен на действие. Вам не нужно, чтобы JSP был размещен вне WEB-INF.
Ответ 11
Я сконфигурировал следующее. он работал отлично, и изменение URL тоже не было...
Создайте фиктивное действие, подобное следующему в файле struts2.xml. поэтому всякий раз, когда мы обращаемся к приложению вроде http://localhost:8080/myapp
, он перенаправляет это на фиктивное действие, а затем перенаправляет его на index.jsp/index.tiles...
<action name="">
<result type="tiles">/index.tiles</result>
</action>
w/o плитки
<action name="">
<result>/index.jsp</result>
</action>
Может быть, мы настроим какое-то действие index.action в web.xml как <welcome-file>index.action</welcome-file>
и используем это действие для пересылки требуемой страницы...
Ответ 12
Я почти уверен, что OP - лучшее решение (не уверенный в лучшей практике, но он отлично работает и на самом деле является решением моего руководителя проекта, и я предпочитаю).
Кроме того, я считаю, что его можно объединить с безопасностью Spring следующим образом:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authorize access="isAnonymous()">
<% response.sendRedirect("/myApp/login/login.action?error=false"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and (hasRole('ADMIN') or hasRole('USER'))">
<% response.sendRedirect("/myApp/principal/principal.action"); %>
</sec:authorize>
<sec:authorize access="isAuthenticated() and hasRole('USER')">
<% response.sendRedirect("/myApp/user/userDetails.action"); %>
</sec:authorize>
Таким образом, мы не только контролируем первую страницу как форму входа, но мы контролируем поток ПОСЛЕ, в который входит пользователь, в зависимости от его роли. Работает как шарм.
Ответ 13
Ниже приведен код, который можно использовать в 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
Ответ 14
Это также уменьшает необходимость в новом сервлете или jsp
<welcome-file-list>
<welcome-file>/MyAction.action</welcome-file>
</welcome-file-list>
Ответ 15
Это тоже сработало для меня:
<welcome-file-list>
<welcome-file>MyAction.action</welcome-file>
</welcome-file-list>
Мне не удалось заставить действие по умолчанию выполнять, когда пользователь вводит webapp, используя корень веб-приложения (mywebapp/). В struts 2.3.12 есть ошибка, которая не будет действовать по умолчанию или использовать страницу приветствия при использовании корневого URL-адреса. Это будет обычное явление. Как только я вернулась к struts 2.1.8, она отлично работала.