Servlet

作者: 打死你的小乌龟 | 来源:发表于2018-09-07 16:57 被阅读0次

最重要的是javax.servlet.Servlet接口
Servlet就是一种实现了Servlet接口的类

Servlet中定义了五个抽象方法

1.void init(ServletConfig config);负责Servlet的初始化
2.ServerConfig getServletConfig();返回容器调用init()方法时传递给Servlet的ServletConfig对象
3.String getServletInfo()返回一个字符串其中包含Servlet信息
4.void Service(ServletRequest request,ServletResponse response)
5.void destory();

servlet一个用java编写的web程序,此程序在服务器上运行以处理客户端请求
servlet技术特点

特点 描述
1.可移植性 :支持不同操作系统
2.功能强大 :支持javaAPI,jdbc,多线程,图像处理
3.简洁 :面向对象
4.安全性 :java编写
5.模块化 :多个servlet并行
6.集成 :紧密集成共同完成任务
7.拓展性和灵活性
8.高效耐久
servlet的生命周期

1.初始化阶段
当客户端向Servlet容器发送HTTP请求要求访问Servlet时Servlet容器首先会解析请求,检查是否存在该Servlet对象如果有直接使用该Servlet对象,没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet 的初始化工作 init()只调用一次

2.运行阶段
最重要的阶段Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象然后将他们作为参数传递给Servlet的service()方法,对于Servlet的每一次请求Servlet容器都会调用一次Servlet的service()方法并且创建新的ServletRequest和ServletResponse对象,会被调用很多次
3.销毁阶段
当服务器关闭或web应用被移除出容器时Servlet随着web的销毁而销毁会调用destroy()方法

servlet 的创建方式

三种创建方式
implements Servlet 实现Servlet然后重写service方法即可
extends GenericServlet 然后重写service方法即可
extends HttpServlet 实际开发中一般使用此种方法

若想要servlet生效就必须配置,servlet在web.xml中的配置如下



自动加载Servlet:只需要将web.xml中的<load-on-startup>随着wed启动即可

 <servlet>
    <servlet-name>pp</servlet-name>
    <servlet-class>com.hw.controller.twoServlet</servlet-class>
    <load-on-startup>1</load-on-startup>//值越小越优先加载
  </servlet>
  <servlet-mapping>
    <servlet-name>pp</servlet-name>
    <url-pattern>/twoServlet</url-pattern>
  </servlet-mapping>
Servlet的多重映射

一个Servlet可以被映射成多个虚拟路径

 <servlet>
    <servlet-name>pp</servlet-name>
    <servlet-class>com.hw.controller.twoServlet</servlet-class>
    <load-on-startup>1</load-on-startup>//值越小越优先加载
  </servlet>
  <servlet-mapping>
    <servlet-name>pp</servlet-name>
    <url-pattern>/twoServlet</url-pattern>
    <url-pattern>/two</url-pattern>     //多重映射那种路径都可访问
    <url-pattern>/servletTwo</url-pattern>
  </servlet-mapping>

Servlet映射路径中的通配符 " * "

  • 格式为"*.扩展名"
  • 格式为" /*"

默认Servlet
虚拟映射路径仅仅是一个正斜线(/)

HttpServlet

大多数的web都是通过HTTP和客户端进行交互因此在Servlet接口中提供了一个抽象类javax.servlet.httpHTTPServlet它是GenericServlet的子类专门用于创建应用于HTTP的Servlet
类的关系
Servlet<--------继承----------GenericServlet<--------继承------Httpservlet

HttpServle类在重写的service()方法中为每一种HTTP请求方式都定义了对应的doXxx()方法,因此继承HttpServlet后只需根据请求方式重写对应的doXxx()方法即可,而不需重写service()方法

HTTPServlet:主要有两大功能
1.根据用户请求方式的不同定义相应的doXXX()方法处理用户请求;
2.通用Servlet()的方法将HTTP请求和响应分别转为HttpServletRequest和HTTPServletResponse类型的对象

ServletConfig和ServletContext

当Tomcat初始化一个Servlet时,会将Servlet的配置信息封装到一个ServletConfig对象中,通过调用init()方法将将ServletConfig对象传递给Servlet。
在web.xml中使用一个或多个<init-param>

  <servlet>
    <servlet-name>ServletDemo5</servlet-name>
    <servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>GBK</param-value>
    </init-param>
    <init-param>
        <param-name>XXX</param-name>
        <param-value>YYY</param-value>
    </init-param>
  </servlet>

-------------------------------------------------------------------------------------------
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //使用config了
      ServletConfig config = getServletConfig();//写它就不用重写init()方法
      String param = config.getInitParameter("encoding");
        
    }

ServletConfig定义了一系列的配置信息方法

String getInitParameter(String name);根据参数名返回参数值
Enumeration  getInitParameterNames();返回一个Enumeration 
ServletContext getServletContext();
String getServletName();返回Servlet的名字
//得到当前Servlet所有的配置参数
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
   ServletConfig config = getServletConfig();
   Enumeration e = config.getInitParameterNames();//参数的名字
    while(e.hasMoreElements()){
    String paramName = (String)e.nextElement();
    System.out.println(paramName+"="+config.getInitParameter(paramName));   
    }

ServletContext接口

Servlet启动时会为每个web应用创建一个唯一的ServletContext对象代表当前web应用该对象不仅封装了web应用的所有信息,而且实现了对个Servlet之间的数据共享

1、ServletContext 代表着当前应用每个应用只有用一个ServletContext对象实例,有容器提供
2、获得ServletContext的实例:ServletConfig.getServletContext();
3、ServletContext的生命周期
        诞生:应用被加载时就有容器创建好
        活着:应用不挂就一直活着
        死亡:应用挂了,就挂了
4、域(存活范围)对象:
        ServletContext成为应用范围域对象。
servletContext 是四大域对象中最大的域对象
数据共享    
public void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
        ServletContext sc = getServletContext();
        sc.setAttribute("p", "ppp");
    }   

应用级参数的设置获取

应用级参数的设置
<context-param>
  <param-name>xxx</param-name>
  <param-value>yyy</param-value>
  </context-param>
    <context-param>
  <param-name>iii</param-name>
  <param-value>jjj</param-value>
  </context-param>
------------------------------------------------------------------------------
应用级参数的获取
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext sc = getServletContext();
        //得一个参数
//      String value = sc.getInitParameter("encoding");
//      System.out.println(value);
        //得所有的参数
        Enumeration<String> names = sc.getInitParameterNames();
        while(names.hasMoreElements()){
            String paramName = names.nextElement();
            System.out.println(paramName+"="+sc.getInitParameter(paramName));
        }
    }

请求转发

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext sc = getServletContext();
        RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo5");//转发的地址。ServletContext得到的,地址必须以"/"开头,该"/"就代表着当前应用的访问路径/day07_01_servlet
        rd.forward(request, response);//转发
    }

实现中文文件的下载

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext sc = getServletContext();
        String realPath = sc.getRealPath("/WEB-INF/classes/222.jpg");//  文件存放的真实绝对路径
        //System.out.println(realPath);
        //构建文件的输入流
        InputStream in = new FileInputStream(realPath);
        //告知客户端以下载的方式打开:Content-Disposition=attachment;filename=222.jpg
        //获取要下载的文件名
        
        String filename  = realPath.substring(realPath.lastIndexOf(File.separator)+1);
        
        response.setHeader("Content-Type", "application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全的字符,需要进行URL编码
        
        //用response的字节流进行输出
        OutputStream out = response.getOutputStream();
        
        int len = -1;
        byte b[] = new byte[1024];
        while((len=in.read(b))!=-1){
            out.write(b, 0, len);
        }
        in.close();
        out.close();
    }

读取属性文件

第一种方式
分别将三个属性文件放到不同的文件夹下,并得到路径
//      String path = getServletContext().getRealPath("/a.properties");
//      String path = getServletContext().getRealPath("/WEB-INF/classes/b.properties");
        String path = getServletContext().getRealPath("/WEB-INF/classes/com/hhh/resources/c.properties");
        
        InputStream in = new FileInputStream(path);
        Properties props = new Properties();
        props.load(in);
        System.out.println(props.getProperty("hello"));
------------------------------------------------------------------------------------
第二种方式
//利用ResourceBundle读取:b  c ,不能读a,只能读取properties的文件
//ResourceBundle rb = ResourceBundle.getBundle("b");
        ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.c");
        System.out.println(rb.getString("hello"));
-----------------------------------------------------------------------------------
 第三种方式
//类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c  
ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器
        URL url = cl.getResource("com/itheima/resources/c.properties");
        String path = url.getPath();
        InputStream in = new FileInputStream(path);
        Properties props = new Properties();
        props.load(in);
        System.out.println(props.getProperty("hello"));
-------------------------------------------------------------------------------------
 第四种方式
        ClassLoader cl = ServletContextDemo7.class.getClassLoader();//得到类加载器
//InputStream in = cl.getResourceAsStream("b.properties");
        InputStream in = cl.getResourceAsStream("com/itheima/resources/c.properties");
        Properties props = new Properties();
        props.load(in);
        System.out.println(props.getProperty("hello"));

servlet事件监听器

servletAPI中提供三个接口ServletContextListener,httpSessionListener,
ServletRequestListener,他们分别用于监听各自的对象的生命周期

监听域对象中的属性变更的接口
ServletContexAttributeListener
httpSessionAttributeListener
ServletRequestAttributeListener

相关文章

  • servlet 笔记

    servlet servlet 声明周期 Servlet 的线程安全 Servlet 获取配置信息 Servlet...

  • Servlet

    Servlet介绍 Servlet开发步骤 创建Servlet 配置Servlet 配置Servlet中设置初始化...

  • 深入理解Servlet技术

    1. 什么是servlet servlet Servlet是javax.servlet.Servlet包中定义的一...

  • Servlet与Jsp(1)

    Servlet 实现原理Servlet接口使Servlet容器能将Servlet类载入内存,并在Servlet实例...

  • web.xml不同版本之间头信息的区别

    一、Servlet 2.3 二、Servlet 2.4 三、Servlet 2.5 四、Servlet 3.0 五...

  • Servlet入门

    Servlet简介 Servlet(Servlet Applet)是Java Servlet的简称,称为小服务程序...

  • Servlet 实例

    Servlet 实例 Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接...

  • Java Servlet API

    Servlet 支持的版本 Servlet 3.0 新特性详解 Servlet 3.0 新特性概述Servlet ...

  • 简单认识Servlet

    Servlet与JSP的关系 初识Servlet Servlet层级关系 顶层Servlet接口 GenericS...

  • 2019-10-14 SpringMVC与Servlet接口 S

    SpringMVC与Servlet接口 Servlet接口规范 Servlet 接口 定义servlet接口规范i...

网友评论

      本文标题:Servlet

      本文链接:https://www.haomeiwen.com/subject/vjwcgftx.html