Java 向Struts 2中的所有URL添加一个变量

Java 向Struts 2中的所有URL添加一个变量,java,jsp,url,struts2,wildcard,Java,Jsp,Url,Struts2,Wildcard,我正在开发一个webapp,用户在其中选择一个要使用的帐户,然后他们单击的所有URL都指向该帐户。当前活动帐户存储在会话中,但这意味着它不包括在用户书签中,当用户会话超时时,它将丢失,当用户共享链接时,它们不包括相关帐户 是否有任何方法可以在每个URL中包含accountID,而无需手动将其添加到(相当大且仍在增长的)webapp中的所有URL? 一种方法是将其作为路径的第一部分,因此所有URL都类似于: /123/discussions/view.do /123/account/edit.d

我正在开发一个webapp,用户在其中选择一个要使用的帐户,然后他们单击的所有URL都指向该帐户。当前活动帐户存储在会话中,但这意味着它不包括在用户书签中,当用户会话超时时,它将丢失,当用户共享链接时,它们不包括相关帐户

是否有任何方法可以在每个URL中包含
accountID
,而无需手动将其添加到(相当大且仍在增长的)webapp中的所有URL?

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

  • /123/discussions/view.do
  • /123/account/edit.do
以此类推,其中
123
accountID

如果所有路径都是相对的,那就行了。但我还没有弄明白如何让这种方法很好地使用Struts名称空间

通常,Struts2标记库生成的所有路径都以
/
开头,操作通配符匹配也不会在名称空间匹配后生效

如果我能以某种方式在名称空间部分之后的路径中获得
accountID
,我想我可以使用操作通配符来执行正确的操作,但最困难的部分仍然是首先将ID放入url中

最好的解决方案可能只是制作
的自定义版本,但我不确定这有多容易

重要

有一些答案只涉及如何将这些URL映射到
Action
s

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


目前,在我看来,唯一的方法是为URL和表单定制Struts JSP标记版本。因此,关于如何实现这一点的任何指针都是有用的。

您应该考虑使用通配符映射的选择。 Struts 2.1+命名空间模式可以提取为请求参数并绑定到操作。要启用此功能,请在

struts.xml
中设置以下常量:

<constant name="struts.patternMatcher" value="namedVariable"/>
如果您运行的是Struts2 2.1+之前的版本,则需要升级到最新版本

作为一种解决方法,您可以使用

您还可以查看答案中的代码示例。

签出

您应该这样定义您的操作:
/{accountId}/discussion/view.do/


下面是一个例子:

我们有一个大型应用程序,在各种名称空间中执行操作。通配符(和高级通配符)似乎只允许我将变量添加到操作中,而不是名称空间中。将struts.patternMatcher设置为“namedVariable”将允许我在名称空间中插入变量。。。但是文档警告我,一些标记“可能会将文本名称空间写入HTML(例如/{user}/2w),而不是请求中使用的路径(即/brett/24)”--这是我真正想做的部分,尽管。。。他们的解决方案:“这个问题可以通过直接使用带有相对路径或显式URL的HTML标记来避免。”嗯,你对标记有什么问题吗?一般来说,我会避免这样的解决方案,如果它不工作100%
namedVariable
matcher在2.1.7中引入,最近在2.1.9中添加了一个新的
regex
matcher,它更强大。
@Namespace{"/users/{userID}");
public class DetailsAction exends ActionSupport {
 private Long userID;
 public void setUserID(Long userID) {...}
}