在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,如需轉載請自行聯系原作者