servlet

知识索引

  • servlet介绍

  • servlet入门

  • servlet进阶

  • servlet案例

1 servlet简介

Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范. Servlet可以和其他资源(文件、数据库、Applet、Java应用程序等)交互,以生成返回给客户端的响应内容。

1.1 servlet的作用

servlet接口就是处理网络请求的一套规范,他负责连接web服务器(如tomcat服务器),交互式的生成动态的web内容,用来接收客户端请求信息、处理客户端请求、响应给浏览器的动态资源。它的实质就是java代码,通过java的API动态的向客户端输出内容

2 servlet入门案例

2.1 案例说明

在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello servlet

2.2 工程搭建

我们先创建一个maven工程,不知道maven是什么的可以看一下我文章的maven篇,进行一个快速入门学习

1)工程创建
创建maven工程,坐标如下:

<groupId>com.itmentu</groupId>
<artifactId>servlet-01</artifactId>
<version>1.0-SNAPSHOT</version>

2)pom.xml

<dependencies><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--servlety依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--jsp依赖--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency></dependencies>

3)web.xml配置(该文件在web/WEB-INF 文件夹下)

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><!--配置Servlet--><servlet><!--servlet-name: 名字 随便取; 一般就是类名--><servlet-name>ServletDemo01</servlet-name><!--servlet-class:Servlet这个类的全限定名--><servlet-class>com.itmentu.web.ServletDemo01</servlet-class></servlet><servlet-mapping><!--servlet-name: 必须和servlet标签里面的servlet-name一样--><servlet-name>ServletDemo01</servlet-name><!--url-pattern: 配置访问的路径--><url-pattern>/demo01</url-pattern></servlet-mapping></web-app>

2.3 案例实现

com.itmentu.web包下创建一个类实现Servlet接口

package com.itmentu.web;import javax.servlet.*;
import java.io.IOException;/*** Servlet配置文件方式使用:*  1.创建一个java类实现Servlet接口*  2.在web.xml中配置Servlet  【Servlet作为一个动态资源 配置Servlet的请求地址】*/
public class ServletDemo01 implements Servlet {//初始化@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}//获取ServletConfig对象@Overridepublic ServletConfig getServletConfig() {return null;}//服务@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("ServletDemo01...");}//获取Servlet信息@Overridepublic String getServletInfo() {return null;}//销毁@Overridepublic void destroy() {}
}

2.4 测试

我们按照我们第二章的方式进行发布即可,我们输入http://localhost:8080/可以看到如下页面证明启动成功

访问servlet http://localhost:8080/demo01,控制台打印,即为成功

2.5 注解方式实现

com.itmentu.web包下创建一个类实现Servlet接口, 添加注解@WebServlet

@WebServlet("/demo02")
public class ServletDemo02 implements Servlet {/*** 服务* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("hello...");}
}

访问http://localhost:8080/demo02控制台打印,即为成功

3 Servlet的生命周期

所谓生命周期就是一个对象从创建销毁的过程,Servlet的生命周期就是servlet出现到销毁的全过程

3.1 Servlet生命周期方法

Servlet接口

public interface Servlet {void init(ServletConfig var1) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;String getServletInfo();void destroy();
}

重要方法解析

Servlet 通过调用 init ()方法进行初始化。Servlet 调用 service()方法来处理客户端的请求。Servlet 通过调用 destroy()方法终止(结束)。

3.1.1 init() 方法

在来了第一次请求时, 会调用init()方法进行初始化,它只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

init 方法的定义如下:

public void init() throws ServletException {// 初始化代码...
}

3.1.2 service() 方法

每次请求 都会调用service()方法处理这个请求,即每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

init 方法的定义如下:

public void service(ServletRequest request, ServletResponse
response) throws ServletException, IOException{}

3.1.3 destroy() 方法

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

destroy()方法的定义如下:

public void destroy() {}

4 Servlet体系结构

我们创建一个类实现sevlet接口,必须实现接口的所有方法,但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口。

4.1 GenericServlet 类

我们来使用GenericServlet 创建servlet:

步骤

1. 创建一个类
2. 继承GenericServlet
3. 重写service方法

创建一个类,去继承GenericServlet,重写Service方法

@WebServlet("/demo03")
public class ServletDemo03 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("ServletDemo03...");}
}

GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,所以推荐使用HttpServle

4.2 HttpServlet接口

继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。

我们来使用HttpServlet创建servlet:

1. 创建一个类
2. 继承HttpServlet
3. 重写doGet、doPost方法

由于目前web通信都基于Http 所以今后创建Servlet类 都会继承HttpServlet

@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//只处理get方式请求doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//只处理post方式请求System.out.println("ServletDemo04...");}
}

HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,所以我们推荐使用HttpServlet

5 ServletContext

5.1 ServletContext介绍

当WEB服务器启动时,会为每一个WEB应用程序(webapps下的每个目录就是一个应用程序)创建一块共享的存储区域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2md3BVt-1649871657530)(https://itmentu.oss-cn-shenzhen.aliyuncs.com/itmentu/1639816273(1)].jpg?Content-Type=image/jpg)

ServletContext是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象, 属于整个项目的, 不局限于某个Servlet ServletContext我们就可以将它理解为整个应用application。ServletContext在WEB服务器启动时创建,服务器关闭时销毁。

5.2 ServletContext作用

一般来我们在这些地方会用到它

1.作为域对象存取数据,让Servlet共享
2.获得文件mini类型(文件上传和下载)
3.获得全局初始化参数
4.获取web资源路径

5.2.1 作为域对象存取值

  1. 域对象:对象有个范围可以存储数据

  2. ServletContext域对象范围:整个应用

  3. API

     getAttribute(String name) ;向ServletContext对象的map取数据setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据removeAttribute(String name) ;根据name去移除数据
    
  4. 代码

@WebServlet("/demo06")
public class ServletDemo06 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {//使用ServletContext对象存储数据   可以在整个应用中进行共享【在每个Servlet中都能获取到】ServletContext servletContext = this.getServletContext();servletContext.setAttribute("name","shuaige");System.out.println("ServletDemo06...");}
}
@WebServlet("/demo08")
public class ServletDemo08 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext中共享的数据Object name = this.getServletContext().getAttribute("name");System.out.println("ServletDemo08-name = " + name);//移除ServletContext中共享的数据this.getServletContext().removeAttribute("name");System.out.println("ServletDemo08...");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

5.2.2 获得文件mini类型

  1. API :获得文件mini类型

    getMimeType(String file)
    
  2. 代码

@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//只处理get方式请求doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取文件的MIME类型String file1 = "a.mp3";String file2 = "b.mp4";String mimeType1 = servletContext.getMimeType(file1);String mimeType2 = servletContext.getMimeType(file2);System.out.println("mimeType1 = " + mimeType1);System.out.println("mimeType2 = " + mimeType2);System.out.println("ServletDemo07...");}
}

5.2.3 获得全局初始化参数

String getInitParameter(String name) ; //根据配置文件中的key得到value;

在web.xml配置

    <context-param><param-name>aaa</param-name><param-value>bbb</param-value></context-param>

通过ServletContext来获得

 //获取全局初始化参数String akey=ServletContext.getInitParameter("aaa");System.out.println(akey);

5.2.4 获取web资源路径

  1. API:获取web资源路径

    String  getRealPath(String path);根据资源名称得到资源的绝对路径.
    getResourceAsStream(String path) ;返回指定路径文件的流
    注意: filepath:直接从项目的根目录开始写
    
  2. 代码

@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//只处理get方式请求doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//3.获取web目录下资源的真实路径String realPath = servletContext.getRealPath("a.txt");System.out.println("realPath = " + realPath);//4.获取web目录下的资源文件输入流  【重要,加载读取文件】 注意:使用ServletContext对象获取输入流的资源文件一定要在web目录下InputStream is = servletContext.getResourceAsStream("a.txt");BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));String line = null;while((line=br.readLine())!=null){System.out.println(line);}br.close();System.out.println("ServletDemo07...");}
}

6 统计网站被访问的总次数

6.1 需求

  • 在页面中显示您是第x位访问的用户.

6.2 思路分析

  1. 创建web项目,创建两个Servlet CountServlet和ShowServlet 使用ServletContext存储网站访问的次数

  2. 编写CountServlet

    //计数  记录网站访问人数
    //1.获取当前访问次数 +1
    
  3. 编写ShowServlet

    //显示  显示你是当前第几位访问用户
    //1.获取当前访问次数  然后显示
    

6.3 代码实现

  • CountServlet
/*** 记录用户访问次数* 用户访问次数存在ServletContext对象中  实现数据共享*/
@WebServlet("/count")
public class CountServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);//设置第一次访问之前 访问次数为0   config.getServletContext().setAttribute("count",0);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取之前的访问次数 ServletContext servletContext = this.getServletContext();Integer count = (Integer) servletContext.getAttribute("count");//2.将访问次数+1 count++;//3.将新的访问次数重新存入到ServletContext对象中servletContext.setAttribute("count",count);response.getWriter().print("Welcome...");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}
  • ShowServlet
@WebServlet("/show")
public class ShowServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取访问次数 Object count = this.getServletContext().getAttribute("count");//2.显示  你是第几个访问的用户// 解决响应中文乱码问题response.setContentType("text/html;charset=UTF-8");response.getWriter().print("你是第"+count+"个访问的用户");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

程序员初级秘籍之servlet快速入门相关推荐

  1. python开发pc软件_程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  2. python做电脑软件-程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  3. python入门教程软件-程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  4. 好程序员Java培训分享如何快速入门Java编程

    好程序员Java培训分享如何快速入门Java编程,作为老牌编程语言,Java拥有广阔的市场应用,企业对Java人才的需求一直居高不下.有很多非专业.零基础的人想要学习Java却不知道怎么快速入门,接下 ...

  5. python做电脑软件-程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  6. 黑马程序员新版Linux零基础快速入门到精通——学习笔记

    01初识Linux 1.1.操作系统概述 1.1.1.硬件和软件 我们所熟知的计算机是由硬件和软件组成的. 硬件: 计算机系统中由电子.机械和光电元件等组成的各种物理装置的总称. ​ (看的见.摸得着 ...

  7. Servlet快速入门及运行流程

    一.Servlet快速入门 1.创建一个web工程 2.在JavaResource中src下创建一个包名称为com.myxq.servlet 3.在创建的servlet包当中创建一个class文件起名 ...

  8. GO编程程序员修炼秘籍:十本经典书单

    随着BAT.今日头条.京东.抖音等大型互联网公司对Go语言的大范围应用,带动更多互联网企业采取技术跟随战略,Go语言发展前景一片大好. 5月20日工业和信息化部信息中心发布<2018中国区块链产 ...

  9. Day14-HTTP协议 web开发概述 servlet快速入门

    HTTP:HyperText Transfer Protocol 超文本传输协议 用于定义web浏览器和web服务器之间交换数据的过程 特点: 基于请求/响应模型的协议.请求和相应必须成对出现,现有请 ...

最新文章

  1. 皮一皮:时代不同了...
  2. Bug: CuteEditor与IE8不兼容
  3. android 上传文件到服务器
  4. 计算机中列英语,计算机中常用的英文缩写有哪些?
  5. JUC并发编程七 并发架构--wait/notify
  6. 人生时间计算器_工具拯救效率,高效拯救人生!70个全国工程人实用小工具+算量表格...
  7. java注释日志打印_java 日志文件打印
  8. POJ1703 Find them, Catch them 并查集
  9. boost::gregorian模块实现打印一个月中的所有日期的测试程序
  10. 让评审人爱上你的8个要点
  11. Java 语法糖详解
  12. winform mysql 工具类_C#工具类MySqlHelper,基于MySql.Data.MySqlClient封装
  13. 【Python】os库介绍
  14. php截取多个分割符号_PHP按符号截取字符串的指定部分的实现方法
  15. libcurl学习及简易封装类
  16. [转]网友monkeylarry研究生期间我们应该做什么
  17. 秀米html编辑器,ueditor集成秀米编辑器
  18. Android热修复-Tinker简析
  19. MYSQL之索引详谈(三种介绍方式)
  20. token令牌的含义和操作

热门文章

  1. Android自定义控件面试题,自定义View面试总结
  2. linux网卡灯不亮怎么处理,电脑网卡灯不亮的原因及解决方法
  3. 洛谷P1966 火柴排队(cdq分治 + 逆序对)
  4. 网易考拉API开发系列:item_search-根据关键词取商品列表API 返回值说明
  5. 网店美工之装修基础篇
  6. 使用axel多线程批量下载文件
  7. 【菜鸡读论文】AU-assisted Graph Attention Convolutional Network for Micro-Expression Recognition
  8. P3950 部落冲突
  9. 《畅玩NAS》第5章 OpenMediaVault切换源
  10. 数据中心布线:节能又省钱