了解JavaBean

1.什么是JavaBean

JavaBean是基于Java的組件模型氯夷,由屬性、方法和事件3部分組成靶擦。在該模型中腮考,JavaBean可以修改或與其他組件結(jié)合以生成新組件或完整的程序雇毫。它又是一種Java類,通過(guò)封裝成為具有某種功能或者處理某個(gè)業(yè)務(wù)的對(duì)象踩蔚。因此棚放,可以通過(guò)嵌在JSP頁(yè)面內(nèi)的Java代碼訪問(wèn)Bean及其屬性。

為寫(xiě)成JavaBean馅闽,類必須是具體的和公共的飘蚯,并且具有無(wú)參數(shù)的構(gòu)造器。JavaBean通過(guò)提供符合一致性設(shè)計(jì)模式的公共方法將內(nèi)部域暴露成員屬性福也。在業(yè)內(nèi)眾所周知局骤,屬性名稱符合的這種模式,其他Java類可以通過(guò)自身機(jī)制發(fā)現(xiàn)和操作這些JavaBean屬性暴凑。

2.JavaBean的特點(diǎn)

按照Sun公司的定義峦甩,JavaBean是一個(gè)可以重復(fù)使用的軟件組件。實(shí)際上JavaBean是一種Java類现喳,通過(guò)封裝屬性和方法成為一種具有某種功能或者處理某個(gè)業(yè)務(wù)的對(duì)象穴店,簡(jiǎn)稱bean。由于JavaBean是基于Java語(yǔ)言的拿穴,因此JavaBean不依賴平臺(tái)泣洞,且具有以下特點(diǎn)。

可以實(shí)現(xiàn)代碼的重復(fù)利用
易編寫(xiě)默色、易維護(hù)球凰、易使用
可以在任何安裝了Java運(yùn)行環(huán)境的平臺(tái)上使用,而不需要重新編譯腿宰。

編寫(xiě)JavaBean就是編寫(xiě)一個(gè)Java類呕诉,所以您只要會(huì)寫(xiě)類就能編寫(xiě)一個(gè)bean,這個(gè)類創(chuàng)建的一個(gè)對(duì)象稱作一個(gè)bean吃度。為了能讓這個(gè)bean的應(yīng)用構(gòu)建工具(比如JSP引擎)知道這個(gè)bean的屬性和方法甩挫,需要在類的方法命名上遵循以下規(guī)則。

如果類的成員變量的名字是person椿每,那么為了更改或獲取成員變量的值伊者,即更改或獲取屬性,在類中可以使用兩種方法:getPerson()间护,用來(lái)獲取屬性person亦渗;setPerson(),用來(lái)修改屬性person汁尺。
對(duì)于boolean類型的成員變量法精,即布爾邏輯類型的屬性,允許使用is代替上面的get和set。
類中方法的訪問(wèn)屬性都必須是public的搂蜓。
類中如果有構(gòu)造方法的話狼荞,那么這個(gè)構(gòu)造方法必須是public的并且是無(wú)參數(shù)的。

3.JavaB的屬性

JavaBean的屬性與一般Java程序中所指的屬性帮碰,或者說(shuō)與所有面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中對(duì)象的屬性的概念是一個(gè)概念粘秆,在程序中的具體體現(xiàn)就是類中的變量。屬性分為四類:即單值收毫、索引攻走、關(guān)聯(lián)和約束屬性。

1.單值屬性

單值屬性是最普通的屬性類型此再,該類屬性只有一個(gè)單一的數(shù)據(jù)值昔搂,該數(shù)據(jù)值的數(shù)據(jù)類型可以是Java中的任意數(shù)據(jù)類型,包括類的和接口等類型输拇。
定義了屬性摘符,還需要定義對(duì)應(yīng)的訪問(wèn)方法,一般每個(gè)單值屬性都伴隨一對(duì)get/set方法策吠。屬性名與該屬性相關(guān)的get/set方法名對(duì)應(yīng)逛裤。例如有一個(gè)dog的屬性,則會(huì)有setDog和getDog方法猴抹。
另外带族,布爾屬性是一種特殊的單值屬性,它只有兩個(gè)允許值:true和false蟀给,如果有一個(gè)名為dog的布爾屬性蝙砌,則可以通過(guò)isDog方法訪問(wèn)。

2.索引屬性

索引屬性是指JavaBean中數(shù)組的成員變量跋理。使用與該屬性對(duì)應(yīng)的set/get方法可以得到數(shù)組的值择克。索引屬性通過(guò)對(duì)應(yīng)的訪問(wèn)方法設(shè)置或取得該屬性中某個(gè)元素的值,也可以一次設(shè)置或取得整個(gè)屬性的值前普。如果需要定義一批同類型的屬性肚邢,使用單值屬性就會(huì)顯得非常煩瑣,為解決此問(wèn)題拭卿,JavaBean中提供了索引屬性骡湖。

3.關(guān)聯(lián)屬性

關(guān)聯(lián)屬性是指當(dāng)該種屬性的值發(fā)生變化時(shí),要通知其他的對(duì)象记劈。每次屬性值改變時(shí)勺鸦,這種屬性就觸發(fā)一個(gè)PropertyChange事件。事件中封裝了屬性名目木、屬性的原值和屬性變化后的新值。這種事件傳遞到其他的Beans,至于接收事件的Beans應(yīng)做什么動(dòng)作刽射,由其自己定義军拟。

4.約束屬性

JavaBean的屬性如果改變時(shí),相關(guān)的外部類對(duì)象首先要檢查這個(gè)屬性改變的合理性再?zèng)Q定是否接受這種改變誓禁,這樣的Bean屬性叫約束屬性懈息。當(dāng)約束屬性的改變被拒絕時(shí),改變約束屬性的方法產(chǎn)生一個(gè)約束屬性改變異常摹恰,通過(guò)這個(gè)異常處理辫继,JavaBean約束屬性還原回來(lái)原來(lái)的值,并為這個(gè)還原操作發(fā)送一個(gè)新的屬性修改通知俗慈。
約束屬性的改變可能會(huì)被拒絕姑宽,因此它的set方法(例如setDog( ))與一般其他JavaBean屬性的setDog( )有所不同。約束屬性方法如下:

public void setDog(dogType newDog) throws PropertyVetoException

4.構(gòu)造方法

在JavaBean中的函數(shù)和過(guò)程統(tǒng)稱為方法闺阱,通過(guò)方法來(lái)改變和獲取上面介紹的各種屬性值炮车。方法可以分為構(gòu)造方法、訪問(wèn)方法和普通方法等酣溃。

1.構(gòu)造方法

JavaBean的構(gòu)造方法就是對(duì)JavaBean的屬性及方法進(jìn)行初始化瘦穆,即對(duì)所定義的屬性及方法設(shè)一個(gè)初始值,構(gòu)造方法名要和JavaBean的類名相同赊豌。比如:

public class TimeShow {

    //定義屬性
    private int hour;
    private int minute;

    //構(gòu)造方法扛或,對(duì)屬性進(jìn)行初始化操作,其名字應(yīng)與bean的名字相同
    public TimeShow () {
        Date now = new Date ();
        hour = now.getHours ();
        minutes = now.getMinutes ();
}
}
2.訪問(wèn)方法

訪問(wèn)方法就是對(duì)組件中定義的屬性的訪問(wèn)碘饼,包括讀和寫(xiě)兩種訪問(wèn)方式告喊。在定義了Bean的屬性,并通過(guò)構(gòu)造的方法將其初始化后派昧,要讓其他程序訪問(wèn)Bean的這些屬性黔姜,就必須為其創(chuàng)建訪問(wèn)方法。
讀就是一種用于取出屬性的取值函數(shù)蒂萎,即getter秆吵;而寫(xiě)則是一種用于設(shè)置Bean屬性的賦值函數(shù),即setter五慈。比如:

public void setPropertyName(PropertyType value); //給屬性賦值纳寂,即寫(xiě)方法
publiv PropertyTypep getPropertyName (); //讀取屬性,即讀方法
3.普通方法

除了對(duì)屬性的訪問(wèn)方法外泻拦,還可以在Bean創(chuàng)建一般方法來(lái)實(shí)現(xiàn)對(duì)函數(shù)的調(diào)用毙芜,只要將Bean中的一般方法定義成公有的方法,就可以供其他程序調(diào)用争拐。比如:

package jsp..example.mybean;

public class Multiple {
    public int Multi (int j) {
    int x = 1;
    for (int i = 1; i <= j; ++i)
        {x = x * i;}
        return x;
    }
}
下面介紹一下如何在JSP中使用JavaBean

編寫(xiě)一個(gè)JavaBean類來(lái)計(jì)算圓的周長(zhǎng)和面積:

1.新建一個(gè)CircleBean類來(lái)計(jì)算圓的周長(zhǎng)和半徑腋粥。代碼如下:

package com.ch4;

public class CircleBean {
    private int radius =1;
    
    public CircleBean() {
        
    }
    
    public int getRadius() {
        return radius;
    }
    
    public void setRadius(int rRadius) {
        radius = rRadius;
    }
    
    public double circleLength() {
        return Math.PI*radius*2.0;
    }
    
    public double circleArea() {
        return Math.PI*radius*radius;
    }
}

2.新建一個(gè)r_input.jsp文件,用來(lái)輸入半徑,并將半徑提交到area_output.jsp隘冲。代碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.
getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <base href="<%=basePath%>">
        <title>My JSP 'r_input.jsp' 計(jì)算圓的面積</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is My Page!">
    </head>
    <body>
        <center>
            <form id="forml" name="forml" method="post" action="area_output.jsp">
            請(qǐng)輸入圓的半徑:
            <input name="radius" type="text" id="radius" /><br>
            <input type="submit" name="submit" value="開(kāi)始計(jì)算" />
            </form>
        </center>
    </body>
</html>

3.新建一個(gè)輸出半徑闹瞧、周長(zhǎng)和面積的area_output.jsp,利用JavaBean把得到的r賦值給半徑展辞,從而得到周長(zhǎng)和面積奥邮。代碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>">
<title>My JSP 'area_output.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keywords1, keywords2, keywords3">
<meta http-equiv="pragma" content="no-cache">
<!-- link rel="stylesheet" type="text/css" href="styles.css" -->
</head>
<body>
<jsp:useBean id="circleBean" scope="session" class="com.ch4.CircleBean" />
<center>
<%
    int radius=Integer.parseInt(request.getParameter("radius"));
    out.println("圓的半徑是:" + circleBean.getRadius( ) );
    out.println("圓的周長(zhǎng)是:" + circleBean.circleLength( ) );
    out.println("圓的面積是:" + circleBean.circleArea( ) );
%>
</center>
</body>
</html>

項(xiàng)目的目錄是這樣的:

圖片.png

最后我們把項(xiàng)目用tomcat跑起來(lái),在瀏覽器中輸入http://localhost:8081/HelloWorld/r_input.jsp罗珍。默認(rèn)的端口號(hào)為8080洽腺,這里我把8080改為了8081。

圖片.png
圖片.png

輸入半徑為1覆旱,顯示結(jié)果就從r_input.jsp跳轉(zhuǎn)到area_output.jsp中蘸朋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市通殃,隨后出現(xiàn)的幾起案子度液,更是在濱河造成了極大的恐慌,老刑警劉巖画舌,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堕担,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曲聂,警方通過(guò)查閱死者的電腦和手機(jī)霹购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朋腋,“玉大人齐疙,你說(shuō)我怎么就攤上這事⌒裱剩” “怎么了贞奋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)穷绵。 經(jīng)常有香客問(wèn)我轿塔,道長(zhǎng),這世上最難降的妖魔是什么仲墨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任勾缭,我火速辦了婚禮,結(jié)果婚禮上目养,老公的妹妹穿的比我還像新娘俩由。我一直安慰自己,他們只是感情好癌蚁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布幻梯。 她就那樣靜靜地躺著兜畸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礼旅。 梳的紋絲不亂的頭發(fā)上膳叨,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天洽洁,我揣著相機(jī)與錄音痘系,去河邊找鬼。 笑死饿自,一個(gè)胖子當(dāng)著我的面吹牛汰翠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昭雌,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼复唤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烛卧?” 一聲冷哼從身側(cè)響起佛纫,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎总放,沒(méi)想到半個(gè)月后呈宇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡局雄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年甥啄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炬搭。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜈漓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宫盔,到底是詐尸還是另有隱情融虽,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布灼芭,位于F島的核電站有额,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姿鸿。R本人自食惡果不足惜谆吴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苛预。 院中可真熱鬧句狼,春花似錦、人聲如沸热某。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筹吐,卻和暖如春糖耸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丘薛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工嘉竟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洋侨。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓舍扰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親希坚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子边苹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法裁僧,內(nèi)部類的語(yǔ)法个束,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法聊疲,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,645評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用茬底。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,594評(píng)論 1 114
  • 福彩膽~2~8~ 體彩膽~5~8~ 打底二十五注 585 885 577 171 886 442 772 639 ...
    散文_ae38閱讀 185評(píng)論 1 2
  • 我親愛(ài)的閨蜜分手了,談了2年多的感情,分手原因是狗血的性格不合.親愛(ài)的她哭哭啼啼的找到我,哭訴著各種不舍以及戀愛(ài)過(guò)...
    小七和小貓閱讀 344評(píng)論 0 6