一、基本概念
概念 |
---|
Servlet(server applet):运行在服务器端的小程序,简单说就是实现让用户通过浏览器可以访问到java类方法,让服务器(比如TomCat)识别运行java类的一种技术 |
快速入门https://blog.csdn.net/grd_java/article/details/104939956 |
---|
如果你没有接触过servlet,请先访问上面的链接,跟着流程走一遍,本文章主要记录重点,以下会讲快速入门为什么要内样做,而不会手把手走流程 |
创建一个java EE项目 |
定义一个类,实现Servlet接口 |
实现接口中的抽象方法 |
配置Servlet |
部署到TomCat,浏览器请求url运行 |
1、首先创建一个web项目,不会的请参考上面快速入门链接
2、使用maven引入相关依赖
3、创建一个类,继承Servlet接口
4、配置web.xml文件,配置servlet
<?xml version="1.0" encoding="UTF-8"?><!-- 这是xml文档的文档声明 -->
<!--
- 这是XML Schema格式约束文件,此文件将约束用户编写xml文档的规则
-->
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--
- 映射一个servlet,简单的说,就是
- 如果我们把每一个servlet当成一个小程序,那么这一系列功能的实现代码(类)就抽象成一个小程序
- 我们需要在这里配置,让某些使用者(服务器,浏览器)知道,哪些是servlet,哪些是普通的用户访问不到的类,而
- servlet类(并且要配置到这里),就可以被用户通过url路径访问到
- 那么一个完整的程序,servlet一定不止一个,那么就需要先区分不同的servlet,所有下面<servlet>标签主要用于
- 指定一个servlet类,配置到当前的配置文件里,让使用者能够知道这个类是一个servlet。下面<servlet-class>com.yzpnb.servlet.Dome1</servlet-class>完成此功能
- 为这个servlet起一个唯一名字,用于区分不同servlet。下面<servlet-name>demo1</servlet-name>完成此功能,起名为demo1
-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.yzpnb.servlet.Dome1</servlet-class>
</servlet>
<!--
- 上面已经指定了一个类为servlet类,并为它起了一个唯一姓名
- 那么现在我们就可以通过这个唯一的姓名来对它进行额外配置
- 我们说过,servlet是通过浏览器访问url路径访问得到的,那么我们就需要给servlet指定一个url映射
- 指定映射后,当用户按规则访问指定路径后,即可请求到相应servlet中执行功能
- 首先<servlet-mapping>用来配置servlet映射
- 其后,指定为哪个servlet(通过唯一名字来指定)配置映射<servlet-name>demo1</servlet-name>
- 最后,为其配置url映射路径<url-pattern>/demo1</url-pattern>
-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
5、创建一个jsp页面当做入口
6、配置TomCat访问项目(和快速入门中一样,参考快速入门标题"将web项目发布到tomcat服务器")
执行原理 |
---|
这里我说最后直接执行service方法,其实并不是这么回事,你暂时可以理解是执行service方法 |
二、servlet的生命周期
生命周期方法 |
---|
下面阐述的都是默认情况下,生命周期的执行时机可以通过配置更改 |
package com.yzpnb.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* servlet快速入门
*/
public class Dome1 implements Servlet {
/**
* 初始化方法,在servlet被创建的时候执行。只会执行一次
* @param servletConfig
* @throws ServletException
*/
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.............");
}
/**
* 获取servlet的配置对象(与生命周期无关)
* @return
*/
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
* 每一次servlet被访问时执行
*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service..........");
}
/**
* 获取servlet的信息(与生命周期无关)
* @return
*/
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在servlet被销毁时执行(服务器正常关闭时)
*/
public void destroy() {
System.out.println("destroy..............");
}
}
servlet生命周期相关配置 |
---|
修改servlet创建时机,在< servlet >标签下配置即可
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.yzpnb.servlet.Dome1</servlet-class>
<!--
- <load-on-startup>标签用于指定servlet创建时机(默认是-1)
- 如果标签内容是负数,会在servlet第一次访问时创建
- 如果标签内容是0或正整数,会在服务器启动时创建
-->
<load-on-startup>5</load-on-startup>
</servlet>
三、servlet3.0基于注解配置
为什么使用注解配置 |
---|
如果我们有成百上千个servlet,全部配置到web.xml中,会十分混乱,所以官方在3.0标准中支持了注解配置 |
有了注解配置,就可以不需要web.xml了 |
简单使用注解实现servlet映射 |
---|
小细节 |
---|
注解写法的简化 |
四、servlet体系结构
servlet接口有两个实现类 |
---|
GenericServlet:抽象类,除了service外的方法都进行空实现,也就是我们继承此类,只需要重写service方法(因为此实现类只抽象了service方法),其它方法选择性重写即可 |
HttpServlet:抽象类,对HTTP协议的一个封装和描述,将service封装成doGet和doPost方法,我们继承此类后只需要在需要的地方重写doGet和doPost方法即可 |
HttpServlet源码分析