Servlet

作者: 咸鱼有梦想呀 | 来源:发表于2018-07-19 16:38 被阅读0次

    一.Servlet概述

    Servlet是JavaWeb的三大组件之一,它属于动态资源。
    三大组件:Servlet,filter,listener

    1.Servlet的作用
    Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

    • 接收请求数据
    • 处理请求
    • 完成响应

    例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!每个Servlet必须实现javax.servlet.Servlet接口。

    2.实现Servlet的方式

    • 实现javax.servlet.Servlet接口;
    • 继承javax.servlet.GenericServlet类;
    • 继承javax.servlet.http.HttpServlet类;

    我们现在最常用的实现Servlet的方式就是继承HttpServlet类。

    3.Servlet接口
    Servlet.java

    public interface Servlet{
    
        public void init(ServletConfig config) throws ServletException;
        /*
        *  getServletConfig这个方法可以用来获取Servlet的配置信息
        */
        public ServletConfig getServletConfig();
    
        public  void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
        /*
        *  getServletInfo这个方法获取Servlet的信息
        */
        public String getServletInfo();
    
        public  void destroy();
    
    }
    

    Servlet中的方法大多数不由自己来调用,而是由Tomcat来调用。并且Servlet的对象也不由自己来创建,由Tomcat来创建!

    • 生命周期方法
      • void init(ServletConfig servletConfig)
        这个方法会在Servlet对象创建之后马上执行,并只执行一次。初始化!
      • void destroy()
        这个方法会在Servlet被销毁之前调用,并且只会被调用一次
      • void service(ServletRequest request, ServletResponse response)
        这个方法会被调用多次,每次处理请求都是调用这方法。

    二.Servlet的生命周期

    服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)

    该servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

    最后服务器关闭时,才会销毁这个servlet对象,执行destroy()方法。

    Servlet的生命周期

    1.浏览器访问Servlet
    a.给Servlet指定一个路径,让Servlet和一个路径绑定在一起
    b.浏览器访问Servlet路径

    在web.xml中对Servlet进行配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    <servlet>
        <servlet-name>xxx</servlet-name>
        <servlet-class>demo/cn.edu.web.servlet/AServlet.java</servlet-class>
    </servlet>
        <servlet-mapping>
            <servlet-name>xxx</servlet-name>
            <url-pattern>/AServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    
    浏览器访问Servlet

    <url-pattern>
    <url-pattern>是<servlet-mapping>的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头!

    • 可以在<servlet-mapping>中给出多个<url-pattern>
    <servlet-mapping>
        <servlet-name>AServlet</servlet-name>
        <url-pattern>/AServlet</url-pattern>
        <url-pattern>/BServlet</url-pattern>
      </servlet-mapping>
    

    这说明一个Servlet绑定了两个URL,无论访问/AServlet还是/BServlet,访问的都是AServlet。

    • 在<url-pattern>中使用通配符
      通配符就是星号“*”,星号可以匹配任何URL前缀或后缀,使用通配符可以命名一个Servlet绑定一组URL
      • <url-pattern>/servlet/*<url-patter>:/servlet/a、/servlet/b,都匹配/servlet/*;
      • <url-pattern>*.do</url-pattern>:/abc/def/ghi.do、/a.do,都匹配*.do;
      • <url-pattern>/*<url-pattern>:匹配所有URL;

    三.HttpServlet

    1.HttpServlet概述
    HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。

    2.HttpServlet的方法

    HttpServlet的方法

    3.HttpServlet的原理

    HttpServlet的原理

    也就是Servlet类要继承HttpServlet,重写doGet()或doPost()方法
    重写doGet()或doPost()方法,如果没有重写doGet()或doPost()方法,并且被调用了doGet()或doPost()方法,会出现405。

    四.ServletContext

    1.ServletContext概述
    一个项目只有一个ServletContext对象,可以给多个Servlet传递数据

    ServletContext对象在服务器启动时创建,在服务器关闭时销毁。

    2.获取ServletContext

    • 在void init(ServletConfig config)中:
      ServletContext context = config.getServletContext();
      ServletConfig类的getServletContext()方法可以用来获取ServletContext对象;

    • 在GenericeServlet或HttpServlet中获取ServletContext对象:
      GenericServlet类有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;

    3.域对象的功能
    域对象就是用来在多个Servlet中传递数据。

    • 域对象必须有要存数据功能
    • 域对象必须要有取数据功能

    域对象内部有一个Map,用来存储数据

    ServletContext是JavaWeb四大域对象之一:
    四大域:

    • page(PageContext)
    • request(ServletRequest)
    • session(HttpSession)
    • application(ServletContext)

    4.ServletContext对象操作数据的方法

    • void setAttribute(String name, Object value)
      用来存储一个对象,也可以说是存储一个域属性
      eg:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同
    • Object getAttribute(String name)
      用来获取ServletContext中的数据,在获取之前需要先去存储才行
      eg:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
    • void removeAttribute(String name)
      用来移除ServletContext中的域属性。一对一对的删除。如果参数name指定的域属性不存在,那么本方法什么都不做。
    • Enumeration getAttributeNames()
      获取所有域属性的名称

    5.获取应用初始化参数
    可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数!注意,应用初始化参数与Servlet初始化参数不同
    Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备。

    web.xml

    <web-app ...>
    
     ...
    
      <context-param>
    
      <param-name>paramName1</param-name>
    
      <param-value>paramValue1</param-value>  
    
      </context-param>
    
      <context-param>
    
      <param-name>paramName2</param-name>
    
      <param-value>paramValue2</param-value>  
    
      </context-param>
    

    用ServletContext获取公共的初始化参数

    //获取ServletContext对象
     ServletContext context =this.getServletContext();
      
    //通过参数名获取参数值
     String value1 = context.getInitParameter("paramName1");
     String value2 = context.getInitParameter("paramName2");
     System.out.println(value1 + ", " + value2);
    //paramValue1,paramValue2
    
    //获取所有应用初始化参数名称
     Enumeration names = context.getInitParameterNames();
    
      while (names.hasMoreElements()) {
    
     System.out.println(names.nextElement());
    
     }
    

    6.使用ServletContext获取资源路径
    1)获取真实路径
    使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

    • 获取a.txt的真实路径:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt

    2)获取资源流
    可以通过ServletContext获取资源流,即把资源以输入流的方式获取

    • eg:获取a.txt资源流:
      InputStream in = servletContext.getResourceAsStream(“/a.txt”);

    3)获取当前路径下所有资源的路径
    使用ServletContext获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径

    Set set = context.getResourcePaths("/WEB-INF");
    System.out.println(set);
    //[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/b.txt, /WEB-INF/web.xml]
    

    相关文章

      网友评论

        本文标题:Servlet

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