一、HTTP协议部分知识

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

  下图中展示了前端控制器DiapatcherServlet的工作原理:
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对象。