SpringMVC学习

SpringMVC

什么是SpringMVC?

  • Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分。

SpringMVC的体系结构

提出问题:

  • DispatchServelet类如何截获满足特定模式URL请求,并交由SpringMVC框架处理的?

解答:列举一个Http网络请求,调用SpringMVC框架实现过程。

  • 如何初始化各个组件并且将它们装配到disapatchServlet类实例中?

解答:SpringMVC配置xml和JAVA

SpringMVC架构控制流程

这里写图片描述

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

组件说明

  • DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

  • HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  • Handler:处理器

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

  • HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

  • ViewResolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

  • View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

SpringMVC异常处理

  • springmvc在处理请求过程中出现异常信息交由异常处理器进行处理;

  • 在默认情况下,Spring会将自身的一些异常自动转换为合适的状态码。
    这里写图片描述

这里写图片描述

  • Spring MVC处理异常有3种方式:

    • (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

    • (2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;

    • (3)使用@ExceptionHandler注解实现异常处理。

SimpleMappingExceptionResolver:

Spring 已经提供默认的实现类

  • 配置springMVC-servlet.xml

HandlerExceptionResolver

  • 这种方式只需要实现 resolveException 方法,该方法返回一个 ModelAndView 对象,在方法内部对异常的类型进行判断,然后返回合适的 ModelAndView 对象,如果该方法返回了 null,则 Spring 会继续寻找其他的实现了 HandlerExceptionResolver 接口的 Bean。换句话说,Spring 会搜索所有注册在其环境中的实现了 HandlerExceptionResolver 接口的 Bean,逐个执行,直到返回了一个 ModelAndView 对象。

  • 代码实现示例

public class MyExceptionHandler{
    @ExceptionHandler
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        Map<String, Exception> map = new HashMap<String, Exception>();
        map.put("ex",ex);

        // 根据获取的Exception参数进行view跳转
        if (ex instanceof MyException) {
            return new ModelAndView("error-my",map);
        } else {
            return new ModelAndView("error",map);
        }
    }
}

1.这个类必须声明到 Spring 配置文件中,或者使用 @Component 标签,让 Spring 管理它.

2.定义了这样一个异常处理器之后就要在springMVC-servlet.xml中定义这样一个bean对象,如

使用@ExceptionHandler进行处理

  • 该方法需要定义在 Controller 内部,然后创建一个方法并用 @ExceptionHandler 注解来修饰用来处理异常,这个方法基本和 @RequestMapping 修饰的方法差不多,只是可以多一个类型为 Exception 的参数,@ExceptionHandler 中可以添加一个或多个异常的类型,如果为空的话则认为可以触发所有的异常类型错误。

如:

@Controller  
public class GlobalController {
    /**  
     * 用于处理异常的  
     * @return  
     */  
    @ExceptionHandler({MyException.class})  
    public String exception(MyException e) {  
        System.out.println(e.getMessage());  
        e.printStackTrace();  
        return "exception";  
    }

    @RequestMapping("test")
    public void test() {
        throw new MyException("出错了!");
    }

}  
  • 使用@ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出错的方法在同一个Controller里面

SpringMVC-国际化

  • 什么是SpringMVC国际化?

为了让Web项目支持国际化,需要识别每个用户的首选区域,并根据这个区域显示内容。在spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须实现LocaleResolver接口。

  • 国际化的目的:

      1. 在页面上能够根据浏览器语言设置的情况对文本(不是内容), 时间, 数值进行本地化处理
      1. 可以在 bean 中获取国际化资源文件Locale 对应的消息
      1. 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况
  • 国际化实现步骤:

    • 首先要配置springmvc.xml的国际化资源文件
      1. 使用 JSTL 的 fmt 标签
      1. 在 bean 中注入ResourceBundleMessageSource 的示例, 使用其对应的getMessage方法
      1. 配置 LocalResolver 和 LocaleChangeInterceptor

SpringRestful服务

  • 什么是Restful?

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

实现方式(REST风格四种请求方式的调用):
GET请求:

  1 @RequestMapping(value="/student",method=RequestMethod.GET)
  2     public ModelAndView toAddPage(){//使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图
  3         ModelAndView mView=new ModelAndView();
  4         mView.addObject("employee",new Employee());
  5         mView.setViewName("add-stu");
  6         mView.addObject("departments", departmentDao.getDepartments());
  7         return mView;
  8     }
POST请求:
  1 @RequestMapping(value="/student",method=RequestMethod.POST)
  2     public String addStu(Employee employee){
  3         employeeDao.save(employee);
  4         return "redirect:/show" ;
  5     }
DELETE请求:
我们可以通过rest风格占位符方式,利用@PathVariable注解将占位符的值赋给调用方法参数
  1 @RequestMapping(value="/student/{id}",method=RequestMethod.DELETE)
  2     public String deleteStu(@PathVariable(value="id") Integer id){
  3         employeeDao.delete(id);
  4         return "redirect:/show" ;
  5     }
PUT请求:
  1 @RequestMapping(value="/student",method=RequestMethod.PUT)
  2     public String Update(@RequestParam(value="id")Integer id,Employee employee){
  3         employeeDao.save(employee);
  4         return "redirect:/show" ;
  5     }

HttpMessageConverter

而Http请求和响应是基于文本的,意味着浏览器和服务器通过交换原始文本进行通信。但是使用Spring,Controller类中的方法返回纯‘String’类型或域模型(或其他Java内建对象)。怎样将对象序列化/反序列化为原始文本?springMVC对数据Message的处理操作提供了一个接口HttpMessageConverter,用来对参数值和返回值的转换处理。

  • HttpMessageConverter处理流程

(1)HttpMessageConverter提供的方法还是比较简单的就是判断是否支持可读、可写以及读写操作。
(2)当然在读写操作方面springMVC又提供了读操作接口HttpInputMessage和写操作接口HttpOutputMessage来完成数据的读写操作
(3)HttpInputMessage提供的接口就是将body中的数据转为输入流
(4)HttpOutputMessage提供的接口就是将body中的数据转为输出流
(5)父接口HttpMessage提供的方法是读取头部中的信息;
在SpringMVC进入readString方法前,会根据@RequestBody注解选择适当的HttpMessageConverter实现类来将请求参数解析到string变量中,具体来说是使用了StringHttpMessageConverter类,它的canRead()方法返回true,然后它的read()方法会从请求中读出请求参数,绑定到readString()方法的string变量中。
当SpringMVC执行readString方法后,由于返回值标识了@ResponseBody,SpringMVC将使用StringHttpMessageConverter的write()方法,将结果作为String值写入响应报文,当然,此时canWrite()方法返回true。

  • Spring具有捆绑实现,可满足常见需求,下表显示了一些实例。
    这里写图片描述

  • 如果客户端发送的数据是json的表述形式,content-type可能是“application/json”,这种情况下,DispatcherSerclet会查找能够将json转换为Java对象的消息转换器,如果Jackson2在库类路径中,那么MappingJackson2HttpMessageConverter会担此重任。

Spring Restful-注解概述

本部分提供了支持 RESTful web 服务的主要 Spring 功能(或注释)的概述。
* @Controller

使用@Controller 注释对将成为 MVC 中控制器的类进行注释并处理 HTTP 请求。

  • @RequestMapping

使用 @RequestMapping 注释对函数进行注释,该函数处理某些 HTTP 方法、URI 或 HTTP 头。此注释是 Spring REST 支持的关键。可以更改 method 参数以处理其他 HTTP 方法。
例如:

@RequestMapping(method=RequestMethod.GET, value="/emps", headers="Accept=application/xml, application/json")

* @PathVariable

使用 @PathVariable 注释可将 URI 中的路径变量作为参数插入。
例如:

@RequestMapping(method=RequestMethod.GET, value="/emp/{id}")
public ModelAndView getEmployee(@PathVariable String id) { … }
  • 其他有用的注释

使用 @RequestParam 将 URL 参数插入方法中。
使用 @RequestHeader 将某一 HTTP 头插入方法中。
使用 @RequestBody 将 HTTP 请求正文插入方法中。
使用 @ResponseBody 将内容或对象作为 HTTP 响应正文返回。
使用 HttpEntity 将它自动插入方法中,如果将它作为参数提供。
使用 ResponseEntity 返回具有自定义状态或头的 HTTP 响应。
例如:
public @ResponseBody Employee getEmployeeBy(@RequestParam(“name”)
String name, @RequestHeader(“Accept”) String accept, @RequestBody String body) {…}
public ResponseEntity method(HttpEntity entity) {…}

ContentNegotiationManager

概念:内容协商视图解析器,它还是视图解析器,只是它支持根据请求信息将同一模型数据以不同的视图方式展示(如Json、xml、html等),Restful架构风格中很重要的概念(同一资源,多种表现形式);(返回的是json字符串)主要是配置上的修改,controller写法同mvc.

  • 对比:

1.推荐使用HttpMessageConverter,用法更简单,可直接转换json对象。没有view,只有数据。
2.ContentNegotiationManager更适合于适配不同的view格式,注意操作的是json格式字符串。

SpringMVC Restful服务示例

使用方式:
* 1.引入依赖包

“com.fasterxml.jackson.croe:Jackson-databind:2.3.1”

  • 2.Controller类的注解
@Controller
@RequestMapping ( "/myTest" )
public class MyController {
    @RequestMapping ( "*/wildcard" )
    public String testWildcard() {
       System. out .println( "wildcard------------" );
       return "wildcard" ;
    }  
}
  • 3.Controller类的method写法
@RequestMapping (value= "/users", method=RequestMethod.GET, produces=”application/json”)
    public String testMethod() {
       return "method" ;
    }

@RequestMapping (value= "/{id}", method=RequestMethod.GET, produces=”application/json”)
public String testMethodOne(@PathVariable Long id) {
    User user=userService.GetUserById(id);
       return "methodOne" ;
    }
  • 4.使用ResponseEntity携带返回状态
@RequestMapping(value=”/add”, method=RequestMethod.GET, produces=”application/json”)
public ResponseEntity<Map<String,Object>> responseEntity(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("message", "Hello Wrold");
return new ResponseEntity<Map<String,Object>>(map, HttpStatus.OK);
}

SpringMVC与SpringBoot区别

  • Spring MVC提供了一种轻度耦合的方式来开发web应用。

Spring MVC是Spring的一个模块,式一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

  • Spring Boot实现了自动配置,降低了项目搭建的复杂度。

  • Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。

  • 用最简练的语言概括就是:

    • Spring 是一个“引擎”;

    • Spring MVC 是基于Spring的一个 MVC 框架 ;

    • Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

SpringMVC学习资料参考

视频资源

博客资源

课件资源分享

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ry_19920916/article/details/80691349
个人分类: Java知识库
想对作者说点什么? 我来说一句

springmvc学习资料

2017年10月11日 54B 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭