java - studio - ¿Cómo puedo configurar la página de bienvenida para una acción de puntales?
tag struts jsp (15)
Tengo una aplicación web basada en struts, y me gustaría que la página de "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
:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
y en index.jsp
:
<%
response.sendRedirect("/myproject/MyAction.action");
%>
Sin duda hay una mejor manera!
"¡Sin duda hay una mejor manera!"
No hay Las especificaciones del servlet (Java Servlet Specification 2.4, "SRV.9.10 Welcome Files", por ejemplo) indican:
El objetivo de este mecanismo es permitir que el implementador especifique una lista ordenada de URI parciales para que el contenedor use para agregar a URI cuando hay una solicitud de un URI que corresponde a una entrada de directorio en WAR que no está asignada a un componente web. .
No puede asignar 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.
A partir de la versión 2.4 de la especificación 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>
Algo que hago es poner un archivo vacío con el mismo nombre que la acción de sus puntales y engañar al contenedor para llamar a la acción struts.
Ex. 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.
Aquí dos blogs con la misma técnica:
- http://technologicaloddity.com/2010/03/25/spring-welcome-file-without-redirect/
- http://wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage
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 necesita redirect.jsp
en el directorio no WEB-INF
!!
Crearía un filtro y rebotaría todas las solicitudes para volver a la raíz con respuesta directa. 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).
El siguiente código se puede usar 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 -->
No se necesita <welcome-file-list>
en web.xml
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. Creé un index.jsp en el que escribí esto ...
<s:action name="loadHomePage" namespace="/load" executeResult="true" />
Esto funcionó bien para mí también:
<welcome-file-list>
<welcome-file>MyAction.action</welcome-file>
</welcome-file-list>
No pude ejecutar la acción predeterminada cuando el usuario ingresa a la aplicación web usando 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.
Esto también reduce la necesidad de un nuevo servlet o jsp
<welcome-file-list>
<welcome-file>/MyAction.action</welcome-file>
</welcome-file-list>
Estoy casi seguro de que OP es la mejor solución (no estoy seguro de las mejores prácticas, pero funciona perfectamente, y en realidad es la solución que el líder de mi proyecto y yo preferimos).
Además, creo que se puede combinar con la seguridad de Spring 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>
Con esto, no solo tenemos control sobre la primera página para que sea el formulario de inicio de sesión, sino que controlamos el flujo DESPUÉS de que el usuario inicie sesión, dependiendo de su rol. Funciona de maravilla.
He configurado como siguiente. funcionó perfecto y ningún cambio de URL también ...
Crea una acción ficticia como la siguiente en el archivo struts2.xml. así que cada vez que accedemos a aplicaciones como http://localhost:8080/myapp
, reenviará eso a la acción ficticia y luego redirigirá a index.jsp / index.tiles ...
<action name="">
<result type="tiles">/index.tiles</result>
</action>
sin azulejos
<action name="">
<result>/index.jsp</result>
</action>
puede ser que configuremos alguna acción index.action en web.xml como <welcome-file>index.action</welcome-file>
, y usemos esa acción para reenviar la página requerida ...
Parece que una solución popular no funcionará en todos los contenedores ... http://www.theserverside.com/discussions/thread.tss?thread_id=30190
Personalmente, mantendría la misma configuración que tienes ahora, pero cambiaré la redirección para un forward. Eso evita enviar un encabezado al cliente y pedirle que haga otra solicitud.
Entonces, en particular, reemplazaría 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 URL en la barra de direcciones cambiar de " http://server/myproject " a " http://server/myproject/index.jsp ", ya que el reenvío ocurre internamente en el servidor.
Simplemente agregue un filtro sobre el filtro de Strut en web.xml
como este:
<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 siguiente código 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);
}
}
}
Para que Filter se redirija a la acción. No es necesario que se coloque ninguna JSP fuera de WEB-INF también.
Esta es la respuesta anterior, pero no está claro el contexto de la aplicación web, así que 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
solo escribo:
<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.