Подтвердить что ты не робот

Как настроить страницу приветствия на действие 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");
%> 

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

4b9b3361

Ответ 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.

Ответ 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, она отлично работала.