Java Web —— ——Servlet基础篇

Java Web —— ——Servlet基础篇



servlet简介

创建javaee的web项目
在使用servlet之前我们需要先创建一个javaee的web项目,一个web项目通常包含下面一些文件:
src
web
WEB-INF
lib
classes
index.jsp

src:存放java源代码
web:存放静态资源和动态资源
WEB-INF:该目录下的所有文件无法从浏览器中直接访问
lib:存放相关的jar包
classes:存放编译后的class文件
index.jsp:web项目中默认访问的首页


一、什么是servlet?

servlet是一门用于开发动态web资源的技术,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的小应用程序,servlet是server applet两个单词的组合而成。servlet 可以通过 HTTP协议接收和响应来自 Web 客户端的请求。

servlet的语法跟JavaSE是一样的并且能够使用JavaSE中的API,要想创建一个servlet并使用的话可以分为以下几个步骤:

  1. 创建一个javaee的web项目
  2. 编写一个Java类,实现javax.servlet.Servlet接口,并重写该接口中的抽象方法
  3. 在web.xml文件中配置该servlet(如果使用注解方式的话,无需配置web.xml)
  4. 将该web项目部署到tomcat中并启动

web访问流程图:

在这里插入图片描述
如上图所示,服务器端程序其实就是实现了servlet接口的程序,servlet的主要作用其实就是处理和响应客户端的请求。

编写第一个servlet

创建一个web项目可以在创建项目时关联tomcat,这样eclipse会把相关的servlet-api.jar包拷贝到项目中,在项目创建一个Java类实现servlet接口并重写里面的方法。

package cn.itcase;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstServlet implements Servlet {
    
    

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    
    
        System.out.println("Hello Servlet");
    }

    @Override
    public void destroy() {
    
    

    }

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

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

    @Override
    public void init(ServletConfig arg0) throws ServletException {
    
    

    }



}

servlet创建好之后,需要在web.xml文件中进行配置,给servlet一个可以访问的URI地址:

<!-- 创建一个servlet实例 -->
  <servlet>
    <!-- 给servlet取一个名字,该名字需与servlet-mapping中的servlet-name一致 -->
    <servlet-name>firstServlet</servlet-name>
    <!-- servlet的包名+类名 -->
    <servlet-class>cn.itcase.FirstServlet</servlet-class>
  </servlet>

  <!-- 给servlet一个可以访问的URI地址 -->
  <servlet-mapping>
    <!-- servlet的名字,与 servlet中的servlet-name一致-->
    <servlet-name>firstServlet</servlet-name>
    <!-- URI地址:http://locahost:9999/FirstServlet/hello -->
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

之后将该web项目部署到tomcat中,启动成功后访问:http://locahost:8080/07-01-servlet/hello
可以看到eclipse控制台中打印出了Hello Servlet
通过上面示例可以看出,servlet的需要部署在tomcat中才能运行,有时tomcat也被称为是servlet的容器。

二、servlet的生命周期

1.servlet的生命周期

Servlet 生命周期指的是,Servlet 对象的创建、Servlet 对象的初始化、Servlet 对象服
务的执行,及最终 Servlet 对象被销毁的整个过程。
servlet生命周期图:

在这里插入图片描述

2.servlet的特征

  1. Servlet是单例多线程的,只创建一个servlet对象,但是每次请求都会起一个线程并在自己线程栈内存中执行service方法。
  2. 一个 Servlet 实例只会执行一次无参构造器与 init()方法,并且是在第一次访问时执行。
  3. 用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
  4. 一个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。
  5. 由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在
    Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
  6. 默认情况下,Servlet 在 Web 容器启动时是不会被实例化的。

tomcat启动时创建servlet实例

在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可

代码如下(示例):

 <servlet>
      <servlet-name>lifeServlet</servlet-name>
      <servlet-class>com.monkey1024.servlet.LifeServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>lifeServlet</servlet-name>
      <url-pattern>/life</url-pattern>
  </servlet-mapping>

添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。

当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
当值相同时,容器会自己选择创建顺序。

三、ServletConfig接口

ServletConfig接口简介

在 Servlet 接口的 init()方法中有一个参数 ServletConfig,这个参数类型是个接口,里面是一些 在 web.xml 中对当前 Servlet类的配置信息。Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。在tomcat调用 init()方法时,首先会将 web.xml 中当前 Servlet 类的配置信息封装为一个对象。这个对象的类型实现了 ServletConfig 接口, Web 容器会将这个对象传递给init()方法中的 ServletConfig 参数。

ServletConfig中的方法

  • getInitParameter(): 获取指定名称的初始化参数值。例如从下面的servlet中调用
    getInitParameter(“userName”);方法会返回字符串"monkey1024"。
  • getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型
    Enumeration。
  • getServletName():获取当前 Servlet 的中指定的 Servlet名称。如下面中的 ServletName
    为"configServlet"。
  • getServletContext():获取到当前 Servlet 的上下文对象
  • ServletContext,这是个非常重要的对象,将在下面详细介绍。

示例:

在配置web.xml时,可以为servlet指定多个初始化参数:

  <servlet>
      <servlet-name>configServlet01</servlet-name>
      <servlet-class>com.monkey1024.servlet.ConfigTest01</servlet-class>
      <init-param>
          <param-name>userName</param-name>
          <param-value>monkey1024</param-value>
      </init-param>
      <init-param>
          <param-name>password</param-name>
          <param-value>123456</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>configServlet01</servlet-name>
      <url-pattern>/config01</url-pattern>
  </servlet-mapping>

创建一个servlet:

package com.monkey1024.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * ServletConfig接口
 *
 */
public class ConfigTest01 implements Servlet {
    
    

    private ServletConfig config;

    @Override
    public void destroy() {
    
    

    }

    @Override
    public ServletConfig getServletConfig() {
    
    
        return this.config;
    }

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

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    
    
        System.out.println("init方法中ServletConfig:" + servletConfig);
        this.config = servletConfig;
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    
    
        String userName = config.getInitParameter("userName");
        System.out.println("userName=" + userName);
        Enumeration<String> param = config.getInitParameterNames();

        while(param.hasMoreElements()){
    
    
            String name = param.nextElement();
            String value = config.getInitParameter(name);
            System.out.println(name + "=" +  value);
        }

        System.out.println("ServletName=" + config.getServletName());

    }

}

ServletConfig的特点
每一个servlet都对应一个ServletConfig用于封装各自的配置信息,即有几个servlet就会产生几个ServletConfig对象。

四、ServletContext接口简介

ServletContext接口简介
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象包含Web应用中所有 Servlet 在 Web 容器中的一些数据信息。ServletContext随着Web应用的启动而创建,随着 Web 应用的关闭而销毁。一个 Web 应用只有一个ServletContext 对象。
ServletContext中不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有Servlet可以共享的数据。可以这么说, ServeltContext 可以代表整个应用,所以ServletContext有另外一个名称:application。

ServletContext中常用方法

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext()方法获得ServletContext对象。

  • String getInitParameter ():获取 web.xml 文 件 的 中 指 定 名 称 的上下文参数值 。
  • Enumeration getInitParameterNames():获取 web.xml
    文件的中的所有的上下文参数名称。其返回值为枚举类型 Enumeration。
  • void setAttribute(String name, Object object):在 ServletContext
    的公共数据空间中,也称为域属性空间,放入数据。这些数据对于
    Web应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的,通过名称来访问该数据。
  • Object getAttribute(String name):从 ServletContext 的域属性空间中获取指定名称的数据。
  • void removeAttribute(String name):从 ServletContext 的域属性空间中删除指定名称的数据。
  • String getRealPath(String path):获取当前 Web 应用中指定文件或目录在本地文件系统中的路径。
  • String getContextPath():获取当前应用在 Web 容器中的名称。

示例:
在web.xml文件中加入初始化参数,web.xml文件修改后要重启tomcat才能生效:

 <!-- 初始化参数 -->
  <context-param>
      <param-name>MySQLDriver</param-name>
      <param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
  <context-param>
      <param-name>dbURL</param-name>
      <param-value>jdbc:mysql:</param-value>
  </context-param>

创建servlet:

package com.monkey1024.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * ServletContext接口
 *
 */
public class ContextTest01 implements Servlet {
    
    

private ServletConfig config;

    @Override
    public void destroy() {
    
    

    }

    @Override
    public ServletConfig getServletConfig() {
    
    
        return this.config;
    }

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

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    
    
        this.config = servletConfig;
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    
    
        ServletContext application = this.config.getServletContext();
        System.out.println("ContextTest01:" + application);

        String driver = application.getInitParameter("MySQLDriver");
        System.out.println(driver);

        String contextPath = application.getContextPath();
        System.out.println("contextPath:" + contextPath);

        //文件在硬盘中的绝对路径
        String realPath = application.getRealPath("FirstServlet");
        System.out.println("realPath:" + realPath);

        //向ServletContext中添加属性
        application.setAttribute("admin", "tiger");
        application.setAttribute("password", 123456);
        //删除password
        application.removeAttribute("password");
    }

}

再创建一个servlet:

package com.monkey1024.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ContextTest02 implements Servlet {
    
    

    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
    
    
        this.config = config;
    }

    @Override
    public ServletConfig getServletConfig() {
    
    
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    
    
        ServletContext application = this.config.getServletContext();
        System.out.println("Context02中的application:" + application);


        String admin = (String)application.getAttribute("admin");
        System.out.println(admin);
        String password = (String)application.getAttribute("password");
        System.out.println(password);
    }

    @Override
    public String getServletInfo() {
    
    
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void destroy() {
    
    
        // TODO Auto-generated method stub

    }

}

猜你喜欢

转载自blog.csdn.net/weixin_54405545/article/details/120931449