Spring MVC入门
一、HTTP协议部分知识
1.HTTP流
浏览器和服务器连接步骤:
【1】打开TCP连接
【2】浏览器向服务器发送报文(请求)
【3】服务器向浏览器返回报文(响应)
【4】浏览器关闭连接或请求重用连接
2.HTTP报文
请求报文结构如下:
包括方法、要获取的资源的路径、版本、头以及请求体(图中未给出)
响应报文结构如下:
状态行(包括版本、状态码、状态信息)+响应头+响应体(图中未给出)
3.实际请求顺序
浏览器(客户端)向服务器发送请求,服务器响应请求返回HTML文件,浏览器发现HTML文件引用了CSS、JS等文件,那么浏览器分别向服务器进行请求,获得这些文件,如此反复,直到浏览器获得所有需要的文件为止。
二、Spring MVC
三层架构:表现层(与浏览器对话)、业务层(表现层调用)、数据层(业务层调用)
MVC:是一种设计模式。它分为三层结构model(连接view和controller),view(渲染、展现),controller(处理浏览器请求)。MVC用于表现层的实现。
核心组件:前端控制器DiapatcherServlet,它的结构如下:
Controller 控制器
ViewResolver 视图解析器
HandlerMapping 映射
下图中展示了前端控制器DiapatcherServlet的工作原理:
三、Thymeleaf
Thymeleaf官网
Thymeleaf是模板引擎。模板引擎通过接受模板文件以及model生成动态的HTML文件。
Thymeleaf倡导自然模板,即以HTML文件为模板,因此大部分人能看懂。
1.关闭缓存
在开发过程中我们应该关闭缓存。这样页面的刷新会更快(不会显示缓存内容),项目正式上线时应该开启。
在配置文件application.properties文件里写入spring.thymeleaf.cache=false即可关闭缓存(默认开启)。
四、请求与响应
1.底层实现
@RequestMapping("/http") public void http(HttpServletRequest request, HttpServletResponse response){ //获取请求数据 System.out.println(request.getMethod()); System.out.println(request.getServletPath()); Enumeration enumeration = request.getHeaderNames(); while(enumeration.hasMoreElements()){ String name = (String) enumeration.nextElement(); String value = request.getHeader(name); System.out.println( name + ": " + value); } System.out.println(request.getParameter("code")); //返回响应数据 response.setContentType("text/html;charset = utf-8"); try (PrintWriter writer = response.getWriter();) { writer.write("<h1>牛客网</h1>"); } catch (IOException e) { e.printStackTrace(); } }
这种方式需要设置需要返回的文件类型、编码类型以及要输出的代码,非常麻烦。
2.封装实现
(1)get请求
一共有两种获取参数的方式:
【1】第一种是使用@RequestParam注解设置参数,需要指定包括参数名、是否可以不传入参数、默认参数。
// /students?current=1&limit=20 @RequestMapping(path = "/students", method = RequestMethod.GET) @ResponseBody public String getStudents( @RequestParam(name = "current", required = false, defaultValue = "1") int current, @RequestParam(name = "limit", required = false, defaultValue = "10") int limit){ System.out.println(current); System.out.println(limit); return "some students"; }
【2】第二种是使用@PathVariable,这种方法将要传入的参数写入路径中。
// /students/123 @RequestMapping(path = "/students/{id}", method = RequestMethod.GET) @ResponseBody public String getStudent(@PathVariable("id") int id){ System.out.println(id); return "a student"; }
(2)post请求
请求参数可以从浏览器的页面中的输入获取。例如,在下列代码中我们可以从页面中输入name和age,然后点击“保存”按钮即可得到输出。在saveStudent函数中的name和age会根据html文件中的同名参数自动赋值。
//post请求 @RequestMapping(path = "/student", method = RequestMethod.POST) @ResponseBody public String saveStudent(String name, int age){ System.out.println(name); System.out.println(age); return "success"; }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>增加学生</title> </head> <body> <form method="post" action="/community/alpha/student"> <p> 姓名:<input type="text" name="name"> </p> <p> 年龄:<input type="text" name="age"> </p> <p> <input type="submit" value="保存"> </p> </form> </body> </html>
3. 响应HTML数据
一共有两种方法:
方法一:通过ModelAndView对象实现。具体步骤为创建一个ModelAndView对象并对向model中加入数据,然后设置视图名称并返回ModelAndView对象。这里的视图名称就是模板html文件的路径。
@RequestMapping(path = "/teacher", method = RequestMethod.GET) public ModelAndView getTeacher(){ ModelAndView mav = new ModelAndView(); mav.addObject("name", "张三"); mav.addObject("age", 30); mav.setViewName("/demo/view"); return mav; }
方法二:直接返回视图路径。具体步骤为将model对象传入方法,并直接向model中加入数据,然后返回视图路径即可。这里的视图路径就是模板html文件的路径。此外model对象是自动生成的,不需要再额外创建。
@RequestMapping(path = "/school", method = RequestMethod.GET) public String getschool(Model model){ model.addAttribute("name", "北京大学"); model.addAttribute("age", 100); return "/demo/view"; }
4.响应JSON数据
通过@ResponseBody注解注释的方***将返回值转化为JSON数据。JSON是一种数据交换格式,在这里它可以实现Java对象 -> JSON字符串 -> JS对象。