Java学习笔记:Servlet

2023-11-15

JavaWeb三大组件:Servlet,Filter(过滤器),Listener(监听器)

 

Servlet生命周期:

1,初始化阶段

调用init()方法

2,响应客户请求阶段

调用service()方法

3,终止阶段

调用destroy()方法

 

生命周期的各个阶段:

            实例化:Servlet容器创建Servlet类的实例对象

            初始化:Servlet容器调用Servlet的init()方法

            服务:如果请求Servlet,则容器调用service()方法

            销毁:销毁实例之前调用destroy()方法

            不可用:销毁实例并标记为垃圾处理

 

Servlet的实现方法:

  1. 实现 javax.Servlet.Servlet 接口
  2. 继承 javax.Servlet.GenericServlet
  3. 继承 avax.Servlet.HTTPServlet

 

Servlet中的方法绝大多数不是由我们来调用,而是由Tomcat调用,Servlet的对象也不由我们来实现。

1void        init(ServletConfigconfig) :

创建Servlet的实例后对其进行初始化。实现ServletConfig接口的对象作为参数进行传递。init方法在浏览器请求servlet或webserver启动时加载运行。这个方法只调用一次。

2.void        service(ServletRequestreq, ServletResponse res) :

响应客户端发出的请求。Service()方法接受ServletRequest接口和ServletResponse接口的对象来处理请求和发送响应。这个方法调用多次。

3.void        destroy():

如果不需要处理的请求,则释放Servlet实例。这个方法只调用一次。

 

Servlet是线程不安全的

Servlet中不要创建成员变量,创建局部变量即可。

可以创建无状态成员。

可以创建成员变量,但要是只读的。

 

ServletRequest:

对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给ServletService方法,ServletRequest封装了关于这个请求的信息。

int

getContentLength()

返回请求主体的字节数,如果不知道字节长度,就会返回-1

java.lang.String

getContentType()

返回请求主体的MIME类型,如果不知道类型会返回null

java.lang.String

getParameter(java.lang.String name)

返回请求指定参数的值,通常用于返回HTML表单域中的值

java.lang.String

getProtocol()

返回这个HTTP请求的协议名称和版本

 

ServletResponse:

表示一个Servlet响应,在调用Servlet中的Service()方法前,Servlet容器会先创建一个ServletResponse,并将它作为第二个参数传入Service()方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。

通常使用getWriter方法,它返回来一个可以向客户端发送文本的java.io.PrintWriter,默认情况是使用ISO-8859-1编码,大多数情况是将他作为HTML发送的。

 

ServletConfig

Servlet容器初始化Servlet时,Servlet容器会给init()方法传入一个ServletConfig

一个ServletConfig对象对应一段web.xmlServlet的配置信息,一个初始参数有keyvalue两个原件。

java.lang.String

getInitParameter(java.lang.String name)

通过名称获取指定初始化参数的值

java.util.Enumeration<java.lang.String>

getInitParameterNames()

获取所有初始化参数的名称

ServletContext

getServletContext()

获取Servlet上下文对象

java.lang.String

getServletName()

获取的是<Servlet-name>的内容

 

web.xml中配置初始化参数

<servlet>内部的初始化参数

<servlet>…

<init-param>

<param-name>参数名</param-name>

<param-value>参数值</param-value>

</init-param>

…</servlet>

公共的初始化参数

<context-param>

<param-name>context-name</param-name>

<param-value>context-value</param-value>

</context-param>

 

ServletContext:

Java Web 四大域对象:

ServletContext  PageContext ServletRequest  HTTPSession

一个项目只有一个ServletContext对象。

可以通过多个Servlet中获得这个唯一的对象,使用它可以给多个Servlet传递数据,这个对象在Tomcat启动时创建,在Tomcat关闭时才会销毁。

通过context获取资源路径

绝对路径:this.getServletContext().getRealPath("/index.jsp");

相对路径:this.getServletContext().getResourcePaths("/WEB-INF");

获取流:this.getServletContext().getResourceAsStream("/index.jsp");

通过context获得公共的初始化参数:

this.getServletContext().getInitParameter("context-name");

 

GenericServlet:

GenericServlet是实现了ServletServletConfig的抽象类。

GenericServlet通过将ServletConfig赋给init方法中的类级变量ServletConfig来保存ServletConfig

publicvoid init(ServletConfig servletConfig)throws ServletException{

this.servletConfig = servletConfig;

this.init();

}

publicvoid init() throws ServletException{

 

}

可以通过覆盖没有参数的init方法来编写初始化代码,ServletConfig则仍然作为GenericServlet实例保存。

 

HTTPServlet:

HttpServlet类覆盖了javax.servlet.GenericServlet类。

ServletService(ServletRequest,ServletResponse)参数强转为HTTPServletService(HTTPServletRequest,HTTPServletResponse)

然后HttpServlet中的Service方法会检验用来发送请求的HTTP方法(通过调用request.getMethod),并调用以下方法之一:doGetdoPostdoHeaddoPutdoTracedoOptionsdoDelete。因此不需要在覆盖Service方法,只用覆盖doGetdoPost等即可。

使用HttpServletRequestHttpServletResponse,而不是ServletRequestServletResponse

 

HttpServletRequest

新增的方法:

java.lang.String

getContextPath()

返回表示请求上下文的请求URI部分

Cookie[]

getCookies()

返回一个Cookie对象数组

java.lang.String

getHeader(java.lang.String name)

返回指定HTTP标题的值

java.lang.String

getMethod()

返回生成这个请求的HTTP方法名称

java.lang.String

getQuertyString()

返回请求URL中的查询字符串

HttpSession

getSession()

返回与这个请求有关的会话对象,如果没有,将创建一个新的会话对象

HttpSession

getSession(boolean create)

返回与这个请求相关的会话对象,如果有,并且create参数为True,将创建一个新的会话对象

 

HttpServletResponse

void

addCookie(Cookie cookie)

给这个响应对象添加一个cookie

void

addHeader(java.lang.String name,java.lang.String value)

给这个响应对象添加一个header

void

sendRedirect(java.lang.String location)

发送一条响应码,将浏览器跳转到指定的位置

 

随服务器开启时创建Servlet

<load-on-startup>0</load-on-startup>

根据数字进行排序分先后

 

<url-pattern><servlet-mapping>的子元素,用来指定Servlet的访问路径,即URL,必须以“/”开头。

可以给出多个<url-pattern>,可以使用通配符 *

<url-pattern>/Servlet/*</url-pattern>

<url-pattern>*.do</url-pattern>

<url-pattern>/*</url-pattern>

通配符要么前缀要么后缀,不能出现在中间,也不能只有通配符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java学习笔记:Servlet 的相关文章

  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完

随机推荐

  • python startswitch_在python中映射开关列表

    cmap s0 c0 s1 c1 s2 c1 class MultiSwitch OVSSwitch Custom Switch subclass that connects to different controllers def sta
  • 关于 ‘builtin_function_or_method‘ object has no attribute ‘set_colorkey‘和 No video mode has been set解释

    在加载一个图片文件的时候 convert没有加上括号 在后面调用的时候 好像就不能识别这个图片文件了 错误写法 player img pygame image load os path join img folder ji jpg conv
  • 算法可视化工具

    转载源地址 一 学算法必去的一个网站 首先有一个网站那是每一个学习数据结构与算法都必须去的网站 说出来你就知道了 那就是大名鼎鼎的LeetCode 链接直达 https leetcode com 中文版长这个样子的 点开探索给你看看 强烈推
  • 数组的创建与使用(1、创建一个 int 类型数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100;2、实现一个方法 printArray;3、实现一个方法 transform。)

    一 创建一个 int 类型数组 元素个数为 100 并把每个元素依次设置为 1 100 import java util Arrays public class Test public static void main String arg
  • Vue 3 中的 Fragments 是什么?如何使用它

    Vue 3 中的 Fragments 是什么 如何使用它 在 Vue 3 中 引入了一个新的特性叫做 Fragments 它为我们提供了一种更简洁的方式来组合多个子元素 而无需额外的包裹元素 Fragments 可以让我们在不引入多余 DO
  • 14-Scala之隐式转换

    1 为什么要隐式转换 我们经常引入第三方库 但当我们想要扩展新功能的时候通常是很不方便的 因为我们不能直接修改其代码 scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题 Scala中的隐式转换是一种非常强大的代码查找机制 当函数
  • python 参数值等于None怎么用

    def test query m None m string 看了下 一般都这样写 如果is None时候初始化下 if m is None m return query m if name main 既支持这样 query 辛弃疾 pri
  • 软件测试常见的风险,软件测试中常见的风险分析

    在软件测试或者App测试工作中 主要的风险表现有以下几点 1 需求风险 对软件需求理解不准确 导致测试范围存在误差 遗漏部分需求或者执行了错误的测试方式 另外需求变更导致测试用例变更 同步时存在误差 2 测试用例风险 测试用例设计不完整 忽
  • RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.a += torch.o

    叶子节点不能执行in place 原地 操作 因为在进行前向传播的时候得到的是叶子结点的地址 再进行反向传播的时候这个地址不变才不会报错 地址改变了就会出错 要将 a torch ones 1 改为 a a torch ones 1 另外下
  • 计算机断电无法启动不了系统,电脑突然断电后无法启动怎么回事

    使用电脑的时候 总是会避免不了各种意外的事情 比如常见的电脑突然断电的情况 然后就会关机 可是关机之后就无法开机了 这是怎么回事呢 那么遇到电脑突然断电后无法启动如何解决呢 不用担心 本文给大家讲述一下电脑断电关机后无法开机的详细修复步骤
  • 用c语言实现顺序查找,顺序查找算法及C语言实现

    通过前面对静态查找表的介绍 静态查找表即为只做查找操作的查找表 静态查找表既可以使用 虽然一个是本节以静态查找表的顺序存储结构为例做详细的介绍 顺序查找的实现 静态查找表用顺序存储结构表示时 顺序查找的查找过程为 从表中的最后一个数据元素开
  • Java实现哈希函数/散列算法

    哈希函数 散列算法 根据某个值进行hash值计算 确保唯一性 public class HashUtils private static final String ALGORITHM SHA 256 public static String
  • Java基本类型所占存储空间大小

    基本类型 大小 最小值 最大值 包装器类型 boolean Boolean char 两个字节 Unicode 0 Unicode 2 16 1 Character byte 一个字节 128 127 Byte short 两个字节 2 1
  • daily technology

    Trending repositories on GitHub today GitHub The Hacker News Cybersecurity News and Analysis HackerNews Pxlet Yet anothe
  • 四数之和——python

    18 四数之和 难度中等997 给你一个由 n 个整数组成的数组 nums 和一个目标值 target 请你找出并返回满足下述全部条件且不重复的四元组 nums a nums b nums c nums d 若两个四元组元素一一对应 则认为
  • 学习使用 MATLAB 数学建模一篇文章就够了

    学习中 随着学习的深入会不断补充内容 欢迎大家一起学习数学建模知识 有什么问题 大家可以评论 一起讨论学习 需要LaTeX 数学建模模板和我收集的一些数学建模资料的可以评论留下邮箱 与君共勉 文章目录 一 MATLAB 知识学习 二 数学建
  • 剖析高性能队列Disruptor背后的数据结构和算法

    本文是学习算法的笔记 数据结构与算法之美 极客时间的课程 Disruptor 是一种内存消息队列 它经Java 中另外一个非常常用的内存消息队列 ArrayBlockQueue ABS 的性能 要高出一个数量级 可以算得上是最快的内存消息队
  • 深入浅出UML类图(五)

    实例分析3 售票机控制程序 某运输公司决定为新的售票机开发车票销售的控制软件 图I给出了售票机的面板示意图以及相关的控制部件 图I 售票机面板示意图 售票机相关部件的作用如下所述 1 目的地键盘用来输入行程目的地的代码 例如 200表示总站
  • 1063. 计算谱半径(20)

    在数学中 矩阵的 谱半径 是指其特征值的模集合的上确界 换言之 对于给定的n个复数空间的特征值 a1 b1i an bni 它们的模为实部与虚部的平方和的开方 而 谱半径 就是最大模 现在给定一些复数空间的特征值 请你计算并输出这些特征值的
  • Java学习笔记:Servlet

    JavaWeb三大组件 Servlet Filter 过滤器 Listener 监听器 Servlet生命周期 1 初始化阶段 调用init 方法 2 响应客户请求阶段 调用service 方法 3 终止阶段 调用destroy 方法 生命