美文网首页
SpringMVC框架

SpringMVC框架

作者: JumpBorderLine | 来源:发表于2019-08-14 21:26 被阅读0次

SpringMVC是Spring框架的一个模块,是一个基于MVC思想设计的框架,它相当于是一个servlet,负责处理客户端的请求并将请求结果返回给用户。

在理解SpringMVC之前,首先我们来了解一下MVC设计思想。

1、MVC设计模式

MVC设计模式是一种软件编程思想。MVC设计模式认为任何软件都可分为三部分组成:

1)Controller: 控制程序流转的控制器;

2)Model:封装数据处理数据的模型;

3)View:负责展示数据的视图;

它们三部分互不干扰,各司其职。这样做软件结构更加清晰,代码更好扩展和维护,也提高了其复用性。

2、以前网站开发的MVC模式

以前的WEB开发采用的MVC模式为:Servlet+Jsp+JavaBean,此种方式Servlet的处理相当麻烦,下面我们来看一下它的处理流程。

JavaEE经典架构(SSM)

3、为什么要使用SpringMVC?

当使用Servlet处理请求时我们肯定会遇到下面一系列问题:

1)通常一个请求对应一个servlet,一个servlet类只负责处理一个请求,若项目中有成千上万个请求的话,servlet类会暴增,这会让项目很难维护;

2)每个Servlet都需要在web.xml文件中配置至少8行信息,servlet多的话配置内容就多且繁琐,不利于团队开发;

3)客户端提交到服务器的数据无论是什么格式,servlet都是按照字符串格式接收,后期需要转换处理,很麻烦;

4)一个servlet调用时,需要重新编辑doGet/doPost()方法,代码繁琐;

5)Get与Post乱码问题严重;

6)重定向或转发时业务复杂;

4、SpringMVC核心组件及其执行流程

4.1  核心组件

SpringMVC包含了控制器与视图两部分,其核心组件主要有5个;

1)DispatcherServlet(前端控制器):SpringMVC的老大,相当于是转发器、CPU(中央处理器),是整个流程控制的中心,它只做转发(通知)而不去做;

2)HandlerMapping(处理器映射器):负责根据xml配置、注解进行查找请求对应的具体Controller,并将Controller具体方法名返回给前端控制器,处理器映射器中维护的有一个map集合Map<请求的路径,路径对应的方法>;

3)HandlerAdapter(处理器适配器):调用具体的Controller;

4)ViewResolver(视图解析器):根据View(逻辑视图名)解析后返回具体页面;

5)View(视图渲染):根据Model对View进行渲染,即将模型数据填充至视图中。

4.2 执行流程

1)客户端发送请求至前端控制器(DispatcherServlet);

2)前端控制器收到请求后调用处理器映射器(HandlerMapper),处理器映射器找到具体的Controller,并将Controller返回给前端控制器;

3)前端控制器调用处理器适配器(HandlerAdaptor),处理器适配器调用具体的Controller,调用Controller时可能涉及到要调用业务层的方法即(Controller----service----Dao/Mapper----DB),将处理后得到的数据和页面名字(ModelAndView)返回给前端控制器;

4)前端控制器将执行的结果(ModelAndView)传递给视图解析器(ViewResolver),视图解析器根据View(页面逻辑名)解析[给页面加上前缀和后缀完成路径拼接]后返回具体的页面给前端控制器;

5)前端控制器根据Model对View进行渲染,将模型数据填充至视图中,并将填充了数据的网页响应给用户;

整个开发过程中需要编程人员写的有Controller、Service、Dao、View;

Jsp通过EL与JSTL将数据返回给页面,将数据封装在域中(最常用的是request域),四大域对象(page、request,session,application)。

5、SpringMVC参数绑定及传值过程

参数绑定

配置请求路径和方法的映射关系,@RequestMapping(“路径”)、@GetMapping(“路径”)【处理get请求】、@PostMapping(“路径”)【处理post请求】。

当浏览器访问到相应的路径后就会执行路径下面对应的方法。访问路径在整个项目中是独一无二的。

SpringMVC会自动将请求中包含的参数与方法中的参数进行匹配,即只要保证请求中的参数名称与方法中的参数名称相对应,在方法中就可使用这些参数。若要取别名也行,可以使用@PathVariable注解(类型   请求中的参数名)。

5.1、基本类型参数绑定

当需要客户端发送的是少量数据时,可以在controller方法上,通过声明方法参数对其进行接收。接收基本类型的参数时,使用包装类声明其类型。

5.2 包装类型参数绑定

当需要客户端发送的数据较多时就是用对象接收(首先得封装好对象),解决了代码冗余问题。

5.3 日期类型参数绑定

默认日期用/分开不会有错,但若是使用-分隔日期则需要先对请求进行处理,不然会有异常。

对异常情况进行处理:

使用注解@InitBinder,用于指定自定义的日期转换格式,在Controller中添加如下代码即可正常转换:

包装类型传值过程

      1:利用反射机制实例化对象(必须有无参构造)

      2:利用对象的getXXX( )方法获取对象的属性名称getUserId( )-----将get去掉之后首字母小写得userId;

      3-利用request的getParameter( userId ) 方法为userId赋值

      4-利用user对象的setUserId( )方法为user的属性赋值

      5-得到user实例对象

6、实现转发和重定向

6.1 转发:forward

一次请求,一次响应;

使用的是同一个request与response;

访问地址不会改变;

6.2 重定向: redirect

至少两次请求,两次响应;(第一次找到地址后进行访问,访问后服务器会响应其你需要去访问另一个地址,然后又去访问另一个地址);

使用的不是同一个request与response;

访问地址会改变;

7、SpringMVC响应数据

7.1 使用model响应

使用model将数据存储在request域中带到页面中去处理,jsp在页面中使用EL表达式${ }取值。model对象实际上是一个map集合,可以往model中添加属性。

7.2 使用JSON响应,返回JSON数据

JSON(JavaScript Object Notation)是JS提供的一种轻量级的数据交换格式。与JS中声明对象的方式类似。

值得注意的是:若使用该类型返回数据,则应在方法上添加@ResponseBody注解。

例:

8、SpringMVC的配置

配置文件的一手资料建议直接上官网查找

8.1 导入SpringMVC依赖的包

8.2 首先在web.xml文件中配置前端控制器,拦截所有请求

8.3 SpringMVC的config配置文件

Tomcat启动加载方式

Tomcat服务器启动时通首先加载web.xml文件,并调用ServletContainerInitializer初始化servlet,然后底层执行相应的service方法,最后正常关闭时执行destroy()方法,最后servlet由JVM的gc回收。

SpringMVC的请求响应处理

请求处理

404:找不到资源,url不存在或错误;

405:客户端与服务器端的请求方式不一致;

400:与参数有关系,可能参数不匹配;

响应处理

转发,重定向;

响应数据封装(ModelAndView,Model,Map);

响应数据转换(将对象序列化为JSON格式字符串);

9、SpringMVC中传参时常用的注解

1)@PathVariable:告诉spring容器,参数的值来自该注解指定的RestFul风格变量即{ 变量 };使用于RestFul风格的传参,标识定义的变量名与方法的参数名一致。

2)@RequestParam:使用于请求域里面的参数,标识请求域里面的变量与方法参数名一致,若不一样则使用该参数value变量进行标识。该注解通过指定required为true/false来表明是否一定要传参数,true则表示一定要传,false可以不传。

eg: http://localhost:3001/user-service/7/score?score=100,此处request域中变量为score,即score=100中的score。

3)@RequestBody:使用于post请求提交的实体内容。

4)@RequestMapping:指定映射路径,可以为指定的路径取多个名字,并通过method属性指定方法的请求方式。

5)若返回的是个页面则直接返回String即可,返回的是数据则需要添加@ResponseBody,直接将数据打印在页面上。springMVC默认支持jackson格式的字符串,它借助Jackson将返回值转换为json格式。

10、拦截器(Interceptor)和过滤器(Filter)的区别

https://www.cnblogs.com/panxuejun/p/7715917.html

相关文章

网友评论

      本文标题:SpringMVC框架

      本文链接:https://www.haomeiwen.com/subject/ygqgjctx.html