是一个servlet的封装框架,是一个控制层的框架,使用起来相对servlet更加便捷。能够帮我们接收前端的数据;帮我们返回数据给前端;帮我们做数据的处理(格式的处理)。
原生servlet的缺陷:
多个参数一堆getParameter参数的转型、非空判断返回数据麻烦(同步setAttr、异步getWriter())等等SpringMVC帮我们简化这些操作。
搭建spring环境
加入spring-web环境。spring-web;spring-webMVC
加入xml配置文件(mvc注解开启,配置视图解析器bean对象)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.javasm"></context:component-scan> <mvc:annotation-driven></mvc:annotation-driven> <!--视图解析器,生成响应视图路径--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/page/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans> 在web.xml配置springMVC的总前端控制器 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--编码过滤器--> <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> </web-app> 写springMVC风格的接口 @Controller @RequestMapping("sys") public class SysuserHandler { @GetMapping("hello") public String hello(String uname) { System.out.println(uname); return "hello"; } @PostMapping("post") public String postTest(Sysuser user) { System.out.println(user); // System.out.println(upass); return "hello"; } }@RequestMapping,@GetMapping,@PostMapping等
request参数注解:
@RequestBody只能够注解对象,接收前端json数据,注解处理器方法形参.
@RequestBody Map map用于接收多对象参数,使用BeanUtils工具类负责把map中的数据分到不同的对象中。要使用BeanUtils工具类。BeanUtils:把Map中的数据分别封装到指定的实体对象中。@RequestParam不能注解对象,只注解简单数据,String,Date,包装类。接收前端的key=value数据,可以指定默认值.
ModelAndView对象:处理同步请求,携带数据转发页面,要执行视图解析器对象
Model:处理器同步请求,携带数据返回页面。
response响应:
@ResponseBody处理异步请求。把处理器方法的返回值转json字符串,发送前端(前提有jackson环境)。
ResponseEntity处理异步请求,处理器方法的返回值为ResponseEntity类型,可以设置响应头和状态码。
@DateTimeFormat:注解到形参或实体类成员变量上。对前端的字符串日期转Date对象
@JsonFormat:把Date对象转成json字符串,发送给前端。
细节问题
如果前端Content-type为application/json,数据格式{“key”:value},当数据是属于多个对象所有的时候,取数据的时候出异常。处理器方法中使用Map来接收参数,使用BeanUtils工具类负责把map中的数据分到不同的对象中。要使用BeanUtils工具类,需要两个jar包:common-beanUtils,common-collections @Controller @RequestMapping("/user")// public class SysuserHandler { //springMVC在获取表单参数时,解析形参,如果是简单类型,getParamaeter,如果是对象,则反射找成员变量,根据变量名getParameter //@RequestMapping(path = "/hellomvc",method = RequestMethod.GET) //Model作为形参 @GetMapping("hellomvc") public String helloMethod(Sysuser user, Sysdept sysdept, Model m){ m.addAttribute("user",user);//把数据放在request域 m.addAttribute("str","request域中的数据"); System.out.println("hello SPringmvc"); return "hello"; } // ModelAndView的使用,以及servlet对象的获取。 @GetMapping("hellomvc") public ModelAndView helloMethod(Sysuser user, Sysdept sysdept,HttpServletRequest req, HttpServletResponse resp, HttpSession session){ session.setAttribute("sessionData","session中数据"); ModelAndView mv = new ModelAndView();//模型视图对象 mv.addObject("str","request中数据"); mv.addObject("user",user); mv.setViewName("hello");//视图名,View对象. // System.out.println("hello SPringmvc"); return mv; } // @RequestParam 给对象赋默认值 @PostMapping("/login") public String login(Sysuser user,@RequestParam(defaultValue = "aaa") String str,@RequestParam(defaultValue = "12") Integer intr){ System.out.println("login"); return "login"; } //原理:request.getInputStream() String str="" Sysuser u = JSON.parseObject(str,Sysuser.class) //前端传递json格式的数据{"uname":"fyt","uphone":"123123123123"} @PostMapping("/all3") public String selectAll3(@RequestBody Map<String,Object> map){ //把Map中的数据分发到不同的对象中,common-beanUtil Sysuser user = new Sysuser(); Sysdept dept = new Sysdept(); try { BeanUtils.populate(user,map); BeanUtils.populate(dept,map); } catch (Exception e) { e.printStackTrace(); } System.out.println("selectAll3"); return "hello"; } } @Controller @RequestMapping("dept") public class SysdeptHandler { //对于异步请求,不执行视图解析器。 // @ResponseBody把返回值通过jackson组件转成json字符串。输出 @GetMapping("queryDeptById") @ResponseBody public Sysdept queryById(String did){ Sysdept d = new Sysdept(); d.setDid(did); d.setDname("人事部"); d.setDdate(new Date()); return d; } //ResponseEntity比ResponseBody功能强悍.很方便的设置响应头信息。 // response.setContentType("text/html;charset=utf-8") //response.setHeader("Content-type","text/html;charset=utf-8") //response.setHeader("Content-Disposition","'attachment;filename=文件名")文件下载响应头 @GetMapping("queryDepts") public ResponseEntity<List<Sysdept>> query(){ List<Sysdept> list = new ArrayList<>(); Sysdept d = new Sysdept(); d.setDname("人事部"); d.setDdate(new Date()); Sysdept d2 = new Sysdept(); d2.setDname("人事部2"); d2.setDdate(new Date()); list.add(d); list.add(d2); // return ResponseEntity.ok(list);//HttpStatus:200 ok,默认响应头,响应体:list // return new ResponseEntity(list,HttpStatus.OK); HttpHeaders headers = new HttpHeaders(); headers.add("Content-type","text/html;charset=utf-8"); return new ResponseEntity(list,headers,HttpStatus.OK); } }404:url不存在
405:method不支持。
400:参数格式不正确。
用户请求时,进入DispatcherServlet,进行url解析,通过处理器映射器找到对应的处理器对象(Handler),返回给DispathcerServlet。
调用处理器适配器对象来执行处理器方法(封装表单参数),得到执行结果,返回给DispacherServlet
判断处理器方法的结构:
需要返回页面的话,执行视图解析器得到完整视图路径,执行跳转。需要返回数据的话,执行MappingJackson2HttpMessageConverter,json消息转换器把处理器方法的返回值转json字符串,输出前端。