Servlet基础认识
Posted tsvv-plus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet基础认识相关的知识,希望对你有一定的参考价值。
1. 简述:
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2. 任务:
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 html 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 Cookies 和缓存参数,以及其他类似的任务。
3. 架构:
4. 生命周期(执行过程):
Servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段:
加载类 —> 实例化(为对象分配空间) —> 初始化(为对象的属性赋值) —> 请求处理(服务阶段) —> 销毁
public class TsvvServlet extends HttpServlet{ //初始化servlet,调用init方法 @Override public void init() throws ServletException { System.out.println("初始化时调用"); } //开启服务 @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { System.out.println("开启服务时调用"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } //销毁时调用destory @Override public void destroy() { System.out.println("销毁时调用"); } }
5. Servlet的三种创建方式:
1. 实现 Servlet 接口
//Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程 //一次创建,到处服务 //一个Servlet只会有一个对象,服务所有的请求 /* * 1.实例化(使用构造方法创建对象) * 2.初始化 执行init方法 * 3.服务 执行service方法 * 4.销毁 执行destroy方法 */ public class ServletDemo1 implements Servlet { //public ServletDemo1(){} //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次 public void init(ServletConfig arg0) throws ServletException { System.out.println("=======init========="); } //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("hehe"); } //生命周期方法:当Servlet被销毁时执行该方法 public void destroy() { System.out.println("******destroy**********"); } //当停止tomcat时也就销毁的servlet。 public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } }
2. 继承 GenericServlet 类,它实现了 Servlet 接口除了 service 的方法,不过这种方法我们极少用。
public class ServletDemo2 extends GenericServlet { @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("heihei"); } }
3. 继承 HttpServlet (通过Eclipse创建Servlet,默认继承HttpServlet)
public class ServletDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("haha"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("ee"); doGet(req,resp); } }
6. Servlet的继承关系:
- 两个顶级接口
- Servlet
- ServletConfig
- 接口的实现类
- GenericServlet
- 基于HTTP协议的实现类
- HttpServlet
Servlet的整体继承关系如下:
- ServletConfig Servlet的配置信息,常用来在Servlet初始化时进行信息传递
- getServletContext() 获取Servlet运行的上下文环境对象,可以获取对应信息(如Servlet路径),存取容量级的变量
- getInitParameter(String name) 获取初始化参数(web.xml中配置的init-param)
- GenericServlet 一般的Servlet,实现了Servlet和ServletConfig接口
- init(ServletConfig config) 初始化方法,方法中调用了init()
- init() 初始化方法,方法体为空,主要用于自定义Servlet的覆盖
- service(ServletRequest request, ServletResponse response) 抽象方法service,要求继承类实现
- destory() Servlet销毁前要执行的方法
- HttpServlet 基于HTTP协议的实现类
- service(ServletRequest request, ServletResponse response) 实现了GenericServlet的抽象方法,调用了service(HttpServletRequest, HttpServletResponse)
- service(HttpServletRequest request, HttpServletResponse response) 根据请求的不同调用了doGet或doPost方法
- doGet() 处理GET方式的请求
- doPost() 处理POST方式的请求
- Servlet只初始化一次,它是单例的,只有一个实例,通过多线程访问。即Servlet是多线程单实例的
- 实例化过程中,先调用构造方法,再调用init方法,所以初始化操作可以覆盖写到init方法中
- 请求方式不同会调用doGet()或doPost()方法
- 根据实际情况在Servlet销毁前调用其destroy()方法
7. Servlet 的工作原理:
Servlet接口定义了Servlet与Servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
8. Servlet三大域:
9. JSP与Servlet:
JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
以上是关于Servlet基础认识的主要内容,如果未能解决你的问题,请参考以下文章