你不得不了解的JavaWeb三大组件

Hello 大家好!

今天我们的主要内容是聊一聊JavaWeb的三大组件

Servlet,Filter,Listener

你不得不了解的JavaWeb三大组件_第1张图片

在聊JavaWeb三大组件之前,我们先来看一些关于Web的概念性的东西!看看大家是否能把这些概念理解清楚。

你不得不了解的JavaWeb三大组件_第2张图片

首先,我们来看第一个问题:什么是Web开发,什么是JavaWeb?

  •     Web开发中的Web指的就是网页,所以WEB开发指的就是网页开发
  •    JavaWeb指的就是使用Java开发Web资源/Web应用程序

你不得不了解的JavaWeb三大组件_第3张图片

第二个问题:什么是网页?

网页是web应用程序最重要的元素

  • 网页本质是html格式的文本文件,是承载各种内容的载体,
  • 网站由网页组成,页面是必须的,(只有域名和服务器,而没有制作任何网页的话,客户仍旧无法访问网站。)
  • 每个网页对应一个全球唯一的URL(统一资源定位符),用于在互联网中识别与存取该网页

当我们在浏览器输入网址后,经过一段复杂而又快速的程序,网页文件会被传送到你的计算机,然后再通过浏览器解释网页的内容,再展示到你的眼前

你不得不了解的JavaWeb三大组件_第4张图片

第三个问题:Web为什么和Java是有关系的

  • Web的主流技术少不了 socket,http协议,数据库,并发等关键技术;无论是什么语言都需要解决这些技术问题,也有很多语言实现了上述技术,那为什么选择Java呢?
  • Java向来以严谨,稳定,标准化著称,这些特性对于企业开发环境下尤其的重要,尽管出现了一些语法非常简单灵活的语言,例如python,php等,但是灵活带来的就是不严格,不标准,这些风险是企业所不希望承受的;所以JavaEE至今任然占领了绝大多数的企业Web开发环境;

你不得不了解的JavaWeb三大组件_第5张图片

第四个问题:JavaEE是什么?

  • AVAEE 是Java的企业版本
  • 相对于JavaSE扩展了更多企业所需要的服务和接口
  • 需要强调的是JAVAEE仅仅是制定了一套协议规范,并不是真正的实现,其指导其他厂商应当如何实现企业服务和API

你不得不了解的JavaWeb三大组件_第6张图片

第五个问题:JavaSE是什么?

  • Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础 。
  • Java SE是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。
  • 用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。
  • 从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Java applet。(摘要“百度百科”)

你不得不了解的JavaWeb三大组件_第7张图片

最后一个问题:Java程序设计语言和Java平台是什么意思?

  • Java是由SunMicrosystems公司于1995年推出的一门面向对象程序设计语言。2010年Oracle公司收购SunMicrosystems,之后由Oracle公司负责Java的维护和版本升级。
  • 其实,Java还是一个平台。Java平台由Java虚拟机(JavaVirtualMachine,JVM)和Java应用编程接口(ApplicationProgrammingInterface,API)构成。
  • Java应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。
  • Java平台已经嵌入了几乎所有的操作系统。这样Java程序只编译一次,就可以在各种系统中运行
  • Java发展至今,就力图使之无所不能。按应用范围,Java可分为3个体系,即JavaSE、JavaEE和JavaME。

你不得不了解的JavaWeb三大组件_第8张图片

大家觉得怎么样?是不是有点头大!别紧张,上面相关概念其实都是为了帮助大家能更好的理解Java和Web之间的一些关系,没有记住没关系,我们接着往下看:

你不得不了解的JavaWeb三大组件_第9张图片

Web资源我们一般分为两类

  • 静态web资源
    • HTML、CSS、JS...
    • 一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来
    • 特点是:所有用户访问,得到的结果是一样的
    • 提供给所有人看,数据、内容始终不会发生变化,每个人看到的都是一样的,比如某些官网

你不得不了解的JavaWeb三大组件_第10张图片

  • 动态web资源
    • 提供给所有人看,数据、内容始终会发生变化,每个人在不同时间和地点看到的数据各不相同
    • 一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,web服务器返回给客户端解析渲染处理
    • 特点是:所有用户访问,得到的结果可能不一样
    • 比如京东购物网站,里面很多东西都是动态展示的。一般需要我们登陆的网页基本都是动态的web资源/页面
    • 技术栈:servle/jsp...
  • 结论:在Java中,动态WEB资源开发的技术统称 JavaWeb

你不得不了解的JavaWeb三大组件_第11张图片

那么,经过上面的铺垫,接下来,JavaWeb中我们如何用Java语言去进行动态Web资源开发,那么就不得不提今天的三大主角了(Servlet,Filter,listener

你不得不了解的JavaWeb三大组件_第12张图片

Servlet

  • Servlet就是一个接口,定义了java类被浏览器访问到(webServer识别)的规则
  • Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
  • 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

在Java web b/s(浏览器/服务器)架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理

那么,Servlet既然是浏览器和服务器的中间层,它主要的任务到底是做什么的?

你不得不了解的JavaWeb三大组件_第13张图片

Servlet 任务

Servlet 执行以下主要任务:

  • 读取浏览器发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取浏览器发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到浏览器。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到浏览器。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

总结:不难发现,Servlet主要有两个任务(读取和发送),一个是读取浏览器发送的数据一个是根据相对应的需求处理后去返回一个结果给到浏览器

你不得不了解的JavaWeb三大组件_第14张图片你不得不了解的JavaWeb三大组件_第15张图片

ServletDemo

那么我们来简单看看这个Servlet的流程

  • 首先,我们在一个前端页面写一个表单,提交发送请求:
名字:

  • 然后,我们写一个Java类 实现Servlet接口,实现其方法,并且在service()方法中进行Servlet任务处理:
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletRequest.setCharacterEncoding("utf-8");
        //得到前端请求数据
        String first_name = servletRequest.getParameter("first_name");
        //处理前端请求数据
        first_name="你好,"+first_name;
        System.out.println(first_name);
        //返回处理数据给前端
        servletResponse.setContentType("text/html;charset=UTF-8");
        servletResponse.getWriter().write(first_name);

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("结束");
    }
}

这里注意对请求地址进行配置,在web.xml中

 
        ServletDemo
        ServletDemo
    
    
        ServletDemo
        /servletDemo
    
  • 最后,我们将前端的数据处理后,在写回前端页面

你不得不了解的JavaWeb三大组件_第16张图片

这就简单基础的实现了Servlet的基本任务!

Servlet生命周期

通过上面的小案例,我们发现实现Servlet的类中,有很多的方法,简单介绍一下这些方法
(1)init方法
初始化方法,在Servlet被创建时(第一次访问到这个Servlet时)执行,只会执行一次
(2)service方法
每次Servlet被访问时执行
(3)destroy方法
在Servlet被杀死时会执行,在服务器正常关闭时,执行,只会执行一次
(4)getServletConfig方法(了解)
获取Servlet的配置对象
(5)getServletInfo方法(了解)
获取Servlet的一些信息,如版本,作者等等

你不得不了解的JavaWeb三大组件_第17张图片

那么,Servlet的生命周期其实是和这些方法有关的,如下:

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

Filter

 

  • 在客户端到服务器的过程中,当发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行,在服务器给客户端响应时也会进行判断 如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行。就像公路上的收费站一样,你只有按照别人的规则交了钱,别人才放行,你才能通过这个收费站去下一条路
  • filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能。
  • filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

你不得不了解的JavaWeb三大组件_第18张图片

Filter的应用场景

  • 处理全站中文乱码问题
  • 实现自动登录
  • 过滤敏感词汇
  • 等等

FilterDemo

那么,我们就举一个简单的列子来看看过滤器的作用

比如说“过滤敏感词汇” 

需求:当前端发送的请求参数为“渔夫”,“很丑”,“愚蠢”时,将其过滤为“***”后放行,再给Servlet进行操作

  • 首先,我们前端页面是这样的
名字:
  • 接下来,需要创建一个类去实现Fflter接口,重新其方法
public class SensitiveWordsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.创建代理对象,增强getParameter方法
        ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强getParameter方法
                //判断是否是getParameter方法
                if(method.getName().equals("getParameter")){
                    //增强返回值
                    //获取返回值
                    String value = (String) method.invoke(req,args);
                    if(value != null){
                    //将请求中的参数和list集合里面的数据进行比较,敏感的词语替换为“***”,
                    //不敏感的则无需修改
                        for (String str : list) {
                            if(value.contains(str)){
                                value = value.replaceAll(str,"***");
                            }
                        }
                    }
                    return  value;
                }
                return method.invoke(req,args);
            }
        });
        //2.过滤完成,放行
        chain.doFilter(proxy_req, resp);
    }
    private List list = new ArrayList();//敏感词汇集合

    @Override
    public void init(FilterConfig config) throws ServletException {
        list.add("渔夫");
        list.add("好丑");
        list.add("愚蠢");
    }

    @Override
    public void destroy() {
    }

}
  • 然后,配置web.xml,确定需求过滤什么样的地址请求:
 
        SensitiveWordsFilter
        filter.SensitiveWordsFilter
    
    
        SensitiveWordsFilter
        
        /* 
    
  • 接着,我们开始测试,Servlet里面的东西我们还是用刚才ServletDemo里面的代码
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletRequest.setCharacterEncoding("utf-8");
        //得到前端请求数据
        String first_name = servletRequest.getParameter("first_name");
        //处理前端请求数据
        first_name="你好,"+first_name;
        System.out.println(first_name);
        //返回处理数据给前端
        servletResponse.setContentType("text/html;charset=UTF-8");
        servletResponse.getWriter().write(first_name);

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("结束");
    }
}
  • 运行tomcat:

你不得不了解的JavaWeb三大组件_第19张图片

  • 当我们提交的名字为“渔夫”敏感词汇时,返回结果为:

  • 当我们提交的名字为“光头强”非敏感词汇时,返回结果为:

于是,我们对所有请求参数的词语就进行了过滤操作。其执行流程是:请求首先到达过滤器的doFilter方法,然后对request增强,然后调用filterChain放行,最后servlet进行处理。

Filter生命周期

  • init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
  • doFilter:每一次请求被拦截资源时,会执行。执行多次
  • destroy:在服务器关闭后,Filter对象会被销毁。如果服务器是正常关闭,则会执行destory方法。只执行一次。用于释放资源

Filter的拦截配置

  • 具体资源路径拦截:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  • 拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
  • 后缀名拦截:*.jsp 访问所有后缀名为jsp资源时 过滤器都会被执行
  • 拦截所有资源:/* 访问所有资源时过滤器会被执行(刚才的小案例就是用的这种

Listener

  • Listener就是监听器,我们在JavaSE开发或者Android开发时,经常会给按钮加监听器,当点击这个按钮就会触发监听事件,调用onClick方法,本质是方法回调。在JavaWeb的Listener也是这么个原理,但是它监听的内容不同,它可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。 
  • 监听器就是监听某一个对象的状态,发生改变的组件。
    事件源:被监听的对象(偷电瓶的人)。事件:事件源做出的行为(偷电瓶
    监听器:监听事件源的对象(监控摄像头)。
    相应的行为:监听的事件发生了,应该怎么处理(当看到偷电瓶的人开始偷电瓶时,发出警报,派相关人员对其进行抓捕)。
  • 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

你不得不了解的JavaWeb三大组件_第20张图片

ListenerDemo

自定义的监听器其实用得不多,所以这里我们就只简单自定义一个对ServletContext域对象的监听器吧!

需求:当ServletContext这个对象创建时,我们打印“ServletContext已创建”,当ServletContext这个对象销毁时,我们打印“ServletContext已不在”

  • 首先,需要创建一个类去实现ServletContextListener接口:
public class ContextLoaderListener implements ServletContextListener {

    /**
     * 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
     *
     * 在服务器启动后自动调用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext已创建");
        System.out.println("当ServletContext对象创建后,进行了这些。。。操作");
    }

    /**
     * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext已不在");
    }
}
  • 接下来,需要对自定义监听器进行再web.xml中配置:
 
        
        listener.ContextLoaderListener
    
  • 最后,运行tomcat,我们发现:

当ServletContext这个对象创建时,就会去执行自定义监听器里面方法contextInitialized的代码,进行一些我们想要的操作。

  • 关闭tomcat,我们发现:

当ServletContext这个对象销毁时,也会去执行自定义监听器里面方法contextInitialized的代码。

值得大家注意的是我们创建一个监听器的步骤,其他监听器都是按照这个步骤进行的。

 

好了,以上就是我们JavaWeb三大组件的基本概念和流程了,谢谢各位小伙伴的观看!

最后,给大家留一个思考题:Servlet和Filter这两者有什么区别? 

欢迎大家在下面留言讨论!

你不得不了解的JavaWeb三大组件_第21张图片

你可能感兴趣的:(web,java,后端,服务器,过滤器)