JavaWeb开发基础Servlet API

news/2024/11/16 18:53:26/文章来源:https://www.cnblogs.com/df888/p/18301949

Servlet版本

Oracle将Java EE(Java SE还自己保留)交给开源组织,Eclipse基金会接手。但Oracle不允许开源组织使用Java名号,所以Jakarta EE名称于2018.02.26应运而生。

正是因为组织变化,Servlet被割裂为了2个版本,javax.servletjakarta.servlet

javax.servlet已经停止维护,但它仍然是一个非常有用和重要的技术,特别是在许多现有项目中,学习和使用它将为你提供坚实的Web开发基础。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>

如果希望使用Jakarta EE 9或更高版本的Servlet API,则需要切换到javax.servlet

<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope>
</dependency>

本文将基于javax.servlet来介绍Servlet,从Usages来看,它仍然是使用最广泛的。

Servlet API

Servlet API主要有2个包,javax.servlet包含了servlet和web container使用的接口和类。javax.servlet.http包含了http相关的接口和类。

javax.servlet接口列表:

  1. Servlet
  2. ServletRequest
  3. ServletResponse
  4. RequestDispatcher
  5. ServletConfig
  6. ServletContext
  7. SingleThreadModel
  8. Filter
  9. FilterConfig
  10. FilterChain
  11. ServletRequestListener
  12. ServletRequestAttributeListener
  13. ServletContextListener
  14. ServletContextAttributeListener

javax.servlet类列表:

  1. GenericServlet
  2. ServletInputStream
  3. ServletOutputStream
  4. ServletRequestWrapper
  5. ServletResponseWrapper
  6. ServletRequestEvent
  7. ServletContextEvent
  8. ServletRequestAttributeEvent
  9. ServletContextAttributeEvent
  10. ServletException
  11. UnavailableException

javax.servlet.http接口列表:

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. HttpSessionListener
  5. HttpSessionAttributeListener
  6. HttpSessionBindingListener
  7. HttpSessionActivationListener
  8. HttpSessionContext (deprecated now)

javax.servlet.http类列表:

  1. HttpServlet
  2. Cookie
  3. HttpServletRequestWrapper
  4. HttpServletResponseWrapper
  5. HttpSessionEvent
  6. HttpSessionBindingEvent
  7. HttpUtils (deprecated now)

Servlet接口

Servlet Interface定义了所有servlet必须具有的行为。主要方法如下:

  1. public void init(ServletConfig config) 初始化,只会被web container调用1次

  2. public void service(ServletRequest request, ServletResponse response) 接收请求,返回响应,每次请求都会调用1次

  3. public void destroy() 销毁,只会被web container调用1次

  4. public ServletConfig getServletConfig() Servlet配置

  5. public String getServletInfo() Servlet信息

以下是代码示例:

import java.io.*;
import javax.servlet.*;public class First implements Servlet {ServletConfig config = null;/*** 初始化* @param config*/public void init(ServletConfig config) {this.config = config;System.out.println("servlet is initialized");}/*** 服务* @param req* @param res* @throws IOException* @throws ServletException*/public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello simple servlet</b>");out.print("</body></html>");}/*** 销毁*/public void destroy() {System.out.println("servlet is destroyed");}/*** 配置* @return*/public ServletConfig getServletConfig() {return config;}/*** 信息* @return*/public String getServletInfo() {return "copyright 2007-1010";}
}

GenericServlet类

GenericServlet是个抽象类,实现了Servlet, ServletConfig, Serializable接口,能处理任何请求,支持任何协议。主要方法如下:

  1. public void init(ServletConfig config) 初始化
  2. public abstract void service(ServletRequest request, ServletResponse response) 接收请求,返回响应,每次请求都会调用1次
  3. public void destroy() 销毁,只会被web container调用1次
  4. public ServletConfig getServletConfig() Servlet配置
  5. public String getServletInfo() Servlet信息
  6. public void init() 无参初始化
  7. public ServletContext getServletContext() Servlet上下文
  8. public String getInitParameter(String name) 根据参数name返回value
  9. public Enumeration getInitParameterNames() web.xml所有参数
  10. public String getServletName() Servlet名称
  11. public void log(String msg) 记录Servlet日志
  12. public void log(String msg,Throwable t) 记录Servlet日志和异常堆栈

以下是代码示例:

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class First extends GenericServlet {public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello generic servlet</b>");out.print("</body></html>");}
}  

HttpServlet类

HttpServlet继承了GenericServlet抽象类。主要方法如下:

  1. public void service(ServletRequest req,ServletResponse res) dispatches the request to the protected service method by converting the request and response object into http type.(这里结合英文解释比较清楚,转换类型后,调用第2个service)

  2. protected void service(HttpServletRequest req, HttpServletResponse res) receives the request from the service method, and dispatches the request to the doXXX() method depending on the incoming http request type.(这里结合英文解释比较清楚,根据不同method,调用doXXX()方法)

  3. protected void doGet(HttpServletRequest req, HttpServletResponse res) 处理GET请求,web container调用

  4. protected void doPost(HttpServletRequest req, HttpServletResponse res) 处理POST请求,web container调用

  5. protected void doHead(HttpServletRequest req, HttpServletResponse res) 处理HEAD请求,web container调用

  6. protected void doOptions(HttpServletRequest req, HttpServletResponse res) 处理OPTIONS请求,web container调用

  7. protected void doPut(HttpServletRequest req, HttpServletResponse res) 处理PUT请求,web container调用

  8. protected void doTrace(HttpServletRequest req, HttpServletResponse res) 处理TRACE请求,web container调用

  9. protected void doDelete(HttpServletRequest req, HttpServletResponse res) 处理DELETE请求,web container调用

  10. protected long getLastModified(HttpServletRequest req) 上次修改时间

如果想深入学习Servlet API,可以在Maven pom.xml引入servlet包依赖,External Libraries查看源码。

参考资料:

https://www.javatpoint.com/servlet-api

https://www.javatpoint.com/Servlet-interface

https://www.javatpoint.com/GenericServlet-class

https://www.javatpoint.com/HttpServlet-class

ChatGPT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Elasticsearch实现地理位置、城市搜索服务

最近用到一些简单的地理位置查询接口,基于当前定位获取用户所在位置信息(省市区),然后基于该信息查询当前区域的......提供服务。 然后就自己研究了下GIS,作为一个程序员。自己能不能实现这个功能呢?答案当然是可以。立即开干。 思路:找到数据,写入数据库,利用Elastic…

因子分析法————数据降维

因子分析法通过研究变量间的相关系数矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,起到了很好的降维作用 目录一、因子分析与主成分分析的对比1.原理对比2.作用区别二、因子分析的实例三、因子分析的理论介绍1.因子分析的模型2.模型假设3.因子载荷矩阵的统计意义(…

Python 实现行为驱动开发 (BDD) 自动化测试详解

​在当今的软件开发领域,行为驱动开发(Behavior Driven Development,BDD)作为一种新兴的测试方法,逐渐受到越来越多开发者的关注和青睐。Python作为一门功能强大且易于使用的编程语言,在实现BDD方面也有着独特的优势。那么,如何利用Python实现BDD自动化测试呢?本文将为…

Fenwick Tree

看这篇题解 解释一下是为什么 看蓝书的图,比如\(a_3\)对\(c_8\)的贡献,操作一次,贡献系数为\(1\),然后将\(a_8\)中\(a_3\)的贡献次数改为\(1\),考虑一下操作第二次在干什么,我们是先更新了\(a_3\)对\(c_4\)的贡献,然后让\(c_8\)为\(c_4\)和\(a_8\)(注意这里的\(a_8\)已…

04HTML+CSS

今天开始学了CSS,CSS叫做-层叠样式表。主要是来美化界面的。今日学习内容有 1.CSS的引入方式,CSS的引入方式有三种 内部样式表:学习使用 CSS 代码写在 style 标签里面 l 外部样式表:开发使用 l CSS 代码写在单独的 CSS 文件中(.css)在 HTML 使用 link 标签引入 ,在.CSS文…

ssy中学暑假集训向量学习笔记(完结)

今天模拟赛T4是个极其恶心的东西,用到了许多高中数学知识,md,先引入前置知识。 复数 定义虚数单位\(i\) 满足\(i^2=-1\),复数域\(C\),形如\(a+bi,(a,b\in \mathbb{R})\)的数叫做复数。 复数\(a+bi\)可以在坐标系中表示为\((a,b)\)的向量。 同时复数的加减法满足向量的加减法…

ssy中学暑假集训向量学习笔记(应该能完结)

今天模拟赛T4是个极其恶心的东西,用到了许多高中数学知识,md,引入前置知识。 向量 定义 顾名思义,向量就是有方向的量,在平面直角坐标系上可以用\((a,b)\)表示,图如下:图像上即为由\(A\)指向\(B\)的一条向量。 投影 投影不好解释,拿图吧。\(AC\)在\(AB\)上的投影就是\(…

2023.7.2-3-4Mssql xp_cmdshell提权

1.概念 Mssql和SQL sever的一个产品的不同名称。都属于微软公司旗下。而上述Mssql xp_cmdshell提权也属于数据库提权的一种。 主要依赖于sql server自带的存储过程。 1.1xp_cmdshell提权 扩展存储过程中xp_cmdshell是一个开放接口,可以让sql sever调用cmd命令。 此过程在 SQL …

第二次测试部分题解 (c,d,g)

c-一个欧拉函数模板题1 #include<iostream>2 using namespace std;3 4 int main()5 {6 int n;7 cin >> n;8 int r = n;9 for (int i = 2; i * i <= n; i++) 10 { 11 if (n % i == 0) 12 { 13 r = r / i * (i -…

[随笔]我的创作纪念日

今天,是我开始创作的第256天,哈哈...这刚好是8位无符号二进制的“模”,一个“轮回”。 一些心得和感悟、一些历程与经历、一些收获与体会,大家感兴趣可以看看。历程 我最开始接触这个平台大约是在2020年10月份的时候,那时我正直大三上期,我已经开始备研。附言:黎老师(我…

搭建极狐GitLab(基于Docker): 步骤整合汇总记录

执行背景: (1) CentOS7(虚拟机ISO映像文件=CentOS-7-x86_64-DVD-2009.iso); (2) repo(yum)源已切换为国内源;命令汇总:1. 安装Docker 相关命令: # 查看仓库源中可使用版本 yum list docker-ce --showduplicates | sort -r# 安装指定版本 yum install docker-ce-docker完整版本号…

【待做】【攻防技术系列+权限提升】Windows提权

Windows提权思维导图Windows提权工具 vulmap vulmon开发的一款开源工具,原理是根据软件的名称和版本号来确定,是否有CVE及公开的EXP。这款Linux的工具挺好用,但是对于Windows系统层面不太适用。 windows-exp-suggester 这款和本工具的原理一样,尝试使用了之后,发现它的CVE…