【Java web】HttpServlet

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方法
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值