Сопоставление действий Struts2 Wildcard с фиктивными данными
Я пытаюсь отобразить свои действия с использованием групповых символов. Раньше я использовал UrlRewrite Filter от Tuckey. Но эта тема изменила мое мнение.
Итак, вот моя проблема: мой URL выглядит следующим образом:
- www.example.com/promoties/category-123
- www.example.com/promoties/category-123/subcategory-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 ответ
Одним из способов является использование простого сопоставления с подстановочными знаками и регулирование валидации компонента 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 здесь я использовал 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/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 URL: example.com/category-helloBart создает...
Значение Wild Card
id: helloBart
Пример 2 URL: example.com/category-helloBart/subcategory-123 создает...
Значение Wild Card
id: 123