2008-09-02 37 views
38

Tengo una aplicación web basada en puntales, y me gustaría que la página "bienvenida" predeterminada sea una acción. Las únicas soluciones que he encontrado para esto parecen ser variaciones en hacer de la página de bienvenida un JSP que contiene un redireccionamiento a la acción. Por ejemplo, en web.xml:¿Cómo puedo configurar la página de bienvenida en una acción de puntales?

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

y en index.jsp:

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

Seguramente hay una manera mejor!

Respuesta

1

me gustaría crear un filtro y rebotar todas las solicitudes a raíz de vuelta con responce adelante. Los hacks con la creación de la página home.do me parecen desagradables (una cosa más que debe recordar para usted e investigar para alguien que respalde su código).

6

"¡Sin duda hay una manera mejor!"

No hay. especificaciones de servlet (Java Servlet 2.4 Especificación, "SRV.9.10 Bienvenido archivos", por ejemplo) Estado:

El objetivo de este mecanismo es permitir que el programa de implementación para especificar una ordenada lista de URIs parciales para el contenedor a utilizar para agregar a URI cuando hay una solicitud para un URI que corresponde a una entrada de directorio en WAR que no está asignada a un componente web.

No puede mapear Struts en '/', porque Struts necesita trabajar con una extensión de archivo. Por lo tanto, le queda utilizar un componente mapeado implícitamente, como un JSP o un archivo estático. Todas las otras soluciones son solo hacks. Así que mantenga su solución, es perfectamente legible y fácil de mantener, no se moleste en buscar más.

+0

Esto es incorrecto. Puede mapear extensiones particulares al servlet predeterminado (contenido estático) y cualquier cosa/todo lo demás, independientemente de la extensión al servlet de acción de Struts. – guymac

+0

Si recuerdo correctamente (eso fue hace 6 años después de todo), en Struts 1 se requiere que sus URL de acción tengan una extensión específica, porque así es como se realiza la asignación (URL -> extensión de tira -> resolver módulo - > Acción). Por supuesto, eso no se aplica a WebWork aka "Struts 2". –

+0

De todos modos, tal vez era una pregunta de WebWork y no una pregunta de Struts después de todo :-) –

22

Personalmente, mantendría la misma configuración que tiene ahora, pero cambiaré la redirección de un reenvío. Eso evita enviar un encabezado al cliente y pedirle que haga otra solicitud.

Así, en particular, me gustaría reemplazar el

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

en index.jsp con

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

El otro efecto de este cambio es que el usuario no verá la dirección URL en la barra de direcciones cambia de "http://server/myproject" a "http://server/myproject/index.jsp", ya que el reenvío ocurre internamente en el servidor.

+0

Esto también funcionará si su aplicación se implementó en una ruta no ROOT. Redirigir arriba funcionará si quitas el primer "/". –

+4

reenviar no funciona para mí mientras que sendRedirect funciona. Tengo '404 no encontrado'. – Haozhun

+1

Aparentemente, esto no funcionará si no especificas la URL completa (incluido el dominio, etc.), ¡pero el enfoque de @mrowe funcionó para nosotros! – cprcrack

11

A partir de la versión 2.4 de la especificación del servlet se le permite tener un servlet en la lista de archivos de bienvenida. Tenga en cuenta que esto puede no ser una URL (como /myproject/MyAction.action). Debe ser un servlet con nombre y no puede pasar una cadena de consulta al servlet. Su servlet de controlador necesitaría tener una acción predeterminada.

<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> 
+0

Esto implica el uso de puntales 2, ¿verdad? – Fabien

+1

Esta solución es independiente del marco. Puede usarlo con cualquier cosa, solo tiene que averiguar cómo especificar una acción predeterminada con su marco elegido. –

+1

Funcionó para mí; ¡gracias por el consejo! Anteriormente había utilizado lo siguiente: '<% @ taglib prefix =" struts "uri =" http://struts.apache.org/tags-logic "%> ' – guymac

6

Algo que hago es poner un archivo vacío del mismo nombre que su acción puntales y engañar al contenedor para llamar a la acción de los puntales.

Ej. Si su acción Struts es bienvenida. Haga un archivo vacío llamado welcome.do.Eso debería engañar al contenedor para llamar a la acción de Struts.

17

Este es un hilo muy viejo, pero el tema discutido, creo, sigue siendo relevante. Utilizo una etiqueta de struts - s: acción para lograr esto. He creado una index.jsp en la que he escrito este ...

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

La mejor respuesta ya que no codificas duro' struts.action.extension' en tu jsp. El 'struts.action.extension' se puede cambiar a algo que no sea' action' y luego debe cambiar la url 'request.redirect' en este jsp también. –

+1

Esta es una forma única de struts 2. – VeenarM

-1

Esto funciona así reducir la necesidad de un nuevo servlet o JSP

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

Esto no funciona. Probablemente porque el '' busca un archivo _physical_ por lo tanto, "bienvenido a la lista de archivos".Es por eso que funciona un archivo vacío con el mismo nombre que el nombre de la acción en la carpeta raíz de la aplicación (WebContent). – silver

1

Aquí dos blogs con la misma técnica:

Se requiere 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> 

por lo que ya no necesitan redirect.jsp en el directorio no WEB-INF !!

0

Sólo tiene que añadir un filtro por encima del filtro de puntal en web.xml así:

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

y agregue el código siguiente en el método doFilter de esa clase 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); 
     } 
    } 
} 

Así que el filtro se redirigirá a la acción . No es necesario que se coloque ninguna JSP fuera de WEB-INF también.

-1

Esto funcionó bien para mí, también:

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

yo no era capaz de conseguir la acción predeterminada que se ejecuta cuando el usuario entra en la aplicación web utilizando la raíz de la aplicación web (mywebapp /). Hay un error en struts 2.3.12 que no irá a la acción predeterminada o usa la página de bienvenida cuando usas la url raíz. Esto será una ocurrencia común. Una vez que cambié de nuevo a struts 2.1.8 funcionó bien.

+1

Esto no funciona. Probablemente porque el '' busca un archivo _physical_ por lo tanto, "bienvenido a la lista de archivos". Es por eso que funciona un archivo vacío con el mismo nombre que el nombre de la acción en la carpeta raíz de la aplicación (WebContent). – silver

0

He configurado lo siguiente. funcionó perfectamente y tampoco cambió la URL ...

Crea una acción ficticia como la siguiente en el archivo struts2.xml. por lo que cada vez que se accede a la aplicación como http://localhost:8080/myapp, remitirá a que la acción simulada y luego se vuelve a dirigir a index.jsp/index.tiles ...

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

w/o baldosas

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

puede ser configuramos alguna acción index.action en web.xml como <welcome-file>index.action</welcome-file>, y usamos esa acción para reenviar la página requerida ...

1

there are this answer above pero no está claro sobre el contexto aplicación web por lo hago esto:

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

Y en index.jsp acabo de escribir:

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

Y tengo definición de índice, llamado index y todo para funcionar bien y no depende de la ruta del contexto de la aplicación web.

0

estoy casi seguro de que el PO es la mejor solución (no estoy seguro sobre las mejores prácticas, pero funciona perfectamente, y de hecho es la solución líder de mi proyecto y me prefieren.)

Además, me parece que puede ser combinada con la seguridad del resorte de esta manera:

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

Por esto, no sólo tenemos el control sobre la primera página sea la forma de la conexión, pero controlamos el flujo DESPUÉS usuario acceder en, dependiendo de su papel . Funciona de maravilla.

0

A continuación se puede utilizar el código en struts.xml para cargar la página de bienvenida.

Ejecute alguna acción antes de cargar una página de bienvenida.

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

Devuelve directamente algunos JSP sin ejecución de una Acción.

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

Sin <welcome-file-list> no es necesaria en web.xml

Cuestiones relacionadas