如何将欢迎页面设置为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页面的问题对我来说看起来很难看(还有一件事情要记住,并且要为支持你的代码的人进行调查)。

这里有两个相同的技术博客:

它需要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,它工作正常。