黑马程序员技术交流社区

标题: 会话技术笔记整理及相关知识点 [打印本页]

作者: hw1037585418    时间: 2019-8-5 16:48
标题: 会话技术笔记整理及相关知识点
1.会话技术
        会话: 打开浏览器,不断的访问....然后关闭浏览器,这个过程称之为一次会话
        作用: 用来共享数据, 这个存储的方式很明显比request域要大,比ServletContext域要小,一般情况这个共享数据是一次会话有效
2.Cookie
        是一种客户端会话技术, 将数据保存到客户端浏览器中
       
        增: ----> 从服务器中写东西给浏览器, 找resp, 设置一个响应头 set-cookie       
                1.创建Cookie(String key,String value); ---->只能存字符串的键值对
                2.通过resp中addCookie(cookie对象);
               
        删: ----->
                将maxAge调整成"零"
        改: ---->
                1.创建Cookie(String key,String value); ---->只能存字符串的键值对
                2.通过resp中addCookie(cookie对象);
        查: ---->从浏览器会携带cookie过来, 找req ----> 设置了一个请求头 cookie
                Cookie[] arr = req.getCookies();
       
        1.常见的方法:
                1.构造:
                        Cookie(String key,String value)
                2.方法
                        String getName(); ---->获取cookie的键
                        String getValue(); ---->获取cookie的值
                        void setMaxAge(int seconds) ---->调整cookie的存活时间
                                正数: -----> 指定时间有效, 默认单位是秒
                                负数 --->默认一次会话有效
                                零: ---->删除cookie
                                        Cookie c = new Cookie("aaa","123");
                                        Cookie c1 = new Cookie("aaa","");
                        setPath("路径") ------> 如果不给值, 默认当前项目的虚拟路径, 也就是有效范围是当前项目;
                        setDomain("路径") ---->可以在不同的服务器之间共享cookie
                               
        2.cookie的有效时间
                默认是一次会话有效, 原因默认MaxAge的值是一个负数
        3.是否能够存中文
                tomcat8以后可以存中文的, 但是我们不用, 原因是他不能存特殊字符!!!!所以还是延用之前的做法
                        如果有特殊字符要存, 建议用URLEncode编码一下, 取的时候记得要用URLDecode去解码一下
                        URLEncoder.encode(要编码的字符串,"原来的编码")
                        URLDecoder.decode(要解码的字符串,"组成的编码")
        4.Cookie的范围
                默认只在当前项目有效
                可以通过setPath做到在同一个服务器中,不同项目来共享数据  day15和day16项目之间想要共享数据,我们可以将setPath("/")
                可以通过setDomain("一级域名"),可以在不同的服务器中共享cookie
3.JSP
        作用: 为了弥补HTML的缺陷而得到东西, HTML不能写逻辑, html没有办法写java代码, jsp可以, 能够简化书写
        本质: 其实JSP本质就是一个Servlet, 如果没有他的话, 我们动态资源只有Servlet, 所有的书写标签的动作都的由我们自己去写很恶心
                  而jsp老厉害, 既可以写HTML的代码还可以java的代码, 而jsp引擎自动帮我们生成jsp对应的Servlet类, 所有输出动作,由jsp引擎帮
                  我们自动生成!!!!!
        jsp中如何书写java代码
                <%%> : 生成的代码在service方法内部
                <%!%>: 在成员区域
                <%=%>: 输出页面上面,他也是service方法中,out.print(内容);
        面试:
                1.        <%
                                public void method(){
                                       
                                }
                        %>
                        分析: 这个典型错误, 因为<%%>在service方法里面, 方法不能嵌套方法
                2.
                        <%
                                private String name;
                        %>
                        分析: 这个典型错误,因为<%%>在service方法里面,不用权限修饰符修饰
                3.
                        <%! int a; %>
                        分析:正确,相当于定义一个成员变量
                4.
                        <%
                                int a;
                        %>
                        <%
                                System.out.println(a);
                        %>
                        分析: 典型错误,a是局部变量, 局部没有赋值不能使用
                5.
                        <%
                                int a;
                        %>
                        <%
                                int a = 10;
                                System.out.println(a);
                        %>
                        分析: 典型错误, 在一个方法中不能出现重名的变量
                6.
                        <%= System.out.println("你好") %>
                        分析: 典型错误, 因为<%=%> 是out.print()小括号里面的东西
                7.
                        <%
                                int a = 10;
                        %>
                        <%= a;%>
                        分析:典型错误,因为<%=%> 是out.print()小括号里面的东西
        如何学好jsp
                jsp = HTML + JAVA + 内置对象
        内置对象       
                9个内置对象
                        request
                        response
                                有缓冲区d
                        out
                                有缓冲区abc
                       
                        out.write("a");
                        out.write("b");
                        out.write("c");
                        resp.getWrite().write("d");
4.Session(HttpSession)
        服务器端的技术,说白了, 他的数据保存到服务器中,而且是一个域对象
        方法:
                setAttr...
                getAttr...
                removeAttr...
        获取:
                req.getSession();
        原理:
                服务器怎么保证张三用户拿到永远的"张三的数据"
                他底层基于cookie的, 每个客户的浏览器中保存cookie这个可以看成打开session的钥匙
        1.当浏览器关闭后,服务器不关闭,我们获取的session是不是同一个?
                答:不是, 因为session基于cookie, 而浏览器关闭后, cookie就消失了, 钥匙失效了, 在次打开浏览器,就不会带着原来的钥匙过去!!!
                解决: 我们可以延长cookie的有效时长
                面试:session的销毁时机是一次会话结束!
                答:错误的, session 默认存活时间是30min, 让session失效并不是session销毁了, 是cookie不见了!!!!
        2.当浏览器不关闭, 服务器关闭,
                获取的session不是同一个, 但是我们知道数据可以得到,tomcat有活化和钝化机制, 而且tomcat自带的!!!!!!
                注意: idea能够完成钝化, 不能完成活化, 原因是因为当idea启动之后会将work目录删除掉, 也会连钝化的文件也会被删掉
1.JSP
        1.指令
                page ---->控制jsp转成Servlet里面的代码
                        errorPage
                        lang....
                        content-type
                        buffer
                       
                include
                        可以将其他页面包含进来
                taglib
                        可以引用一些标签库
        2.注释:
                <%--  --%>
        3.JSP
                pageContext           ----> 只有在当前页面有效, 可以获取其他的八大内置对象
                request                          ----> 一次请求
                session                          ----> 一次会话
                servletContext          ----> 整个项目
                response                  ---->做响应的
                out                                 ----> 向页面输出的东西
                page                         ---->this,当前的jsp
                exception                 ---->异常对象
                servletConfig          ----->servlet配置对象
                需要大家掌握
                        pageContext
                        request
                        session
2.jsp以后只做展示数据的操作, 他的数据从Controller而来, 而Servlet是控制层的体现, 而Servlet和jsp共享数据采用域对象共享数据,
   jsp的最大的作用就是从域对象中将Servlet共享的数据获取出来展示到页面就完事了!!!!要学会el表达式和jstl就可以很方便获取数据
3.EL
        1.运算符
                算术运算符: + ,- , * ,/(div), %(mod)
                比较运算符: >,<,>=.....
                逻辑运算符: &&(and),||(or) ,!(not)
                空运算符: empty ----> 判断"字符串","数组","集合"的是否null或者长度是否为0
                三元运算:   boolean表达式 ? 表达式1 :表达式2
        2.el只能从域中获取数据
                语法:
                        requestScope  
                        pageScope
                        sessionScope
                        applicationScope
                格式:
                        字符串的键对应的字符串的值
                                格式:
                                        1.${ 域对象的代号.键名 }
                                        2.${ 键名 } ----> 从小的域开始查找直到找到为止
                                        3.${域对象['键']} ---->这是最通用的格式
                        字符串的键对应的java对象
                                格式: ${键.属性名};
                                本质:调用getter方法
                                像这种获取值的方式专业叫做"OGNL" ---->对象图导航语言, 直白说就是只要有getter方法就可以一直"点"下去!!!!但是其实调用的是对应的getXxx的方法
                                概念:
                                        属性: 指的是getXxx以及setXxx的xxx
                                        成员变量:类中方法外定义的变量
                        字符串的键对应的List集合或者数组对象
                                格式:${ 键[索引]}
                        字符串的键对应的Map集合对象
                                格式: ${键.key}
                                如果键比较特殊需要用 ${键['key']}
        3.el的隐式对象
                注意:只能在el表达式中使用
                pageContext
                requestScope  request域对象的代号
                pageScope           pageContext域对象的代号
                sessionScope
                applicationScope
                cookie                        操作cookie
                header                        请求头
                headerValues        一个键多个多个值的请求头
                param                        获取参数一个键对一个
                paramValues                获取参数一个键对应多个值的
                initParam                获取全局初始化
                注意:
                        ${ pageContext.request.contextPath}
                典型错误:
                        ${request.contextPath }
                        原因: request不是el的隐式对象,应该找pageContext.request
4.JSTL
        弥补el中的不足存在, 他的出现替换<%%>
        if: ---->重点!!!!!!
                <c:if  test="结合el表达式来去使用"></c:if>
                test:需要一个boolean值
        choose:
                <c:choose>
                        <c:when test="boolean值,el表达式"></c:when>
                        <c:otherwise></c:otherwise>
                </c:choose>
        foreach:
                遍历次数
                        var
                        begin
                        end
                        step:这个可以不加, 不加默认是1
                遍历容器
                        var
                        items
                        varStatus
               
                               




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2