JavaWeb基础之Servlet

本文详细介绍了Servlet的基础知识,包括Servlet的概念、实现方式、生命周期、HttpServlet的应用,以及ServletConfig和ServletContext的重要作用。通过实例讲解如何创建并配置Servlet程序,强调了Servlet在JavaWeb开发中的核心地位。
摘要由CSDN通过智能技术生成

一、目录

  • 什么是Servlet
  • 怎么实现一个Servlet程序
  • Servlet生命周期
  • HttpServlet类实现Servlet程序
  • ServletConfig类
  • ServletContext类

二、什么是Servlet

  1. Servlet是JavaEE规则之一。规则就是接口。
  2. Servlet是JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
  3. Servlet是运行在服务器上的一个java小程序。它可以接收客户端发送来的请求,并响应数据给客户端

Servlet程序从2.5版本是现在市面使用最多的版本。
Servlet2.5是xml配置,Servlet3.0之后就是注解版本的Servlet使用。

三、怎么实现一个Servlet程序

  1. 编写一个类去实现Servlet接口。
  2. 实现service方法,处理请求,并响应数据。
  3. 到web.xml中去配置servlet程序的访问地址。

Servlet程序会自动调用service方法。

web.xml中关于servlet的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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标签给Tomcat配置Servlet程序。 -->
    <servlet>
        <!--servlet name标签给Servlet程序起一个别名,一般就是类名。 -->
        <servlet-name>FirstServlet</servlet-name>
        <!--servlet-class是servlet程序的全类名,直接打出类名,idea会自动补全。 -->
        <servlet-class>com.example.javaservlet.FirstServlet</servlet-class>
    </servlet>

    <!--servlet-mapping标签给servlet程序配置访问地址 -->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,当前配置的地址是给哪一个Servlet程序使用 -->
        <servlet-name>FirstServlet</servlet-name>
        <!--url-pattern标签配置访问地址 -->
        <!--/ 斜杠在服务器解析的时候,表示地址为http://ip:port/idea中项目对应的tomcat的工程路径 -->
        <!--/hello 表示地址为http://ip:port/工程路径/hello -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

四、Servlet的生命周期

  1. 执行Servlet构造器方法。
  2. 执行init初始化方法。
  3. 执行service方法。
  4. 执行destroy销毁方法。

1、2两个方法是在第一次访问的时候,创建Servlet程序会调用,也就是只调用一次,service方法每次访问都会调用,destroy方法在web工程停止的时候调用。

package com.example.javaservlet;

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

public class FirstServlet implements Servlet {
    public FirstServlet() {
        System.out.println("1. This is construct");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. This is init");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3. This is service");
    }

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

    @Override
    public void destroy() {
        System.out.println("4. This is destroy");
    }
}

在这里插入图片描述

五、HttpServlet类实现Servlet程序

一般在实际项目中,都是使用HttpServlet类的方式去实现Servlet程序。

  1. 编写一个类去继承HttpServlet类。
  2. 根据业务需要,重写doGet和doPost方法。(doGet方法在Get请求的时候调用;doPost方法在Post请求的时候调用。)
  3. 在web.xml中配置Servlet程序的访问地址。
package com.example.javaservlet;

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 HttpServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("This is get request");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("This is post request");
    }
}
    <servlet>
        <servlet-name>HttpServletTest</servlet-name>
        <servlet-class>com.example.javaservlet.HttpServletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HttpServletTest</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>

六、ServletConfig类

ServletConfig类是Servlet程序的配置信息类。
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServeltConfig对象。

ServletConfig类的三大作用:

  1. 可以获取Servlet程序的别名servlet-name的值。
  2. 获取初始化参数init-param。
  3. 获取ServletContext对象。

在获取初始化参数init-param之前要在web.xml中配置init-param,这个init-param可以配置多组,具体配置如下:

<servlet>
        <!--servlet name标签给Servlet程序起一个别名,一般就是类名。 -->
        <servlet-name>FirstServlet</servlet-name>
        <!--servlet-class是servlet程序的全类名,直接打出类名,idea会自动补全。 -->
        <servlet-class>com.example.javaservlet.FirstServlet</servlet-class>

        <!--init-param是初始化参数 -->
        <init-param>
            <!--param-name是参数名 -->
            <param-name>username</param-name>
            <!--param-value是参数值 -->
            <param-value>root</param-value>
        </init-param>
        
         <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>

    <!--servlet-mapping标签给servlet程序配置访问地址 -->
    <servlet-mapping>
        <!--servlet-name标签的作用是告诉服务器,当前配置的地址是给哪一个Servlet程序使用 -->
        <servlet-name>FirstServlet</servlet-name>
        <!--url-pattern标签配置访问地址 -->
        <!--/ 斜杠在服务器解析的时候,表示地址为http://ip:port/idea中项目对应的tomcat的工程路径 -->
        <!--/hello 表示地址为http://ip:port/工程路径/hello -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
package com.example.javaservlet;

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

public class FirstServlet implements Servlet {
    public FirstServlet() {
        System.out.println("1. This is construct");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. This is init");
        //获取servlet-name
        System.out.println("servlet-name:" + servletConfig.getServletName());

        //获取init-param
        System.out.println("init-param:" + servletConfig.getInitParameter("username"));
        System.out.println("init-param:" + servletConfig.getInitParameter("url"));

        //获取ServletContext对象
        System.out.println("ServletContext:" + servletConfig.getServletContext());
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3. This is service");
    }

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

    @Override
    public void destroy() {
        System.out.println("4. This is destroy");
    }
}

1. This is construct
2. This is init
servlet-name:FirstServlet
init-param:root
init-param:jdbc:mysql://localhost:3306/test
ServletContextorg.apache.catalina.core.ApplicationContextFacade@45f24809
3. This is service

七、ServletContext类

  • ServletContext类介绍
  1. ServletContext类是一个接口,它表示Servlet上下文对象。
  2. 一个web工程,只有一个ServletContext对象实例。
  3. ServletContext对象是一个域对象。
  4. ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫域对象。这里的域,指的是存取数据的操作范围。(也就是整个web工程)

存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()
  • ServletContext类的四个作用
    1. 获取web.xml中配置的上下文参数context-param。
    2. 获取当前的工程路径,格式:/工程路径。
    3. 获取工程部署后在服务器硬盘上的绝对路径。
    4. 像Map一样存取数据。

context-param是上下文参数,它属于整个web工程,可以配置多组。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--context-param是上下文参数,它属于整个web工程,可以配置多组 -->
    <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>ContextServlet</servlet-name>
        <servlet-class>com.example.javaservlet.ContextServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ContextServlet</servlet-name>
        <url-pattern>/hhh</url-pattern>
    </servlet-mapping>
</web-app>
package com.example.javaservlet;

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

public class ContextServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletConfig().getServletContext();

        //获取web.xml中上下文参数context-param
        String username = servletContext.getInitParameter("username");
        String password = servletContext.getInitParameter("password");
        System.out.println(username);
        System.out.println(password);

        //获取当前工程路径
        System.out.println(servletContext.getContextPath());
        //获取项目在硬盘上的绝对路径
        System.out.println(servletContext.getRealPath("/"));
        //存取数据
        servletContext.setAttribute("key1", "helloa");
        System.out.println(servletContext.getAttribute("key1"));
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

admin
root
/javaservlet
E:\code\java\code\exercise\javaservlet\target\javaservlet-1.0-SNAPSHOT\
helloa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值