第4章第4章 第4章第4章 JSP 内置对象
本课教学内容 认识 JSP 内置对象 out 对象 request 对象 response 对象 Cookie 操作 利用 session 开发购物车 session 其他 API application 对象
认识 JSP 内置对象 内置对象:指在 JSP 页面中内置的不需要定义 就可以在网页中直接使用的对象 内置对象预定义的原因 : 因为这些内置对象有些能够存储参数,有些能够提 供输出,还有些能提供其他的功能, JSP 程序员 一般情况下使用这些内置对象的频率比较高
认识 JSP 内置对象 内置对象特点 内置对象是自动载入的,因此它不需要直接实例化 内置对象是通过 Web 容器来实现和管理的 在所有的 JSP 页面中,直接调用内置对象都是合 法的
认识 JSP 内置对象 JSP 规范中定义了九种内置对象,本章主要 介绍前五种 out 对象:负责管理对客户端的输出 request 对象:负责得到客户端的请求信息 response 对象:负责向客户端发出响应 session 对象:负责保存同一客户端一次会话过程 中的一些信息 application 对象:表示整个应用的环境的信息
认识 JSP 内置对象 exception 对象:表示页面上发生的异常,可以 通过它获得页面异常信息 page 对象:表示的是当前 JSP 页面本身,就像 Java 类定义中的 this 一样 pageContext 对象:表示的是此 JSP 的上下文 config 对象:表示此 JSP 的 ServletConfig
out 对象 out 对象,对应的类型是 javax.servlet.jsp.JspWriter out 对象的作用 用来向客户端输出各种数据类型的内容 对应用服务器上的输出缓冲区进行管理
out 对象 out 输出的主要有 2 个方法: void print() void println()
out 对象 out 对象一些常用的与管理缓冲区有关的函数: void close() :关闭输出流,从而可以强制终止当 前页面的剩余部分向浏览器输出 void clearBuffer() :清除缓冲区里的数据,并且 把数据写到客户端去 void clear() :清除缓冲区里的数据,但不把数据 写到客户端去
out 对象 out 对象一些常用的与管理缓冲区有关的函数: int getRemaining() :获取缓冲区中没有被占用 的空间的大小 void flush() :输出缓冲区的数据。 out.flush() 函 数也会清除缓冲区中的数据,但是此函数先将之前 缓冲区的数据输出至客户端,然后再清除缓冲区的 数据 int getBufferSize() :获得缓冲区的大小
request 对象 request 对应类型是 javax.servlet.http.HttpServletRequest request 包含的方法 String getMethod() :得到提交方式 String getRequestURI() :得到请求的 URL 地址 String getProtocol() :得到协议名称
request 对象 request 包含的方法 String getServletPath() :获得客户端请求服务器 文件的路径 String getQueryString() :得到 URL 的查询部分, 对 post 请求来说,该方法得不到任何信息
request 对象 request 包含的方法 String getServerName() :得到服务器的名称 String getServerPort() :得到服务器口号 String getRemoteAddr() :得到客户端的 IP 地址 * 具体代码示例见课本
request 对象 request 对象获取客户端得参数常用的是通过 2 个方法: String getParameter(String name) :获得客户 端传送给服务器的 name 参数的值。当传递给此 函数的参数名没有实际参数与之对应时,则返回 null String[] getParameterValues(String name) :以 字符串数组的形式返回指定参数所有值
response 对象 response 与 reuqest 是一对相对应的内置对象, response 可以理解为客户端的响应, request 可以理 解为客户端的请求,二者所表示范围是相对应的 2 个 部分,具有很好的对称性。 response 对应的类 ( 接口 ) 是: javax.servlet.http.HttpServletResponse 。可以通 过查找文档中 javax.servlet.http.HttpServletResponse 来了解 response 的 API
利用 response 对象进行重定向 重定向:就是跳转到另一个页面 重定向方法为: response.sendRedirect( 目标页面路径 );
两种重定向方法的不同 从浏览器的地址显示上来看 forward 方法属于服务器端去请求资源,服务器 直接访问目标地址,并对该目标地址的响应内容进 行读取,再把读取的内容发给浏览器,因此客户端 浏览器的地址不变
两种重定向方法的不同 从浏览器的地址显示上来看 redirect 是告诉客户端,使浏览器知道去请求哪 一个地址,相当于客户端重新请求一 遍。所以地 址显示栏会变
两种重定向方法的不同 从数据共享来看 forward 转发的页,以及转发到的目标页面能够 共享 request 里面的数据 redirect 转发的页以及转发到的目标页面不能共享 request 里面的数据
两种重定向方法的不同 从功能来看 redirect 能够重定向到当前应用程序的其他源, 而且还能够重定向到同一个站点上的其他应用程序 中的资源,甚至是使用绝对 URL 重定向到其他站 点的资源
两种重定向方法的不同 从功能来看 forward 方法只能在同一个 Web 应用程序内的资 源之间转发请求,可以理解为服务器内部的一种操 作
两种重定向方法的不同 从效率来看 forward 效率较高,因为跳转仅发生在服务器端 redirect 相对较低,因为类似于再进行了一次请求
使用频率不是很高的一种重定向 sendError() :向客户端发送 HTTP 状态码的 出错信息
使用频率不是很高的一种重定向 常见的错误代码有: 400 : Bad Request ,请求出现语法错误 401 : Unauthorized ,客户试图未经授权访问受 密码保护的页面 403 : Forbidden ,资源不可用 404 : Not Found ,无法找到指定位置的资源 500 : Internal Server Error ,服务器遇到了无法 预料的情况,不能完成客户的请求
利用 response 设置 HTTP 头 HTTP 头一般用来设置网页的基本属性 response 的 setHeader() 方法来进行设置 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no- cache"); response.setDateHeader("Expires",0); 以上都是表示在客户端缓存中不保存页面的拷贝
Cookie 操作 Cookie 是一个小的文本数据,由服务器端生 成,发送给客户端浏览器,客户端浏览器如 果设置为启用 Cookie ,则会将这个小文本数 据保存到某个目录下的文本文件内。下次登 录同一网站,客户端浏览器则会自动将 Cookie 读入之后,传给服务器端。一般情下, Cookie 中的值是以 key-value 的形式进行表 达的
Cookie 操作 Cookie 操作主要用到以下几个方法: response.addCookie(Cookie c) :通过该方法, 将 Cookie 写入客户端 Cookie.setMaxAge(int second) :通过该方法, 设置 Cookie 的存活时间。参数表示存活
Cookie 操作 从客户端获取 Cookie 内容,主要通过以下方 法: Cookie[] request.getCookies() :读取客户端传 过来的 Cookie ,以数组形式返回
Cookie 的盗取 盗取的方法: 利用跨站脚本技术,将信息发给目标服务器;为了 隐藏 URL ,甚至可以结合 Ajax( 异步 Javascript 和 XML 技术 ) 在后台窃取 Cookie
Cookie 的盗取 通过某些软件,窃取硬盘下的 Cookie 。一般说来, 当用户访问完某站点后, Cookie 文件会存在机器 的某个文件夹下,因此可以通过某些盗取和分析软 件来盗取 Cookie
Cookie 的盗取 利用客户端脚本盗取 Cookie 。在 Javascript 中 有很多 API 可以读取客户端 Cookie ,可以将这些 代码隐藏在一个程序 ( 如画图片 ) 中,很隐秘地得到 Cookie 的值
Cookie Cookie 在 Web 编程中应用很广的原因: Cookie 的值能够持久化,即使客户端机器关闭, 下次打开还是可以得到里面的值 Cookie 可以帮助服务器端保存多个状态信息,但 是不用服务器端专门分配存储资源 Cookie 可以持久保持一些和客户相关的信息
解决 Cookie 安全的方法 方法有以下几种 替代 Cookie 。将数据保存在服务器端,可选的是 session 方案 及时删除 Cookie
解决 Cookie 安全的方法 要删除一个已经存在的 Cookie ,有以下几种方法: 给一个 Cookie 赋以空置 设置 Cookie 的失效时间为当前时间,让该 Cookie 在当 前页面的浏览完之后就被删除了 通过浏览器删除 Cookie 。如在 IE 中,可以选择 " 工具 "— —"Internet 选项 "—— " 常规 " ,在里面点击 " 删除 Cookies" ,就可以删除文件夹中的 Cookie
解决 Cookie 安全的方法 禁用 Cookie 。很多浏览器中都设置了禁用 Cookie 的方法,如 IE 中,可以在 " 工具 " ——"Internet 选项 "——" 隐私 " 中,将隐私级别设 置为禁用 Cookie
利用 session 开发购物车 购物车需求例子 想象用户去购物超市买东西时,都会推一个购物 车,购物车中包含了用户所需要购买的商品,用户 可以将商品添加到购物车,也可将商品从购物车中 取出或删除。用户可以推着购物车从这个专柜走到 那个专柜,用户也不用担心别人的购物车里面的东 西算到自己账上,这在生活中已经成为常识
利用 session 开发购物车 购物车的特点 同一个用户使用的是同一个购物车 不同的用户使用的是不同的购物车。否则,别人 买的东西就会算到自己的账上 在不同货架 ( 页面 ) 之间进行访问时,购物车中的内 容可以保持
如何用 session 开发购物车 一些 session 常用的 API 将内容放入购物车 void session.setAttribute(String name,Object obj); * 针对放入的提醒: 如果两次调用 setAttribute(String name,Object obj); 并 且 name 相同,那么后面放进去的内容将会覆盖以前放 进去的内容 setAttribute(String name,Object obj); 的第二个参数是 Object 类型,即可以放入 session 的不仅仅是一些简单字 符串,还可以是 Object
如何用 session 开发购物车 一些 session 常用的 API 读取购物车中的内容 Object session.getAttribute(String name); * 具体代码示例见课本
session 其他 API -session 的其他操作 移除 session 中的内容 session 有一个函数: void session.removeAttribute(String name); 移除 session 中的全部内容 void session.invalidate(); 预防 session 内容丢失
sessionId sessionId 的原理图
sessionId 问题: 客户在访问多个页面时,多个页面用到 session , 服务器如何知道该客户的多个页面使用的是同一个 session ? 答案 对于每一个 session ,服务器端都有一个 sessionId 来标识它 String session.getId();
利用 session 保存登录信息 例子 假如用户登录学生管理系统,登录后用户可能要 做很多操作,访问很多页面,在访问这些页面的过 程中,各个页面如何知道用户的账号呢? 答案很简单,在登录成功后,用户的账号可以 保存在 session 中。后面的各个页面都可以访问 session 内的内容
application 对象 application 原理图
application 对象 问题:购物车能用 application 实现吗? 很明显,购物车是不能用 application 实现的。因 为不同客户在服务器端访问的是同一个对象,如果 使用 application 实现购物车,客户 1 向购物车中 放了一种物品,客户 2 也可以看到,那样是不允 许的
application 对象 原理 对于一个 Web 容器而言,所有的用户都共同使用 一个 application 对象,服务器启动后,就会自动 创建 application 对象,这个对象会一直保存,直 到服务器关闭为止 对应的类 ( 接口 ) 是: javax.servlet.ServletContext
application 对象 application 对象的 API 主要有以下几个: 将内容放入 application void application.setAttribute(String name,Object obj); 读取 application 中的内容 Object application.getAttribute(String name); 将内容从 application 中移除 void application.removeAttribute(String name);
本章结束 本章总结 JSP 中的内置对象 Cookie 的使用方法 JSP 中内置对象 session 和 application 购物车的开发 上机习题