【问题标题】:Add a variable to all URLs in Struts 2将变量添加到 Struts 2 中的所有 URL
【发布时间】:2012-12-16 13:22:17
【问题描述】:

我正在开发一个网络应用程序,用户在该应用程序中选择要使用的帐户,然后他们点击的所有 URL 都指向该帐户。当前活动帐户存储在会话中,但这意味着它不包含在用户书签中,当用户会话超时时它会丢失,并且当用户共享链接时它们不包含相关帐户...

有什么方法可以在每个 URL 中包含 accountID 而无需手动将其添加到(相当大且仍在增长的)web 应用程序中的所有 URL 中?

一种方法是将其作为路径的第一部分,因此所有 URL 都类似于:

  • /123/discussions/view.do
  • /123/account/edit.do

以此类推,其中123accountID

如果所有路径都可以是相对的,那就可以了。但我还没有想出如何让这种方法与 Struts 命名空间很好地配合使用。

通常,由 Struts2 标签库生成的所有路径都以 / 开头,并且操作通配符匹配也不会在 之后 匹配命名空间。

如果我能以某种方式在路径之后命名空间部分中获得accountID,我认为我可以使用操作通配符来执行正确的操作,但困难的部分仍然是让 ID 进入首先是 URL。

最好的解决方案可能只是制作<s:a><s:form><s:url> 的自定义版本,但我不确定这有多容易。

重要

有一些答案仅涉及如何将这些 URL 映射到 Actions。

这个问题更难的部分实际上是如何将accountID 放入所有 URL 并形成路径,而无需手动将其添加到整个应用程序中的每一个。

在我看来,目前唯一的方法是为 URL 和表单制作自定义版本的 Struts JSP 标记。所以任何关于如何做到这一点的指示都会很有用。

【问题讨论】:

    标签: java jsp url struts2 wildcard


    【解决方案1】:

    查看Advanced Wildcard Mapping

    您应该像这样定义您的操作:/{accountId}/discussion/view.do/
    这是一个示例:Example

    【讨论】:

      【解决方案2】:

      您应该考虑选择使用Parameters in namespaces 的通配符映射。

      从 Struts 2.1+ 起,命名空间模式可以提取为请求参数并绑定到操作。要启用此功能,请在struts.xml 中设置以下常量:

      <constant name="struts.patternMatcher" value="namedVariable"/>
      

      有了这些,命名空间定义可以包含{PARAM_NAME} 模式,这些模式将根据请求 URL 进行评估并作为参数提取,例如:

      @Namespace{"/users/{userID}");
      public class DetailsAction exends ActionSupport {
       private Long userID;
       public void setUserID(Long userID) {...}
      }
      

      如果您运行的是 Struts2 2.1+ 之前的版本,则需要升级到最新版本。

      作为一种解决方法,您可以使用UrlRewriteFilter 执行此操作。

      您也可以查看this 答案以获取代码示例。

      【讨论】:

      • 我们有一个大型应用程序,其中包含各种命名空间中的操作。通配符(和高级通配符)似乎只允许我将变量添加到操作中,而不是命名空间。将 struts.patternMatcher 设置为“namedVariable”可以让我将变量插入命名空间......但文档警告我某些标签“可能会将文字命名空间写入 HTML(例如 /{user}/2w)而不是使用的路径在请求中(即。/brett/24)”——尽管这是我真正想要工作的部分......他们的解决方案:“这个问题可以通过直接使用带有相对路径或显式 URL 的 HTML 标记来避免。”嗯。
      • 标签有问题吗?一般来说,如果它不能 100% 起作用,我会避免这种解决方案。 namedVariable 匹配器是在 2.1.7 中引入的,最近在 2.1.9 中添加了一个更强大的新 regex 匹配器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2021-12-27
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多