40

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

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

并在index.jsp

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

肯定有更好的办法!

4

15 回答 15

23

就个人而言,我会保持与您现在相同的设置,但将重定向更改为转发。这样可以避免将标头发送回客户端并让他们发出另一个请求。

所以,特别是,我会更换

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

在 index.jsp 中

<jsp:forward page="/MyAction.action" />

此更改的另一个影响是用户不会看到地址栏中的 URL 从“ http://server/myproject ”更改为“ http://server/myproject/index.jsp ”,因为转发发生在服务器内部。

于 2008-09-04T14:31:22.697 回答
17

这是一个相当古老的线程,但我认为讨论的主题仍然是相关的。我使用 struts 标签 - s:action 来实现这一点。我创建了一个 index.jsp,我在其中写了这个......

<s:action name="loadHomePage" namespace="/load" executeResult="true" />
于 2011-01-30T12:53:32.117 回答
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>
于 2008-11-25T21:01:11.693 回答
6

“肯定有更好的办法!”

没有。Servlet 规范(Java Servlet Specification 2.4,例如“SRV.9.10 Welcome Files”)状态:

此机制的目的是允许部署者指定部分 URI 的有序列表,以便容器在请求对应于未映射到 Web 组件的 WAR 中的目录条目的 URI 时使用附加到 URI .

您不能将 Struts 映射到“/”上,因为 Struts 需要使用文件扩展名。因此,您只能使用隐式映射的组件,例如 JSP 或静态文件。所有其他解决方案都只是黑客。所以保留你的解决方案,它是完全可读和可维护的,不要费心去寻找。

于 2008-09-03T21:13:38.713 回答
6

我所做的事情是放置一个与您的 struts 动作同名的空文件,并欺骗容器调用 struts 动作。

前任。如果您的struts 操作是welcome.do,请创建一个名为welcome.do 的空文件。这应该会欺骗容器调用 Struts 动作。

于 2009-11-21T13:37:59.873 回答
1

似乎流行的解决方案不适用于所有容器... http://www.theserverside.com/discussions/thread.tss?thread_id=30190

于 2008-09-02T14:06:51.133 回答
1

我将创建一个过滤器并通过正向响应将所有请求退回到根目录。对我来说,创建 home.do 页面的黑客看起来很难看(还有一件事要记住,并调查支持你代码的人)。

于 2008-09-02T21:39:32.233 回答
1

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

它需要 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>

所以你不再需要redirect.jsp在非WEB-INF目录中!

于 2013-03-21T15:19:01.683 回答
1

上面有这个答案,但网络应用程序上下文不清楚,所以我这样做:

<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 上下文路径。

于 2013-08-10T14:20:55.650 回答
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>,并使用该动作来转发所需的页面......

于 2013-05-19T19:38:41.363 回答
0

只需在 Strut 的过滤器上方添加一个过滤器,web.xml如下所示:

<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);
        }
    }
}

这样过滤器将重定向到操作。您也不需要将任何 JSP 放在 WEB-INF 之外。

于 2013-04-09T15:01:30.210 回答
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>

这样,我们不仅可以控制作为登录表单的第一页,还可以控制用户登录的流程,具体取决于他的角色。奇迹般有效。

于 2015-11-20T11:39:48.447 回答
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 -->

<welcome-file-list>web.xml 中不需要 No

于 2016-04-28T15:47:26.307 回答
-1

这也可以减少对新 servlet 或 jsp 的需求

<welcome-file-list>
<welcome-file>/MyAction.action</welcome-file>
</welcome-file-list>
于 2013-02-11T12:01:16.090 回答
-1

这对我来说也很好:

<welcome-file-list>
<welcome-file>MyAction.action</welcome-file>
</welcome-file-list>

当用户使用 Web 应用程序的根目录 (mywebapp/) 进入 Web 应用程序时,我无法执行默认操作。struts 2.3.12 中有一个错误,当您使用根 url 时,它不会转到默认操作或使用欢迎页面。这将是一个普遍现象。一旦我改回struts 2.1.8,它就可以正常工作。

于 2013-04-19T20:44:52.087 回答