struts2中运用通配符(边学边记)

struts2中通配符的使用,是在配置<ation.../>元素时,需要制定name、class和method属性,其中name属性可支持通配符,然后可以在class,method属性中使用表达式。这种使用通配符的方式形式上是一种动态方法调用。在配置Action时,可在action元素的name属性中使用星号(*)来匹配任意的字符串,表示0或多个字符串;同时method属性使用表达式{1}来一一对应。

下面是在实现用户登录和注册时的简要代码:

package com.jbit.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

private static final long serialVersionUID = 1L;

private String uname;
private String rname;
public String getRname() {
return rname;
}
public void setRname(String rname) {
this.rname = rname;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
//用户登录
@SuppressWarnings("unused")
public String login(){
System.out.println("进入登录method");
System.out.println(this.uname+"登录名");
if(!uname.equals("")){
return SUCCESS;
}else if(uname.equals("")){
return INPUT;
}else{
return ERROR;
}


}

//用户注册
@SuppressWarnings("unused")
public String register(){
if(!rname.equals("")){
return SUCCESS;
}else if(rname.equals("")){
return INPUT;
}else{
return ERROR;
}


}

}

其中struts.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

<constant name="struts.devMode" value="true" />

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="default" namespace="/" extends="struts-default">

<action name="*User" class="com.jbit.action.UserAction" method="{1}">

   <result name="success">/page/{1}_success.jsp</result>
   <result name="input">/page/{1}User.jsp</result>
   <result name="error">/page/error.jsp</result>
</action>
</package>

</struts>

在Action中如果不慎把方法定义为private ,外部也是无法调用的。同时多个不同action和不同方法如下面列子:

当然,这里只有一个"*".你可以有两个,甚至三个四个..比如这样写 *_* 这样就是两个"*" .那么我们也可以用{1},{2}来分别的表示他们.

(2) 对应的action 内容

package com.test.action;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UserAction extends ActionSupport
{
public String add()
{
return SUCCESS;
}
public String delete()
{
return SUCCESS;
}
public String update()
{
return SUCCESS;
}
public String select()
{
return SUCCESS;
}
}

如struts中配有如下几个action,ManagerUserAction中有与之对应的方法
<actionname="addUser"class="com.netshuai.action.ManagerUserAction"method="add">
<resultname="success">/addUser.jsp</result>
</action>
<actionname="delUser"class="com.netshuai.action.ManagerUserAction"method="del">
<resultname="success">/delUser.jsp</result>
</action>
<actionname="updateUser"class="com.netshuai.action.ManagerUserAction"method="update">
<resultname="success">/updateUser.jsp</result>
</action>

如果使用通配符,可以省略写成一个action

<actionname="*User"class="com.netshuai.action.ManagerUserAction"method="{1}">
<resultname="success">/{1}User.jsp</result>
</action>

其中,*为通配符,{1}为*所替换的内容,如用户访问的是addUser.action,则*就被自动替换为add,{1}处也自动使用add替换。 若开发时使用统一的命名规范,则所有action可使用类似如下的一条替换即可

<actionname="*_*"class="com.netshuai.action.{1}Action"method="{2}">
<resultname="success">/{2}_{1}Success.jsp</result>
</action>

如上所示,所有文件都采用统一的命名规范,第一个*为分类名称,第二个*为操作名,{1}和{2}分别代表第一个和第二个*的替换值,所有action实现类都命名为分类名称+Action。
如分类名称为User,操作名为add,则访问的action名为User_add.action,action实现类名为UserAction,返回页面的名为add_UserSuccess.jsp
另:{0}代表显示所有通配符内容,如<resultname="success">/{2}_{1}Success.jsp</result>改为<resultname="success">/{0}Success.jsp</result>,则返回的名为User_addSuccess.jsp

原文地址:https://www.cnblogs.com/cmdl/p/2947897.html