Как я могу настроить страницу приветствия на действие struts?

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

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

и в index.jsp:

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
40
0
52 386
15

Ответы 15

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

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

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

Нет. В спецификациях сервлетов (например, Java Servlet Specification 2.4, «SRV.9.10 Welcome Files») указано:

The purpose of this mechanism is to allow the deployer to specify an ordered list of partial URIs for the container to use for appending to URIs when there is a request for a URI that corresponds to a directory entry in the WAR not mapped to a Web component.

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

Это неверно. Вы можете сопоставить определенные расширения сервлету по умолчанию (статическое содержимое) и чему-либо / всему остальному, независимо от расширения сервлета действий Struts.

guymac 19.09.2014 05:38

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

Damien B 21.09.2014 22:46

В любом случае, возможно, это был вопрос WebWork, а не вопрос Struts в конце концов :-)

Damien B 21.09.2014 22:47

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

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

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

в index.jsp с

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

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

Это также будет работать, если ваше приложение развернуто не по пути ROOT. Вышеупомянутый редирект будет работать, если вы уберете первый "/".

Georgy Bolyuba 13.11.2008 02:55

forward не работает для меня, а sendRedirect работает. Получил "404 Not Found".

Haozhun 09.08.2011 20:52

Очевидно, это не сработает, если вы не укажете полный URL (включая домен и т. д.), Но подход @mrowe сработал для нас!

cprcrack 29.12.2011 00:01

То же самое, также получил 404 с <jsp:forward>.

silver 30.12.2014 00:44

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

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

Craig Wohlfeil 15.03.2012 04:29

Работал у меня; Спасибо за чаевые! Раньше я использовал: <%@ taglib prefix = "struts" uri = "http://struts.apache.org/tags-logic" %><struts:redirect forward = "login.action" />

guymac 19.09.2014 05:40

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

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

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

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

Лучший ответ, поскольку вы не кодируете struts.action.extension жестко в своем jsp. struts.action.extension может быть изменен на что-то другое, кроме action, и тогда вам также нужно изменить URL-адрес request.redirect в этом jsp.

Alireza Fattahi 24.02.2016 19:34

Это только стойки 2.

VeenarM 28.05.2016 08:35

Это также снижает потребность в новом сервлете или jsp.

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

Это не работает. Вероятно, потому что <welcome-file-list> ищет файл физический, следовательно, «приветственный список ФАЙЛОВ». Вот почему размещение пустого файла с тем же именем, что и имя действия, в корневой папке приложения (WebContent) работает.

silver 04.01.2015 18:35

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

Требуется 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 !!

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

Для меня это тоже сработало:

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

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

Это не работает. Вероятно, потому что <welcome-file-list> ищет файл физический, следовательно, «приветственный список ФАЙЛОВ». Вот почему размещение пустого файла с тем же именем, что и имя действия, в корневой папке приложения (WebContent) работает.

silver 04.01.2015 18:34

Я настроил следующее. он работал отлично, и без изменения URL-адреса ...

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

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

без плитки

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

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

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

<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, и все это работает нормально и не зависит от пути контекста веб-приложения.

Я почти уверен, что 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>

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

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

Другие вопросы по теме