Jsp+JavaBean的組合已經(jīng)成為開發(fā)小型B/S應(yīng)用的最佳選擇,使用JavaBean可以把業(yè)務(wù)處理功能從jsp頁面分離,從而減少jsp頁面中間的java代碼量,使jsp頁面更專注處理數(shù)據(jù)的顯示,從而使頁面的邏輯變得十分清晰。套用一句廣告語:“自從采用jsp+JavaBean的組合,編寫jsp的程序不頭疼啦,維護(hù)jsp也變的簡單可行了。”
為什么要在jsp中使用JavaBean?
Jsp本質(zhì)就是把java代碼嵌套在靜態(tài)的HTML頁面中,從而使靜態(tài)的HTML頁面有了動(dòng)態(tài)的功能,從原理說,僅僅用jsp就可以實(shí)現(xiàn)所有動(dòng)態(tài)功能,既然這樣采用JavaBean的原因何在?
先看代碼
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSP示例程序</title> </head> <body> <% Date firstDate=new Date(); Date secondDate=new Date(107,6,23); %> <font size="1"><strong>本頁面戰(zhàn)士的功能式比較兩個(gè)日時(shí)間的前后:</strong><br> 第一個(gè)時(shí)間為:<%out.print(firstDate); %><br> 第二個(gè)時(shí)間為:<%out.print(secondDate); %><br> <% if(firstDate.before(secondDate)) out.println("第一個(gè)時(shí)間早于第二個(gè)時(shí)間"); else if(firstDate.after(secondDate)) out.println("第二個(gè)時(shí)間早于第一個(gè)時(shí)間"); else out.println("兩個(gè)時(shí)間相等"); %> </font> </body> </html>
上面的這個(gè)程序的功能非常簡單,這只是為了說明問題舉得一個(gè)簡單例子,實(shí)際開發(fā)中的邏輯和數(shù)據(jù)顯示要比這個(gè)例子復(fù)雜的多。然而盡管這么簡單的一個(gè)程序,但是還存在一些問題。還是上面文章提到的
可定制性差:如果需要比較的時(shí)間變化就不得不再次編寫頁面代碼。
可維護(hù)性差:如果頁面美工人員不懂Java代碼那么頁面的維護(hù)將變得異常困難。
復(fù)用性差:如果其他頁面也需要用到比較時(shí)間的功能就不得不從頭再次寫一遍及其相似的代碼。
對(duì)于上面的這個(gè)程序來說,上述的幾個(gè)問題都是無法解決的,這正是jsp開發(fā)在初期的致命傷,把所有的業(yè)務(wù)邏輯都放在jsp頁面處理從而導(dǎo)致頁面邏輯混亂不堪,不僅代碼不可重用,美工而已無法對(duì)頁面進(jìn)行視覺方面的美化,就連開發(fā)人員自己都有可能看不懂自己寫的代碼,這樣的無難題導(dǎo)致初期的jsp開發(fā)成為一件勞神費(fèi)力地苦差事。
然而JavaBean的出現(xiàn)解決掉了這樣的令人頭疼的問題,利用JavaBean可以把頁面上復(fù)雜的業(yè)務(wù)邏輯處理抽象成一個(gè)JavaBean利用JavaBean封裝負(fù)責(zé)的業(yè)務(wù)邏輯,在jsp頁面上只需要簡單調(diào)用這個(gè)實(shí)現(xiàn)業(yè)務(wù)邏輯這個(gè)實(shí)現(xiàn)業(yè)務(wù)的JavaBean即可,這樣就實(shí)現(xiàn)了業(yè)務(wù)處理和數(shù)據(jù)暫時(shí)的分離,而且封裝起來的JavaBean也成了可以重復(fù)利用的組件,不僅在其他別的頁面可以重復(fù)利用,而且其他的開發(fā)人員也可以不用考慮其具體的實(shí)現(xiàn),像調(diào)用一般java類一樣調(diào)用別人已經(jīng)寫好的JavaBean,與此同時(shí),剝離了業(yè)務(wù)邏輯的jsp頁面邏輯更加清晰,即便是美工人員對(duì)java一竅不通也絲毫不影響對(duì)頁面的沒貨工作,而開發(fā)人員面對(duì)這樣清晰的頁面邏輯輕松的讀懂當(dāng)然是不費(fèi)吹灰之力了。
Jsp+JavaBean實(shí)現(xiàn)上面代碼的功能
頁面代碼部分:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ page import="java.util.Date" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSP示例程序</title> </head> <body> <jsp:useBean id="date" class="beans.Compare" scope="page"></jsp:useBean> <% date.setFirstDate(new Date()); date.setSecondDate(new Date(107, 6, 23)); %> <font size="1"><strong>本頁面展示的功能式比較兩個(gè)日時(shí)間的前后</strong><br> 第一個(gè)時(shí)間為:<jsp:getProperty property="firstDate" name="date" /><br> 第二個(gè)時(shí)間為:<jsp:getProperty property="secondDate" name="date" /><br> <% out.println(date.compare()); %> </font> </body> </html>
JavaBean代碼部分:
package beans; import java.util.Date; public class Compare { //設(shè)置兩個(gè)日期屬性 private Date firstDate; private Date secondDate; //判斷兩個(gè)時(shí)間的前后 public String compare(){ if(firstDate.before(secondDate)) return "第一個(gè)時(shí)間早于第二個(gè)時(shí)間"; else if(firstDate.after(secondDate)) return "第二個(gè)時(shí)間早于第一個(gè)時(shí)間"; else return "兩個(gè)時(shí)間相等"; } //取得第一個(gè)時(shí)間 public Date getFirstDate(){ return firstDate; } //設(shè)置第一個(gè)時(shí)間 public void setFirstDate(Date firstDate){ this.firstDate =firstDate; } //取得第二個(gè)時(shí)間 public Date getSecondDate(){ return secondDate; } //設(shè)置第二個(gè)時(shí)間 public void setSecondDate(Date secondDate){ this.secondDate =secondDate; } }
這個(gè)頁面的運(yùn)行效果和上面的第一個(gè)代碼是一致的,但是很明顯這個(gè)JSP頁面上的Java代碼少了很多。雖然把邏輯代碼封裝成JavaBean增加了編碼的工作量,但是其帶來的便捷和高效式顯而易見的。
使用JavaBean其樂無窮~~