
Servlet:server applet
Servlet 即运行在服务器端的小程序

package com.example.webdemo;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
}
package com.example.webdemo;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
<web-app> 根标签里配置 <servlet> 与 <servlet-mapping> 中的内容<?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_4_0.xsd"
version="4.0">
<!--配置内容-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.example.webdemo.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>Run --> Edit Configurations... --> Tomcat 9.0.46 --> Deployment --> Application context
web.xml 文件,是否有对应的 <url-pattern> 标签体内容<servlet-class> 全类名
init 方法,只执行一次<load-on-startup> <load-on-startup> 为负值<load-on-startup> 为 0 或 正整数<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>com.example.webdemo.Demo1</servlet-class>
<!-- 指定 Servlet 的创建时机
1. 第一次被访问时,创建
* <load-on-startup> 的值为负值
2. 在服务器启动时,创建
* <load-on-startup> 的值为0或正整数
-->
<load-on-startup>5</load-on-startup>
</servlet><load-on-startup> 为正值的结果。


service 方法,执行多次destroy 方法,只执行一次destroy 方法destroy 方法在 Servlet 被销毁之前执行,一般用于释放资源(临终交代遗言)package com.example.webdemo;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
/**
* 初始化方法
* 在 Servlet 被创建时,执行。只会执行一次
*
* @param servletConfig
* @throws ServletException
*/ @Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init......");
}
/**
* 提供服务方法
* 每一次Servlet被访问,执行。执行多次
*
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务方法
* 每一次 Servlet 被访问是,执行,执行多次
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/ @Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service......");
}
/**
* 获取 Servlet 的一些信息,版本,作者等等。。。
*
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在服务器正常关闭是,执行,执行一次
*
*/
@Override
public void destroy() {
System.out.println("destroy......");
}
}<load-on-startup> <load-on-startup> 为负值<load-on-startup> 为 0 或 正整数<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>com.example.webdemo.Demo1</servlet-class>
<!-- 指定 Servlet 的创建时机
1. 第一次被访问时,创建
* <load-on-startup> 的值为负值
2. 在服务器启动时,创建
* <load-on-startup> 的值为0或正整数
-->
<load-on-startup>5</load-on-startup>
</servlet><load-on-startup> 为正值的结果。

支持注解配置。可以不需要 web.xml 了
3.0以上的版本,可以不创建 web.xml@WebServlet 注解,进行配置WebServlet("资源路径")在类前加入 @WebServlet 注解并配置 urlPatterns 即可。
WebServlet(urlPatterns = "/demo1")
value 的特性: 表示最重要的属性
由于注解 @WebServlet 括号中只有一个属性,value 可以不写
示例:
@WebServlet(value = "/demo1") //value 可以不写
@WebServlet("/demo1")

Servlet – 接口 ↓ GenericServlet – 抽象类 ↓ HttpServlet – 抽象类
代码 【GenericServlet.java】
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package javax.servlet;
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.ResourceBundle;
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
private transient ServletConfig config;
public GenericServlet() {
}
public void destroy() {
}
public String getInitParameter(String name) {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getInitParameter(name);
}
}
public Enumeration<String> getInitParameterNames() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getInitParameterNames();
}
}
public ServletConfig getServletConfig() {
return this.config;
}
public ServletContext getServletContext() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletContext();
}
}
public String getServletInfo() {
return "";
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public void log(String msg) {
this.getServletContext().log(this.getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
this.getServletContext().log(this.getServletName() + ": " + message, t);
}
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
public String getServletName() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletName();
}
}
}由于我们常用的只有 service 方法,所以 GenericServlet 就将其它方法默认空实现,只把 service 方法抽象实现。

@WebServlet({"/d4","/dd4","/ddd4"})/xxx :路径匹配 --> @WebServlet({"/user/demo4"})/xxx/xxx :多层路径,目录结构 --> @WebServlet("/user/demo4")*.do :扩展名匹配 --> @WebServlet("/*")