6.1. SpringMvc介绍
- MVC 介绍 : 将软件按照模型-视图-控制器划分
-
- M : Model , 模型层,指的是JavaBean,用来处理数据,一种是实体类bean一种是业务处理bean-->Service或者是Dao对象
- V : View , 视图层,指工程中的 html 或 jsp 等页面,作用是与用户进行交互,展示数据
- C : Controller,控制层,指工程中的 servlet,作用是接收请求和响应浏览器
- MVC的工作流程 : 用户在视图层发送请求到服务器,服务器中的请求被Controller接收,Controller调用相应的Model层处理请求,处理完后将结果返回给Controller,再根据请求处理的结果找到相应的View视图,渲染数据最终给了浏览器
- SpringMVC介绍 : 是MVC的一个后续产品,是他的一个子项目,具有以下特点 :
-
- Spring原生家族产品,能够和IOC容器等直接衔接
- 基于原生的Servlet,通过了功能强大的 前端控制器 DispatcherServlet,对请求和响应进行统一处理
- 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
- 代码简洁,性能好
1.1 DispatcherServlet
统一收口,接收请求,响应结果,相当于转发器,中央处理器。
有了 DispatcherServlet 减少了其它组件之间的耦合度。
1.2 HandlerMapping-处理器映射器
根据请求的url查找Handler,既负责完成客户请求到 Controller 映射。
SpringMVC提供了不同的映射器实现不同的映射方式,
例如:配置文件方式、实现接口方式、注解方式等。
1.3 HandlerAdapter-处理器适配器
按照特定规则去执行Handler。
1.4 Handler-处理器 也叫 Controller
Handler 是继 DispatcherServlet 前端控制器的后端控制器,
在 DispatcherServlet 的控制下,Handler对具体的用户请求进行处理。
1.5 视图解析器ViewResolver
进行视图解析,根据逻辑视图名解析成真正的视图(view)
ViewResolver负责将处理结果生成View视图,
ViewResolver首先根据逻辑视图名解析成物理视图名,即具体的页面地址,
再生成View视图对象,最后对View进行渲染将处理结果通过页面的展示给用户。
SpringMVC框架提供了很多View视图类型,
包括:JSTLView、freemarkerView、pdfView等等.
1.6 视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker…),
一般情况下需要通过页面标签或者页面模板技术将模型数据通过页面展示给用户,
需要由程序员根据业务需求开发具体的页面。
6.2. SpringMvc使用
- SpringMvc注解(之前的Spring的也算) : @RequestMapping, @RequestParam, @RequestBody, @ResponseBody, @RestController
-
- @RequestMapping 注解用于将特定 HTTP 请求方法 映射 到将处理相应请求的控制器中的特定类或方法
-
-
- 派生类有 : @GetMapping , @PostMapping , @PutMapping , @DeleteMapping
-
- @Controller --> 将该类交给SpringMVC容器管理
- @RequestBody配合 @PostMapping 或者 @PutMapping
- @RestController相当于@Controller + @ResponseBody
- SpringMvc获取参数有两种方式
-
- 可以通过ServletAPI获取 : 也就是说此时将 HttpServletRequest 类作为控制器方法的形参,该类型的参数表示封装了当前请求需要的对象getParameter方法
public String test3(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password")
}
-
- 通过控制器方法的形参获取请求参数 : 在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet 中就会将请求参数赋值给相应的形参。参数多的话用注解@RequestParam
@RequestMapping("/test4")
public String test4(String name, Integer age){}
-
- 通过实体类获取参数 : 可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。也就是专门建造一个有需要的参数的实体类
- 解决乱码问题: 使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter,只需要在 web.xml 中进行注册。
- SpringMvc 域对象共享数据 ,常用的有以下几种 :
-
- 使用ServletAPI向request域对象共享数据 : HttpServletRequest request -->request.setAttribute("name", "吕布")
- 使用ModelAndView向request域对象共享对象 :
@RequestMapping("/test8")
public ModelAndView test8(){
// ModelAndView 可以设置要往request域中放的数据和设置视图
ModelAndView mav = new ModelAndView();
mav.addObject("age", 20);
mav.setViewName("/abc.jsp");
return mav;
}
-
- 使用Model向request域对象共享数据 : Model mode --> model.addAttribute("sex", "男");
- 使用session域对象共享数据 : HttpSession session --> session.setAttribute("hobby", "抽烟,喝酒,烫头");
- 使用application域对象共享数据 :
public String test13(HttpSession session){
ServletContext application = session.getServletContext();
application.setAttribute("desc", "啦啦啦");
return "/abc.jsp";
}