Memorykk

never too late to learn

SpringMVC

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

SpringMVC

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

核心组件

  • 前端控制器 DispatcherServlet(不需要程序员开发):处理所有的HTTP请求和响应,减少了其它组件之间的耦合度。

  • 处理器映射器HandlerMapping(不需要程序员开发):根据请求的URL来查找Handler

  • 处理器适配器HandlerAdapter

  • 处理器Handler(需要程序员开发)

  • 视图解析器 ViewResolver(不需要程序员开发):进行视图的解析,根据视图逻辑名解析成真正的视图(view)

  • 视图View(需要程序员开发jsp):View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

控制器

解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。

单例模式,所以在多线程访问的时候有线程安全问题,同步会影响性能,解决方案是在控制器里面不能写字段。

工作原理

request -> DispatcherServlet -> HandlerMapping -> HandlerAdapter -> Handler -> ModelAndView -> ViewResolver -> View -> reponse

(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。

image-20211014222339319

MVC设计模式

模型(model)- 视图(view)- 控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。

  • 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。

  • 有利于系统的并行开发,提升开发效率。

注解

@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上,用于类上表示类父路径。

@RequestBody:接收http请求的json数据,将json转换为java对象。

@ResponseBody:将controller方法返回对象转化为json对象响应给客户。

@RestController == @ResponseBody + @Controller

@Controller

控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。

@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

@PathVariable @RequestParam

@PathVariable来获取 @RequestMapping(value = “/page/{id}”, method = RequestMethod.GET)

@RequestParam用来获得静态的URL请求入参 spring注解时action里用到。

Spring MVC与Struts2

相同点

都是基于mvc的表现层框架,都用于web项目的开发。

不同点

  • 前端控制器不一样。Spring MVC的前端控制器是servlet:DispatcherServlet。struts2的前端控制器是filter:StrutsPreparedAndExcutorFilter。

  • 请求参数的接收方式不一样。Spring MVC是使用方法的形参接收请求的参数,基于方法的开发,线程安全,可以设计为单例或者多例的开发,推荐使用单例模式的开发(执行效率更高),默认就是单例开发模式。struts2是通过类的成员变量接收请求的参数,是基于类的开发,线程不安全,只能设计为多例的开发。

  • Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,Spring MVC通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

重定向和转发

转发:在返回值前面加”forward:”,譬如”forward:user.do?name=method4”

重定向:在返回值前面加”redirect:”,譬如”redirect:http://www.baidu.com"

中文乱码

POST

在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

GET

  • 修改tomcat配置文件添加编码与工程编码一致
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  • 对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)

异常处理

可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。

拦截GET方式提交的方法

可以在@RequestMapping注解里面加上method=RequestMethod.GET。

获取 Request、Session

直接在方法的形参中声明request,Spring MVC就自动把request对象传入。

拦截的方法里面得到入参

直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。

接收对象属性的参数

直接在方法中声明这个对象,Spring MVC就自动会把属性赋值到这个对象里面。

后台向前台传递数据

通过ModelMap对象,可以在这个对象里面调用put方法,把对象加到里面,前台就可以通过el表达式拿到。

ModelMap数据放入Session

可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

拦截器

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

  • 通过实现HandlerInterceptor接口;

    实现 preHandle(之前)、postHandle(之后)、afterCompletion(该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。)

  • 通过实现WebRequestInterceptor接口。

单个拦截器

img

多个拦截器

preHandle()方法会按照配置文件中拦截器的配置顺序执行,postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

img

WebApplicationContext

WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。