Один из способов - использовать простое сопоставление с подстановочными знаками и регулировать валидацию компонента 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