如何将欢迎页面设置为struts操作?
我有一个基于struts的web应用程序,我想默认的“欢迎”页面是一个行动。 我发现的唯一解决scheme似乎是使欢迎页面成为包含redirect到操作的JSP的变体。 例如,在web.xml
:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
并在index.jsp
:
<% response.sendRedirect("/myproject/MyAction.action"); %>
当然有更好的办法!
就个人而言,我会保持现在的设置,但改变一个前锋的redirect。 这样可以避免将头发送回客户端,让他们发出另一个请求。
所以,特别是,我会更换
<% response.sendRedirect("/myproject/MyAction.action"); %>
在index.jsp中
<jsp:forward page="/MyAction.action" />
这种变化的另一个影响是用户不会看到地址栏中的URL从“ http:// server / myproject ”更改为“ http://server/myproject/index.jsp ”,因为转发发生内部在服务器上。
这是一个相当古老的主题,但我认为讨论的话题仍然相关。 我使用struts标签 – s:行动来实现这一点。 我创build了一个index.jsp,我写了这个…
<s:action name="loadHomePage" namespace="/load" executeResult="true" />
从2.4版本的Servlet规范中,您可以在欢迎文件列表中拥有一个servlet。 请注意,这可能不是一个URL(例如/myproject/MyAction.action)。 它必须是一个命名的servlet,并且不能将查询string传递给servlet。 你的控制器servlet需要有一个默认的动作。
<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>
“当然有更好的办法!”
没有。 Servlet规范(例如Java Servlet规范2.4,“SRV.9.10欢迎文件”)状态:
此机制的目的是允许部署者指定容器的部分URI的有序列表,以便在存在与WAR中的目录条目相对应的URI的请求(未映射到Web组件)的情况下附加到URI 。
您不能将Struts映射到“/”上,因为Struts需要使用文件扩展名。 所以你只能使用隐式映射的组件,如JSP或静态文件。 所有其他解决scheme只是黑客。 所以保持你的解决scheme,它是完全可读和可维护的,不要打扰进一步。
我做的事情是把一个与你的struts动作同名的空文件,并诱骗容器调用struts动作。
防爆。 如果您的struts操作是welcome.do,请创build一个名为welcome.do的空文件。 这应该欺骗容器来调用Struts操作。
看来,一个stream行的解决scheme将不会在所有的容器中工作… http://www.theserverside.com/discussions/thread.tss?thread_id=30190
我会创build一个filter,并退回所有的请求,以转发回应。 创buildhome.do页面的问题对我来说看起来很难看(还有一件事情要记住,并且要为支持你的代码的人进行调查)。
这里有两个相同的技术博客:
- http://technologicaloddity.com/2010/03/25/spring-welcome-file-without-redirect/
- http://wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage
它需要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>
所以你不再需要在非WEB-INF
目录下的redirect.jsp
了!
上面有这个答案,但不清楚的Web应用程序上下文,所以我这样做:
<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
,它都收集工作正常,而不是取决于webapp上下文path。
我configuration如下。 它工作完美,也没有URL的变化…
在struts2.xml文件中创build一个如下所示的虚拟操作。 所以每当我们访问像http://localhost:8080/myapp
这样的应用程序时,它会将其转发到dummy动作,然后redirect到index.jsp / index.tiles …
<action name=""> <result type="tiles">/index.tiles</result> </action>
瓦/瓦片
<action name=""> <result>/index.jsp</result> </action>
可能是我们在web.xml中configuration一些操作index.action作为<welcome-file>index.action</welcome-file>
,并使用该操作转发所需的页面…
我几乎可以肯定,OP是最好的解决scheme(不确定最佳实践,但它完美的工作,实际上是我的项目负责人的解决scheme,我更喜欢。)
另外,我发现它可以和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>
这样,我们不仅可以控制第一页作为login表单,而且我们还可以根据用户的angular色控制用户login后的stream程。 奇迹般有效。
下面的代码可以用在struts.xml中来加载欢迎页面。
在加载欢迎页面之前执行一些操作。
<!-- welcome page configuration -begin --> <action name="" class="com.LoginAction"> <result name="success">login.jsp</result> </action> <!-- welcome page configuration -end -->
直接返回一些JSP而不执行一个Action。
<!-- welcome page configuration -begin --> <action name=""> <result name="success">login.jsp</result> </action> <!-- welcome page configuration -end -->
web.xml中不需要<welcome-file-list>
只需在web.xml
Strutfilter上面添加一个filter就可以了:
<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>
并在该CustomFilter类的doFilter方法中添加以下代码
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); } } }
因此,filter将redirect到该操作。 您也不需要将任何JSP放置在WEB-INF之外。
这也可以减less对新的servlet或jsp的需求
<welcome-file-list> <welcome-file>/MyAction.action</welcome-file> </welcome-file-list>
这也适用于我:
<welcome-file-list> <welcome-file>MyAction.action</welcome-file> </welcome-file-list>
当用户使用web应用程序(mywebapp /)的根目录进入web应用程序时,我无法获得执行的默认操作。 在struts 2.3.12中有一个错误,当你使用根URL的时候,它不会进入默认的动作或使用欢迎页面。 这将是一个普遍的现象。 一旦我改回到strut 2.1.8,它工作正常。