一、执行流程
二、配置文件加载顺序
- default.properties struts2-core-2.3.15.3.jar\org\apache\struts2 不能修改
- struts-default.xml struts2-core-2.3.15.3.jar 不能修改
- struts-plugin.xml 在struts2提供的插件jar包中 不能修改
- struts.xml 我们的应用中 我们修改的:推荐
- struts.properties 我们的应用中 我们修改的
- web.xml 我们的应用中 我们修改的,可以给过滤器配置参数
三、action类的三种 创建方式
第一种:无侵入式创建(实际开发中基本不用)
/**
* 我们的第一个动作类
* 动作类的第一种创建方式:
* 无侵入式的创建。
*/
public class HelloAction {
/**
* @return
*/
public String sayHello(){
System.out.println(this);
System.out.println("HelloAction中的sayHello方法执行了。。。。");
return "success";
}
}
<action name="hello" class="wb.web.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
第二种:实现Action接口的定义方式 (实际开发中用的也不多)
/**
* 动作类的第二种创建方式:
* 实现Action接口
*/
public class Hello2Action implements Action{
@Override
public String execute() throws Exception {
System.out.println("Hello2Action的execute方法执行了............");
return ERROR;
}
}
默认的动作方法是:execute(),所以可以不指定method属性
<action name="hello2" class="com.itheima.web.action.Hello2Action">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
Action接口中的常量
SUCCESS:一般多用于成功
ERROR:一般多用于动作方法执行失败
LOGIN:一般多用于返回登录页面
NONE:一般用于不返回任何结果视图,和return null作用是一样的
INPUT:一般多用于数据回显,也是struts2中数据回显时的默认返回值。
第三种:继承ActionSupport (实际开发中采用的方式)
/**
* 动作类的第三种创建方式:
* 继承ActionSupport
*/
public class Hello3Action extends ActionSupport{
}
<action name="hello3" class="com.itheima.web.action.Hello3Action">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
四、访问Servlet的API的两种方式
1、使用ServletActionContext
* static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象。
* static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象。
* static ServletContext getServletContext():获取Web应用的ServletContext对象。
* static PageContext getPageContext():获取Web应用的PageContext对象。
2、通过实现接口的方式
- ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例。
- ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例。
- SessionAware:实现该接口的Action可以直接访问Web应用的HttpSession实例。
- ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。
五、ContextMap概述
它是OGNL上下文对象,是struts2中封装数据最大的对象。我们一次请求中所有用到的信息都可以在它里面找到。它是一个Map结构的对象,其中key是字符串,value是一个Object。
1、ActionContext
ActionContext就相当于对ContextMap进行了一次再封装,是对ContextMap进行操作的,而ContextMap中封了我们一次请求的所有数据,所以它的创建应该是每次请求访问Action时,即核心控制器(StrutsPrepareAndExecuteFilter)的doFilter方法执行时。
2、ValueStack
ValueStack是Struts的一个接口,字面意义为值栈,OgnlValueStack是ValueStack的实现类,客户端发起一个请求struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个 Action 的生命周期。它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器。它的封装是由struts2框架完成的。
六、拦截器
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者在定义的action执行的前后加入执行的代码,也可以在一个action执行前阻止其执行。也就是说它提供了一种可以提取action中可重代码,统一管理和执行的方式。
拦截器链 (Interceptor Chain),在Struts 2中称为拦截器栈Interceptor Stack, 在不修改源码的基础上,已有的方法进行动态增强。
在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构。
执行原理:
①接口中的init()方法,在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化;
②每拦截一个请求,intercept()方法就会被调用一次;
③destory()方法将在拦截器销毁之前被调用。
实现拦截器的三种方式:
①定义一个类,实现Interceptor接口
②定义一个类,继承AbstractInterceptor
③定义一个类,继承MethodFilterInterceptor