3

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

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

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

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

等等,在123哪里accountID

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

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

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

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

重要的

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

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

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

4

2 回答 2

0

查看高级通配符映射

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

于 2013-01-02T14:31:47.630 回答
0

您应该考虑在通配符映射的命名空间中使用参数的选择。

从 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执行此操作。

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

于 2013-01-02T11:18:54.217 回答