首页 > 技术文章 > 4.struts2中Action的三种访问方式

syj1993 2018-03-05 13:30 原文

**Action的访问(重点)**
	
	1.通过<action>标签中的method属性,访问到Action中的具体的方法。
		* 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等!
		* 具体的实例如下:
			* 页面代码
				* <a href="${pageContext.request.contextPath}/addBook.action">添加图书</a>
				* <a href="${pageContext.request.contextPath}/deleteBook.action">删除图书</a>
			
			* 配置文件的代码
				<package name="demo2" extends="struts-default" namespace="/">
			    	<action name="addBook" class="cn.itcast.demo2.BookAction" method="add"></action>
			    	<action name="deleteBook" class="cn.itcast.demo2.BookAction" method="delete"></action>
			    </package>
			
			* Action的代码
				public String add(){
					System.out.println("添加图书");
					return NONE;
				}
				public String delete(){
					System.out.println("删除图书");
					return NONE;
				}
	
	2.通配符的访问方式:(访问的路径和方法的名称必须要有某种联系.)	通配符就是 * 代表任意的字符
		* 使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。
		* 具体实例如下:
			* 页面代码
				<a href="${pageContext.request.contextPath}/order_add.action">添加订单</a>
				<a href="${pageContext.request.contextPath}/order_delete.action">删除订单</a>
			
			* 配置文件代码
				* <action name="order_*" class="cn.itcast.demo2.OrderAction" method="{1}"></action>
				
			* Action的代码
				public String add(){
					System.out.println("添加订单");
					return NONE;
				}
				public String delete(){
					System.out.println("删除订单");
					return NONE;
				}
			
		* 具体理解:在JSP页面发送请求,http://localhost/struts2_01/order_add.action,配置文件中的order_*可以匹配该请求,*就相当于变成了add,method属性的值使用{1}来代替,{1}就表示的是第一个*号的位置!!所以method的值就等于了add,那么就找到Action类中的add方法,那么add方法就执行了!
	
	3.通配符更抽象的写法(了解即可)
		* 具体的实例如下:
			* 页面的代码
				* <a href="${pageContext.request.contextPath}/OrderAction_add.action">添加订单</a>
				
			* 配置文件代码
				* <action name="*_*" class="cn.itcast.demo2.{1}" method="{2}"></action>
				
			* Action的代码
				public class OrderAction extends ActionSupport{
					public String add(){
						System.out.println("添加订单");
						return NONE;
					}
				}
	
	4.动态方法访问的方式(有的开发中也会使用这种方式)
		* 如果想完成动态方法访问的方式,需要开启一个常量,struts.enable.DynamicMethodInvocation = false,把值设置成true。
			* 注意:不同的Struts2框架的版本,该常量的值不一定是true或者false,需要自己来看一下。如果是false,需要自己开启。
			* 在struts.xml中开启该常量。
				* <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
		
		* 具体代码如下
			* 页面的代码
				* <a href="${pageContext.request.contextPath}/product!add.action">添加商品</a>
				* <a href="${pageContext.request.contextPath}/product!delete.action">删除商品</a>
				
			* 配置文件代码
				* <action name="product" class="cn.itcast.demo2.ProductAction"></action>
				
			* Action的类的代码
				public class ProductAction extends ActionSupport{
					public String add(){
						System.out.println("添加订单");
						return NONE;
					}
					public String delete(){
						System.out.println("删除订单");
						return NONE;
					}
				}
	
	5.总结:怎么样访问Action
		* 传统的方式
			* 编写一个请求,需要提供一个配置文件
	
		* 通配符的方式
			* 编写请求和Action类中的方法需要有一定的联系
			* 需要使用 * 号作为占位符出现,匹配任意的字符

		* 动态方法访问的方式
			* 先开启动态方法访问的常量	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
			* 发送请求的时候,请求路径!方法的名称

demo3.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>传统的配置文件的方式</h3>
<a href="${pageContext.request.contextPath }/addBook.action">添加图书</a>
<a href="${pageContext.request.contextPath }/deleteBook.action">删除图书</a>

<h3>通配符的方式</h3>
<a href="${pageContext.request.contextPath}/order_add.action">添加订单</a>
<a href="${pageContext.request.contextPath}/order_delete.action">删除订单</a>
<a href="${pageContext.request.contextPath}/order_update.action">修改订单</a>

<h3>抽象通配符的方式</h3>
<a href="${pageContext.request.contextPath}/UserAction_add.action">添加用户</a>
</body>
</html>

struts_demo3.xml:

<?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="demo3" extends="struts-default" namespace="/">
		<!-- 基本的配置文件的方式 -->
		<action name="addBook" class="demo3.BookAction" method="add"></action>
		<action name="deleteBook" class="demo3.BookAction" method="delete"></action>
		
		<!-- 配置通配符的方式 -->
		<action name="order_*" class="demo3.OrderAction" method="{1}"></action>
		
		<!-- 抽象的通配符的方式 -->
		<action name="*_*" class="demo3.{1}" method="{2}"> </action>
		
		<!-- 动态方法访问的方式  说明:没有配置method属性-->
		<action name="product" calsss="demo3.ProductAction"></action>
	</package>

  

推荐阅读