在web开发中,为方便开发者,JSP定义了一些由JSP容器实现和管理的内置对象,这些对象可以直接被开发者使用,而不需要再对其进行实例化!本文详解,JSP2.0之后由ServletApi提供的9个内置对象,如下:
内置对象名称
相对应的类
作用域
request
javax.servlet.ServletRequest
response
javax.servlet.ServletResponse
page
pageContext
javax.servlet.pageContext
session
javax.servlet.HttpSession
application
javax.servlet.ServletContext
out
javax.servlet.JspWriter
config
javax.servlet.ServletConfig
javax.servlet.Object
exception
javax.servlet.Throwable
由此可见,JSP内置对象作用域范围,分别是:page,request,session,application
介绍一下:
1、page范围:指的是所设置的属性只在当前页面有效,使用pageContext.setAttribute()设置值,page.getAttribute()取值
2、request范围:指的是仅在一次请求的范围内有效request.setAttribute()设置值,request.getAttribute()取值
3、session范围:指的是属性仅在浏览器与服务器进行一次会话时有效,服务器断开之后,就失去作用,一般与用户有关
session.setAttribute()设置值,session.getAttribute()取值
4、application:是指在整个web应用中都有效,直到服务器停止为止,application.setAttribute() 设置值,application.getAttribute()取值,一般与用户无关
第二部分:
1、介绍request对象:
request中主要方法有getAttribute()-获取指定的属性值,getParameter("name")获取请求参数名为name的值如下示例源码:
以requestform.jsp作为提交表单,以requestobject.jsp作为接受对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code><%@ page contentType="text/html;charset=GB2312" %></code>
<code><</code><code>html</code><code>></code>
<code><</code><code>head</code><code>></code>
<code> </code><code><</code><code>title</code><code>>表单页</</code><code>title</code><code>></code>
<code></</code><code>head</code><code>></code>
<code><</code><code>body</code><code>></code>
<code> </code><code><!-- 使用form标签创建表单--></code>
<code> </code><code><</code><code>form</code> <code>action</code><code>=</code><code>"requestobject2.jsp"</code> <code>method</code><code>=</code><code>"post"</code><code>></code>
<code> </code><code><</code><code>p</code><code>>用户名:<</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code><code>/></</code><code>p</code><code>></code>
<code> </code><code><</code><code>p</code><code>>年龄: <</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"age"</code><code>/></</code><code>p</code><code>></code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"提交"</code><code>/></code>
<code> </code><code></</code><code>form</code><code>></code>
<code></</code><code>body</code><code>></code>
<code></</code><code>html</code><code>></code>
15
16
17
18
<code> </code><code><</code><code>title</code><code>>request object test</</code><code>title</code><code>></code>
<code> </code><code><!--获取表单域的值--></code>
<code> </code><code><%</code>
<code> </code><code>request.setCharacterEncoding("gb2312"); //中文名时需要设置编码格式</code>
<code> </code><code>String username=request.getParameter("username"); //获取用户名</code>
<code> </code><code>String strage=request.getParameter("age"); //获取用户年龄,此时为String类型</code>
<code> </code><code>int age=Integer.parseInt(strage); //将字符串解析为整数</code>
<code> </code><code>%></code>
<code> </code><code><!--下面输出表单域的值--></code>
<code> </code><code>用户名:<%=username%><</code><code>br</code><code>></code>
<code> </code><code>年龄:<%=age%></code>
(源码2)
2、介绍response对象:
response常用方法有
addHeader(String name,String value)添加HTTP头信息,该Header信息奖杯发送到客户端
addCookie(Cookie cookie)添加cookie对象
setRedirect(url)重定向jsp文件
例如我们将源码2的代码稍微修改一下:
19
20
21
22
23
24
25
26
27
<code> </code><code><</code><code>title</code><code>>response object test</</code><code>title</code><code>></code>
<code> </code><code><% </code>
<code> </code><code>String str=null; </code>
<code> </code><code>str=request.getParameter("username");</code>
<code> </code><code>if(str==null)</code>
<code> </code><code>{str="";</code>
<code> </code><code>}</code>
<code> </code><code>byte b[]=str.getBytes("ISO-8859-1");</code>
<code> </code><code>str=new String(b);</code>
<code> </code><code>if(str.equals(""))</code>
<code> </code><code>{</code>
<code> </code><code>response.sendRedirect("responseform.jsp"); </code>
<code> </code><code>}</code>
<code> </code><code>else </code>
<code> </code><code>{ </code>
<code> </code><code>out.println("欢迎您来到本网页!");</code>
<code> </code><code>out.println(str);</code>
<code> </code><code>%></code>
(源码3)
意思是说,当输入值不为空时,打印输入的值,为空时,跳转到提交页面!
这里需要说明的是:response实现的重定向和<jsp:forward>最大的区别在于<jsp:forward>智能在本网站内跳转,而response.sendRedirect则可以任意跳转到任何一个地址的页面。
3、介绍out对象:
out对象常用方法有
clear()清楚缓冲区的内容,clearBuffer()清楚缓冲区的内容同时将数据输出到客户端
getBufferSize()获取缓冲区的大小
最常见的是直接打印输出内容
<code> </code><code><</code><code>title</code><code>>out object test</</code><code>title</code><code>></code>
<code> </code><code><!-- 使用out对象输出--></code>
<code> </code><code><%</code>
<code> </code><code>out.print("Hello World"); //不换行 </code>
<code> </code><code>out.println("Hello World"); //换行</code>
第二种使用out对象获取缓冲区的大小
<code> </code><code><!-- 使用out获取缓冲区信息--></code>
<code> </code><code>int allbuf=out.getBufferSize(); //获取缓冲区的大小</code>
<code> </code><code>int remainbuf=out.getRemaining(); //获取剩余缓冲区的大小</code>
<code> </code><code>int usedbuf=allbuf-remainbuf; //已用缓冲区</code>
<code> </code><code>out.println("已用缓冲区大小为:"+usedbuf); //输出已用缓冲区大小</code>
4、介绍session对象:
session是会话对象主要是用来记录每个客户端访问状态,这个对象使用十分频繁!例如,我前面博文介绍的可以限制用户单号登录,防止表单重复提交都是用session来完成!
常用方法:
setAttribute(String name,Object value)设置session范围内的name属性的属性值为value,并将其存储在session的对象中
getSession()获取session范围内的name属性的值
boolean isNew 是否存有新的session
removerAttribute(String name)删除session值
下面是hi一个简单的例子:
login.jsp,check.jsp,logout.jsp
<code><% </code>
<code> </code><code>String name="";</code>
<code> </code><code>//判断是否为新的session</code>
<code> </code><code>if(!session.isNew()){</code>
<code> </code><code>name=(String)session.getAttribute("username");</code>
<code> </code><code>if(name==null)</code>
<code> </code><code>name="";</code>
<code> </code><code>}</code>
<code>%></code>
<code><</code><code>p</code><code>>欢迎光临!</</code><code>p</code><code>></code>
<code><</code><code>p</code><code>>Session ID:<%=session.getId()%></</code><code>p</code><code>> </code>
<code> </code><code><</code><code>title</code><code>>用户登录</</code><code>title</code><code>></code>
<code> </code><code><</code><code>form</code> <code>action</code><code>=</code><code>"check.jsp"</code> <code>method</code><code>=</code><code>"post"</code><code>></code>
<code> </code><code><</code><code>p</code><code>>用户名:<</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code> <code>value=<%=name%>></</code><code>p</code><code>></code>
<code> </code><code><</code><code>title</code><code>>进入空间</</code><code>title</code><code>></code>
<code><%</code>
<code> </code><code>String name=null;</code>
<code> </code><code>name=request.getParameter("username");</code>
<code> </code><code>if(name!=null)</code>
<code> </code><code>session.setAttribute("username",name);</code>
<code><</code><code>a</code> <code>href</code><code>=</code><code>"login.jsp"</code><code>>登录</</code><code>a</code><code>>&nbsp;&nbsp;&nbsp;</code>
<code><</code><code>a</code> <code>href</code><code>=</code><code>"logout.jsp"</code><code>>注销</</code><code>a</code><code>>&nbsp;&nbsp;&nbsp;</code>
<code><</code><code>p</code><code>>当前用户为:<%=name %></</code><code>p</code><code>></code>
<code><</code><code>p</code><code>>中共有10条未读消息</</code><code>p</code><code>></code>
<code> </code><code><</code><code>title</code><code>>注销页面</</code><code>title</code><code>></code>
<code> </code><code>String name=(String)session.getAttribute("username");</code>
<code> </code><code>session.invalidate();</code>
<code><%=name %>,再见!</code>
<code><</code><code>p</code><code>></code>
<code><</code><code>a</code> <code>href</code><code>=</code><code>"login.jsp"</code><code>>重新登录</</code><code>a</code><code>></code>
5、介绍application对象:
application对象主要用于获取和设置Servlet的相关信息,因为它的生命周期是从服务器创建知道关闭为止,对象将会一直存在
主要方法setAttribute(String name ,Object value)Object getAttribute(String name)
<code> </code><code><</code><code>title</code><code>>application object test</</code><code>title</code><code>></code>
<code> </code><code>String count=(String)application.getAttribute("count");</code>
<code> </code><code>if(count==null)</code>
<code> </code><code>{</code>
<code> </code><code>count="1";</code>
<code> </code><code>else</code>
<code> </code><code>count=Integer.parseInt(count)+1+"";</code>
<code> </code><code>application.setAttribute("count",count);</code>
<code><%="<</code><code>h1</code><code>>到目前为止,访问该网站的人数为:"+count+"</</code><code>h1</code><code>><</code><code>br</code><code>>" %></code>
6、介绍pageContext对象
pageContext是一个特殊的属性,因为不仅仅可以设置page范围的属性,还可以设置其他范围的属性,通过pageContext可以访问本页面的所有其他对象,如request,response,out,而因为request,response本身已提供给我们,所以pageContext使用并不多
详细获取方法如下代码,
<code> </code><code><</code><code>title</code><code>>pageContext object test</</code><code>title</code><code>></code>
<code> </code><code>pageContext.setAttribute("attributename","page_scope"); //设置page范围内的属性</code>
<code> </code><code>request.setAttribute("attributename","request_scope"); //设置request范围内的属性</code>
<code> </code><code>session.setAttribute("attributename","session_scope"); //设置session范围内的属性</code>
<code> </code><code>application.setAttribute("attributename","application_scope"); //设置application范围内的属性</code>
<code> </code><code>String str1=(String)pageContext.getAttribute("attributename",pageContext.PAGE_SCOPE);</code>
<code> </code><code>String str2=(String)pageContext.getAttribute("attributename",pageContext.REQUEST_SCOPE);</code>
<code> </code><code>String str3=(String)pageContext.getAttribute("attributename",pageContext.SESSION_SCOPE);</code>
<code> </code><code>String str4=(String)pageContext.getAttribute("attributename",pageContext.APPLICATION_SCOPE);</code>
<code>attributename在不同范围的属性值</code>
<code><</code><code>br</code><code>></code>
<code><%="page范围:"+str1 %><</code><code>br</code><code>></code>
<code><%="request范围:"+str2 %><</code><code>br</code><code>></code>
<code><%="session范围:"+str3 %><</code><code>br</code><code>></code>
<code><%="application范围:"+str4 %><</code><code>br</code><code>></code>
7、介绍page对象:
page对象是指的是JSP页面的本身,她是Object对象的类,通过page对象可以调用到Servlet类定义的方法,page对象在开发中并不经常用到,这里就不讲解了!
8、介绍config对象:
config对象是ServletConfig类的一个实例,在Servlet初始化时,可以通过config向Servlet传递信息,在JSP开发中config使用并不多,只有需要重新重载Servlet的init()方法时才会用到config方法
其中有一个方法使用较多,ServletContext.getServletContext获得一个包含服务器相关信息的ServlletContext对象
9、介绍exception对象:
主要是处理页面异常和错误,实际开发中此对象使用也不多,让用户直接看到错误,是很不好的吧?
所以一般都是调试项目会使用
使用这个对象必须将isErrorPage设置为true
如下
<code><%@ page contentType="text/html;charset=GB2312" errorPage="exceptionobject.jsp"%></code>
<code> </code><code>发生错误的位置!<</code><code>br</code><code>></code>
<code> </code><code>int a=5;</code>
<code> </code><code>int b=0;</code>
<code> </code><code>输出结果=<%=(a/b)%></code>
打印错误代码
<code><%@ page contentType="text/html;charset=GB2312" isErrorPage="true"%></code>
<code><%@ page import="java.io.PrintStream"%></code>
<code> </code><code><</code><code>title</code><code>>exception object test</</code><code>title</code><code>></code>
<code> </code><code><%=exception.getMessage() %><</code><code>br</code><code>></code>
<code> </code><code>exception.printStackTrace(new java.io.PrintWriter(out));</code>
综上总结在实际开发中,我们经常使用的就是request,response,session,out,这四个!也是我们必须掌握的,以上代码经本人亲测,完全正确,文中有遗漏的地方欢迎举手!也算是自己一个小总结!
本文转自 小夜的传说 51CTO博客,原文链接:http://blog.51cto.com/1936625305/1431807,如需转载请自行联系原作者