Struts2_04---拦截器及底层原理、自定义拦截器、标签库

一、Struts2拦截器概述


功能:在拦截器里面封装了很多struts2框架功能

struts2里有很多拦截器,每次执行默认的拦截器,不是每次都执行所用。

拦截器位置(默认): struts-core-2.3.24.jar --> struts-default.xml中的<interceptor-stack>标签
	
执行时机:在action对象创建之后,action的方法执行之前

1.2 拦截器底层原理(两个原理)

1)aop思想(Aspect Oriented Programming):面向切面编程。
	解释:不修改源代码来扩展功能。一般使用动态代理来实现。

画图分析理解:
Struts2_04---拦截器及底层原理、自定义拦截器、标签库

2)责任链模式:java多种设计模式之一
	责任链模式:
		情景理解:要执行多个操作(操作1,操作2,操作3)时,需要先完成操作1,再完成操作2,最终才能完成操作3.
	
	过滤链:一个请求被多个过滤器进行过滤时,需要依次被每个过滤器放行才能完成请求。

1.3 aop思想和责任链模式对拦截器的应用过程

aop应用:在action方法执行之前执行默认拦截器。这个执行过程使用aop思想。
解释:在action中没有直接调用拦截器方法,而是使用配置文件方式进行操作

责任链模式应用:在执行多个拦截器时,需要依次通过每个拦截器,最终执行action中方法。此过程为责任链模式

画图分析应用流程:
Struts2_04---拦截器及底层原理、自定义拦截器、标签库
Struts2_04---拦截器及底层原理、自定义拦截器、标签库

1.4 重要概念(两个区别)

1 过滤器和拦截器区别
	1)过滤器:过滤器理论上可以任意内容,比如html、jsp、servlet、图片路径
	2)拦截器:拦截器只可以拦截action

2 Servlet和action区别
	1)servlet默认第一次访问时候创建,创建一次,单实例对象
	2)action每次访问时候创建,创建多次,多实例对象

二、自定义拦截器


作用:应付实际开发中的各种需求功能,而不仅局限于已struts2封装的功能。

实现步骤:
	1)写类,继承 MethodFilterInterceptor类实现
	2)重写类中 doIntercept 方法,实现拦截逻辑
	3)让拦截器作用于action:通过配置文件方式实现。
	
自定义好处:也可让action里面某个的方法不进行拦截

通过源代码看拦截器底层结构
Struts2_04---拦截器及底层原理、自定义拦截器、标签库

2.2 配置action和拦截器关系(注册拦截器)

步骤:
	1)在要拦截的action标签所在的package标签里面声明拦截器
	2)在具体的action标签里面使用声明的拦截器
	3)struts2里面执行很多的默认拦截器,但是如果在action里面配置自定义拦截器,则默认的拦截器将不会执行。
		解决:把默认拦截器手动使用一次
	4)配置对action里面某些方法不进行拦截:

代码示例:
	<package name="demo" extends="struts-default" namespace="/">
		<!-- 1 声明拦截器 -->
		<interceptors>
			<interceptor name="拦截器类名" class="拦截器全路径(包名.类名)"></interceptor>
		</interceptors>
		
		<action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}">
		
			<!-- 2 使用自定义拦截器 -->
			<interceptor-ref name="拦截器类名">
				<!-- 配置action里面某些方法不进行拦截
					name属性值: excludeMethods
					值:action不拦截的方法名称
				 -->
				 <!-- 4 配置对action里面某些方法不进行拦截 -->
				<param name="excludeMethods">不拦截的方法名称</param>
			</interceptor-ref>
			
			<!-- 3 把默认拦截器手动使用一次 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
			
			<result name="good">/login.jsp</result>
		</action>
	</package>

三、Struts2标签库


3.1 struts2标签

注:struts2标签只能使用在jsp页面中

1) s:property: 和ognl表达式在jsp页面中获取值栈数据

2) s:iterator: 获取值栈list集合数据,表示list集合

3) s:debug: 查看值栈结构和数据

3.2 struts2中对应的html表单标签

<body>	
<!-- form标签 -->
<s:form>
	<!-- 1 普通输入项 -->
	<s:textfield name="username" label="username"></s:textfield>
	
	<!-- 2 密码输入项 -->
	<s:password name="password" label="password"></s:password>
	
	<!-- 3 单选输入项 -->
	<!-- value属性值和显示值一样的 -->
	<s:radio list="{'女','男'}" name="sex" label="性别"></s:radio>
	
	<!-- value属性值和显示值不一样的 -->
	<s:radio list="#{'nv':'女','nan':'男'}" name="sex1" label="性别"></s:radio>
	
	<!-- 4 复习输入项 -->
	<s:checkboxlist list="{'吃饭','睡觉','敲代码'}" name="love" label="爱好"></s:checkboxlist>
	
	<!-- 5 下拉输入框 -->
	<s:select list="{'幼儿园','博士后','教授'}" name="college" label="学历"></s:select>	

	<!-- 6 文件上传项 -->
	<s:file name="file" label="上传文件"></s:file>
	
	<!-- 7 隐藏项 -->
	<s:hidden name="hid" value="abcd"></s:hidden>
	
	<!--  文本域 --> 
	<s:textarea rows="10" cols="3" name="resume" label="简历"></s:textarea>
	
	<!-- 8 提交按钮 -->
	<s:submit value="提交"></s:submit>
	
	<!-- 9 重置 -->
	<s:reset value="重置"></s:reset>
</s:form>
</body>

效果图示:
Struts2_04---拦截器及底层原理、自定义拦截器、标签库