天天看点

struts

struts执行过程和拦截器

struts

1 struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面

2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器

3 struts2里面默认拦截器位置

struts

4 拦截器在什么时候执行?

(1)在action对象创建之后,action的方法执行之前

1 拦截器底层使用两个原理

第一个 aop思想

(0)后面在spring里面把aop做更深层次分析

(1)文字描述:

aop是面向切面(方面)编程,有基本功能,扩展功能,不通过修改源代码方式扩展功能

(2)画图分析:

struts

第二个 责任链模式

(1)在java中有很多的设计模式,责任链模式是其中的一种

(2)责任链模式和过滤链很相似的

责任链模式:

 要执行多个操作,有添加、修改、删除三个操作。

首先执行添加操作,添加操作执行之后 做类似于放行操作,执行修改操作,修改操作执行之后做类似于放行操作,执行删除操作

过滤链:一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器

struts

2 aop思想和责任链模式如何应用到拦截器里面?

- 拦截器在action对象创建之后,action的方法执行之前执行

- 在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作

- 在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式

-- 假如执行三个拦截器,执行拦截器1,执行拦截器1之后做放行操作,执行拦截器2,执行拦截器2之后做放行,执行拦截器3,执行拦截器3之后放行,执行action的方法

(2)画图分析

struts

<?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);

继续阅读