springMVC

    科技2025-04-05  16

    文章目录

    SpringMVC是什么前端提交数据的格式SprngMVC的使用Handler处理器类乱码问题servlet对象的获取http错误码SpringMVC的执行流程

    SpringMVC是什么

    是一个servlet的封装框架,是一个控制层的框架,使用起来相对servlet更加便捷。能够帮我们接收前端的数据;帮我们返回数据给前端;帮我们做数据的处理(格式的处理)。

    原生servlet的缺陷:

    多个参数一堆getParameter参数的转型、非空判断返回数据麻烦(同步setAttr、异步getWriter())等等

    SpringMVC帮我们简化这些操作。

    前端提交数据的格式

    Content-type:mulipart/form-data:文件上传Content-type:application/json:asiox默认的,json格式Content-type:application/x-www-form-urlencoded,key=value格式, jquery的ajax默认的。

    SprngMVC的使用

    搭建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"; } }

    Handler处理器类

    @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); } }

    乱码问题

    ​ get请求不乱码:tomcat下conf/server.xml不用配useBodyEncodingFromURI和URIEncoding。post请求乱码:加过滤器CharacterEncodingFilter,指定编码(UTF-8必须大写)。

    servlet对象的获取

    加形参HttpServletRequest,HttpServletResonse,HttpSessionHttpServletRequest:请求对象。​HttpServletResonse:响应对象。HttpSession:会话对象,服务端保存客户端会话状态。​ServletContext:servlet全局上下文对象。

    http错误码

    404:url不存在

    405:method不支持。

    400:参数格式不正确。

    SpringMVC的执行流程

    应用服务器tomcat启动时,初始化springmvc容器对象,包含一系列的springmvc的核心bean对象。 处理器映射器RequestMappingHandlerMapping的bean:解析@RequestMapping注解做url映射处理器适配器RquesetMappingHandlerAdapter的bean: 封装参数,执行处理器方法。 // 源码节选: //去ServletContext中getAttribute方法,根据key:WebApplicaitonContext.Root获取根容器对象。 WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); //去创建springmvc子容器对象 WebApplicationContext wac = this.createWebApplicationContext(rootContext); //加载xml配置文件 wac.setConfigLocation(configLocation); //子容器持有了父容器 wac.setParent(rootContext); //子容器持有了ServletContext对象 wac.setServletContext(this.getServletContext());

    用户请求时,进入DispatcherServlet,进行url解析,通过处理器映射器找到对应的处理器对象(Handler),返回给DispathcerServlet。

    调用处理器适配器对象来执行处理器方法(封装表单参数),得到执行结果,返回给DispacherServlet

    判断处理器方法的结构:

    需要返回页面的话,执行视图解析器得到完整视图路径,执行跳转。需要返回数据的话,执行MappingJackson2HttpMessageConverter,json消息转换器把处理器方法的返回值转json字符串,输出前端。
    Processed: 0.011, SQL: 8