WEB-11-JSP-cookie session 作用域 标签技术

一、JSP01
1.概述
jsp其实是java的动态页面技术
HTML可以用来组织页面但是HTML是一种静态web资源技术 无法嵌入动态数据。
Servlet是动态web资源技术 但是本质上是一段java代码 不方便在其中组织页面结构。
于是jsp技术被提出来 写起来就像在写一个html,但是内部可以嵌入java代码,本质上是一种动态web资源 但是可以直接写html标签 非常便于组织页面结构。
jsp解决了 动态页面开发的问题。
真正的开发中 往往使用Servlet来处理业务逻辑 将处理好的结构 带到jsp页面 由jsp页面负责展示。


2.原理
jsp会在第一次被访问的时候 被翻译成一个Servlet 之后对这个jsp的访问 本质上都是这个Servlet在执行。
所以眼睛里看的是个jsp 心里要明白其实是个Servlet在执行。


3.JSP基本组成结构
(1)模版元素
在jsp页面中直接编写的HTML内容 组成了jsp的结构 这些html内容称之为jsp的模版元素
在被翻译成Servlet的过程中 被 直接 out.write 原样输出到浏览器页面


(2)脚本表达式 <%= java表达式 %>
在jsp页面中可以通过脚本表达式 来将一个java表达式计算的结果输出到中
在被翻译成Servlet的过程中 直接被out.print()输出 表达式计算完的结果


(3)脚本片段 <% 若干java语句 %>
在jsp页面中可以通过脚本片段直接写入一段java代码
在被翻译成Servlet的过程中 脚本片段原样 被复制粘贴到对应位置 直接执行


注意:同一个页面中 多个脚本片段 后面的可以看到前面定义的变量
注意:一个脚本片段可以不完整 但是要保证整个页面 翻译过来的Servlet中 语法要完整


(4)JSP声明 <%! %>
可以通过JSP声明为翻译过来的Servlet增加类的成员。
在jsp声明中声明的内容 会在被翻译成Servlet的过程中 被放置到和Service方法同级的位置 成为类的成员。




(5)JSP注释 <%-- --%>
可以通过JSP注释将jsp中的部分内容注释掉 
被注释的内容不会被翻译到Servlet中


注意:在jsp页面中可能出现如下三种注释
jsp注释  <%-- --%>  不会被翻译到Servlet
java注释 <% //String str = "abc"; %> 被翻译到Servlet中 但是java代码被注释 不会被执行
html注释 被翻译到Servlet中当作模版元素直接输出到浏览器


Servlet擅长写java代码处理业务逻辑但是不擅长输出页面 Jsp擅长输出页面但是不擅长处理业务逻辑
所以在真正的开发中 往往 将请求提交到Servlet中 进行业务处理 通过请求转发利用request域将结果发给 JSP ,JSP负责展示。




一、会话技术
1.会话概述
一个浏览器 为了实现某一个功能  对服务器产生了多次请求响应。从第一个请求开始访问服务器,会话开始,到最后一个页面访问结束 关闭所有页面,这个过程中的所有的请求响应加在一起称之为 浏览器和服务器之间产生了一次会话。


会话技术中 最重要的问题就是会话产生的数据 如何保存。


request域 - 不行 - 太小了 - 每次请求响应都是一个新的request 后续的请求中无法看到之前请求request里存放的数据
servletContext域 - 不行 - 太大了 - 所有的会话 看到的都是同一个ServletContext域 所有会话的数据混杂在一起 必然混乱


cookie - 将会话产生的数据存放在客户端


session - 将会话产生的数据存放在服务器端



2.Cookie
Cookie是客户端技术 将会话产生的数据保存在客户端中
当浏览器访问服务器 服务器可以通过在响应中增加set-Cookie的响应头 命令浏览器保存一段cookie信息
浏览器会将cookie信息保存在本地 之后再去访问服务器时 会自动在请求中 通过cookie请求头 带着cookie信息
服务器可以通过解析请求中的cookie请求头 获取信息 从而获取到了之前保存的会话相关的数据


案例:
展示上一次访问时间




为了方便cookie的开发,java专门提供了一套和cookie相关的api


Cookie类的基本方法
//Cookie没有无参的构造 cookie创建时就必须指定好cookie的名字和cookie的值
Cookie cookie = new Cookie(String name,String value);


//Cookie的名字只能获取 不能修改
String getName()
String getValue(String name)
String setValue(String name ,String value)


//向响应中加入cookie
response.setCookie(Cookie c);


//从请求中获取cookie
Cookie [] request.getCookies();

Cookie保存的时长
如果不设置 默认Cookie会被保存在浏览器的内存中 浏览器什么时候关 Cookie什么时候消失 这种cookie称之为会话级别的cookie
也可以通过代码来设置cookie的保存时长


//指定浏览器 将cookie保存到什么时候 浏览器收到的cookie信息中如果包含了 指定的超时时间 浏览器就会cookie信息以文件的形式保存到浏览器的临时文件夹中 保存到指定的时间 这段时间内该文件一直存在 即使多次开关浏览器 仍然能够看到此cookie
setMaxAge(int time)
int getMaxAge()


Cookie在访问哪些路径时携带cookie
如果不设置 则在访问发送cookie给浏览器的Servlet的父一级目录及其子孙目录时 会携带这个cookie
http://localhost/Day12/servlet/LastTimeServlet2
-->
http://localhost/Day12/servlet/




//可以通过方法设置浏览器在访问哪些路径时携带此cookie
setPath(String path)
String getPath()



删除cookie
如果想要删除cookie 需要发送一个 和要删除的cookie的名字相同 path相同 但是maxAge被设置为0的 cookie
这样一来 名字相同 path也相同 浏览器收到cookie后 覆盖原来的cookie 只有 立即超时 自动被浏览器删除掉
从而间接的实现了删除cookie的操作




cookie其他
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除(浏览器通过cookie的name+path来标识一个cookie)


案例:EasyMall登陆功能记住用户名



3.Session
Session是服务器端会话数据保存技术
服务器在需要时 可以为每个用户创建独一无二专为该用户服务的session对象 在其中保存该用户会话相关的数据
之后该用户再来访问服务器时 可以找到之前创建的属于他的session 从中找到之前存入的数据 从而实现会话数据的保存
由于每个用户各自有各自的session 每个session只为对应的用户服务 数据不会混乱。


Session是一个域对象
生命周期
当第一次调用request.getSession()方法时表明 会话中需要用到session了,此时服务器创建session对象,一直驻留在内存中为当前会话服务。


自杀 - 可以明确的调用session.invalidate()立即杀死session。
超时 - 如果一个session超过30分钟 没人用 则 服务器认为会话超时 杀死会话对应的session
意外身亡 - 当前web应用销毁时,session跟着被销毁。
作用范围
整个会话
主要功能
在会话范围内共享数据


创建、获取Session
request.getSession()
操作域
session.setAttribute()
session.getAttribute()
session.removeAttribute()
杀死session
session.invalidate()






案例:利用session实现登录 注销
所谓的登录,其实就是根据用户提交 的用户名和密码 检查数据库 
如果不正确就提示 如果正确 就创建session 保存该用户的登录标记
之后的访问中可以通过检查登录标记 获知当前用户是否登录 如果登录过 该用用户是谁


所谓的注销其实就是杀死session 使session中的登录标记失效

案例:验证码校验 数据的回显
ValiImgServlet --> 生成验证码时 将验证码的内容 存入 session中备用
regist.jsp --> 注册时填写了注册表单 其中有验证码 跟着被提交
RegistServlet -> 从请求参数中获取用户提交的验证码 从session中获取当初发给他的验证码 两个进行比较 如果不一致 中止注册过程 提示用户 验证码不正确 如果两个一致 验证码正确 继续注册流程
regist.jsp --> 如果验证码校验不通过 回到注册页面 要从request域中获取错误消息 进行提示
如果验证码校验不通过 回到注册页面 进行数据的回显 -- 将之前提交的表单的数据 显示回来 


原理
session是基于一个叫做jsessionid的cookie工作的


当浏览器访问服务器 调用到 request.getSession时 此方法会检查请求中是否 有叫做jsessionid的cookie
如果没有 则说明这时这是第一次用到session 创建session使用 并将session id 作为jsessionid cookie 发送给浏览器保存
浏览器在后续的访问中 就会带着这个jsessionid 来访问
后续再调用到 request.getSession 时 此方法检查请求中 是否有叫做jsessionid的cookie 发现有 则在内存中倒找id对应的session使用
如果找不到 说明session 已经被销毁 则创建新的session使用个 并在响应中再通过cookie发送新的jsessionid

**了解即可**如果禁用了cookie session也就用不了了 - 可以通过URL重写来解决
如果禁用了cookie 浏览器不再基于cookie来保存jsessionid 在服务器无法获取到jsessionid 也就无法找对应的session 
所以想解决这个问题 就需要想办法 将jsessionid的值 带给服务器
此时可以使用URL重写的技术来实现
所谓的URL的重写 就是 将地址 改写 在地址后使用特殊的参数 携带jsessionid的技术 
虽然cookie用不了了 但是 通过地址 仍然可以携带jsessionid的信息 从而使用session


这个技术 需要将应用中所有的地址都要进行URL重写 相对来说非常麻烦
而这么麻烦带来的唯一的好处是 禁用cookie后仍然可以使用session 似乎并不值得这么麻烦
所以 现在很多网站 都不会去做URL重写 对于禁用cookie的情况 不处理 或者 检测到用过户禁用cookie就引导用户 打开浏览器的cookie 再来使用网站


response.encodeURL(String url);
//--如果是普通的地址用这个方法
response.encodeRedirectURL(String url);
//--如果地址是用来进行重定向的,用这个方法


4.cookie和session的区别
cookie将会话相关数据保存在客户端 session将会话相关的数据保存在服务器端
cookie可以保存的时间比较长 session超过30分种没人用就销毁
cookie有可能随着用户的操作被清除 session只要不手动删除 在存活期间可以可靠的访问
cookie将信息保存在浏览器中 可以通过翻临时文件夹 查看cookie中的数据 不安全 session将会话相关的数据保存在服务器内存中 安全性高很高。


如果需要将会话数据保存的很久 -- cookie
如果希望会话数据不会因为用户的操作丢失 -- session

如果会话数据比较在意安全性 -- session


========================================================================================================================================
路径专题:
相对路径:不以/开头的路径称为相对路径,相对路径是基于当前路径进行计算得到的一个路径。其中可以通过../表示上一级目录。
绝对路径:以/开头的路径称为绝对路径,绝对路径是在一个参考路径上直接拼接而得到的路径。
盘符开始的绝对路径(硬盘路径):直接从盘符开始,说是哪就是哪。


WEB阶段路径编写:
虚拟路径:
写绝对路径,不到万不得已不要用相对路径。
写绝对路径的情况下,如果路径是个浏览器用的则参考路径是当前虚拟主机,一定要写应用名。如果路径是给服务器用的则参考路径是当前web应用,应用名层一定不要写。
request.getRequestDispatcher("/index.jsp").forward();
request.getRequestDispatcher("/index.jsp").include();
response.setHeader("refresh","1;url=/Day08/index.jsp");
response.setHeader("Location","/Day08/index.jsp");
response.sendRedirect("/Day08/index.jsp");




你可能感兴趣的:(WEB,标签技术,作用域,cookie,session)