STRUTS

 

目录

STRUTS.......................................................................................................................... 1

1.     发展.......................................................................................................................... 1

1.1.         介绍............................................................................................................ 1

1.2.         MVC............................................................................................................ 1

1.3.         Struts.......................................................................................................... 1

2.     Struts1.x................................................................................................................... 1

2.1.         介绍............................................................................................................ 1

2.2.         架构............................................................................................................ 1

3.     Struts2.x................................................................................................................... 1

3.1.         介绍............................................................................................................ 1

3.2.         架构............................................................................................................ 1

4.     Spring MVC.............................................................................................................. 1

4.1.         介绍............................................................................................................ 1

4.2.         整体流程..................................................................................................... 1

4.3.         核心流程..................................................................................................... 1

5.     数据模型................................................................................................................... 1

5.1.         Strut1.0....................................................................................................... 1

5.2.         Strut2.0....................................................................................................... 1

5.3.         SpringMVC................................................................................................... 1

6.     线程模型................................................................................................................... 1

6.1.         Servlet的线程安全问题............................................................................... 1

6.1.1.    Servlet.................................................................................................. 1

6.1.2.    Servlet的多线程机制............................................................................ 1

6.2.         Servlet衍生................................................................................................. 1

6.2.1.    Struts1................................................................................................. 1

6.2.2.    Struts2................................................................................................. 1

6.2.3.    SpringMVC............................................................................................ 1

6.3.         小结............................................................................................................ 1

7.     总结.......................................................................................................................... 1

8.     参考文献................................................................................................................... 1

 

1.  发展

 

 

1.1.   介绍

 

Java EE架构大致分为以下几个层次:

实体层(POJO层)

数据访问层(DAO层)

业务逻辑层(Service层)

控制器层(Controller层)

表现层(View层)

其中SSH框架的系统从职能上分大致可以分为四层:表示层、业务逻辑层、数据持久层和域模块层(实体层)

IMG_256

SSH构建系统的基本业务流程是:

1、在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)ActionServlet接收到的Request委派给相应的Action处理。

2、在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。

3、在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。

采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。

1.2.   MVC

 

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式最早由Trygve Reenskaug1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:

 

控制器(Controller- 负责转发请求,对请求进行处理。

视图(View - 界面设计人员进行图形界面设计。

模型(Model - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能) 

·     

 

1.3.   Struts

 

struts2001年推出的,2004年开始升温,并逐渐成为Java Web应用开发最流行的框架技术之一。在目前的Java工程师招聘要求中,通常会强调Struts框架技术。精通Struts技术已经成为Java工程师必备的技能。

 

2.  Struts1.x

2.1.   介绍

Struts1.0是早期的应用很广泛的web框架了,很多企业的管理系统和网站都是基于这个技术架构做的。Struts的第一个版本是在20015月份发布的。它的最初设想是:通过结合JSPServlet,使Web应用的视图和业务/应用逻辑得以清晰地分离开来。在Struts之前,最常见的做法是在JSP中加入业务和应用逻辑,或者在Servlet中通过println()来生成视图。。

2.2.   架构

基本流程是:

客户端发送请求(Http Request),被struts1的核心控件器ActionServlet接收。

ActionServlet根据struts-config.xml里的映射关系找到对就的Action,若找不到就返回500错误到JSP页面。若有就在Action里的 excute()方法里执行相应的逻辑操作,比如调用Model层的方法,然后通过ActionForward,跳转到对应的JSP页面。

具体图示如下:

IMG_256

详细的工作原理流程如下:

IMG_257

 

      

 

3.  Struts2.x

3.1.   介绍

Mybatis整体架构如下图:

自从第一版发布以来,Struts实际上已成为业界公认的Web应用标准。Struts2.0是对1.0的改进。更完美的提现了MVC的强大之处。它是在Struts1.0的成功经验基础上继续坚持对 前端控制器(Front Controller MVCmodel-view-controller)模式 进行改进。

3.2.   架构

 

先来看看Struts官方站点,对于Struts2.0的架构介绍:

IMG_256

一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:apache/struts):

1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin

3 接着FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4 如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

在上述过程中所有的对象(ActionResultsInterceptors,等)都是通过ObjectFactory来创建的。

 

 

4.  Spring MVC

4.1.   介绍 

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。SpringMVC是一种web层的mvc框架,用于替代servlet(处理响应请求,获取表单参数,表单验证等)

4.2.   整体流程

 

 

IMG_256

具体步骤:

首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 12 步骤;

页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 345 步骤;

前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 67

前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。

4.3.   核心流程

IMG_257

具体步骤:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

第三步:处理器映射器HandlerMapping向前端控制器返回HandlerHandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView ModelAndViewspringmvc框架的一个底层对象,包括 Modelview

第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染 (视图渲染将模型数据(ModelAndView对象中)填充到request域)

第十一步:前端控制器向用户响应结果

 

5.  数据模型

5.1.   Strut1.0

Controller:基于ActionServlet,通过强依赖

Model:依赖ActionForm

ViewJSP生成动态网页

5.2.   Strut2.0

Model:在struts2,模型分为数据和业务逻辑模型,模型是由Action组件实现

View:视图是由JspVelocity模块板、FreeMark模板,还有其它的一些表现层组件实现.

 

Controller:控制器是由FilterDispatcher(struts2.0版本,部分版本基于ActionContextCleanUp的过滤器),通过ActionProxy进行modelview解耦

5.3.   SpringMVC

Controller:基于DispatcherServlet,查询一个或多个HandlerMapping,找到处理请求的Controller.方法级别拦截处理。

ModelDispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象.

View:视图对象负责渲染返回给客户端。

 

 

6.  线程模型

6.1.   Servlet的线程安全问题

6.1.1.    Servlet

Servlet/JSP技术和ASPPHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。

6.1.2.    Servlet的多线程机制

Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet 时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该 Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行,如下图所示。

 

6.2.   Servlet衍生

6.2.1.    Struts1

首先,明确一点Sturts1 action是单例模式,线程是不安全的。Struts1使用的ActionServlet是单例的,既然是单例,当使用实例变量的时候就会有线程安全的问题。所有一般在开发中试禁止使用实例变量的。

6.2.2.    Struts2

struts2使用的是actionContext,都是使用里面的实例变量,让struts2自动匹配成对象的。每次处理一个请求,struts2就会实例化一个对象,这样就不会有线程安全的问题了。

需要注意的是,如果struts2+spring来管理注入的时候,不要把Action设置成单例,否则会出问题的。当然现在很少有项目使用struts2了。

6.2.3.    SpringMVC

SpringMVCcontroller默认是单例模式的,所以也会有多线程并发的问题。

6.3.   小结

servlet Struts1 SpringMvc 是线程不安全的,当然如果你不使用实例变量也就不存在线程安全的问题了。

Struts2 是线程安全的,当然前提情况是,Action 不交给 spring管理,并且不设置为单例。

SpringMvc Bean 可以设置成多例变成线程安全,但是一定程度上回影响系统性能。

 

7.  总结

 

Struts1.0通过固定模式,单实例的方式处理ActionServletActionFormJSP

Struts2通过拦截器模式,实例对象方式处理Actionpojo,页面;

SpringMVC通过hander与适配器模式,方法级别的细粒度处理Controller,并且自动化映射ModelAndView

 

8.  参考文献

 

Struts发展历史

http://t.zoukankan.com/aaaazzzz-p-13472221.html

 

Servlet线程安全

https://blog.csdn.net/weixin_30305735/article/details/97839450