一、Servlet简单总结

1.1. 什么是Servlet

Servlet是JavaEE三大组建之一,是使用Java语言编写服务器端的程序,主要用来处理Web应用程序中的请求-响应。Servlet并没有main之类的执行方法,当用户访问服务器的时候,Tomcat是通过调用Servlet的某些方法来完成整个处理过程的。Servlet是运行在Tomcat服务器提供的Servlet容器中的,所以Servlet是不用程序指定调用的。

1.2. Tomcat与JavaEE

JavaEE的版本与Tomcat服务器的版本是存在一种对应关系的,在开发Web应用程序的时候,需要注意对应版本关系,不然可能引起Web程序报错。

JavaEE与Tomcat服务器的版本对应关系如下表:

Tomcat服务器版本

Servlet\JSP版本

JavaEE版本

Java运行环境

Tomcat 4.1

Servlet 2.3\JSP 1.2

JavaEE 1.3

JDK 1.3

Tomcat 5.0

Servlet 2.4\JSP 2.0

JavaEE 1.4

JDK 1.4

Tomcat 5.5\6.0

Servlet 2.5\JSP 2.1

JavaEE 5.0

JDK 5.0

Tomcat 7.0

Servlet 3.0\JSP 2.2

JavaEE 6.0

JDK 6.0

2. 编写一个Servlet

2.1. 通过Eclipse创建Servlet

开发工具Eclipse或MyEclipse本身提供了创建Servlet的功能,下面我们首先利用开发工具来创建一个Servlet,具体步骤如下:

  • 首先,我们创建一个Web工程。
  • 在Web工程的src目录下,鼠标右键点击“New”选项,选择“Servlet”选项。
  • 弹出创建Servlet的界面窗口,具体内容如下:
  • 输入Servlet的包名、名称及相关方法后,点击“Next”按钮进行下一步操作。

该界面是配置Servlet在web.xml文件中的相关信息,具体内容如下:

Servlet/JSP Class Name:Servlet的完整路径。

Servlet/JSP Name:Servlet的名称。

Servlet/JSP Mapping URL:配置Servlet拦截的路径,客户端通过该路径访问Servlet。

File Path of web.xml:当前工程的web.xml配置文件保存路径。

Display Name:显示名称。

Description:描述名称。

  • 配置完毕之后,点击“Finish”按钮,完成Servlet的创建工作。

创建完成之后,当前Web工程的变化是在src目录下多了一个Servlet的Java文件,在WEB-INF目录中的web.xml文件中多了Servlet相关配置信息。

将当前Web应用程序发布到Tomcat服务器,并启动Tomcat服务器运行测试当前创建的Servlet内容。

  • 通过Eclipse或MyEclipse将当前Web工程发布到Tomcat服务器,并启动Tomcat服务器。

2.2. 手动编写一个Servlet

通过Eclipse或MyEclipse创建Servlet虽然简单,但我们并不知道相关代码是什么含义。所以,下面我们需要研究一下生成出来的代码。

首先, 我们来研究一下创建的Servlet文件源代码,会发现如下内容:

  • 是继承于HttpServlet类。
  • 包含init()、doGet()、doPost()和destroy()方法。

根据上述内容,我们可以手动创建一个Servlet的Java文件,如下面的代码所示:

 public class SecondServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("这是init()方法...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("这是doGet()方法...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是doPost()方法...");
}
@Override
public void destroy() {
System.out.println("这是destroy()方法...");
}
}

其次,我们再来研究一下web.xml配置文件增加的内容:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<!--
servlet标签:用于配置Servlet的名称和完整路径.
* servlet-name标签:用于为对应的Servlet设置名称.
* servlet-class标签:用于设置对应的Servlet的完整路径.
--> <servlet-name>FirstServlet</servlet-name>
<servlet-class>app.java.servlet.FirstServlet</servlet-class>
</servlet>
<!--
servlet-mapping标签:用于配置Servlet拦截客户端请求路径.
* servlet-name标签:用于设置对应使用的Servlet名称.
* url-pattern标签:用于设置客户端请求的拦截路径.
* 相对路径:/servlet/FirstServlet
* 绝对路径:http://localhost:8080/08_servlet/servlet/FirstServlet
--> <servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/FirstServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

将当前Web应用程序发布到Tomcat服务器,并启动Tomcat服务器运行测试当前创建的Servlet内容。

  • 通过Eclipse或MyEclipse将当前Web工程发布到Tomcat服务器,并启动Tomcat服务器。
  • 通过查看Eclipse或MyEclipse的console控制台的信息

2.3. Servlet的继承链

通过创建Servlet的Java文件中的代码内容,可以发现创建的Servlet是继承于HttpServlet类,查看JavaEE帮助文档中的HttpServlet内容。

Method Summary

protected  void

doGet(HttpServletRequest req, HttpServletResponse resp) 
          Called by the server (via the service method) to allow a servlet to handle a GET request.

protected  void

doPost(HttpServletRequest req, HttpServletResponse resp) 
          Called by the server (via the service method) to allow a servlet to handle a POST request.

protected  void

service(HttpServletRequest req, HttpServletResponse resp) 
          Receives standard HTTP requests from the public service method and dispatches them to the doXXX methods defined in this class.

void

service(ServletRequest req, ServletResponse res) 
          Dispatches client requests to the protected service method.

通过帮助文档提供的内容,我们可以知道创建Servlet中的doGet和doPost方法是继承于HttpServlet提供的,但还有init和destroy方法没有找到。我们发现HttpServlet是继承于GenericServlet,查看JavaEE帮助文档中的GenericServlet内容。

Method Summary

void

destroy() 
          Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.

void

init() 
          A convenience method which can be overridden so that there's no need to call super.init(config).

abstract  void

service(ServletRequest req, ServletResponse res) 
          Called by the servlet container to allow the servlet to respond to a request.

通过帮助文档提供的内容,我们可以知道init和destroy方法是源于GenericServlet。但是其实GenericServlet都实现了Servlet接口。

Method Summary

void

destroy() 
          Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.

ServletConfig

getServletConfig() 
          Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.

String

getServletInfo() 
          Returns information about the servlet, such as author, version, and copyright.

void

init(ServletConfig config) 
          Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

void

service(ServletRequest req, ServletResponse res) 
          Called by the servlet container to allow the servlet to respond to a request.

所以,init和destroy方法是Servlet接口提供的方法。通过上述的查找,我们已经很清晰的知道了Servlet的继承关系,具体如下图:

2.4. Servlet工作流程

利用Servlet完成的Web应用的实际工作流程是通过Tomcat服务器发布服务,客户端与服务器端之间的交互遵循Http协议完成的。具体工作流程如下:

  • 客户端浏览器向服务器端发送请求。
  • 服务器端由Tomcat服务器提供的Servlet容器解析接收到的请求。
  • 通过Web应用程序的配置文件web.xml,解析到对应执行的Servlet。
  • Servlet完成客户端发送的请求逻辑,并完成向客户端发送的响应内容。
  • 由Tomcat服务器提供的Servlet容器向客户端浏览器进行响应。

我们也可以通过下面的图来理解Servlet具体的工作流程。

2.5servlet注意事项

值得注意的是Servlet内容是属于JavaEE内容,和使用JavaSE内容一样,都是需要引入JAR包的。使用Eclipse或MyEclipse创建Web应用程序的时候,会发现已经导入了JavaEE所需要的JAR包。其中javaee.jar包中包含了使用Servlet的所有内容。

但是,当把Web应用程序发布到Tomcat服务器的时候,发现对应的目录中并没有javaee.jar包。我们知道无论是编译还是运行都是需要这些JAR包的,这说明Tomcat服务器本身提供了Servlet运行所需要的环境。在Tomcat服务器的安装目录中的lib目录中可以找到servlet-api.jar包,该JAR包也提供了Servlet运行所需的环境。

我们如果想要手动编译Servlet的话,需要做以下及步:

  • 在Tomcat安装目录中的webapps目录创建Web工程名称及目录结构。
  • 在命令行中利用命令编译Servlet文件。

javac -classpath C:\Tools\apache-tomcat-7.0.55\lib\servlet-api.jar -d . Servlet.java

  • 在对应Web工程目录的WEB-INF目录中的web.xml进行配置。

3. 深入掌握Servlet

3.1. Servlet的生命周期

一般情况下,自定义Servlet都是继承HttpServlet。但通过HttpServlet的继承链,我们知道HttpServlet是实现了Servlet接口,下面列表是Servlet接口提供的所有方法。

Method Summary

void

destroy() 
          Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.

ServletConfig

getServletConfig() 
          Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.

String

getServletInfo() 
          Returns information about the servlet, such as author, version, and copyright.

void

init(ServletConfig config) 
          Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

void

service(ServletRequest req, ServletResponse res) 
          Called by the servlet container to allow the servlet to respond to a request.

上述所有方法中,init()、service()和destroy()方法叫做Servlet的生命周期。讨论一下有关生命周期的三个方法:

  • init()方法

在Servlet实例化之后,Servlet容器会调用init()方法,主要是用来完成处理客户端请求之前的初始化工作。init()方法在Servlet的生命周期中只被执行一次。

  • service()方法

Servlet容器调用service()方法来处理客户端发送的请求。在service()方法被调用之前,必须保证init()方法被正确执行。service()方法在每次客户端发送请求之后,会被执行一次。

  • destroy()方法

当Servlet容器检测到当前Servlet实例被移除时,会调用destroy()方法,以便让Servlet实例可以释放所使用的所有资源。destroy()方法在Servlet的生命周期中也只被执行一次。

下面我通过实际操作来讨论关于Servlet的生命周期是怎么样的:

  • 首先,创建一个Servlet文件,具体如下。
 public class LifeServlet implements Servlet {

     public LifeServlet(){
System.out.println("这里创建了一个Servlet实例对象...");
} public void init(ServletConfig config) throws ServletException {
System.out.println("这是init()方法...");
} public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("这是service()方法...");
} public void destroy() {
System.out.println("这是destroy()方法...");
} public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
  • 在web.xml文件中,配置有关Servlet信息。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>app.java.servlet.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/servlet/LifeServlet</url-pattern>
</servlet-mapping>
</web-app>
  • 将Web应用程序发布到Tomcat服务器,并启动Tomcat服务器。
  • 启动Tomcat服务器之后,我们可以查看Tomcat服务器启动的日志内容,并没有有关Servlet信息。
五月 12, 2017 7:34:26 下午 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: E:\MyEclipse 2016 CI\binary\com.sun.java.jdk8.win32.x86_1.8.0.u66\bin;D:\tomcat\bin
五月 12, 2017 7:34:27 下午 org.apache.coyote.AbstractProtocolHandler init
信息: Initializing ProtocolHandler ["http-bio-8080"]
五月 12, 2017 7:34:27 下午 org.apache.coyote.AbstractProtocolHandler init
信息: Initializing ProtocolHandler ["ajp-bio-8009"]
五月 12, 2017 7:34:27 下午 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 842 ms
五月 12, 2017 7:34:27 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
五月 12, 2017 7:34:27 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.11
五月 12, 2017 7:34:27 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory day11
五月 12, 2017 7:34:27 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory docs
五月 12, 2017 7:34:27 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory examples
五月 12, 2017 7:34:27 下午 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
五月 12, 2017 7:34:27 下午 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
五月 12, 2017 7:34:27 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory host-manager
五月 12, 2017 7:34:28 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory manager
五月 12, 2017 7:34:28 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory ROOT
五月 12, 2017 7:34:28 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory webmvcframework
五月 12, 2017 7:34:28 下午 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["http-bio-8080"]
五月 12, 2017 7:34:28 下午 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
五月 12, 2017 7:34:28 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1061 ms

  • 重新刷新页面,再次发送请求,调用Servlet内容

  • 停止Tomcat服务器,并查看控制台信息。

通过上述操作,可以发现:在第一次向Servlet发送请求时,Tomcat服务器的Servlet容器首先创建Servlet实例对象,再进行Servlet初始化工作,最后调用service()方法来处理请求。第二次向Servlet发送请求时,只调用了service()方法,并没有执行Servlet的构造方法和init()方法。在停止Tomcat服务器时,Servlet的destroy()方法被调用,释放所使用的资源。

Servlet简单总结(一)的更多相关文章

  1. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  2. IDEA新建javaWeb以及Servlet简单实现

    刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...

  3. Intellij IDEA创建javaWeb以及Servlet简单实现

    1.创建web工程 File --> New --> Project...

  4. Intellijidea建javaWeb以及Servlet简单实现

    一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...

  5. JavaWeb基础之Servlet简单实现用户登陆

    学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...

  6. [转]Intellij idea创建javaWeb以及Servlet简单实现

    准备:1. 安装jdk1.72. 安装tomcat1.8 一.创建并设置javaweb工程 1.创建javaweb工程File --> New --> Project... 设置工程名字: ...

  7. servlet简单例子1

    servlet简单例子1 分类: servlet jsp xml2012-04-18 21:54 3646人阅读 评论(3) 收藏 举报 servletloginjspaction浏览器 LoginS ...

  8. Inellij idea创建javaWeb以及Servlet简单实现

    版权声明:本文为博主原创文章,未经博主允许不得转载. 准备:1. 安装jdk1.7 2. 安装tomcat1.8 一.创建并设置javaweb工程 1.创建javaweb工程File --> N ...

  9. servlet简单用法和配置示例及说明

    学习原因和目的:   我如今所接触的项目都是bs模式的web应用,而里边基本上都是用的spring MVC和前台交互,servlet貌似用的很少.   但是即便是用spring和spring MVC, ...

随机推荐

  1. mac开发环境配置

    折腾了好几天了,终于安装一部分了,mac装的win10,太占空间了,看到学习资源使用的工具,自己搜了一下安装了,在学习使用git的时候,都说mac比win好用多了,我tm为啥抱着mac装win费劲呢! ...

  2. 模块中为什么要加__name__ == "__main__"

    写一个hello模块 #!/usr/sbin/env python #-*- coding:utf- -*- print "我是hello模块,我被执行了" 在另一个python程 ...

  3. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  4. 解决Appium无元素可选的如何定位

    1.首先我们看看要定位的东西,我要定位的就是折让率上图自己看 写代码:   AndroidElement element = driver.findElementByAndroidUIAutomato ...

  5. Linux 和 Windows 下实现多进程的方式以及管道操作

    一.多进程 1.windows 多进程 使用 #include<windows.h> 下面的 BOOL CreateProcess( LPCWSTR pszImageName, LPCWS ...

  6. Linux 上做免密码登陆

    基于密钥验证1.生成一对密钥ssh-keygen -t {rsa|dsa} -f /path/to/keyfile -N 'password'2.将公钥传输至服务器某用户的家目录的.ssh/autho ...

  7. 1.Redis 的安装

    一.Redis 介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 作为Key-value型数据库,Red ...

  8. AngularJS1.X学习笔记1-整体看看

    听说 明天是愚人节,这与我有什么关系呢!我可 不想被愚弄,但是但是,我这么笨怎么才能不被愚弄呢?左思右想,我决定从现在开始闭关,闭关干啥哩?学习!学习AngularJS.以前学习过Angular的,不 ...

  9. 【CSS/JS学习】如何实现单行/多行文本溢出的省略(...)--老司机绕过坑道的正确姿势

    引言: 写前端UI的朋友们也许都遇到过这样的问题:我们需要实现这样一个需求,在一个父级元素中隐藏一个可能过长的文本:   这个文本可能是单行的:   也可能是多行的:   下面我就给大家展示如何简单或 ...

  10. GPU加速有坑?

    大多数人都知道有动画的地方可以使用GPU来加速页面渲染. 例如,做优化的时候,将使用left和top属性的动画修改成使用transform属性的CSS动画.或者听到别人教你使用transform:tr ...