【问题标题】:How to use interceptor on the default page?如何在默认页面上使用拦截器?
【发布时间】:2013-07-17 03:43:02
【问题描述】:

这是我的情况:在 webapp 中,我使用拦截器来设置语言(Locale)。 如果用户登录,我使用该用户的语言属性。 否则,如果设置了 cookie,我将使用此 cookie 的值。 否则,我使用浏览器的设置。

当我导航到应用程序和登录时,它运行良好。

问题出在欢迎页面上,因为它调用了 mydomain.com/index.jsp,它没有通过拦截器,所以没有设置语言(它总是使用浏览器设置)。

有没有办法通过索引页面上的拦截器或在 index.jsp 页面中设置Locale 值?

谢谢!

解决办法:

我从 web.xml 文件中的index.jsp 中删除了.jsp

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

我在我的 struts.xml 文件中添加了 index 操作:

<default-action-ref name="index" />

<action name="index">
  <interceptor-ref name="appStack" />
  <result name="success">index.jsp</result>
</action>

语言拦截器是appStack 的一部分。

感谢大家的帮助!

【问题讨论】:

    标签: cookies struts2 interceptor


    【解决方案1】:

    我建议您做以下两件事之一:(您的选择)

    (1) 在 Web 过滤器中实现您的逻辑,并为您的容器配置此过滤器,以便您可以设置语言(如果尚未设置)。这很容易做到,只要看看 HelloWorld 过滤器的任何示例。

    或者...

    (2) 确保您的主页只能作为 Struts2 操作访问(您可以在 Struts2 配置文件中定义默认操作)并确保您的拦截器是默认堆栈的一部分。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      我只想添加约定插件 (struts2-conventions-plugin-x.x.x.jar),其中 x.x.x 是您正在使用的版本。

      然后我将所有公共jsp移动到/WEB-INF/content下并完成。

      在您的 web.xml 中,我没有提及任何欢迎文件...但如果您想明确说明:

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

      如果使用 Struts 2.2.1,您的 web.xml 应该看起来像...

      <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <filter>
          <filter-name>action</filter-name>
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>action</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      

      如果你想以 struts.xml 的方式来做,那么只需将 index.jsp 移动到 /WEB-INF 下并为其创建一个动作映射......类似于:

          <action name="index">
              <result>/WEB-INF/index.jsp</result>
          </action>
      

      这将在具有命名空间“/”或“”的包中。

      另一方面,我已经有一段时间没有查看 Local 的内容了,但是您确定您没有重新发明轮子吗…… i18n 拦截器已经在默认堆栈中。

      看看它的用途。长话短说,每种语言都定义了语言属性文件。如果 Struts2 已确定此类属性正在使用中,那么 struts 标记将在其名称属性中的值中搜索属性文件中的匹配字符串并返回该映射条目的值。

      这一切都很顺利。抱歉,如果这是您已经在做的事情,但如果您不知道这应该可以为您节省很多时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 2013-10-22
        • 2011-09-04
        • 2012-12-18
        相关资源
        最近更新 更多