学习记录:跟学servlet笔记

本文是学习Servlet的详细笔记,涵盖了Servlet的基本概念、Servlet容器、Servlet生命周期、创建方式、部署与访问、ServletConfig接口、过滤器Filter和监听器Listener等内容,深入解析了Servlet的工作原理和实际应用。
摘要由CSDN通过智能技术生成

资料:Servlet教程 (biancheng.net)

笔记:有道云笔记

servlet是什么:

Servlat Applet译为“服务器端小程序”,是一套JavaWeb开发的规范,

所有的Servlet功能都是通过一个Servlet的接口向外暴露

servlet提供两个抽象类,GenericServlet,HttpServlet(更常用)

servlet是第一代的JavaWeb开发技术,jsp是第二代的JavaWeb开发技术

jsp允许html代码和jso代码分离

由于用户访问jsp页面时,jsp代码会被翻译成servlet代码,所以jsp是在servlet的基础上做了进一步的封装

jsp代码可以调用servlet类,功能可以在servlet中实现,然后再jsp中调用即可

java Applet 是“客户端小程序”,一般被嵌入到HTML页面

servlet容器是什么:

解释器:分析、编译和执行源代码

部署动态网页一般至少需要三个组件:Web服务器、脚本语言运行时和数据库

Servlet容器就是Servlet代码的运行环境,用来装类和对象

Servlet类没有main函数,所以需要作为一个模块装入Servlet容器,通过容器进行实例化

提供HTTP服务,相当于一个简化的服务器

Tomcat下载和安装:

唯一注意的是java环境要配对,然后更改文件GDK

Tomcat目录结构:

子目录

说明

bin      

命令中心(启动命令,关闭命令……)

conf     

配置中心(端口号,内存大小……)

lib       

Tomcat 的库文件。Tomcat 运行时需要的 jar 包所在的目录。

logs      

存放日志文件。

temp     

存储临时产生的文件,即缓存。

webapps  

存放项目的文件,web 应用放置到此目录下浏览器可以直接访问。

work     

编译以后的 class 文件。

Servlet三种创建方式:

创建 Servlet 类有如下三种方式:

  1. 实现 javax.servlet.Servlet 接口,重写其全部方法。
  2. 继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。
  3. 继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。

Servlet 接口中定义了 5 个方法,下面我们对他们做简单的介绍。

返回值

方法

备注

void

init(ServletConfig config)

Servlet 实例化之后,由 Servlet 容器调用,用来初始化 Servlet 对象。该方法只能被调用一次。

参数 config 用来向 Servlet 传递配置信息。

void

service(ServletRequest req,ServletResponse res)

Servlet 容器调用该方法处理客户端请求。

void

destroy()

服务器关闭、重启或者 Servlet 对象被移除时,由 Servlet 容器调用,负责释放 Servlet 对象占用的资源。

ServletConfig

getServletConfig()

该方法用来获取 ServletConfig 对象,该对象中包含了 Servlet 的初始化参数。

String

getServletInfo()

该方法用于获取 Servlet 的信息,例如作者、版本、版权等。

package net.biancheng.www; import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; public class MyServlet implements Servlet { //Servlet 实例被创建后,调用 init() 方法进行初始化,该方法只能被调用一次 @Override public void init(ServletConfig servletConfig) throws ServletException { } //返回 ServletConfig 对象,该对象包含了 Servlet 的初始化参数 @Override public ServletConfig getServletConfig() { return null; } //每次请求,都会调用一次 service() 方法 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //设置字符集 servletResponse.setContentType("text/html;charset=UTF-8"); //使用PrintWriter.write()方法向前台页面输出内容 PrintWriter writer = servletResponse.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); } //返回关于 Servlet 的信息,例如作者、版本、版权等 @Override public String getServletInfo() { return null; } //Servelet 被销毁时调用 @Override public void destroy() { } }

HttpServlet抽象类:

在 HTTP/1.1 协议中共定义了 7 种请求方式,即 GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。

HttpServlet 针对这 7 种请求方式分别定义了 7 种方法,即 doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()。

所以通过继承HttpServlet类创建Servlet时,只需要重写doGet或者doPost方法

package net.biancheng.www; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //使用PrintWriter.write()方法向前台页面输出内容 resp.setContentType("text/html;charset=UTF-8"); PrintWriter writer = resp.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //使用PrintWriter.write()方法gaifang向前台页面输出内容 PrintWriter writer = resp.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); doGet(req, resp); } }

Servlet的部署和访问:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> </web-app>

web.xml中表示资源路径

创建Servlet项目:

Eclipse创建Servlet项目 (biancheng.net)

@WebServlet注解:

web.xml 的顶层标签 中有一个属性:metadata-complete,该属性用于指定当前 web.xml 是否是完全的。若该属性设置为 true,则容器在部署时将只依赖 web.xml,不配置属性,或将其属性设置为false,则表示启动注解

属性名

类型

标签

描述

是否必需

name

String

指定 Servlet 的 name 属性。

如果没有显式指定,则取值为该 Servlet 的完全限定名,即包名+类名。

value

String[ ]

该属性等价于 urlPatterns 属性,两者不能同时指定。

如果同时指定,通常是忽略 value 的取值。

urlPatterns

String[ ]

指定一组 Servlet 的 URL 匹配模式。

loadOnStartup

int

指定 Servlet 的加载顺序。

initParams

WebInitParam[ ]

指定一组 Servlet 初始化参数。

asyncSupported

boolean

声明 Servlet 是否支持异步操作模式。

description

String

指定该 Servlet 的描述信息。

displayName

String

指定该 Servlet 的显示名。

注意事项:

  • 通过实现 Serlvet 接口或继承 GenericServlet 创建的 Servlet 类无法使用 @WebServlet 注解。
  • 使用 @WebServlet 注解配置的 Servlet 类,不要在 web.xml 文件中再次配置该 Servlet 相关属性。

Servlet生命周期:

Servlet从创建到销毁的过程,

Servlet 容器管理Servlet生命周期,主要分为以下 3 个阶段。

  1. 初始化阶段
  2. 运行时阶段
  3. 销毁阶段

初始化阶段:

  1. 加载和实例化Servlet

读取web.xml或@WebServlet中的配置信息,对指定的Servlet进行加载

Servlet容器通过java的反射API来创建Servlet实例

  1. 调用init()方法进行初始化

调用init()方法进行初始化,init()方法只背调用一次

初始化阶段Servlet实例可以通过ServletConfig对象获取在web.xml或者@WebServlet中配置的初始化参数

运行时阶段:

Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。

Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。

对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象

销毁阶段:

对于每个 Servlet 实例来说,destory() 方法只能被调用一次。

创建 Servlet 实例、init() 方法和 destory() 方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。

load-on-startup元素:控制Servlet启动优先级

load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始化顺序。

load-on-startup 元素取值规则如下:

  1. 它的取值必须是一个整数;
  2. 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载;
  3. 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该 Servlet,取值越小,优先级越高;
  4. 当取值相同时,容器就会自行选择顺序进行加载。
  5. 取负值和默认值时,只有被调用才会被初始化
  6. load-on-startup元素:控制Servlet启动优先级 (biancheng.net)

Servlet虚拟路径映射:

Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上,该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)并不一致,因此它被称为虚拟路径。Servlet 与虚拟路径的对应关系就叫做 Servlet 虚拟路径映射。

Servlet 虚拟路径映射可以被分为 2 类:

  1. 单一映射

Servelt 单一映射是指一个 Servlet 只被映射到一个虚拟路径上。

Servlet 单一映射的实现方式有 2 种:

①使用 web.xml 实现单一映射;

<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping>

②使用 @WebServlet 实现单一映射。

@WebServlet("/MyServlet") or @WebServlet(urlPatterns = "/myServlet")

  1. 多重映射

Servlet 多重映射的实现方式有 3 种:

①配置多个 元素。

<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet2</url-pattern> </servlet-mapping>

②配置多个 子元素。

<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> <url-pattern>/myServlet3</url-pattern> </servlet-mapping>

③在 @WebServlet 的 urlPatterns 属性中使用字符串数组

@WebServlet( urlPatterns = { "/myServlet", "/myServlet4" })

Servlet虚拟路径匹配规则:

若 URL 为“http://localhost:8080/servletDemo/myServlet”,其应用上下文是 servletDemo,容器会将“http://localhost:8080/servletDemo”去掉,使用剩余的“/myServlet”与 Servlet 虚拟路径进行匹配。

Servlet 虚拟路径匹配规则有以下 4 种:

  1. 完全路径匹配
  2. 目录匹配
  3. 扩展
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值