HTTP Servlet cookie Session 记录

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

1.HTTP协议
    约束浏览器和服务器交互的格式
    所有的www域名都遵守了http协议
    特点:请求响应模式    但有局限
          协议默认端口80
          使用1.1版本
2.http协议抓包查看:
    页面按f12 ——网络选项卡——开始捕获——地址栏输入URL——详细视图——抓包信息

4.浏览器和服务器的数据交互方式
    1.超链接:?参数  中文乱码问题(new String(byte[],"utf-8"))

    2.表单 :POST方式 中文乱码问题(request.setCharacterEncoding("utf-8"))

    3、JS方式:location.href="";替换地址,放在JQuery的事件里
           给form表单一个id,JS、jq获取对象.submit/submit() 提交整个表单。可以提交一行数据
    5.ajax 
        $.get(url,[params],[fn],[type]):发送了一个get请求
        $.post(url,[params],[fn],[type]):发送一个post请求

http协议:
    协议:规定内容的格式.
    http协议:超文本传输协议(HTTP,HyperText Transfer Protocol)
        是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
        设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
    包含:
        客户端发送给服务器的内容  请求
        服务器返回给浏览器的内容  响应
    请求的格式:
        请求行 请求头 请求体
    响应的格式:
        响应行 响应头 响应体

    请求:封装了客户端的所有的请求数据
        请求行 
            请求信息的第一行
            格式:
                请求的方式 请求的资源 协议/版本
            例如:
                GET /day33/1.html HTTP/1.1
                
            请求方式:
                常见的两种 get和post
                get请求,会将参数追加在地址栏上,参数大小有限制  http://ip地址:端口号/项目名/资源?参数名称=值&参数名称=值
                post请求,不会将参数追加在地址栏,请求的参数在请求体中,请求参数的大小无限制.较为安全
                    格式:
                        参数名称=值&参数名称=值

            文件上传:
                默认上传,只上传编码后文件名无内容 type=file
                enctype=“text/plain”:不进行编码处理只上传文件名。
                        值可以去W3C-HTML-表单-encotype中查找表单中查
                 enctype=“multipart/form-data”:多部件/表单数据。按照当前表单输入项分部分上传。上传文件名及内容
        请求头 
            格式: key/value的格式 (value可以为多个值的)
            常见的请求头
                Accept: text/html,image/*        --支持数据类型
                Accept-Charset: ISO-8859-1    --字符集
                Accept-Encoding: gzip        --支持压缩
                Accept-Language:zh-cn         --语言环境
                Host: www.itcast.cn:80        --访问主机(请求的服务器主机名)
                If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT      --缓存文件的最后修改时间
                Referer: http://www.itcast.com/index.jsp     --来自哪个页面、防盗链
                User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) (客户端浏览器与操作系统相关信息)
                Cookie
                Connection: close/Keep-Alive       --链接状态
            重要的头:
                Referer  User-Agent Cookie If-Modified-Since
             
        请求体
            和请求头之间有一个空行
            post请求的参数:只有表单提交的时候明确了method="post"这时候是post请求,其他的都是get请求
                参数名称=值&参数名称=值

        referer作用:告诉服务器我是哪个页面跳转来的   应用:防盗链。数据统计
            String referer = request.getHeader(“Referer”);
            If(!referer.contains(“localhost”)||referer==null){
                Response.sendRedirect(“其他页面”); 重定向到其他页面
            }else{
                Syso(“hello”)
            }
        
        常用方法:
            ★request.getContextPath():获取请求的服务程序名称。可以动态的获取当前程序即项目名称。可用于form表单的路径,更灵活
            ★request.getMethod():请求方式
            request.getRemoteAddr():请求的客户IP地址,若为Tomcat的则是默认的00000001
            request.getProtocol():获取请求协议和版本

            ★request.getHeader(“User-Agent”):客户端浏览器以及操作系统信息    
            request.getHeader("referer") :获取页面的来源
            int getIntHeader(String name)
            long getDateHeader(String name)
            request.getHeaderNames():获取所有请求头 返回Enumeration<String>迭代器
                     遍历:while(headerNames.hasMoreElements)headername.nextElement(

            ★request.getParameter(“键”)  文本或密码等
            ★request.getParameterValues(“键”) 复选框的值
            ★request.getParameterMap():返回map集合。
                泛型为<String,String[]>  {username=[tom],password=[123],hobby=[smoking,drinking]}
                
            request.getQueryString():获取路径中的参数
            request.getRequestURI():获取请求路径(不带参数) /day36/index.html
            

         请求乱码问题:
            原因(提交路径)
                地址栏的数据会使用url编码(页面的编码),提交到服务器的时候,tomcat(6和7)默认使用的编码是 iso-8859-1,获取数据要进行解码
                    编码和解码用的不一样,所以产生了乱码问题

            post情求(在页面单击表单或链接):utf-8 即你页面的编码

                1) request.setCharacterEncoding(“utf-8”):只告诉Tomcat
                                    
            get请求(在地址栏中直接给出参数)也适用与post请求

                2)先获取西欧字符value值 ,再转换为字节,再将字节按utf-8转换
                    String value = request.getParameter(“属性”)
                    byte[] buffer = value.getByte(“ISO-8859-1‘’)
                    String name = new String(“buffer”,”utf-8”)

    响应:    HttpServletResponse(服务器返回给浏览器的信息)
        组成部分:
            响应行 响应头 响应体
    
        响应行 
            响应信息的第一行
            格式:
                版本/协议 响应的状态码 状态码说明
            例如:
                HTTP/1.1 200 OK
                
            状态码:
                1xx    :请求已发送
                2xx    :响应已完成
                    200:响应成功(请求成功)
                3xx    :需要浏览器进一步操作才可以完成
                    302:重定向(配合location头使用)
                    304:读缓存
                4xx :用户访问错误
                    404:用户访问的资源不存在
                5xx :服务器内部错误
                    500:服务器内部异常
        响应头 
            格式: key/value的格式 (value可以为多个值的)    
            常见的响应头
                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         --数据类型(MIME类型)  大类型/小类型 text/css  text/javascript  image/jpeg image/bmp
                Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT    --最后修改时间
                Refresh: 1;url=http://www.it315.org        --定时刷新
                Content-Disposition: attachment; filename=aaa.zip    --下载
                Set-Cookie:SS=Q0=5Lb_nQ; path=/search
                Expires: -1                    --缓存
                Cache-Control: no-cache              --缓存
                Pragma: no-cache                   --缓存
                Connection:Keep-Alive               --连接
                
            重点的头:
                Set-Cookie Location Content-Type Refresh Content-Disposition Last-Modified

            常见的响应头:
                location:重定向
                    方式1:
                        setStatus(302);
                        setHeader("location","跳转路径的绝对路径");
                    方式2:推荐
                        sendRedirect("跳转路径的绝对路径");
                        
                    重定向特点:
                        发送了2次请求,第二次请求是自动发送的
                        第二次请求可以是站外资源
                        地址栏会发生变化,是第二次请求的地址
                        
                refresh:定时刷新(可以实现定时跳转)
                    格式:
                        在java代码中写法
                            response.setHeader("refresh","秒数;url=跳转路径的绝对路径");
                            
                        在html代码中写法:伪http响应头 定时器
                            <meta http-equiv="refresh" content="3;url=/day35/index.html">
                                http-equiv:响应头
                                content:响应头的内容

                content-type:设置mime类型,还可以设置响应的字符集

                    response.setContentType("text/html;charset=utf-8");
                    Response.setContentType(mimeType);

                content-disposition
                    response.setHeader("content-disposition","attachment;filename="+文件名)
                    若为中文,火狐需要base64编码;其他浏览器为utf-8

                常用方法:
                    ★setStatus(int 状态码):针对于1 2 3   (没有错误)  重定向使用

                    Response.sendError(”状态码”,“错误提示”):码和值,返回服务器的错误提示 4 5
            
                    ★setHeader(String name,String value);设置一个字符串类型的头
                        常用方法(了解):
                        setHeader(String key, String value):设置字符串形式的响应头
                        setIntHeader(String key, String value):设置整型的响应头
                        setDataHeader(String key, String value):设置时间的响应头
                        addHeader(String key, String value):添加至字符串形式的响应头,之前设置过则追加,若没有设置过则设置
                        addIntHeader(String key, String value):添加整型的响应头
                        addDataHeader(String key, String value):添加时间的响应头

        响应体
            和响应头之间有一个空行
            浏览器解析的内容
 
        操作响应体
            api:
                response.getWriter():字符流
                response.getOutputStream():字节流
            
                注意:
                    1.我们自己编写的内容用字符流 其他用字节流
                    2.俩流互斥
                    3.响应流可以不关闭,若没有关闭,servlet容器(服务器)会帮我们关闭 底层是一个缓冲流
                        建议:若文件下载 建议自己手动关闭流
        响应体乱码:
            代码使用utf-8,而Tomcat使用的是ISO-8859-1。
            <meta>可代替响应头
                <meta http-equiv=”Content-Type” content=“text/html;charset=”utf-8”>

            推荐方案:
                respnse.setHeader("content-type","text/html;charset=utf-8");放在响应头时浏览器会读取,两个都告诉
                response.setCharacterEncoding(“编码集”):只告诉Tomcat,只作用请响体和POST请求,也就是对发送出去(getWriter)的改变
                ★response.setContentType("text/html;charset=utf-8");
                    1.设置文件的类型为 text/html
                    2.设置响应流的编码 utf-8  setCharacterEncoding()只设置响应流的编码
                    3.告诉浏览器用utf-8解码

        禁用浏览器缓存:  设这三个值就行
            response.setHeader(“Cache-Control”,”no-cache”);
            response.setHeader(“pragma”,”no-cache”);
            response.setDateHeader(“expires”,”-1”)

        缓存思想:长久不变的,本地浏览器保存页面信息。
               页面改变:第一次访问把文件的时间戳发送到浏览器,浏览器保存此时间戳,并且缓存文件.
                   之后访问:浏览器吧时间戳带到服务器,服务器把时间戳和该文件的最后修改 时间比较,如果一样,告诉浏览器直接使用缓存文件。如果不一样就将新文件发送给服务器浏览器。


    请求转发与重定向:
   
        请求转发:请求一次,地址栏不变,请求转发的时候只能在服务器项目内部转发到本项目其他Servlet。 效率高 用于页面跳转
              需要在下一个Servlet中获取request域中的数据,必须要使用转发!

            转发:request.getRequestDispatcher(“/跳转到的Servlet”).forward(request,Response)
                将A的request和Response都带到B setAttribute,和getAttribute获取值,
            转发路径为内部路径:不带项目名
                    /dis2
                    /index.html

        重定向:请求两次,地址栏改变,重定向不只能重定向到本项目的其他。 用于页面跳转,跳转到外网

            重定向:response.sendRedirect(/request.getContextPath()/Servlet地址“”)


        重定向和请求转发区别:
            重定向发送两次请求;转发发送一次请求
            重定向地址栏会发送改变;转发不会改变
            重定向可以访问任意资源;转发只能是项目内部资源
            重定向是response的方法;转发是request的方法
            重定向不能使用request属性操作;转发可以使用request属性操作.
    
        常见的重定向场景:
            访问站外资源;登录成功的时候;
            若要使用request属性操作的时候,只能使用转发


                        Servlet


                     request和response都是Tomcat创建并管理我们只是操作API


1. Servlet: 运行在服务端的Java小程序,Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),且最重要。

2. Tomcat可以存储动态资源,动态资源是程序生成的,每一次访问肯能都不一样,生成动态资源的程序在Java叫servlet.

3. Servlet的作用:
        获取客户端(HTML或JSP)请求数据
        处理请求
        完成相应

4.servlet的体系架构:(了解)
    Servlet:接口
        |
    GenericServlet:(抽象类.除了service方法没有实现之外,实现了servlet的其他方法)
        |
    HttpServlet:(抽象,实现了servlet的所有方法,处理http请求的)
        |
    我们自己编写的类

5.serlvet接口:
        ★
            void init(ServletCofig config):初始化
            void service(ServletRequest request,ServletResponse response): 处理逻辑
            void destroy():销毁
        
        理解:
            ServletConfig getServletConfig() :获取当前servlet的配置对象
        了解
            String getServletInfo() :获取serlvet信息
    
  GenericServlet:
        除了service方法没有实现之外,实现了servlet的其他方法
            实现了init方法 将config对象付给了成员变量 
            void init(ServletCofig config){
                this.config = config;
                init();//调用重载方法 
            }
        init()方法中是空实现,留给编程者使用.需要在servlet初始化的时候做些操作就可以重写这个方法;否则就不用            

4.Servlet路径配置

     <servlet>
            <servlet-name>s</servlet-name>        servlet-name:给servlet起个名称 名称自定义,保证唯一
            <servlet-class>s.s</servlet-class>    servlet-class:serlvet的全限定名(包名+类名)
      </servlet>
      <servlet-mapping>
            <servlet-name>s</servlet-name>        复制上面已注册好的名字servlet-name:在servlet标签中给servlet起好的名称
            <url-pattern>/s</url-pattern>        url-pattern:路径  暂时都以"/"开头
      </servlet-mapping>
    
    url-pattern的配置
        ★方式1:完全匹配 /a/b/hello  以"/"开始
          方式2:目录匹配    以"/"开始 以"*"结尾    例如: /a/*
          方式3:后缀名匹配 已"."开始,后面写后缀名  例如:   .jsp  .action .....

        注意:
            一个路径只能对应一个servlet
            一个servlet可以对应多个路径
 
tomcat中的默认的servlet
    作用:
        处理别人都处理不了的请求.例如 404 ,500
    了解:
        defaultServlet 在tomcat的conf/web.xml中配置的
        
    我们的项目文件,除了自己的web.xml(优先)还有tomcat的web.xml 

5.servlet生命周期  (第一次访问时创建对象,服务器关闭时销毁)

    Init——创建对象时,就掉用的方法。
    Service——每次访问时,都调用一次service方法
    Destroy——服务器关闭时,会调用destory
    一般情况: init()和destroy()不做任何实现,只实现service(),提供真正的服务
    
    初始化方法:
        调用的时机:默认第一次访问该serlvet
        调用的次数:一次
        调用者:web服务器(tomcat)
        
     访问方法:
        调用的时机:每次访问的时候
         调用的次数:请求一次执行一次
        调用者:web服务器(tomcat)
    
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("6666666666666666666");
        }

     销毁方法:
        调用的时机:当项目移除或者服务器正常关闭的时候
         调用的次数:一次
        调用者:web服务器(tomcat)
        
    总述:★★★
        serlvet是单实例多线程.
            默认第一次请求来的时候,服务器创建servlet对象,且服务器调用servlet的init方法实现初始化操作,还要调用一次service方法
            每次请求来的时候,服务器会获取一个线程,服务器调用servlet的service方法执行逻辑
            当项目移除或者服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.


5.表单传送数据:form表单的action=要关联servlet地址,servlet获取请求数据,并执行。

    *HTML中的Servlet页面路径: 
        http:/localhost/项目名/servlet路径 (带协议和主机的绝对路径(访问站外资源))
        /项目名/servlet路径        (不带协议和主机的绝对路径(访问站内资源 ★))
        servlet路径(相对路径,相对于当前文件夹)
        
      *Servelet解析表单带来数据可以使用当前方法的参数HttpServletRequest request 获取
         获取单个:request.getParameter(“键”)  文本或密码等
          获取多个值:String[] values = request.getParameterValues(“键”) 复选框的值
          获取表单中所有的值: Map getParameterMap() 文本、密码、复选等

      *Servelet往浏览器输出内容(HttpServletResponse response)
        PrintWriter out = response.getWriter()  out.print() 输出到页面
        ServletOutputStream         但是两个流不能同时用
        response对象获取输出流,然后向流写内容。流无需我们关闭。
        处理响应乱码:
            方式1:response.setHeader("content-type","text/html;charset=utf-8");
                设置各种响应头的方法 
                    setHeader("响应头","值");
            方式2:response.setContentType("text/html;charset=utf-8");

7. Servlet相关配置:

    1.servlet一运行就调用init(),第一次访问时调用,如果init()耗时间长。可在Tomcat启动时,直接创建servlet,并调用init()。
            设置:设置servlet配置文件中标签:在Tomcat的web.xml中配置或某一个Servlet中
                   <load-on-startup></load-on-startup>
                      正整数:整数越小,加载的优先级越高 
                   负数是第一次访问才加载    

    2.url-pattern配置:设置servlet访问路径,映射servlet地址
        格式:
            默认:与类名相同
            自定义:                                     优先级:完路>目录>后缀>完全匹配
                    完全路径(/A/B/C):访问的时候必须完全匹配
                    目录匹配:(/目录/*)访问时只要目录匹配即可
                    扩展名匹配:(*.后缀名)访问时只要后缀名一致。切记前不可有/
                    全部匹配:(/)几乎不用
    3.ServletConfig:

        获取配置信息:
            String servletName = request.getServletConfig().getServletName();
          获取初始化参数:
                  <context-param>
                <param-name>名    </param-name>
                <param-value>值    </param-value>
                 </context-param >

            String servletparam = request.getServletConfig().getInitParam(”键”)


8. Servlet三大作用域:多个资源之间传送数据(Servlet 与JSP之间)

    *ServletContext(域对象):全局管理者(一个项目就唯一一个)
        作用:
            资源共享
            获取文件的路径
            获取文件的mime类型
            获取全局的初始化参数(spring)

        创建:服务器在启动的是时候会为部署在Tomcat的项目创建一个ServerContext对象
        销毁:服务器正常关闭或项目移除的时候ServletContext
        作用域:当前整个项目

          1.该对象是内置好的不能new
          
        2.获取全局配置信息:数据库连接配置信息 C3p0 Servlet配置信息。但是此专指web.xml(在spring中用)        
            <context-param>
                <param-name>名    </param-name>
                <param-value>值    </param-value>
            </context-param >

            通过方法:
                String getInitParameters(String name); 通过名称获取一个初始化参数
                (了解)Enumration getInitParameterNames();获取所有初始化参数的名称

        3.获取ServletContext 对象 
            ServletContext  getServletContext():获取上下文对象 this.getServletContext()

        4.设置属性
            Void setAttribute(“键”,“值”):
            Object getAttribute(”键”):获取ServletContext
            Void removeAttribute(String name):移除值

        5.资源:项目上线时内置的一些数据,放在webContent下,供用户下载。获取资源需要流

        6.获取项目下资源的方法:

            InputStream  getResourceAsStream(/资源在的文件夹/资源名):通过流获取资源方式一
                    注意:若路径不存在,返回一个null 

            String   getRealParh((/资源在的文件夹/资源名):获取资源在服务器下的绝对路径(Tomcat下的路径)通过IO流输出。
                     注意:若路径写错了 也可以返回一个路径 只是这个路径不存在

            FileInputStream():获取流对象,读取资源 方式二

        7.获取文件的mime类型★

            getMimeType(String 文件名称)   例如: 1.jpg  index.html     Mime类型的组成:  大类型/小类型  image/jpeg    text/html
        
            Response.setContentType(mimeType)
        
        8.获取文件对应流
            方案1:InputStream  类名.class.getClassLoarder.getResourceAsStream(“文件名”):应用于配置文件,特点是这些配置文件都在src下
            方案2:InputStream  appication.getResourceAsStream(“文件路径”):一些被下载的数据,都存储在webcontent下

    *HttpSession:私有数据。

        创建:服务器第一次调用getSession()时,服务器创建Session对象
        销毁:    非正常关闭服务器,正常关闭不销毁。还能拿到
               Session过期了,默认时间是30分钟
              手动调用Session的invalidate方法
        作用域:一次会话始终是同一个session

    *HttpServletRequest:针对一次请求。使用该对象保存数据,一次请求(请求转发多个页面)内数据有效。
        方法:
            xxxAttribute();
        创建:浏览器只要访问服务器都会创建request,每访问一次就创建一次
        销毁:服务器为这次请求作出响应之后,销毁request
        作用域:一次请求,多次转发资源之间可以使用
        作用:
            在一次请求中多个servlet或者jsp中进行通信(信息共享)

    *三个作用域对象操作的API相同
        存放数据:setAttribute(name,value)键值都随意
        获得数据:getAttribute(name)返回值是Object类型
        删除数据:removeAttribute(name)

8.Servlet模板的创建
    window - preferences-搜索Templates--添加模板

        package ${enclosing_package};
 
        import java.io.IOException;
        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
 
        public class ${primary_type_name} extends HttpServlet {
 
            public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          
            }
 
            public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                    
                doGet(request, response);
            }
 
        }

9.文件下载知识点    
     Get请求是根据浏览器GBk编码提交的
     POST:请求是按utf-8编码提交的
    1.Response只是写一段文本时,浏览器行头体都有。Tomcat给写的对于我们屏蔽
    2.下载方式:
        1.超链接下载:
            <a href="/day35/1.jpg">1.jpg</a>
            
            注意:
                每个文件都是mime类型,若浏览器能解析这种类型,则在浏览器打开.
                若浏览器不能解析这种类型,就会出现下载框.

        2.编码下载,通过Servlet
           <a href=“/目录/Servlet路径?name=文件名”> </a>  ?name=:表示匹配哪个文件

            A.设置文件的mime类型
              ServletContext context = this.getServletContext();
              String mimeType = context.getMimeType(文件名)
              Response.setContentType(mimeType)

            B.设置下载头信息content-disposition
              String filename= request.getParameter(“name”)
              Response.setHeader(“content-disposition”,”attachment;filename=”+文件名称);

            C.提供一个输出流
              InputStream is = context.getResourceAsStream(“/servlet路径/文件名”)
              Response.getOutputStream();
              IOUtils.copy(is,os);

            代码: String name = request.getParameter("filename");
              name = new String(name.getBytes("iso-8859-1"),"utf-8");  解决页面中文乱码问题
        
              response.setHeader("Content-Type",this.getServletContext().getMimeType("/ziyuan"+name));
              String namedownload = new String(name.getBytes("GBK"),"iso-8859-1");
              response.setHeader("Content-Disposition", "attachment;filename="+namedownload); //解决下载文件的文件名乱码问题
        
              InputStream in = this.getServletContext().getResourceAsStream("/ziyuan/"+name);
              OutputStream out = response.getOutputStream();  //读入写出
              byte[] b = new byte[1024];
              int length;
              while((length = in.read())!=-1){
                 out.write(b,0,length);
              }
              in.close();

          乱码:
            原因:
                firefox浏览器要求文件名称返回的 base64编码
                其他浏览器要求文件名称返回的 utf-8编码
                
                //解决中文乱码问题
                    //获取用户的浏览器内核版本(明天讲)
                    String agent = request.getHeader("user-agent");
                    System.out.println(agent);
                    //b.设置文件下载头
                    response.setHeader("content-disposition", "attachment;filename="+DownLoadUtils.getName(agent, s));
            DownloadUtils:
                public class DownLoadUtils {
                    public static String getName(String agent, String filename) throws UnsupportedEncodingException {
                        if (agent.contains("Firefox")) {
                            // 火狐浏览器
                            BASE64Encoder base64Encoder = new BASE64Encoder();
                            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
                        } else {
                            // 其它浏览器
                            filename = URLEncoder.encode(filename, "utf-8");
                        }
                        return filename;
                    }
                }

12.验证码
    注意:验证码必须要在路径后面添加一个动态数据,要不然会去缓存中找之前的响应内容
    用Servlet生成图片 故图片链接地址是<img id="tupian" src="/day14_code/CodeServlet"/>
    具体代码找现成的,并且添加单击事件换验证码。
    代码:
         <script type="text/javascript">
        $(function(){
            $("#tupian").click(function(){
                $(this).prop("src","/day14_code/CodeServlet?test="+new Date().getTime());
            });
        })
         </script>
    
11.案例:用户注册
    6.UUID类:     自动生成一串不重复的值
        String randomUUID(); 生成一个36位的字符串 中间有-,需要去除
            String uid = UUID.randomUUID().toString().replace(“-”,””);

    8.将数据组织成一个Bean对象 应用:BeanUtils.populate(对象,map)

        GetParameter()获取参数 > 创建对象 > 对象.set属性()
        优化:BeanUtils
           *时间解析器:
            创建时间解析器对象:DateConverter dc = new DateConverter();
            设置可以解析的时间格式:
                dc.setPatterns(new String[]{"yyyy-MM-dd","yyyy/MM/dd"})
            注册解析器:ConvertUtils.register(解析器对象,(要转换成的类型)Date.class);
            )
           *导两个包,且要结合.getParameterMap()使用
           *将获取HTML的值存入user对象:BeanUtils.populate(user,request.getParameterMap)        
          *BeanUtils设置对象会将基本数据类型转换为所需类型。时间类型要用时间解析器

                                Cookie 和 Session

1 修改jsp页面的编码 window——jsp——jsp File 
1.会话:一次交互流程,交互开始会话开始,交互结束会话结束。
2.web中 :浏览器连接到服务器,会话开始,浏览器结束,会话结束。

3.Cookie和session是保存会话中产生的数据,
     Cookie——是保存在浏览器(客户端),生命周期可设置。
     Session——是保存在服务器 生命周期是会话结束终止使用,但是存在于服务器中。

4.Cookie的API
    Cookie C = new Cookie(”键name”,”值”)键自定义
    response.addCookie(C):将cookie发送到浏览器
    request.getCookies():获取Cookie数组对象
    cookie.setPath(“路径”):给cookie自定义添加路径
    cookie.setMaxAge(“时间”):给cookie    设置生存时间
    cookie.getName():获取cookie的名字
    cookie.getValue():获取cookie的值

5.Cookie生命周期
    默认:浏览器关闭Cookie死亡
    设置:cookie.setMaxAge(“时间”),浏览器关时会将Cookie写到磁盘,第二次打开使用

6. Cookie使用:
    服务器创建cookie对象:Cookie C = new Cookie(”键name”,”值”)键自定义
        注意:一个Cookie是保存少量信息的键值对,路径相同 重名,则覆盖
    Cookie被服务器发送到浏览器:response.addCookie(C)
        本质是设置响应头:set—Cookie name=value
    Cookie由浏览器保存
    以后请求,Cookie会被带到服务器,请求体携带过来。
    服务器获取:
        Cookie[] Cs =  request.getCookies();
        If(cs !=null){
            For(Cookie c :cs){
                c.getName()+c.getValue()
            }
        }
7.注意事项:
    *除了name,value其余属性为可选属性
    *Cookie存储数量是有限的,一般浏览器300是上限,针对于单个服务器20个
    *cookie大小有限制4kb
    *cookie也可以由浏览器产生

8.session :域对象。由服务器创建,存在服务器,结合Cookie使用。可以跨多个也面请求

9.sessionAPI:
    HttpSession hs = request.getSession():
    hs.setAttribute():给Session设置值
    hs.getAttribute():获得Session设置的值
    hs.removeAttribute():移除session的数据
    Session.invalidate():移除session则连其中的数据一起移除

10.第一次访问Servlet会生成session, 
    HttpSession hs = request.getSession()创建Session对象
    给Session设置属性,再在其他页面取出属性值
    创建完Session之后会给浏览器发送一个Cookie,这个Cookie  JSESSIONID=字符串这个Cookie值和上面Session对应。
    第二次访问服务器,携带Cookie到服务器
    获取Session对象,根据cookie的ID获取到已经存在的Session
    操作Session
    注意:同一个Session,可以实现不同页面的共享,对于同一个访问者,Session唯一,不同访问者不唯yi

11.Session生命周期:
    出生:可以理解为getSession时(但是实际是访问页面的时候就已经创建了)
    死亡:服务器非正常关闭 、invalidate、session如果不适用30分钟服务器会自动将其销毁

12.Cookie和Session使用时机:
    数据安全性高:用Session
    多个页面要实现复杂的数据共享:使用Session
    Cookie一般用于数据短小安全性不高的场合。

13.浏览器端的会话技术: cookie
                  存储完交互产生的数据保存在浏览器端

           浏览器(自动): 接收cookie---保存cookie--传递cookie 
           服务器(重点): 创建cookie---传递cookie---接收cookie
                创建cookie: new cookie("","");
                传递cookie: addCookie(cookie对象);
                接收cookie: Cookie[] getCookies();
                JSP页面想获得cookie就必须要用重定向,跟浏览器交互后才有Cookie

14.默认情况: 会话级别   只要关闭浏览器 cookie销毁

           持久化:  setMaxAge(默认是秒值开始的)
                0  移除cookie
                >1 设置申明周期
                -1 会话级别
15.服务器端的会话技术: session
                  存储完交互产生的数据保存在服务器端

        session是一个域对象
                xxxAttribute("",object)
        作用域:
             一次会话中有效
        *(重点) request.getSession()
         
            如何去保证一次会话中使用的是同一个session?
                jsid ---session基于cookie

            为什么浏览器关闭就不是同一个session?

                     浏览器关闭 cookie销毁


案例一: 统计一个servlet的访问次数
需求:
    有一个servlet(countServlet),每访问一次这个servlet,将访问的次数+1,
    当我们访问另一个servlet(showServlet),展示访问CountServlet的次数

技术分析:ServletContext对象

ServletContext:    上下文对象(全局管理者)

服务器启动的时候就会为每一个项目创建一个全局管理者--ServletContext对象

ServletContext的作用:
    
    2 .获取全局的初始化参数
    3 .获取一个文件的MIME类型( 例如:一个html文件   mime类型:text/html   text/css  img/jpeg)
    4 .管理文件 (例如:获取文件路径,根据文件获取流)

    1 .资源共享(在本项目下的所有servlet都可以共享它)

获取ServletContext:
        方式1:
            ServletContext getServletConfig().getServletContext()
        方式2:
            ServletContext getServletContext()

获取ServletConfig对象和ServletContext对象
            直接在自己的servlet里面调用
                    this.getServletConfig()
                    this.getServletContext()
常用的方法:
获取全局的初始化参数
       String getInitParameter(String name):获取指定的初始化参数
       
获取一个文件的MIME类型
       getMimeType(String filename):获取文件的mime类型

管理文件
       getRealPath(String path):获取当前项目在tomcat服务器中的根路径       
       InputStream is=new FileInputStream(new File(path)) 之前的获取方式
              
       getResourceAsStream(String path):根据文件获取流

资源共享的方法(可以把他当成一个map集合) (掌握)
            setAttribute(String key,Object value):储存值
            Object getAttribute(String key):获取值,若没有则返回一个null
            removeAttribute(String key):移除值

ServletContext资源共享的方法:可以被多个servlet共
---------------------------------------------------------------------------------------------------
步骤分析:
         1 需要2个servlet(countServlet和showServlet)
         
         2 在countServlet
              1 创建servletContext对象
              2 从servletContext取值
                    无:count=1
                    有:count=count+1

              3 在将设置完的值存到servletContext
                                  
         3 在showServlet
            1 创建servletContext对象

            2 从servletContext取值
                    无: 直接响应页面 没有访问过
                    有:  直接取值,响应给页面访问次数                           
---------------------------------------------------------------------------------------------------
案例二: 文件下载
需求:
    在页面上有几个连接,点击连接就可以下载相应的文件了

技术分析:  response---响应对象

    作用:
            通过他可以往浏览器输出内容    
    响应的组成:
            响应行 响应头 响应体

    1 操作响应行
        格式:
            协议/版本 状态码 状态码说明  HTTP/1.1 200 OK
                
        常用的方法:
            操作状态码:5种状态码 
                    1 2 3 :正常的响应
                     4 5:有问题的响应
                (理解)setStatus(状态码):针对的是 1xx 2xx 3xx
                    setStatus(302)
                    需要一个头 
                
                (了解)sendError(int code):针对的是 4xx 5xx

    2 操作响应头(重点)
        格式:
            key:value(value可以是多个值)
        
        常用的方法:
            ★setHeader(String key,String value):设置字符串形式的响应头
            
            (了解)
             addHeader(String key,String value);添加字符串形式的响应头 
                               若没有设置则设置,若设置过则添加
                        
        常用的响应头:
            1 location:重定向 
                重定向方式1(了解)需要配合302状态码一起使用
                  response.setStatus(302);
                  response.setHeader("location", "/servlet02/helloServlet7");
                
                重定向方式2(掌握)
                常用方法:
                    ★response.sendRedirect("url");

            2 refresh:定时刷新
                response.setHeader("refresh","秒数;url=跳转的路径");            
            
             3 content-type:设置文件的mime类型 并且通知浏览器用什么编码打开
                
                (了解)response.setHeader("content-type","文件的mime类型;charset=utf-8");
                
                
                (重要)response.setContentType("文件的mime类型;charset=utf-8");

                         response.setContentType("文件的mime类型")
            
            4 content-disposition:文件下载
                response.setHeader("content-disposition","attachment;filename="+文件名称);
    
    3 操作响应体
        页面上要展示的内容
        常用方法:
            PrintWriter getWriter():字符流
            ServletOutputStream getOutputStream():字节流            
        注意:
            若是能写的出来的内容用字符流,其他全用字节流
            中文乱码问题
            字符流和字节流不能同时出现
            服务器会自动帮我们关闭流.
 

猜你喜欢

转载自blog.csdn.net/weixin_41716049/article/details/93487680