框架学习:webWork框架和struts2框架的结构和分析

        在上篇博客中,我简单的介绍了我们分层开发中每一层中拥有的框架,而且介绍了我常用的框架struts1的结构和原理分析,那么今天我继续介绍我熟悉的框架struts2的框架的结构和原理分析。

       在说struts2框架之前,我要先介绍另外一个框架webwork框架,这个框架也是一个mvc的框架,这个框架的设计思路是采用拦截链将用户的请求的数据转发到Action中,并负责将Action的处理结果转换成对用户的响应。它的这种设计思路能够和ServletAPI分离,鉴于我们的上篇博客介绍的struts1的缺点,所以webwork框架解决了struts1的这个缺点。
       我们来看一下
webwork框架的结构图:

 

 

       有了这个流程图,我就不给大家讲解具体的原理流程了,它采用的是拦截链的机制,通过这些拦截链完成用户的相应请求,从而与servletAPI分离,当与servlet分离开的时候,也就是表明和容器解耦了;另外,我们从结构图中看到它的视图模版有jsp、FreeMarker等等,它的表示层技术比struts1框架的饱满许多。

       所以,webwork框架解决了struts1框架存在的问题,而且它的设计思路是非常好的,鉴于此,struts2框架就在struts1框架的基础上引入了webwork框架的设计思路应运而生了。所以我们就能够发现struts2兼具struts1的特性而且通过引入webwork框架的设计思路解决了struts1的一些缺点。

         struts2框架的大致的体系图:

      

 

        从图中我们能够看出它是引入的webwork框架的设计思路,而且它也是基于mvc的一个开源的框架。之后我们来说一下struts2框架的一个执行流程(流程图和webwork框架非常类似):

 

 

 

  1. 浏览器发送请求,通过几层过滤器完成一些功能,之后到actionmapper中,之后将请求传到核心控制器中
  2. 核心控制器filterDispatcher根据请求决定调用合适的Action
  1. 调用webwork的拦截器链自动请求通用功能,如校验之类的操作
  1. 回调action的execute方法,获取用户请求执行相应的业务逻辑
  2. 之后返回字符串,匹配result,之后跳转到相应的视图或其他的文档
  3. 之后在执行相应的拦截器链自动请求功能,随后转到web客户端。

 

       这样我们就对struts2框架的结构上的东西做了一个简单的介绍。在上篇博客讲解了struts1框架,所以有必要在这里对他俩进行一下对比(我仅仅总结了五条我认为比较重要的,以后如果发现其他的在随时补充):

 

  1. 在Action实现类方面的对比(struts1的Action继承action,struts2实现接口,也可以不实现,可以定制服务)
  2. 线程模式方面的对比(struts1存在线程安全问题,struts2不存在)
  3.  ServletAPI依赖方面的对比(struts1依赖servletAPI,struts2不是)
  4. 可测性方面的对比(struts1难测试,依赖容器,struts2不是)
  5. 封装请求参数的对比(struts1使用actionform;struts2直接写到action,并且支持pojo对象)

 

       这篇博客就介绍到这里,宏观上的学习以前一直做的不好,所以这段时间一直在解决这个学习上出现的问题,希望我的这些重构的框架学习博客能够对大家有所帮助。下节课我会继续介绍我经常使用的框架的结构和执行流程的分析,敬请关注!

推荐文章

EF code first:InvalidOperationException违反了多重性约束

EF code first:InvalidOperationException违反了多重性约束

推荐文章

我可以和HAVING子句一起使用的第一个聚合函数

我可以和HAVING子句一起使用的第一个聚合函数

推荐文章

html5幻灯片中的错误岩石网

html5幻灯片中的错误岩石网

推荐文章

母版页上的隐藏字段-在vb代码中添加ascx控件的值

母版页上的隐藏字段-在vb代码中添加ascx控件的值

推荐文章

rails3best_-in-place编辑在不刷新页面的情况下无法工作

rails3best_-in-place编辑在不刷新页面的情况下无法工作

推荐文章

Windows 7 Pro上C#TCP服务器软件的最大TCP客户端连接数

Windows 7 Pro上C#TCP服务器软件的最大TCP客户端连接数

推荐文章

怎么可能在facebook API上回复无效的电子邮件?

怎么可能在facebook API上回复无效的电子邮件?

推荐文章

对对象数组中的数据使用initWithObjects

对对象数组中的数据使用initWithObjects

推荐文章

应用程序在空中一启动就退出

应用程序在空中一启动就退出

推荐文章

使用反射更新程序集中的嵌入资源?

使用反射更新程序集中的嵌入资源?

推荐文章

linux上的mod wsgi python导入模块

linux上的mod wsgi python导入模块

推荐文章

nginx rails send_file-从服务器接收到重复的头

nginx rails send_file-从服务器接收到重复的头

推荐文章

BEGIN TRANSACTION是否执行任何类型的行/列锁定?

BEGIN TRANSACTION是否执行任何类型的行/列锁定?

推荐文章

Camel route-过滤文件名并设置头值

Camel route-过滤文件名并设置头值

推荐文章

.NET开源安全框架

.NET开源安全框架

推荐文章

我们能用构造函数和析构函数代替setup和teardown吗?

我们能用构造函数和析构函数代替setup和teardown吗?