随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

Servlet

NO

javax.servlet.

Servlet

javax.servlet.

GenericServlet

javax.servlet.http.

HttpServlet

继承结构 public interface Servlet

public abstract class GenericServlet

extends java.lang.Object

implements Servlet, ServletConfig, java.io.Serializable

public abstract class HttpServlet

extends GenericServlet

implements java.io.Serializable

 

Servlet接口中的方法:

*** Servlet中的方法大多数(生命周期方法)不由用户调用,而是由服务器(如:Tomcat)调用,并且Servlet对象也是服务器创建 ***

NO

方法名

类型

参数

作用

1
public void init(ServletConfig config)
          throws ServletException
生命周期方法 config : 一个 ServletConfig 对象,包含 servlet 的配置和初始化参数 在Servlet对象创建后马上调用一次!(出生后的初始化)
2

public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException

生命周期方法

request - 

response - 

服务方法:每次处理请求都是调用这个方法
3 public void destroy() 生命周期方法 在Servlet被销毁之前调用,只调用一次!(临终)
4 public ServletConfig getServletConfig() 普通方法 获取Servlet的配置信息
5 public String getServletInfo() 普通方法 获取Servlet信息

浏览器如何找到对应的Servlet?

如果你的web项目没有web.xml配置文件,请查看:

https://www.cnblogs.com/0099-ymsml/p/16098991.html

通过配置文件:

<Servlet>
<Servlet-name>自定义的名称1</Servlet-name>
<Servlet-class>创建的Servlet.java文件的路径:cn.mlcd.servlet.AServlet</Servlet-class>
</Servlet>


<Servlet-mapping>
<Servlet-name>自定义名称1(必须与上面的相同)</Servlet-name>
<url-pattern>/AServlet(自定义的浏览器访问的url)</url-pattern>
</Servlet-mapping>

当浏览器通过<url-pattern>中的url进行访问的时候,会通过下面的自定义名称1与上面的相同名称匹配,然后在找到上面名称下对应的<Servlet-class>中的Servlet.java文件的路径进行访问。

例如配置信息如下:

<Servlet>
<Servlet-name>AAA</Servlet-name>
<Servlet-class>cn.mlcd.servlet.AServlet</Servlet-class>
</Servlet>


<Servlet-mapping>
<Servlet-name>AAA</Servlet-name>
<url-pattern>/AServlet</url-pattern>
</Servlet-mapping>

 

当我在浏览器中访问 http://localhost:8080/ServletPro(项目名称)/AServlet 先通过下面的 AAA 找到上面的 AAA,然后通过上面的 AAA 找到 servlet.java 文件的路径是 cn.mlcd.servlet.AServlet,其实就是在访问 cn.mlcd.servlet.AServlet 的 Servlet.java 文件。

新建一个类继承Servlet:

package cn.mlcd.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

/**
 * 查看Servlet接口中的方法
 * @author CDU_LM
 *
 */
public class AServlet implements Servlet {
    
    /**
     * 生命周期方法
     * 在Servlet被销毁之前调用,只调用一次!(临终)
     */
    @Override
    public void destroy() {
        System.out.println("destroy()。。。。");
    }
    
    /**
     * 获取Servlet的配置信息
     */
    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig()。。。。");
        return null;
    }
    
    /**
     * 获取Servlet信息
     */
    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo()。。。。");
        return null;
    }
    
    /**
     * 生命周期方法
     * 在Servlet对象创建后马上调用一次!(出生后的初始化)
     */
    @Override
    public void init(ServletConfig config) 
            throws ServletException {
        System.out.println("init()。。。。");
    }
    
    /**
     * 生命周期方法
     * 服务方法:每次处理请求都是调用这个方法
     */
    @Override
    public void service(ServletRequest request, ServletResponse response) 
            throws ServletException, IOException {
        System.out.println("service()。。。。.");
    }

}

配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    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>AAA</servlet-name>
        <servlet-class>cn.mlcd.servlet.AServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>AAA</servlet-name>
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>


</web-app>

启动服务器后在浏览器中输入 http://localhost/ServletPro/AServlet/ 

 

 

一片空白,但是没有404,,再看eclipse的控制台:

 

说明这个AServlet的调用成功了。

提示:每一次修改AServlet中的代码,在保存后都相当于新的Servlet,因为会调用destroy()方法,并且修改后再进入浏览器页面会调用init()方法,所以不要在启动服务器后频繁地修改

 

在浏览器中不断地访问Servlet资源只会重复调用service()方法,init()方法只会在第一次访问时调用,而destroy()方法一般是在服务器关闭的时候进行调用。

在整个访问过程中,服务器只创建了一个Servlet对象,所以可以的得出:Servlet是单例的(每一个继承Servlet的类在创建时只有一个对象,但是可以有多个类)。

当这个类在同一时间有多个人访问,那么它就会同时处理多个请求,这时候就是非线程安全的,所以Servlet不是线程安全的。

 

posted on 2022-04-04 14:39  时间完全不够用啊  阅读(67)  评论(0编辑  收藏  举报