02. Servlet介绍

Servlet

Servlet介绍

  • Servlet是Java Servlet (server applet)的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能用于交互地浏览和修改数据,由Servlet容器进行管理(创建或销毁)。

  • Java Servlet(继承结构)

    • Servlet接口(javax.servlet.Servlet)
    • GenericServlet(javax.servlet.GenericServlet)
    • HttpServlet(javax.servlet.http.HttpServlet)
  • Servlet关联的类和接口

    这里写图片描述

Servlet常用方法

所在包:javax.servlet

  • destroy():销毁

  • getServletConfig():获取Servlet实现类的示例

  • getServletInfo():获取Servlet信息

  • init(javax.servlet.ServletConfig):初始化方法

  • service(javax.servlet.ServletRequest, javax.servlet.ServletResponse):在Servlet响应用户时被容器调用

HttpServlet

HttpServlet是基于HTTP协议的Servlet实现。用户创建Servlet一般继承HttpServlet。

这里写图片描述

Serializable是IO的一个序列化接口

GenericServlet常用方法

  • destroy()

  • getInitParameter(java.lang.String):获取一些已经配置的数据(键值对形式)

  • getInitParameterNames():获取配置的所有的名称

  • getServletConfig()

  • getServletContext():获取Servlet上下文

  • getServletInfo()

  • getServletName():获取Servlet名字

  • init(javax.servlet.ServletConfig)

  • log(java.lang.String, java.lang.Throwable):日志(字符串+异常)

  • log(java.lang.String):日志

  • service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)

HttpServlet常用方法

HttpServlet类所在包:javax.servlet.http

  • doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • getHead(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • doOptions(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  • getLastModified(javax.servlet.http.HttpServletRequest)

  • service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)

  • service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

Servlet的生命周期

Java Web Server端的运用都是围绕着Servlet展开

Servlet生命周期需要结合Servlet接口中定义的方法来了解Servlet的加载、创建、服务以及销毁的过程。

Servlet生命周期演示:

  • 创建Servlets(可以创建多个)

  • 配置Servlets

  • 启动Tomcat

  • 观察

这里写图片描述

创建一个Servlet过程

继承HttpServlet

重写service(doGet、doPost)方法

在web.xml中配置Servlet

在web.xml中配置Servlet的例子:

  • servlet标签表示配置一个servlet

  • servlet-name标签配置指定名称(不一定要和服务类名相同)

  • servlet-class配置对应的Servlet类(需要使用全类名)

  • url-pattern配置通过访问该服务的路径,需以斜杠开头。例如,我们在地址栏里面输入tp://localhost:8080/ServletLifecycle/s1便可以启用ServletTest服务。url-pattern可以配置多个,只需多加url-pattern标签即可

  • load-on-startup:此标签可加可不加,不加其实默认值为-1,如果加了此标签且值大于等于0,则表示,此服务并不需要通过用户访问而在加载到服务器时就已经初始化一个实例了。小于零的值则需要通过用户访问才能初始化

  • init-param:通过键值对的方式配置初始化参数

<!-- 配置servlet -->
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.li.servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>ServletTest2</servlet-name>
<servlet-class>com.li.servlet.ServletTest2</servlet-class>
<!-- 通过键值对的方式设置初始化参数 -->
<init-param>
    <param-name>test</param-name>
    <param-value>123456</param-value>
</init-param>

<!-- 不加此标签,默认值为-1,代表被使用的时候才会被加载创建,修改参数为0表示只要这个应用程序只要被加载到服务器里面,就会立马加载并实例化 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>

处理Servlet生命周期事件

在Servlet生命周期中涉及到其他相关对象的创建、销毁或者更改其他对象属性时提供对应的回调接口来实现特定的功能。

ObjectEventListener Interface and Event Class
Web ContextInitialization and destructionjavax.servlet.ServletContextListener and ServletContextEvent
Web ContextAttribute, added, removed, or replacedjavax.servlet.ServletContextAttributeListener and ServletContextAttributeEvent
Sessioncreation, invalidation, activation, passivation, timeoutjavax.servlet.http.HttpSessionListener, javax.servlet.http.HttpSessionActivationListener, and HttpSessionEvent
SessionAttribute, added, removed, or replacedjavax.servlet.http.HttpSessionAttributeListener, HttpSessionBindingEvent
RequestA servlet request has started being processed by web componentsjavax.servlet.ServletRequestListener and ServletRequestEvent
RequestAttribute added, removed, or replacedjavax.servlet.ServletRequestAttributeListener and ServletRequestAttributeEvent

这里写图片描述

示例源代码

工程名为:ServletLifecycle

Servlet1

package com.li.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/*Servlet生命周期演示*/

public class ServletTest extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /*
     * 创建完成有一个警告(也无关紧要):原因是HttpServlet继承了GenericServlet类
     * 而GenericServlet实现了java.io的虚拟化接口(Serializable),实现虚拟化接口的这些类,
     * 都必须提供一个虚拟化的ID,不提供,就会给出一个警告。当然,不解决这个警告也没问题,并不影响类的运行。
     * 点击警告add defalut serial version ID。
     */

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        print("init");
    }

    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        print("service");
        /*输出ServletContext的hashCode码,在一个Web应用里面,只有一个ServletContext实例*/
        System.out.println(getServletContext().hashCode());
    }

    @Override
    public void destroy() {
        print("destroy");
    }

    public void print(String content) {
        /*打印输出:
         *获取当前类名、当前方法、以及当前线程名 
         */
        System.out.println(getClass().getSimpleName()+" method: "+content+" thread name:"+Thread.currentThread().getName());
    }
}

Servlet2

package com.li.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/*Servlet生命周期演示*/

public class ServletTest2 extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /*
     * 创建完成有一个警告(也无关紧要):原因是HttpServlet继承了GenericServlet类
     * 而GenericServlet实现了java.io的虚拟化接口(Serializable),实现虚拟化接口的这些类,
     * 都必须提供一个虚拟化的ID,不提供,就会给出一个警告。当然,不解决这个警告也没问题,并不影响类的运行。
     * 点击警告add defalut serial version ID。
     */

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        print("init");
        //获取初始参数
        System.out.println("init-param:"+config.getInitParameter("test"));
    }

    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        print("service");
        /*输出ServletContext的hashCode码,在一个Web应用里面,只有一个ServletContext实例*/
        System.out.println(getServletContext().hashCode());
    }

    @Override
    public void destroy() {
        print("destroy");
    }

    public void print(String content) {
        /*打印输出:
         *获取当前类名、当前方法、以及当前线程名 
         */
        System.out.println(getClass().getSimpleName()+" method: "+content+" thread name:"+Thread.currentThread().getName());
    }
}

WebContextListener

package com.li.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class WebContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("WebContextListener method name: contextDestroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("WebContextListener method name: contextInitialized");
    }

}

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ServletLifecycle</display-name>

  <!-- 欢迎页,默认的欢迎页名都是index或者default -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <!-- 配置servlet -->
  <servlet>
    <servlet-name>ServletTest</servlet-name>
    <servlet-class>com.li.servlet.ServletTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletTest</servlet-name>
    <url-pattern>/s1</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ServletTest2</servlet-name>
    <servlet-class>com.li.servlet.ServletTest2</servlet-class>
    <!-- 通过键值对的方式设置初始化参数 -->
    <init-param>
        <param-name>test</param-name>
        <param-value>123456</param-value>
    </init-param>

    <!-- 不加此标签,默认值为-1,代表被使用的时候才会被加载创建,修改参数为大于等于0表示只要这个应用程序只要被加载到服务器里面,就会立马加载并实例化 -->
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletTest2</servlet-name>
    <url-pattern>/s2</url-pattern>
  </servlet-mapping>


  <listener>
    <listener-class>com.li.listener.WebContextListener</listener-class>
  </listener>


</web-app>

在浏览器地址栏中输入 http://localhost:8080/ServletLifecycle/s1 便可访问Servlet1服务;输入 http://localhost:8080/ServletLifecycle/s2 便可访问Servlet2服务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值