涛声依旧在 发表于 2026-2-11 07:57:19

JavaWeb中的Servlet

本条记基于【尚硅谷全新JavaWeb教程,企业主流javaweb技能栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_source=a91dafe0f846ad7bd19625e392cf76d8总结
Servlet

Servlet简介

动态资源和静态资源

   静态资源


[*]无需在步调运行时通过代码运行天生的资源,在步调运行之前就写好的资源. 比方:html css js img ,音频文件和视频文件
   动态资源


[*]须要在步调运行时通过代码运行天生的资源,在步调运行之前无法确定的数据,运行时动态天生,比方Servlet,Thymeleaf … …
[*]动态资源指的不是视图上的动画效果大概是简单的人机交互效果
   生存举例


[*]去蛋糕店买蛋糕
   
[*]直接买柜台上已经做好的 : 静态资源   
[*]和柜员说要求后现场制作 : 动态资源   

Servlet简介

   Servlet (server applet) 是运行在服务端(tomcat)的Java小步调,是sun公司提供一套界说动态资源规范; 从代码层面上来讲Servlet就是一个接口


[*]用来吸收、处置惩罚客户端哀求、相应给欣赏器的动态资源。在整个Web应用中,Servlet告急负责吸收处置惩罚哀求、协同调理功能以及相应数据。我们可以把Servlet称为Web应用中的控制器
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNTEwYTUwNzMxYjcwNDQzNWIwN2RiZTY5OWI5MjExYjIucG5n


[*]不是全部的JAVA类都能用于处置惩罚客户端哀求,能处置惩罚客户端哀求并做出相应的一套技能标准就是Servlet
[*]Servlet是运行在服务端的,以是 Servlet必须在WEB项目中开辟且在Tomcat如许的服务容器中运行
   哀求相应与HttpServletRequest和HttpServletResponse之间的对应关系
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvMTgyOTIwNGRlZWY5NWI1N2U5NzRlN2NkNDk3MTE4ZWQucG5n
servlet详细运行流程
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvYTI5OGIyNmZhZDg3NTI0NmIyNWJlOGYwODFkNDRmNmEucG5n
Servlet开辟流程

目标

   校验注册时,用户名是否被占用. 通过客户端向一个Servlet发送哀求,携带username,假如用户名是’atguigu’,则向客户端相应 NO,假如是其他,相应YES
开辟过程

   步调1 开辟一个web范例的module


[*]过程参照之前
   步调2 开辟一个UserServlet
public class UserServletextends HttpServlet {
   
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
      // 获取请求中的参数
      String username = req.getParameter("username");
      if("atguigu".equals(username)){
   
   
            //通过响应对象响应信息
            resp.getWriter().write("NO");
      }else{
   
   
            resp.getWriter().write("YES");
      }

    }
}


[*]自界说一个类,要继承HttpServlet类
[*]重写service方法,该方法告急就是用于处置惩罚用户哀求的服务方法
[*]HttpServletRequest 代表哀求对象,是有哀求报文颠末tomcat转换而来的,通过该对象可以获取哀求中的信息
[*]HttpServletResponse 代表相应对象,该对象会被tomcat转换为相应的报文,通过该对象可以设置相应中的信息
[*]Servlet对象的生命周期(创建,初始化,处置惩罚服务,烧毁)是由tomcat管理的,无需我们自己new
[*]HttpServletRequest HttpServletResponse 两个对象也是有tomcat负责转换,在调用service方法时传入给我们用的
   步调3 在web.xml为UseServlet设置哀求的映射路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <servlet>
      <!--给UserServlet起一个别名-->
      <servlet-name>userServlet</servlet-name>
      <servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
    </servlet>


    <servlet-mapping>
      <!--关联别名和映射路径-->
      <servlet-name>userServlet</servlet-name>
      <!--可以为一个Servlet匹配多个不同的映射路径,但是不同的Servlet不能使用相同的url-pattern-->
      <url-pattern>/userServlet</url-pattern>
       <!-- <url-pattern>/userServlet2</url-pattern>-->
      <!--
            /      表示通配所有资源,不包括jsp文件
            /*       表示通配所有资源,包括jsp文件
            /a/*   匹配所有以a前缀的映射路径
            *.action 匹配所有以action为后缀的映射路径
      -->
       <!-- <url-pattern>/*</url-pattern>-->
    </servlet-mapping>

</web-app>


[*]Servlet并不是文件体系中现实存在的文件大概目次,以是为了可以大概哀求到该资源,我们须要为其设置映射路径
[*]servlet的哀求映射路径设置在web.xml中
[*]servlet-name作为servlet的别名,可以自己随意界说,见名知意就好
[*]url-pattern标签用于界说Servlet的哀求映射路径
[*]一个servlet可以对应多个差别的url-pattern
[*]多个servlet不能使用雷同的url-pattern
[*]url-pattern中可以使用一些通配写法
   
[*]/ 体现通配全部资源,不包罗jsp文件   
[*]/* 体现通配全部资源,包罗jsp文件   
[*]/a/* 匹配全部以a前缀的映射路径   
[*]*.action 匹配全部以action为后缀的映射路径   

   步调4 开辟一个form表单,向servlet发送一个get哀求并携带username参数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="userServlet">
      请输入用户名:<input type="text" name="username" /> <br>
      <input type="submit" value="校验">
    </form>
</body>
</html>
   启动项目,访问index.html ,提交表单测试


[*]使用debug模式运行测试
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzhlY2M0ZjZjMDQyNDllZmE0MjZjNGQ0YzU3NGFiOTcucG5n
   映射关系图
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvYTVlYThkNDdmNDI3MTE5MWRkNDIwN2IyM2Y5M2ZhMmYucG5n
Servlet注解方式设置

@WebServlet注解源码

   官方JAVAEEAPI文档下载地点


[*] Java EE - Technologies (oracle.com)

[*] @WebServlet注解的源码阅读

package jakarta.servlet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @since Servlet 3.0
*/
@Target({
   
    ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
   
   

    /**
   * The name of the servlet
   * 相当于 servlet-name
   * @return the name of the servlet
   */
    String name() default "";

    /**
   * The URL patterns of the servlet
   * 如果只配置一个url-pattern ,则通过该属性即可,和urlPatterns属性互斥
   * @return the URL patterns of the servlet
   */
    String[] value() default {
   
   };

    /**
   * The URL patterns of the servlet
   * 如果要配置多个url-pattern ,需要通过该属性,和value属性互斥
   * @return the URL patterns of the servlet
   */
    String[] urlPatterns() default {
   
   };

    /**
   * The load-on-startup order of the servlet
   * 配置Servlet是否在项目加载时实例化
   * @return the load-on-startup order of the servlet
   */
    int loadOnStartup() default -1;

    /**
   * The init parameters of the servlet
   * 配置初始化参数
   * @return the init parameters of the servlet
   */
    WebInitParam[] initParams() default {
   
   };

    /**
   * Declares whether the servlet supports asynchronous operation mode.
   *
   * @return {@code true} if the servlet supports asynchronous operation mode
   * @see jakarta.servlet.ServletRequest#startAsync
   * @see jakarta.servlet.ServletRequest#startAsync( jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse)
   */
    boolean asyncSupported() default false;

    /**
   * The small-icon of the servlet
   *
   * @return the small-icon of the servlet
   */
    String smallIcon() default "";

    /**
   * The large-icon of the servlet
   *
   * @return the large-icon of the servlet
   */
    String largeIcon() default "";

    /**
   * The description of the servlet
   *
   * @return the description of the servlet
   */
    String description() default "";

    /**
   * The display name of the servlet
   *
   * @return the display name of the servlet
   */
    String displayName() default "";

}

@WebServlet注解使用

   使用@WebServlet注解更换Servlet设置
@WebServlet(
      name = "userServlet",
      //value = "/user",
      urlPatterns = {
   
   "/userServlet1","/userServlet2","/userServlet"},
      initParams = {
   
   @WebInitParam(name = "encoding",value = "UTF-8")},
      loadOnStartup = 6
)
public class UserServletextends HttpServlet {
   
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
      String encoding = getServletConfig().getInitParameter("encoding");
      System.out.println(encoding);
      // 获取请求中的参数
      String username = req.getParameter("username");
      if("atguigu".equals(username)){
   
   
            //通过响应对象响应信息
            resp.getWriter().write("NO");
      }else{
   
   
            resp.getWriter().write("YES");
      }
    }
}
Servlet生命周期

https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvOTRkMmExMzgxYjNlODY3ZjE0MDEwMDkxZTkwNDUzZWMucG5n
生命周期简介

   什么是Servlet的生命周期


[*]应用步调中的对象不但在空间上有条理布局的关系,在时间上也会由于处于步调运行过程中的差别阶段而体现出差别状态和差别举动——这就是对象的生命周期。
[*]简单的叙述生命周期,就是对象在容器中从开始创建到烧毁的过程。
   Servlet容器


[*]Servlet对象是Servlet容器创建的,生命周期方法都是由容器(现在我们使用的是Tomcat)调用的。这一点和我们之前所编写的代码有很大差别。在以后的学习中我们会看到,越来越多的对象交给容器或框架来创建,越来越多的方法由容器或框架来调用,开辟职员要尽大概多的将精神放在业务逻辑的实现上。
   Servlet告急的生命周期实行特点
       生命周期    对应方法    实行时机    实行次数              构造对象    构造器    第一次哀求大概容器启动    1          初始化    init()    构造完毕后    1          处置惩罚服务    service(HttpServletRequest req,HttpServletResponse resp)    每次哀求    多次          烧毁    destory()    容器关闭    1       生命周期测试

   开辟servlet代码
package com.atguigu.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ServletLifeCycleextends HttpServlet {
   
   
    public ServletLifeCycle(){
   
   
      System.out.println("构造器");
    }

    @Override
    public void init() throws ServletException {
   
   
      System.out.println("初始化方法");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
      System.out.println("service方法");
    }

    @Override
    public void destroy() {
   
   
      System.out.println("销毁方法");
    }
}

   设置Servlet

    <servlet>
      <servlet-name>servletLifeCycle</servlet-name>
      <servlet-class>com.atguigu.servlet.ServletLifeCycle</servlet-class>
      <!--load-on-startup
            如果配置的是正整数则表示容器在启动时就要实例化Servlet,
            数字表示的是实例化的顺序
      -->
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>servletLifeCycle</servlet-name>
      <url-pattern>/servletLiftCycle</url-pattern>
    </servlet-mapping>


[*]哀求Servlet测试

生命周期总结


[*]通过生命周期测试我们发现Servlet对象在容器中是单例的
[*]容器是可以处置惩罚并发的用户哀求的,每个哀求在容器中都会开启一个线程
[*]多个线程大概会使用雷同的Servlet对象,以是在Servlet中,我们不要容易界说一些容易经常发生修改的成员变量
[*]load-on-startup中界说的正整数体现实例化次序,假如数字重复了,容器会自行办理实例化次序题目,但是应该克制重复
[*]Tomcat容器中,已经界说了一些随体系启动实例化的servlet,我们自界说的servlet的load-on-startup只管不要占用数字1-5
Servlet继承布局

Servlet 接口

   源码及功能表明


[*]通过idea检察: 此处略
   接口及方法分析


[*]Servlet 规范接口,全部的Servlet必须实现
   
[*]public void init(ServletConfig config) throws ServletException;
      
[*]初始化方法,容器在构造servlet对象后,自动调用的方法,容器负责实例化一个ServletConfig对象,并在调用该方法时传入      
[*]ServletConfig对象可以为Servlet 提供初始化参数   
   
[*]public ServletConfig getServletConfig();
      
[*]获取ServletConfig对象的方法,后续可以通过该对象获取Servlet初始化参数   
   
[*]public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
      
[*]处置惩罚哀求并做出相应的服务方法,每次哀求产生时由容器调用      
[*]容器创建一个ServletRequest对象和ServletResponse对象,容器在调用service方法时,传入这两个对象   
   
[*]public String getServletInfo();
      
[*]获取ServletInfo信息的方法   
   
[*]public void destroy();
      
[*]Servlet实例在烧毁之前调用的方法   
   

GenericServlet 抽象类

   源码


[*]通过idea检察: 此处略
   源码表明


[*]GenericServlet 抽象类是对Servlet接口一些固定功能的粗糙实现,以及对service方法的再次抽象声明,并界说了一些其他相干功能方法
   
[*]private transient ServletConfig config;
      
[*]初始化设置对象作为属性   
   
[*]public GenericServlet() { }
      
[*]构造器,为了满足继承而准备   
   
[*]public void destroy() { }
      
[*]烧毁方法的平庸实现   
   
[*]public String getInitParameter(String name)
      
[*]获取初始参数的快捷方法   
   
[*]public Enumeration getInitParameterNames()
      
[*]返回全部初始化参数名的方法   
   
[*]public ServletConfig getServletConfig()
      
[*]获取初始Servlet初始设置对象ServletConfig的方法   
   
[*]public ServletContext getServletContext()
      
[*]获取上下文对象ServletContext的方法   
   
[*]public String getServletInfo()
      
[*]获取Servlet信息的平庸实现   
   
[*]public void init(ServletConfig config) throws ServletException()
      
[*]初始化方法的实现,并在此调用了init的重载方法   
   
[*]public void init() throws ServletException
      
[*]重载init方法,为了让我们自己界说初始化功能的方法   
   
[*]public void log(String msg)   
[*]public void log(String message, Throwable t)
      
[*]打印日记的方法及重载   
   
[*]public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
      
[*]服务方法再次声明   
   
[*]public String getServletName()
      
[*]获取ServletName的方法   
   

HttpServlet 抽象类

   源码


[*]通过idea检察: 此处略
   表明


[*]abstract class HttpServlet extends GenericServlet HttpServlet抽象类,除了根本的实现以外,增长了更多的根本功能
   
[*]private static final String METHOD_DELETE = “DELETE”;   
[*]private static final String METHOD_HEAD = “HEAD”;   
[*]private static final String METHOD_GET = “GET”;   
[*]private static final String METHOD_OPTIONS = “OPTIONS”;   
[*]private static final String METHOD_POST = “POST”;   
[*]private static final String METHOD_PUT = “PUT”;   
[*]private static final String METHOD_TRACE = “TRACE”;
      
[*]上述属性用于界说常见哀求方式名常量值   
   
[*]public HttpServlet() {}
      
[*]构造器,用于处置惩罚继承   
   
[*]public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
      
[*]对服务方法的实现      
[*]在该方法中,将哀求和相应对象转换成对应HTTP协议的HttpServletRequest HttpServletResponse对象      
[*]调用重载的service方法   
   
[*]public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
      
[*]重载的service方法,被重写的service方法所调用      
[*]在该方法中,通过哀求方式判定,调用详细的do***方法完成哀求的处置惩罚   
   
[*]protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException   
[*]protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
      
[*]对应差别哀求方式的处置惩罚方法      
[*]除了doOptions和doTrace方法,其他的do*** 方法都在故意相应错误信息   
   

自界说Servlet

   继承关系图解
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNDk3NDkxNzM2ZDAzZjgzN2UwYmVmY2Y5NDE0NzYxNzEucG5n


[*]自界说Servlet中,必须要对处置惩罚哀求的方法举行重写
   
[*]要么重写service方法   
[*]要么重写doGet/doPost方法   

ServletConfig和ServletContext

ServletConfig的使用

   ServletConfig是什么


[*]为Servlet提供初始设置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
[*]容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvMmJjOGZiZmZhNjhiNDAxM2E0OWUxOGI5MzEzNzg2MGMucG5n
   ServletConfig是一个接口,界说了如下API
package jakarta.servlet;
import java.util.Enumeration;
public interface ServletConfig {
   
   
    String getServletName();
    ServletContext getServletContext();
    String getInitParameter(String var1);
    Enumeration<String> getInitParameterNames();
}
       方法名    作用              getServletName()    获取<servlet-name>HelloServlet</servlet-name>界说的Servlet名称          getServletContext()    获取ServletContext对象          getInitParameter()    获取设置Servlet时设置的『初始化参数』,根据名字获取值          getInitParameterNames()    获取全部初始化参数名构成的Enumeration对象         ServletConfig怎么用,测试代码如下


[*]界说Servlet
public class ServletA extends HttpServlet {
   
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
      ServletConfig servletConfig = this.getServletConfig();
      // 根据参数名获取单个参数
      String value = servletConfig.getInitParameter("param1");
      System.out.println("param1:"+value);
      // 获取所有参数名
      Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
      // 迭代并获取参数名
      while (parameterNames.hasMoreElements()) {
   
   
            String paramaterName = parameterNames.nextElement();
            System.out.println(paramaterName+":"+servletConfig.getInitParameter(paramaterName));
      }
    }
}



public class ServletB extends HttpServlet {
   
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   
      ServletConfig servletConfig = this.getServletConfig();
      // 根据参数名获取单个参数
      String value = servletConfig.getInitParameter("param1");
      System.out.println("param1:"+value);
      // 获取所有参数名
      Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
      // 迭代并获取参数名
      while (parameterNames.hasMoreElements()) {
   
   
            String paramaterName = parameterNames.nextElement();
            System.out
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
页: [1]
查看完整版本: JavaWeb中的Servlet