Servlet必知必会

Servlet概述:
Servlet运行在服务端,是独立于平台和协议的Java应用程序,由web服务器负责加载。
Servlet结构体系:
在这里插入图片描述

与Servlet主动关联的是3个类,ServletConfig,ServletRequest,ServletResponse。这3个类都是通过容器传递给Servlet的。其中,ServletConfig是在Servlet初始化时就传给Servlet了,而后两个是在请求达到时调用Servlet传递过来的。Servlet的运行模式是一个典型的“握手型的交互式”运行模式。所谓“握手型的交互式”就是两个模块为了交换数据通常都会准备一个交易场景,场景跟交易过程直到交易完成。交易场景的初始化是根据这次交易对象指定的参数来定制的。这些指定的参数通常就会是一个配置类,所以交易场景就是由ServletContext来描述,而制定的参数集合都是由ServletConfig来描述。ServletRequest和ServletResponse是要交互的具体对象,它们通常都是被作为运输工具来传递交互结果。
servlet创建:
public class TestServlet implements Servlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("TestServlet被访问了!");
    }
}

web.xml配置文件:

<?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">
    <!--内容写在<web-app></web-app>中-->
    <!--servlet标签给Tomcat配置Servlet程序-->
    <servlet>
        <!--servlet-name标签给Servlet程序起一个别名(一般是类名)-->
        <servlet-name>TestServlet</servlet-name>
        <!--servlet-class标签是Servlet程序的全类名-->
        <servlet-class>com.qizegao.servlet.TestServlet</servlet-class>
    </servlet>
    <!--servlet-mapping标签是servlet的映射,给Servlet程序配置访问地址-->
    <servlet-mapping>
        <!--此时servlet-name标签要与上一个servlet-name标签中相同-->
        <servlet-name>TestServlet</servlet-name>
        <!--url-pattern标签配置访问地址:
            /在服务器解析时表示为Tomcat的工程路径(在Edit Configurations中修改),
            /Test代表默认路径/Test,即http://localhost:8080/MyTest/Test,
            也就是说在浏览器的地址栏中输入上述路径访问到的是TestServlet类-->
        <url-pattern>/Test</url-pattern> //任意起名,用这个名字来访问指定类
    </servlet-mapping>
</web-app>
运行结果:
点击绿色按钮开启Tomcat服务器之后,会自动打开默认的地址http://localhost:8080/MyTest,
在地址栏继续输入/Test,会执行指定类的service方法,控制台输出:TestServlet被访问了!

Servlet的生命周期:
(1)加载和实例化
这一过程是由Servlet容器来实现的。加载Servlet之后,容器会通过Java的反射机制来创建Servlet实例。
(2)初始化
实例创建后,容器调用Servlet的init()方法来初始化该Servlet对象。初始化的目的是让Servlet对象在处理客户端请求前先完成一些初始化工作。
(3)执行
当客户端请求到来后,Servlet容器首先针对该请求创建ServletRequest和ServletResponse两个对象,然后Servlet容器会自动调用Servlet的service()方法来响应客户端请求,同时把ServletResponse和ServletRequest两个对象传个service()方法。
(4)清理
当Servlet实例需要从服务器中移除时,容器会调用destroy()方法让该实例释放掉它所有的资源,并将实例中的数据保存到持久的存储设备中。之后,Servlet实例便会被Java垃圾回收器回收。
Servlet的常用类和接口:
一、ServletConfig接口
从名字来看,得知此接口中是Servlet程序的配置信息:
(1) Servlet程序和ServletConfig对象都是由Tomcat负责创建,编程人员负责使用
(2) Servlet程序默认是第一次访问时创建,每个Servlet程序创建时对应的创建ServletConfig对 象,二者相互对应,某个Servlet程序只可以获得他对应的ServletConfig对象,无法获得别的 Servlet程序的ServletConfig对象
ServletConfig接口的三大作用:
(1) 可以获取Servlet程序的别名(即web.xml的的内容)
(2) 可以获取web.xml的初始化参数的值
(3) 可以获取ServletContext对象
代码演示:1. 在web.xml中继续写配置(写在标签中)

<servlet>
    <servlet-name>TestServlet4</servlet-name>
    <servlet-class>com.qizegao.servlet.TestServlet4</servlet-class>
    <!--<init-param>是初始化参数,每个servlet标签中都可以有,一个servlet标签中可以有多个-->
    <init-param>
        <!--参数名-->
        <param-name>username</param-name>
        <!--参数值-->
        <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-name>TestServlet4</servlet-name>
    <url-pattern>/Test4</url-pattern>
</servlet-mapping>


代码演示:2. 在src目录下创建此类

public class TestServlet4 extends HttpServlet {
    @Override  //使用init方法的原因:1.一定会执行 2.参数中有ServletConfig对象
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        //1.获取Servlet程序的别名
        System.out.println("此程序的别名是:" + config.getServletName());
        //2.获取初始化参数init-param,该方法获取指定的参数名的值
        System.out.println("初始化参数username的值是:" + config.getInitParameter("username"));
        System.out.println("初始化参数url的值是:" + config.getInitParameter("url"));
        //3.获取ServletContext对象
        System.out.println(config.getServletContext());
    }
    /*运行结果(浏览器地址栏输入http://localhost:8080/MyTest/Test4):
      此程序的别名是:TestServlet4
      初始化参数username的值是:root
      初始化参数url的值是:jdbc:mysql:localhost:3306/test
      org.apache.catalina.core.ApplicationContextFacade@64d62c61 */
} 


注意:重写init方法时,必须要在函数体内写:super.init(config);
原因:父类GenericServlet中的init方法将参数config保存起来,子类若不调用则无法保存
以下请参考:https://blog.csdn.net/weixin_49343190/article/details/107878144

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值