JSP内置对象
一、概述
为了简化Web应用程序的开发,在JSP中定义了一些JSP容器实现和管理的内置对象,这些对象可以直接在JSP页面中使用,而不需要JSP页面编写者对它们进行初始化。
二、JSP属性范围
在介绍内置对象之前,先介绍JSP中提供的4种属性的作用范围,分别是page、request、session、application。
1、page范围:指所设置的属性仅在当前页面有效。使用pageContext的setAttribute()方法可以设置属性值,使用pageContext的getAttribute()方法可以获得属性值。
2、request范围:指属性仅在一次请求范围内有效。使用request的setAttribute()方法可以获得属性值,使用request的getAttribute()方法可以获得属性值。
3、session范围:指的是属性仅在浏览器与服务器进行一次会话的范围内有效,当和服务器断开连接后,属性就会失效。使用session的setAttribute()方法可以设置属性范围,使用session的getAttribute()方法可以获得属性值。
4、application范围:指属性在整个Web的应用中都有效,直到服务器停止后才失效。使用application的setAttribute()方法可以设置属性值,同样application的getAttribute()方法可以获得属性值。
三、JSP内置对象
1、request对象:用于获取客户端信息,例如我们在表单中填写的信息等。实际上,JSP容器会将客户端的请求信息封装在request对象中。在客户端发出请求时会创建request对象,在请求结束后,则会销毁request对象。
在request对象中提供了一系列的方法用来获取客户端的请求参数。
这些方法包括:getParameter、getParameterNames、getParameterValues、getParameterMap。
requestform.jsp
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>表单页</title> </head> <body> <form action="requestobject2.jsp"method="post"> <p>用户名:<input type="text" name="username"/></p> <p>年龄:<input type="text" name="age"/></p> <input type="submit"value="提交" /> </form> </body> </html>
requestobject.jsp
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>request 表单页1</title> </head> <body> <% request.setCharacterEncoding("gb2312"); Stringusername=request.getParameter("username"); String_age=request.getParameter("age"); intage=Integer.parseInt(_age); %> 用户名:<%=username %><br> 年龄:<%=age %> </body> </html>
requestobject2.jsp
<%@ pagecontentType="text/html; charset=GB2312" %> <%@ pageimport="java.util.*" %> <html> <head> <title>request 表单页2</title> </head> <body> <% String param=""; request.setCharacterEncoding("gb2312"); Enumerationparams=request.getParameterNames(); //获取所有参数值 //循环输出所有参数值 while(params.hasMoreElements()){ param=(String)params.nextElement(); //设置编码格式 //打印参数名 out.println("ParamName:"+param+"<br>"); //打印参数值 out.println("ParamValues:"+request.getParameter(param)+"<br>"); } %> </body> </html>
2、response对象:包含了从JSP页面返回客户端的所有信息,其作用域是它所在的页面。response对象是javax.servlet.ServletResponse类的一个实例,它封装由JSP产生的响应,并返回客户端的响应请求。
response对象经常用于设置HTTP标题、添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。通过response的sendRedirect(String url)方法可以实现重定向。
responseform.jsp:
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>表单页</title> </head> <body> <form action="responseobject.jsp"method="post"> <p>用户名:<input type="text" name="username"/></p> <p>国家:<input type="text" name="country"/></p> <input type="submit"value="提交" /> </form> </body> </html>
requestobject.jsp:
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>response 表单页</title> </head> <body> <% String str=null; str=request.getParameter("username"); //判断用户名输入是否为空 if(str==null){ str=""; } //使用ISO-8859-1字符集将str解码为字节序列,并将结果存储在字节数组中 byteb[]=str.getBytes("ISO-8859-1"); str=newString(b); //将字节数组重组为字符串 if(str.equals("")){ response.sendRedirect("responseform.jsp"); } else{ out.println("response示例"); out.println(str); } %> </body> </html>
3、out对象:是一个缓冲的输出流,用来向客户端返回信息。它是javax.servlet.jsp.JspWriter的一个实例。由于向客户端输出时要先建立连接,所以总是采用缓冲输出的方式,out是缓冲输出流。
outobject.jsp:
<%@ page contentType="text/html;charset=GB2312" %> <html> <head> <title>out对象</title> </head> <body> <% out.print("鲍礼彬"); //不换行 out.println("Hadoop"); //换行 //获取缓存区信息 %> <br> <% intallbuf=out.getBufferSize(); //获取缓存区大小 intremainbuf=out.getRemaining(); //获取剩余缓存区的大小 intusedbuf=allbuf-remainbuf; //已用缓存区 out.println("已用缓存区大小:"+usedbuf); %> </body> </html>
4、session对象:是会话对象,用来记录每个客户端的访问状态。
HTTP协议是一个无状态的协议。一个客户向服务器发出请求(request),然后服务器返回相应(response),此后连接就被关闭了。在这种情况下,可以采用会话(session)来记录连接的信息。
所谓会话指的是从一个客户端打开浏览器与服务器建立连接,到这个客户关闭浏览器与服务器断开连接的过程。
有了session对象,服务器就可以知道这是同一个客户完成的动作。
login.jsp:
<%@ page contentType="text/html;charset=GB2312" %> <html> <head> <title>登陆页</title> </head> <body> <% Stringname=""; //判断是否为新的session if(!session.isNew()){ name=(String)session.getAttribute("username"); //获取session中的username值 if(name==null){ name=""; } } %> <p>欢迎光临</p> <p>Session ID:<%=session.getId()%></p> <form action="check.jsp"method="post"> <p>用户名:<inputtype="text" name="username" value=<%=name%>></p> <inputtype="submit" value="提交" /> </form> </body> </html>
check.jsp:
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>进入邮箱</title> </head> <body> <% String name=null; name=request.getParameter("username"); //获取request中的username值 if(name!=null){ session.setAttribute("username",name); //设置session的属性值 } %> <a href="login.jsp">登陆</a> <ahref="loginout.jsp">注销</a> <br> <p>当前用户为:<%=name %></p> <p>邮箱中共有29封邮件</p> </body> </html>
loginout.jsp:
<%@ pagecontentType="text/html; charset=GB2312" %> <html> <head> <title>注销页面</title> </head> <body> <% String name=(String)session.getAttribute("username"); //获取request中的username值 session.invalidate(); //清空session %> <%=name %>,再见! <p><p> <a href="login.jsp">重新登陆</a> </body> </html>
演示的效果是,当在登陆页输入非汉字用户名时,会出现上面第二个图,点击登陆,上次的用户名自动写在用户名框里;若选择注销,则再重新登陆时,用户名框为空。
5、application对象:用于获取和设置Servlet的相关信息,它的生命周期是从服务器启动直到服务器关闭为止,一旦创建了一个application对象,该对象会一直存在,直到服务器关闭。Application中封装了JSP所在的Web应用中的信息。
applicationobject.jsp:
<%@ page contentType="text/html;charset=GB2312" %> <html> <head> <title>网站计数器</title> </head> <body> <% Stringcount=(String)application.getAttribute("count"); //获取属性 if(count==null){ count="1"; }else{ count=Integer.parseInt(count)+1+""; } application.setAttribute("count",count); %> <%="<h1>到目前为止,网站访问人数为:"+count+"</h1><br>" %> </body> </html>
如图,每刷新一次,人数加1。
6、pageContext对象:是一个比较特殊的对象,不仅可以设置page范围内的属性,还可以设置其他范围内的属性。通过它还可以访问本页面中所有其他对象。在JSP开发中,此对象使用的并不多。
pageContextobject.jsp:
<%@ page contentType="text/html;charset=GB2312" %> <html> <head> <title>pageContext对象</title> </head> <body> <% pageContext.setAttribute("attributename","page_scope"); request.setAttribute("attributename","request_scope"); session.setAttribute("attributename","session_scope"); application.setAttribute("attributename","application_scope"); Stringstr1=(String)pageContext.getAttribute("attributename",pageContext.PAGE_SCOPE); Stringstr2=(String)pageContext.getAttribute("attributename",pageContext.REQUEST_SCOPE); Stringstr3=(String)pageContext.getAttribute("attributename",pageContext.SESSION_SCOPE); Stringstr4=(String)pageContext.getAttribute("attributename",pageContext.APPLICATION_SCOPE); %> attributename在不同范围内的取值:<br> <%="page范围:"+str1%><br> <%="request范围:"+str2%><br> <%="session范围:"+str3%><br> <%="application范围:"+str4%><br> </body> </html>
7、page对象:指的是当前JSP页面的本身,它是java.lang.Object类的对象通过它可以方便的调用Servlet类中定义的方法。在实际开发中page并不常用。
8、config对象:是ServletConfig类的一个实例,在Servlet初始化时,可以通过config向Servlet传递信息。所传递的信息可以是属性名和属性值构成的名值对,也可以是通过ServletContext对象传递的服务器的相关信息。
使用并不多,只在编写Servlet时,当需要重载Servlet的init()方法时才会用到config对象。
9、exception对象:exception对象是java.lang.Throwable类的对象,用来处理页面的错误和异常。在使用JSP开发时,习惯做法是在一个页面中使用page指令的errorPage属性,让该属性指向一个专门用于异常处理的页面。
如果在JSP页面中有未捕获的异常,则会生成exception对象,然后将该exception对象传送到page指令中设置的异常处理页面中,在异常处理页面中对exception对象进行处理。在异常处理页面中需要将其page指令的isErrorPage属性设置为true才可以使用exception对象。
exceptiontest.jsp:
<%@ page contentType="text/html;charset=GB2312" errorPage="exceptionobject.jsp"%> <html> <head> <title>exception对象</title> </head> <body> 发生错误位置:<br> <% int a=5; intb=0; %> 输出结果=<%=(a/b) %> //出错地方 </body> </html>
exceptionobject.jsp:
<%@ page contentType="text/html;charset=GB2312" isErrorPage="true"%> <%@ page import="java.io.PrintStream" %> <html> <head> <title>输出错误页面</title> </head> <body> <%=exception.getMessage()%> <!-- 返回exception对象的异常信息 --> <!-- 打印异常的栈反向跟踪轨迹 --> <% exception.printStackTrace(newjava.io.PrintWriter(out)); %> </body> </html>