JSP中四种属性pagecontext request session applcation的解释
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP中四种属性pagecontext request session applcation的解释相关的知识,希望对你有一定的参考价值。
先声明这是转的 不是我自己写的: JSP由于其强大的生命力在web开发中有很广泛的应用,实际上在JSP开发中,JSP程序中只占用了很少的一部分,大部分是由JavaBean完成的,通过JavaBean可以封装业务逻辑,数据库处理等等,由于有了JavaBean才使得程序更为健壮,易于扩展。所以,详细的了解JavaBean的基础,对于我们开发出高质量的JSP应用程序是很有帮助 [一、JavaBean在JSP中的基本语法] JSP中JavaBean是通过标签<jsp:useBean>来声明实现的,基本语法如下: <jsp:userBean id="beanName" class="className" scope="page/request/session/application></jsp:userBean> 由于我们讨论的是生存周期,在上面语法中通过scope属性来实现的: scope="page/request/session/application scope的值代表 JavaBean的生存周期,也就是JavaBean的实例id在JSP程序中存在的范围。下面看看具体的scope四个值的含义: page-JavaBean对象保存在pageContext对象中,有page范围JavaBean实例只能在当前创建这个JavaBean的JSP文件中进行操作, 这个实例只有在请求返回给客户端后或者转移到另外的JSP页面后才会释放掉。page范围的JavaBean常用于进行一次性操作的JavaBean,这样的Bean用的最多,比如大部分表单提交,Bean的一些计算处理等都可以使用page范围的JavaBean request-JavaBean对象保存在request对象中,有request范围的JavaBean实例可以在处理请求所有JSP页面中都存在,这个对象只有在请求全部处理完毕后才会被释放掉,request范围的JavaBean常用于共享同一次请求的JSP页面中,比如判断用户登录功能,如果用户名密码合法就可以forward到一个合法页面中,否则就forward到一个出错页面,当然转移后的页面仍然能够得到用户的输入。 session-JavaBean对象是保存在session范围的JavaBean实例的生存周期是整个session,只有当session过期后才能释放掉,这样常用于共享同一session的JSP页面,比如购物车一般就是放在session中的或者登陆后的用户信息等也可以在session中,注意<%@page标签中不要设置session=false,否则在这个JSP页面中session将不会起作用,幸好JSP默认session=true,所以可以不必管它了。application-JavaBean对象保存在application对象中,有application范围的JavaBean对象的生存周期是整个application。这就意味着这样的JavaBean的生存周期是整个应用程序,当web Server停掉才会消失掉。这样的常用于共享同一application的JSP程序中,比如程序中一些经常用到配置东西如数据库连接URL,全局的计数器或者是聊天室中人员信息等。 [二、scope的具体应用] 上面讲了这么多,大家应用对JavaBean的生存周期有个基本的概念了,在这里我们结合几个简单的例子来看看scope在JavaBean中应用,以便大家能对scope有更深的了解,用来演示的是一个简单的积分处理程序,初始化为o,每一次访问会将积分加上10,我们使用了一个JavaBean文件,用于数值计算处理的,然后在前台使用几个scope设置不同的JSP文件调用这个JavaBean。 <核心的JavaBean文件> public class scope //初始化成员变量,scope_count代表积分分值 int scope_count=10; public scope() //构造方法 public int TestNumber() scope_count+=10; return scope_count; //设置scope_count的值 public void setNumber(int ber) scope_sount=number; <page范围的演示> 下面是为了演示page范围的JSP文件page.jsp文件。 page.jsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>page范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="page" class="com.scope"/> <body> page范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 out.println(jinqiao.TestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果总是积分为20,这就说明了TestNumber方法只被执行了一欠,因为jinqiao对象的生存范围是page的,所以只在这个页面有效,每一次调用这个JSP页面都会重新生成一个jinqiao对象,当然积分不会变化了。 <request范围的演示> 下面是为了演示request范围的JSP文件request.jsp。 request.jsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>request范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="request" class="com.scope"/> <body> page范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 out.println(jinqiao.setNumber(18));%> <jsp:forward page=request.jsp/> </center></body></html> request1.jsp <%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>page范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="request" class="com.scope"/> <body> request范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 out.println(jinqiao.TestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果总是积分为28为什么会有这样一个结果呢,因为首先我们在request.jsp文件中调用了jinqiao对象setNumber方法设置积分值为18,然后我们将请求转移到request1.jsp页面,因为同一相应还没有处理完毕,所以在request1.jsp中得到的仍然是同一个jinqiao实例,然后通过jinqiao的TestNumber方法将jinqiao的积分18+10,所以就得到了28了。注意的是<jsp:forward>标签是用来将请求转移的两个页面中的Bean声明包括id名字,request范围等要一模一样才行,这样JSP程序才会认为你要调用的是同一个JavaBean实例 <session范围的演示> 下面是为了演示session范围的JSP文件session.jsp文件, session.jsp ?<%@ page contentType="text/html";charset=gb2312"%> <html><head> <title>session范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="session" class="com.scope"/> <body> session范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 out.println(jinqiao.TestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果是变化的,开始时是:您当前的积分为20,然后就是30,40.。。,这就说明了TestNumber()方法被执行了多次,因为jinqiao对象生存范围是session的,所以在整个session有效,每一次刷新这个jsp页面都会调用同一个jinqiao对象,所以积分都是同一个了, 另外,为了更方便的理解session,可以将上面的session.jsp文件完整的拷贝一份生成session1.jsp文件,在浏览器中执行session.jsp文件,看积分值的变化,然后还使用同一个浏览器,输入session1.jsp文件,你会发现session1.jsp和session.jsp文件的积分值是一模一样的。重新开一个浏览器,注意不用浏览器菜单功能,而是直接从桌面双击一个IE浏览器,而两个浏览器分别运行session.jsp,session1.jsp文件,刷新多次后,你会发现两个浏览器的积分值不一样了,为什么呢?很简单,因为重新打开一个浏览器就相当于重新开一个session。session不同,积分值当然也不同了。 <application范围的演示> application.jsp ?<%@ page contentType="text/html";charset=gb2312"%> <html> <head> <title>application范围积分程序演示</title> </head> <!--初始化JavaBean并生成一个scope的实例--> <jsp:useBean id="jinqiao" scope="application" class="com.scope"/> <body> session范围积分程序演示<br> <center>您当前的积分为<%//调用scope中的TestNumber方法得到当前积分 out.println(jinqiao.TestNumber());%> </center> </body> </html> 好了,启动web服务器,然后运行这个程序,使用浏览器并点击刷新按钮,看屏幕的变化,你会发现结果是变化的,和前面的session几乎一样,开始时,你当前的积分为20,然后就是30、40.。。,这就说明了TestNubmer()方法被执行了多次,但是它和session有什么不同呢? 为了解决这个问题,可以将上面的application.jsp文件完整的拷贝一份生成application.jsp文件,重新开一个浏览器,注意不用浏览器的菜单功能,而是直接从桌面双击一个IE浏览器,两个浏览器分别运行application.jsp和application1.jsp文件中,刷新多 次后,你会发现两个浏览器的积分值完全一样,这就是application的区别了,很简单因为重新打开一个浏览器只是重新开了一个session,application是针对于整个服务器应用程序而言的,应用程序没有关闭,jinqiao对象是全局的,所以积分值当然一样了,只有将web服务器重新启动后,才会重新生成一个jinqiao对象,积分值才会重新计算。 [三、总结] 本文重点阐述了JSP中的JavaBean的生命周期(scope)问题,到这里,通过前面的例子演示相信大家对于JavaBean的生成周 期概念已经比较熟悉了,只要再经过一段时间的实际应用,相信大家对于JSP中使用JavaBean都得心应手。~ 参考技术A request是封装client端(也就是用户通过browser)提交的请求数据和属性的对象。response是封装web server端响应数据和属性的对象。
pageContext,request,session,application是指变量(对象)的生命周期。
我们经常会将pageContext、request、session和application混为一谈,因为它们都可以通过setAttribute()和getAttribute()来设定或读取属性。但它们之间是有别的,它们最大的区别在于使用范围。
pageContext对象的范围只适用于当前页面范围,即超过这个页面就不能够使用了。所以使用pageContext对象向其它页面传递参数是不可能的。
request对象的范围是指在一JSP网页发出请求到另一个JSP网页之间,随后这个属性就失效。
session的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性就无效。比如断网或者关闭浏览器。
application的范围在服务器一开始执行服务,到服务器关闭为止。它的范围最大,生存周期最长。
JSP九大内置对象和四种属性范围解读
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
摘要:本文首先主要解说了JSP中四种属性范围的概念、用法与实例。
然后在这个基础之上又引入了九大内置对象,并对这几大内置对象一个一个的进行分析的解读。内容非常具体,例子都附有代码和执行的结果截图。
一、四种属性范围
1.1、在JSP中提供了四种属性保存范围
page:在一个页面内保存属性。跳转之后无效
request:在一次服务请求范围内。server跳转后依旧有效
session:-在一次会话范围内,不管何种跳转都能够使用,可是新开浏览器无法使用
application:在整个server上保存,全部用户都能够使用
1.2、4种属性范围都支持的操作
public void setAttribute(String name,Object value) public Object getAttribute(String name) public Object removeAttribute(String name)
以下。我们来对四种范围来分别进行具体的介绍
1.3、page范围
在JSP中设置一个页的属性范围,必须通过pageContext完毕,PageContext属性范围是最重要的JSP属性之中的一个。可是假设使用纯粹的JSP代码开发,此属性显示不出用处。其发挥作用在 Struts ,WebWork 中
例如以下:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //设置page属性范围,此属性仅仅在当前JSP页面内起作用 pageContext.setAttribute("name", "linbingwen"); pageContext.setAttribute("time", new Date()); %> 姓名:${pageScope.name}<br> 时间:${pageScope.time}<br> </body> </html>${pageScope.name}这里用了EL表达式来取得值,输出结果例如以下。
这里要注意发果在其它页面使用:
例如以下:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 姓名:${pageScope.name}<br> 时间:${pageScope.time}<br> </body> </html>输出结果:
这说明page范围的值仅仅能在本页使用。
1.4、request属性范围
request将属性保存在一次请求范围之内:
前提:必须使用server端跳转:<jsp:forward/> 应用点:MVC设计模式、Struts、 Webwork
应用实例
首先是设置request:
request.jsp
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //设置request属性范围 request.setAttribute("name", "linbingwen"); request.setAttribute("time", new Date()); %> <jsp:forward page="requestResult.jsp"/> </body> </html>
然后是显示requestResult.jsp
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 获取request姓名:${requestScope.name}<br> 获取request时间:${requestScope.time}<br> </body> </html>
訪问结果:
这时比方requestResult1.jsp也想来訪问这两个属性
内容和requestResult.jsp一样:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 获取request姓名:${requestScope.name}<br> 获取request时间:${requestScope.time}<br> </body> </html>
结果例如以下。说明request仅仅针对server跳转有效,在两次跳转之间保存。
1.5、session属性范围
session:仅仅要设置上去,则不管是什么跳转,都能够取得属性。主要用于验证用户是否登陆。
EMAIL--->用户须要先进行登陆,登陆成功后再编辑邮件。与session有关的不论什么打开的页面都能够取得session
比方session.jsp设置例如以下:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //设置session属性范围 session.setAttribute("name", "linbingwen"); session.setAttribute("time", new Date()); %> <a href="sessionResult.jsp">获取session内容</a> </body> </html>然后是取出sesson的值sessionResult.jsp
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 获取session姓名:${sessionScope.name}<br> 获取session时间:${sessionScope.time}<br> </body> </html>输出结果:
假设另一个sessionResult1.jsp和sessionResult.jsp一例子如以下
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //设置request属性范围 session.setAttribute("name", "linbingwen"); session.setAttribute("time", new Date()); %> <a href="sessionResult.jsp">获取session内容</a> </body> </html> 然后是取出sesson的值sessionResult.jsp <%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 获取session姓名:${sessionScope.name}<br> 获取session时间:${sessionScope.time}<br> </body> </html>
注意看上面的GIF动画和这里的获取到的时间是一样的,这也说明了这两个jsp页面取得了同一个值
1.6、application属性范围
仅仅要设置一次。则全部的页面窗体都能够取得数据。这里的值将会保存在server上,所以每一个用户都能够看见。
如以下application.jsp:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //设置request属性范围 application.setAttribute("name", "linbingwen"); application.setAttribute("time", new Date()); %> <a href="applicationResult.jsp">获取application内容</a> </body> </html>
然后是applicationResult.jsp
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 获取application姓名:${applicationScope.name}<br> 获取application时间:${applicationScope.time}<br> </body> </html>
输出结果:
假设这时在新建一个网页或新建一个新的web项目。可是它们两个要执行在同一个Tomcat中,那么它相同也能訪问到这个值。
注意:
pplication、session、request--==--》都与要跨多个页,属性保存是有内存开销的。设置过多的application或每一个session保存过多的对象,性能就减少了。
原则:能用request就不要用session。能用session就不要用application
application应用:在线人员统计、在线人员名单列表,要释放application资源,仅仅能又一次启动server.
使用application缓存数据库的连接,每次使用时。从缓冲中取出,用完就返回。
二、JSP九大内置对象具体解释
内置对象(又叫隐含对象。有9个内置对象):不须要预先声明就能够在脚本代码和表达式中任意使用
JSP内置对象映射表
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
2.1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了client的请求信息。主要用于接受通过HTTP协议传送到server的数据。(包括头信息、系统信息、请求方式以及请求參数等)。request对象的作用域为一次请求。
实现常有的方法
1、获取数据
getParameter;;接收请求參数的,
2、对全部数据进行再编码
public byte[] getBytes(“encoding”)例如以下实例将byte数组编码转换
<%@ page contentType="text/html";charset=gbk"%> <html> <body> <% //接收内容 String name=request.getParameter("uname"); byte[] b=name.getBytes("ISO8859-1"); name=new String(b); String name= new String(request.getParameter("uname").getBytes("ISO8859-1")); %> <h1>输入内容为:<%=name%></h1> </body> </html>
3、设置统一的请求编码
public void setCharacterEncoding(String env) throws UnsunpportedEncodingException例如以下设置
<%@ page contentType="text/html";charset=gbk"%> <html> <body> <% //接收内容 request.setCharacterEncoding("GBK"); String name= request.getParameter("uname"); %> <h1>输入内容为:<%=name%></h1> </body> </html>
4、获取requst信息:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body bgcolor="#FFFFF0"> <form action="" method="post"> <input type="text" name="name"> <input type="submit" value="提交"> </form> 请求方式:<%=request.getMethod()%><br> 请求的资源:<%=request.getRequestURI()%><br> 请求用的协议:<%=request.getProtocol()%><br> 请求的文件名称:<%=request.getServletPath()%><br> 请求的server的IP:<%=request.getServerName()%><br> 请求server的端口:<%=request.getServerPort()%><br> clientIP地址:<%=request.getRemoteAddr()%><br> client主机名:<%=request.getRemoteHost()%><br> 表单提交来的值:<%=request.getParameter("name")%><br> </body> </html>
我们第一次訪问是默认用GET方法,表单提交后使用POST方式。
2.2、response对象
response 代表的是对client的响应,主要是将JSP容器处理过的对象传回到client。
response对象也具有作用域。它仅仅在JSP页面内有效。response对象的主要使用1.设置HTTP头信息、重定向、设置COOKie
(1).Webserver收到一个http请求,会针对每一个请求创建一个HttpServletRequest和HttpServletResponse对象,向client发送数据找HttpServletResponse,从client取数据找HttpServletRequest;
(2).HttpServletResponse对象能够向client发送三种类型的数据:a.响应头b.状态码c.数据
2.2.1、response对象所提供的方法。
(1)设定表头的方法
void addCookie(Cookie cookie) 新增cookie void addDateHeader(String name, long date) 新增long类型的值到name标头 void addHeader(String name, String value) 新增String类型的值到name标头 void addIntHeader(String name, int value) 新增int类型的值到name标头 void setDateHeader(String name, long date) 指定long类型的值到name标头 void setHeader(String name, String value) 指定String类型的值到name标头 void setIntHeader(String name, int value) 指定int类型的值到name标头 containsHeader( String name )推断指定名字的HTTP文件头是否已经存在。然后返回真假布尔值(2)设定响应状态码的方法
void sendError(int sc) 传送状态码(status code) void sendError(int sc, String msg) 传送状态码和错误信息 void setStatus(int sc) 设定状态码(3)用来URL 重写(rewriting)的方法
String encodeRedirectURL(String url) 对使用sendRedirect( )方法的URL予以编码(4)设置重定向
sendRedirect():设置重定向页面.2.2.2、使用范例
(1)使用response对象能够设置HTTP的头信息。
格式response.setHeader(“头信息名称”,”參数”),当中一个重要的头信息:refresh(刷新)。比如。每秒刷新一次也没。显示刷新次数:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%!int i=0; %> <% //每秒刷新一次 response.setHeader("refresh","1"); %> <%=i++ %> </body> </html>输出结果例如以下:
(2)重定向
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% response.setHeader("refresh","3;URL=index.jsp") ; %> 三秒后跳转!来输出结果看看:!
!
<br> 假设没有跳转。请按<a href="index.jsp">这里</a>!!
! </body> </html>
输入http://localhost:8080/JspLearning/responseObject1.jsp,三秒后自己主动跳转到http://localhost:8080/JspLearning/index.jsp
当然还能够使用response.sendRedirect("**.jsp");命令
例如以下:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% response.sendRedirect("index.jsp"); %> </body> </html>输出结果,直接重定向返回到首页了,
(3)设置cookie
<%@pagecontentType="text/html;charset=gb2312"%> <HTML> <HEAD> <TITLE>Cookie的使用</TITLE> </HEAD> <BODY> <% Cookie c1 = newCookie("name","aaa") ; Cookie c2 = newCookie("password","111") ; // 最大保存时间为60秒 c1.setMaxAge(60) ; c2.setMaxAge(60) ; // 通过response对象将Cookie设置到client response.addCookie(c1) ; response.addCookie(c2) ; %> </BODY> </HTML>
(4)读取cookie
<%@page contentType="text/html;charset=gb2312"%> <HTML> <HEAD> <TITLE>Cookie的使用</TITLE> </HEAD> <BODY> <% // 通过request对象,取得client设置的全部Cookie // 实际上client的Cookie是通过HTTP头信息发送到server端上的 Cookie c[] = request.getCookies() ; %> <% for(int i=0;i<c.length;i++){ Cookie temp = c[i] ; %> <h1><%=temp.getName()%> --> <%=temp.getValue()%></h1> <% } %> </BODY> </HTML>
2.3、session对象
session 对象是由server自己主动创建的与用户请求相关的对象。server为每一个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value能够使复杂的对象类型。而不仅仅局限于字符串类型。
(1)session(会话)对象是类javax.servlet.Httpsession的一个对象。session是从client连接server開始。到与server断开为止。
(2)session对象用于保存每一个与server建立连接的client的信息,session的ID保存于client的Cookie中,这个session ID标识唯一和用户,与其它用户的session ID不同。
(3)session对象的ID:
当一个client訪问server的一个JSP页面时,JSP引擎产生一个session对象,同一时候分配一个String类型的ID号,并发给client。
client将其存储于Cookie.a其标志了一个唯一的ID。採用getID()方法返回session对象在server端的编号。server端通过此ID,唯一地识别一个用户,并提供特殊的服务。
(4)session对象的有效期:
存在以下几个情况时,session对象和其存储的数据会消失。情况有:
当用户关闭当前正在使用的浏览器时。
关闭网页server。
用户未向server提出请求超预设时,Tomcatserver预设为30分钟;
执行程序结束session.
出现以上四种情况时。session对象会消失。
以下是一个简单的session登陆实例:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="login.jsp" method="post"> username:<input type="text" name="uname"><br> 密 码:<input type="password" name="upass"><br> <input type="submit" value="登录"> <input type="reset" value="重置"> </form> <% String name = (String)request.getParameter("uname"); String password = (String)request.getParameter("upass"); if(!(name == null || "".equals(name) || password == null || "".equals(password))){ if("linlin".equals(name) && "123456".equals(password)){ //假设登录成功,则设置session的属性范围 session.setAttribute("userid", name); response.setHeader("refresh","3;URL= welcome.jsp"); %> <h3>用户登录成功!三秒后跳转到欢迎页……</h3> <h3>假设没有跳转。请按<a href="welcome.jsp">这里</a></h3> <% }else{ %> <h3>错误的username或密码。</h3> <% } } %> </body> </html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //假设已经设置过了session属性,则肯定不为空 if(session.getAttribute("userid") != null){ %> <h3>欢迎<%=session.getAttribute("userid")%>登陆~~~~~~~~~~<a href="logout.jsp">注销</a></h3> <% }else{ %> <h3>请先进行本系统的<a href="login.jsp">登录</a></h3> <% } %> </body> </html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% response.setHeader("refresh", "2;URL=login.jsp"); session.invalidate(); //注销表示当前的session失效 %> <h3>你已成功退出本系统,两秒后返回到首页。</h3> <h3>假设没有跳转,请按<a href="login.jsp">这里</a></h3> 首页 </body> </html>
结果例如以下:输入正确username与password后,等三秒,自己主动跳转到欢迎界面welcome.jsp。欢迎界面里点注销,重定向的注销界面login.jsp,等2秒后自己主动跳转到login.jsp
2.4、application对象
application 对象可将信息保存在server中,直到server关闭。否则application对象中保存的信息会在整个应用中都有效。
与session对象相比,application对象生命周期更长。相似于系统的“全局变量”。
运用实例:网页訪问计数器。
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <body> <% if(application.getAttribute("counter") == null) { application.setAttribute("counter", "1"); } else { String strnum = null; strnum = application.getAttribute("counter").toString(); int icount = 0; icount = Integer.valueOf(strnum).intValue(); icount++; application.setAttribute("counter", Integer.toString(icount)); } %> 您是第<%=application.getAttribute("counter") %>位訪问者! </body> </html>
输出结果:
执行结果就是訪问到该页面之后显示你是第几位訪客,刷新之后数目会添加,更换浏览器或者更换client地址都会使其訪问值正常递增。
application的存活范围比request和session都要大。仅仅要server没有关闭,application对象中的数据就会一直存在,在整个server的执行过程当中,application对象仅仅有一个。它会被全部的用户共享。当中getRealPath这种方法能够获取资源在server上的物理路径(绝对路径),经常使用来获取上传文件时要存储文件的路径。
2.5、out 对象
out 对象用于在Web浏览器内输出信息,而且管理应用server上的输出缓冲区。
在使用 out 对象输出数据时,能够对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其它的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
out对象的方法
clear()清除网页上输出的内容 clearBuffer()清除缓冲去的内容 close()关闭缓冲区,清除全部的内容 getBufferSize()取得缓冲区的大小 getRemaining()取得缓冲区剩余大小 isAutoFlush()获取缓冲是否进行自己主动清除的信息 print()进行页面输出 println()进行页面输出并换行
使用out对象进行页面的输出
<%@ page language="java" contentType="text/html;charset=gb2312" %> <!DOCTYPE html> <html> <head> <title>使用out对象输出内容</title> </head> <body> <% out.print("hello world"); out.println("hello world"); %> </body> </html>这里在页面上输出是没有什么差别的,假设想换行要使用html元素<br />
使用out对象获得缓冲区使用大小
<%@ page language="java" contentType="text/html;charset=gb2312" %> <!DOCTYPE html> <html> <head> <title>使用out对象求的缓冲区使用的大小</title> </head> <body> <% int all = out.getBufferSize(); int remain = out.getRemaining(); int use = all - remain; out.println("总的缓冲区大小为:"+all+"<br />"); out.println("正在使用的缓冲区的大小为:"+remain+"<br />"); out.println("剩余的缓冲区的大小为:"+use+"<br />"); %> </body> </html>
输出结果
2.6、pageContext 对象
pageContext 对象的作用是取得不论什么范围的參数,通过它能够获取 JSP页面的out、request、reponse、session、application 等对象。
pageContext对象的创建和初始化都是由容器来完毕的。在JSP页面中能够直接使用 pageContext对象。
这个对象代表页面上下文,该对象主要用于訪问JSP之间的共享数据。
pageContext是PageContext类的实例。使用pageContext能够訪问page、request、session、application范围的变量。getAttribute(String name):取得page范围内的name属性。 getAttribute(String name,int scope):取得指定范围内的name属性,当中scope能够是例如以下4个值: PageContext.PAGE_SCOPE:相应于page范围。 PageContext.REQUEST_SCOPE:相应于request范围。
PageContext.SESSION_SCOPE:相应于session范围。 PageContext.APPLICATION_SCOPE:相应于application范围。
实例:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% //使用pageContext设置属性。该属性默认在page范围内 pageContext.setAttribute("name","lin-pageContext"); request.setAttribute("name","lin-request"); session.setAttribute("name","lin-session"); application.setAttribute("name","lin-application"); %> page设定的值:<%=pageContext.getAttribute("name")%><br> request设定的值:<%=pageContext.getRequest().getAttribute("name")%><br> session设定的值:<%=pageContext.getSession().getAttribute("name")%><br> application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 范围1内的值:<%=pageContext.getAttribute("name",1)%><br> 范围2内的值:<%=pageContext.getAttribute("name",2)%><br> 范围3内的值:<%=pageContext.getAttribute("name",3)%><br> 范围4内的值:<%=pageContext.getAttribute("name",4)%><br> <!--从最小的范围page開始。然后是reques、session以及application--> <%pageContext.removeAttribute("name",3);%> pageContext改动后的session设定的值:<%=session.getValue("name")%><br> <%pageContext.setAttribute("name","lin-modify",4);%> pageContext改动后的application设定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 值的查找:<%=pageContext.findAttribute("name")%><br> 属性name的范围:<%=pageContext.getAttributesScope("name")%><br> </body> </html>
输出结果:
2.7、config 对象
config 对象的主要作用是取得server的配置信息。通过 pageConext对象的 getServletConfig() 方法能够获取一个config对象。当一个Servlet 初始化时。容器把某些信息通过 config对象传递给这个 Servlet。 开发人员能够在web.xml 文件里为应用程序环境中的Servlet程序和JSP页面提供初始化參数。
config 对象代表当前JSP 配置信息,但JSP 页面通常无须配置。因此也就不存在配置信息。
该对象在JSP 页面中非常少用,但在Servlet 则用处相对较大。由于Servlet 须要配置在web.xml 文件里,能够指定配置參数。
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 直接输出config的getServletName的值 --> <%=config.getServletName()%> <!-- 输出该JSP中名为name的參数配置信息 --> name配置參数的值:<%=config.getInitParameter("name")%><br/> <!-- 输出该JSP中名为age的參数配置信息 --> age配置參数的值:<%=config.getInitParameter("age")%> </body> </html>web.xml配置里加上:
<servlet> <!--指定servlet的名字--> <servlet-name>config</servlet-name> <!--指定哪一个JSP页面配置成Servlet--> <jsp-file>/configObject.jsp</jsp-file> <!--配置名为name的參数,值为linbingwen--> <init-param> <param-name>name</param-name> <param-value>linbingwen</param-value> </init-param> <!--配置名为age的參数。值为30--> <init-param> <param-name>age</param-name> <param-value>100</param-value> </init-param> </servlet> <servlet-mapping> <!--指定将config Servlet配置到/config路径--> <servlet-name>config</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>输出结果:
2.8、page 对象
page 对象代表JSP本身。仅仅有在JSP页面内才是合法的。
page隐含对象本质上包括当前 Servlet接口引用的变量,相似于Java编程中的 this 指针。
1 什么是page对象 ?
(1) page对象代表JSP页面本身
page对象是当前JSP页面本身的一个实例,page对象在当前JSP页面中能够用thiskeyword来替代。
(2) 在JSP页面哪些地方能够使用page对象
在JSP页面的Java程序片中能够使用page对象
在JSP页面的JSP表达式中能够使用page对象
(3) page对象的基类是:java.lang.Object类。
注意:假设直接通过page对象来调用方法,就仅仅能调用Object类中的那些方法。
(4) javax,servlet.jsp.JspPage接口
JspPage接口继承于javax.servlet.Servlet接口。
我们能够使用JspPage接口对page对象进行强制类型转换,再调用JspPage接口中的各种方法。
(5) javax,servlet.jsp.HttpJspPage接口
HttpJspPage接口继承于:
javax.servlet.jsp.JspPage接口和javax.servlet.Servlet接口。
我们能够使用HttpJspPage接口对page对象进行强制类型转换,再调用HttpJspPage接口中的各种方法。
(6) 在JSP页面中使用thiskeyword。可调用哪些方法?
在JSP页面中,thiskeyword表示当前JSP页面这个对象,能够调用的常见方法,例如以下所看到的:
例如以下实例:
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 取page的值:<%=this.getServletInfo() %> </body> </html>输出结果:
2.9、exception 对象
Exception对象是用来处理Jsp页面文件在执行时全部发生的错误和异常;Jsp页面文件必须在isErrorPage=true的情况下才干够使用该对象。该对象一般配合Page指令一起使用。通过指定某个页面为错误处理页面,把全部的错误都集中到那个页面进行处理,能够使整个系统的性能得到加强;经常用法例如以下
getMessage():返回错误信息
toString:以字符串的形式返回一个对异常的描写叙述
printStackTrace():以标准错误的形式输出一个错误和错误的堆栈
(1) 可能出错的页面:
在有可能产生异常或错误的JSP页面中。使用page指令设置errorPage属性。属性值为能够进行异常处理的某个JSP页面。
简单来说,仅仅要在当前JSP页面中产生了异常,就交给另外一个专门处理异常的JSP页面。
(2) 专门处理错误的页面:
在专门负责处理异常的JSP页面中,使用page指令设置isErrorPage属性为true,并使用exception对象来获取出错信息。
error.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" import="java.util.*" isErrorPage="true"%> <%@ page import="java.io.PrintStream" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%=exception %><br /> <%=exception.getMessage() %><br /> <%=exception.getLocalizedMessage() %><br /> <% exception.printStackTrace(new java.io.PrintWriter(out)); %> </body> </html>出错的页面
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% int[] arr = {1,2,4}; out.println(arr[3]); %> </body> </html>输出的结果:
不加errorPage="error.jsp"
这句的话:代码就会暴出来了
以上是关于JSP中四种属性pagecontext request session applcation的解释的主要内容,如果未能解决你的问题,请参考以下文章