文章目录
1.缓存机制
常见的缓存机制
- 堆内存中的字符串常量池
例如:"hello"先在字符串常量池中看有没有,如果有,直接拿来使用,没有则新建,然后放入到字符串常量池中。 - 堆内存中的整数型常量池
[-128-127]先放入到整型数字常量池中,如果没有超出这个范围,直接取。 - 连接池
(1)java语言连接数据库的连接对象,java.sql.Connection对象。
(2)JVM是一个进程程,MySql是一个进程,进程与进程之间建立连接,打开通道麻烦,所以我们先创建好N个Connection对象,放进连接池,每一次用户连接的时候,不需要重新创建对象,只需要从连接池中拿来即可。 - 线程池
(1)Tomcat服务器支持多线程
(2)Tomcat服务器在启动的时候,先创建N个线程,放入到线程池中,然后等待用户发起请求的时候,需要一个线程来处理这个请求,直接从线程池中拿,效率大大提高。 - redis
NoSQL数据库,非关系型数据库,缓存数据库。 - 向ServletContext存数据,等同于将数据放到缓存Cache中。
2.HTTP协议详解
2.1示例
GetServlet
package com.sdnu.javaweb.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* getServlet
*
* @author Beyong
* @date 2023/03/08 11:48
**/
public class GetServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<!doctype html");
out.print("<html>");
out.print(" <head>");
out.print(" <title>from get servlet</title>");
out.print(" </head>");
out.print(" <body>");
out.print(" <h1>from get servlet</h1>");
out.print(" </body>");
out.print("</html>");
}
}
PostServlet
package com.sdnu.javaweb.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* postServlet
*
* @author Beyong
* @date 2023/03/08 11:48
**/
public class PostServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<!doctype html");
out.print("<html>");
out.print(" <head>");
out.print(" <title>from post servlet</title>");
out.print(" </head>");
out.print(" <body>");
out.print(" <h1>from post servlet</h1>");
out.print(" </body>");
out.print("</html>");
}
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>http协议</title>
</head>
<body>
<h1>get请求:</h1>
<form action="servlet05/getServlet" method="get">
username<input type="text" name="username"/><br>
password<input type="password" name="password"/><br>
<input type="submit" value="login">
</form>
<h1>post请求:</h1>
<form action="servlet05/postServlet" method="post">
username<input type="text" name="username"/><br>
password<input type="password" name="password"/><br>
<input type="submit" value="">
</form>
</body>
</html>
web.xml
<?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>getServlet</servlet-name>
<servlet-class>com.sdnu.javaweb.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getServlet</servlet-name>
<url-pattern>/servlet05/getServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>postServlet</servlet-name>
<servlet-class>com.sdnu.javaweb.servlet.PostServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>postServlet</servlet-name>
<url-pattern>/servlet05/postServlet</url-pattern>
</servlet-mapping>
</web-app>
2.2HTTP请求
- 请求行
请求行包含 请求方式,URL,HTTP协议版本号
请求方式包括 get,post,delete,put,head,options,trace
URI 资源标识符
HTTP协议版本号 - 请求头
请求的主机,主机的端口号, 浏览器信息, 平台信息, cookie等信息 - 空白行
空白行用来区分“请求头”和“请求头” - 请求体
要发送的具体数据
2.2.1get请求
GET /servlet5/getServlet?username=jack&password=123 HTTP/1.1 【请求行】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: csrftoken=9WQujKoZ8gtaONV4qaIcwmtuWQUQKspvN5f7CfE7QVVwCJ86yOLdQukhUgTxHEUT; sessionid=uatzbrs3f6yr22vwbldot76m0pqvjc78
Host: 127.0.0.1:8080 【请求头】
Referer: http://127.0.0.1:8080/servlet5/index.html
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
【空白行】
【请求体】
2.2.2post请求
POST /servlet5/postServlet HTTP/1.1 【请求行】
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 26
Content-Type: application/x-www-form-urlencoded
Cookie: csrftoken=9WQujKoZ8gtaONV4qaIcwmtuWQUQKspvN5f7CfE7QVVwCJ86yOLdQukhUgTxHEUT; sessionid=uatzbrs3f6yr22vwbldot76m0pqvjc78
Host: 127.0.0.1:8080 【请求头】
Origin: http://127.0.0.1:8080
Referer: http://127.0.0.1:8080/servlet5/index.html
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
【空白行】
【请求体】
2.3HTTP响应
-
状态行
(1)协议版本号
(2)状态码
200表示请求响应成功
404表示访问的资源不存在
405表示前端发送请求的方式和后端处理请求的方式不同
500表示服务端程序出现错误
(3)状态的描述信息
ok表示成功
no found表示资源找不到 -
响应头
响应的内容类型,长度,时间… -
空白行
用来分隔响应头和响应体 -
响应体
响应的正文,这些正文最终被浏览器渲染,解释并执行,最终展示出效果。
2.3.1get响应
具体报文
HTTP/1.1 200 ok 【状态行】
Content-Type: text/html;charset=UTF-8 【响应头】
Content-Length: 141
Date: Wed, 08 Mar 2023 06:11:54 GMT
Keep-Alive: timeout=20
Connection: keep-alive
【空白行】
<!doctype html<html> 【响应体】
<head>
<title>
from get servlet
</title>
</head>
<body>
<h1>
from get servlet
</h1>
</body>
</html>
2.3.2 post响应
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Length: 143
Date: Wed, 08 Mar 2023 08:59:58 GMT
Keep-Alive: timeout=20
Connection: keep-alive
2.4 get请求和post请求区别
目前只有form表单中method="POST"属于post请求。
(1) get请求是在请求行发送数据,发送的时候,在URI的的地址栏后面挂上?和数据。
(2) post请求是在请求体发送数据,不会显示在地址栏上。
(3)不管是get请求还是post请求,请求的数据格式都是一样的。
(4)get请求只能发送普通字符串,并且普通字符串长度有限制,post请求可以发送任何类型的数据,理论上没有长度限制。
(5)get请求适合从服务器获取数据,post请求适合向服务器发送数据。
(6)get请求是安全的,post请求是危险的,因为post是向服务器发送数据的,如果这些数据从后门进入服务器,服务器是很危险的。
(7)get请求支持缓存,你只要发送了get请求,浏览器都会先在本地浏览器上找,找不到再去服务器上取。
post请求不支持缓存。post请求后,响应的结果不会被浏览器存储起来。
(8)大部分form表单的提交使用post请求。文件上传,一定使用post。其它情况使用get请求。
2.5 HttpServlet源码
(1)servlet规范中的接口:
(2)HttpServlet哪个包下
jakarta.servlet.http.HttpServlet
(3)http包下有哪些类和接口
(4)HttpServletRequest
(5)HttpServletResponse
HttpServletResponse对象是专门用来响应到浏览器的。
3.Servlet类开发
步骤:
(1)继承HttpServlet。
(2)重写doGet方法或者doPost方法。
(3)将Servlet类配置到web.xml文件中。
(4)准备前端页面,form表单指定路径即可。
3.1设置欢迎页面
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
这个路径不需要"/"开始,并且这个路径默认是从webapp的根下开始查找。
启动浏览器,输入:
http://127.0.0.1:8080/servlet07/
3.2关于WEB-INF目录
在WEB-INF目录下的资源是受保护的,在浏览器上不能够直接访问。
3.3HttpServletRequest
-
HttpServletRequest是Tomcat服务器创建的,实际上,当用户发送请求的时候,遵循了HTTP协议,发送的是HTTP的请求协议,Tomcat服务器将HTTP协议中的信息以及数据全部解析出来,然后Tomcat服务器将这些信息封装到HttpServletRequest对象当中,传给我们javaweb程序员。
javaweb程序员面向HttpServletRequest接口编程,调用方法就可以获得请求信息。 -
response对象和request对象只在当前请求中有效。
3.4获取浏览器提交的数据
4.关于请求域对象
4.1 应用域
- 应用域对象是ServletContext对象
- 实际上向应用域存数据,就相当于将数据存储到缓存中,用户需要的时候,直接从缓存中取出,大大提高了效率。
- ServletContext中操作域的方法
4.2 请求域
- 请求域比应用域范围小,生命周期短。请求域只在一次请求中有效。
- 请求域中的操作方法
4.3request对象常用方法
- 跳转
- request对象中的两个方法
- HttpServletRequest方法