5.4.1 使用通配符
前面学过,可以在定义<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>
也就是把相应的参数设置到对应的位置。