前面学过,可以在定义<action>元素的name属性的时候使用通配符,使这个<action>元素不仅仅可以匹配一个URL,还可以匹配一类URL。而action的class属性和method属性能使用通配符的值。如果使用以下<action>配置:
java代码:
查看复制到剪贴板打印
<action name="*_*" class="cn.javass.action.action.{1}Action" method="{2}"> <result name="toWelcome">/s2impl/welcome.jsp</result> </action>
在上面的配置中:
{1}与第一个*对应的匹配,{2}匹配第二个*
name属性的值中“*”代表长度不为0的任意字符串,因此,它可以响应的action只需要名称中间有一个下划线即可。
如果使用HelloWorld_create.action作为访问的action名称的话,struts.xml中action名称为HelloWorld_create,第一个通配符匹配HelloWorld,第二个通配符匹配create。因此,由cn.javass.action.action.HelloWorldAction的create方法来响应。
那么,对于<result>元素,能不能也使用<action>元素的name属性定义的通配符呢?答案是可以的,假如有如下的配置:
java代码:
查看复制到剪贴板打印
<action name="*_*_*_*" class="cn.javass.action.action.{1}Action" method="{2}"> <result name="{3}">/${folder}/{4}.jsp</result> </action>
当然,此时的Action也要做相应的变化,给Action添加一个login的方法,同样要在这个方法里面为folder赋值。示例代码如下:
java代码:
查看复制到剪贴板打印
public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; private String folder; public void setFolder(String folder){ this.folder = folder; } public String getFolder(){ return folder; } public String login(){ System.out.println("进行Login的处理"); this.folder = "s2impl"; return "toLoginOk"; } public String execute() throws Exception { this.businessExecute(); this.folder = "s2impl"; return "toWelcome"; } /** * 示例方法,表示可以执行业务逻辑处理的方法 */ public void businessExecute(){ System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } //属性对应的getter/setter方法,省略了 }
struts.xml的配置发生了变化,尤其是Action名称配置发生了变化,那么登录页面也需要相应的变化,示例代码如下:
java代码:
查看复制到剪贴板打印
<form action="/helloworld/HelloWorld_login_toLoginOk_welcome.action" method="post"> <input type="hidden" name="submitFlag" value="login"/> 账号:<input type="text" name="account"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="提交"> </form>
注意:上面配置的“HelloWorld_login_toLoginOk_welcome.action”,对应到struts.xml的时候,会被分成四个参数来匹配。其中:${1}对应HelloWorld,${2}对应login,${3}对应toLoginOk,${4}对应welcome。
去测试一下看看,是不是好用呢。其实,上面使用通配符的配置,同如下的配置是等价的,示例如下:
java代码:
查看复制到剪贴板打印
<action name="HelloWorld_login_toLoginOk_welcome" class="cn.javass.action.action.HelloWorldAction" method="login"> <result name="toLoginOk">/${folder}/welcome.jsp</result> </action>
也就是把相应的参数设置到对应的位置。