struts
struts执行过程和拦截器
Struts2执行过程
Struts2拦截器概述
1 struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面
2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器
3 struts2里面默认拦截器位置
4 拦截器在什么时候执行? (1)在action对象创建之后,action的方法执行之前 |
拦截器底层原理
1 拦截器底层使用两个原理 第一个 aop思想 (0)后面在spring里面把aop做更深层次分析 (1)文字描述: Aop是面向切面(方面)编程,有基本功能,扩展功能,不通过修改源代码方式扩展功能 (2)画图分析:
第二个 责任链模式 (1)在java中有很多的设计模式,责任链模式是其中的一种 (2)责任链模式和过滤链很相似的 责任链模式: 要执行多个操作,有添加、修改、删除三个操作。 首先执行添加操作,添加操作执行之后 做类似于放行操作,执行修改操作,修改操作执行之后做类似于放行操作,执行删除操作 过滤链:一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器
2 aop思想和责任链模式如何应用到拦截器里面? (1)文字描述: - 拦截器在action对象创建之后,action的方法执行之前执行
- 在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作
- 在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式 -- 假如执行三个拦截器,执行拦截器1,执行拦截器1之后做放行操作,执行拦截器2,执行拦截器2之后做放行,执行拦截器3,执行拦截器3之后放行,执行action的方法
(2)画图分析
|
02.struts2配置文件
<?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> <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> </action> 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> |
03.struts2封装获取表单数据
属性封装:将数据封装在属性中,不能直接封装在实体类对象中。
模型驱动封装:只能将数据封装在同一个实体类对象中。
表达式封装:可以将数据封装到不同的实体类对象中。
04.servlet和action区别
Servlet:默认在第一次访问时创建,创建一次,单实例对象。
Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象。
05.值栈
值栈是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); } |