servlet执行详解

个人博客地址:
http://xiaohe-blog.top

1. servlet 简述

servlet说实在点就是个接口,浏览器发送请求给Tomcat(服务器),若是这个请求正好对应了servlet实现类的请求路径,Tomcat就会使用它来响应浏览器,这也就是request(请求)、response(响应)了。

在这里插入图片描述

servlet有5个方法,其中service是最重要的,也是我们接下来学习的重点。它的实现类也主要实现它来完成响应工作。

service方法

void service(ServletRequest var1, ServletResponse var2){}

service有两个参数,ServletRequest中带着请求的信息,例如一个学生管理系统你想删除学生,ServletRequest就会给你你想删除的学生的学号;ServletResponse中带着响应的信息,就像点击删除后你想告诉用户删除成功没。

其他四个方法中没有这两个参数,也就意味着它们无法与浏览器交互,只负责servlet中的一些初始化、get方法、销毁servlet等等。

所以在实现Servlet接口时其他方法不用管,只需要重写service方法来实现功能就好。

2. 第一个servlet程序

在配置文件web.xml中配置 :

<servlet>
     <servlet-name>myServlet</servlet-name>
    <!--这里要填写全限定类名,就是让Tomcat知道它在哪-->
     <servlet-class>com.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
      <servlet-name>myServlet</servlet-name>
     <!--这里要填写路径,就是让Tomcat知道这个路径来的时候就该使用这个servlet了-->
      <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

在服务器启动时 :点击这个Edit
在这里插入图片描述
在这里插入图片描述

在前端中 :

在这里插入图片描述

在java类中 :

public class MyServlet implements Servlet {
 
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {}

    @Override
    public ServletConfig getServletConfig() {return null;}

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) 
        throws ServletException, IOException {
        // 在控制台打印输出语句
        System.out.println("MyServlet --> service");
    }

    @Override
    public String getServletInfo() { return null;}

    @Override
    public void destroy() {}
}

再点击对应链接后控制台就会打印 “MyServlet --> service”。

3. Servelt 生命周期

什么是生命周期 ?

  • servlet对象什么时候被new?创建几个?
  • servlet中的方法执行顺序 ?
  • servlet什么时候销毁 ?

这些都是由服务器决定的。服务器决定它们什么时候活,什么时候死。

3.1 实例化

想要Tomcat创建servlet实现类,就必须让Tomcat知道他在哪,这也就是为什么要在web.xml配置servlet实现类的全限定类名 :

<servlet>
     <servlet-name>myServlet</servlet-name>
    <!--这里要填写全限定类名,就是让Tomcat知道它在哪-->
     <servlet-class>com.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
      <servlet-name>myServlet</servlet-name>
     <!--这里要填写路径,就是让Tomcat知道这个路径来的时候就该使用这个servlet了-->
      <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

一个程序中势必有很多servlet实现类,Tomcat将他们放在内部HashMap中统一管理,前端发送请求时去map中寻找相应的servlet,调用它完成响应。如果我们平时写好servlet后忘记配置了,Tomcat就不会将它放在map容器中,自然就不会调用它。

在这里插入图片描述

那么Tomcat什么时候创建servlet对象呢?

服务器启动并不会立即创建servlet对象,我们在servlet的无参构造方法中添加输出语句,启动服务器时并不会立即执行输出语句。

服务器启动只会读取web.xml文件,将里面你配置的所有servlet连同它的请求路径加载到上述所说的“map”集合中,以待日后使用。

在浏览器发送对应请求时,才会调用无参构造创建servlet对象。

注意是无参构造,如果只有有参构造,服务器无法调用哦。

这个设计特别合理,你打开一个小说网站可能只是想读其中一个小说,那也不至于把全网所有小说都加载完吧,肯定是你点击哪一个,服务器加载哪一个。

当然我们可以使用配置信息来设置它的创建时机 ,这里不做扩展。

3.2 初始化

Servlet中有一个方法 :init(ServletConfig var),由它来完成初始化功能。Tomcat服务器实例化对应servlet后立即初始化。

默认情况下执行流程,点击链接 -> 执行无参构造 **- > **执行init。

在发送多次请求后浏览器输出如下,即使发送了多次请求,构造器和初始化方法只执行一次,而不是每一次都执行构造方法,这就证明了servlet只创建一次,以后想用直接在容器中拿,这也就是servlet的单实例特点。

单实例与单例又不同,单实例是人家可以创建,但是只由Tomcat创建一次。单例是不能new,只能创建一次。

在这里插入图片描述

为什么服务器设计时要添加一个init方法呢?init方法在构造方法之后执行并且一定会执行,那么为什么不能把init中的内容写到构造方法中呢 ?

之前我们提过,服务器调用servlet的无参构造创建对象,如果没有无参构造,就会出bug。无参构造对于整个网站来说太重要了,服务器不想让你动它,于是提供了一个init方法,你想写什么就在init中写,千万别动构造方法。

甲骨文官方也是这样说的(bushi)😜

3.3 service

来到重头戏service。这个方法很重要,其他方法很少用甚至用不到,但是这个方法用的很勤(相对而言)。

我们在上述MyServlet的service方法中添加输出语句,发送多次请求 :

在这里插入图片描述

可以看到,第一次发送请求后执行构造器、初始化、调用service进行响应,以后每一次发送请求只调用service方法完成请求。我们在一个网站中,多次点击登录调用的是同一个Servlet实现类,只不过调用了很多次。

3.4 销毁

在destroy方法中设置输出语句,关闭浏览器后发现没有执行destroy方法,关闭服务器才算执行了相应输出语句。而我们并没有调用destroy,可以看出 一个Servlet对象的销毁是Tomcat调用其destroy来完成的。(关闭服务器肯定要销毁servlet,不能老让它们占用资源)

3.5 生命周期总结

一个servlet的默认生命周期 :

发送对应请求后创建servlet对象,紧接着立即执行init方法,之后再发送对应请求就只执行service方法,在服务器关闭之前会调用容器中所有servlet的destroy方法销毁对象。

在servlet生命里只执行一次的方法 :构造器、初始化、销毁方法。

4. 适配器设计模式

平时我们实现Servlet接口只为了使用它的service方法,但是还要实现另外四个方法,是不是觉得太过臃肿?这么一大坨init、destroy都是无用的东西,看着也烦。

java也为我们考虑到了这一点,推出了 GenericServlet 这个类。这个类实现了Servlet接口,并且对除了service方法之外的方法都进行了默认实现,我们继承GenericServlet ,只需要写service方法就行了。
在这里插入图片描述

改版后是不是悦目很多?

在这里插入图片描述

这是一个简易的适配器设计模式 :因为Servlet接口中只需要用到service,但是有时候要用到init等其他方法,没法直接把他们删掉,于是另外搞一个类实现它的其他方法,留一个抽象的service方法给我们,当我们想要使用Servlet中其他方法时也可以直接重写。

补充 :

刚才看到GenericServlet 类中有两个init方法 :

public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
}
public void init() throws ServletException {

}

我们知道,Tomcat调用的是有参的init(ServletConfig var),在GenericServlet 的init(ServletConfig var)中初始化了一个成员变量config,接着调用了一个空的init()方法,为什么呢?

ServletConfig包含着 本servlet的基本信息,在其他方法中还要用到。

但是Tomcat不希望碰构造方法,所以它只有在init(ServletConfig var)中初始化本类中的那个ServletConfig变量,但是万一你重写了这个init(ServletConfig var),那内部的servletConfig就无法初始化也就无法让别的方法使用,就只好提供给你一个空参的init(),反正serlvetConfig已经变成成员变量了,就不用作为形参。
在这里插入图片描述

总结 :由于不想代码冗余,官方提供了抽象类GenericServlet 实现了Servlet接口中的方法,把service设置为抽象方法供我们使用,为了能够保证GenericServlet 类中的servletConfig能够顺利赋值,官方提供了两个init,一个供服务器调用,一个供我们重写。Tomcat调用有参init,有参init中赋值servletConfig并调用了无参init,保证这两个init都能够运行。

5. HttpServlet

这个类就是我们在javaweb中日常使用的类了。

按理说 GenericServlet 已经够用了,但是 HttpServlet 是对它的扩展。HttpServlet, 类如其名,遵守Http协议,更加安全更加灵活。它提供了两个主要使用的方法 :doGet、doPost。

在html学习中我们学习了表单提交的两种方式 :get/post,是不是正好对标这两个方法?确实,前端表单如果是get方式提交数据,后端就要实现doGet方法,如果是post方法,就要实现doPost方法。

后端实现的方法要对应前端的数据提交方式

在这里插入图片描述

其实不管是doget还是doPost,最终还是调用了service,我们打开HttpServlet中的service看看 :

在这里插入图片描述

让我们还原一下具体的执行流程吧 :

我们写出以下代码 ,并将其访问路径设置为 :/myServlet:

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
		// 访问数据库,等等一系列操作
    }
}

Tomcat服务器读取配置文件,将MyServlet这个类和它的路径加载到容器中。用户访问 http://localhost:8080/项目名/myServlet时,Tomcat利用反射调用MyServlet的构造器创建对象:Servlet servlet = Class.forName(“MyServlet”) ;

Tomcat调用init(ServletConfig var)方法,调用的是MyServlet中从HttpServlet中继承下来的init(ServletConfig var),在其中为servletConfig赋值,并调用我们自己写的init(),但我们并没有写。

Tomcat调用service方法,调用 MyServlet中从HttpServlet 继承的service方法,service方法判断前端请求是get方式,于是去调用我们重写的doGet方法,完成对请求的响应。

Tomcat即将关闭,调用 MyServlet 从HttpServlet继承的destroy方法将其销毁。

下来的init(ServletConfig var),在其中为servletConfig赋值,并调用我们自己写的init(),但我们并没有写。

Tomcat调用service方法,调用 MyServlet中从HttpServlet 继承的service方法,service方法判断前端请求是get方式,于是去调用我们重写的doGet方法,完成对请求的响应。

Tomcat即将关闭,调用 MyServlet 从HttpServlet继承的destroy方法将其销毁。

上述四步代表着一个servlet的生命周期。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 分布式Web应用程序 1. 1 分布式Web应用程序 1. 2 企业级n-层应用 1. 3 典型Web应用程序的处理过程 1. 3. 1 Web浏览器发送请求 1. 3. 2 执行服务器端程序 1. 3. 3 将结果运回给浏览器 1. 4 服务器端技术 1. 4. 1 各种服务器端技术的比较 1. 4. 2 基于Java解决方案的特点 第2章 Java Servlet简介 2. 1 Servlet生命周期 2. 2 Java Servlet API简介 2. 3 处理表单和返回数据的实例 2. 4 错误处理和日志记录 2. 4. 1 Java中的异常处理机制 2. 4. 2 在Java Servlet中处理异常 2. 4. 3 向浏览器发送标准的HTTP错误 2. 4. 4 服务器端日志记录 2. 5 Servlet在n-层结构中的作用 第3章 会话育理 3. 1 使用传统方法进行会话管理 3. 1. 1 URL Rewriting技术 3. 1. 2 隐藏表单域 3. 1. 3 Cookie功能 3. 2 使用Java Servlet API进行会话管理 3. 2. 1 HttpSession接口 3. 2. 2 管理会话数据 3. 2. 3 购物车实例 3. 2. 4 会话事件 第4章 生成图像 4. 1 HTTP协议中的MIME类型 4. 2 Servlet向客户端返回MIME类型 4. 3 在服务器瑞生成统计图形 4. 3. 1 产生图形 4. 3. 2 产生条形图 4. 3. 3 产生饼形图 4. 3. 4 将绘制的图形转化成JPEG格式 4. 3. 5 在服务器端产生条形图和饼形图的实例 第5章 Java Servlet中的网络编程 5. 1 Java套接字网络编程 5. 1. 1 InetAddress类 5. 1. 2 Socket类 5. 1. 3 给手机发送网上短信息 5. 2 Java网络编程中的高层类 5. 2. 1 URL类 5. 2. 2 URLConnection类 第6章 利用Servlet上传和下载文件 6. 1 得到HTTP请求消息的内容 6. 2 利用Servlet得到上传的文件 6. 2. 1 上传文件及表单域的请求实体的分析 6. 2. 2 得到上传文件的编程实例 6. 3 使用Servlet下载文件 6. 3. 1 相关的HTTP协议的规定 6. 3. 2 使用Servlet下载文件实例 第7章 在Servlet中使用数据库 7. 1 JDBC概述 7. 1. 1 JDBC驱动程序的类型 7. 1. 2 使用JDBC 7. 1. 3 使用JDBC的实例 7. 2 连接地 7. 2. 1 ConnectionPool对象 7. 2. 2 使连接池对所有Servlet可用 7. 2. 3 外罩连接池类 第8章 在数据库中存取图像 8. 1 在数据库中存入图像数据 8. 2 提取和显示图像信息 第9章 Servlet链 9. 1 编写Servlet链 9. 2 触发Servlet链 第10章 服务器端包含 10. 1 服务器端包含的编写 10. 2 服务器端包含的参数传递 10. 3 服务器端包含的实例 第11章 Applet和Servlet通信 11. 1 Applet和Servlet通信概述 11. 2 Applet和Servlet的网络通信 11. 2. 1 初识Applet和Servlet网络通信 11. 2. 2 Applet和Servlet之间传递对象 11. 3 Applet和Servlet之间实现远程方法调用 11. 3. 1 远程方法调用中的设计模式 11. 3. 2 设计应用程序子协议 11. 3. 3 远程方法调用的实例 第12章 在Servlet中发送和接收邮件 12. 1 电子邮件协议 12. 2 利用SMIP发送电子邮件 12. 2. 1 利用网络编程发送邮件 12. 2. 2 利用网络编程发送电子邮件的实例 12. 3 JavaMail API和电子邮件 12. 3. 1 配置JavaMail 12. 3. 2 JavaMail的结构 12. 3. 3 登录邮件服务器 12. 3. 4 在网页中显示邮件内容 12. 3. 5 利用JavaMail发送邮件 第13章 在Java Servlet中利用 RMI 13. 1 RMI概述 13. 2 RMI的实现 13. 2. 1 定义远程接口 13. 2. 2 实现远程对象 13. 2. 3 将远程对象绑定到RMI的名称空间 13. 2. 4 作为客户对象的Servlet 13. 2. 5 运行RMI 第14章 在Java Servlet中利用XML 14. 1 XML概述 14. 1. 1 DOM和SAX 14. 1. 2 良构的XML文档及验证实例 14. 1. 3 有效的XML文档及验证实例 14. 2 XML语法 14. 2. 1 XML文档部分 14. 2. 2 DTD 14. 3 XML应用实例 14. 3. 1 服务器端XML的生成 14. 3. 2 XML在客户端 第15章 实现Internet搜索引擎 15. 1 搜索引擎的原理 15. 2 搜索引擎的实现 15. 2. 1 数据库部分的实现 15. 2. 2 解析网页 15. 2. 3 在Internet上爬行 第16章 在Servlet中利用EJB 16. 1 EJB概述 16. 1. 1 EJB的开发过程 16. 1. 2 会话Bean和实体Bean 16. 2 会话Bean 16. 2. 1 定义宿主接口 16. 2. 2 定义远程接口 16. 2. 3 会话Bean类的实现 16. 2. 4 在网络中传送的可串行化的结果类 16. 2. 5 XML分配描述符 16. 2. 6 打包成jar文件 16. 2. 7 在服务器上配置EJB 16. 2. 8 从Servlet中调用EJB 附录A 超文本传输协议 A. 1 MIME A. 2 URI和URL A. 3 HTTP详解 A. 3. 1 建立TCP/IP连接 A. 3. 2 客户端发送请求 A. 3. 3 服务器返回响应 A. 3. 4 HTTP报头 附录B Servlet API
网络应用安全技术详解 网络应用安全技术详解全文共57页,当前为第1页。 知识域:网络应用安全 知识子域:Web安全基础及安全配置 理解Web工作机制及Web应用安全问题产生的原因 了解常见Web应用安全威胁,理解注入攻击和跨站脚本攻击特点和危害 了解Web应用程序开发编码安全要点 了解IIS和Apache的安全配置要点 了解浏览器上网安全威胁和IE安全配置方法 2 网络应用安全技术详解全文共57页,当前为第2页。 Web工作机制 什么是WEB 万维网(World Wide Web),是一个由许多互相链接的超文本文档组成的系统。 Web的重要概念 资源:web系统中对象称为资源 URI:统一资源标识符,用于标识一个资源(HTML文档、图像、视频片段、程序) URL:统一资源定位符(URI的一个子集) HTTP:超文本传输协议,用于传输资源,使用者通过http来获得资源 WEB应用越来越广泛 3 网络应用安全技术详解全文共57页,当前为第3页。 超文本传输协议 什么是超文本传输协议(HTTP) 一种通信协议 使用超文本标记语言 (HTML) 将资源从服务器传送到客户端 超文本传输协议特点 请求、响应模式 协议简单,客户端只需传输请求方法和路径 无连接(一个请求一个连接,完成后断开) 无状态 4 网络应用安全技术详解全文共57页,当前为第4页。 HTTP协议工作过程 HTTP 请求(Requests) 一个HTTP请求包含三个部分: 方法,URL,协议/版本(Method-URI-Protocol/Version) 请求包头(Request headers) 实体包(Entity body) HTTP 响应(Responses) 一个HTTP响应也包含三个部分 协议状态代码描叙(Protocol-Status code-Description) 响应包头(Response headers) 实体包(Entity body) 5 网络应用安全技术详解全文共57页,当前为第5页。 HTTP协议工作过程 HTTP请求范例:   POST /servlet/default.JSP HTTP/1.1  Accept: text/plain; text/HTML  Accept-Language: en-gb  Connection: Keep-Alive  Host: localhost  Referer: http://localhost/ch0/SendDetails.htm   User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)  Content-Length: 33  Content-Type: application/x-www-form-urlencoded   Accept-Encoding: gzip, deflate LastName=Franks&FirstName=Michael 6 网络应用安全技术详解全文共57页,当前为第6页。 HTTP协议工作过程-响应范例 HTTP响应范例:   HTTP/1.1 200 OK  Server: Microsoft-IIS/6.0   Date: Mon, 3 Jan 2010 13:13:33 GMT  Content-Type: text/HTML  Last-Modified: Mon, 11 Jan 2010 13:23:42 GMT  Content-Length: 112      Welcome to CISP. 7 第一行的响应包头和请求包头很相似。第一行说明协议是使用的HTTP1.1,响应请求已成功(200表示成功),一切已OK。 响应包头和请求包头相似,也包含一些有用的信息。响应的实体是HTML那一部分的内容。包头和实体也都是被CRLF序列分离开的 网络应用安全技术详解全文共57页,当前为第7页。 Web服务常见威胁 网络层面 拒绝服务、电子欺骗、嗅探 系统层面 Web服务漏洞、配置错误 应用层面 代码缺陷(SQL注入、XSS……) 信息泄露 电子欺骗 钓鱼、流程缺陷 8 网络应用安全技术详解全文共57页,当前为第8页。 常见Web应用安全威胁(一) 注入攻击 Injection WEB应用程序对用户输入数据的合法性判断不够,对用户输入过滤不足 SQL注入和命令注入 跨站脚本攻击 Cross Site Scripting,XSS 恶意攻击者往Web页面里插入恶意代码,当其他用户浏览该页之时,嵌入其中的恶意代码会被执行,从而达到恶意攻击用户的特殊目的 9 网络应用安全技术详解全文共57页,当前为第9页。 常见Web应用安全威胁(二) 失效的验证和会话管理 不安全的对象直接引用 跨站请求伪造 不安

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值