概念

Servlet其实就是Java提供的一门动态web资源开发技术。本质就是一个接口。

快速入门

  1. 创建web项目,导入servlet依赖坐标(注意依赖范围scope,是provided,只在编译和测试时使用)

    pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId>
<artifactId>tomcat-demo2</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!-- <configuration>-->
<!-- <port>80</port>&lt;!&ndash; 访问端口号 &ndash;&gt;-->
<!-- <path>/</path>&lt;!&ndash; 项目访问路径 &ndash;&gt;-->
<!-- </configuration>-->
</plugin></plugins>
</build> <packaging>war</packaging> </project>
  1. 创建:定义一个类,实现servlet接口,重写接口中的方法

    在Java目录下创建类,类名后加入implements Servlet实现接口,再CTRL+o重写父类方法。

  2. 配置:在类上使用@WebServlet注解,配置该servlet的访问路径

    再在类名写写明路径的注解。2、3步代码如下:

package com.itheijma.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException; @WebServlet("/demo1")
public class ServletDemo1 implements Servlet { public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world"); } public String getServletInfo() {
return null;
} public void destroy() { } public void init(ServletConfig servletConfig) throws ServletException { } public ServletConfig getServletConfig() {
return null;
}
}
  1. 访问,启动tomcat,在浏览器中访问

    随后在网页中访问demo1,控制台出现要输出的信息,说明servlet编写成功。

Servlet执行流程

浏览器根据路径向服务器发出请求,服务器再根据我们自定义的Servlet接口创建Servlet对象,再调用service方法,执行我们的代码。

Servlet生命周期

对象的生命周期指一个对象从被创建到销毁的整个过程。

servlet运行在servlet容器中,其生命周期由容器来管理,分为四个阶段:

  1. 加载和实例化:默认情况下,当servlet第一次被访问时,由容器创建servlet对象。
  2. 初始化:在servlet实例化之后,容器调用servlet的init()方法初始化这个对象。完成一些如加载配置文件、创建连接等初始化的工作。注:该方法只被调用一次,因为一个servlet对象只被创建一次。
  3. 请求处理:每次请求servlet时,servlet容器都会调用servlet的service()方法对请求进行处理。
  4. 服务终止:当需要释放内存或容器关闭时,容器就会调用servlet实例的destory()方法完成资源的释放。
package com.itheijma.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException; @WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet { /**
* 初始化方法
* 1. 调用时机:默认情况下,servlet被第一次访问时调用
* * loadOnStartup
* 2. 调用次数:1次
* @param servletConfig
* @throws ServletException
*/
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...."); } /**
* 提供服务方法
* 1. 调用时机:每一次servlet被访问时调用
* 2. 调用次数:多次
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world"); } /**
* 销毁方法
* 1. 调用时机:内存释放或服务器关闭的时候,servlet对象会被销毁,调用
* 2. 调用次数:一次
*/
public void destroy() {
System.out.println("destory....."); } public String getServletInfo() {
return null;
} public ServletConfig getServletConfig() {
return null;
}
}

Servlet体系结构

Servlet——Servlet体系根接口

GenericServlet——Servlet抽象实现类

HttpServlet——对HTTP协议封装的Servlet实现类

因为我们开发的是B/S架构的web项目,都是针对HTTP协议的,所以我们自定义的Servlet,会继承HttpServlet

package com.itheijma.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post...");
}
}

urlPattern配置

Servlet想要被访问,必须配置其访问路径(urlPattern)

package com.itheijma.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* urlPattern: 一个Servlet可以配置多个访问路径
*/
@WebServlet(urlPatterns = {"/demo4","/demo5"})
public class ServletDemo4 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4 get.....");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}
package com.itheijma.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* urlPattern
* *目录匹配 /user/*
*/
@WebServlet(urlPatterns = "/user/*")
public class ServletDemo6 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo6 get.....");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}
package com.itheijma.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* urlPattern
* *扩展名匹配: *.do
*/
@WebServlet(urlPatterns = "*.do")
public class ServletDemo7 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo7 get.....");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}
package com.itheijma.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* urlPattern
* *任意匹配 /* /
*/
@WebServlet(urlPatterns = "/")
public class ServletDemo8 extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo8 get.....");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

一遍博客带你上手Servlet的更多相关文章

  1. django3开发完整博客带评价

    纯django开发最完美博客 2020年5月打造最时尚博客系统教程 为了学习速度,集中精力学习django和博客开发, 没有使用其它框架,也没有使用css预处理等 这样学起来最方便, 博客前后端都完成 ...

  2. 玩遍博客网站,我整理了 Hexo 及其流行的风格主题

    搭建博客网站是个人进入互联网世界的最常见方式之一.伴随着网站技术的发展,如何搭建博客网站已经变得非常容易了.当然,你可以选择诸如 新浪博客.CSDN.博客园 之类的大型网站,快速创建依赖于大平台的个人 ...

  3. 玩遍博客网站,我整理了 Hugo 及其流行的风格主题

    搭建博客网站是个人进入互联网世界的最常见方式之一.伴随着网站技术的发展,如何搭建博客网站已经变得非常容易了.当然,你可以选择诸如 新浪博客.CSDN.博客园 之类的大型网站,快速创建依赖于大平台的个人 ...

  4. 一篇博客带你轻松应对Springboot面试

    1. SpringBoot简介 SpringBoot是简化Spring应用开发的一个框架.他整合了Spring的技术栈,提供各种标准化的默认配置.使得我们可以快速开发Spring项目,免掉xml配置的 ...

  5. 一篇博客带你入门Flask

    一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...

  6. 一篇博客带你轻松应对java面试中的多线程与高并发

    1. Java线程的创建方式 (1)继承thread类 thread类本质是实现了runnable接口的一个实例,代表线程的一个实例.启动线程的方式start方法.start是一个本地方法,执行后,执 ...

  7. InputStream和OutputStream的一遍博客 分析非常到位

    http://www.cnblogs.com/springcsc/archive/2009/12/03/1616187.html

  8. 忍不住还是手写了一遍博客的css

    F12边调边改,的一点一点撸出来这个效果.感觉已经可以了.日历感觉没什么用直接隐藏了.

  9. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

  10. 第一篇博客-MVC路由简述

    一直念叨着写博客,可是迟迟不见下笔,工作到现在,技术长进了一点,但是记的东西都很杂,也没个思路,也不知道怎么去写一遍博客,现在在做MVC,写一点跟MVC有关的吧. 我们都知道MVC程序的所有请求都是先 ...

随机推荐

  1. 廖雪峰JS知识点整理——快速入门

    基本语法 1.每个语句以:结尾. 2.单行注释://... 3.多行注释:/*... ...*/ 数据类型和变量 运算 1.==自动转换数据类型在比较,不推荐使用 2.===不会转换数据类型,推荐使用 ...

  2. golang 生成Sqlserver数据表实体

    最近开始学习golang,公司原来 很多项目都 Sqlserver数据库的,世面上很多文章,都是关于Mysql的,自己参考了一个博主的文章,整了一个生成Sqlserver实体的小工具分享一下,能给个星 ...

  3. 《视觉SLAM十四讲》visual studio 19 + PCL点云创建图像与现实

    SLCM真是博大精深.之前简单的学习了OpenCV,主要是是使用python语言,现在学习SLAM需要使用C++,略难,但比起SLAM本身,不值一提. <视觉SLAM十四讲>里面的环境主要 ...

  4. 【Unity】拖动图片生成对应Image

    写在前面 拼UI时会用到多个Image,一般操作是:①新建一个Image,②拖入Image用到的图片,③SetNativeSize,④关闭不必要的raycastTarget .为了能尽快拼完UI,我写 ...

  5. NodeJS - XSS

    首先进入/skf-labs-master/XSS文件夹下,执行命令: $ npm install $ npm start 抓包看看内容 查看源码 app.post("/home", ...

  6. C++ 全面总结

    1. 基本数据类型:没什么好说的.知道浮点数存储起来不精确.各种类型占的大小在不同平台可能不一样就行了 2. 初始化列表:能用就用.能防止潜在的类型收窄, 3. static_cast 和 dynam ...

  7. echarts 玫瑰图+中间文字

    option = { tooltip: { trigger: 'item', formatter: '{a} <br/>{b}: {c} ({d}%)' }, title: { text: ...

  8. MySQL代替in之临时表

    如果我们正常的使用IN去查询 SELECT * FROM a JOIN b ON a.id = b.id WHERE b.tag_id IN (1,2,3,4,5,6) 这种因为in里面的参数是连续的 ...

  9. Matlab %陆

    第六章 MATLAB IN ENGINEERING Polynomial Differentiation多项式微分  %幂级数 f(x) = x^3-2x-5; p = [1 0 -2 -5]  %自 ...

  10. 在VS中使用Wind数据终端API的经验(一)

    因工作需要,使用vs2019来调用Wind金融终端API数据接口.具体步骤按照wind的帮助文档一步步做下来.这里提一下和帮助文档不同的地方. Windows Console APP下,编译项目后出现 ...