黑马就业班(02.JavaWeb+项目实战\06.Servlet和HTTP+07.Request和Response)——Servlet补充、HTTP协议(请求消息)、Request

本文深入探讨了Servlet的体系结构,介绍了如何配置Servlet以及创建WEB-INF文件夹。此外,文章详细讲解了HTTP请求消息的格式,包括请求行、请求头和请求体,并通过实例演示了如何使用Request对象获取这些信息。最后,讨论了Request对象的功能,如获取请求参数和进行请求转发。
摘要由CSDN通过智能技术生成

今日内容:

1. Servlet
2. HTTP协议
3. Request

1、Servlet补充
  我们前面已经对Servlet做了初步介绍,主要讲了下面5点

1. 概念
2. 步骤
3. 执行原理
4. 生命周期
5. Servlet3.0 注解配置

  下面我们继续对Servlet进行讲解

Servlet的体系结构

Servlet -- 接口
	|
GenericServlet -- 抽象类
	|
HttpServlet  -- 抽象类
* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
	* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。当然,如果有其他需求,就复写其他方法。但是真正开发过程中,我们会使用HTTPServlet

  我们发现导入的源代码文件web目录下没有WEB-INF文件夹,说明之前在创建时候没有把Web Application下的Create web.xml勾选上,我们参考下面这篇文章,为项目添加WEB-INF文件夹。添加WEB-INF

  我们创建一个新的项目,并将端口改为80,这样我们访问的时候不需要输入端口;再设置启动Tomcat不自动访问,同时将项目的虚拟目录设置为项目名(其实勾选让其自动访问比较方便)。启动Tomcat,并访问:http://localhost/TomcatAndServletTest1/demo1(记得将项目虚拟目录名写上),成功访问。
  大多数时候我们只会使用Servlet里面的service方法,其他方法不会使用到,每次都要复写所有方法比较麻烦。可以继承Servlet的子抽象类GenericServlet。

  代码示例

package lkjTest.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class ServletTest1 extends GenericServlet
{
   
    //对于继承GenericServlet的类,只需要重写service方法即可
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException
    {
   
        System.out.println("service connect....");
    }
}

在这里插入图片描述

* HttpServlet:对http协议的一种封装,简化操作
为什么要有这个类?(视频2-9.30):HTTPServlet里面,service方法已经对浏览器请求中的请求方式作出判断,而我们的Servlet如果继承HTTPServlet,就只需要复写HTTPServlet里面的doGet()doPost()方法即可。而Tomcat在接收到客户端的请求后,会先执行HTTPServlet的service方法,HTTPServlet的service方法会根据其判断的请求的方式是get还是post,自动调用我们在自己的类中定义的doGet()doPost()方法。
	1. 定义类继承HttpServlet
	2. 复写doGet/doPost方法
当浏览器访问的Servlet相关类的时候,会调用HTTPServlet实现的service方法,从而判断请求方式,然后service方法根据请求方式,调用我们复写的doGet/doPost方法

代码示例

package lkjTest.servlet;

import com.sun.net.httpserver.HttpServer;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo1")
public class ServletTest1 extends HttpServlet
{
   
    //必须复写doGet与doPost方法

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
   
        System.out.println("doGet.....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
   
        System.out.println("doPost.....");
    }
}
/*
访问:http://localhost/TomcatAndServletTest1/demo1
打印doGet.....
*/

  我们通过浏览器直接访问HTTPServlet的实现类,是使用get()方式访问。

  我们在web文件夹下创建一个表单,通过表单使用doPost方法访问

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
    指定访问地址为/demo1,提交表单的方法是POST
    注意,这里表单action的写法与虚拟目录有关,虚拟目录为“/”,则写为action="/demo1";如果设置了虚拟目录:“/虚拟目录”,写为action="/虚拟目录/demo1"。
    当然,如果这个表单的html文件和其访问的资源在同一个项目内,就不需要写虚拟目录名。一般我们访问某个地址,出现一个html的表单,提交这个表单,访问Servlet。这个Servlet以及表单html,应该在同一个项目内,因此一般不加虚拟目录也没事。
    这部分的说明可以参考下面的说明
    -->
    <form action="/demo1" method="POST">
        <input name="username">
        <input type="submit" value="提交">
    </form>
<hr>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

Servlet相关配置

  urlpartten:Servlet访问路径。在WebServlet注解里面,urlPatterns定义的是一个数组,意味着我们可以为一个Servlet定义多个访问路径,既浏览器可以通过多个路径访问这个类。

一个Servlet可以定义多个访问路径 如: @WebServlet({
   "/d4","/dd4","/ddd4"})
当然,一般情况下只定义一个。

  路径定义规则,既怎么去写urlparttern。

1. /xxx:路径匹配
2. /xxx/xxx:多层路径,目录结构
3. *.do:扩展名匹配

  相应代码如下

package lkjTest.servlet;

import com.sun.net.httpserver.HttpServer;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//@WebServlet({"/d1" , "/d2" , "/d3"}) //定义多个路径,必须通过{}括起来
//发现通过:http://localhost/d1 、 http://localhost/d2 、 http://localhost/d3 三个路径都可以访问ServletTest1类

//多层路径。启动服务器访问,需要把2层路径都写上:http://localhost/user/demo
//@WebServlet("/user/demo")
//@WebServlet("/user/*") //第二层可以写为通配符,那么我们可以随便写第二层路径,如http://localhost/user/haah,都可以访问到
//@WebServlet("/*") //写什么都可以访问到。
//这个时候,如果我们在其他Servlet类中设置类的资源目录为demo,那么这个时候我们访问demo,会先访问其他Servlet类,最后找不到才访问通配符(通配符优先级低)
@WebServlet("*.do")  //写任意路径.do即可访问,如:http://localhost/demo.do
public class ServletTest1 extends HttpServlet
{
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
   
        System.out.println("doGet.....");
    }
}

2、HTTP
  HTTP相关的概念如下:

* 概念:Hyper Text Transfer Protocol 超文本传输协议
* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式。如下图,超文本传输协议规定了请求消息与响应消息的组成格式。
* HTTP百度百科:http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
* 特点:
	1. 基于TCP/IP的高级协议
	2. 默认端口号:80。比如我们要访问某个域名:http://www.haha.com:80,必须指定要访问的端口号,如果我们把Tomcat服务器端口设置为80,那么访问的时候域名也可以不写80端口。(Tomcat与客户端基于HTTP协议,HTTP的默认端口是803. 基于请求/响应模型的:一次请求对应一次响应
	4. 无状态的:每次请求之间相互独立,不能交互数据

* 历史版本:
	* 1.0:每一次请求响应都会建立新的连接
	* 1.1:复用连接
每次我们访问一个页面,可能有多次请求,每一张图片,每一个JS或者CSS模块,都是一个请求(F12-newwork-刷新,可以查看这个页面相应向服务器发送的请求)

OSI七层模型1-7(低到高) 1.物理层 2.数据链路层:ppp点对点协议 CSMA/CD 3.网络层:IP协议,地址解析协议ARP,网际控制报文协议ICMP,路由信息协议,RIP 4.运输层:用户数据报协议UDP,传输控制协议TCP 5.会话层 6表示层 7.应用层:文件传输协议FTP,HTTP,SMTP,

在这里插入图片描述

HTTP请求消息数据格式

  HTTP请求消息的格式:包括4个部分:请求行,请求消息头、请求空行、请求体。

1. 请求行
	请求方式  请求url  请求协议/版本
	个:以get方式请求login.html信息:GET /login.html	HTTP/1.1

	* 请求方式:
		* HTTP协议有7中请求方式,常用的有2种(get、post、put、delete、head、trace、opinions)
			* GET:
				1. 请求参数在请求行中,在url后。
				2. 请求的url长度有限制的
				3. 不太安全
	eg:使用GET提交,我们将表单提交后,地址栏信息为:http://localhost/demo?username=zhangsan ,既请求参数会放在请求行中(注意,这里不是访问login.html的请求,而是通过login.html访问/demo类的请求。虚拟目录设置为"/"* POST:
				1. 请求参数在请求体中
				2. 请求的url长度没有限制的
				3. 相对安全
	eg:使用POST提交,我们表单提交后,地址栏信息为:http://localhost/demo ,既请求参数会放在请求体中(这里同样是通过login.html访问/demo类的请求。虚拟目录设置为"/")
	
	下面我们以get提交方式说明表单action的路径应该怎么填写的问题。
说明:我们都是在login.html中访问requestDemo2类。

(为什么即使2个资源在项目内部,有虚拟目录要加虚拟目录?因为项目内资源的跳转是通过重定向的方式,第二次访问的请求也是从浏览器发出的,必须加上项目的虚拟目录才能访问到项目!!!)

1) 在IDEA中将虚拟目录设置为“/”,将表单的action设置为:/requestDemo2
访问login.html的路径是:http://localhost:8080/login.html,提交login.html表单后访问/requestDemo2类,地址栏信息为:http://localhost:8080/requestDemo2?username=zhangsan

2) 在IDEA中将虚拟目录设置为“/ResponsePro”,将表单的action设置
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值