【问题标题】:Wildcard action mapping with dummy data in Struts 2Struts 2 中带有虚拟数据的通配符操作映射
【发布时间】:2011-07-25 23:00:07
【问题描述】:

我正在尝试使用通配符映射我的 Struts 操作。

之前,我使用了 Tuckey 的 UrlRewrite Filter。但是this question改变了我的想法。

所以这是我的问题:我的 URL 如下所示:

  • www.example.com/promoties/category-123
  • www.example.com/promoties/category-123/subcategory-456

在这些示例中,单词 categorysubcategory 是用于使 URL 与搜索引擎更相关的虚拟数据。

现在我想忽略这个虚拟数据,因为我只对(最后一个)ID 感兴趣。第一种情况123 最后一种情况456

我尝试了以下方法但没有成功:

<package name="promoties" namespace="/promoties" extends="struts-default">
    <action name="([0-9a-zA-Z\-_]+)-{id:([0-9]+)}$" class="CategoryAction">
        <result type="tiles">categorydetail</result>
    </action>
</package>

在我的struts.xml 中使用以下选项:

<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />

以前有人试过吗?我将如何在 Struts2 中执行此操作?

【问题讨论】:

  • 你的意思是 REST 风格吗?
  • 不,我的意思是解析 URL。不是 REST

标签: url-rewriting struts2 seo wildcard


【解决方案1】:

一种方法是使用简单的通配符映射,并将 id 组件的验证规范为 struts2 验证。这是一个经过测试但未经验证的示例。

struts.xml 您将在第二个我们看到为 category-*category-*/subcategory-* 定义的操作'将只保留第二张通配符。

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
    <constant name="struts.enable.SlashesInActionNames" value="true"/>
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
    <package namespace="" name="default" extends="struts-default">
        <action name="category-*" class="test.TestBean">
            <param name="id">{1}</param>
            <result>/WEB-INF/content/test/results.jsp</result>
        </action>
        <action name="category-*/subcategory-*" class="test.TestBean">
            <param name="id">{2}</param>
            <result>/WEB-INF/content/test/results.jsp</result>
        </action>
    </package>
</struts>

test.TestBean 在这里我使用了字符串,但在您的情况下,您将其更改为 int 或 Integer。您需要使用验证 xml 或简单地实现 com.opensymphony.xwork2.Validateable 来验证我们确实获得了一个整数。

package test;

import com.opensymphony.xwork2.ActionSupport;

public class TestBean extends ActionSupport{
    //public to avoid get/set to make example shorter
    public String id;
}

/WEB-INF/content/test/results.jsp

<%@taglib prefix="s" uri="/struts-tags"%>
<html>
    <body>
        <h1>Wild Card Value</h1>
        id: <s:property value="id"/>
    </body>
</html>

示例 1 网址:example.com/category-helloBart 产生...

通配符价值

id: helloBart

示例 2 网址:example.com/category-helloBart/subcategory-123 产生...

通配符价值

id:123

【讨论】:

  • 您好,谢谢您的回复。但是使用这种方法,我不是总是需要在我的 URL 中输入“类别”和“子类别”这两个词吗?这正是我希望 Struts2 忽略的那些词。
  • 那么按照 action name="category-*/subcategory-*" 形式,你能不使用:action name="*-*/* -*" 现在您要捕获 {4}。您还需要 action name="*-*" 并捕获 {2}。
  • 哈!几乎完美。现在它只是尝试将 'id' 值插入为字符串而不是 Long。您能否更新您的答案以供将来参考?我会接受它作为回报:)
  • 好吧,如果你还没弄明白,Struts2 类型转换非常聪明,只需更改“public String id;”即可到“公共长ID;”你应该很高兴。
猜你喜欢
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多