JavaWeb笔记-09-Servlet概述、实现及细节,与反射关系

1、Servlet概述


服务程序,javaWeb三大组件之一。属于动态资源,

作用:主要功能在于交互式的浏览和修改数据,生成动态Web内容。
理解:处理动态请求,如果请求的是动态资源,服务器把接收到的请求交给serlet处理。

servlet的工作:
    接收请求数据
    处理请求
    完成响应

在服务器中,每个servlet都是唯一的,他们处理的请求不同。 可理解为不同的话务员。

图片转载:
转载

2、实现Servlet三种方式


1)实现javax.servlet.Servlet接口
2)实现javax.servlet.GenericServlet接口
3)继承javax.servlet.http.HttpServlet类

三者关系:
Servlet是一个接口,其中含有很多方法如:init(),service(),destory()方法。
GenericServlet是一个实现了Servlet接口的实现类,他可以使用Servlet中的方法。
HttpServlet是GenericServlet的实现类(儿子),也就是说间接的实现了Servlet接口,

1)实现javax.servlet.Servlet接口

特性: 
    单例:一个类只能有一个对象,但是存在多个类
    线程不安全,效率最高

注:Servlet类由我们来写,对象由服务器创建,方法由服务器调用
步骤:
        1)创建实现接口的类,重写五个方法
        2)编写web.xml 
            <servlet>
            A-------    <servlet-name>xxx</servlet-name>    //姓名1   1和2名称相同,则访问姓名1对应的类
            B-------    <servlet-class>servlet.AServlet</servlet-class>  //被访问的类
            </servlet>

            <servlet-mapping>
            C-------    <servlet-name>xxx</servlet-name>       //姓名2 在servlet中找相同名称   
            D-------    <url-pattern>/AServlet</url-pattern>  //与接收的url匹配。
            </servlet-mapping>

            过程: 浏览器接收url后   D -->  C -->  A --> B

        3)访问url
            ***********localHost:8080/项目名/url地址
生命周期方法:
    出生   //  void init(ServletConfig arg0)  
    处理   //  void service(ServletRequest arg0, ServletResponse arg1) 
    结束   //  destroy()

ServletConfig在内存中存放对应 web.xml中Servlet配置信息(初识化参数)

2)继承javax.servlet.GenericServlet类 实现service方法

内部实现原理:GenericServlet是一个实现了Servlet接口的实现类

实现了Servlet接口,并帮我们做了一些常用操作:

    1.init方法 保存config对象并实现getServletInfo,getServletConfig,

    2.增加一个空参init方法,供开发人员初始化,为了防止开发人员重写原生init方法

    3.service方法空实现=> 抽象方法(强制开发人员实现该方法)

    4.destory方法空实现 

    5.实现了servletConfig接口. 接口中的方法直接调用config实现类实现.
    //service方法需要重写
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        String value = getInitParameter("p1");
        System.out.println(value);
    }
知识点:
    ServletContext类中方法---

    ServletContext getServletContext();获取Servlet上下对象
    String getServletName() 获取 <servlet-name> 中的文本 
    String getInitParameter(String name);  获取指定名称初始化参数的值
    Enumeration getInitParameterNames(); 获取所有初识化参数名称

3)javax.servlet.http.HttpServlet接口

内部原理:HttpServlet是GenericServlet的实现类

    //继承GenericServlet
    HttpServlet extends GenericServlet{

        1)用此方法强转两个参数为http协议相关的类型
        void service(ServletRequest,ServletResponse)

        2)然后调用本类的service(HttpServletRequest,HttpServletResponse)
        void service(HttpServletRequest,HttpServletResponse)
                    //参数是和http协议相关的使用起来将更加方便

        3)会根据request得到当前请求的请求方式来调用方法
        doGet()doPost()
    }

用MyEclipse创建HttpServlet实现类步骤

1.包名 右键
2.servlet
    此时已经自动继承HttpServlet类
    下面的选项是是否需要自动生成的方法。
    选择自己需要的。(一般只留下doGet和doPost)

3.自动添加xml文件的选项
    类名、 地址名、 被添加的xml文件路径、两个默认展示的描述

3、servlet细节:


1)线程安全问题

1.避免在servlet内创建成员,局部变量即可   //初学阶段
2.创建无状态成员 (成员只有无参方法)    //进阶
3.创建只读对象(只有get方法)      //高级

目的: 防止出现多线程同时操作(读,写)一个servlet对象

2)创建时机

时间点1 : 一般在首次访问时自动创建。  第一次惩罚---首次访问会慢 

时间点2 :在服务器启动时创建。  --需要在web.xml中进行配置

         做法:在<servlet>中添加<load-on-startup>,
              标签内容为非负整数。内容为0时表示在服务器启动时创建
              整数大小为servlet创建顺序

3)访问路径

    1.<url-pattern> 必须以"/"开头 
    2.可以有多个url路径表示
    3.通配符 "*"  可以同时绑定多个url
        匹配前缀(部分路径匹配)或后缀(扩展名匹配)。 

4)xml文件的”继承”

    Tomcat的conf/web.xml 是所有xml文件的父文件。

5)Servlet运行流程

Servlet作为Web服务器的补充功能在运行时需要受到Servlet容器的管理:

    1)浏览器依据IP建立与容器的连接
    2)浏览器将请求数据打包
    3)容器解析请求数据包,封装request和response对象
    4)容器依据请求资源路径找到Servlet创建对象
    5)容器将request和response对象作为参数传入service方法,并调用
    6)容器将响应数据打包发给浏览器
    7)浏览器取出结果,生成页面

4、Servlet与反射


HttpServlet的子类中,必须要有空参的构造方法(默认的构造方法)

当Servlet被调用时,Servlet容器将会调用该Servlet的默认构造函数,
    来建立一个Servlet实体

步骤:  (3)(4)为重点

    1)根据请求的URL地址,找到相应的url-pattern。

    2)利用匹配url-pattern找到相应的servlet类,

    3)反射技术获取Servlet对象,  
        //Class c=class.forName(路径)得到相应的Class,

    4)通过c.newInstance()获得实例对象。

    5)调用实例对象的service方法
        通过Method method=c.getMethod("service",ServletRequest.class,ServletResponse.class)

    6)通过method.invoke()完成对该方法的调用。

注:以上过程都是Tomcat帮助我们做的,不用我们来实现。我们知道处理过程及原理即可。

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81266671