Servlet

一.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的生命周期

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

在web.xml中对Servlet进行配置




    xxx
    demo/cn.edu.web.servlet/AServlet.java

    
        xxx
        /AServlet
    

Servlet_第2张图片
浏览器访问Servlet


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

  • 可以在中给出多个

    AServlet
    /AServlet
    /BServlet
  

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

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

三.HttpServlet

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

2.HttpServlet的方法

Servlet_第3张图片
HttpServlet的方法

3.HttpServlet的原理

Servlet_第4张图片
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



 ...

  

  paramName1

  paramValue1  

  

  

  paramName2

  paramValue2  

  

用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)