程序猿的普通——SpringMVC系统架构和流程回顾

web开发经历了好遥远的工夫,在境内为快生十几年的光阴了。从太初步之进程级到今日的MVC经历了成百上千之精益求精和优化,本篇就重要复习了解下Spring
MVC相关的文化。

发展进程

第一阶段 CGI进程响应

顿时同样等,服务器比较弱,请求也够呛粗略,就是用户发一个请,服务器收到后新建进程,然后返回结果。
图片 1
这种措施同看代价就是颇特别,每次都新建进程,很烦。

仲阶段 Servlet线程级别响应

Servlet结构及方差不多,只不过每次都只是是新建一个线程,这样代价就是有点群了。

Servlet的生命周期有四独阶段:

1
加载与实例化:启动Tomcat这种Servlet容器,容器会根据部署文件加载Servlet类,并经过new方法进行实例化
2
初始化:然后调用init()方法初始化,每个Servlet只见面初始化一破,可以知道也单例模式
3
请求处理:当服务器收到请求后,接收请求的线程找到相应之Servlet,调用service()方法响应。因此会在多只线程同时掉用一个Servlet实例的情事,因此此会见生线程安全问题的!
4 销毁:Tomcat关闭时,调用destroy()销毁容器。

那么整体的流水线是这么的:

1
客户端发送请求,Tomcat服务器收到请求后,封装HttpRequest对象以及HttpResponse对象
2 根据部署文件xml去找寻匹配的servlet-name,并加载对应之servlet
3
如果前未曾加载了,那么加载并拓展实例化和初始化;如果加载了,则直调用service方法处理
4 把拍卖的结果封装到HttpResponse中回到

那如何回复Serlet到底是匪是线程安全吧?可以说它自身是任状态的,如果没当里边自己新增一个什么count++的操作,就非会见在线程安全题材。

假定想如果避免线程安全题材,可以使用下面的思绪:

1 避免采取实例变量
2 避免使用非线程安全之成团
3 访问外部可写文件要加锁

总结来说,这里而注意Servlet的生命周期以及线程安全问题即可。

老三阶段 JSP+Model1

斯等级引入了JSP技术,即Java Server
Page,它是一样种植将HTML和Java混合在一起的技术语言。我记忆自己正好上学Java的早晚,就是之所以这种JSP的艺,如果页面稍微复杂一点,代码就会特别凌乱。
图片 2

然这种措施为引入了一致栽左右端分离开之通力合作模式,即会发生特意的开销静态页面的食指,开发完后拿页面交给后段程序猿,增量的支出Java相关的后端处理与数码显现相关的机能。

大体的流程是

1 用户发送请求于服务器,服务器对应之JSP页面接收至要。
2 JSP会被编译成Servlet,模式就是同之前同一了
3
最后填充数据,返回即可。也就是说,它实在就是是拿前页面视图的有的和Servlet的有融合到一起而已。

如今大抵都看不到这种技能模式了。

季品级 前后端分离+Spring MVC

今多数底模式就是是这般的,只是以后段展现上小有差。这种模式要的要害是怪控制器,它担负任务的散发请求,以及数额的回来。
图片 3

搭模型就如上面所示,不过当SpringMVC中,控制器有些许栽,一栽是前者控制器,一种植是利用控制器。
图片 4

大约的流程也:

1 用户发送请求,前端控制器统一接受
2 然后基于不同之条条框框分发及对应之动控制器,比如根据URL
3 应用控制器在调用逻辑代码处理
4 最后层层返回。

此时此刻相似的店,都是采取前后端分离之技巧结构。
1 前端是Vue.js或者AngularJS再要是JQuery,通过Http的法门发送到后端。
2 后端接收请求后照一定之业务规则处理,然后把数量返回给前端。
3 前端通过JavaScript代码进行分析,浏览器渲染展现。

源码细节

透过地方的讲述,对SpringMVC的圆流程应该产生了大概的刺探。但是经典的那句话,talk
is cheap, show me your code。

这个Dispacther分发器是怎么落实的也罢?其实她便是一个平淡无奇的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());
         //最后返回结果
      }
   }
}

常用之更

1
如果经常支付Restful风格的后端程序,即通过Http以及GET、POST、PUT、DELETE等展开数据的增删改查,那么好直接用@RestController注解

2 通常工程设计都见面分为几交汇,Controller,Service,Mapper
如果发生分,可以据此@Service@Autowired诠释搭配自动注入

3
如果应用@Service,最好直接写上Service的名,如@Service(value = "myService")不然如果您的名字是ABCService,默认的Service名字大小写会容易引发BUG,尤其是内需手动查找某个bean时。

4
一般为让代码简洁,Controller参数列表可以打包一个JavaBean类,用来机关包参数,是用之当儿会有益于得几近。

相关文章