web

来源:互联网 发布:朝鲜洲际导弹 知乎 编辑:程序博客网 时间:2024/05/29 17:22

一、web概述
   静态web资源:内容是静态的,不同的人在不同的时间来访问时都是相同的内容。HTML、CSS、JS
   动态web资源:内容是由程序生成的,不同的人在不同的时间访问的内容很可能是不同的。
   常见的动态web资源开发技术:
    ASP、PHP、JSP/Servlet
   C/S B/S之争
   云、移动互联网、html5、物联网

二、

1.tomcat的安装配置
    tomcat5要求jdk1.4以上
    tomcat6要求jdk1.5以上
    tomcat7要求jdk1.6以上
    JAVA_HOME环境变量: 指定tomcat启动时使用的jdk所在的位置
    Catalina_Home环境变量:指定tomcat在启动时启动哪个tomcat,一般不推荐配置
   
    修改tomcat/bin/server.xml 修改默认端口为80
2.tomcat的目录结构
 bin ---- 启动和关闭需要的bat文件所在的目录
 conf --- 配置目录
 lib ---  tomcat运行时需要的jar包所在的目录
 logs --- 日志文件所在的目录
 temp --- tomcat运行时产生的临时文件存放的目录,不需要我们管理
 webapps --- 开发中最常用的目录,web应用放置到此目录下浏览器可以直接访问
 work --- 工作目录,tomcat运行时产生的工作文件存放在这个目录中

3.虚拟主机/web应用
 虚拟主机:
  一个tomcat可以认为是一台真实主机.在一台真实主机中可以配置多个站点,这些站点在访问者看来访问他们就像在访问各自独立的主机一样,所以我们可以认为这些站点都运行在tomcat这台真实主机当中的各自的虚拟主机当中.一个网站就可以认为是一个虚拟主机
 web应用:
  一个虚拟主机中会有很多的web资源,但是web资源不能直接交给虚拟主机管理,需要按照一定方式组织成web应用虚拟主机才能使用.一般来说我们会按照功能将某一功能相关的所有的web资源组织成一个web应用后再交给虚拟主机.

  web应用目录结构: 如果目录结构不合法可能会出现各种奇葩的问题.
   news
   |
   |--静态资源和JSP文件都可以直接放置在web应用的目录下,直接放在web应用下的内容,浏览器可以直接访问到
   |
   |--WEB-INF -- 可以没有,但是最好有,如果有则一定要保证他的目录结构是完整的.放置在WEB-INF目录下的所有资源浏览器没有办法直接进行访问
    |--classes -- 动态web资源运行时的class文件要放在这个目录下
    |--lib -- 动态web资源运行时所依赖的jar包要放在这个目录下
    |--web.xml -- 整个web应用的配置文件,配置主页/Servlet的映射/过滤器监听器的配置都需要依赖这个文件进行

 配置虚拟主机:
  在conf/server.xml中<Engin>标签下配置<Host>标签就可以为tomcat增加一台虚拟主机了
  name -- 指定虚拟主机的名称,浏览器通过这个名称访问虚拟主机
  appBase -- 虚拟主机管理的目录,放置在这个目录下的web应用当前虚拟主机可以自动加载


  *由于浏览器访问地址时,需要将地址翻译成对应的ip才能找到服务器,这其中翻译的过程是由dns服务器来实现的.我们在做实验的时候没有办法去修改dns服务器,此时可以使用hosts文件模拟dns的功能,从而完成实验.
 
  *缺省虚拟主机:如果来访者是通过ip来访问,这个时候服务器无法辨别当前要访问的是哪台虚拟主机中的资源,此时访问缺省虚拟主机.缺省虚拟主机可以在server.xml中engin标签上通过defaultHost属性进行配置.


 为虚拟主机配置web应用:
  (1)在Server.xml的<Host>标签中,配置<Context>标签,就可以为该虚拟主机配置一个web应用了
   如果将path设置为空则这个web应用为缺省web应用
   这种配置方式需要重启服务器不推荐
  (2)在tomcat/conf/[Engin]/[Host]/在这个目录下写一个xml文件,其中xml文件的名字就是虚拟路径,在这个xml中可以配置<Context>标签,其中配置真实路径.
   如果所配置的虚拟路径中有/由于文件名中不允许包含/需要用#替代.
   只要将文件名设置为ROOT.xml则这个xml描述的web应用就成为了缺省web应用
   这种配置方式不需要重启服务器,推荐
  (3)直接将web应用放置到虚拟主机管理的目录下,虚拟主机就可以找到这个web应用,从而管理这个web应用
   只要将web应用文件夹的名称改为ROOT,这个web应用就是缺省web应用
   

  *web应用的虚拟路径映射 -- 就是为web应用的真实存在的路径配置一个浏览器访问的虚拟路径
  *配置缺省web应用 -- 默认的web应用,当不写web应用名时就访问这个web应用

 
 ~练习:配置一台新的虚拟主机,修改hosts文件模拟dns的作用使其可以访问.用三种方式为这台虚拟主机配置三个web应用,并配置其中的一个web应用为缺省web应用,并配置其主页


4.零散知识
 打war包,减少web应用的体积方便传输,并且在虚拟主机管理的目录下,war默认可以自动解压

 通用Context配置、通用web.xml配置

 Tomcat服务器的管理平台

============================================================
HTTP协议:
    规定客户端和服务器如何进行交互
    基于TCP/IP协议的应用层协议
   
    HTTP协议基于请求响应模型
    一次请求对应一次响应
    请求只能由客户端发出,服务器只能被动的等待请求做出响应
   
    1.0和1.1的区别
   
    telnet/httpwatche
   
   
   
HTTP请求
    请求行
        GET /books/java.html HTTP/1.1
        请求方式
           七种请求方式: POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
           真正使用的时候:POST/GET
           GET请求方式和POST请求区别在于请求参数在传递的过程中方式不同
           如果是GET提交,请求参数将会附加在请求的URL后面作为请求地址的一部分带到服务器端,可以传输的数据大小有限制一般不允许超过1K.
           如果是POST提交,请求参数将会在http请求的实体内容中进行传输,这种方式传输的数据没有大小限制.
          
           利用form表单提交数据时,form表明明确的声明要用POST提交,这是请求参数就是POST提交
           除此以外所有方式的请求参数都是GET提交
          

        请求的资源部分的名称
        所遵循的协议版本
    若干请求头
        Accept: */*   
        Accept-Charset: ISO-8859-1
        Accept-Encoding: gzip,compress
        Accept-Language: en-us,zh-cn
        Host:
www.it315.org:80
        If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
        Referer:
http://www.it315.org/index.jsp
        User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
        Cookie
        Connection: close/Keep-Alive  
        Date: Tue, 11 Jul 2000 18:23:51 GMT
   
    实体内容
       


HTTP响应
    状态行
        HTTP/1.1 200 OK
        协议版本
        状态码--用来表示本次请求的处理结果的代码
            200
            302
            304/307
            404
            500

    若干响应头
        Location:
http://www.it315.org/index.jsp
        Server:apache tomcat
        Content-Encoding: gzip
        Content-Length: 80
        Content-Language: zh-cn
        Content-Type: text/html; charset=GB2312
        Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
        Refresh: 1;url=http://www.it315.org
        Content-Disposition: attachment;filename=aaa.zip
        Transfer-Encoding: chunked 
        Set-Cookie:SS=Q0=5Lb_nQ; path=/search
        ETag: W/"83794-1208174400000"
        Expires: -1 ---- 通知浏览器是否缓存当前资源 ,如果这个头的值是一个以毫秒为单位值就是通知浏览器缓存资源到指定的时间点,如果值是0或-1则是通知浏览器禁止缓存
        Cache-Control: no-cache  -- 通知浏览器是否缓存资源
        Pragma: no-cache    -- 通知浏览器是否缓存资源
            之所以三个头是一个功能,是因为历史原因.不同的浏览器对这三个头支持的不同,一般来说这三个头要同时使用确保不同的浏览器都能实现控制缓存的功能
           
        Connection: close/Keep-Alive  
        Date: Tue, 11 Jul 2000 18:23:51 GMT

   
    实体内容

 

 

一、Servlet
    1.sun提供的一种动态web资源开发技术.本质上就是一段java小程序.可以将Servlet加入到Servlet容器中运行.
    *Servlet容器 -- 能够运行Servlet的环境就叫做Servlet容器. --- tomcat
    *web容器 -- 能够运行web应用的环境就叫做web容器 --- tomcat
   
    2.
        写一个类实现sun公司定义的Servlet接口
        将写好的类配置到tomcat中的web应用的web.xml中,(配置对外访问路径)
   
    3.Servlet的调用过程/生命周期
   
   
    4.Servlet的继承结构
        Servlet接口 -- 定义了Servlet应该具有的基本方法
            |
            |--GenericServlet --通用基本Servlet实现,对于不常用的方法在这个实现类中进行了基本的实现,对于Service设计为了抽象方法,需要子类去实现
                    |
                    |--HttpServlet --在通用Servlet的基础上基于HTTP协议进行了进一步的强化:实现了GenericServlet中的Service方法,判断当前的请求方式,调用对应到doXXX方法,这样一来我们开发Servlet的过程中只需继承HttpServlet ,覆盖具体要处理的doXXX方法就可以根据不同的请求方式实现不同的处理.一般不要覆盖父类中的Service方法只要覆盖doGet/doPost就可以了
   
     5.Servlet的细节
        (1)一个<servlet>可以对应多个<serlvet-mapping>,从而一个Servlet可以有多个路径来访问
        (2)url-partten中的路径可以使用*匹配符号进行配置,但是要注意,只能是/开头/*结尾或*.后缀这两种方式
            ~由于*的引入,有可能一个路径被多个urlpartten匹配,这是优先级判断条件如下:
                哪个最像找哪个
                *.后缀永远匹配级最低
        (3)<serlvet>可以配置<load-on-startup>可以用来指定启动顺序
        (4)缺省Servlet:如果有一个Servlet的url-partten被配置为了一根正斜杠,这个Servlet就变成了缺省Serlvet.其他Servlet 都不处理的请求,由缺省Servlet来处理.
        其实对于静态资源的访问就是由缺省Servlet来执行
        设置404页面500页面等提示页面也是由缺省Servlet来执行
        通常我们不会自己去配置缺省Servlet
        (5)线程安全问题
            由于默认情况下Servlet在内存中只有一个对象,当多个浏览器并发访问Servlet时就有可能产生线程安全问题
            解决方案:
                加锁--效率降低
                SingleThreadModel接口 -- 不能真的防止线程安全问题
                最终解决方案:在Servlet中尽量少用类变量,如果一定要用类变量则用锁来防止线程安全问题,但是要注意锁住内容应该是造成线程安全问题的核心代码,尽量的少锁主内容,减少等待时间提高servlet的响应速度
               
二、ServletConfig -- 代表当前Servlet在web.xml中的配置信息
         String getServletName()  -- 获取当前Servlet在web.xml中配置的名字
         String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
         Enumeration getInitParameterNames()  -- 获取当前Servlet所有初始化参数的名字组成的枚举
         ServletContext getServletContext()  -- 获取代表当前web应用的ServletContext对象

三、ServletContext -- 代表当前web应用
    1.做为域对象可以在整个web应用范围内共享数据
        域对象:在一个可以被看见的范围内共享数据用到对象
       
        作用范围:整个web应用范围内共享数据
        生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。
     
       void setAttribute(String,Object);
       Object getAttribute(String);
       void removeAttribute(String);
    
     2.用来获取web应用的初始化参数
    
    
    
     请求参数 parameter --- 浏览器发送过来的请求中的参数信息
     初始化参数 initparameter --- 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数
     域属性 attribute --- 四大作用于中存取的键值对
    
     3.实现Servlet的转发
       
        重定向 : 302+Location
        请求转发 : 服务器内不进行资源流转
       
        *请求转发是一次请求一次响应实现资源流转.请求重定向两次请求两次响应.
       
      4.加载资源文件
            在Servlet中读取资源文件时:
                如果写相对路径和绝对路径,由于路径将会相对于程序启动的目录--在web环境下,就是tomcat启动的目录即tomcat/bin--所有找不到资源
                如果写硬盘路径,可以找到资源,但是只要一换发布环境,这个硬盘路径很可能是错误的,同样不行.
                为了解决这样的问题ServletContext提供了getRealPath方法,在这个方法中传入一个路径,这个方法的底层会在传入的路径前拼接当前web应用的硬盘路径从而得到当前资源的硬盘路径,这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的资源的路径
                 this.getServletContext().getRealPath("config.properties")
               
                如果在非Servlet环境下要读取资源文件时可以采用类加载器加载文件的方式读取资源
                    Service.class.getClassLoader().getResource("../../../config.properties").getPath()
               
         

 

一、Response
 1.Resonse的继承结构:
   ServletResponse--HttpServletResponse
 2.Response代表响应,于是响应消息中的 状态码、响应头、实体内容都可以由它进行操作,由此引伸出如下实验:
 3.利用Response输出数据到客户端
  response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服务器端使用了非平台码去输出字符的字节数据就需要明确的指定浏览器编码时所用的码表,以防止乱码问题。response.addHeader("Content-type","text/html;charset=gb2312")
  response.getWriter().write(“中文”);输出数据,这是一个字符流,response会将此字符进行转码操作后输出到浏览器,这个过程默认使用ISO8859-1码表,而ISO8859-1中没有中文,于是转码过程中用?代替了中文,导致乱码问题。可以指定response在转码过程中使用的目标码表,防止乱码。response.setCharcterEncoding("gb2312");
  其实response还提供了setContentType("text/html;charset=gb2312")方法,此方法会设置content-type响应头,通知浏览器打开的码表,同时设置response的转码用码表,从而一行代码解决乱码。
 4.利用Response 设置 content-disposition头实现文件下载
   设置响应头content-disposition为“attachment;filename=xxx.xxx”
   利用流将文件读取进来,再利用Response获取响应流输出
   如果文件名为中,一定要进行URL编码,编码所用的码表一定要是utf-8
 5.refresh头控制定时刷新
  设置响应头Refresh为一个数值,指定多少秒后刷新当前页面
  设置响应头Refresh为 3;url=/Day05/index.jsp,指定多少秒后刷新到哪个页面
  可以用来实现注册后“注册成功,3秒后跳转到主页”的功能
  在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能。
 6.利用response设置expires、Cache-Control、Pragma实现浏览器是否缓存资源,这三个头都可以实现,但是由于历史原因,不同浏览器实现不同,所以一般配合这三个头使用
  6.1控制浏览器不要缓存(验证码图片不缓存)设置expires为0或-1设置Cache-Control为no-cache、Pragma为no-cache
  6.2控制浏览器缓存资源。即使不明确指定浏览器也会缓存资源,这种缓存没有截至日期。当在地址栏重新输入地址时会用缓存,但是当刷新或重新开浏览器访问时会重新获得资源。
   如果明确指定缓存时间,浏览器缓存是,会有一个截至日期,在截至日期到期之前,当在地址栏重新输入地址或重新开浏览器访问时都会用缓存,而当刷新时会重新获得资源。
 7.Response实现请求重定向
  7.1古老方法:response.setStatus(302);response.addHeader("Location","URL");
  7.2快捷方式:response.sendRedirect("URL");
 *8.输出验证码图片
 
 9.Response注意的内容:
  9.1对于一次请求,Response的getOutputStream方法和getWriter方法是互斥,只能调用其一,特别注意forward后也不要违反这一规则。
  9.2利用Response输出数据的时候,并不是直接将数据写给浏览器,而是写到了Response的缓冲区中,等到整个service方法返回后,由服务器拿出response中的信息组成HTTP响应消息返回给浏览器。
  9.3service方法返回后,服务器会自己检查Response获取的OutputStream或者Writer是否关闭,如果没有关闭,服务器自动帮你关闭,一般情况下不要自己关闭这两个流。
  

二、Request:Request代表请求对象,其中封装了对请求中具有请求行、请求头、实体内容的操作的方法
 1.获取客户机信息
  getRequestURL方法返回客户端发出请求完整URL
  getRequestURI方法返回请求行中的资源名部分,在权限控制中常用
  getQueryString 方法返回请求行中的参数部分
  getRemoteAddr方法返回发出请求的客户机的IP地址
  getMethod得到客户机请求方式
  getContextPath 获得当前web应用虚拟目录名称,特别重要!!!,工程中所有的路径请不要写死,其中的web应用名要以此方法去获得。

 2.获取请求头信息
  getHeader(name)方法 --- String ,获取指定名称的请求头的值
  getHeaders(String name)方法 --- Enumeration<String> ,获取指定名称的请求头的值的集合,因为可能出现多个重名的请求头
  getHeaderNames方法 --- Enumeration<String> ,获取所有请求头名称组成的集合
  getIntHeader(name)方法  --- int ,获取int类型的请求头的值
  getDateHeader(name)方法 --- long(日期对应毫秒) ,获取一个日期型的请求头的值,返回的是一个long值,从1970年1月1日0时开始的毫秒值
  
  *实验:通过referer信息防盗链
   String ref = request.getHeader("Referer");
   if (ref == null || ref == "" || !ref.startsWith("http://localhost")) {
    response.sendRedirect(request.getContextPath() + "/homePage.html");
   } else {
    this.getServletContext().getRequestDispatcher("/WEB-INF/fengjie.html").forward(request, response);
   }
 3.获取请求参数
  getParameter(name) --- String 通过name获得值
  getParameterValues(name)  --- String[ ] 通过name获得多值 checkbox
  getParameterNames  --- Enumeration<String> 获得所有请求参数名称组成的枚举
  getParameterMap  --- Map<String,String[ ]> 获取所有请求参数的组成的Map集合,注意,其中的键为String,值为String[]
  
  获取请求参数时乱码问题:
   浏览器发送的请求参数使用什么编码呢?当初浏览器打开网页时使用什么编码,发送就用什么编码。
   服务器端获取到发过来的请求参数默认使用ISO8859-1进行解码操作,中文一定有乱码问题
   对于Post方式提交的数据,可以设置request.setCharacterEncoding("gb2312");来明确指定获取请求参数时使用编码。但是此种方式只对Post方式提交有效。
   对于Get方式提交的数据,就只能手动解决乱码:String newName = new String(name.getBytes("ISO8859-1"),"gb2312");此种方法对Post方式同样有效。
   在tomcat的server.xml中可以配置http连接器的URIEncoding可以指定服务器在获取请求参数时默认使用的编码,从而一劳永逸的决绝获取请求参数时的乱码问题。也可以指定useBodyEncodingForURI参数,令request.setCharacterEncoding也对GET方式的请求起作用,但是这俩属性都不推荐使用,因为发布环境往往不允许修改此属性。
   
   
 4.利用请求域传递对象
  生命周期:在service方法调用之前由服务器创建,传入service方法。整个请求结束,request生命结束。
  作用范围:整个请求链。
  作用:在整个请求链中共享数据,最常用的:在Servlet中处理好的数据要交给Jsp显示,此时参数就可以放置在Request域中带过去。
  
 5.request实现请求转发
  ServletContext可以实现请求转发,request也可以。
  在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常
  在forward之前输入到response缓冲区中的数据,但是还没有发送到客户端,forward可以执行,但是缓冲区将被清空,之前的数据丢失。注意丢失的只是请求体中的内容,头内容仍然有效。
  在一个Servlet中进行多次forward也是不行的,因为第一次forward结束,response已经被提交了,没有机会再forward了
  总之,一条原则,一次请求只能有一次响应,响应提交走后,就再没有机会输出数据给浏览器了。
  
 6.RequestDispatcher进行include操作
  forward没有办法将多个servlet的输出组成一个输出,因此RequestDispatcher提供了include方法,可以将多个Servlet的输出组成一个输出返回个浏览器
   request.getRequestDispatcher("/servlet/Demo17Servlet").include(request, response);
   response.getWriter().write("from Demo16");
   request.getRequestDispatcher("/servlet/Demo18Servlet").include(request, response);
  常用在页面的固定部分单独写入一个文件,在多个页面中include进来简化代码量。
  
  
 
四、URL编码
 1.由于HTTP协议规定URL路径中只能存在ASCII码中的字符,所以如果URL中存在中文或特殊字符需要进行URL编码。
 2.编码原理:
  将空格转换为加号(+)
  对0-9,a-z,A-Z之间的字符保持不变
  对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%)。如字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示调对于空格也可以直接使用其十六进制编码方式,即用%20表示,而不是将它转换成加号(+)
  说明:
  如果确信URL串的特殊字符没有引起使用上的岐义或冲突你也可以对这些字符不进行编码,而是直接传递给服务器。例如,http://www.it315.org/dealregister.html?name=中国&password=123
  如果URL串中的特殊字符可能会产生岐义或冲突,则必须对这些特殊字符进行URL编码。例如,服务器会将不编码的“中+国”当作“中国”处理。还例如,当name参数值为“中&国”时,如果不对其中的“&”编码,URL字符串将有如下形式:http://www.it315.org/dealregister.html?name=中&国&password=123,应编码为:http://www.it315.org/dealregister.html?name=中%26国&password=123
  http://www.it315.org/example/index.html#section2可改写成http://www.it315.org/example%2Findex.html%23section2
 3.在java中进行URL编码和解码
  URLencoder.encode("xxxx","utf-8");
  URLDecoder.decode(str,"utf-8");


五、请求重定向和请求转发的区别
 1.区别
   RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
   如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于服务器的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
   调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
   HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
   RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
 2.应用场景(参照图想)
  通常情况下都用请求转发,减少服务器压力
  当需要更新地址栏时用请求重定向,如注册成功后跳转到主页。
  当需要刷新更新操作时用请求重定向,如购物车付款的操作。

1.会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话。
2.问题:如何在一次会话中保存会话相关的数据。
3.Cookie:将会话相关的数据保存到浏览器中,并且在每次访问服务器时都带过去。
 3.1javax.servlet.http.Cookie,可以直接利用此类的构造方法创建一个Cookie,创建出来的Cookie需要设置一个名称和值
 3.2response身上具有addCookie的方法,可以将创建出来的组织成响应消息中的set-cookie头,通知浏览器保存该cookie
 3.3request身上具有getCookies方法,可以获取浏览器带过来的所有Cookie
 3.4Cookie方法:注意,浏览器是根据cookie的名称加上cookie的path来区分是否是同一个cookie的,如果需要覆盖之前的cookie,除了保证名称相同外还要保证path也相同。
   public Cookie(String name,String value)利用构造方法创建一个Cookie对象,在创建的时候就要指定该Cookie的名和值
   setValue与getValue方法  设置或者获取Cookie的值
   setMaxAge与getMaxAge方法  如果不设置cookie的MaxAge(或将其值设置为负值),则默认情况下浏览器会将cookie保存在浏览器的内存中,会随着浏览器关闭而消失。如果设置为一个正值,则代表该Cookie要保存的以秒为单位的时间值,如此,该cookie将会被浏览器保存到硬盘中去。如果将MaxAge设置为0,则是通知浏览器去删除该Cookie。
   setPath与getPath方法   用来指定访问哪个ULR及其子URL时带上此cookie,如果不设置此值,则浏览器默认会将发送该cookie的servlet所在的路径作为path使用。
    例如:
      setPath("/Day06")则/Day06/.../...的路径都会带上该Cookie
      如果发送该Cookie的Servlet是 /Day06/servlet/Demo1Servlet,并且未设置setPat,则浏览器在访问/Day06/servlet/..时会带上该cookie
   setDomain与getDomain方法  设置cookie对应的域名,此方法一旦调用,则浏览器会认为该cookie是一个第三方cookie而拒收
   getName方法 获取该cookie的名字,注意没有setName方法,一个Cookie一旦创建出来就不能修改名字了
   
 3.5浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
 
 实验: 利用cookie实现显示上次访问时间
   !~~利用cookie显示最近浏览的商品
4.HttpSession:在服务器中,为浏览器创建独一无二的内存空间,在其中保存会话相关的信息。
 4.1session作为域使用:他是j2ee中四大域对象之一,作用范围为整个会话。
 4.2session的生命周期:在第一次调用reqeust.getSession()方法的时候,服务器会检查是已经有对应的session,如果没有就在内存中创建一个session并返回。
            当一段时间内session没有被使用,一般为30分钟(此值可以在web.xml中配置<session-config>来配置,也可以使用TomcatManager进行配置),则服务器会销毁该session
            当服务器强行关闭时,没有到期的session也会跟着销毁。
            如果调用session提供的invalidate(),可以立即销毁session。
 4.3session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
 4.4同一电脑内的不同浏览器使用同一session:JSESSIONID这个cookie默认是保存在浏览器内存中的,我们可以自己创建一个同名同path的Cookie,并设置maxage值,使其被保存在硬盘中,从而实现统一电脑中不同浏览器公用一个JSESSIONID从而使用同一个session。
 4.5使禁用Cookie的浏览器也可以使用session:由于session是基于cookie运行的,如果禁用了cookie则会导致session不可用,我们可以将提供给这种浏览器的所有的URL进行重写,在所有的URL后跟上JSEESIONID,从而保证即使禁用了Cookie也能以URL的形式带回JSESSIONID,从而可以使用session。要重写所有的URL是一项成本很高的工作,一般我们不会这么做。
  response. encodeRedirectURL(java.lang.String?url)如果此url是作为重定向操作的地址时使用此方法
  response. encodeURL(java.lang.String?url)如果此url是普通连接则使用此方法
  实验:利用session实现简单的购物功能,并提供对同一台电脑上的多个浏览器共享session的支持以及对禁用cookie浏览器的支持。
  实验:使用Session完成用户登陆:当用户登录时在session中保存用户名,在其他页面就可以检查session中是否存在用户名,如果存在则认为已经登录过。注销的过程就是将session杀死的过程。
  实验:使用session完成防止表单重复提交:当提供表单页面时,在表单中隐藏一个随机数值,并且将该随机数保存到session中,当表单提交时,检查提交上来到随机数与session中的随机数是否相同,如果相同则允许注册,注册后立即删除session中的随机数,如果不同则认为是表单的重复提交。
 ??作业:利用session实现一次性验证码.
  *request.getSession()和request.getSession(false);的不同之处:前面的方法一调用,就会去检查是否有对应的session,没有就创建,有就取回。后面的方法只会去检查,如果有就取回,如果没有也不创建。
  
5.ServeltContext 、reqeust、session域的比较
 servletContext 的作用域是整个web应用,随着服务器启动而创建,如果应用被移除出主机或服务器关闭则销毁。
 request 的作用域是整个请求链,每一次请求都会创建一个request,当请求结束时request销毁。
 session 的作用于是整个会话,第一次调用reqeust.getSession时创建,当一段时间没有使用或服务器关闭或调用session.invalidate方法时销毁
 
 
 什么时候用ServeltContext什么时候用reqeust什么时候用session?
 如果一个数据只是用来显示的话就用request域
 如果一个数据除了用来显示以外我一会还要用,这时候用session
 如果一个数据除了用来显示以外还要给别人用,这时候用ServletContext域
 

 

 

 

 

0 0
原创粉丝点击