Servlet入门学习

概念:运行在服务器端的小程序,就是一个接口定义了Java类tomcat识别的规则

快速入门

  • 创建JavaEE项目

  • 定义类实现Servlet接口

  • 实现抽象方法

  • 配置Servlet

    • 在web.xml配置
      <!--配置servlet-->
      <servlet>
          <servlet-name>demo1</servlet-name>
          <servlet-class>web.servlet.ServletDemo</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>demo1</servlet-name>
          <url-pattern>/demo1</url-pattern>
      </servlet-mapping>

执行原理

  1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容
  3. 如果有,则再找对应的<servlet-class>全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

Servlet中的生命周期

  1. 被创建:执行init方法,只执行一次
    • Servlet什么时候被创建
      • 默认情况下,第一次被访问时,Servlet被创建
      • 可以配置执行Servlet的创建时机:在<servlet>标签下配置
        • 第一次访问时创建:<load-on-startup>的值为负数
        • 在服务器启动时创建:<load-on-startup>的值为正整数
    • Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,是单例的
      • 多个用户同时访问,可能存在线程安全问题
      • 解决:尽量不要在Servlet中定义成员变量,即使定义了成员变量不要修改它
  2. 提供服务:执行services,执行多次
    • 每次访问Servlet时,Service方法都会被调用一次
  3. 销毁:执行destory方法,执行一次
    • Servlet被销毁时执行,服务器关闭时,Servlet被销毁
    • 只有服务器正常关闭时才会执行destory方法
    • destory方法在Servlet被销毁之前执行,一般用于释放资源

Servlet4.0:

  • 好处:支持注解配置,不需要web.xml
  • 步骤:
    1. 创建JavaEE项目,选择Servlet版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置
      • @WebServlet("资源路径")

Servlet体系结构:

  • Servlet -- 接口
    • GenericServlet -- 抽象类:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
      • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
    • HttpServlet -- 抽象类:对http协议的一种封装,简化操作
      • 定义类继承HttpServlet
      • 复写doGet/doPost方法

ServletContext对象

  1. 概念:代表整个Web应用,可以和程序的容器(服务器)来通信
  2. 获取:
    • 通过request对象获取
      requset.getServletContext()
    • 通过HttpServlet获取
      this.getServletContext()
  3. 功能:
    • 获取MIME类型
      • 在互联网通信过程中定义的一种文件数据类型
        • 格式:大类型/小类型 text/html image/jpeg
        • 获取:String getMimeType(String file)
    • 域对象:共享数据
      • setAttribute(String name,Object value)
      • getAttribute(String name)
      • removeAttribute(String name)
      • SevletContext对象范围:所有用户所有请求的数据
    • 获取文件的真实服务器路径
      • 方法:getRealPath(String Path)

文件下载案例
在响应头设置资源打开方式:content-disposition:attachment;filename=xxx

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
 * @author: Thorn
 * @Date: 2020/8/14 20:44
 * @Description:
 */
@WebServlet("/downloadServlet")
public class downloadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取参数
        String filename = request.getParameter("filename");
        //使用字节输入流加载文件进内存
        //找到服务器路径
        ServletContext context = this.getServletContext();
        String path = context.getRealPath("/img/" + filename);
        //设置响应头
        String MimeType = context.getMimeType(filename);
        response.setHeader("content-type",MimeType);
        //设置响应头打开方式
        response.setHeader("content-disposition","attachement;filename="+filename);
        //使用字节流关联
        FileInputStream in = new FileInputStream(path);
        //将输入流的数据写出到输出流
        ServletOutputStream out = response.getOutputStream();
        byte[] buff = new byte[1024*8];
        int len = 0;
        while ((len = in.read(buff)) != -1)
        {
            out.write(buff,0,len);
        }

        in.close();

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载测试</title>
</head>
<body>
<a href="/Demo/downloadServlet?filename=测试.jpg">图片</a>
<hr>
<a href="/Demo/downloadServlet?filename=1.mp4">视频</a>
</body>
</html>
Last modification:August 17th, 2020 at 04:08 pm
如果觉得我的文章对你有用,请随意赞赏