Servlet知识点详细讲解及实现

Servlet实现详细讲解

1.Servlet概念及特点

  • Servlet是Server Applet的缩写,是服务端小程序的意思。使用Java语言编写的服务器端程序,主要功能在于交互式地浏览和生成数据,生成动态Web内容,Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准来开发的类。是SUN公司提供的一门用于开发动态Web资源的技术。(言外之意:要实现web开发,需要实现Servlet标准)
  • Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如Tomcat)。(言外之意:写自己的类,不用写main方法,别人自动调用)
  • Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。这也是Servlet应用广泛的原因之一。
  • 提供了Servlet功能的服务器,叫做Servlet容器,其常见容器有很多,如Tomcat, Jetty,WebLogic Server, WebSphere, JBoss等等。

2.Servlet实现步骤

1)创建动态web项目

servlet1.PNG

2)新建类

servlet2.PNG#### 3)实现Servlet规范

  • 实现 Servlet 规范,即继承 HttpServlet 类,并导入相应的包,该类中已经完成了通信的规则,我们只需要进行业务的实现即可
packagecom.mage.web;

import javax.servlet.http.HttpServlet;

public class HelloWeb extends HttpServlet{
    
}
4)重写HttpServlet中的方法
  • 满足Servlet规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以及进行业务逻辑处理,计算出结果,则需要添加代码,在规范中有一个叫做service的方法,专门用来做请求处理的操作,业务代码则可以写在该方法中。
packagecom.mage.web;

import java.io.IOException;
import javax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;

public class HelloWeb extends HttpServlet{
    @override
  	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("Ireceivedarequest");
    resp.getWriter().write("<h1>HelloWorld!</h1>"); 
    }  
}
5)配置web.xml
  • 在完成好了一切代码的编写后,还需要向服务器说明,特定请求对应特定资源,此时通过一个名叫web.xml的配置文件完成。
<!--配置servlet-->
<servlet>
	<servlet-name>helloweb</servlet-name><!--给服务器看的-->
	<servlet-class>com.mage.web.HelloWeb</servlet-class><!--servlet对应的资源路径-->
</servlet>
<servlet-mapping>
	<servlet-name>helloweb</servlet-name><!--给服务器看的-->
	<url-pattern>/helloweb</url-pattern><!--给浏览器看的,对外访问路径-->
</servlet-mapping>

Servlet3.PNG

6)发布项目
  • 到此,需要编写和配置的地方已经完成,项目已经完整了,但是如果需要外界能够访问,还需要将项目发布到服务器上并运行服务器

servlet4.PNG
servlet5.PNG

servlet6.PNG

7)启动项目

servlet7.PNG

注意:看到类似一长串信息表示启动成功,接下来就可以访问项目了

servlet8.PNG

8)访问并查看结果

在项目正确发布到服务器上之后,用户即可通过浏览器访问该项目中的资源。注意 url 的格式正确,tomcat 的端口为 8080。http://localhost:8080/hw/helloweb,

页面结果如下

servlet9.PNG

后台结果如下

servlet10.PNG

到这里我们的第一个 Servlet 就实现了!

3.Servlet工作原理

i.工作原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zcaLxrtw-1576286614645)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576247148050.png)]

ii.执行过程
  • 客户端发出请求根据 web.xml 文件的配置,找到对应的 url-pattern 读取其中的值,找到对应的servlet-name,找到指定的 class 并加载执行该 class,返回结果由 Web 服务器将结果响应给客户端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vd8uxQLS-1576286614646)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576247260798.png)]

4.Servlet的声明周期

定义:Servlet 没有 main() 方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、并何时销毁其实例的整个过程。(此处讨论默认的生命周期)

  • 实例和初始化时机
    当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。
  • 就绪/调用/服务阶段
    有请求到达容器,容器调用 servlet 对象的 service() 方法,处理请求的方法在整个生命周期中可以被多次调用;
      HttpServlet 的 service() 方法,会依据请求方式来调用 doGet() 或者 doPost() 方法。但是,这两个do 方法默认情况下,会抛出异常,需要子类去 override。
  • 销毁时机
    当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁

注意:上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周期方法,不由用户手动调用,而是在特定的时机由容器自动调用,观察这三个生命周期方法即可观察到 Servlet的生命周期 。

(1)init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)

public void init(ServletConfig config) throws ServletException {
	System.out.println("有实例创建了");
}

(2)service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该 Servlet 进行服务了)

protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
	System.out.println("服务调用了");
}

(3)destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)

public void destroy() {
	System.out.println("有实例被销毁了");
}

Servlet 的生命周期,简单的概括就分为四步:servlet 类加载→实例化→服务→销毁。下面我们描述一下 Tomcat 与 Servlet 是如何工作的,看看下面的时序图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkTJHuEG-1576286614646)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1576247997493.png)]

1、Web Client 向 Servlet 容器(Tomcat)发出 Http 请求

2、Servlet 容器接收 Web Client 的请求

3、Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象中

4、Servlet 容器创建一个 HttpResponse 对象

5、Servlet 容器调用 HttpServlet 对象的 service 方法,把 HttpRequest 对象

与 HttpResponse 对象作为参数,传给 HttpServlet 对象

6、HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息

7、HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据

8、Servlet 容器把 HttpServlet 的响应结果传给 Web Client

5.Servlet的配置

  • Servlet 除了配置基本的访问信息,还可以配置初始化参数,自启动等,并且一个 Servlet 可以配置多个访问路径,还可以使用通配符“*”。

基本配置

<servlet>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<servlet-class>com.mage.web.HelloWeb</servlet-class><!-- servlet对应的资源路径-->
</servlet>
<servlet-mapping>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<url-pattern>/helloweb</url-pattern><!-- 给浏览器看的,对外访问路径 -->
	<url-pattern>/*</url-pattern>
</servlet-mapping>

初始化参数:

<servlet>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<servlet-class>com.mage.web.HelloWeb</servlet-class><!-- servlet对应的资源路径-->
	<!-- 初始化参数 -->
	<init-param>
		<param-name>param1</param-name>
		<param-value>1</param-value>
	</init-param>
	<init-param>
		<param-name>param2</param-name>
		<param-value>2</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<url-pattern>/helloweb</url-pattern><!-- 给浏览器看的,对外访问路径 -->
	<url-pattern>/*</url-pattern>
</servlet-mapping>

自启动 :

<servlet>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<servlet-class>com.mage.web.HelloWeb</servlet-class><!-- servlet对应的资源路径-->
	<!-- 初始化参数 -->
	<init-param>
		<param-name>param1</param-name>
		<param-value>1</param-value>
	</init-param>
    <init-param>
		<param-name>param2</param-name>
		<param-value>2</param-value>
	</init-param>
	<!-- 自启动 -->
	<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>helloweb</servlet-name><!-- 给服务器看的 -->
	<url-pattern>/helloweb</url-pattern><!-- 给浏览器看的,对外访问路径 -->
	<url-pattern>/*</url-pattern>
</servlet-mapping>

servlet-name:Servlet 对象的名称

servlet-class:创建 Servlet 对象所要调用的类

param-name:参数名称

param-value:参数值

load-on-startup:Servlet 容器启动时加载 Servlet 对象的顺序

servlet-mapping/servlet-name:要与 servlet 中的 servlet-name 配置的内容对应

url-pattern:客户访问的 Servlet 的相对 URL 路径

说明:url-pattern 可以配多个(一个 servlet 可以通过多个 url-pattern 访问)当多个 servlet 配置成
了同一个 url-pattern,报错 java.lang.reflect.InvocationTargetExceptionion;通配符“*”只能放在最前
面或最后面,不能放中间且不能单独存在(以/分割的,不能和单词组成整体),数字越精确越优先。常规
配置即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QZP51ZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值