社交网站后端项目开发日记(一) (2)

发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。在HTTP/2中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。

GET / HTTP/1.1 Host: developer.mozilla.org Accept-Language: fr

读取服务端返回的报文信息:

HTTP/1.1 200 OK Date: Sat, 09 Oct 2010 14:28:02 GMT Server: Apache Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT ETag: "51142bc1-7449-479b075b2891b" Accept-Ranges: bytes Content-Length: 29769 Content-Type: text/html <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)

关闭连接或者为后续请求重用连接。

当HTTP流水线启动时,后续请求都可以不用等待第一个请求的成功响应就被发送。然而HTTP流水线已被证明很难在现有的网络中实现,因为现有网络中有很多老旧的软件与现代版本的软件共存。因此,HTTP流水线已被在有多请求下表现得更稳健的HTTP/2的帧所取代。

HTTP请求的例子:

image-20210628144125974

响应的例子:

image-20210628144336876

2.1 SpringMVC概要

三层架构:表现层,业务层和数据访问层。

MVC:Model(模型层),View(视图层),Controller(控制层)

image-20210628145510740

核心组件: DispatcherServlet

2.2 Thymeleaf思想

如果想给浏览器返回一个动态网页,则需要一个工具支持,例如:Thymeleaf(模板引擎,生成动态的HTML)。

image-20210628170701838

该引擎需要学习的有:标准表达式,判断与循环,模板的布局。

学习建议参考官方文档 https://www.thymeleaf.org/index.html

2.3 SpringMVC代码示例 GET请求

@RequestMapping支持Servlet的request和response作为参数,以下为一个简单示例:

@Controller @RequestMapping("/alpha") public class AlphaController { @RequestMapping("/hello") @ResponseBody public String sayHello(){ return "Hello Spring Boot."; } @RequestMapping("/http") public void http(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取请求数据 System.out.println(request.getMethod()); System.out.println(request.getServletPath());//请求路径 Enumeration<String> enumeration = request.getHeaderNames();//得到请求行的key while(enumeration.hasMoreElements()) { String name = enumeration.nextElement(); //当前值(key) String value = request.getHeader(name);//得到value System.out.println(name + ":" + value); } System.out.println(request.getParameter("code")); // 返回响应数据 response.setContentType("text/html;charset=utf-8");//返回网页类型的文本 PrintWriter writer = response.getWriter(); writer.write("<h1>牛客网</h1>");//这里只进行简单输出 writer.close(); } }

在项目Controller层加入代码,以response体返回一个html的文本。

image-20210713235642108

这是通过底层对象处理请求的方式,便于理解。

更简单的方式为:

// GET请求,用于获取某些数据 // /students?current=1&limit=20 假设查询学生数据,第一页,每页20条 @RequestMapping(path = "/students", method = RequestMethod.GET) @ResponseBody // public String getStudents(int current,int limit) { //直接使用Int类型,前端控制器会自动识别匹配 // System.out.println(current); // System.out.println(limit); // return "some students"; // } // 也可加上注解 public String getStudents( @RequestParam(name = "current", required = false, defaultValue = "1") int current, @RequestParam(name = "limit", required = false, defaultValue = "1") int limit) { System.out.println(current); System.out.println(limit); return "some students"; }

利用@ResponseBody注解,实现效果为:

image-20210714001035908

控制台返回结果:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsfds.html