Servlet

一.Servlet入门

1.概述

Servlet 运行在服务端(tomcat) 的Java小程序,是sun公司提供一套规范. 就是动态资源

2.Servlet作用

用来处理客户端请求、响应给浏览器的动态资源。

但servlet的实质就是java代码,通过java的API动态的向客户端输出内容

3.servlet与普通的java程序的区别

  1. 必须实现servlet接口
  2. 必须在servlet容器(服务器 tomcat)中运行
  3. servlet程序可以接收用户请求参数以及向浏览器输出数据

4.在IDEA编写Servlet,发布到Tomcat

4.1配置文件方式实现

  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在web.xml配置(该文件在web/WEB-INF 文件夹下)



    
    
        
        ServletDemo01
        
        com.web.ServletDemo01
    
    
        
        ServletDemo01
        
        /demo01
    



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

public class ServletDemo01 implements Servlet {

    @Override
    //服务方法: 处理请求的
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        System.out.println("hello...");

        response.getWriter().print("hello...");//向页面输出内容
    }


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

    }

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



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

    @Override
    public void destroy() {

    }
}

4.2注解方式实现

  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在这个类上面添加@WebServlet(“访问的路径”)
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


@WebServlet("/demo02")
public class ServletDemo02 implements Servlet{

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


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

    }

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



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

    @Override
    public void destroy() {

    }
}

二.Servlet进阶

1. Servlet的生命周期

servlet从创建到销毁的过程

出生:(初始化)用户第一次访问时执行。

活着:(服务)应用活着。每次访问都会执行。

死亡:(销毁)应用卸载。

serrvlet生命周期方法:

	init(ServletConfig config)

	service(ServletRequest req, ServletResponse res)

	destroy()

2. Servlet生命周期描述

  1. 常规【重点】
    默认情况下, 第一次请求的时候,调用init()方法, 进行初始化【调用一次】
    任何一次请求, 都会调用service()方法处理这个请求
    服务器正常关闭或者项目从服务器移除,调用destory()方法进行销毁【调用一次】
  2. 扩展
    Servlet是单例多线程的, 尽量不要在Servlet里面使用成员变量,可能会导致线程不安全.
    单例: 只要一个Servlet对象. init()方法调用一次,就创建一次.
    多线程: 每次请求, 服务器都会开启一个线程调用service()方法 处理这个请求

3.ServletConfig

Servlet的配置对象, 可以使用用ServletConfig来获得Servlet的初始化参数, 在SpringMVC里面会遇到

  • 先在配置文件里面配置初始化参数
    Servlet_第1张图片
  • 可以通过akey获得aaa
    在这里插入图片描述

4.启动项

Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.

如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到
Servlet_第2张图片

三.Servlet体系结构

在这里插入图片描述

  • Servlet接口
    前面我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?

我们先来查阅API回顾Servlet接口:
Servlet_第3张图片
由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:

  • GenericServlet 类
    Servlet_第4张图片
    阅读上图API可知,GenericServlet 是一个类,它简化了servlet的开发,已经提供好了一些servlet接口所需的方法,我们开发者只需要重写service方法即可

我们来使用GenericServlet 创建servlet:

  1. 创建一个类
  2. 继承GenericServlet
  3. 重写service方法
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GenericDemoServlet执行.......");
    }
}

虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。

  • HttpServlet
    Servlet_第5张图片
    阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。

我们来使用HttpServlet创建servlet:

  1. 创建一个类
  2. 继承HttpServlet
  3. 重写doGet方法
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HttpDemoServlet",urlPatterns = "/http")
public class HttpDemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpDemoServlet执行.......");
    }
}

通过以上两个API阅读,注意一个细节,HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。

体系源码

  1. 结论: 在源码里面, service()方法里面会根据请求方式去调用doGet()或者doPost()
  2. 先看Servlet, 再看GenericServlet, 再看HttpServlet, 主要是HttpServlet里面的service()方法

四.ServletContext

1.servletContext概述

ServletContext: 是一个全局对象, 上下文对象.

服务器为每一个应用(项目)都创建了一个ServletContext对象。 ServletContext属于整个应用的,不局限于某个Servlet。

eg: 把我们班当做应用, 把班主任当做ServletContext, 每一位学生当做Servlet

2.ServletContext作用

作为域对象存取数据,让Servlet共享

获得文件MIME类型(文件下载) 

获得全局初始化参数

获取web资源路径  

3.ServletContext的功能

3.1作为域对象存取值

Servlet_第6张图片

  1. API
  • getAttribute(String name) ;向ServletContext对象的map取数据
  • setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
  • removeAttribute(String name) ;根据name去移除数据
  1. 代码
  • ServletDemo03
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用存的方法
servletContext.setAttribute("akey","aaa");

response.getWriter().print("ServletDemo03");

}
  • ServletDemo04
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用取的方法
String value  = (String) servletContext.getAttribute("akey");

response.getWriter().print("ServletDemo04..."+value);
}

3.2获得文件mime类型

  1. API
  • getMimeType(String file)
  1. 代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext
//2.调用getMimeType()方法
String file01 = "a.mp3";
String file02 = "b.png";
String mimeType01 = getServletContext().getMimeType(file01);
String mimeType02 = getServletContext().getMimeType(file02);

String value = getServletContext().getInitParameter("bkey");

response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02+":"+value);

}

3.3.获得全局初始化参数

  • String getInitParameter(String name) ; //根据配置文件中的key得到value;

在web.xml配置

Servlet_第7张图片
通过ServletContext来获得在这里插入图片描述

3.4获取web资源路径

  1. API
  • String getRealPath(String path);根据资源名称得到资源的绝对路径.
  • getResourceAsStream(String path) ;返回制定路径文件的流

注意: filepath:直接从项目的根目录开始写

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.获得文件的绝对路径 getRealPath()这个方法的路径已经在项目下了, 已经到了web目录下了
    String realPath = getServletContext().getRealPath("a.txt");
    System.out.println("realPath="+realPath);

    //2.获得文件的输入流  getResourceAsStream(String path);这个方法的路径已经在项目下了, 已经到了web目录下了
    //new FileInputStream(realPath);
    InputStream is = getServletContext().getResourceAsStream("a.txt");
    System.out.println(is);

}

你可能感兴趣的:(JavaEE,Servlet入门)