Servlet
NO |
javax.servlet.Servlet |
javax.servlet.GenericServlet |
javax.servlet.http.
|
继承结构 | 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) |
生命周期方法 |
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不是线程安全的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)