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)目的目錄是這樣的:
最后我們把項(xiàng)目用tomcat跑起來(lái),在瀏覽器中輸入http://localhost:8081/HelloWorld/r_input.jsp罗珍。默認(rèn)的端口號(hào)為8080洽腺,這里我把8080改為了8081。
輸入半徑為1覆旱,顯示結(jié)果就從r_input.jsp跳轉(zhuǎn)到area_output.jsp中蘸朋。