struts执行过程和拦截器
1 struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面
2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器
3 struts2里面默认拦截器位置
4 拦截器在什么时候执行?
(1)在action对象创建之后,action的方法执行之前
1 拦截器底层使用两个原理
第一个 aop思想
(0)后面在spring里面把aop做更深层次分析
(1)文字描述:
aop是面向切面(方面)编程,有基本功能,扩展功能,不通过修改源代码方式扩展功能
(2)画图分析:
第二个 责任链模式
(1)在java中有很多的设计模式,责任链模式是其中的一种
(2)责任链模式和过滤链很相似的
责任链模式:
要执行多个操作,有添加、修改、删除三个操作。
首先执行添加操作,添加操作执行之后 做类似于放行操作,执行修改操作,修改操作执行之后做类似于放行操作,执行删除操作
过滤链:一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器
2 aop思想和责任链模式如何应用到拦截器里面?
- 拦截器在action对象创建之后,action的方法执行之前执行
- 在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作
- 在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式
-- 假如执行三个拦截器,执行拦截器1,执行拦截器1之后做放行操作,执行拦截器2,执行拦截器2之后做放行,执行拦截器3,执行拦截器3之后放行,执行action的方法
(2)画图分析
<?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.ui.theme" value="simple"/>
<constant name="struts.devmode" value="true" />
<constant name="struts.i18n.encoding" value="utf-8" />
<package name="default" namespace="/" extends="struts-default">
<!-- 全局结果页面 -->
<global-results>
<result name="sysexception">/web-inf/pages/error.jsp</result>
<result name="error">/web-inf/pages/error.jsp</result>
</global-results>
<!-- 全局异常处理 -->
<global-exception-mappings>
<exception-mapping result="sysexception" exception="com.my.qb.exception.sysexception"/>
<exception-mapping result="error" exception="java.lang.exception"/>
</global-exception-mappings>
<action name="login" method="login" class="loginaction">
<result name="login">/web-inf/pages/sysadmin/login/login.jsp</result>
<result name="success">/web-inf/pages/home/fmain.jsp</result>
</action>
<action name="logout" method="logout" class="loginaction">
<result name="logout">/web-inf/pages/sysadmin/login/logout.jsp</result>
<action name="homeaction_*" method="{1}" class="homeaction">
<result name="fmain">/web-inf/pages/home/fmain.jsp</result>
<result name="title">/web-inf/pages/home/title.jsp</result>
<result name="toleft">/web-inf/pages/${modulename}/left.jsp</result>
<result name="tomain">/web-inf/pages/${modulename}/main.jsp</result>
type属性
01.默认值,做转发,dispathcher
02.做定向操作,redirect
重定向到action:redirectaction
转发到action:chain-----一般不用,因为有缓存问题
<result name="alist" type="redirectaction">contractaction_list</result>
</package>
<include file="struts2/struts-sysadmin.xml"></include>
<include file="struts2/struts-cargo.xml"></include>
</struts>
属性封装:将数据封装在属性中,不能直接封装在实体类对象中。
模型驱动封装:只能将数据封装在同一个实体类对象中。
表达式封装:可以将数据封装到不同的实体类对象中。
servlet:默认在第一次访问时创建,创建一次,单实例对象。
action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象。
值栈是struts2提供本身一种存储机制,类似域对象,是值栈,可以存值和取值。
值栈存储位置
每次访问action的时候,都会创建action对象;在每个action对象里面都会有一个值栈对象。
在值栈中的数据是后进先出。
值栈的内部结构:
01.第一部分是root,结构是list集合;一般操作都是root里面的数据。
02.第二部分是context,结构是map集合。
向值栈存放数据:
当对象放入栈顶的时候,用push;当集合要放入栈顶的时候,用put;
/**
* 将对象放入值栈栈顶
* @param obj
*/
public void push(object obj){
actioncontext.getcontext().getvaluestack().push(obj);
}
* 将集合放入值栈中,使用key-value
* @param key
* @param value
public void put(string key,object value){
actioncontext.getcontext().put(key, value);