四、Struts2的多种Action类的写法和访问方式

Action类的三种写法

1.简单的Java类
没有任何继承和实现,例如:

package blog.csdn.net.mchenys;

public class HelloAction {

	/**
	 * 方法权限必须public
	 * 返回值必须String类型
	 * 方法参数必须是空参数
	 * @return 返回用于处理跳转的name
	 */
	public String helloWorld() {
		System.out.println("hello struts2");
		return null;
	}
}

对应的配置文件设置

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

<struts>

	<package name="default" namespace="/" extends="struts-default">
		<action name="hello" class="blog.csdn.net.mchenys.HelloAction" method="helloWorld"/>
	</package>
</struts>

2.实现Action接口的Java类
Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法。常量值有以下5个:

  • SUCCESS: 成功.
  • INPUT:用于数据表单校验.如果校验失败,跳转INPUT视图.
  • LOGIN: 登录.
  • ERROR:错误.
  • NONE:页面不转向.

这5个常量你可以用也可以不用,他们的字符串值就是对应的小写单词,如果要使用的话,那么就要保持和struts.xml中的result标签的name属性值对应,这样才能处理跳转结果。

package blog.csdn.net.mchenys;

import com.opensymphony.xwork2.Action;

public class Demo1 implements Action{
	
	//默认要实现的方法
	@Override
	public String execute() throws Exception {
		return null;
	}
	
	//自定义的响应方法
	public String helloWorld() {
		System.out.println("hello Demo1");
		return SUCCESS; //使用接口中预定义的字符串常量
	}
}

对应的配置文件设置

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

<struts>

	<package name="default" namespace="/" extends="struts-default">
		
		<action name="hello" class="blog.csdn.net.mchenys.Demo1" method="helloWorld">
			<!--  
				处理响应的跳转,name属性要和Demo1中的helloWorld方法的返回值一致,
				例子中的返回值是才用Action接口预定义的常量值
			-->
			<result name="success">/demo/suc.jsp</result>
		</action>
		
	</package>
</struts>

这样配置后,在浏览器上输入地址http://localhost:8080/web项目名/hello 就可以成功跳转到WebContent\demo\suc.jsp页面了,同时控制台会输出hello Demo1

3.继承ActionSupport类
这种方式是用的比较多的,ActionSupport其实是Action接口的实现类.因此Action接口中预定义的常量也是可以使用的,例如:

package blog.csdn.net.mchenys;

import com.opensymphony.xwork2.ActionSupport;

public class Demo2 extends ActionSupport{
	/**
	 * 方法权限必须public
	 * 返回值必须String类型
	 * 方法参数必须是空参数
	 * @return 返回用于处理跳转的name
	 */
	public String helloWorld() {
		System.out.println("hello struts2");
		return SUCCESS;
	}
}

然后在配置文件中添加一条Action就可以了,这里就不贴出代码了,跟方式2差不多。

Action的3种访问方式

1.传统配置
通过<action>标签中的method属性,访问到Action类中的具体的方法。
例如配置文件中的Action是这样的

<package name="book" extends="struts-default" namespace="/">
   	<action name="addBook" class="blog.csdn.net.mchenys.BookAction" method="add"></action>
   	<action name="deleteBook" class="blog.csdn.net.mchenys.BookAction" method="delete"></action>
</package>

对应的Action类的java代码如下:

package blog.csdn.net.mchenys;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 图书管理
 * @author mChenys
 *
 */
public class BookAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	public String add() {
		System.out.println("添加图书");
		return NONE; //none表示不跳转
	}

	public String delete() {
		System.out.println("删除图书");
		return NONE;
	}
}

2.通配符的访问方式
访问的路径和方法的名称必须要有某种联系,使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。
假设我的页面有以下2个请求:

<a href="${pageContext.request.contextPath}/order_add.action">添加订单</a>
<a href="${pageContext.request.contextPath}/order_delete.action">删除订单</a>

按照方式1的话,就必须要在配置文件中添加2条Action与之对应,但是有了通配符,我就可以只添加一条Action记录,例如:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="default" namespace="/" extends="struts-default">
		<!-- 
			name属性可以使用通配符*,跟名称空间组合起来的匹配路径就是/order_* 
			method属性如果要引用通配符*代表的字符串,可以使用{}来取值,下标从1开始
		-->
		<action name="order_*" class="blog.csdn.net.mchenys.OrderAction" method="{1}"/>
	</package>
</struts>

对应的Action类的java代码如下:

package blog.csdn.net.mchenys;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 订单管理
 * @author mChenys
 *
 */
public class OrderAction extends ActionSupport {
	private static final long serialVersionUID = 1L;

	public String add() {
		System.out.println("添加订单");
		return NONE;
	}

	public String delete() {
		System.out.println("删除订单");
		return NONE;
	}
}

具体理解:在JSP页面发送请求http://localhost/web项目名/order_add.action,配置文件中的order_*可以匹配该请求,就相当于变成了add,method属性的值使用{1}来代替,{1}就表示的是第一个号的位置!!所以method的值就等于了add,那么就找到Action类中的add方法,那么add方法就执行了!

3.动态方法访问的方式
有的开发中也会使用这种方式,如果想完成动态方法访问的方式,需要开启一个常量,在struts.xml中开启该常量
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
如何动态访问呢?
访问连接也需要做修改,用叹号(!)来分割请求的方法名,例如:

<a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
<a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>

其中叹号(!)后的add和delete就是Action类需要处理的方法;而叹号(!)前的product就是对应Action标签的name属性
具体的配置文件配置如下:

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

<struts>
	<!-- 需要开启动态访问属性  -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	
	<package name="default" namespace="/" extends="struts-default">
		<!-- 动态配置访问方式的method属性无需配置  -->
 		<action name="product" class="blog.csdn.net.mchenys.ProductAction"></action>
	</package>
</struts>

对应的Action类的java代码如下:

package blog.csdn.net.mchenys;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 产品管理
 * 
 * @author mChenys
 *
 */
public class ProductAction extends ActionSupport {
	private static final long serialVersionUID = 1L;

	public String add() {
		System.out.println("添加产品");
		return NONE;
	}

	public String delete() {
		System.out.println("删除产品");
		return NONE;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值