三、四种属性范围及应用
setAttribute(String name,Object o)设置属性
getAttribute(String name)根据属性名取得属性
removeAttribute(String name)根据属性名删除属性
(一)session
session范围为同一个浏览器有效。每一个浏览器连接到服务器后实际上都表示自己的session属性,所以打开一个新的浏览器无法取得以前打开的浏览器的sessions属性。
session是javax.servlet.http.HttpSession接口的实例化对象,所以session只能用在Http协议中
常用方法
方法 | 用途 |
String getId() | 取得session id |
long getCreationTime() | 取得创建session 时间 |
long getLastAccessedTime | 取得最后一次操作session时间 |
bollean isNew() | 判断是否为新session |
void invalidate() | 让session失效 |
Enumeration getAttributeNames() | 得到全部属性名 |
注意:session的生命周期是可以修改的
session应用
1、网页重写
网址重写是一种Session追踪技术,需要将一个或多个token作为一个查询字符串添加到URL中。Token的格式一般是键=值:
url?key1=value1&ke2=value2
缺点:
(1)在有些web浏览器中,URL限制2000个字符。
(2)仅当有链接要插入值时,值才能转换成后面的资源。
(3)某些字符,例如空格、&符号及问号都必须进行转码。
(4)添加到URL中的信息隐蔽性不好。
(5)网址重写必须在服务器端有效。所有的链接都必须带有值,这样可能出现一个问题,即一个页面可能有许多个链接。
2、隐藏域
利用隐藏域来保持状态,与采用网址重写技术类似。将要传递的信息放在HTML表单的隐藏域中。当用户提交表单时,隐藏域中的值也传递到服务器端。只有当页面包含表单,或者可以在页面中添加表单时,才适合隐藏域。
优势:(1)能传递更多的信息。
(2)隐蔽性更好。
(3)传递的信息不需要进行编码。
3、cookie
网页重写和隐藏域都只适合于保持哪些不需要跨越许多页面的信息。如果这些信息需要跨越很多页面,这两种技术就变得很难实现,因为必须管理每一个页面的信息。cookie能解决网页重写和隐藏域都无法解决的问题。
那什么是Cookie呢?
Cookie是浏览器提供的一种技术,它可以热情服务端的程序将一些只须保存在客户端,或者在和客户端处理的数据放在本身使用的计算机中。(安全性很差)Cookie是自动在web服务器和浏览器之间来回传递的一小块信息。Cookie适用于跨越多个页面的信息。传输的过程由HTTP协议处理。每台Web服务器最多可以支持20个cookie。
Cookie的不足之处在于,用户可以通过修改浏览器设置来拒绝接收cookie。
要使用Cookie,必须熟悉javax.servlet.http.cookie类,以及HttpServletRequest和HttpServletResponse接口中的几个方法。
方法 | 描述 |
Cookie(String name,String value) | 构造Cookie对象,同时设置名称和内容 |
String getName() | 取得Cookie的名称 |
String getValue() | 取得Cookie的内容 |
void setMaxAge(int expiry) | 设置Cookie保存时间,单位s |
void addCookie(C哦Okie cookie) | 向客户端设置Cookie |
Cookie[] getCookie() | 取得客户端设置的全部Cookie |
一个浏览器最多保存300个Cookie,要设置Cookie的保存时间才能真正在浏览器保存Cookie,系统会在每一个客户端访问服务器时自动设置一个Cookie
(二)page
只在一个页面内有效,跳转之后就无效了
在javax.servlet.jsp.PageContext的setAttribute(String name,Object o,int scope)方法还可以指定保存范围
public static final int PAGE_SCOPE page属性范围,默认
public static final int REQUEST_SCOPE request属性范围
public static final int SESSION_SCOPE session属性范围
public static final int APPLICATION_SCOPE application属性范围
(三)request
只在一次请求中保存,服务器跳转后有效(客户端跳转无效,如超链接跳转)
request是javax.servlet.http.HttpServletRequest接口的实例化对象,而HttpServletRequest是ServletRequest的子接口,所以查找request对象的方法时可一从这两个接口的方法中找
常用方法:
1 | Sting getParameter(String name) | 取得参数内容 |
2 | Sting[] getParameterValues(String name) | 取得一组参数的内容 |
3 | Enumeration getParameterNames() | 取得全部参数名称 |
4 | void setCharacterEncoding(String env) | 设置请求编码 |
5 | HttpSession getSession() | 取得sessin对象 |
6 | StringBuffer getRequestUrl() | 返回正在请求的路径 |
7 | boolean isUserInRole(String role) | 用户验证 |
8 | Enumeration getHeaderNames() | 获取全部头信息 |
9 | String getHeader(String name) | 根据名称获取头信息 |
10 | String getMethod() | 获取用户提交方式 |
11 | String getServletPath() | 获取访问路径 |
12 | String ContextPath() | 获取上下文 |
13 | String getRemoteAddr() | 获取客户端ip地址 |
方法 | 作用 |
一般还需要request.setCharacterEncoding("GBK")设置中文编码防止乱码
说到request那就必须说说response对象了
response
response是javax.servlet.http.HttpServletResponse接口的实例
常用方法:
方法 | 描述 |
void addCookie(Cookie cookie) | 向客户端增加cookie |
void serHeader(String name,String value) | 设置回应头信息 |
void sendRedirct(String location)throws IOException | 页面跳转 |
response.serHeader("refresh",3;URL=");//设置头信息名,3秒后跳转到指定的url(属于客户端跳转)
response.serHeader("refresh",3");//设置3秒刷新一次
response.setHeader("Set-Cookie","MLDN=www.wawawa.com");//设置Cookie
response.sendRedirct和<jsp:forward>的区别
response.sendRedirct属于客户端跳转,跳转后地址栏地址会改变,<jsp:forward>是服务端调转;而且在使用request属性时只有服务端跳转才能将request属性保存到跳转页;服务端跳转会在该跳转语句直接执行,客户端跳转则是在整个页面执行完后才跳转。
(四)application
在服务器上保存,所有用户都可以使用
application对象是javax.servlet.ServletContext接口的实例化对象,可以由getServletContext()方法代替
常用方法
方法 | 描述 |
StringgetRealPath(String path) | 得到虚拟目录的绝对路径 |
String getContextPath() | 取得当前虚拟目录的名称 |
Enumeration getAttributeNames() | 取得所有属性名称 |