我有一个基于struts的webapp,我希望默认的“欢迎”页面是一个动作。我发现的唯一解决方案似乎是使欢迎页面成为包含重定向到操作的JSP的变体。例如,在web.xml
:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
和index.jsp
:
<%
response.sendRedirect("/myproject/MyAction.action");
%>
当然有更好的方法!
答案 0 :(得分:22)
就个人而言,我会保留您现在拥有的相同设置,但更改前进的重定向。这样可以避免将标题发送回客户端并让他们再次发出请求。
所以,特别是,我会替换
<%
response.sendRedirect("/myproject/MyAction.action");
%>
带有的index.jsp中的
<jsp:forward page="/MyAction.action" />
此更改的另一个影响是,用户不会看到地址栏中的URL从“http://server/myproject”更改为“http://server/myproject/index.jsp”,因为转发在服务器内部发生。
答案 1 :(得分:17)
这是一个非常古老的主题,但我认为讨论的主题仍然具有相关性。我使用struts标签 - s:action来实现这一点。我创建了一个index.jsp,其中我写了这个......
<s:action name="loadHomePage" namespace="/load" executeResult="true" />
答案 2 :(得分:11)
从Servlet规范的2.4版本开始,您可以在欢迎文件列表中拥有一个servlet。请注意,这可能不是URL(例如/myproject/MyAction.action)。它必须是命名的servlet,并且您不能将查询字符串传递给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>
答案 3 :(得分:6)
“当然有更好的方法!”
没有。 Servlet规范(例如Java Servlet规范2.4,“SRV.9.10欢迎文件”)状态:
此机制的目的是允许部署者指定有序的 当存在时,用于附加到URI的容器的部分URI列表 请求与未映射到的WAR中的目录条目对应的URI 一个Web组件。
你不能在'/'上映射Struts,因为Struts需要使用文件扩展名。因此,您将使用隐含映射的组件,例如JSP或静态文件。所有其他解决方案都只是黑客攻击。所以保持你的解决方案,它是完全可读和可维护的,不要再费心了。
答案 4 :(得分:6)
我所做的就是放置一个与struts动作同名的空文件,并欺骗容器来调用struts动作。
实施例。如果您的struts操作是welcome.do,请创建一个名为welcome.do的空文件。这应该欺骗容器调用Struts动作。
答案 5 :(得分:1)
似乎流行的解决方案不适用于所有容器...... http://www.theserverside.com/discussions/thread.tss?thread_id=30190
答案 6 :(得分:1)
我会创建一个过滤器并将所有请求退回到root用前向响应。创建home.do页面的黑客对我来说看起来很难看(还有一件事需要记住,并为那些支持你代码的人进行调查)。
答案 7 :(得分:1)
这里有两个博客采用相同的技术:
它需要Servlet API&gt; = 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
!!
答案 8 :(得分:1)
there are this answer above但不清楚网络应用环境 所以 我这样做:
<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上下文路径。
答案 9 :(得分:0)
只需在web.xml
中的Strut过滤器上方添加一个过滤器,如下所示:
<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就会重定向到动作。您也不需要将任何JSP放在WEB-INF之外。
答案 10 :(得分:0)
我配置如下。它工作得很完美,也没有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>
可能是我们将web.xml中的一些操作index.action配置为<welcome-file>index.action</welcome-file>
,并使用该操作转发所需的页面...
答案 11 :(得分:0)
我几乎可以肯定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>
通过这种方式,我们不仅可以控制第一页作为登录表单,而且还可以控制流程 AFTER 用户登录,具体取决于他的角色。像魅力一样。
答案 12 :(得分:0)
下面的代码可以在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>
答案 13 :(得分:-1)
这也可以减少对新servlet或jsp
的需求<welcome-file-list>
<welcome-file>/MyAction.action</welcome-file>
</welcome-file-list>
答案 14 :(得分:-1)
这对我来说也很好:
<welcome-file-list>
<welcome-file>MyAction.action</welcome-file>
</welcome-file-list>
当用户使用网络应用程序的根目录(mywebapp /)输入webapp时,我无法执行默认操作。 struts 2.3.12中存在一个错误,当您使用根URL时,它不会转到默认操作或使用欢迎页面。这将是一种常见现象。一旦我改回struts 2.1.8就行了。