天天看點

詳解JSP九個内置對象

    在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>&lt;%@ page contentType="text/html;charset=GB2312" %&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;表單頁&lt;/</code><code>title</code><code>&gt;</code>

<code>&lt;/</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>body</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 使用form标簽建立表單--&gt;</code>

<code>    </code><code>&lt;</code><code>form</code> <code>action</code><code>=</code><code>"requestobject2.jsp"</code> <code>method</code><code>=</code><code>"post"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>p</code><code>&gt;使用者名:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code><code>/&gt;&lt;/</code><code>p</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>p</code><code>&gt;年齡:     &lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"age"</code><code>/&gt;&lt;/</code><code>p</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"送出"</code><code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>form</code><code>&gt;</code>

<code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

15

16

17

18

<code>    </code><code>&lt;</code><code>title</code><code>&gt;request object test&lt;/</code><code>title</code><code>&gt;</code>

<code>   </code><code>&lt;!--擷取表單域的值--&gt;</code>

<code>   </code><code>&lt;%</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>%&gt;</code>

<code>   </code><code>&lt;!--下面輸出表單域的值--&gt;</code>

<code>    </code><code>使用者名:&lt;%=username%&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>    </code><code>年齡:&lt;%=age%&gt;</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>&lt;</code><code>title</code><code>&gt;response object test&lt;/</code><code>title</code><code>&gt;</code>

<code>   </code><code>&lt;%   </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>%&gt;</code>

(源碼3)

意思是說,當輸入值不為空時,列印輸入的值,為空時,跳轉到送出頁面!

這裡需要說明的是:response實作的重定向和&lt;jsp:forward&gt;最大的差別在于&lt;jsp:forward&gt;智能在本網站内跳轉,而response.sendRedirect則可以任意跳轉到任何一個位址的頁面。

3、介紹out對象:

out對象常用方法有

clear()清楚緩沖區的内容,clearBuffer()清楚緩沖區的内容同時将資料輸出到用戶端

getBufferSize()擷取緩沖區的大小

最常見的是直接列印輸出内容

<code>    </code><code>&lt;</code><code>title</code><code>&gt;out object test&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 使用out對象輸出--&gt;</code>

<code>    </code><code>&lt;%</code>

<code>        </code><code>out.print("Hello World");      //不換行  </code>

<code>        </code><code>out.println("Hello World");        //換行</code>

第二種使用out對象擷取緩沖區的大小

<code>    </code><code>&lt;!-- 使用out擷取緩沖區資訊--&gt;</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>&lt;% </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>%&gt;</code>

<code>&lt;</code><code>p</code><code>&gt;歡迎光臨!&lt;/</code><code>p</code><code>&gt;</code>

<code>&lt;</code><code>p</code><code>&gt;Session ID:&lt;%=session.getId()%&gt;&lt;/</code><code>p</code><code>&gt;  </code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;使用者登入&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>form</code> <code>action</code><code>=</code><code>"check.jsp"</code> <code>method</code><code>=</code><code>"post"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>p</code><code>&gt;使用者名:&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"username"</code> <code>value=&lt;%=name%&gt;&gt;&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;進入空間&lt;/</code><code>title</code><code>&gt;</code>

<code>&lt;%</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>&lt;</code><code>a</code> <code>href</code><code>=</code><code>"login.jsp"</code><code>&gt;登入&lt;/</code><code>a</code><code>&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;</code>

<code>&lt;</code><code>a</code> <code>href</code><code>=</code><code>"logout.jsp"</code><code>&gt;登出&lt;/</code><code>a</code><code>&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;</code>

<code>&lt;</code><code>p</code><code>&gt;目前使用者為:&lt;%=name %&gt;&lt;/</code><code>p</code><code>&gt;</code>

<code>&lt;</code><code>p</code><code>&gt;中共有10條未讀消息&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;登出頁面&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>String name=(String)session.getAttribute("username");</code>

<code>    </code><code>session.invalidate();</code>

<code>&lt;%=name %&gt;,再見!</code>

<code>&lt;</code><code>p</code><code>&gt;</code>

<code>&lt;</code><code>a</code> <code>href</code><code>=</code><code>"login.jsp"</code><code>&gt;重新登入&lt;/</code><code>a</code><code>&gt;</code>

5、介紹application對象:

application對象主要用于擷取和設定Servlet的相關資訊,因為它的生命周期是從伺服器建立知道關閉為止,對象将會一直存在

主要方法setAttribute(String name ,Object value)Object getAttribute(String name)

<code>    </code><code>&lt;</code><code>title</code><code>&gt;application object test&lt;/</code><code>title</code><code>&gt;</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>&lt;%="&lt;</code><code>h1</code><code>&gt;到目前為止,通路該網站的人數為:"+count+"&lt;/</code><code>h1</code><code>&gt;&lt;</code><code>br</code><code>&gt;" %&gt;</code>

6、介紹pageContext對象

pageContext是一個特殊的屬性,因為不僅僅可以設定page範圍的屬性,還可以設定其他範圍的屬性,通過pageContext可以通路本頁面的所有其他對象,如request,response,out,而因為request,response本身已提供給我們,是以pageContext使用并不多

詳細擷取方法如下代碼,

<code>    </code><code>&lt;</code><code>title</code><code>&gt;pageContext object test&lt;/</code><code>title</code><code>&gt;</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>&lt;</code><code>br</code><code>&gt;</code>

<code>&lt;%="page範圍:"+str1 %&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>&lt;%="request範圍:"+str2 %&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>&lt;%="session範圍:"+str3 %&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>&lt;%="application範圍:"+str4 %&gt;&lt;</code><code>br</code><code>&gt;</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>&lt;%@ page contentType="text/html;charset=GB2312" errorPage="exceptionobject.jsp"%&gt;</code>

<code>    </code><code>發生錯誤的位置!&lt;</code><code>br</code><code>&gt;</code>

<code>        </code><code>int a=5;</code>

<code>        </code><code>int b=0;</code>

<code>    </code><code>輸出結果=&lt;%=(a/b)%&gt;</code>

列印錯誤代碼

<code>&lt;%@ page contentType="text/html;charset=GB2312" isErrorPage="true"%&gt;</code>

<code>&lt;%@ page import="java.io.PrintStream"%&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;exception object test&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>&lt;%=exception.getMessage() %&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>        </code><code>exception.printStackTrace(new java.io.PrintWriter(out));</code>

    綜上總結在實際開發中,我們經常使用的就是request,response,session,out,這四個!也是我們必須掌握的,以上代碼經本人親測,完全正确,文中有遺漏的地方歡迎舉手!也算是自己一個小總結!

本文轉自 小夜的傳說 51CTO部落格,原文連結:http://blog.51cto.com/1936625305/1431807,如需轉載請自行聯系原作者