一、Servlet简介

1、Servlet定义:

Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

2、Servlet定义:

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol. 
(servlet是一个java小程序运行在web服务器。servlet接收并响应来自Web客户端的请求,通常通过HTTP,超文本传输协议。)

3、Servlet实现过程:

(1)客户端发送请求至服务器端;

(2)服务器将请求信息发送至 Servlet;

(3)Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

(4)服务器将响应返回给客户端。

4、Servlet可以完成以下任务:

(1)动态生成HTML文档。

(2)将请求转发给Servlet组件。

(3)读取客户端的Cookie,以及向客户端写入Cookie。

(4)访问服务器的资源,如数据库、 XML、文件对像等。

5、Servlet的特点:

(1)Servlet对像,由Servlet容器(Tomcat)创建。

(2)Servlet是一个接口:位于javax.servlet包中。

(3)service方法用于接收用户的请求并返回响应。

(4)用户访问时多次被执行(可以统计网站的访问量)。

二、Servlet底层原理:

1、javax.servlet Interface Servlet

2、javax.servlet Interface Servlet 中的method

3、Servlet接口、GenericServlet类、HttpServlet类三者之间的关系

三、Servlet实现方式

1、Servlet的实现方式一(实现Servlet接口):

Servlet接口:

package cn.hncu;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class FirstServlet implements Servlet {
/**init方法*/
@Override
public void init(ServletConfig paramServletConfig) throws ServletException {
} /**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return null;
} /**service方法*/
@Override
public void service(ServletRequest paramServletRequest,
ServletResponse paramServletResponse) throws ServletException,
IOException {
} /**getServletInfo方法*/
@Override
public String getServletInfo() {
return null;
} /**destroy方法*/
@Override
public void destroy() {
}
}

2、Servlet的实现方式二(继承GenericServlet类):

GenericServlet类:

package cn.hncu;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /**【注意】GenericServlet是抽象类,service是抽象方法*/
public class ExtendGenericServlet extends GenericServlet { /**service方法*/
/**【注意】唯独service方法没有被实现,这个service方法我们自己使用*/
@Override
public void service(ServletRequest paramServletRequest,
ServletResponse paramServletResponse) throws ServletException,
IOException {
} /**destroy方法*/
/**【注意】除过service方法之外,其他方法都已经被实现了,并且这些方法都调用父接口的方法*/
@Override
public void destroy() {
super.destroy();
} /**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return super.getServletConfig();
} /**getServletInfo方法*/
@Override
public String getServletInfo() {
return super.getServletInfo();
} /**init方法*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
} /**【注意】:如果我们覆盖带参数的init父类方法时候,没有写super.init(config)这一句:
public void init(ServletConfig config) throws ServletException {
} 我们的程序会出现空指针异常错误:
严重: Servlet.service() for servlet [ExtendsGenericServlet] in context with path [/useServlet] threw exception
java.lang.NullPointerException
at javax.servlet.GenericServlet.getInitParameterNames(GenericServlet.java:99)
at cn.hncu.ExtendsGenericServlet.service(ExtendsGenericServlet.java:53) 我们知道,此时getInitParameterNames是空指针,我们去API中查看,关于getInitParameterNames的来源,
如果来源的某一地方是空指针,则就说明这个地方值为空! 我们依次点击这些类的关联: public Enumeration<String> getInitParameterNames()
{
return getServletConfig().getInitParameterNames();
}
----》说明:getServletConfig()为NULL public ServletConfig getServletConfig()
{
return this.config;
}
----》说明:config为NULL public void init(ServletConfig config)
throws ServletException
{
this.config = config;
init();
}
----》说明:此处就是问题的根源:config没有赋值 ----》也说明:带参数的init方法没有被执行 ----》因为我们在父类方法的时候,正好将父类的方法:init(config)给删除了 ----》所以覆盖父类方法的时候这句一定要写! //GenericServlet类中有一个空参init()方法, //其实是适配器模式中的一个技术细节:在带参init方法中帮我们把config赋好值, //然后调用空参且空实现init()方法--该方法是专门给子类覆盖的。 //---在适配器中帮我们做一部分事情,然后调用我们的覆盖方法 }

2、Servlet的实现方式三(继承HttpServlet类):

HttpServlet类:

package cn.hncu;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ExtendHttpServlet extends HttpServlet { /**service方法*/
/**【注意】此service方法是HttpServlet类 继承 GenericServlet类 后实现的其抽象service方法的*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
} /**destroy方法*/
/**【注意】下面的这些方法全部是继承与GenericServlet类中的方法*/
@Override
public void destroy() {
super.destroy();
} /**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return super.getServletConfig();
} /**getServletInfo方法*/
@Override
public String getServletInfo() {
return super.getServletInfo();
} /**init方法*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
}

四、Servlet生命周期

1、在JavaWeb项目中测试Servlet的生命周期

(1)init方法:

只会被初始化一次,由容器初始化,初始化成功后将缓存与容器中。 
它的初始时间分为两种: 
用户第一次访问时。 
服务器启动时,需要配置。

(2)service方法:

每次请求都会访问此方法。 
每次请求都会创建新的Request和Response对像。

(3)destory方法:

当服务器关闭时由容器调用并销毁。

2、JavaWeb项目—-TestServlet project

(1)、TestServlet框架:

(2)、index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试Servlet的生命周期</title>
</head>
<body>
<h2>测试Servlet的生命周期</h2>
<a href="servlet/TestServlet">测试servlet的生命周期</a>
</body>
</html>

(3)、TestServlet.java:

package cn.hncu;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /**
* 用于测试Servlet的生命周期
* @author user
*
*/
public class TestServlet implements Servlet {
/***
【注意】这里是我们自己实现的Servlet接口,因此每个方法的返回值都是我们自己决定的。
由于另一个方法中getServletConfig()中返回值是NULL,因此需要将init方法中的ServletConfig参数赋值给getServletConfig的结果。
即:我们定义私有类成员变量:config
在init方法中让:this.config=paramServletConfig;
*/
private ServletConfig config; @Override
public void init(ServletConfig paramServletConfig) throws ServletException {
this.config=paramServletConfig;
System.out.println("init方法执行....");
} @Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig方法执行....");
return config;
} @Override
public void service(ServletRequest paramServletRequest,
ServletResponse paramServletResponse) throws ServletException,
IOException {
System.out.println("service方法执行....");
ServletConfig config = getServletConfig();
String info = getServletInfo();
} @Override
public String getServletInfo() {
System.out.println("getServletInfo方法执行");
return null;
} @Override
public void destroy() {
System.out.println("destroy方法执行....");
}
}

4、web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.hncu.TestServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

5、执行结果:

6、也可以修改配置文件web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.hncu.TestServlet</servlet-class>
<!--
在启动在启动时加载元件负载指示就加载这个servlet(实例化并调用其())对Web应用程序的启动。
这些元素的可选内容必须是一个整数,指示应加载servlet的顺序。
如果值是负整数,或者元素不存在,容器可以自由加载servlet。
如果该值是正整数或0,则容器必须在部署应用程序时加载和初始化servlet。
容器必须保证servlet标有低整数在servlet标有高整数装。
容器可选择顺序加载Servlet具有相同的负载启动值。
-->
<load-on-startup>20</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

7、修改web.xml后:

【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期的更多相关文章

  1. 详细理解servlet实现的几种方式和生命周期

    现在很多的开发都是用的框架,然后很多同学学习的时候又是直接接触的框架,对于底层的一些开发,完全没有任何的了解.虽然对于业务上面来说,没有什么问题.但是很多时候当你被面试问到,或者是想要了解框架底层原理 ...

  2. 详细理解servlet实现的三种方式和生命周期

    阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...

  3. JavaEE基础(01):Servlet实现方式,生命周期执行过程

    本文源码:GitHub·点这里 || GitEE·点这里 一.Servlet简介 Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用S ...

  4. JavaEE基础(01):Servlet实现方式,生命周期执行...

    一.Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库 ...

  5. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  6. (转)Servlet的生命周期——初始化、运行、销毁全部过程

    背景:面试中很基础的一个问题,所以有必要好好整理一番. Servlet体系结构是建立在 Java 多线程机制上的,它的生命周期由 Web 容器负责. 当客户端第一次请求某个 Servlet 时,Ser ...

  7. 有关Servlet的生命周期说法正确的有( )。

    A.Servlet的生命周期由Servlet实例控制 B.init()方法在创建完Servlet实例后对其进行初始化,传递的参数为实现ServletContext接口的对象 C.service()方法 ...

  8. IT兄弟连 Java Web教程 Servlet的生命周期

    JavaWeb应用的生命周期由Servlet容器来控制,而Servlet作为JavaWeb应用的最核心的组件,其生命周期也由Servlet容器来控制.Servlet的生命周期可以分为3个阶段:初始化阶 ...

  9. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理 2017年01月04日 08:52:12 阅读数:18366 基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB ...

  10. Service 简介 启动方式 生命周期 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. Eureka的使用

    一.项目配置文件:application.yml #------ eureka配置,默认不开启,如需使用rest负载模式需开启 start ------------- eureka: instance ...

  2. python xml文件解析

    参考链接:http://www.runoob.com/python/python-xml.html

  3. 6.对图像进行ROI选取并操作

    void Test_ROIWith2Image() { Mat g_srcImage=imread("D:\\OpenCV Projects\\OpenCV_Test_Image\\6.jp ...

  4. 划分树(poj2104)

    poj2104 题意:给出n个数,有m次查询,每次查询要你找出 l 到 r 中第 k 大的数: 思路:划分树模板题 上述图片展现了查询时如何往下递推的过程 其中ly表示 [sl,l) 中有多少个数进入 ...

  5. 剑指Offer 10. 矩形覆盖 (递归)

    题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 题目地址 https://www.nowcoder.com/ ...

  6. 周强201771010141《面向对象程序设计(java)》第一周学习总结

    周强201771010141<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com ...

  7. 非常好的开源C项目tinyhttpd(500行代码)

    编译命令 gcc -W -Wall -lpthread -o httpd httpd.c 源码 #include <stdio.h> #include <sys/socket.h&g ...

  8. ecmall 后台添加新菜单

    所谓的开发新菜单,其实是和开发模块相对比的,之前说的开发模块,是在应对较大的,或者较为复杂,又相对独立于其他功能的项目需求. 而开发菜单,就是简单的在后台增加一个一级菜单以及其子菜单,或者直接在现有的 ...

  9. Python全栈之路----类型转换

    显式转换 int(x [,base]) ⇒ 将x转换为一个十进制的整数 long(x [,base]) ⇒ 将x转换为一个十进制的长整数 float(x) ⇒ 将x转换为一个浮点数 str(objec ...

  10. git创建分支并上传仓库

    1. 新建分支 xxx 2.  git pull (目录下 命令行将线上分支拉倒本地) 3. git checkout xxx (切换到到该分支 ) (可使用 git status 查看目前处于哪一个 ...