java servlet http_javaWeb(Servlet和HTTP请求总结)

本文介绍了JavaWeb中的Servlet及其实现方式,并深入探讨了Servlet的生命周期与配置方法。同时,文章还讲解了HTTP协议的基本概念及其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javaWeb——Servlet和HTTP请求协议

一.Servlet

servlet:serve applet,即运行在服务器端的小程序,他是一个接口定义了浏览器来访问服务器(我们使用Tomcat)端java类的规则。那么在实际开发中我们只需要定义一个类来实现servlet即可。

接下来我们开始演示。

1.环境配置

0ebca8112c5c2f0e191425141aa2cdca.png

0f40f9794439bd606fadd229d0fb14d9.png

tomcat软件包如下:

链接:https://pan.baidu.com/s/1Ja9aONgEEbQeyYCwQK2fwg

提取码:aud6

安装Tomcat可以参考这篇文章:Tomcat安装版 安装教程

然后配置Tomcat,可以参见这篇文章:idea配置tomcat的方法(详细图文步骤)

2.案例入门

7bd4b8fac3fa2b1692e30ea37f781cbd.png

接下来实现Servlet接口并实现他的所有方法。

package web.servlet;

import javax.servlet.*;

import java.io.IOException;

public class ServletDemo implements Servlet {

@Override

public void init(ServletConfig servletConfig) throws ServletException {

System.out.println("init");

}

@Override

public ServletConfig getServletConfig() {

System.out.println("config");

return null;

}

@Override

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

System.out.println("service");

}

@Override

public String getServletInfo() {

System.out.println("Info");

return null;

}

@Override

public void destroy() {

System.out.println("destroy");

}

}

接着配置一下Tomcat:

ff87dd48bb39948f544b9770a1554d49.png

d39c1909484f311b60763465a274e34d.png

a56d999c188a30477fe6ea95e98d566e.png

dfc211391f96a41b683ad731600bc57f.png

tomcat端口号默认时8080,如果改为80则表示在使用http协议访问时不需要去显式的写端口号。然后我们需要在web.xml文件里面配置映射。

demo

web.servlet.ServletDemo

demo

/demo

现在我们把服务器打开

在浏览器地址栏输入:

http://localhost:8080/demo

因为上面web.servlet.ServletDemo映射为了/demo,最后访问时相当于在

http://localhost:8080补上/demo就是访问了ServletDemo类

a61bfe894dea48a214fe11e45e9c7b0e.png

上面的结果我们看到出现了init,在访问时Tomcat会创建ServletDemo对象(但是只会创建一次,因为servlet是单例的,这一过程通过反射实现),此时会执行init方法,接着再去执行service方法,之后在访问就不会执行init方法了,而是直接执行service方法,当关闭服务器时就会执行destroy方法,但也只执行一次。

那么这一过程是如何实现的呢?

首先浏览器会去解析http://localhost:8080/demo,读取到http://localhost:8080,于是就找到了服务器的运行端口,接下来就去在web.xml文件里面去寻找/demo于是定位到了web.servlet.ServletDemo,接下来就是上面的ServletDemo对象的创建以及方法的调用了。

3.servlet的生命周期详解

1.创建对象

默认情况下,servlet是在第一次被访问是创建,但是我在这里教给大家如何去修改。

在标签下面有一个标签:

17d99792e68b1cd0d2503a23e512a4a1.png

在这个标签里面写数字,可以指定Servlet被创建的时机。

①为负整数数代表第一次访问时创建

②0或正整数表示在服务器启动时被创建

但是Servlet只会被创建一次,那么如果有多个线程来访问怎么办?那么这时不要再Servlet里面定义成员变量就可以避免线程安全的问题。

2.Service方法的执行

每次被访问都会执行一次

3.destroy

服务器关闭(要正常关闭),先执行destroy再销毁servlet,即他在Servlet销毁前夕执行。

4.servlet注解配置

这一方式在Servlet3.0以后才被支持。

前面我们的映射配置都是在xml里面配置的。现在使用注解来配置。

我们需要把之前的web.xml的添加内容删除掉,否则会报错。

5b04d151a803ab6726cbb78743e96f5e.png

5207ae36d2d40beba1b348f82677dcc1.png

上面第一种方式是省略的写法(因为@WebServlet有一个方法value,当只有一个方法需要赋值时且是value可以省略方法名,而在这里value相当于取代了url-Patterns)。

接着再去访问:

a61bfe894dea48a214fe11e45e9c7b0e.png

下面再补充一下我们如果想访问我们的WEB-INF下的资源,是不可以的,需要我们认为用代码去实现,那么不想添麻烦就直接写在非src目录下的web目录下面,比方那个Index.jsp就是如此。

5.Servlet的体系结构

Servlet -- 接口

|

GenericServlet -- 抽象类

|

HttpServlet -- 抽象类

GenericServlet 讲Servlet的方法都做了空实现,但我们开发不会用这个,而是HttpServlet,也就是说今后我们不要再去实现Servet了,就直接继承HttpServlet即可,我们在提交表单的时候一般有两种方式Get,Post(也有其他的,不常用),那么HttpServlet有两种方法可以帮助我们去区分方式来执行相应的方法。

关于HttpServlet使用方法如下:

定义类继承HttpServlet

复写doGet/doPost方法

6.Servlet路径配置的方式

1.并列多名

78152762d1decc35fe94895585bdea28.png

表示下面三个路径都可以成功访问:

http://localhost:8080/a

http://localhost:8080/b

http://localhost:8080/c

2./XX型

前面的演示已经体现过了。

3./XX/XX型

77c8a86659be65f3bbd0a0c6b32f059c.png

表示下面路径可以成功访问:

http://localhost:8080/user/a

8104794bcd9cde8ba89e9e502ad2d362.png

表示下面路径可以成功访问:

http://localhost:8080/user/hkaksnak

即user后面随便写

4d222d79c79e6fc2d19f7fca1a63bba5.png

表示下面路径可以成功访问:

http://localhost:8080/hkaksnak

即8080后面随便写

4.*.XX型

7f9c3f75337a386c52eb82f0ea1a0b2c.png

表示下面路径可以成功访问:

http://localhost:8080/sajsja.do

即.do前面随便写

当然@WebServlet那里不一定是写do随便写什么都可以

最后需要强调一点就是如果你现在有两个Servlet

ServletDemo1

ServletDemo2

如果他们的映射路径一样比方都是demo可以吗,在启动服务器时会报错,那如果一个/*一个/demo呢?

http://localhost:8080/demo回访问/demo的那个而不是/*的那个(虽然也匹配了),这是优先级决定的。

二.Http协议

概念:Hyper Text Transfer Protocol 超文本传输协议

* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式

* 特点:

1. 基于TCP/IP的高级协议

2. 默认端口号:80

3. 基于请求/响应模型的:一次请求对应一次响应

4. 无状态的:每次请求之间相互独立,不能交互数据

有关历史版本:

1.0:每一次请求响应都会建立新的连接

1.1:复用连接

1.请求消息

0b639dd0500c2422321756d7ee05e3c7.png

右下方那里便是请求消息与响应消息,这里我们先讲请求消息。

1.请求行:

d0e19ba109a4d35c792c1603f8f0260f.png

2.请求头:

efc407273f15ec718ce4a8ac2bf3686e.png

3.请求空行与请求体

这个是针对Post请求而言的。请求体就是指在提交表单后里面的数据对,比方有个输入框,其name属性为username,而你填写的是jack,那么请求体就有username:jack,那么请求空行就是一个空行用来隔开请求头与请求体。

最后我们来比较一下post与get以及需要记住的请求头。

Get

1. 请求参数在请求行中,在url后。

2. 请求的url长度有限制的

3. 不太安全

POST:

4. 请求参数在请求体中

5. 请求的url长度没有限制的

6. 相对安全

这里的请求参数就是上面说的username:jack这样的数据

* 常见的请求头:

1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

2. Referer:http://localhost:8080/index.jsp

* 告诉服务器,我(当前请求)从哪里来?

2.响应消息(更新中)

本文地址:https://blog.csdn.net/qq_44932835/article/details/107073707

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值