jsp+javaBean
1,什么是可重用組件:是指能夠完成某種特定的功能,并提供了一個或多個訪問接口的聚合模塊程序,可重復使用是它最大的特點。
在java企業級開發中,最重要的兩類組件是javabean和EJB。
javabean本質就是一個java類,但是這個java類的組成必須符合一定的規則,這個規則也就是javabean規范,其中包括缺省的構造方法,setXXX和getXXXde風格來構造屬性等。他可以很容易的被組合到程序中去,一般包括業務邏輯代碼和數據訪問代碼等。jsp在使用他的時候可以用普通的java腳本實例化這個類,像其他java對象一樣使用,也可以使用jsp提供的動態標簽來訪問。
EJB 相對于javabean來說是一個大得多的組件,他必須生存在符合javaee規范的應用服務器中,它的定義和調用都要復雜的多,在實際的java開發中很小使用EJB組件。
2,javabean規范:
(1),它是一個公開類(public class);
(2),他有一個公開的無參數 的構造方法。
(3),提供了公開的setXXX和getXXX方法來決定javabean的屬性,
3,用jsp完成一種特定的功能時,有三種實現方式:
(1),在html代碼中間夾雜java語言寫成的jsp腳本,功能邏輯就在java語言中完成。缺點是:代碼可讀性差,很難維護。
(2),把功能邏輯包裝在一個javabean內,然后在jsp腳本中,用new關鍵字實例化這個javabean,在調用set和get方法來完成特定的功能,這種方式雖然維護比第一種好一些,但是可讀性仍然不好。
(3),同樣先把功能邏輯包裝在一個javabean鐘,再利用jsp提供的動作標簽來訪問javabean的屬性,這種方式比第二種耦合度進一步降低了,是一種值得推薦的方式。
4,jsp使用javabean的標簽詳解:
(1),定義javabean的動作標簽<jsp:useBean>
<jsp:useBean>標簽用于在特定的范圍內實例化或查找一個javabean,基本語法如下:
<jsp:useBean id="唯一標示名字"
scope="page|request|session|application";
type="父類型"
class="實現類">
id:表示在特定范圍內的唯一標示的名字;
scope:指定bean的存活范圍,有4種:page:默認是page,標示jsp的頁面范圍,如果是同一個請求的另外一個jsp也頁面就不見了。request:當前這一次的請求范圍,包含多個jsp頁面;session:標示會話范圍;application:標示整個web應用,與servlet上下文同義。
class:javabean的實例類名,必須是完整類名。
type:javabean的父類或者一實現接口。
<jsp:useBean>動作標簽的基本工作機制如下:
(1),在指定范圍內尋找是否已有名字為id屬性指定的對象。
(2),如果存在,且指定了type屬性,則用該type做一次強制類型轉換后再返回該對象的引用,如果沒用指定 ,則直接返回該對象的引用。
(3),如果不存在,則用class屬性指定的類實例化一個新的對象并返回,并將該對象保存到scope內。
(2),設置javabean屬性動作標簽<jsp:setProperty>
<jsp:setProperty>:是為javabean的可寫屬性賦值,它既可以放在<jsp:useBean>中間,也可以單獨使用,基本語法如下:
<jsp:setProperty
id="與javabean的屬性同名"
property="可寫屬性名"
value="字面值"
params="請求參數的名字"/>
name:bean的id
property:可寫屬性名,如setAge(),屬性名為age,如果是*,則表示將所有的屬性一一與請求參數按名匹配賦值。
value:為屬性復字面值,
params:http請求的參數名。
3,獲取javabean屬性動作標簽<jsp:getProperty>
<jsp:getProperty>是獲取javabean的可讀屬性,它既可以放在<jsp:useBean>中間,也可以單獨使用,基本語法如下: <jsp:getProperty
name="與javabean的id屬性值相同"
property="可讀屬性名">
4,javaBean封裝數據庫操作的代碼如下:
private static final String url="jdbc:mysql://localhost:3306/test";
private static final String username="root";
private static final String password="123";
private String table;
private Object[] params;
public Connection getCon(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url, username, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public void close(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public Object[] getParams() {
return params;
}
public void setParams(Object[] params) {
this.params = params;
}
5,javaBean封裝添加數據操作:
public boolean getInsertData(){
//Æ´½ÓsqlÓï¾ä
String sql="insert into "+table+" values(";
for (int i = 0; i <params.length; i++) {
sql+="?";
if(i!=params.length-1){
sql+=",";
}
}
sql+=")";
boolean rst=false;//¶¨Òå²Ù×÷½á¹û
Connection conn=null;//¶¨ÒåÁ¬½Ó¶ÔÏó
PreparedStatement pst=null;//¶¨Òå»á»°¶ÔÏó
try {
conn=this.getCon();//»ñÈ¡Êý¾Ý¿âÁ¬½Ó
conn.setAutoCommit(false);//¹Ø±Õ×Ô¶¯Ìá½»
pst=conn.prepareStatement(sql);//´´½¨»á»°
//Ñ»·ÉèÖòÎÊý
for (int i = 0; i < params.length; i++) {
pst.setObject(i+1,params[i]);
}
int num=pst.executeUpdate();//Ö´ÐÐsqlÓï¾ä
conn.commit();//Ìá½»ÊÂÎñ
//Èç¹ûÖ´Ðнá¹û´óÓÚ0 £¬´ú±íÖ´Ðгɹ¦
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
if(conn!=null){
try {
conn.rollback();//»Ø¹öÊÂÎñ
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
e.printStackTrace();
}finally{
close(conn,pst,null);//¹Ø±ÕÁ¬½Ó
}
return rst;
}
6,javabean封裝刪除數據操作:
public boolean getDeleteData(){
String sql="delete from "+table+" where "+params[0]+" =?";
boolean rst=false;
Connection conn=null;
PreparedStatement ps=null;
try {
conn=this.getCon();
conn.setAutoCommit(false);
ps=conn.prepareStatement(sql);
ps.setObject(1,params[1]);
int num=ps.executeUpdate();
conn.commit();
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn,ps,null);
}
return true;
}
7,javabean封裝修改數據操作:
public boolean getModifyData(){
String sql="update "+table+" set "+params[0]+" =? where "+params[2]+"=?";
boolean rst=false;
Connection conn=null;
PreparedStatement ps=null;
try {
conn=this.getCon();
conn.setAutoCommit(false);
ps=conn.prepareStatement(sql);
ps.setObject(1,params[1]);
ps.setObject(2,params[3]);
int num=ps.executeUpdate();
conn.commit();
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn,ps,null);
}
return rst;
}
8,javabean封裝查詢數據操作:
private Connection conn=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
public void setQuery(String sql){
try {
conn=this.getCon();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public List getList(){
List list=new ArrayList();
try {
while(rs.next()){
String str="";
for (int i = 0; i <params.length; i++) {
str +=rs.getObject(params[i].toString());
if(i!=params.length){
str +=",";
}
list.add(str);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
this.close(conn,ps, rs);
}
return list;
}
9,分頁技術:邏輯分頁和物理分頁
邏輯分頁:查詢sql語句不變,只不過通過java代碼從邏輯上控制結果集光標的位置,從而實現分頁;
物理分頁:改變sql語句,在數據庫查詢的時候只需取出需要的結果集,但是各個數據庫控制結果集的sql語句不一樣,;mysql:limit,orcale:rownum
兩種分頁技術各有優缺點:邏輯分頁效果低,但是程序容易控制,但不能跨數據庫。
10,邏輯分頁:邏輯分頁的關鍵點在于根據當前的節點去定位結果集的下標位置,把下標定位好以后,就知道它是否有下一頁和上一頁信息等。
實現邏輯分頁的步驟:(1),確定每頁的最大記錄數。(2),查詢總共記錄數。(3),根據總記錄數和每頁最大記錄數確定最大頁碼。(4)查詢結果集。(5),根據每頁最大記錄數和當前頁碼對結果集的下表進行定位。(6),不超過最大記錄數的循環打印結果集。
11,物理分頁的實現思想還是需要確定每頁的最大記錄數、當前頁碼、最大頁碼、總記錄數的信息,但是它把結果集下標定位交個數據庫來完成了,開發者需要做的就是把sql寫好。
對于mysql數據庫,需要開發者熟悉他的limit語句,limit語句需要追加到查詢語句的后面,告訴sql只返回規定行數的記錄,基本語法如下:
limit n #返回前 n行數據
limit n,m #返回從n+1行開始,最多m行的數據。
posted @ 2012-05-22 12:13 Mr Lee 閱讀(890) | 評論 (0) | 編輯 收藏