Servlet(定义 配置 测试 原理 生命周期 方法:init() service() destory() Servlet配置 ServletConfig 创建Servlet方式:Servlet GenericServlet HttpServlet)
文章目录
Servlet:官方的定义 运行在服务器的小程序
Servlet:是一个接口
Servlet功能:
- 接受请求
- 处理请求
- 作出响应
Servlet
1. 创建一个web项目
2. 定义一个Java类实现Servlet接口
3. 重写Servlet中的方法
4. 配置Servlet 在Web
5. 配置Servlet
6. 发布项目 测试
重写Servlet中的方法
public class ServletSan 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("一树梨花压海棠");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
配置Servlet 在Web
- servlet-name:自定义名字
- servlet-class:定义的实现了Servlet的Java类的路径
- servlet-mapping的servlet-name与servlet中的servlet-name名字一致
- url-pattern:/+自定义名字
配置映射 一定要加/ 不加报错
可以配置多个映射
可以配置多级映射 /aaa/bbb
<servlet>
<servlet-name>ServletSan</servlet-name>
<servlet-class>SanWa.Servlet1.ServletSan</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletSan</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
配置TOMCAT等
访问
- 服务器自动打开后的页面加上你的自定义映射名
http://localhost:8080/Web1_war_exploded/test
概述
Servlet原理
服务器通过反射的方式 创建Servlet对象,调用其方法
生命周期
一个事物从生到死所经历的每个阶段
人的生命周期:出生 婴儿 幼儿 少儿 青年 壮年 中年 万年 died
Servlet生命周期
Servlet创建到销毁的过程 在不同的截断 就会调用不同的生命周期方法
Servlet的三个生命周期方法
1. init()
2. service()
3. destoty()
方法详解
init()
- 概念
1. init()
默认在浏览器第一次请求时 Servlet创建好之后 调用一次
这个方法 一般在里面做一些初始化的准备工作 读取配置文件等
只执行一次
Servlet是单例的 可能会存在线程安全问题 尽量不要定义成员变量
可以配置Servlet的创建时机
在web.xml的<servlet>标签中配置
<load-on-startup>
<!-- 修改servlet的创建时机:
* 负整数:默认值 -1,在第一次被访问时创建
* 非负整数:在服务器启动时创建
* 数字越小,优先级越高-->
<load-on-startup>0</load-on-startup>
- 代码
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("创建Servlet");
}
- 运行结果:只在第一次创建时执行
org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [592] ms
创建Servlet
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
- 启动时就调用init()
<!-- 修改servlet的创建时机:
* 负整数:默认值 -1,在第一次被访问时创建
* 非负整数:在服务器启动时创建
* 数字越小,优先级越高-->
<servlet>
<servlet-name>ServletSan</servlet-name>
<servlet-class>SanWa.Servlet1.ServletSan</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletSan</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
已连接到服务器
[2020-10-16 01:42:32,337] Artifact Web1:war exploded: 正在部署工件,请稍候…
...
org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [1,305] milliseconds.
创建Servlet
[2020-10-16 01:42:34,703] Artifact Web1:war exploded: 工件已成功部署
[2020-10-16 01:42:34,703] Artifact Web1:war exploded: Deploy took 2,366 milliseconds
...
org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [132] ms
service()
- 概念
2. service()
每一次被访问时,会调用service()方法提供服务
对外提供服务的核心方法(接受请求 处理请求 做出响应)
- 代码
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("一树梨花压海棠");
}
- 运行结果:每调用一次就执行一次
org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [592] ms
创建Servlet
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
destoty()
- 概念
3. destoty()
服务器关闭时 servlet被销毁
服务器正常关闭是 在销毁Servlet之前 会调用destory()方法
- 代码
public void destroy() {
System.out.println("销毁Servlet");
}
- 运行结果:销毁时调用(正常关闭服务器)
org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [592] ms
创建Servlet
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
一树梨花压海棠
D:\tomcat\apache-tomcat-9.0.14\bin\catalina.bat stop
Using CATALINA_BASE:
...
NOTE:
...
Stopping service [Catalina]
销毁Servlet
16-Oct-2020 11:49:39.579
...
已与服务器断开连接
ServletConfig
- ServletConfig对象:配置对象 ServletConfig是一个接口 在Servlet初始化的时候 有服务器创建其子类对象传递给 init()方法
Servlet中对应getServletConfig方法 使用该方法获取config对象
需要提升config对象的作用域
1.声明成员变量ServletConfig
2.在init方法中赋值
3.在getServletConfig方法中获取
- 代码
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
System.out.println("创建Servlet");
System.out.println(servletConfig);
}
- 运行结果
org.apache.catalina.core.StandardWrapperFacade@29cd3192
init配置ServletConfig
package SanWa.Servlet1;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class ServletSan implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
System.out.println("创建Servlet");
System.out.println(servletConfig);
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("销毁Servlet");
}
}
功能
1.获取servlet初始化参数
1.获取servlet初始化参数
String getInitParameter(String name)
Enumeration getInitParameterNames()
例子:
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String name = servletConfig.getInitParameter("name");
String word = servletConfig.getInitParameter("word");
System.out.println(name);
System.out.println(word);
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String s = initParameterNames.nextElement();
String initParameter = servletConfig.getInitParameter(s);
System.out.println(initParameter);
}
}
- 初始化参数可在 web.xml中配置
<servlet>
<servlet-name>ServletSan</servlet-name>
<servlet-class>SanWa.Servlet1.ServletSan</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>阿米娅</param-value>
</init-param>
<init-param>
<param-name>word</param-name>
<param-value>奇美拉</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletSan</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
- 运行结果
创建Servlet
org.apache.catalina.core.StandardWrapperFacade@29cd3192
阿米娅
奇美拉
阿米娅
奇美拉
org.apache.catalina.core.ApplicationContextFacade@270adadb
2.获取ServletContext对象
servletConfig 第二个作用可以获取全局域对象ServletContext对象
因为 ServletContext对象是由服务器创建出来的 我们要获取其对象 得通过ServletConfig对象中的方法才能获取出来
servletContext 全局上下文对象 代表整个Web工程
同时也是一个全局域对象 可以代表在他所代表的范围内 就行数据共享
servletContext 全局上下文对象 当服务器启动时 就会创建起对象 你只是通过配置对象把他获取出来用
ServletContext getServletContext()
- 代码
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(servletContext);
}
- 运行结果
创建Servlet
org.apache.catalina.core.StandardWrapperFacade@29cd3192
阿米娅
奇美拉
阿米娅
奇美拉
org.apache.catalina.core.ApplicationContextFacade@270adadb
3.获取servlet配置的名称
- 概念
servletConfig 配置对象 第三个作用可以获取web.xml配置的Servlet的名字
- 代码
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String servletName = servletConfig.getServletName();
System.out.println(servletName);
}
- 运行结果:
创建Servlet
org.apache.catalina.core.StandardWrapperFacade@29cd3192
阿米娅
奇美拉
阿米娅
奇美拉
org.apache.catalina.core.ApplicationContextFacade@270adadb
ServletSan
创建方式
1.实现Servlet
2.GenericServlet 继承
3.HttpServlet:对http协议的封装
GenericServlet 继承
- 概念
继承GenericServlet
1.适配器
2.对ServletConfig进行优化 提升config对象的作用域
3.实现了ServletConfig接口 简化对config对象的使用方式
- 代码
package SanWa.Servlet1;
import javax.servlet.*;
import java.io.IOException;
public class ServiceWa extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String name = servletConfig.getInitParameter("name");
String word = servletConfig.getInitParameter("word");
System.out.println(name);
System.out.println(word);
String name1 = this.getInitParameter("name");
String word1 = this.getInitParameter("word");
System.out.println(name1);
System.out.println(word1);
}
}
- 运行结果
阿米娅
奇美拉
阿米娅
奇美拉
HttpServlet
- 继承HttpServlet:对http协议的封装
重写doGet()和doPost()...方法 注意去掉super.doGet(); 和 super.doPost();
- 代码
package SanWa.Servlet1;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HTTPService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
doGet()与doPost()请求响应
- web.xml
<servlet>
<servlet-name>Servletsw</servlet-name>
<servlet-class>SanWa.Servlet1.HTTPService</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>阿米娅</param-value>
</init-param>
<init-param>
<param-name>word</param-name>
<param-value>奇美拉</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Servletsw</servlet-name>
<url-pattern>/wa</url-pattern>
</servlet-mapping>
- index.jsp
<%--
Created by IntelliJ IDEA.
User: yllch
Date: 2020/10/16
Time: 9:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="http://localhost:8080/Web1_war_exploded/wa" method="get" >
//<form action="http://localhost:8080/Web1_war_exploded/wa" method="post" >
用户名 <input type="text" name="username" >
密码 <input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
- 代码
public class HTTPService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
处理GET请求
*/
System.out.println("GET请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
处理POST请求
*/
System.out.println("POST请求");
}
}
- 运行结果
...
ID generation using [SHA1PRNG] took [1,501] milliseconds.
GET请求
...
[D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [860] ms
...
ID generation using [SHA1PRNG] took [1,501] milliseconds.
POST请求
...
[D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [860] ms
doGet与doPost的互相调用(减少重复代码 只用写一份代码)
public class HTTPService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET请求");
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST请求");
System.out.println("一树梨花压海棠");
this.doGet(req, resp);
}
}
运行结果:
[2020-10-16 04:18:22,266] Artifact Web1:war exploded: 工件已成功部署
[2020-10-16 04:18:22,266] Artifact Web1:war exploded: Deploy took 3,225 milliseconds
GET请求
POST请求
一树梨花压海棠
自动创建Servlet
- 新建==>创建新的Servlet
name = "ServletSanWa" 配置名字
value="/die" 配置Servlet的映射路径
urlPatterns = "/die" 配置Servlet的映射路径
- 代码
@WebServlet(name = "ServletSanWa",value="/die")
public class ServletSanWa extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("感时花溅泪");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 运行结果:
[D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [110] ms
感时花溅泪
ServletContext
- ServletContext
1全局的上下文对象
2.代表了整个web应用
3.由服务器在开启时就创建
- 特点
1.由服务器创建
2.单例
- 功能
ServletContext:全局的上下文对象 也是一个域对象
域:范围 ServletContext能在他所代表的范围内来共享数据
范围:整个web应用
方法
存储所有用户共享的数据
存储所有用户共享的数据
setAttribute(): 存储
getAttribute(): 获取
removeAttribute(): 删除域数据
- 代码
@WebServlet(name = "ServletSanWa",value="/die")
public class ServletSanWa extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("感时花溅泪");
String name="阿米娅";
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("name",name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
public class HTTPService extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GET请求");
ServletContext servletContext = this.getServletContext();
String name = String.valueOf(servletContext.getAttribute("name"));
System.out.println(name);
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST请求");
System.out.println("一树梨花压海棠");
}
}
- 运行结果
已连接到服务器
[2020-10-16 04:38:31,293] Artifact Web1:war exploded: 正在部署工件,请稍候…
...
[2020-10-16 04:38:34,174] Artifact Web1:war exploded: 工件已成功部署
...
[D:\tomcat\apache-tomcat-9.0.14\webapps\manager] has finished in [71] ms
感时花溅泪
GET请求
阿米娅
POST请求
一树梨花压海棠
JavaWeb中四大域对象:
- ServletContext:代表整个web应用
- HttpSession:会话域
- ServletRequest:请求域
- PageContext:页面域
获取文件mime类型:
-
getMimeType(文件名称):
-
获取文件运行的真实路径:
-
真实路径:指服务器路径
-
getRealPath():
-
1.webRoot下:项目根目录下
-
2.WEB-INF下: 项目根目录下/WEB-INF
-
3.src下: 项目根目录下/WEB-INF/classes
-
*注意:如果getRealPath("/"),获取的路径是项目的根目录
//根目录
ServletContext context = this.getServletContext(); String rootpath = context.getRealPath("/"); //System.out.println(rootpath); //1.webRoot String b = context.getRealPath("/b.txt"); System.out.println(b); //2.WEB-INF String c = context.getRealPath("/WEB-INF/c.txt"); System.out.println(c); //3.src String a = context.getRealPath("/WEB-INF/classes/a.txt"); System.out.println(a);
-
ServletContext只能用于web环境。如果是非web环境,则使用ClassLoader来获取真实路径
比如我web项目里有一个普通的java工具类 我想获取文件的真实路径 那我就用不了 ServletContext
//1.获取该类对应的类加载器对象 ClassLoader loader = this.getClass().getClassLoader(); //2.获取文件运行的真实路径 URL url = loader.getResource("a.txt"); String path = url.getPath(); //注意类加载器来获取路径也有局限性 只能获取src目录下的文件 // 方式2 InputStream stream = MyUtil.class.getResourceAsStream("/a.txt"); System.out.println(stream);
-
-