2008-09-02 7 views
38

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

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

и в index.jsp:

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

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

ответ

1

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

6

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

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

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

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

+0

Это неправильно. Вы можете сопоставить определенные расширения с сервлетами по умолчанию (статический контент) и любыми/любыми остальными независимо от расширения для сервлетов действия Struts. – guymac 2014-09-19 01:38:18

+0

Если я правильно помню (это было 6 лет назад), в Struts 1 вам нужно, чтобы ваши URL-адреса действия имели определенное расширение, потому что это так, как выполняется сопоставление (URL -> расширение полосы -> разрешить модуль - > Действие). Конечно, это не относится к WebWork aka «Struts 2». – 2014-09-21 18:46:18

+0

В любом случае, возможно, это был вопрос WebWork, а не вопрос Struts :-) – 2014-09-21 18:47:22

22

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

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

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

в index.jsp с

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

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

+0

Это также будет работать, если ваше приложение развернуто на пути не-ROOT. Переадресация выше будет работать, если вы разделите первый «/». – 2008-11-12 23:55:56

+4

Вперед не работает для меня, а sendRedirect работает. Получил «404 не найден». – Haozhun 2011-08-09 16:52:00

+1

По-видимому, это не сработает, если вы не укажете полный URL (включая домен и т. Д.), Но подход @mrowe работал для нас! – cprcrack 2011-12-28 20:01:06

11

Начиная с версии 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

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

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

17

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

<s:action name="loadHomePage" namespace="/load" executeResult="true" /> 
-1

Это работает, а также снижает потребность нового сервлета или JSP

<welcome-file-list> 
<welcome-file>/MyAction.action</welcome-file> 
</welcome-file-list> 
1

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

Это требует 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 каталог !!

0

Просто добавьте фильтр над фильтром 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.

-1

Это работало отлично для меня тоже:

<welcome-file-list> 
<welcome-file>MyAction.action</welcome-file> 
</welcome-file-list> 

Я не был в состоянии получить действие по умолчанию для выполнения, когда пользователь вводит в веб-приложение, используя корень веб-приложения (mywebapp /). В struts 2.3.12 есть ошибка, которая не будет действовать по умолчанию или использовать страницу приветствия при использовании корневого URL-адреса. Это будет обычное явление. Как только я перешел на стойки 2.1.8, он работал нормально.

0

У меня есть следующие настройки. он работал идеально и не изменилось URL ...

Создайте фиктивное действие, подобное следующему в файле struts2.xml. поэтому, когда мы получаем доступ приложения, как http://localhost:8080/myapp, он перенаправляет, что фиктивное действие и затем перенаправляет на index.jsp/index.tiles ...

<action name=""> 
    <result type="tiles">/index.tiles</result> 
</action> 

ж/O плитки

<action name=""> 
    <result>/index.jsp</result> 
</action> 

может быть мы настраиваем какое-то действие index.action в web.xml как <welcome-file>index.action</welcome-file> и используем это действие для пересылки требуемой страницы ...

1

there are this answer above, но не ясно, о контексте веб-приложений так я это сделать:

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

0

Я почти уверен, что ОП является лучшим решением (не уверен, наилучшей практики, но она прекрасно работает, и на самом деле является решением моего руководителя проекта, и я предпочитаю.)

Кроме того, я считаю, это может комбинироваться с весной безопасностью, как это:

<%@ 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> 

по этому, не только у нас есть контроль над первой страницей будет формой Логина, но мы контролируем поток ПОСЛЕ пользователя логин в зависимости от его роли , Работает как шарм.

0

Ниже код может быть использован в 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

 Смежные вопросы

  • Нет связанных вопросов^_^