AngularJS程序猿的常常——SpringMVC系统架构与流程回想

web开垦经历了很浓密的时刻,在境内也快有十几年的时日了。从最起首的长河级到以往的MVC经历了累累的改革和优化,本篇就注重复习精通下Spring
MVC相关的文化。

前进进度

首先等级 CGI进度响应

这一阶段,服务器比较弱,请求也很轻松,正是用户发多少个呼吁,服务器收到后新建进度,然后回到结果。
AngularJS 1
那种艺术壹看代价就十分的大,每回都新建进度,很麻烦。

第一等级 Servlet线程品级响应

Servlet结构跟上边大概,只不过每一次都只是新建三个线程,那样代价就小多数了。

Servlet的生命周期有八个品级:

1加载和实例化:运行汤姆cat那种Servlet容器,容器会依照配置文件加载Servlet类,并通过new方法实行实例化
2开始化:然后调用init()方法初阶化,每种Servlet只会开首化一回,可以领略为单例格局
3请求处理:当服务器收到请求后,接收请求的线程找到呼应的Servlet,调用service()方法响应。由此会设有五个线程同时掉用2个Servlet实例的景观,由此那里会有线程安全难点的!
四 销毁:汤姆cat关闭时,调用destroy()销毁容器。

那么全体的流水生产线是如此的:

1客户端发送请求,汤姆cat服务器收到请求后,封装HttpRequest对象和HttpResponse对象
二 依照配置文件xml去搜索相配的servlet-name,并加载对应的servlet
3假如以前从没加载过,那么加载并拓展实例化和开首化;如若加载过,则一贯调用service方法处理
4 把拍卖的结果封装到HttpResponse中回到

那么怎么着作答Serlet到底是还是不是线程安全呢?能够说它本人是无状态的,假设没有在其间自个儿新添2个什么count++的操作,就不会存在线程安全主题材料。

只要想要防止线程安全题材,能够行使下边包车型大巴思绪:

一 制止使用实例变量
2 制止使用非线程安全的成团
三 访问外部可写文件要求加锁

小结来说,那里只要注意Servlet的生命周期以及线程安全主题材料就可以。

其三品级 JSP+Model一

本条阶段引进了JSP本事,即Java Server
Page,它是一种把HTML和Java混合在一齐的技术语言。作者记得本人刚上学Java的时候,正是用那种JSP的本领,就算页面稍微复杂一点,代码就会特地杂乱。
AngularJS 2

可是那种措施也引进了壹种左右端分离开荒的通力同盟方式,即会有专门的付出静态页面包车型地铁人,开辟完后把页面交给后段程序猿,增量的开销Java相关的后端处理和数目表现相关的功力。

大致的流程是

壹 用户发送请求给服务器,服务器对应的JSP页面接收到请求。
二 JSP会被编写翻译成Servlet,形式就跟从前同一了
3最终填充数据,再次回到就可以。也正是说,它实际上就是把后面页面视图的部分和Servlet的部分融合到手拉手而已。

当今多数已经看不到那种本领形式了。

第六阶段 前后端分离+Spring MVC

今后超过3/5的形式就是这样的,只是在后段彰显上略有例外。那种格局首要的最首若是不行调节器,它负责职责的散发请求,以及数据的回来。
AngularJS 3

架构模型就如上边所示,不过在SpringMVC中,调整器有两种,一种是前者调控器,1种是行使调控器。
AngularJS 4

大致的流水生产线为:

一 用户发送请求,前端控制器统1接受
二 然后依照区别的规则分发到对应的应用调控器,比如依据UHavalL
叁 应用调节器在调用逻辑代码处理
4 最后层层重临。

眼前相像的公司,都以运用前后端分离的本领结构。
一 前端是Vue.js或许AngularJS再只怕是JQuery,通过Http的点子发送到后端。
二 后端接收请求后依据一定的政工规则处理,然后把数据再次回到给前端。
三 前端通过JavaScript代码进行分析,浏览器渲染呈现。

源码细节

经过地点的讲述,对SpringMVC的总体流程应该有了大要上的理解。可是优秀的那句话,talk
is cheap, show me your code。

这一个Dispacther分发器是怎么得以实现的呢?其实它正是3个平时的Servlet而已,只但是Servlet拦截的请求时持有的请求而已:

<servlet>  
    <servlet-name>test</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
    <servlet-name>test</servlet-name>  
    <url-pattern>/</url-pattern>  
</servlet-mapping>  

接下来那几个Servlet会调用doDispatch方法,重要的始末都在那里

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
   省略代码
   try {
      doDispatch(request, response);
   }
   finally {
      省略代码
   }
}

doDispatch方法则含有了刚刚描述的各样步骤:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
  省略
   try {
      省略
      try {
         // Determine handler for the current request.获得处理器映射
         mappedHandler = getHandler(processedRequest);
         // Determine handler adapter for the current request.获得适配器对象
         HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
         // Actually invoke the handler.实际处理
         mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
         //最后返回结果
      }
   }
}

常用的阅历

一假诺时支付Restful风格的后端程序,即通过Http以及GET、POST、PUT、DELETE等举办多少的增加和删除改查,那么能够直接动用@RestController注解

2 常常工程设计都会分为几层,Controller,Service,Mapper
即使有分支,能够用@Service@Autowired申明搭配自动注入

3若是运用@Service,最佳直接写上Service的名字,如@Service(value = "myService")要不然一旦您的名字是ABCService,暗许的瑟维斯名字大小写会轻松引发BUG,尤其是索要手动查找有个别bean时。

41般为了让代码简洁,Controller参数列表能够打包一个JavaBean类,用来机关封装参数,是用的时候会便宜得多。

相关文章