Lazy loaded image
学习思考
Lazy loaded imageJavaEE——域对象
字数 9755阅读时长 25 分钟
2025-3-8
2025-3-22
type
status
date
slug
summary
tags
category
icon
password

Request

简介

当Web容器收到客户端的发送过来Http请求,会针对每一次请求,分别创建一个用于代表此次请求的HttpServletRequest对象(request)、和代表响应的HTTPServletResponse对象(response);request负责获取客户机提交过来的数据,response负责向客户机输出数据。

HttpServletRequest请求

  • getRequestURL方法返回客户端发出请求时的完整URL
  • getRequestURI方法返回请求行中的资源名部分
  • getQueryString方法返回请求行中的参数部分(参数名+值)
  • getRemoteAddr方法返回发出请求的客户机的IP地址
  • getRemoteHost方法返回发出请求的客户机的完整主机名
  • getRemotePort方法返回发出请求的客户机所使用的网络端口号
  • getLocalPort方法返回web服务器所使用的网络端口号
  • getLocalAddr方法返回web服务器的IP地址
  • getLocalName方法返回web服务器的主机名

方法

获取参数

获取请求头和请求数据

JSP文件

Servlet文件

解决中文乱码问题

请求转发

请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理(浏览器地址栏不变)。

用 include 方法实现页面包含

servlet文件:
jsp文件:
  • head.jsp
    • foot.jsp

      防盗链

      Response

      简介

      当Web容器收到客户端的发送过来Http请求,会针对每一次请求,分别创建一个用于代表此次请求的HttpServletRequest对象(request)、和代表响应的HTTPServletResponse对象(response);request负责获取客户机提交过来的数据,response负责向客户机输出数据。

      HttpServletResponse回复

      • addHeader(String name,String value)将指定的名字和值加入到响应的头信息中
      • encodeURL(String url)编码指定的url
      • sendError(int sc)使用指定状态码发送一个错误到客户端
      • setDateHeader(String name,long date)将给出的名字和日期设置响应的头部
      • setHeader(String name,String value)将给出的名字和值设置响应的头部eg:response.setHeader(“Refresh”,”2;url=”http://www.baidu.com”);页面的刷新
      • setStatus(int sc)给当前响应设置状态码
      • getOutputStream()字节输出流对象
      • getWriter()字符的输出流对象
      • sendRedirect()对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个url的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程
      • setContentType(String ContentType)设置响应的MIME类型,页面的设置文本类型,获取或设置输出流的HTTP MIME类型
      • setCharacterEncoding(String charset)告知服务器用什么方式编码解析

      用途

      1. 向客户端写入cookie
      1. 重写URL
      1. 获取输出流对象,向客户端写入文本或者二进制数据
      1. 设置响应客户端浏览器的字符编码类型
      1. 设置客户端浏览器的MIME类型。

      输出数据及解决中文乱码

      write流写入数据

      文件下载

      向浏览器写验证码

      控制浏览器定时刷新页面

      请求重定向

      一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向(浏览器地址栏改变)。

      Servlet

      简介

      Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。

      架构

      任务

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

      创建

      1. 实现Servlet接口;因为是实现Servlet接口,所以需要实现接口里的方法,下面说明了Servlet的执行过程,也就是Servlet的生命周期
        1. 继承GenericServlet类,它实现了Servlet接口除了service的方法,不过这种方法极少用
          1. 继承HttpServlet方法

            生命周期

            Servlet生命周期可被定义为从创建直到毁灭的整个过程,以下是Servlet遵循的过程:
            1. Servlet通过调用init()方法进行初始化
            1. Servlet调用service()方法来处理客户端的请求
            1. Servlet通过调用destroy()方法终止(结束)
            1. 最后,Servlet由JVM的垃圾回收器进行垃圾回收

            init()方法

            init方法被设计成只调用一次,它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。,因此,它是用于一次性初始化;Servlet创建于用户第一次调用对应于该Servlet的URL时,但是也可以指定Servlet在服务器第一次启动时被加载;当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet或doPost方法;init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

            service()方法

            service()方法是执行实际任务的主要方法。
            Servlet容器(即Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端;每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务,service()方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet、doPost、doPut,doDelete等方法;所以,不用对service()方法做任何动作,只需要根据来自客户端的请求类型来重写doGet()或doPost()即可。

            doGet()方法

            GET请求来自于一个URL的正常请求,或者来自于一个未指定METHOD的HTML表单,它由doGet()方法处理。

            doPost()方法

            POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理。

            destroy()方法

            destroy()方法只会被调用一次,在Servlet生命周期结束时被调用;destroy()方法可以让Servlet关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动;在调用destroy()方法之后,servlet对象被标记为垃圾回收。
            下面显示了一个典型的Servlet生命周期方案。
            • 第一个到达服务器的HTTP请求被委派到Servlet容器
            • Servlet容器在调用service()方法之前加载Servlet
            • 然后Servlet容器处理由多个线程产生的多个请求,每个线程执行一个单一的Servlet实例的service()方法

            用途

            解析web.xml文件

            Cookie

            简介

            Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie);Cookie名称和值可以由服务器端开发自己定义,对于jsp而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
            Cookie是客户端技术。

            详解

            会话:用户从打开一个浏览器浏览各种网页到关闭浏览器的一个过程就叫一个会话。
            Cookie是服务器写给浏览器的一个信息,由浏览器来保存,可以再次带给服务器。
            Cookie类是javax.servlet.http.Cookie。
            Cookie的属性:
            • name:必须的
            • value:必须的
            • comment:可选的。注释
            • path:可选的,如果不设置路径,那么只有设置该cookie的URI及其子路径可以访问;写Cookie的程序的访问路径是http://localhost:8080/JavaWeb/servlet/CookieDemo;其中localhost就是域名;/JavaWeb/servlet就是当前Cookie的path
              • 若访问的地址的URI包含着cookie的路径,即URI.startWith(cookie的路径),为true,则客户端将该cookie带给服务器,比如浏览器存的cookie的路径是/JavaWeb
              • 现在访问的地址是http://localhost:8080/JavaWeb/servlet/CookieDemo则带该cookie
              • 现在访问的地址是http://localhost:8080/JavaWeb/CookieDemo则带该cookie,若浏览器存的cookie的路径是/JavaWeb/servlet/
              • 访问的地址是http://localhost:8080/JavaWeb/servlet/CookieDemo则带该cookie
              • 访问的地址是http://localhost:8080/JavaWeb/CookieDemo则不带该cookie
              • 如果一个cookie的路径设置成了/JavaWeb,意味着浏览器访问当前应用下的所有资源时都会带着该cookie给服务器。
            • domain:可选的,该Cookie所属的网站域,默认值是apache.org
            • maximum age:可选的,不设置就是会话过程(存在浏览器的内存中),单位是秒;如果是0,说明要删除
            • version:可选的

            特点

            一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB(稀缺);但只是规定,不同的浏览器实现的不同。
            通过domain+path+name来区分Cookie:
            1. cookie是有大小限制的,大多数浏览器支持最大为4096字节的Cookie(具体会有所差异,可以使用这个好用的工具进行测试);如果cookie字符串的长度超过最大限制,则该属性将返回空字符串
            1. 由于cookie最终都是以文件形式存放在客户端计算机中,所以查看和修改cookie都是很方便的,这就是为什么常说cookie不能存放重要信息的原因
            1. 每个cookie的格式都是这样的:cookieName = Vaue;名称和值都必须是合法的标示符
            1. cookie是存在有效期的;在默认情况下,一个cookie的生命周期就是在浏览器关闭的时候结束;如果想要cookie能在浏览器关掉之后还可以使用,就必须要为该cookie设置有效期,也就是cookie的失效日期
            1. alert(typeof document.cookie)结果是string
            1. cookie有域和路径这个概念;域就是domain的概念,因为浏览器是个注意安全的环境,所以不同的域之间是不能互相访问cookie的(当然可以通过特殊设置的达到cookie跨域访问);路径就是routing的概念,一个网页所创建的cookie只能被与这个网页在同一目录或子目录下得所有网页访问,而不能被其他目录下得网页访问
            1. 创建cookie的方式和定义变量的方式有些相似,都需要使用cookie名称和cookie值。同个网站可以创建多个cookie,而多个cookie可以存放在同一个cookie文件中
            1. cookie存在两种类型:
              1. 浏览的当前网站本身设置的cookie
              2. 来自在网页上嵌入广告或图片等其他域来源的第三方cookie(网站可通过使用这些cookie跟踪你的使用信息)
            1. cookie有两种清除方式:
              1. 通过浏览器工具清除cookie(有第三方的工具,浏览器自身也有这种功能)
              2. 通过设置cookie的有效期来清除cookie.
              3. 注意:删除cookie有时可能导致某些网页无法正常运行。
            1. 浏览器可以通过设置来接受和拒绝访问cookie,出于功能和性能的原因考虑,建议尽量降低cookie的使用数量,并且要尽量使用小cookie

            方法

            方法
            描述
            public void setDomain(String pattern)
            该方法设置cookie适用的域,例如w3cschool.cc
            public String getDomain()
            该方法获取cookie适用的域,例如w3cschool.cc
            public void setMaxAge(int expiry)
            该方法设置cookie过期的时间(以秒为单位),如果不这样设置,cookie只会在当前session会话中持续有效
            public int getMaxAge()
            该方法返回cookie的最大生存周期(以秒为单位),默认情况下,-1表示cookie将持续下去,直到浏览器关闭
            public String getName()
            该方法返回cookie的名称,名称在创建后不能改变
            public void setValue(String newValue)
            该方法设置与cookie关联的值
            public String getValue()
            该方法获取与cookie关联的值
            public void setPath(String uri)
            该方法设置cookie适用的路径,如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有URL都会返回cookie
            public String getPath()
            该方法获取cookie适用的路径
            public void setSecure(boolean flag)
            该方法设置布尔值,表示cookie是否应该只在加密的(即SSL)连接上发送
            public void setComment(String purpose)
            该方法规定了描述cookie目的的注释,该注释在浏览器向用户呈现cookie时非常有用
            public String getComment()
            该方法返回了描述cookie目的的注释,如果cookie没有注释则返回null

            向客户端发送Cookie

            获取客户端Cookie

            获取到的是一个cookie数组,所以要遍历这个数组来找到自己想要的一部分,它也有可能是null。

            删除修改Cookie

            Cookie类并没有提供修改、删除操作。
            如果要修改某个Cookie,只需创建一个同名的Cookie,并添加到response中覆盖原来的Cookie。
            如果要删除某个Cookie,只需创建一个同名的Cookie,并将maxAge设为0,添加到response中覆盖原来的Cookie即可。
            修改、删除Cookie时,新建的Cookie除value和maxAge之外的所有属性,如name、path、domain等都要和原来的Cookie一样,否则,浏览器将视为2个不同的Cookie,不予覆盖,导致修改、删除失败。

            保存中文

            Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。
            1. Cookie向客户端响应中添加中文
              1. Cookie客户端请求中获取中文

                Session

                简介

                在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下),因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
                Session属于服务器技术。服务器为每个用户创建一个其独享的HttpSession对象,当不同的浏览器访问服务器时会将这些数据放在用户各自的HttpSession上。

                原理

                当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session id。
                如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
                保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;一般这个cookie的名字都是类似于SEEESIONID,比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。
                由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764。
                这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来,为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

                方法

                方法
                说明
                String getId()
                返回一个包含分配给该session会话的唯一标识符的字符串
                Object getAttribute(String name)
                返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null
                Enumeration getAttributeNames()
                返回String对象的Enumeration,String对象包含所有绑定到该session会话的对象的名称
                void removeAttribute(String name)
                从该session会话移除指定名称的对象
                void setAttribute(String name, Object value)
                使用指定的名称绑定一个对象到该session会话
                long getCreationTime()
                返回该session会话被创建的时间,自格林尼治标准时间1970年1月1日午夜算起,以毫秒为单位
                long getLastAccessedTime()
                返回客户端最后一次发送与该session会话相关的请求的时间自格林尼治标准时间1970年1月1日午夜算起,以毫秒为单位
                int getMaxInactiveInterval()
                返回Servlet容器在客户端访问时保持session会话打开的最大时间间隔,以秒为单位
                void setMaxInactiveInterval(int interval)
                在Servlet容器指示该session会话无效之前,指定客户端请求之间的时间,以秒为单位
                void invalidate()
                指示该session会话无效,并解除绑定到它上面的任何对象
                boolean isNew()
                如果客户端还不知道该session会话,或者如果客户选择不参入该session会话,则该方法返回true

                生命周期

                session在用户第一次访问服务器的时候自动创建。
                需要注意只有访问JSP、Servlet等程序时才会创建session,只访问HTML、IMAGE等静态资源并不会创建session;如果尚未生成session,也可以使用request.getSession(true)强制生成session。
                session是服务器建立的,但服务器不会主动建立。当一个请求过来时,服务器并不会建立一个session,而是要这样:request.getSession();,当用程序通知服务器时它才会建立一个会话。
                在jsp文件中有一个默认的属性<%@ page session=“true” %>,翻译成java后就是session = pageContext.getSession();;所以当访问一个jsp文件时,如果没有去更改这个默认值,那也会建立一个会话,这也是大多数人会认为自动创建session的原因了,其实还是相当于主动通知服务器去创建。
                综上所述:Tomcat这类服务器不会自动的创建session,只有当主动通知它时,才会创建会话。
                session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并维护该session;用户每访问服务器一次,无论是否读写session,服务器都认为该用户的session活跃(active)了一次。
                要判断一个session里面是否存在自己想要的东西(这个session是否有效),是不能用isNew()的,应该用如下类似代码:

                默认设置

                session中的属性的默认生命周期是30min,这个默认时间可以通过在Tomcat根目录\conf\web.xml文件中修改。

                人工设置

                使用

                得到session

                向session中添加属性

                session中得到某个属性

                session中删除某个属性

                url重写

                实例

                ServletContext、Request 、Session 与PageContext四大域对象

                作用域范围大小

                PageContext (page域) < Request < Session < ServletContext(application域)。

                详解

                ServletContext域

                • 生命周期:当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁
                • 作用范围:整个Web应用
                • 作用
                  • 在不同Servlet之间转发
                    • 方法执行结束,service就会返回到服务器,再有服务器去调用目标servlet,其中request会重新创建,并将之前的request的数据拷贝进去。
                  • 读取资源文件
                      1. 由于相对路径默认相对的是Java虚拟机启动的目录,所以直接写相对路径将会是相对于tomcat/bin目录,所以是拿不到资源的;如果写成绝对路径,当项目发布到其他环境时,绝对路径就错了。
                      1. 为了解决这个问题ServletContext提供了:
                        1. 当在非servlet下获取资源文件时,就没有ServletContext对象用了,此时只能用类加载器

                    Request域

                    • 生命周期:在service方法调用前由服务器创建,传入service方法,整个请求结束,request生命结束
                    • 作用范围:整个请求链(请求转发也存在)
                    • 作用:在整个请求链中共享数据,最常用到:在Servlet中处理好的数据交给Jsp显示,此时参数就可以放置在Request域中带过去

                    Session域

                    HttpSession在服务器中,为浏览器创建独一无二的内存空间,在其中保存会话相关的信息。
                    • 生命周期:在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回;当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session;如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁;如果调用session提供的invalidate(),可以立即销毁session。
                      • 注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作,同时如果服务器钝化的时间在session默认销毁时间之内,则活化后session还是存在的,否则session不存在;如果JavaBean数据在session钝化时,没有实现Serializable则当Session活化时,会消失。、
                    • 作用范围:一次会话

                    PageContext域

                    • 生命周期:当对jsp的请求时开始,当响应结束时销毁
                    • 作用范围:整个jsp页面,是四大作用域中最小的一个,即超过这个页面就不能够使用了(所以使用pageContext对象向其它页面传递参数是不可能的)
                    作用:
                    1. 获取其它八大隐式对象,可以认为是一个入口对象
                    1. 获取其所有域中的数据
                    pageContext操作所有域中属性的方法:
                    pageContext中代表域的常量:
                    findAttribute方法在四大域中搜寻属性,搜寻的顺序是page域、request域、session域、application域;从小域到大域开始搜索,如果搜索到就直接获取该值,如果所有域中都找不到,返回一个null(与el表达式不同,此处返回null,对网页是不友好的)。
                     
                    上一篇
                    JavaEE——XML与Properties
                    下一篇
                    JavaEE——JSP

                    评论
                    Loading...