1、 在Struts2框架中,Action与Servlet实现了完全的分离,体现了Action 与Servlet API的非耦合性,也是对Struts1中的Action最大的改进(Struts1中的控制器还是Servlet核心)!
虽然,Struts2实现了Action与Servlet的解耦,但是在我们实现业务逻辑处理的时候,还是需要访问Servlet中的一些对象(request、session、application)。Struts提供了一个类,它就是AcitonContext,通过这个类可以获取Servlet中的参数。
ActionContext类是一个Action执行的上下文。Action执行时的对象都保存在这个类中。得到这个类的实例的方法如下:
ActionContext ac = ActionContext.getContext();
几个重要的方法分别是:
- Map getApplication() :得到一个application级别的Map对象;
- Map getParameter() :得到一个Map类型的所有HttpServletRequest参数;
- Map getSession() :得到一个Map类型的HttpSession的值;
- put(Object key, Object value) :向当前的ActionContext存入值;
2、 Struts2也可以直接访问Servlet,这里有IoC和非IoC两种方式;
- IoC方式
使用这个方式时需要实现相应的接口,分别为ServletRequestAware、ServletResponseAware、SessionAware。
在这三个接口中接口分别都有相应的对象的set方法,所以在实现了这些接口的Action中可以直接访问相应的requesr、session、respnse对象;
- 非IoC
在非IoC方式中,Struts2提供了ServletActionContext来获得Servlet,常用的方法如下:
getRequest()、getResponse();
3、Action动态方法的调用
实现动态方法调用也有两种方式:指定method属性和不指定method属性;
- 指定method方法
<form action="" method=""></form>
<action name="" class="" method="调用的方法"></action>
- 不指定method方法
<form action="action!method">
第一种方法只需要在struts.xml文件中配置一个action,简洁但是逻辑结构不清楚;
第二种方法要为每个方法配置一个action,增加了action数量,但是逻辑结构清楚;