struts

struts执行过程和拦截器

Struts2执行过程

struts

 

Struts2拦截器概述

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思想和责任链模式如何应用到拦截器里面?

(1)文字描述:

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

 

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

 

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

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

 

(2)画图分析

struts 

 

 

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

 

重定向到actionredirectAction

转发到actionchain-----一般不用,因为有缓存问题

 

<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.servletaction区别

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(keyvalue);

}

 



本文转自 叫我北北 51CTO博客,原文链接:http://blog.51cto.com/qinbin/1950532