四大作用域
凡是作用域都有如下方法
setAttribute(name,value);name是String类型,value是Object类型; |
往域对象里面添加数据,添加时以key-value形式添加 |
getAttribute(name); |
根据指定的key读取域对象里面的数据 |
removeAttribute(name); |
根据指定的key从域对象里面删除数据 |
1.pageContext
1.1定义:
pageContext对象是JSP中很重要的一个内置对象,不过在一般的JSP程序中,很少用到它。它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。
详细解释:
-
jsp内置对象:JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。在JSP页面中,可以通过存取JSP内置对象实现与JSP页面和Servlet环境的相互访问。每个内部对象均有对应所属的ServletAPI类型。
JSP内置对象包括request对象、response对象、session对象、out对象、application对象、page对象、exception对象、pageContext对象、config对象。这些对象在客户端和服务器端交互的过程中分别完成不同的功能。
范围最小的一个域,可以获取其他八大内置对象,能够获取其他所有域中的数据。能跳转到其他资源它旨在当前页面有效,也就是用户请求的页面有效,当前页面跳转、重定向、定时刷新、关闭的时候,page对象将在响应回馈给客户端之后就释放(销毁)。
2.request(详解)
2.1定义
request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request
request的功能可以分为以下几种:
- 封装了请求头数据
- 封装了请求正文数据,如果是GET请求,那么就没有正文
- request是一个域对象,可以把它当成Map来添加获取数据
- request提供了请求转发和请求包含功能
2.2 request域对象的使用
一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。前一个Servlet来setAttribute传值,后一个Servlet来getAttribute获取值
void setAttribute(String name, Object value) |
用来存储一个对象,也可以称之为存储一个域属性 |
例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
Object getAttribute(String name) |
用来获取request中的数据,当前在获取之前需要先去存储才行 |
例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;
void removeAttribute(String name) |
用来移除request中的域属性 |
如果参数name指定的域属性不存在,那么本方法什么都不做
Enumeration getAttributeNames() |
获取所有域属性的名称 |
它在当前请求中有效。作用域一次HTTP请求到服务器处理结束,返回响应的整个过程。request可以通过 setAttribute() 方法实现页面中的信息传递,也可以通过 forward() 方法进行页面间的转跳到多个jsp页面中,一旦刷新页面,它们将重新计算。
2.3生命周期
- 当请求来时创建request对象
- 当请求结束时,request就销毁。
- 每次请求都是一个新的request对象。
request域对象,是建议使用,并被频繁使用的域对象,因为它声明周期比较短,也就代表着,它效率比较高,释放资源比较及时。
2.4 获取请求头数据
request与请求头相关的方法有:
String getHeader(String name):获取指定名称的请求头;
Enumeration getHeaderNames():获取所有请求头名称;
int getIntHeader(String name):获取值为int类型的请求头。
request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。
int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
String getMethod():返回请求方法,例如:GET
Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
String getContextPath():返回上下文路径,例如:/hello
String getQueryString():返回请求URL中的参数,例如:name=zhangSan
String getRequestURI():返回请求URI路径,例如:/hello/oneServlet
StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;
String getServletPath():返回Servlet路径,例如:/oneServlet
String getRemoteAddr():返回当前客户端的IP地址;
String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
String getScheme():返回请求协议,例如:http;
String getServerName():返回主机名,例如:localhost
int getServerPort():返回服务器端口号,例如:8080
3.session(详解)
3.1定义
服务器为了保存用户状态而创建的一个特殊的对象
当浏览器第一次访问服务器时,服务器会创建一个session对象(该对象会拥有一个唯一id,一般称作sessionId),服务器会将sessionid以cookie的方式发送给浏览器.当浏览器再次访问服务器的时候,服务器会将session对象发送过来,服务器根据sessionId就可以找到session对象。
3.2 获取session对象
HttpSession s = request.getSession(boolean flag); |
---|
注: HttpSession是一个接口。
当flag为true时:先查看请求当中是否有sessionId,如果没有, 则创建一个session对象。
如果有,则依据sessionId查找对应的session对象,如果找到了,则返回该对象,
如果找不到,创建一个新的session对象。
当flag为false时:先查找请求当中是否有sessionId,如果没有,返回null。
如果有,则依据sessionId查找对应的session 对象,如果找到了,则返回该对象,如果找不到,返回null。
HttpSession s = request.getSession(); |
---|
3.3 Session常用方法
resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
setAttribute(String s, Object o):在session存放属性
getAttribute(String s):从session中得到s所对应的属性
removeAttribute(String s):从session中删除s对应的属性
getId():得到session所对应的id
invalidate():使session立即无效
setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。
4.application
第四个作用域是application,它所在的所有应用程序中都有效,如果不进行手工删除,它们将一直可以使用,也就是当服务器开始到服务器结束的这段时间,application作用域中存储的数据都是有效的,所有用户均可使用。同样,可以通过 setAttribute() 赋值和 getAttribute() 取值。
ServletContext 与application的异同
相同:两者其实是一样的,相当于一个类创建了两个不同名称的变量
servlet中ServletContext就是application对象。
不同:两者的区别就是application用在jsp中,servletContext用在servlet中。application和page request session 都是JSP中的内置对象,在后台用ServletContext存储的属性数据可以用 application对象获得。