【07】Servlet

Servlet

概念

  • Servlet是Java提供的一门动态Web资源开发技术;所谓动态就是指不同用户看到的内容会不同
  • Servlet是JavaEE13个规范之一;规范就是接口
  • Servlet是JavaWeb三大组件之一:Servlet\Filter\Listener
  • 是运行在服务器的小程序,用于接收和响应客户端请求

在这里插入图片描述
将来定义一个类,实现Servlet接口,复写方法即可。

2.第一个Servlet程序

步骤:
1.定义一个类,实现Servlet接口
2.实现Service方法,处理请求,响应数据
3.到web.xml中配置Servlet程序的访问地址

step1. 实现类继承Servlet接口

package com.yatolove;

import javax.servlet.*;
import java.io.IOException;

public class ServerletDemo01 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 {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

service方法用于处理请求和响应;

step2.在web.xml中的根标签内部Servlet访问路径

    <servlet>
        <servlet-name>demo01</servlet-name>
        <servlet-class>com.example._01_servlet.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo01</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>
  • </servlet> 给Tomcat配置Servlet程序
  • <servlet-name> Servlet程序别名
  • <servlet-class> Servlet全类名
  • <servlet-mapping> 配置Servlet程序访问地址
  • <servlet-name> 告诉Tomcat当前配置的地址是哪个Servlet程序使用
  • <url-pattern> 必须以/开头,配置此Servlet的访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/demo01 表示Servlet地址为:http://ip:port/工程路径/demo01

配置常见错误

  • <url-pattern> 配置Servlet访问路径必须以/开头
  • <servlet-name> 两个必须保持一致

step3. 启动Tomcat,并通过浏览器访问

http://localhost:8080/Servlet/demo01
demo01就是配置中的url-pattern

3.Servlet-url如何定位Servlet

浏览器通过: ip:port/项目虚拟路径/Servlet资源名称 找到此Servlet
先找到web项目,然后找web.xml,然后找Servlet的url-pattern,然后根据映射关系找到Servlet类
在这里插入图片描述

4.Servlet生命周期

生命周期指的是Servlet的几个方法;
在这里插入图片描述

Servlet生命周期分为四个阶段:

  1. Servlet的构造方法
  2. 初始化阶段 调用init()方法
  3. 响应客户请求阶段  调用service()方法
  4. 终止阶段  调用destroy()方法
  • init()
    init()方法在Servlet类被加载的时候执行,且仅执行一次
    Servlet类加载时机根据web.xml中的配置决定:
    load-on-startup<0 第一次请求此Servlet的时候加载Servlet类;
    load-on-startup>=0 启动Tomcat容器的时候加载Servlet类
    <servlet>
        <servlet-name>demo01</servlet-name>
        <servlet-class>com.example._01_servlet.ServletDemo01</servlet-class> 
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo01</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>

1.Serverlet的int只执行一次,说明只有一个Servlet对象,Servlet对象是单例的;
2.多个用户同时访问同一个Servlet的时候,可能存在线程安全问题
尽量不要在Servlet中定义成员变量,定义了成员变量,也不要对其进行set操作。

  • service() 每接收一次请求,调用一次

  • destroy()在Servlet销毁的时候执行,且仅执行一次
    服务器正常关闭的时候才会销毁Servlet

5.Servlet请求的分发处理

  • 老土方法:通过ServletRequest对象获取其请求类型,分别处理不同请求的场景
  • 进阶1:在Servlet实现类中自定义doGet()和doPost()两个方法
    在老土方法的基础上,通过ServletRequest获取请求类型,分别调用doGet()和doPost();
    这也是HttpServlet的原理

6.通过继承HttpServlet实现Servlet程序

  • 实际开发中,都是使用继承HttpServlet类的方式实现Servlet
  • 使用步骤:
    1.根据业务需求,重写HttpServlet类中的doGet()和doPost()
    2.配置Servlet的访问路径
package servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet08被访问了");

        req.setAttribute("username","yatolove");

        RequestDispatcher rd =req.getRequestDispatcher("/Demo09");
        rd.forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

IDEA中直接生成Servlet程序

在这里插入图片描述
在这里插入图片描述

7.Servlet类的继承体系

Servlet接口
|
GenericServlet抽象类
|
HttpServlet 抽象类

在这里插入图片描述

1.GenericServlet对Serverlet接口的其他方法做了空实现,也就是说如果我们自定义类继承这个类,只需要复写Service;


public class ServletDemo02 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        
    }
}

2.HttpServlet抽象类
对http协议封装了,只需要复写doGet/doPost方法即可

8. Servlet 注解配置

注解配置,就不用在web.xml中配置了,在创建web项目的时候可以不创建web.xml
Servlet必须在3.0及以上版本才可以。
配置方式:
1. @WebServlet(urlPattern="/demo01")
2. @WebServlet(value="/demo01")
注解类型中,如果只有一个属性的话,可以省去value
3. @WebServlet("/demo01")

9. Servlet url配置

1.@WebServlet可以指定多个访问路径
@WebServlet{"/d4","/dd4","/ddd4"}
2.路径定义规则:
1./xxx
2./xxx/xx 多层路径
3.*.do

ServletConfig类

此类是Servlet程序的配置信息类

1.ServletConfig类的三大作用

(1)获取Servlet别名

在这里插入图片描述

(2)获取Servlet的初始化参数

Servlet初始化参数在xml文件中配置:
在这里插入图片描述
在这里插入图片描述

(3)获取ServletContext对象

在这里插入图片描述

2.Servlet-ServletConfig补充说明

  • Servlet程序和ServletConfig对象都是由Tomcat负责创建的,我们只负责使用
  • Servlet程序默认情况下是第一次访问的时候就创建,ServletConfig是每个Servlet程序创建的时候,就创建一个对应的ServletConfig对象。

3.在HttpServlet的子类直接使用ServletConfig对象

在这里插入图片描述
注意:如果重写了init()方法,必须要调用super.init(config),才能直接使用getServletConfig()方法,否则空指针异常;因为在GenerisServlet中的init()方法才给ServletConfig属性赋值;如下所示:
在这里插入图片描述

ServletContext类

a)什么是ServletContext

在这里插入图片描述

获取方式:
1.getServletConfig().getServletContext()
2.直接调用从GenericServlet类继承过来的.getServletContext()

b) ServletContext类的四个作用

在这里插入图片描述

1.获取web.xml中配置的上下文参数

在这里插入图片描述
在这里插入图片描述

2.获取当前工程路径

在这里插入图片描述
在这里插入图片描述

3.获取工程部署后在服务器硬盘上的绝对路径

(1)
在这里插入图片描述

  • getRealPath(“/”) 获取当前web工程的web目录

(2)
在启动Tomcat的时候,下面这个内容是IDEA整合Tocmat后,Tomcat被拷贝的一些副本内容;在这个目录下面的config中可以找到对当前web工程的路径映射,就是磁盘上web的目录
在这里插入图片描述

4.像map一样存取数据

在这里插入图片描述

  • ServletContext对象的声明周期就是对应的Web项目部署到Tomcat之后创建,下线后销毁;其数据域作用域整个Web项目所有Servlet,相当于一个公共区域;
  • 方法
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)

ServletContext对象范围:所有用户所有请求的数据
生命周期:服务器启动到服务器关闭
因此此对象中尽量不要存太多数据,占内存!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值