1 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
先聲明這是轉(zhuǎn)的 不是我自己寫的:
JSP由于其強(qiáng)大的生命力在web開發(fā)中有很廣泛的應(yīng)用,實(shí)際上在JSP開發(fā)中,JSP程序中只占用了很少的一部分,大部分是由JavaBean完成的,通過(guò)JavaBean可以封裝業(yè)務(wù)邏輯,數(shù)據(jù)庫(kù)處理等等,由于有了JavaBean才使得程序更為健壯,易于擴(kuò)展。所以,詳細(xì)的了解JavaBean的基礎(chǔ),對(duì)于我們開發(fā)出高質(zhì)量的JSP應(yīng)用程序是很有幫助 [一、JavaBean在JSP中的基本語(yǔ)法]
JSP中JavaBean是通過(guò)標(biāo)簽<jsp:useBean>來(lái)聲明實(shí)現(xiàn)的,基本語(yǔ)法如下:
<jsp:userBean id="beanName" class="className" scope="page/request/session/application></jsp:userBean>
由于我們討論的是生存周期,在上面語(yǔ)法中通過(guò)scope屬性來(lái)實(shí)現(xiàn)的:
scope="page/request/session/application
scope的值代表 JavaBean的生存周期,也就是JavaBean的實(shí)例id在JSP程序中存在的范圍。
下面看看具體的scope四個(gè)值的含義:
page-JavaBean對(duì)象保存在pageContext對(duì)象中,有page范圍JavaBean實(shí)例只能在當(dāng)前創(chuàng)建這個(gè)JavaBean的JSP文件中進(jìn)行操作,
這個(gè)實(shí)例只有在請(qǐng)求返回給客戶端后或者轉(zhuǎn)移到另外的JSP頁(yè)面后才會(huì)釋放掉。page范圍的JavaBean常用于進(jìn)行一次性操作的JavaBean,這樣的Bean用的最多,比如大部分表單提交,Bean的一些計(jì)算處理等都可以使用page范圍的JavaBean
request-JavaBean對(duì)象保存在request對(duì)象中,有request范圍的JavaBean實(shí)例可以在處理請(qǐng)求所有JSP頁(yè)面中都存在,這個(gè)對(duì)象只有在請(qǐng)求全部處理完畢后才會(huì)被釋放掉,request范圍的JavaBean常用于共享同一次請(qǐng)求的JSP頁(yè)面中,比如判斷用戶登錄功能,如果用戶名密碼合法就可以forward到一個(gè)合法頁(yè)面中,否則就forward到一個(gè)出錯(cuò)頁(yè)面,當(dāng)然轉(zhuǎn)移后的頁(yè)面仍然能夠得到用戶的輸入。
session-JavaBean對(duì)象是保存在session范圍的JavaBean實(shí)例的生存周期是整個(gè)session,只有當(dāng)session過(guò)期后才能釋放掉,這樣常用于共享同一session的JSP頁(yè)面,比如購(gòu)物車一般就是放在session中的或者登陸后的用戶信息等也可以在session中,注意<%@page標(biāo)簽中不要設(shè)置session=false,否則在這個(gè)JSP頁(yè)面中session將不會(huì)起作用,幸好JSP默認(rèn)session=true,所以可以不必管它了。application-JavaBean對(duì)象保存在application對(duì)象中,有application范圍的JavaBean對(duì)象的生存周期是整個(gè)application。這就意味著這樣的JavaBean的生存周期是整個(gè)應(yīng)用程序,當(dāng)web Server停掉才會(huì)消失掉。這樣的常用于共享同一application的JSP程序中,比如程序中一些經(jīng)常用到配置東西如數(shù)據(jù)庫(kù)連接URL,全局的計(jì)數(shù)器或者是聊天室中人員信息等。
[二、scope的具體應(yīng)用]
上面講了這么多,大家應(yīng)用對(duì)JavaBean的生存周期有個(gè)基本的概念了,在這里我們結(jié)合幾個(gè)簡(jiǎn)單的例子來(lái)看看scope在JavaBean中應(yīng)用,以便大家能對(duì)scope有更深的了解,用來(lái)演示的是一個(gè)簡(jiǎn)單的積分處理程序,初始化為o,每一次訪問(wèn)會(huì)將積分加上10,我們使用了一個(gè)JavaBean文件,用于數(shù)值計(jì)算處理的,然后在前臺(tái)使用幾個(gè)scope設(shè)置不同的JSP文件調(diào)用這個(gè)JavaBean。
<核心的JavaBean文件>
public class scope
{
//初始化成員變量,scope_count代表積分分值
int scope_count=10;
public scope(){} //構(gòu)造方法
public int TestNumber(){
scope_count+=10;
return scope_count;
}
//設(shè)置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并生成一個(gè)scope的實(shí)例-->
<jsp:useBean id="jinqiao" scope="page" class="com.scope"/>
<body>
page范圍積分程序演示<br>
<center>您當(dāng)前的積分為<%//調(diào)用scope中的TestNumber方法得到當(dāng)前積分
out.println(jinqiao.TestNumber());%>
</center>
</body>
</html>
好了,啟動(dòng)web服務(wù)器,然后運(yùn)行這個(gè)程序,使用瀏覽器并點(diǎn)擊刷新按鈕,看屏幕的變化,你會(huì)發(fā)現(xiàn)結(jié)果總是積分為20,這就說(shuō)明了TestNumber方法只被執(zhí)行了一欠,因?yàn)閖inqiao對(duì)象的生存范圍是page的,所以只在這個(gè)頁(yè)面有效,每一次調(diào)用這個(gè)JSP頁(yè)面都會(huì)重新生成一個(gè)jinqiao對(duì)象,當(dāng)然積分不會(huì)變化了。
<request范圍的演示>
下面是為了演示request范圍的JSP文件request.jsp。
request.jsp
<%@ page contentType="text/html";charset=gb2312"%>
<html><head>
<title>request范圍積分程序演示</title>
</head>
<!--初始化JavaBean并生成一個(gè)scope的實(shí)例-->
<jsp:useBean id="jinqiao" scope="request" class="com.scope"/>
<body>
page范圍積分程序演示<br>
<center>您當(dāng)前的積分為<%//調(diào)用scope中的TestNumber方法得到當(dāng)前積分
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并生成一個(gè)scope的實(shí)例-->
<jsp:useBean id="jinqiao" scope="request" class="com.scope"/>
<body>
request范圍積分程序演示<br>
<center>您當(dāng)前的積分為<%//調(diào)用scope中的TestNumber方法得到當(dāng)前積分
out.println(jinqiao.TestNumber());%>
</center>
</body>
</html>
好了,啟動(dòng)web服務(wù)器,然后運(yùn)行這個(gè)程序,使用瀏覽器并點(diǎn)擊刷新按鈕,看屏幕的變化,你會(huì)發(fā)現(xiàn)結(jié)果總是積分為28為什么會(huì)有這樣一個(gè)結(jié)果呢,因?yàn)槭紫任覀冊(cè)趓equest.jsp文件中調(diào)用了jinqiao對(duì)象setNumber方法設(shè)置積分值為18,然后我們將請(qǐng)求轉(zhuǎn)移到request1.jsp頁(yè)面,因?yàn)橥幌鄳?yīng)還沒(méi)有處理完畢,所以在request1.jsp中得到的仍然是同一個(gè)jinqiao實(shí)例,然后通過(guò)jinqiao的TestNumber方法將jinqiao的積分18+10,所以就得到了28了。注意的是<jsp:forward>標(biāo)簽是用來(lái)將請(qǐng)求轉(zhuǎn)移的兩個(gè)頁(yè)面中的Bean聲明包括id名字,request范圍等要一模一樣才行,這樣JSP程序才會(huì)認(rèn)為你要調(diào)用的是同一個(gè)JavaBean實(shí)例
<session范圍的演示>
下面是為了演示session范圍的JSP文件session.jsp文件,
session.jsp
?<%@ page contentType="text/html";charset=gb2312"%>
<html><head>
<title>session范圍積分程序演示</title>
</head>
<!--初始化JavaBean并生成一個(gè)scope的實(shí)例-->
<jsp:useBean id="jinqiao" scope="session" class="com.scope"/>
<body>
session范圍積分程序演示<br>
<center>您當(dāng)前的積分為<%//調(diào)用scope中的TestNumber方法得到當(dāng)前積分
out.println(jinqiao.TestNumber());%>
</center>
</body>
</html>
好了,啟動(dòng)web服務(wù)器,然后運(yùn)行這個(gè)程序,使用瀏覽器并點(diǎn)擊刷新按鈕,看屏幕的變化,你會(huì)發(fā)現(xiàn)結(jié)果是變化的,開始時(shí)是:您當(dāng)前的積分為20,然后就是30,40.。。,這就說(shuō)明了TestNumber()方法被執(zhí)行了多次,因?yàn)閖inqiao對(duì)象生存范圍是session的,所以在整個(gè)session有效,每一次刷新這個(gè)jsp頁(yè)面都會(huì)調(diào)用同一個(gè)jinqiao對(duì)象,所以積分都是同一個(gè)了,
另外,為了更方便的理解session,可以將上面的session.jsp文件完整的拷貝一份生成session1.jsp文件,在瀏覽器中執(zhí)行session.jsp文件,看積分值的變化,然后還使用同一個(gè)瀏覽器,輸入session1.jsp文件,你會(huì)發(fā)現(xiàn)session1.jsp和session.jsp文件的積分值是一模一樣的。重新開一個(gè)瀏覽器,注意不用瀏覽器菜單功能,而是直接從桌面雙擊一個(gè)IE瀏覽器,而兩個(gè)瀏覽器分別運(yùn)行session.jsp,session1.jsp文件,刷新多次后,你會(huì)發(fā)現(xiàn)兩個(gè)瀏覽器的積分值不一樣了,為什么呢?很簡(jiǎn)單,因?yàn)橹匦麓蜷_一個(gè)瀏覽器就相當(dāng)于重新開一個(gè)session。session不同,積分值當(dāng)然也不同了。
<application范圍的演示>
application.jsp
?<%@ page contentType="text/html";charset=gb2312"%>
<html>
<head>
<title>application范圍積分程序演示</title>
</head>
<!--初始化JavaBean并生成一個(gè)scope的實(shí)例-->
<jsp:useBean id="jinqiao" scope="application" class="com.scope"/>
<body>
session范圍積分程序演示<br>
<center>您當(dāng)前的積分為<%//調(diào)用scope中的TestNumber方法得到當(dāng)前積分
out.println(jinqiao.TestNumber());%>
</center>
</body>
</html>
好了,啟動(dòng)web服務(wù)器,然后運(yùn)行這個(gè)程序,使用瀏覽器并點(diǎn)擊刷新按鈕,看屏幕的變化,你會(huì)發(fā)現(xiàn)結(jié)果是變化的,和前面的session幾乎一樣,開始時(shí),你當(dāng)前的積分為20,然后就是30、40.。。,這就說(shuō)明了TestNubmer()方法被執(zhí)行了多次,但是它和session有什么不同呢?
為了解決這個(gè)問(wèn)題,可以將上面的application.jsp文件完整的拷貝一份生成application.jsp文件,重新開一個(gè)瀏覽器,注意不用瀏覽器的菜單功能,而是直接從桌面雙擊一個(gè)IE瀏覽器,兩個(gè)瀏覽器分別運(yùn)行application.jsp和application1.jsp文件中,刷新多 次后,你會(huì)發(fā)現(xiàn)兩個(gè)瀏覽器的積分值完全一樣,這就是application的區(qū)別了,很簡(jiǎn)單因?yàn)橹匦麓蜷_一個(gè)瀏覽器只是重新開了一個(gè)session,application是針對(duì)于整個(gè)服務(wù)器應(yīng)用程序而言的,應(yīng)用程序沒(méi)有關(guān)閉,jinqiao對(duì)象是全局的,所以積分值當(dāng)然一樣了,只有將web服務(wù)器重新啟動(dòng)后,才會(huì)重新生成一個(gè)jinqiao對(duì)象,積分值才會(huì)重新計(jì)算。
[三、總結(jié)]
本文重點(diǎn)闡述了JSP中的JavaBean的生命周期(scope)問(wèn)題,到這里,通過(guò)前面的例子演示相信大家對(duì)于JavaBean的生成周
期概念已經(jīng)比較熟悉了,只要再經(jīng)過(guò)一段時(shí)間的實(shí)際應(yīng)用,相信大家對(duì)于JSP中使用JavaBean都得心應(yīng)手。
添加回答
舉報(bào)