Java Servlet详解(注解配置+生命周期)

什么是Servlet : (Server applet)?

顾名思义:服务端的小程序

Servlet只是一个接口,定义了Java被浏览器访问到(Tomcat)的识别规则,我们需要定义一个类来实现Servlet接口

创建一个项目流程

1.创建一个JavaEE项目

2.定义一个类实习Servlet方法

3.实现接口中的抽象方法

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Servlet implements javax.servlet.Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
} @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("访问");
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() {
System.out.println("关闭");
}
}

4.在WEB.XML中配置Servelt

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>

结果



执行原理加图解

1.当服务器接受到服务器请求的时候,会先解析浏览器的UPL地址,获取访问服务的路径

2.然后查找WEB.xml文件,查看是否有对应的标签体的内容

3.如果有,则找到对应的全类名

4.tomcat会将字节码文件加载进内存,并且创建其对象

5.调用其方法

Servlet的生命周期

1.被创建:执行init方法只执行一次

Servlet什么时候创建?

默认情况:在第一次被访问的时候创建

可以在配置执行Servlet的创建时机

在标签下配置

  1. 第一次被访问时,创建

    的值为负数
  2. 在服务器启动时,创建

    的值为0或正整数

注意

  • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
  • 多个用户同时访问时,可能存在线程安全问题。
  • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

2. 提供服务:执行service方法,执行多次

* 每次访问Servlet时,Service方法都会被调用一次。

3. 被销毁:执行destroy方法,只执行一次

* Servlet被销毁时执行。服务器关闭时,Servlet被销毁

* 只有服务器正常关闭时,才会执行destroy方法。

* destroy方法在Servlet被销毁之前执行,一般用于释放资源

Servlet3.0

好处:支持注解配置,不需要使用web.xml了

步骤:

1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml

2. 定义一个类,实现Servlet接口

3. 复写方法

4. 在类上使用@WebServlet注解,进行配置

* @WebServlet("资源路径")

				@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相当于<Servlet-name> String[] value() default {};//代表urlPatterns()属性配置 String[] urlPatterns() default {};//相当于<url-pattern> int loadOnStartup() default -1;//相当于<load-on-startup> WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default "";
}

代码

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class Servlet implements javax.servlet.Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
} @Override
public ServletConfig getServletConfig() {
return null;
} @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("访问");
} @Override
public String getServletInfo() {
return null;
} @Override
public void destroy() {
System.out.println("关闭");
}
}

相比于之前更加简洁,使用更加方便



IDEA中Tomcat的相关配置

1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件

* 查看控制台的log:Using CATALINA_BASE: "C:\Users\86151.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_31_CSDNWeb"

地址来源

2. 工作空间项目和tomcat部署的web项目

* tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源

* WEB-INF目录下的资源不能被浏览器直接访问。

3. 断点调试:使用"小虫子"启动 dubug 启动

Servlet的体系结构

GenericServlet

将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象

将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

HttpServlet

对http协议的一种封装,简化操作

1. 定义类继承HttpServlet

2. 复写doGet/doPost方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
} if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}

** Servlet相关配置**

1. urlpartten:Servlet访问路径

1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})

2. 路径定义规则:

1. /xxx:路径匹配

2. /xxx/xxx:多层路径,目录结构

3. *.do:扩展名匹配

以上就是Tomcat与Servlet的一些基础知识,喜欢我的可以关注收藏,我会经常更新文章

Java Servlet详解(体系结构+注解配置+生命周期)的更多相关文章

  1. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  2. 三张图片详解Asp.Net 全生命周期

    用三张图片详解Asp.Net 全生命周期 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1  第一张图片从全局说明从客户端 ...

  3. JSP和selevt 生命周期详解(JSP的生命周期和select很像,jsp底层就是一个selevt)

    JSP: JSP的生命周期指从创建到销毁的整个过程.分为以下几个阶段: 1:编译阶段:servlet引擎编译servlet源文件,生成servlet类.当浏览器请求JSP页面时,JSP引擎会首先去检查 ...

  4. 详解SSH注解配置,bean注解、事物注解等

    使用过SSH注解的屌丝们都知道,要想使用注解需要在applicationContext.xml配置文件里面开启注解配置,开启方式如下:1.头部声明需加入xmlns:context="http ...

  5. 详解Android Activity---Activity的生命周期

    转载注明来自:  http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期:  Activity的生命周期大概可以归为三部分 整个的生命周期:o ...

  6. Maven详解(六)------ 生命周期

    1.什么是 生命周期? Maven 强大的原因是有一个十分完善的生命周期,生命周期可以理解为项目构建步骤的集合,它定义了各个构建环节的执行顺序,有了这个顺序,Maven 就可以自动化的执行构建命令. ...

  7. angularjs link compile与controller的区别详解,了解angular生命周期

     壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中简单提及了自定义指令中的link链接函数与compile编译函数,并说到两者具有互斥特性,即同时存在link与c ...

  8. Java虚拟机详解----常用JVM配置参数

    本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多 ...

  9. 【转】Java虚拟机详解----常用JVM配置参数

    原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html 本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 零.在IDE的后台打印GC日志: ...

随机推荐

  1. Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏

    Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏: try { // 转备案按钮 let transferSpecialRequestButton = parent.p ...

  2. hive中标准偏差函数stddev()详细讲解

    1.标准偏差概念 标准偏差(Std Dev,Standard Deviation) -统计学名词.一种度量数据分布的分散程度之标准,用以衡量数据值偏离算术平均值的程度.标准偏差越小,这些值偏离平均值就 ...

  3. Yarn的安装和全局配置(源/缓存位置/全局安装位置)

    本文安装环境: Win10 64位 前置条件: 已安装好Node环境(参考Node安装与环境配置) 下载和安装 Yarn安装包下载地址 全局配置 控制台输入命令, 正常显示版本表示安装成功 $ yar ...

  4. 用WebIDE(coding)编写c语言

    本期教程有对应视频 首先注册登录coding,打开coding的Cloud Studio 创建一个新的工作环境 安装依赖命令build-essential sudo apt-get update su ...

  5. Synchronized锁的是什么?

    Synchronized锁的是什么? 临界区与锁 并发编程中不可避免的会出现多个线程共享同一个资源的情况,为了防止出现数据不一致情况的发生,人们引入了临界区的概念.临界区是一个用来访问共享资源的代码块 ...

  6. CountDownLatch 线程工具类

    CountDownLatch:概念是,允许一个或多个线程等待其他线程完成操作: 在线程基础知识中,学习过线程的join方法,当前线程阻塞等待join线程执行完毕才能执行: 测试代码如下: public ...

  7. Redis做为缓存的几个问题

    缓存理流程: 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果. 1.缓存雪崩 解决方案3:如果缓存数据库是分布 ...

  8. 利用SignalR实施响应股票数据波动

    1.新建ASP.NET Web应用程序,  选择Empty模板. 2.创建Stock.cs类 public class Stock { /// <summary> /// 价格 /// & ...

  9. XSS 跨站脚本

    xss常用绕过姿势 大小写绕过 利用语句: http://192.168.1.102/xss/example2.php?name=<sCript>alert("hey!" ...

  10. Ubuntu systemctl 查看管理系统启动项

    Ubuntu systemctl 查看系统启动项 列出所有启动项: sudo systemctl list-unit-files 会列出开启的和未开启的: 使用grep过滤一下开启的grep enab ...