Servlet(一)

Servlet(一)

Servlet概述

  • Servlet是JavaEE规范之一(规范就是接口)

  • Servlet是JavaWeb三大组件之一

    三大组件:

    • Servlet程序
    • Filter过滤器
    • Listener监听器。
  • Servlet是运行在服务器上的一个小型java程序,它可以接收客户端发送过来的请求,并响应数据给客户端

Servlet技术

手动实现Servlet程序

  1. 编写一个类实现Servlet接口
  2. 实现service方法,处理请求并响应数据
    • service()专门用来处理请求和响应
  3. 在web.xml中配置servlet程序的访问地址
    • servlet标签给服务器Tomcat配置Servlet程序
      • servlet-name标签给servlet程序取一个别名(一般是类名)
      • servlet-class标签是servlet程序的全类名
    • servlet-mapping标签给servlet程序配置访问地址
      • servlet-name标签的作用是告诉服务器,当前配置的地址给哪个servlet程序使用
      • url-pattern标签配置访问地址
        • / 斜杠在服务器解析的时候表示地址为http://ip:port/工程路径

          eg:/hello 表示 http://ip:port/工程路径/hello

dO5ay6.png

Servlet生命周期

  1. 执行Servlet构造器方法
  2. 执行init初始化方法
  3. 执行service方法
  4. 执行destroy销毁方法
注意
  1. 第一二步是在第一次访问的时候创建Servlet程序会被调用
  2. 第三步service方法每次访问都会调用
  3. 在Web工程停止的时候调用

请求的分发处理

服务器获得请求的方式的方法:

  1. 类型转换,将ServletRequest类型转换为其子类HttpServletRequest类型
    • 使用service方法中servletRequest变量
    • 因为servletRequest变量是ServletRequest类型,此类型的子类中有getMethod()方法所以需要类型转换
  2. 获取请求方式:调用getMethod()方法
代码实现
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("3. service = HelloServlet被访问了");

    //类型转换(因为它有getMethod()方法)
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    //获取请求的方式
    String method = httpServletRequest.getMethod();

//  System.out.println(method);

    if("GET".equals(method)){
        doGet();
    }else if("POST".equals(method)){
        doPost();
    }
}

//做get请求的操作
public void doGet(){
    System.out.println("get请求");
}

//做post请求的操作
public void doPost(){
    System.out.println("post请求");
}

通过继承HttpServlet类实现Servlet程序

过程

  1. 编写一个类去继承HttpServlet类
  2. 根据需要重写doGet或doPost方法
  3. 在web.xml中配置Servlet程序的访问地址

代码实现

public class HelloServlet2 extends HttpServlet {
    /**
     * doGet()在get请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServlet中的doGet方法");
    }

    /**
     * doPost()在post请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServlet中的doPost方法");
    }
}

IDEA生成Servlet程序

dX4QYj.png
dX5I54.png

Servlet类的继承体系

dX5vVO.png

ServletConfig类

Servlet程序的配置信息类

Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用

Servlet程序默认是第一次访问的时候创建,ServletConfig是每一个Servlet程序创建时就创建一个对应的ServletConfig对象

作用

  1. 可以获取Servlet程序的别名(servlet-name的值)
    • servletConfig.getServletName()
  2. 获取初始化参数init-param
    • 在servlet标签中的servlet-class标签后添加init-para标签

      • init-para是初始化参数
      • param-name参数名
      • param-name参数值
    • 在init()方法中使用

      servletConfig.getInitParameter()

  3. 获取ServletContext对象

代码实现

配置文件

<servlet>
    <servlet-name>ServletConfigHello</servlet-name>
    <servlet-class>ServletConfig.HelloServlet</servlet-class>
    <!-- init-para是初始化参数-->
    <init-param>
        <!--param-name参数名-->
        <param-name>username</param-name>
        <!--param-name参数值-->
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>url</param-name>
        <param-value>https://www.baidu.com/</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>ServletConfigHello</servlet-name>
    <url-pattern>/ServletConfigHello</url-pattern>
</servlet-mapping>

代码

@Override
public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("2. init初始化方法");

// 1. 可以获取Servlet程序的别名(servlet-name的值)
    System.out.println("HelloServlet的别名:" + servletConfig.getServletName());
// 2. 获取初始化参数init-param
    System.out.println("初始化参数username的值:" + servletConfig.getInitParameter("username"));
    System.out.println("初始化参数url的值:" + servletConfig.getInitParameter("url"));
// 3. 获取ServletContext对象
    System.out.println(servletConfig.getServletContext());
}

运行结果

dj9qbD.png

注意

  • 每一个Servlet程序中有属于自己的ServletConfig对象

  • getServletConfig()不仅可以使用在init()方法中

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        System.out.println(servletConfig.getServletName());
    }
    
  • 如果重写了init()方法,一定要在里面调用super.init();

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("重写了init初始化方法");
    }
    

ServletContext

  • Servlet是一个接口,表示servlet上下文对象
  • 一个Web工程,只有一个ServletContext对象实例
  • ServletContext对象是一个域对象
    • 域对象:是可以将Map存储数据的对象,叫做域对象
    • 这里的域指的是存储数据的操作范围

作用

  1. 获取web.xml中配置的上下文参数context-param
    • context-param是上下文参数(属于整个web工程)可以配置多组

      <context-param>
          <param-name>username</param-name>
          <param-value>context</param-value>
      </context-param>
      
      <context-param>
          <param-name>password</param-name>
          <param-value>root</param-value>
      </context-param>
      
    • 通过ServletConfig获取ServletContext对象

      ServletContext servletContext = getServletConfig().getServletContext();
      
    • 也可以直接调用getServletContext()方法

      ServletContext servletContext = getServletContext();
      
    • 调用getInitParameter()方法

  2. 获取当前的工程路径,格式:/工程路径
    • 调用getContextPath()方法
      servletContext.getRealPath("/");
      
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像Map一样存储数据

代码实现(前三个作用)

/**
 * ServletContext前三个作用的示例
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//  1. 获取web.xml中配置的上下文参数context-param
    ServletContext servletContext = getServletConfig().getServletContext();
    String username = servletContext.getInitParameter("username");
    System.out.println("context-param参数username的值:" + username);
    System.out.println("context-param参数password的值:" + servletContext.getInitParameter("password"));
//  2. 获取当前的工程路径,格式:/工程路径
    System.out.println("当前工程路径:" + servletContext.getContextPath());
//  3. 获取工程部署后在服务器硬盘上的绝对路径
    /**
     *  / 斜杠被服务器解析地址为http://ip:port/工程名
     *  映射到idea代码的web目录
     */
    System.out.println("在服务器硬盘上的绝对路径:" + servletContext.getRealPath("/"));
}

运行结果(前三个作用)

dvM0t1.png

像Map一样存储数据(第四个作用)

ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候销毁

dvem3F.png

如果在最开始的时候(未存入数据时)调用

servletContext.getAttribute("key1")

返回为null;只要存入数据后,在此web工程下任意位置调用此方法都会显示存入的值。(ServletContext是在web工程部署启动的时候创建的,在web工程停止的时候销毁)

代码实现
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext servletContext = getServletContext();
    System.out.println("获取域数据key1的值:" + servletContext.getAttribute("key1"));
    servletContext.setAttribute("key1","value1");
    System.out.println("获取域数据key1的值:" + servletContext.getAttribute("key1"));
}
运行结果

dvgJmD.png

posted @ 2020-09-01 14:22  南煎丸子  阅读(97)  评论(0编辑  收藏  举报