SpringBoot 学习系列一(Servlet、Tomcat、JSP)

本文介绍了Servlet的起源,作为Java阵营的CGI解决方案,以及Servlet容器如Tomcat的作用,包括通信支持、生命周期管理、多线程支持和JSP支持。详细阐述了容器处理用户请求的过程,并讨论了Servlet的生命周期。同时,提到了Servlet与JSP的区别和联系,强调JSP是Servlet的简易方式,更适合页面显示,而Servlet更适合逻辑控制。

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

1.servlet的来源

早期的web应用主要用于浏览新闻等静态页面,用户通过HTTP协议请求服务器上的静态页面,服务器上的web服务器软件接收到请求后,读取URI标示的资源,再加上消息报头发送给客户端浏览器,浏览器负责解析HTML,将结果呈现出来。

然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现服务器端软件增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。早期使用的web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。使用这种方法,用户单击某个链接或输入网址来访问CGI程序,web服务器收到请求后,运行该CGI程序 ,对用户请求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给web服务器,web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。

CGI程序在一定 程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,sun公司推出了servlet技术,作为java阵营的CGI解决方案。

2.servlet容器

Servlet 的本质是一个帮助程序,基于java技术的web组件,运行在服务器端,它由servlet容器所管理,用于生成动态的内容。Servlet是平台独立的java类,编写一个servlet,实际上就是按照servlet规范写一个java类。Servlet 被编译为平台独立的字节码,可以被动态地加载支持java技术的web服务器中运行。

Servlet没有main方法,不能独立运行,它必须被部署到servlet容器中,由容器来实例化和调用servlet的方法(如doGet()和doPost()),servlet容器在servlet的生命周期内包容和管理servlet。在jsp技术推出后,管理和运行servlet/JSP的容器也称为web容器

有了servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问servlet,web服务器接收到该请求后,并不是将请求直接交给servlet,而是交给servlet容器。Servlet容器实例化servlet,调用servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由servlet容器返回给web服务器,web服务器包装这个响应,以HTTP响应的形式发送给web浏览器。

2.1 Servlet容器职能

A 、通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立servetsocket,监听某个端口,创建流等等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考虑如何在servlet中实现业务逻辑(如处理一个订单)。

B、生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。

C、多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
声明方式实现安全:利用sevlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。

D、JSP支持:servlet容器负责将jsp代码翻译为真正的java代码。

2.2 容器处理用户请求过程

1)用户点击一个链接,指向一个servlet而不是一个静态页面。

2)web服务器接到这个请求后转发给容器。容器接着创建两个对象:HttpServletRequest和HttpServletResponse。

3)容器根据请求中的URL找到相应的servlet,为这个请求创建一个线程,并把请求对象HtttpServletRequest和响应对象HttpServletResponse传递给这个servlet线程。

4)线程接下来调用service()方法,根据请求的不同,service()方法调用doGet()和doPost()方法。

5)doGet()方法生成动态页面,并把这个页面塞到响应对象里。

6)service()方法结束,随之线程结束,容器把响应对象装换为一个HTTP相应,发送给客户,然后删除请求和响应对象。

3.Servlet的生命周期

注意他的一生都是由容器控制的。servlet一生中只有一个实例出现,但是有多个线程出现。

  • 加载类 Servlet .class文件
  • 实例化 构造函数运行
  • 初始化 容器调用 init() 方法(一生只调一次)
  • service方法? servlet一生主要在这里度过
  • 销 毁? 销毁实例之前调用 destroy() 方法
  • 可回收? 等待垃圾回收等待垃圾回收

init()方法:在servlet实例被创建后调用,可以覆盖此方法做一些初始化的工作,比方说得到一个数据库连接。

service()方法:当客户请求到来时,容器会创建一个新的线程,调用servlet的service()方法

doGet或者doPost()方法:service方法根据请求的HTTP方法,来调用doGet()或者doPost()方法。我们在开发servlet时肯定要覆盖此方法。每次运行doGet()或者doPost()方法,它都在一个单独的线程中。

4.jsp和servlet的区别和联系:

1.JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类

2.JSP更擅长表现于页面显示,servlet更擅长于逻辑控制.

3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.

相同点:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。

不同点:
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

5、servlet demo

1、定义DAO层、Entity层
2、定义Service 层
3、定义Servlet 层
如:定义一个数据删除servlet

public class DeleteServlet extends HttpServlet { // 删除数据
 
	private static final long serialVersionUID = 1L;
 
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
 
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String idStr = req.getParameter("id"); // 删除数据的ID,根据ID删除
		if (idStr != null && !idStr.equals("")) {
			int id = Integer.valueOf(idStr);
			AdminDao dao = new AdminDao();
			dao.deleteAdmin(id);
		}
		req.getRequestDispatcher("ShowServlet").forward(req, resp);
	}
 
}

4、配置web.xml 对servlet 信息,映射关系进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>WebBasic</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-name>DeleteServlet</servlet-name>
		<servlet-class>com.web.tom.servlet.DeleteServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DeleteServlet</servlet-name>
		<url-pattern>/DeleteServlet</url-pattern>
	</servlet-mapping>
</web-app>

6、编写jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示</title>
    <style type="text/css">
            table {
                border: 1px solid pink;
                margin: 0 auto;
            }
            
            td{
                width: 150px;
                border: 1px solid pink;
                text-align: center;
            }
    </style>
</head>
<body>
    <table>
        <tr>
            <td>编号</td>
            <td>帐号</td>
            <td>密码</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${list}" var="item">
            <tr>
                <td>${item.id }</td>
                <td>${item.username }</td>
                <td>${item.userpwd }</td>
                <td><a href="DeleteServlet?id=${item.id }">删除</a>|<a href="UpdateServlet?id=${item.id }">修改</a></td>
            </tr>
        </c:forEach>
        <tr>
            <td colspan="6" style="text-align: left;"><a href="add.jsp">添加管理员</a></td>
        </tr>
    </table>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值