action与servlet区别

在struts2.0中,可以通过ServletActionContext.getRequest()获取request对象。 
在action的方法中return一个字符串,该字符串对应struts.xml中的result标签的name相同,result标签中包含的就是跳转页面,

action与servlet区别_第1张图片

上图提供了struts2的执行流程。如下:

    1:从客户端发出请求(HTTPServletRequest)。

    2:请求经过各种过滤器(filter),注:一般情况下,如SiteMesh等其他过滤器要放在核心控制器FilterDispatcher之前,也就是web.xml中配置的filter-mapping在

 StrutsPrepareAndExecuteFilter之前.  在执行完了所有的过滤器的doFilter方法之后,核心控制器FilterDispatcher会清空ActionContext。所以, 其中ActionContextCleanUp作用是在doFilter里设置了一个计数器,使后续的filter不会清空ActionContext,最后执行完流程后由ActionContextCleanUp清空。如果没有ActionContextCleanUp,如果涉及到struts2中的如valuestack中的数据时会有可能得不到想要的数据。

    3:经过各种过滤器后,到达核心控制器FilterDispatcher,被调用后,通过struts.xml配置文件中Action标签中的映射来确定调用的Action方法,

    4:当确定了调用的Action之后会找到反射生成的指定Action的代理对象(ActionProxy),

    5:ActionProxy会通过配置文件信息找到指定的Action,

    6:然后会经过系统和自定义拦截器栈,拦截器中都有重写一个public String doIntercept(ActionInvocation invocation) throws Exception{}的方法,

拦截器中会通过判断有执行invocation.invoke()返回一个字符串,来连接到下一个拦截器或者到达执行Action。

    7:action执行完毕后,会返回一个字符串,该字符串与配置文件Action中result的name属性相对应,将处理得到的数据封装到此视图来,

    8:在依次出了拦截器栈之后,将数据响应(HttpServletResponse)到客户端。其中在经过ActionContextCleanUp时候会清空ActionContext。

 

    由上面执行流程可以看出Action与servlet不同:

    Servlet是单实例多线程的,而Action是多实例多线程的。因为多实例,所有每个请求会产生不同的Action和ActionContext对象,因此线程是安全的。同时因为Action是多实例的,所以Action中可以有成员变量,因为多实例不会公用。而Servlet是单实例多线程,所以一般情况下不会定义成员变量,因为共用同一个成员变量可能出现线程安全的问题。



其原理,我的理解是这样的: 
一.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action” 
二.请求被提交到一系列(主要是三层)的过滤器(Filter),如ActionContextCleanUp,FilterDispatcher等 
三.FilterDispatcher是控制器的核心,FilterDispatcher进行初始化并启用核心doFilter 
四.FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
五、ActionProxy通过(struts.xml)询问框架的配置文件,找到需要调用的Action类. 
六、ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器) 

ActionInvocation工作原理: 
1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。 
2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。 
3. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果

 

可以说Struts2本质还是一个Servlet(在S1中用于整体控制的是一个Servlet;S2中是一个Filter,其实也可把它看作是Servlet),只是对Servlet进一步的封装罢了

打个比方:做Web项目,好比建房子。Servlet好比木材,用一根根的木材搭,也可盖起房子,只是速度慢而已;

而Struts2好比是用木材做好的一个房子大概结构,要建房子时,只需把它拿过来,再往其里面添砖加瓦,修修补补,就能很快盖好房子,这要比直接使用Servlet要快得多

具体对比

1.开发时间。这个的对比是struts比servlet低。因为struts有一些配置文件,如果有些不注意思,出错的机会比servlet大,不如使用jsp+servlet开发随意。
2.代码的规范。因为jsp+servlet开发随意。规范性应差。控制语句到处有,为维护及修改带来不便。也使接手的人为解读代码带来不便。
3.安全性。web开发最不安全的就是session的使用.servlet的开发离不开request。有了request,那也就有了session,以前我们有个组开发,乱用session,使系统的性能很着。而且有很多保密信息外漏。如果你在serlet中封装request,那你就会发现越来越象struts。而struts的值都保存在ActionForm中,所以进行简单的封装就可以使底层人员,看不到requet,又不影响取值。
4.维护性。这个基本处于项目后期,这个的比较,就是struts远胜于servlet。只在PM控制的好。那么struts项目的代码分层很清晰。数据层,页面表示,页面控制,业务处理,这些都会分好模块。这给后期维护带来了很大的方便。因为后期的话,谁也不想引入新的BUG,如果用servlet,代码结构不清晰,很空易引入新BUG。这也是struts最强势的地方。

struts最受人指责的地方就是前期布署,开发比较费时。所以现在的方向是便捷开发易编创护框架的开发。

你可能感兴趣的:(Java,JAVA,EE)