如何将欢迎页面设置为struts操作?

时间:2008-09-02 12:40:48

标签: java jsp struts2 struts

我有一个基于struts的webapp,我希望默认的“欢迎”页面是一个动作。我发现的唯一解决方案似乎是使欢迎页面成为包含重定向到操作的JSP的变体。例如,在web.xml

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

index.jsp

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

当然有更好的方法!

15 个答案:

答案 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就行了。