Сопоставление действий Struts2 Wildcard с фиктивными данными - PullRequest
2 голосов
/ 30 марта 2011

Я пытаюсь отобразить свои действия в стойках, используя подстановочные знаки. Раньше я использовал фильтр UrlRewrite от Tuckey. Но эта тема передумала.

Итак, вот моя проблема: мой URL выглядит следующим образом:

  • www.example.com / promoties / категория-123
  • www.example.com / promoties / категория-123 / подкатегория-456

В этих примерах слова «категория» и «подкатегория» являются фиктивными данными. Используется для повышения релевантности URL для поисковых систем.

Теперь я хотел бы игнорировать эти фиктивные данные, так как меня просто интересует (последний) идентификатор. В первом случае 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 Ответ

3 голосов
/ 31 марта 2011

Один из способов - использовать простое сопоставление с подстановочными знаками и регулировать валидацию компонента id для валидации struts2. Вот пример, который был протестирован, но без проверки.

struts.xml вы увидите действие, определенное для категории - * и категории - * / подкатегория - * во втором мы просто оставь второй подстановочный знак.

<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 validation или просто реализуя 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 / содержание / тест / results.jsp

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

Пример 1 URL: example.com/category-helloBart создает ...

Значение подстановочного знака

id: helloBart

Пример 2 URL: example.com/category-helloBart/subcategory-123 производит ...

Значение Wild Card

id: 123

...