博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet再度学习
阅读量:5081 次
发布时间:2019-06-12

本文共 4001 字,大约阅读时间需要 13 分钟。

转载:

虽然Servlet已经使用很多了,但是一直都仅局限在其使用操作上。

最近有空想对它进行一个相对全面的了解。

下面是博主整理的一篇博文。

一、Servlet简介

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

二、Servlet 工作原理

web应用的初始化工作(创建servlet对象)

一般在Java Web项目中,我们使用Servlet,其配置是在web.xml中的。而应用的初始化主要是解析web.xml文件。

Web应用的初始化工作是在ContextConfig的configureStart方法中实现的,应用的初始化主要是解析web.xml文件,这个文件描述了一个Web应用的关键信息,也是一个Web应用的入口。web.xml文件中的各个配置项将会解析成相应的属性保存在WebXml对象中。WebXml对象中的属性又会被设置到Context容器中,这里包括创建Servlet对象、filter、listener等,所以说Context容器才是真正运行Servlet的Servlet容器。一个Web应用对应一个Context容器,容器的配置属性由应用的web.xml指定。

Servlet如何工作

用户从浏览器向服务器发起的一个请求通常会包含如下信息:http://hostname:port/contextpath/servletpath,hostname和port用来与服务器建立TCP连接,后面的URL才用来选择在服务器中哪个子容器服务用户的请求。在Tomcat中URL与Servlet容器通过类org.apache.tomcat.util.http.mapper来完成映射,Mapper会根据请求的hostname和contextpath将host和context容器设置到Request的mappingData属性中。

Servlet能帮我们完成所有工作,但是现在的Web应用很少直接将交互的全部页面用Servlet来实现,而是采用更加高效的MVC框架来实现。这些MVC框架的基本原理是将所有的请求都映射到一个Servlet,然后去实现service方法,这个方法也就是MVC框架的入口。

当Servlet从Servlet容器中移除时,也表明该Servlet的生命周期结束了,这时Servlet的destroy方法将被调用,做一些扫尾工作

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

Servlet 通过调用 init () 方法进行初始化。Servlet 调用 service() 方法来处理客户端的请求。Servlet 通过调用 destroy() 方法终止(结束)。最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init() 方法init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
service() 方法service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
doGet() 方法GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
doPost() 方法POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
destroy() 方法destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

三、Servlet使用实例

实例使用前提:已经配置好了JDK和Tomcat

下面我们准备好如下东西:

(1)Servlet:HelloWorld.java

// 导入必需的 java 库import java.io.*;import javax.servlet.*;import javax.servlet.http.*;// 扩展 HttpServlet 类public class HelloWorld extends HttpServlet {  private String message;  public void init() throws ServletException  {      // 执行必需的初始化      message = "Hello World";  }  public void doGet(HttpServletRequest request,                    HttpServletResponse response)            throws ServletException, IOException  {      // 设置响应内容类型      response.setContentType("text/html");      // 实际的逻辑是在这里      PrintWriter out = response.getWriter();      out.println("

" + message + "

"); } public void destroy() { // 什么也不做 }}

(2)servlet-api.jar

需要依赖servlet-api.jar包无须做过多解释,这里面包含了Servlet相关接口类。

博主已经提供了相应的jar包供猿友们下载:

接下来还需要如下操作:

(1)将HelloWorld.java和servlet-api.jar放到D:\servlettest下。(猿友如果放到其他目录,下面的设置应作相应修改)

(2)环境变量CLASSPATH中添加servlet-api.jar存放路径,博主的是D:\servlettest\servlet-api.jar

o_Servlet001.png

(3)打开cmd,进入到D:\servlettest(cd D:\servlettest),然后执行命令javac HelloWorld.java,编译 Servlet。

(4)编译成功后发现D:\servlettest下多了个HelloWorld.class文件。

(5)将HelloWorld.class文件放到tocmat的webapps\ROOT\WEB-INF\classes下(如果没有classes,自己新建一个放进去)

(6)tocmat的webapps\ROOT\WEB-INF\web.xml文件添加如下配置:

HelloWorld
HelloWorld
HelloWorld
/HelloWorld

博主的web.xml配置后是这样的:

Welcome to Tomcat
Welcome to Tomcat
HelloWorld
HelloWorld
HelloWorld
/HelloWorld

(7)接下来双击tomcat的bin目录下的startup.sh来启动tomcat。

(8)访问路径:http://localhost:8080/HelloWorld,效果如下:

o_Servlet002.png

转载于:https://www.cnblogs.com/andy-zhou/p/5316366.html

你可能感兴趣的文章
【vijos P1034】家族(并查集)
查看>>
java类中元素初始化顺序详解
查看>>
LeetCode - 121. Best time to buy and sell stock
查看>>
JUnit单元测试教程(翻译自Java Code Geeks)
查看>>
Nginx 安装 (mac os) 错误 ld: symbol(s) not found for architecture x86_64
查看>>
leetcode[166]Fraction to Recurring Decimal
查看>>
Vue 路由系统和钩子函数
查看>>
HTTP请求
查看>>
Android Protobuf应用及原理
查看>>
Intellij IDEA 配置Tomcat远程调试
查看>>
android学习笔记1
查看>>
C语言中的负数是如何表示的?
查看>>
SpringMVC+Maven+tomcat配置----2.tomcat的配置
查看>>
导数和微积分(蒯)
查看>>
逆FizzBuzz问题求最短序列
查看>>
BZOJ4237 稻草人
查看>>
vue-all
查看>>
使用cros实现跨域请求
查看>>
C#: 引用变量与数值变量
查看>>
网络进程
查看>>