Servlet(定义 配置 测试 原理 生命周期 方法:init() service() destory() Servlet配置 ServletConfig 创建Servlet三种方式

Servlet(定义 配置 测试 原理 生命周期 方法:init() service() destory() Servlet配置 ServletConfig 创建Servlet方式:Servlet GenericServlet HttpServlet)

Servlet:官方的定义 运行在服务器的小程序
Servlet:是一个接口
Servlet功能:
  1. 接受请求
  2. 处理请求
  3. 作出响应

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);
        
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值