当前位置: 首页 > 编程日记 > 正文

Servlet开发入门

Servlet是sun公司提供的一门用于开发动态web资源的技术。

Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:

  • 编写一个Java类,实现servlet接口。
  • 把开发好的Java类部署到web服务器中。

快速入门,用servlet向浏览器输出“hello servlet”。 阅读Servlet API,解决两个问题:

  • 输出hello servlet的java代码应该写在servlet的哪个方法内?

public void service(ServletRequest req, ServletResponse res)

  • 如何向IE浏览器输出数据?

response.getwriter().write();

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

  1. Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  2. 装载并创建该Servlet的一个实例对象。
  3. 调用Servlet实例对象的init()方法。
  4. 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  5. WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

Servlet的生命周期

  • 通常情况下,服务器会在Servlet第一次被调用时创建该Servlet类的实例对象(servlet出生);一旦被创建出来,该Servlet实例就会驻留在内存中,为后续请求服务;直至web容器退出,servlet实例对象才会被销毁(servlet死亡)。
  • 在Servlet的整个生命周期内,Servlet的init方法只有在servlet被创建时被调用一次。
  • 而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
  • servlet被销毁前,会调用destroy() 方法。

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  • HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
  • HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

Servlet的一些细节

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

  • <servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
  • 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。

在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

对于如下的一些映射关系:

Servlet1 映射到 /abc/*

Servlet2 映射到 /*

Servlet3 映射到 /abc

Servlet4 映射到 *.do

问题:

当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应?

Servlet引擎将调用Servlet1。

当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应 ?

Servlet引擎将调用Servlet3。

当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应?

Servlet引擎将调用Servlet1。

当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 ?

Servlet引擎将调用Servlet2。

当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应?

Servlet引擎将调用Servlet2。

Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。

如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。

当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。

线程安全

  • 当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
  • 如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
  • SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。
  • 对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
  • 实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。

ServletConfig对象

  • 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
  • 当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

ServletContext对象

  • WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
  • ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
  • 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
  • ServletContext对象通常也被称之为context域对象。

ServletContext应用

  • 多个Servlet通过ServletContext对象实现数据共享。
  • 获取WEB应用的初始化参数。
  • 实现Servlet的转发。
  • 利用ServletContext对象读取资源文件。

得到文件路径

读取资源文件的三种方式

转载于:https://www.cnblogs.com/oterman/p/3960677.html

相关文章:

#串口通信超时处理_简单通信协议

用C语言做物联网网关开发时&#xff0c;经常需要通过串口、485接口等从一些传感器读取数据&#xff0c;由于网关设备和传感器所处的环境复杂多样&#xff0c;电磁干扰等常常会破坏传输的数据&#xff0c;为了确保传输数据的可靠性&#xff0c;通常会采取一些策略&#xff0c;常…

在cmd的方式下,简化mysql的输入的方法

2019独角兽企业重金招聘Python工程师标准>>> 在我的电脑&#xff0c;高级系统设置&#xff0c;环境变量&#xff0c;path 添加运行的mysql.exe的路径。 转载于:https://my.oschina.net/u/779687/blog/140411

Parser Generator Tips翻译(中英对译) by Joshua Xu

You can use the ParserWizard command from the Project menu to help you create initial YACC and Lex skeleton source files.如果需要生成初始的YACC & Lex骨架源文件&#xff0c;可以在系统菜单中&#xff0c;选取Project->ParserWizard。Use the Parser Generato…

leetcode-455 分发饼干

假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i &#xff0c;都有一个胃口值 gi &#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j &#xff0c;都有一个尺寸 sj 。…

C++模板详解

参考&#xff1a;C 模板详解&#xff08;一&#xff09; 模板&#xff1a;对类型进行参数化的工具&#xff1b;通常有两种形式&#xff1a; 函数模板&#xff1a;仅参数类型不同&#xff1b;类模板&#xff1a; 仅数据成员和成员函数类型不同。目的&#xff1a;让程序员编写…

autocad2007二维图画法_cad怎样绘制简单的二维图形

CAD绘制二维图形非常的简单&#xff0c;大家经常用它来画图&#xff0c;下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容&#xff0c;希望可以让大家有所收获!cad绘制简单二维图形的方法1、绘图菜单绘图菜单是绘制图形最基本、最常用的方法&#xff0c;其中包含了Aut…

MyEclipse 中配置struts2.2.1的方法

MyEclipse中配置Struts2.2.1版本基本步骤&#xff1a;1&#xff0c;首先就是要建立一个web project项目2&#xff0c;设置jdk和servers路径&#xff0c;如果jdk和servers已经配置ok&#xff0c;跳过这一步骤。在菜单中的window选项中配置jdk和servers对于jdk&#xff0c;点击ja…

BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

BZOJLOJ洛谷 \(d_i\)不同就不用说了&#xff0c;建出树来\(DFS\)一遍。 对于\(d_i\)不同的情况&#xff1a; Solution 1&#xff1a;xxy tql! 考虑如何把这些数依次填到树里。 首先对于已解锁的节点\(x\)&#xff08;已解锁是指父节点已经处理完的点&#xff0c;刚开始就是\(fa…

leetcode-376 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。少于两个元素的序列也是摆动序列。 例如&#xff0c; [1,7,4,9,2,5] 是一个摆动序列&#xff0c;因为差值 (6,-3,5,-7,3…

bootstrap3中关于布局的两种样式

container&#xff1a;用.container包裹的内容即可实现居中对齐。注意&#xff0c;由于在各分辨率下面都设置了padding 和 固定宽度&#xff0c;.container不能嵌套。row&#xff1a;栏栅系统是把父容器平均分为12列。注意&#xff0c;row可以被嵌套。 通过下表可以详细查看Boo…

adg oracle 架构_云化双活的架构演进,宁夏银行新核心搭载Oracle 19c投产上线

云和恩墨顺利完成宁夏银行新数据中心数据库平台的建设&#xff0c;包括新数据中心RAC搭建、DG搭建、旧数据中心到新数据中心的数据迁移&#xff0c;以及在整个项目生命周期中的实施规范、性能测试保障、压力测试等。6月12日&#xff0c;宁夏银行数据库完成全部迁移&#xff0c;…

MFC里ON_COMMAND_RANGE消息映射的ID问题

今天在工作中遇到一个问题&#xff0c;一个动态菜单&#xff0c;每个菜单的菜单项ID是我自己定义的&#xff0c;定义如下&#xff1a; #define IDM_SEARCHRECORD0 222240 #define IDM_SEARCHRECORD1 222241 #define IDM_SEARCHRECORD2 222242 #define IDM_SEARCHRECORD3 …

反射拷贝对象的思路:

0 根据构造器创建对象 1.获取传入进来的对象的字段 2.获取字段的类型 3.拼接 set 与get方法 4 获取传入进来的对象的值 并设置给新对象转载于:https://www.cnblogs.com/classmethond/p/10362263.html

leetcode-402 移掉K位数组

给定一个以字符串表示的非负整数 num&#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num “1432219”, k 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一…

c++ using 前置声明_C++ 类的前置声明

今天在研究C”接口与实现分离“的时候遇到了一个问题&#xff0c;看似很小&#xff0c;然后背后的东西确值得让人深思&#xff01;感觉在学习的过程中有太多的为什么&#xff0c;而每一个为什么背后都隐藏着一些原理和目的&#xff0c;所以得多问自己”为什么“&#xff0c;这样…

测试用的序列化方法

对于实体&#xff0c;进行底层方法测试的时候&#xff0c;经常逐一赋值很麻烦&#xff0c;网上找到序列化xml方法&#xff0c;感觉挺好用的。 前端调用方法时&#xff0c;将实体序列化写入xml文件 //xml路径string filePath "D:\1.xml";using (System.IO.StreamWrit…

HighChart学习-更新数据data Series与重绘

一&#xff1a;HighChart介绍 基于JQuery的纯JavaScript的图标库&#xff0c;支持各种图表显示&#xff0c;同时还支持Mootools 与Prototype详细版本支持在这里&#xff1a; JQuery 1.3.2 - 1.9.x. 2.0.x for modern browsers Mootools 1.2.5 - 1.4.5 Prototype 1.7 支持目…

shell代码模板

批量ssh登录机器#site_search_hosts 10.4.16.205,10.4.20.87,10.4.20.88,10.4.20.89,10.4.20.90,10.4.20.92,10.4.20.93,10.4.21.51,10.4.21.52,10.4.21.53,10.4.21.54,10.4.33.136,10.4.33.137,10.4.33.138,10.4.33.139,10.4.33.140site_search_hosts10.4.16.205,10.4.20.87,1…

leetcode-55 跳跃游戏

给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步&#xff0c;从位置 0 到达 位置 1, 然后再从位置 1…

子分类账知识学习(汇总网上比较有用的资料)

子模块和GL之间关联的变化 12i在功能模块上的变化很多&#xff0c;比如&#xff0c;基本每个模块都启用了MOAC特性&#xff0c;新增加了子帐模块&#xff0c;税模块等等很多新的模块&#xff0c;OPM库存和离散库存集成了。不过这些变化中&#xff0c;大部分不是我们需要重点…

zynqpl端时钟_第十一章 ZYNQ-MIZ701 PS读写PL端BRAM

本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享&#xff0c;通过zynq PS端的Master GP0端口向BRAM写数据&#xff0c;然后再通过PS端的Mater GP1把数据读出来&#xff0c;将结果打印输出到串口终端显示。涉及到AXI BRAM Controller 和 Block Memery Generato…

nagios报警的问题

最近我写了关于naigos监控的安装与配置的技术文档&#xff0c;公司运维按照我的文档部署naigos&#xff0c;发现不能发送报警邮件&#xff0c;经过我的检查&#xff0c;发现问题如下&#xff1a;1、hosts里的配置[rootnagios ~]# cat /etc/hosts # Do not remove the followin…

机器学习常见的分类算法的优缺点

1. 前言 在机器学习中&#xff0c;种类最多的一类算法要属很类算法&#xff0c;本文对机器学习中的各种分类算法的优缺点做一个总结。 2. 贝叶斯分类法 2.1 优点 所需估计的参数少&#xff0c;对于缺失数据不敏感。有着坚实的数学基础&#xff0c;以及稳定的分类效率。2.2 缺点…

公司新来一个同事:为什么 HashMap 不能一边遍历一边删除?一下子把我问懵了!

前段时间,同事在代码中KW扫描的时候出现这样一条:上面出现这样的原因是在使用foreach对HashMap进行遍历时,同时进行put赋值操作会有问题,异常ConcurrentModificationException。于是帮同简单的看了一下,印象中集合类在进行遍历时同时进行删除或者添加操作时需要谨慎,一般使用迭代器进行操作。于是告诉同事,应该使用迭代器Iterator来对集合元素进行操作。同事问我为什么?这一下子把我问蒙了?对啊,只是记得这样用不可以,但是好像自己从来没有细究过为什么?

一文搞懂MySQL索引

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。看到这里,你是不是对于自己的sql语句里面的索引的有了更多优化想法呢。

leetcode-45 跳跃游戏II

给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标…

做技术到底可以做到哪种地步-技术为什么越走越窄 (转)

尽管做技术已经有不少年头了&#xff0c;不管是犹犹豫豫还是坚定不移&#xff0c;我们走到了现在&#xff0c;依然走在技术这条路上。 不管我们处于何种职位&#xff0c;拿着哪种薪水&#xff0c;其实&#xff0c;我们会是不是的问问自己“做技术到底可以做到那种地步”&#x…

linux本地agent执行脚本_github 4.4K星|马哥教育企业教练团队研发一款轻量级、无Agent自动化运维平台...

马哥教育企业教练团队研发了一款自动化运维平台系统—Spug&#xff0c;上线后广受中小运维爱好者喜爱&#xff0c;目前github4.4k星&#xff0c;已经成为自动化热门项目。2020年了&#xff0c;运维不会搞运维自动化&#xff0c;都不好意思说自己做运维的了&#xff0c;大一点的…

mysql 数据目录更改

[CentOS]MySQL更改数据文件存储目录环境&#xff1a;CentOS(Linux) Mysql5.X 1.如果MySQL已经启动的话&#xff0c;需要先停止MySQL的运行#service mysqld stop2.home 目录下新建目录[data]/home #mkdir data3.移动MySQL默认数据库文件#mv /var/lib/mysql /home/data4.修改MySQ…

leetcode-452 用最少数量的箭引爆气球

在二维空间中有许多球形的气球。对于每个气球&#xff0c;提供的输入是水平方向上&#xff0c;气球直径的开始和结束坐标。由于它是水平的&#xff0c;所以y坐标并不重要&#xff0c;因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球…