Struts2通配符动作映射与虚拟数据

时间:2011-03-30 09:19:21

标签: seo url-rewriting struts2

我正在尝试使用通配符映射我的struts操作。在此之前,我使用了Tuckey的UrlRewrite Filter。但this thread改变了主意。

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

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

在这些示例中,单词“category”和“subcategory”是伪数据。用于使URL与搜索引擎更相关。

现在我想忽略这个虚拟数据,因为我只对(最后一个)ID感兴趣。在第一种情况下 123 在最后一种情况 456 。 我将如何在Struts2中执行此操作? 我尝试了以下但没有成功:

<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配置中使用以下选项:

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

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

1 个答案:

答案 0 :(得分:3)

一种方法是使用简单的通配符映射并将id组件的验证调整为struts2验证。这是一个经过测试的例子,但没有经过验证。

struts.xml 您会看到为类别定义的操作 - * 类别 - * / 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 这里我使用了一个String,但在你的情况下,你将把它改为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