servlet基础_Servlet基础

servlet基础

通过本教程,我将尝试使您更接近Java Servlet模型。 在检查servlet规范中定义的类之前,我将解释在开始开发Web应用程序之前需要了解的基本知识。

了解Java Servlet模型

首先,不仅为基于请求和响应编程模型的规范的Web应用程序定义Java Servlet模型。 但基本上,它最常用于与HTTP协议交互,因此从现在开始,我们将不再在HTTP应用程序中使用servlet模型。

基本上,Web应用程序应该是放置在Web上某个位置的应用程序,并且可以通过网络对其进行访问。 如果您需要更多信息并更好地定义“什么是Web应用程序”,则可以访问下一个链接: Web应用程序 。

如果我们要创建一个Web应用程序,我们应该有一个Web服务器,它可以是任何带有包含Web容器的HTTP服务器,例如Tomcat。 HTTP服务器负责处理客户端请求,安全性,向客户端提供内容等服务,但是HTTP服务器无法动态创建对客户端的响应,他可以提供静态内容。 解决此问题的方法是Web容器。 容器能够托管Web应用程序,HTTP服务器会将请求传递到将处理请求的Web容器。 通常,每个服务器只有一个容器。 服务器上的所有Web应用程序都由此容器提供服务。

Web容器内部的所有通信都是通过Web容器接口实现的。 这意味着一个应用程序不能直接访问另一个应用程序。 同样,一个应用程序内部的组件不能直接相互访问,同一应用程序中组件之间的所有通信都是使用Web容器接口实现的。 这对于理解Web应用程序在Web容器中的工作方式非常重要,它允许创建过滤器,侦听器,并允许使用Web容器的安全性功能。

战争应用结构

按照规范,Java Web应用程序打包在war程序包中。
War软件包与jar软件包相同,但是当Web容器在deploy文件夹中找到war文件时,它将假定它是一个Web应用程序并尝试启动它。

在war软件包中,我们有一个特殊的目录,称为WEB-INF。

该文件夹的内容不直接提供给用户。 该文件夹包含文件夹类和lib,我们可以在其中放置应用程序使用的类(classes文件夹)和其他jar(lib文件夹)。 这些文件夹的内容将由类加载器自动读取,而无需对类路径进行任何其他设置。 此外,该文件夹还包含web.xml文件,称为部署描述。 如果Web应用程序仅包含jsp页面,则不需要此文件,但是如果应用程序需要具有servlet或过滤器,则必须定义此文件。

Servlet生命周期

在servlet存在的过程中,它经历了五个生命周期:

  • 装货
  • 实例化
  • 初始化
  • 服务
  • 破坏

加载是类加载器加载类的阶段。 每个Web应用程序将获得一个不同的类加载器实例,这些实例将用于加载Web组件。 这允许在同一个容器中部署同一应用程序的两个版本,并且每个应用程序都可以具有相同名称的类(完整类名)。

加载后,Web容器将尝试实例化类(即创建类的新实例)。 通常每个Web组件仅创建一次,但这取决于Web容器的行为,在某些情况下,可以将Web容器设置为在池中创建更多的组件类实例,并使用池中的一个实例来服务请求。 当Web容器创建servlet的新实例时,它将使用默认构造函数。
初始化是生命周期阶段,在该阶段初始化servlet。 在此阶段中,应该让servlet读取一些值,并在servlet能够满足客户端请求之前执行一些附加的操作和步骤。
服务阶段是servlet生命周期,其中servlet服务于客户端请求。 销毁阶段是Servlet生命的最后一个阶段,发生在将Servlet从服务中删除时。

Servlet接口

如果我们想创建一个servlet,那么应该做的就是实现Servlet接口。
该接口提供接下来的三种方法,这些方法由容器调用:

  • init(ServletConfig config),在初始化期间调用
  • 服务(ServletRequest请求,ServletResponse响应),在服务请求期间调用
  • 当从服务中删除servlet时调用destroy()。

另外这个接口提供了两个辅助
方法:

  • ServletConfig getServletConfig()
  • 字符串getServletInfo()

在初始化期间,可以获取ServletException。 在init方法中引发此异常将通知容器发生了一些错误,并且容器将停止初始化并将Servlet实例标记为已准备好进行垃圾回收,并且这不会导致调用destroy方法。

同样在服务方法期间,可能会获取ServletException或UnavailableException。 此例外可以是临时的,也可以是永久的。 在临时异常的情况下,服务器将阻止对服务方法的调用一段时间,但是在永久异常的情况下,将调用destroy方法,并且Servlet将准备进行垃圾回收,并且以后对该Servlet的每次调用都将导致404响应。

GenericServlet类

GenericServlet类是javax.servlet包的一部分。 它是实现Servlet接口并创建不依赖平台的基本实现的抽象类。
此类介绍一种新方法:

  • 在初始化阶段,由init(ServletConfig config)方法调用的init()
  • ServletContext getServletContext(),提供对ServletContex的访问
  • String getInitParameter(String name),检索在应用程序描述符中为指定名称定义的servlet配置参数的值
  • 枚举getInitParameterNames(),返回所有servlet初始化参数的枚举。
  • 字符串getServletName(),返回servlet的名称。

如果我们扩展GenericServlet类而不是实现Servlet接口,那么我们要做的只是实现服务方法,所有其他方法都已经由抽象类实现了。

HttpServlet类

这也是类似于GenericServlet的抽象类,但此类与平台无关。 它与HTML协议绑定,并引入了仅与HTTP协议有关的新方法。 每个新方法都负责处理特定HTTP方法的客户端请求。
doXxx方法:

  • doGet(HttpServletRequest请求,HttpServletResponse响应),处理获取请求
  • doPost(HttpServletRequest请求,HttpServletResponse响应),处理发布请求
  • doOptions(HttpServletRequest请求,HttpServletResponse响应),处理HTTP选项请求
  • doPut(HttpServletRequest请求,HttpServletResponse响应),处理HTTP放置请求
  • doDelete(HttpServletRequest请求,HttpServletResponse响应),处理HTTP删除请求
  • doHead(HttpServletRequest请求,HttpServletResponse响应),处理HTTP Head请求
  • doTrace(HttpServletRequest请求,HttpServletResponse响应),处理HTTP跟踪请求。

ServletContext接口

ServletContext接口是API,可用于访问有关应用程序的信息。 每个应用程序都是在自己的上下文中执行的,因此此接口可提供对该信息的访问。 该接口的实现由服务器供应商提供,我们对具体实现不感兴趣。 部署应用程序时,容器将首先创建ServletContext实现类,并用应用程序描述符提供的数据填充它。
我们可以将此接口内的方法分为几组:

  1. 访问上下文属性的方法:
    • Object getAttribute(String name),从上下文中检索对象
    • 枚举getAttributeNames(),检索属性名称
    • void removeAttribute(String name),从上下文中删除属性
    • setAttribute(String name,Object value),将新对象添加到上下文中并通过指定的名称绑定它。 如果具有指定名称的对象已经存在,它将被重载。
  2. 获取上下文信息的方法:
    • 字符串getServletContextName(),检索由<display-name>在应用程序描述符中定义的值,如果不存在则返回null。
    • String getRealPath(String path),指定资源的上下文相关路径,如果将应用程序部署为WAR(如果未在文件夹中爆炸),则为null。
    • 设置getResourcesPaths(String path),在指定的部分路径内检索文件,仅一级
    • ServletContext getContext(String appURL),检索部署在同一服务器上的另一个应用程序的ServletContex。 网址必须以'/'开头
  3. 访问静态资源的方法:
    • URL getResource(String path),检索由path指定的资源的URL。 路径必须以“ /”开头
    • InputStream getResourceAsStream(String path),检索指定资源的InputStream。 路径可以是上下文相关的。
    • String getMimeType(String path),返回资源的mie类型。
  4. 获取请求分配器的方法:
    • RequestDispatcher getRequestDispatcher(String path),为指定资源返回RequestDispatcher,如果资源不存在,则返回null。
    • RequestDispatcher getNamedDispatcher(String name),为部署描述符内的命名资源返回RequestDispatcher。
  5. 访问上下文初始化参数的方法:
    • String getInitParameter(String name),检索部署描述符中定义的指定参数的值;如果不存在,则返回null。
    • 枚举getInitParameterNames(),在应用程序部署描述符中定义的参数名称列表。

上下文属性是应用程序范围的属性,这意味着所有客户端共享相同的属性,一个客户端进行的属性更改对其他所有客户端都是可见的。

ServletConfig接口

这是API,提供用于访问在部署描述符中定义的信息的方法。 具体
对象由servlet容器创建,并在初始化阶段提供给servlet。 该接口定义了以下方法:

  • String getInitParameter(String name),获取为具有指定名称的servlet定义的init参数的值;如果没有这样的参数,则为null。
  • 枚举getInitParameterNames(),检索servlet初始参数名称的枚举。
  • ServletContext getServletContext(),检索Servlet上下文。
  • 字符串getServletName(),检索在web.xml中指定的servlet名称

如您所见,ServletConfig仅提供用于读取init参数的方法,而没有用于更改或添加新init参数的方法,因为它们无法更改或添加。

Servlet部署说明

如果要使用servlet,则需要在部署描述符中定义它们。

<servlet><description>This is a servlet</description><display-name>First Servlet</display-name><servlet-name>FirstServlet</servlet-name><class>ba.codecentric.scwcd.FirstServlet</class><init-param><param-name>firstParam</param-name><param-value>value</param-value></init-param></servlet><servlet-mapping><servlet-name>FirstServlet</servlet-name><uri-pattern>/FirstServlet</uti-pattern></servlet-mapping>

在servlet标签内部,我们定义了servlet,在servlet标签内部,我们可以使用init param标签定义初始化参数,这些参数将在初始化阶段作为ServletConfig对象的一部分发送给servlet。

并使用servlet映射标记定义uri模式,该模式将用于激活指定的servlet。

同样在本教程中,我谈到了ServletContext,并且提到了上下文参数。 这些参数也使用上下文参数标签在部署描述中定义。

<context-param><param-name>contextParameter</param-name><param-value>value</param-value></context-param>

参考: Igor Madjeric博客上来自我们的JCG合作伙伴 Igor Madjeric的有关Servlet的基础知识 。

翻译自: https://www.javacodegeeks.com/2012/11/basics-about-servlets.html

servlet基础

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

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

相关文章

纯 CSS 实现高度与宽度成比例的效果

http://zihua.li/2013/12/keep-height-relevant-to-width-using-css/ 转载于:https://www.cnblogs.com/ygm900/p/10443982.html

c++ || && 逻辑短路问题

结论&#xff1a;“或”逻辑前面为1&#xff0c;“与”逻辑前面为0就会发生短路 1——或逻辑短路 include <stdio.h> int main() { int a5,b6,c7,d8,m2,n2; (ma<b)||(nc>d); printf("%d\t%d",m,n); } 输出的结果为1,2.为什么呢&#xff0c;因为a<b&am…

2021年计算机学硕考研c9,【JRs观点】学姐3000字记录考研8个月心得及作息时间表,献给2021考研同学,从二本到C9...

其实自己不会写东西&#xff0c;本文就像记流水账一样记录一下自己考研的过程吧。18年考研&#xff0c;从二本考上自己理想的985&#xff0c;这心中酸楚只有自己能体会&#xff0c;我个人觉得考研考的是坚持、方法、毅力。在这里把自己的一些经历分享给大家。考研成绩421&#…

abstract

Abstract 类 不能实例化Abstract 方法 在父类里定义抽象方法,在子类里定义这个具体的方法,所以它是抽象的.好处 减少复杂度和提高可维护性 抽象类的子类需要实现父类中的抽象方法&#xff0c;否则会报错。转载于:https://www.cnblogs.com/Frances-CY-FKYM/p/10444062.html

Neo4j:使用LOAD CSV检测CSV标头中的恶意空间

上周&#xff0c;我正在帮助某人将CSV文件中的数据加载到Neo4j中&#xff0c;我们在过滤掉其中一列中包含空值的行时遇到了麻烦。 数据如下所示&#xff1a; load csv with headers from "file:///foo.csv" as row RETURN row╒═════════════════…

lib 和 dll 的区别、生成以及使用详解

【目录】 lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库 首先介绍一下静态库&#xff08;静态链接库&#xff09;、动态库&#xff08;动态链接库&#xff09;的概念&#xff0c;首先两者都是代码共享的方式。 静态库&#xff1a;在链接步骤中&#xff0c;连接器将…

HDU4631Sad Love Story

这道题是用multiset直接维护就行了&#xff08;可是我根本不会multiset) 用一些剪枝就能跑出来 还有 不要爆int #include <set> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const lo…

计算机知识点小报,制作电脑小报的教案

制作电脑小报的教案教学目标&#xff1a;巩固WORD知识&#xff0c;掌握文档间复制&#xff0c;培养学生的创新能力和综合解决问题的能力&#xff0c;加强爱国主义教育。教学重点&#xff1a;提高学生对WORD的熟练程度&#xff0c;掌握文档间的复制操作及文字和图片的排版。教学…

C++:vector中的resize()函数 VS reserve()函数

http://www.cplusplus.com/reference/vector/vector/vector/ 写代码的时候无意错用了这两个函数 导致测试的时候&#xff0c;程序运行崩溃 发现这两个函数还是有区别的 void reserve (size_type n); reserver函数用来给vector预分配存储区大小&#xff0c;即capacity的值 &…

使用Gradle的maven-publish插件发布快照

我最近与Gradle一起开始了一个新项目 &#xff0c;并决定直接参加–没有Gradle经验&#xff0c;没有关于Groovy的线索&#xff0c;没有教程&#xff0c;只是继续尝试直到可行。 在我决定使用孵化式maven-publish插件将快照发布到Sonatype的Maven快照存储库之前&#xff0c;这一…

计算机网络ipv4到ipv6怎么实现,论计算机网络协议IPV4到IPV6的过渡策略|房屋搬迁过渡协议...

摘要&#xff1a;近年来IPV4协议的网络地址问题已经成为阻碍互联网发展的主要矛盾&#xff0c;而互联网的发展趋势将证明IPV4协议必将会被IPV6协议所替代,但其过渡的过程必定是艰难而漫长的。本文论述了IPV4协议存在的主要问题&#xff0c;并详细的分析了IPV4协议向IPV6协议过渡…

STL常用容器浅谈

STL是C/C开发中一个非常重要的模板&#xff0c;而其中定义的各种容器也是非常方便我们大家使用。下面&#xff0c;我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类&#xff0c;只是要讨论一下各个容器其各自的特点。STL中的常用容器包括&#xff1a;顺序性容器&am…

使用AWS使Spring Boot应用程序无服务器运行

在之前的 几篇 文章中&#xff0c;我描述了如何设置Spring Boot应用程序并在AWS Elastic Beanstalk上运行它。 尽管这是从物理服务器到云服务器的伟大一步&#xff0c;但还有更好的可能&#xff01; 走向无服务器 。 这意味着无需花费任何服务器费用&#xff0c;也无需维护或配…

计算机对中断的处理是在用户态下进行的,电大本科生作业系统作业3与答案.doc...

电大本科生作业系统作业3与答案《操作系统》课程作业(三)姓名         班级         学号一、选择题(选择一个正确答案的代码填入括号中)作业生存期共经历4个状态&#xff0c;它们是提交、后备、( )和完成。A&#xff0e;等待 B&#xff0e;就绪 C&#xff0…

浏览器输入网址到浏览器渲染页面的过程

1) 在客户端浏览器中输入网址URL。 2) 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。 3) 客户端浏览器与WEB服务器建立TCP(传输控制协议)连接。 4) 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。 5) WEB服务器响应请求&#xff0c;返回指定的URL…

【资料整理】proftpd安装配置

【资料整理】proftpd安装配置1&#xff09;下载安装 wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.4c.tar.gz tar zxvf proftpd-1.3.4c.tar.gz cd proftpd-1.3.4c (启用配额模块&#xff0c;限制上传大小&#xff0c;如果重新configure&#xff0c;则需要先make dis…

poj 1873

哇实验室里正在吵架&#xff0c;爽死了&#xff01; wf水题。显然二进制枚举&#xff0c;注意剪枝&#xff0c;val>ans的时候剪一下&#xff0c;不然会tle。然后就没惹。 我老人家一开始写了个 感觉非常垃圾&#xff0c;wa了一发又t了一发。 感觉自己可以退役了 1 #include …

汉中计算机培训班学费是多少,汉中远程教育培训班收费多少

汉中远程教育培训班收费多少&#xff1f;在企事业单位&#xff0c;无论你的从业履历有多么辉煌&#xff0c;没有本科学历就是一道硬伤。在这个层面上&#xff0c;本科学历是你求得工作的一块“敲门砖”。还有&#xff0c;很多企事业单位是靠学历论薪或者晋职加薪的重要条件&…

wadl_WADL中的JSON模式

wadl在其他工作之间&#xff0c;我最近一直在审查WADL规范&#xff0c;以解决一些文档问题&#xff0c;以生成更新版本。 因为显而易见的一件事是缺少对XML以外的语言的语法支持-是的&#xff0c;您可以使用JSON <-> XML Schema的映射&#xff0c;但这对于JSON纯粹主义者…

计算机资源管理器课件,计算机基础课件ppt-第5讲控制面板与资源管理器.pdf

第五讲控制面板资源管理器与 深入理解控制面板本章重点1、资源管理器2、控制面板3、磁盘管理4、附件5、注册表管理文件和文件夹s查看本机的内容1、双击 “我的电脑”2、双击要查看的磁盘3、双击屏幕上显示出的文件或文件夹便可打开一个文件或显示文件夹中的文件。资源管理器资源…