【问题标题】:How can I set the welcome page to a struts action?如何将欢迎页面设置为 struts 操作?
【发布时间】:2010-09-07 13:15:43
【问题描述】:

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

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

index.jsp:

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

肯定有更好的方法!

【问题讨论】:

    标签: java jsp struts2 struts


    【解决方案1】:

    只需在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);
            }
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      下面的代码可以在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 中不需要&lt;welcome-file-list&gt;

      【讨论】:

        【解决方案3】:

        我几乎可以肯定 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用户登录的流程,具体取决于他的角色。像魅力一样工作。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            我的配置如下。它运行完美,也没有 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 为&lt;welcome-file&gt;index.action&lt;/welcome-file&gt;,并使用该动作来转发所需的页面...

            【讨论】:

              【解决方案6】:

              这对我也很有效:

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

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

              【讨论】:

              • 这不起作用。可能是因为&lt;welcome-file-list&gt; 寻找一个 physical 文件,因此是“欢迎文件列表”。这就是为什么在应用根 (WebContent) 文件夹中放置一个与操作名称相同名称的空文件有效的原因。
              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                • 这不起作用。可能是因为&lt;welcome-file-list&gt; 寻找一个 physical 文件,因此是“欢迎文件列表”。这就是为什么在应用根 (WebContent) 文件夹中放置一个与操作名称相同名称的空文件有效的原因。
                【解决方案9】:

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

                <s:action name="loadHomePage" namespace="/load" executeResult="true" />
                

                【讨论】:

                • 最佳答案,因为您不会在 jsp 中硬编码 struts.action.extensionstruts.action.extension 可能会更改为 action 以外的其他内容,然后您还需要更改此 jsp 中的 request.redirect url。
                • 这是 struts 2 唯一的方法。
                【解决方案10】:

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

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

                【讨论】:

                  【解决方案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>
                  

                  【讨论】:

                  • 此解决方案与框架无关。您可以将它与任何东西一起使用,您只需要弄清楚如何使用您选择的框架指定默认操作。
                  • 为我工作;谢谢你的提示!以前我使用过以下内容:&lt;%@ taglib prefix="struts" uri="http://struts.apache.org/tags-logic" %&gt;&lt;struts:redirect forward="login.action" /&gt;
                  【解决方案12】:

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

                  所以,特别是,我会替换

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

                  在 index.jsp 中带有

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

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

                  【讨论】:

                  • 如果您的应用程序部署在非 ROOT 路径上,这也将起作用。如果您去掉第一个“/”,上面的重定向将起作用。
                  • forward 对我不起作用,而 sendRedirect 起作用。得到“404 未找到”。
                  • 显然,如果您不指定完整的 URL(包括域等),这将不起作用,但 @mrowe 的方法对我们有用!
                  • 同样,&lt;jsp:forward&gt; 也得到了 404。
                  【解决方案13】:

                  “肯定有更好的方法!”

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

                  这种机制的目的是允许部署者指定一个有序的 容器的部分 URI 列表,用于在存在 URI 时附加到 URI 请求对应于 WAR 中未映射到的目录条目的 URI 一个 Web 组件。

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

                  【讨论】:

                  • 这是不正确的。您可以将特定扩展映射到默认(静态内容)servlet 和任何/其他任何东西,而不管对 Struts 操作 servlet 的扩展。
                  • 如果我没记错的话(毕竟那是 6 年前),在 Struts 1 中,你需要让你的动作 URL 具有特定的扩展名,因为这是执行映射的方式(URL ->剥离扩展 -> 解析模块 -> 操作)。当然,这不适用于 WebWork aka "Struts 2"。
                  • 无论如何,也许那是一个 WebWork 问题,而不是一个 Struts 问题:-)
                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      猜你喜欢
                      • 2011-12-05
                      • 2013-03-06
                      • 1970-01-01
                      • 2023-03-28
                      • 2019-01-18
                      • 2012-01-12
                      • 2015-03-28
                      • 1970-01-01
                      • 2021-02-21
                      相关资源
                      最近更新 更多