JavaWeb之Servlet知识点总结

JavaWeb之Servlet知识点总结

文章目录

目录

JavaWeb之Servlet知识点总结

文章目录

一、Servlet及其相关类与接口

1.Servlet

2.Servlet接口

3.编写Servlet程序的相关接口

4.编写Servlet程序的相关抽象类

5.自定义Servlet的过程

6.Servlet的生命周期

7.servlet的执行流程

8.ServletContext

二、Servlet的功能

1.请求

2.请求转发

3.响应

4.重定向

5.请求转发和重定向的区别

6.Cookie

7.Cookie的使用案例

8.Session

9.Cookie和Session进行对比

10.Filter过滤器

11.四个域对象的范围从小大到

三、java注解与HTTP协议

1.Java注解(Annotation)

6.HTTP协议


一、Servlet及其相关类与接口

1.Servlet

    (1)概念:Servlet(Server Applet的简称)是服务器端的程序(代码、功 能实现),可交互式的处理客户端发送到服务端的请求,并完成响应操 作。

                    是JavaWeb程序开发的基础,JavaEE规范(一套接口)的一个组成 部分。

    (2)作用

        1)接收客户端请求,完成操作。

        2)动态生成网页(页面数据可变)。

        3)将包含操作结果的动态网页响应给客户端。

    (3)Servlet的结构体系

        1)在Servlet结构体系中,Servlet接口是最高父接口。

        2)GenericServlet抽象类实现Servlet接口,重写了其中的方法。

        3)HttpServlet抽象类继承了GenericServlet类,重写了service方法, 实现了不同提交方式完成不同的业务方法。

        4)自定义类一般继承HttpServlet类,重写其中的doGet()方法和 doPust()方法,处理请求和响应。

    (4)Servlet程序的三种创建方式:

        实现Servlet接口,继承GenericServlet,或HttpServlet类。

2.Servlet接口

    (1)描述:在Servlet API中最重要的是Servlet接口,所有Servlet都会直 接或间接的与该接口发生联系。或是直接实现该接口,或间接继承自实 现了该接口的类。

    (2)方法:

        init(ServletConfig config)

        作用:初始化servlet对象,该方法只能被调用一次。

        ServletConfig getServletConfig()

        作用:获得Servlet配置对象。

        service(ServletRequest req,ServletResponse res)

        作用:接受客户端请求对象,执行业务操作,通过响应对象响应客户端 请求。

        String getServletInfo()

        获取servlet相关信息。

        destroy()

        作用:当服务器监测到一个servlet从服务器中被移除时,调用该方法, 释放资源,或服务器重启/关闭。

3.编写Servlet程序的相关接口

    (1)ServletConfig(Servlet配置对象)接口:具备获得servlet的配置信息 的功能。

    (2)ServletConfig的方法:

        ServletContext getServletContext()

        作用:获取servlet的上下文对象(全局对象)。

        String getServletName();

        作用:获取servlet的名字。

        String getInitParameter(String name);

        作用:获取servlet在web.xml中指定参数名的配置参数(单个参数)。

        Enumeration getInitParameterNames();

        作用:获取servlet在web.xml中的所有配置参数,返回枚举对象。

4.编写Servlet程序的相关抽象类

    (1)GenericServlet抽象类

        GenericServlet使编写Servlet变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需重写抽象 service方法即可。

    (2)HttpServlet类

        HttpServlet是继承GenericServlet的基础上进一步的扩展。

        提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类。

    (3)HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法 之一:

        doGet(),如果 servlet 支持 HTTP GET 请求

        doPost(),用于 HTTP POST 请求

        doPut(),用于 HTTP PUT 请求

        doDelete(),用于 HTTP DELETE 请求

    (4)JavaEE通用的规范:get提交/post提交方式,都可以获取前台页面中的 参数数据,只是提交方式不同,处理请求的操作相同。

5.自定义Servlet的过程

    (1)自定义一个类继承自HttpServlet。

    (2)覆盖业务方法中具体的某个doGet()/doPost()分别代表了get提交 /post提交(常用的)。

    (3)配置自定义的servlet

        1)方式一:在web工程核心配置文件web.xml中配置。

        2)方式二:只需在对应的servlet类上添加@WebServlet注解。

    (4)在web工程核心配置文件web.xml中配置自定义的servlet。

        1)Servlet的基本配置信息           

        

            
           
             自定义类名

            

            包名.自定义类名

        

        2)servlet映射配置信息(uri)

        

            

            自定义类名

            

            /first

        

        3)注意:

            url-pattern配置的内容就是浏览器地址栏输入的URL中项目名称后的资源名称。

            配置的映射路径(url-pattern)不能重名。

        4)uri中的资源路径配置方式

            精确匹配:/名称,只有资源路径是具体的名称时才会触发 Servlet。

            后缀匹配:*.xxx,只要是以xxx结尾的就匹配触发Servlet。

            通配符匹配:/*,匹配所有请求,包含服务器的所有资源。

            通配符匹配 /,匹配所有请求,包含服务器的所有资源,不包括.jsp。

        5)load-on-startup

            ①元素标记容器是否应该在web应用程序启动的时候就加载这个 servlet。

            ②它的值必须是一个整数,表示servlet被加载的先后顺序。

            ③如果该元素的值为负数或者没有设置,则容器会当Servlet被请 求时再加载。

            ④如果值为正整数或者0时,表示容器在应用启动时就加载并初始 化这个servlet。

            ⑤值越小,servlet的优先级越高,就越先被加载。值相同时,容 器就会自己选择顺序来加载。

    (5)注解配置(@WebServlet)

        1)案例:@WebServlet(“/servlet作为资源被访问的路径”)

        2)作用:用于将一个类声明为servlet
                    该注解在部署时会被容器处理,容器将根据具体的属性配置将相应 的类部署为servlet
        3)属性:下面是一些常用属性,value和url一般是必须的,但是二者 不能共存,若同时指定,一般自动忽略value。

属性名

类名

属性描述

name

String

指定servlet的name属性,等价于,若没有指定,则默认是类的全限定名

value

String[]

等价于urlPatterns,两者不能共存

urlPatterns

String[]

指定一组servlet的url的匹配模式,等价于

loadOnStartup

int

指定servlet的加载顺序,等价于

initParams

WebinitParams[]

指定一组初始化参数,等价于

asyncSupported

boolean

申明servlet是否支持异步操作模式,等价于

displayName

String

servlet的显示名,等价于

description

String

servlet的描述信息,等价于

    (6)地址栏输入访问地址:http://localhost:8080/项目名/资源路径。

6.Servlet的生命周期

    (1)生命周期:Servlet对象的创建、servlet的初始化、服务方法(请求与 响应),销毁servlet对象。

    (2)对象的创建以及初始化都是执行一次:是一个单例的。

    (3)Servlet的子实现类对象默认在被访问的时候交由服务器完成创建的。

    (4)多次访问同一个servelet,只调用service()方法。这个方法是servlet 程序的入口。

    (5)继承HttpServlet类的自定义类,需要重写具体的对应请求方式的方 法:doGet()/doPost()等。

    (6)tomcat服务器终止或重启,都会引起servlet被销毁。

7.servlet的执行流程

    (1)地址栏: http://localhost:8080/项目名称/资源路径。

    (2)给tomcat服务器发送请求     

            请求行:GET(默认)/项目名/资源路径 HTTP/1.1 (反复请求)。

    (3)在web.xml文件中查找url-pattern(资源路径)。

    (4)通过url-pattern查询得到servlet的名字。

    (5)再通过这个名字得到serlvet的基本配置信息和 servlet-class(servlet的全限定名)。

    (6)如果Servlet自定义类的全限定名(包名.类名)存在,tomcat服务器就会通过反射技术创建该类对象。

        Class clazz=Class.forName(“类的全限定名”);

        Object obj=clazz.newInstance();

    (7)通过字节码文件对象获取对应的方法对象。

        Method m = clazz.getDeclaredMethod("doGet",

        HttpServletRequest.class,HttpServletResponse.class);

    (8)通过方法对象调用doGet方法。

        m.invoke(obj,request,response) ;

8.ServletContext

    (1)描述:Servlet的全局(上下文)对象。

    (2)获取全局对象的方法:

        public ServletContext getServletContext()

        具有该方法的类:

            GenericServlet提供了getServletContext()方法。

            HttpServletRequest提供了getServletContext()方法。

            HttpSession提供了getServletContext()方法。

    (3)方法:

        1)可以获取web工程的上下文路径(项目名)。

            public String getContextPath()

        2)给当前域对象中设置属性以及绑定的属性值。

            Public void setAttribute("属性名", 属性值);

        3)通过域对象中设置的属性名称获取绑定的内容。

            public Object getAttribute(String name);

        4)通过域对象中设置的属性名称删除属性。

            removeAttribute(name);

        5)获取当前项目在服务器发布的真实路径

            getRealPath("/")

    (4)作用

        1)可以获取web工程的上下文路径

            获取全局对象,然后通过该方法获取路径。

            public String getContextPath()

        2)可以作为域对象去使用,范围最大:代表web应用程序。

            获取全局对象,作为域对象,为其设置属性以及绑定的属性值。

                servletContext.setAttribute("name", "张三");

            获取全局对象,从ServletContext域对象中获取数据。

                public Object getAttribute(String name);

                String s = (String) context.getAttribute("name") ;

        3)请求转发


二、Servlet的功能

1.请求

    (1)请求:HttpServletRequest,获取浏览器发送请求的请求信息。

    (2)请求中的方法

        1)作用:根据表单组件名称获取提交的指定组件的数据。

            String getParameter(String name)

        2)给当前域对象中设置属性以及绑定的属性值。

            public void setAttribute("属性名", 属性值);

        3)通过域对象中设置的属性名称获取绑定的内容。

            public Object getAttribute(String name);

        4)通过域对象中设置的属性名称删除属性。

            removeAttribute(name);

        5)作用:指定每个请求的编码。

            void setCharacterEncoding(String charset)

        6)获取请求信息中的请求行信息

            请求行:请求提交方式  uri  http协议版本

            获取请求的提交方式:public String getMethod()

            获取uri:public String getRequestURI()

            获取url:public Stringget RequestURL()

            获取Http协议版本:public String getProtocol()

2.请求转发

    (1)问题:调用业务逻辑和显示结果页面都在同一个Servlet里,就会产生 设计问题,应该将业务逻辑和显示结果分离开。

         不符合单一职能原则、各司其职的思想。

        不利于后续的维护。

    (2)引入:业务逻辑和显示结果分离,业务逻辑得到的数据结果需要传递给显 示结果的servlet。可以通过转发请求来实现。

    (3)转发请求:转发的作用在服务器端,将请求发送给服务器上的其他资源, 以共同完成一次请求的处理。

    (4)实现方式:

        1)方式一:通过ServletContext

            获取域对象(servletContext)对象

                ServletContext servletContext = this.getServletContext() ;

            获取请求转发(分发)对象

                public RequestDispatcher getRequestDispatcher(String path)

                RequestDispatcher rd = servletContext.getRequestDispatcher("/adv.html");

            从业务逻辑servlet中将请求转发到该工程其他资源路径。

                rd.forward(request, response);

        2)方式二:域对象为HttpServletRequest的对象

            设置域对象的属性和属性值

                 request.setAttribute("name","lisi");

            转发请求

                request.getRequestDispatcher("/hello.jsp").forward(request, response);

    (5)数据传递

        1)forward()表示在一次请求中,在服务器内部跳转,可以共享同一次 request作用域中的数据。

        2)request作用域:拥有存储数据的空间,作用范围是一次请求有效, 一次请求可以经过多次转发。

        3)可以将数据存入request后,在一次请求过程中的任何位置进行获取。

        4)可传递任何数据(基本数据类型、对象、数组、集合等)。

        5)存数据:request.setAttribute(key,value);

            以键值对形式存储在request作用域中。key为String类型,value 为Object类型。

        6)取数据:request.getAttribute(key);

            通过String类型的key访问Object类型的value。

    (6)转发特点

        转发是服务器行为;

        转发时浏览器只做了一次访问请求;

        转发时浏览器地址不变;

        转发时两次跳转之间传输的信息不会丢失,所以可以通过request进行 数据的传递;

        转发只能将请求转发给同一个Web应用中的组件,可以转发到任何资源, 包括WEB-INF下的资源。

3.响应

    (1)响应:HttpServletResponse,向浏览器端发送响应消息。

    (2)方法:

        setHeader(name,value)

        作用:设置响应头与值。

        public void setStatus(int sc);

        作用:设置状态码

        setContentType(String)

        作用:设置响应文件类型、响应式的编码格式。

        setCharacterEncoding(String charset)

        作用:设置服务端响应内容编码格式。

        getWriter()

        作用:获取字符输出流。

        public void sendRedirect(String location) throws IOException;

        作用:指定重定向位置URL将临时重定向响应发送到客户端,页面跳转。

    (3)设置Content-Type响应头:text/html;charset=utf-8

        等价于:response.setHeander("Content-Type","text/html;charset=utf-8") ;

    (4)设置refresh响应头:定时刷新/定时跳转页面

        2秒后定时刷新这个后台地址

        response.setHeader("refresh", "2");

        3秒后跳转到指定页面

        response.setHeader("refresh", "3;/adv.html");

    (5)请求与响应内容的中文乱码问题:

        1)原因:编辑器环境的编码格式是GBK,获取或输出内容时浏览器的编码 格式是UTF-8,格式不同。

        2)解决:

            设置请求时的编码格式:request.setCharacterEncoding("utf-8");

            设置响应时的编码格式:response.setContentType("text/html;charset=utf-8");

4.重定向

    (1)重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客 户端一个新的请求地址,客户端重新发送新请求。

    (2)实现方式1:设置location响应头+状态码

        响应码(状态码):

            200:成功

            404:访问的资源不存在

            500:服务器代码有问题

            304:读缓存

            302:重定向原理:

        设置响应头:location

            重定向到同项目下的资源:response.setHeader("location", "/项目名/资源路径");

            重定向到其他项目下的资源:response.setHeader("location", "http://localhost:8080/Servlet_01/form.html");

        设置状态码:进一步请求

            response.setStatus(302);

    (3)简写方式:HttpServletResponse的sendRedirect方法

        response.sendRedirect(request.getContextPath()+"/adv.html" )

    (4)数据传递

        sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求。

        response没有作用域,两次request请求中的数据无法共享

        传递数据:通过URI的拼接进行数据传递("uri?username=tom");

        获取数据:request.getParameter("username");

    (5)重定向特点

        重定向是客户端行为。

        重定向是浏览器做了至少两次的访问请求。

        重定向浏览器地址改变。

        重定向两次跳转之间传输的信息会丢失(request范围)。

        重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个 站点上的其他应用程序中的资源、其他站点的资源。

5.请求转发和重定向的区别

    请求转发:(服务器行为)HttpServletRequest作为域对象

        (1)地址栏没有变化http://localhost:8080/webxx/demo1

       (2)请求转发的整个过程:中间的请求对象是一致的。

       (3)请求转发只能在本工程下的页面跳转,可以访问WEB-INF下的资 源文件(保证安全性)。

       (4)转发用在有业务数据需要传递的时候。

    重定向:(浏览器行为:写地址:绝对地址:request.getContextPath())

        (1)地址栏发生明显变化。

            http://localhost:8080/webxx/demo1

            http://locahost:8080/webxx/xx.jsp/xx.html

        (2)重定向的整个过程:中间的两次request对象不一样,所以不能使用request对象传递数据。

        (3)重定向:既能访问本工程下面的资源文件,也可以访问外部资源文件。

        (4)重定向用在没有业务数据需要传递的时候,仅仅是一个页面跳转。

6.Cookie

    (1)客户端状态管理技术(会话技术):代表性的是Cookie技术,存储在浏览器端。

    (2)描述:Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中,附带传送给浏览器的一小段数据。

    (3)举例:

        生活中的会话:张三跟李四打招呼,李四回复张三...

        程序中的会话:浏览器和服务器交互产生的一些数据(内容)。

    (4)相关方法:

        1)Cookie中的方法:

            创建Cookie对象:public Cookie(String name, String value)

            设置Cookie的最大存活时间(单位为秒):public void setMaxAge(int expiry)

            默认的cookie存活(会话结束)时间:就是浏览器关闭的时候。

            设置Cookie的有效路径:一般默认就是上下文路径(web工程名称)。

                public void setPath(String uri)

            获取当前cookie的名称:public String getName()

            获取当前cookie的内容:public String getValue()

        2)请求响应中的方法

            将cookie添加响应信息中,相当于设置了一个响应头。一次发送多 个cookie数据,即向响应对象中添加多个cookie对象。

                public void addCookie(Cookie cookie)

            获取当前浏览器请求的所有的cookie信息(cookie数组)。

                public Cookie[] getCookies()

    (5)Cookie默认不支持中文,只能包含ASCII字符,对Cookie的内容进行加 密、解密。

        解密:URLDecoder工具类

            value = URLDecoder.decode(value, "utf-8");

        加密:URLEocoder工具类

            date_str = URLEncoder.encode(date_str, "utf-8");

    (6)Cookie优点和缺点

        1)优点

            可配置到期时间(存活时间)。

            简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。

            数据持久性:Cookie默认在过期之前,是可以一直存在客户端浏览 器上的。

        2)缺点

            cookie存储的内容都只能是String类型:存储中文、特殊符号(空格),需要进行加密/解密。

            大小限制:大多数浏览器对Cookie的大小有 4K、8K字节的限制,。

            cookie存储的数据量有限制:一个站点只能有20-30个左右的 cookie。

            用户可配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie的能力,因此限制了这一功能。

            潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险,或者导致依赖于Cookie的应用程序出现问题。

    (6)Cookie的使用过程:

        1)当前第一次请求服务器:第一次浏览器端没有cookie数据。

            http://localhost:8080/Cookie_Session_Jsp/CookieDemo1

        2)服务器端:通过反射的方式

            创建当前url-pattern=CookieDemo1的Servlet对象,调用doGet方 法。

            解析:方法体的内容,在内存创建Cookie对象。

                Cookie c = new Cookie(String name,String value)

        3)将当前Cookie对象添加到响应信息中。

            response.addCookie(c) ;

            相当于:设置一个响应头,将cookie响应到浏览器端存储起来。

                response.setHeader("Set-Cookie","msg=hello") ;

                Set-Cookie: msg=hello

        4)当前浏览器第二次请求服务器的时候:浏览器向服务器发送请求,就会 将上一次响应的cookie数据,发送到服务器。

            http://localhost:8080/Cookie_Session_Jsp/CookieDemo1

            将上面的存储的cookie的名称和内容添自动添加到请求头中

                Cookie: msg=hello

        5)浏览器发送请求到服务器端,后台通过请求对象获取所有的cookie的 数据,匹配cookie数据,有符合需求的cookie就进行操作。

            Cookie[] cookies=request.getCookie();

    (7)注意:只需要保证Cookie的名和路径一致即可修改。

        如果改变cookie的name和有效路径会新建cookie。

        而改变cookie值、有效期会覆盖原有cookie。

7.Cookie的使用案例

    (1)需求:使用Cookie记住用户上一次访问的系统时间

    分析:

        (1)设置响应的编码格式:

        (2)创建日期对象Date对象,使用SimpleDateFormat对象,对Date对象 进行解码,得到String日期文本。

        (3)先获取当前请求对象中的所有cookie数据

            Cookie[] cookies=request.getCookies();

        (4)如果Cookie数组中不为null,并且当前cookie数组的长度>0 ,说明 存在cookie数据。

            1)判断:cookie数组中,是否有cookie的名称为指定的名称 "lastTime"。

            2)如果存在,使用URLEncoder工具类,将当前String日期文本 格式加密。

            3)通过Cookie的setValue(String value)方法设置value。

            4)设置cookie有效期:一个月

            5)将cookie响应到浏览器端

            提示:用户上一次访问的系统时间是:value

        (5)如果当前Cookie数组为null或者长度=0,说明是第一次访问。

            1)使用URLEncoder工具类,将当前String日期文本格式加密。

            2)创建Cookie名称为"lastTime",value为加密后的日期文本的 对象。

            3)设置cookie存活时间: 一个月

            4)将cookie响应到浏览器端:response.addCookie(Cookie对象)

8.Session

    (1)服务器状态管理技术:将状态保存在服务器端,代表性的是session技术, 服务器响应sessionID(JSESSIONID)时需要使用Cookie的方式。

    (2)概述:Session用于记录用户会话的状态。会话指的是在一段时间内,单 个客户端与Web服务器的交互过程。

    (3)在一个Session中,客户可能会多次请求访问同一个资源,也有可能请 求访问各种不同的服务器资源。

    (4)Session原理

        1)服务器会为每一次会话分配一个Session对象。

        2)同一个浏览器向同一个服务器发起的多次请求,同属于一次会话 (Session)。

        3)首次使用到Session时,服务器会自动创建Session,并创建Cookie 存储SessionId发送回客户端。

        4)注意:session是由服务端创建的。

    (5)Session使用

        1)Session作用域:拥有存储数据的空间,作用范围是一次会话有效,

        2)一次会话:是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结 束会话。

        3)可以将数据存入Session中,在一次会话的任意位置进行获取。

        4)可传递任何数据:基本数据类型、对象、集合、数组。

    (6)方法:

        1)获取HttpSession对象

            public HttpSession getSession()

            如果没有session对象,会创建session对象。

            public HttpSession getSession(boolean create)

            如果参数为true:创建创建一个新的会话。

            如果false:说明当前请求过程的会话对象存在,不创建。

        2)给Session对象设置属性以及绑定参数值。

            public void setAttribute(String name, Object value)

        3)获取当前会话对象的指定属性中绑定的数据。

            public Object getAttribute(String name)

        4)设置session最大的有效时间,如果为负整数/0:永远不会超时。

            public void setMaxInactiveInterval(int interval):单位秒

        5)从session中删除指定的属性及数据。

            public void removeAttribute(String name);

        6)手动删除session

            public void invalidate():  

        7)获取当前session的唯一标识符(id)

            public String getId();

    (7)Session的存活时间:

        1)sesison对象在内存默认的时间:30分钟

            tomcat的安装目录中的web.xml文件

            配置 :defaulServlet,session过期时间

        

            30

        

        2)一次会话,浏览器关闭/tomcat正常关闭,则Session也销毁。

        3)手动删除session

        4)到达设置的超时时间(有效时间)

9.Cookie和Session进行对比

    (1)Cookie特点

        1)存储在浏览器端

        2)存储的内容都只能是String类型:存储中文、特殊符号(空格),必须进行加密和解密。

        3)cookie存储的数据量有限制:一个站点:20-30cookie左右

        4)cookie相对:不太安全。

    (2)Session:

        1)存储在服务器端

        2)存储的内容可以是任意类型的数据,因为它是一个域对象,可以进行数 据共享。

            setAttribute(String name,Object obj)

        3)Session存储的数据大小没有限制。

        4)相对于cookie,session更安全。

        5)Session依赖于Cookie存在:Cookie的名称(session的标识):JSESSIONID

10.Filter过滤器

    (1)概念:过滤器(Filter)是处于客户端与服务器目标资源之间的一道过 滤技术,执行地位在Servlet之前。

        客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter。

    (2)过滤器作用

        执行一些通用的操作,可以解决多个Servlet共性代码的冗余问题。

        例如:乱码处理、登录验证。

    (3)过滤器配置

        1)注解配置

            在自定义的Filter类上使用注解@WebFilter(value=“/过滤的目标资源路径”)。

        2)web.xml配置,与servlet相似

    

     

        sf

        

        com.Test.web.filter.SecondFilter

    

    

    

        

        sf

        

        /*

         

    (4)过滤器的过滤路径通常有三种形式:

        1)精确过滤匹配:具体的路径,只有请求的jsp页面是过滤器中匹配的 具体页面,或具体的servlet的时候,过滤器才会被执行。比如/index.jsp ,/myservlet1 。

        2)后缀过滤匹配,指定后缀名的方式: 只有当请求后缀名为指定后缀的 时候,过滤器才会被执行。比如*.jsp、*.html、*.jpg 。

        3)通配符过滤匹配/*:表示拦截所有请求。注意过滤器不能使用/匹配。

        4)目录匹配:/xxx/xxx/*,拦截指定目录下的所有资源请求。 例如:/aaa/bbb/*

    (5)生命周期:与servlet相似

        在启动服务器时就被创建和初始化了,只执行一次。

        当有符合拦截的请求,执行doFilter()方法进行过滤,可以执行多次。

        当服务器关闭或重启时被销毁,只执行一次。

    (6)过滤器的执行流程

        1)浏览器端在访问目标资源之前,被filter拦截。

        2)服务器根据web.xml/注解中的url-pattern,找到对应的过滤器全限 定名。

        3)服务器通过反射获取其成员方法对象,进行操作。

        4)当完成过滤操作后,就可以访问目标资源了。

        5)当服务器向浏览器发送响应时,会根据过滤器执行流程再次反向执行 Filter。

    (7)Filter过滤类型(时机):

        @WebFilter里面的属性

            DispatcherType[] dispatcherTypes()  

           返回值DispatcherType 是枚举类型

    public enum DispatcherType {

        REQUEST:默认,在请求的时候,执行过滤器。

        FORWARD:转发,请求转发进行页面跳转的时候,执行过滤器。

        INCLUDE:包含,某个页面被包含的时候,执行过滤器。

        ASYNC:异步,非同步请求的时候,执行过滤器。

        ERROR:错误,错误页面跳转,执行过滤器。

    }

        注:通过请求转发过来的页面,过滤器才被执行。

            过滤类型可以添加多个,符合其中一个就执行。

    (7)过滤器链

        在一个Web应用中,可以编写多个Filter,这些Filter组合起来称之为一个Filter链。

        每个过滤器实现一个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象 传递给该方法。

        在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有filter。

        如果有,则调用第2个filter,如果没有,则调用目标资源。

    (8)过滤器优先级

        如果为注解配置方式,是按照类全名称的字符串顺序决定作用顺序。

        如果是web.xml配置方式,按照 filter-mapping注册顺序,从上往下。

        web.xml配置高于注解方式。

        如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次。

11.四个域对象的范围从小大到

    PageContext:page域,在当前jsp页面中有效。

    HttpServletRequest:request域,在一次请求中有效

    HttpSession:session域,在一次会话(客户端--服务器端)中有效

    ServletContext:全局对象,整个web工程 (web application)。


三、java注解与HTTP协议

1.Java注解(Annotation)

    (1)注解:又称Java标注,是JDK5.0引入的一种注释机制。

    (2)可以标注的类型:Java语言中的类、方法、变量、参数和包等都可以被 标注。

    (3)注解的生存范围:和Javadoc(自定义类型的类等生成API文档)不同, Java标注可以通过反射获取标注内容。

        在编译器生成类文件时,标注可以被嵌入到字节码中。

        Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。

        当然它也支持自定义Java标注。

    (4)常用注解:

        1)作用在代码的注解

            @Override:检查该方法是否是重写方法。如果发现其父类,或者是 引用的接口中并没有该方法时,会报编译错误。

            @Deprecated:标记过时方法。如果使用该方法,会报编译警告。

            @SuppressWarnings:指示编译器去忽略注解中声明的警告。

        2)作用在其他注解的注解(元注解):

            @Retention:标识这个注解怎么保存,是只在代码中,还是编入class 文件中,或者是在运行时可以通过反射访问。

            @Documented:标记这些注解是否包含在用户文档中。

            @Target:标记这个注解的可标记类型。

            @Inherited:标记这个注解是继承于哪个注解类(默认注解并没有 继承于任何子类)

        3)从Java7开始,额外添加了3个注解:

            @SafeVarargs:Java7开始支持,忽略任何使用参数为泛型变量的方 法或构造函数调用产生的警告。

            @FunctionalInterface:Java8开始支持,标识一个匿名函数或函数 式接口。

            @Repeatable:Java8开始支持,标识某注解可以在同一个声明上使用 多次。

    (5)Annotation中常用的类/接口

        1)Annotation就是个接口

            "每1个Annotation"(注解)都必有"1个RetentionPolicy"(作用 域),以及"1~n个ElementType"(可修饰的类型)。

            可以通俗的理解为:每1个Annotation对象,都会有唯一的 RetentionPolicy属性;至于ElementType属性,则有1~n个。

        2)ElementType是Enum枚举类型,它用来指定Annotation的类型。

            "每1个Annotation"都必有"1~n个ElementType"(类型)。当 Annotation与某个ElementType关联时,就意味着:Annotation有 了某种用途。

            例如,若一个Annotation对象是METHOD类型,则该 Annotation只能用来修饰方法。

        3)RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗的说,就是不同 RetentionPolicy 类型的Annotation 的作用域不同。

    (6)三者的取值和定义

        1)RetentionPolicy的取值:

            SOURCE:Annotation信息仅存在于编译器处理期间,编译器处理完 之后就没有该Annotation信息了。

            CLASS:编译器将Annotation存储于类对应的.class文件中。默认 行为。

            RUNTIME:编译器将Annotation存储于class文件中,并且可由JVM 读入。

        2)ElementType的取值:

    public enum ElementType{

        TYPE:类、接口(包括注释类型)或枚举声明

        FIELD:字段声明(包括枚举常量)

        METHOD:方法声明

        PARAMETER:参数声明

        CONSTRUCTOR:构造方法声明

        LOCAL_VARIABLE:局部变量声明

        ANNOTATION_TYPE:注释类型声明

        PACKAGE:包声明
    }

        3)自定义Annotattion的方式

    @Documented

    @Target(ElementType.TYPE)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface MyAnnotation1 {
        
        //属性        

        String name();
        
        String value();

    }

            如果自定义注解中有value属性,可以直接赋值,不需要在注解中书 写属性名称。

6.HTTP协议

    (1)描述:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状 态的、应用层的协议,运行于TCP协议基础之上。

    (2)HTTP协议特点

        1)支持客户端(浏览器)/服务器模式。

        2)简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应 数据,因而通信速度很快。常用的请求方法有GET、POST等。

        3)灵活:HTTP允许传输任意类型的数据,传输的数据类型由 Content-Type标识。

        4)无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器 处理完客户的请求后,即断开连接。采用这种方式可以节省传输时 间。

        5)HTTP版本:

            HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。

            HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之 内有新的请求,那么还是通过之前的连接通道来收发消息,如果 过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连 接。

        6)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有 记忆能力。

    (3)HTTP协议通信流程

        客户与服务器建立连接(三次握手)。

        客户向服务器发送请求。

        服务器接受请求,并根据请求返回相应的文件作为应答。

        客户与服务器关闭连接(四次挥手)

    (4)请求报文和响应报文

        1)HTTP请求报文

            当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块, 也就是请求信息(请求报文),HTTP请求信息由4部分组成:

            1、请求行:请求方法/地址(URI) 协议/版本

            2、请求头(Request Header)

            3、空行

            4、请求正文

        2)HTTP响应报文

            HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成:

            1、状态行

            2、响应头(Response Header)

            3、空行

            4、响应正文

    (5)常见状态码

        200:OK,客户端请求成功

        302:Found,临时重定向

        403:Forbidden,服务器收到请求,但是拒绝提供服务。服务器通常会 在响应正文中给出不提供服务的原因。

        404:Not Found,请求的资源不存在,例如,输入了错误的URL。

        500:Internal Server Error,服务器发生不可预期的错误,导致无法完成客户端的请求。

你可能感兴趣的:(学习总结,java,web)