在开发应用的过程中,你很有可能会遇到配置中的模式问题,比如当包名和用来调用action的URL匹配(如/app/admin/user/add.action和/app/sales/user/edit.action),再比如当action的名字包含一个领域名字或action类中被调用的方法时(如/app/addUser.action和/app/editUser. action)。
当出现这样的模式匹配问题时,可以采用一种替代处理方法。这种方法无需显式地配置每个action,因为这样对那些大型应用来说太浪费时间,我们可以使用通配符将配置结合到单个action配置里去。可以将星号作为action名字属性的通配符,每个星号可以使用圆括号里的数字(从索引1开始)来单独进行检索。
举个例子,比如说某个Web应用的URL都包含标准的Web上下文,然后紧接一个实体对象名,最后以一个action结尾。这种模式的例子如下:/app/user/add.action、/app/user/edit.action、/app/ project/add.action和/app/project/edit.action等。该标准还规定每个实体对象都有一个action类,然后该action类又有多个方法处理与用户界面之间的交互问题(比如edit()和add()方法等)。
通过通配符的使用,这个模式可以在一个配置中为所有实体对象实现配置:
可以使用输入的URL来确定类名以及方法名。当URL是/app/user/add.action时,类名将是com.fdar.apress.s2.userAction,方法名就是add(注意URL中字符大小写与类名一致)。
通配符也可用于扩展result标签。对于/app/user/add.action这个URL,"success"结果将呈现/user/add.jsp页面,"input"结果呈现/user/edit.jsp,"home"呈现/user/home.jsp。
在action的name属性中使用通配符唯一的限制就是不能将两个星号不加分隔地放在一起。如果这样,Struts 2框架将无法知道怎样分隔action的名字。因此,需要使用一个分隔符,比如可以使用"/"(前文例子就是使用该符号)或者使用"_"符号,比如/app/user_edit.action这样的URL。
如果需要一个非分词(untokenized)的URL,我们可以使用{0}这个特殊存取器。
注意 如果你确实需要在action的名字中使用斜线,比如name="*/*",那么就需要将环境属性struts.enable.SlashesInActionNames的值设为true。