千里馬

          天馬行空

          #

          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)編輯 收藏

          servlet重點

           1,開發一個servlet大致需要的步驟:
             (1),編寫servlet源碼并編譯。
              (2),在web.xml進行相應的配置。
               (3),將包含該servlet的web應用程序部署到web容器里,并啟動web容器。
                 (4),通過瀏覽器訪問該servlet。
          2,servlet 的四個周期: 加載,初始化(init()),提供服務(service()),銷毀(detory())
          3,get的請求方式會把請求的參數追加到請求的url后面,首先在url的后面加一個?,然后使用"參數名=參數值",的形式追加參數。
            post請求方式則是把請求的參數放在請求的正文里,不能直接通過url看到。,
          4,獲取客戶端參數的兩種方式:getParament()(只有一哥 參數)和getParamentValues()(用于多值的參數)
          例子:
           String username= request.getParament("username")
          String[] hobbies=request.getParamentValues("hobby");
          5,cookie:記錄在客戶端瀏覽器的數據,它的格式是“名-值”對,一般可以通過cookie保存一些用戶的數據,如,登錄名,密碼等。
          java web容器會在用戶第一次請求的時候在瀏覽器的cookie里加入 一條名為“jsessionid”的數據,同樣web容器也有。以后的每次請求瀏覽器都會把cookie的值傳回到服務器端,所以服務器就會根據‘jsessionid’的值跟蹤一個用戶了。瀏覽器關閉,跟蹤結束。(回話的時間是有限制的)
          6,servlet轉發一個http請求分為直接轉發和間接轉發。
           間接轉發本質是兩次http請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個url發送,從而達到轉發的目的。
          直接轉發是瀏覽器只發出一次請求,servlet把請求轉發給servlet,Html,jsp或其他信息資源,有第二個信息資源響應該請求,在請求對象request中保存的對象對于每個信息資源都是共享的。
          web應用程序大多會有一個控制器,由控制器來控制請求應該轉發給那個信息資源,然后有信息資源處理請求,處理我完后還可能轉發給另外的信息資源返回給用戶,這個過程既是經典的MVC模式。
          7,過濾器:就是在目標資源和源頭資源之間起到過濾作用的一個東西。對于web應用程序來說,過濾器是處于服務器端的,隊請求消息和響應消息進行過濾的一中組件。
          過濾器是一種重要的設計模式,不僅引用在javaweb開發中,其他開發領域也會應用到過濾器模式,他可以在不侵入原有代碼的基礎上為他們提供一些功能。
          8,java web 應用程序的范圍模型。
          request:請求 代表了一次http請求,他的生命周期從請求開始知道請求的響應結束。中間可能會穿插多個信息資源,如過濾器,                   servlet,jsp。
          Session  會話,代表了一次會話,也可認為代表了一個用戶,一個會話里可以包含多次的請求。如果用戶長時間不發出請求,可能導致會話超時而過期,超時時長可以設置。因為它代表一個用戶,所以一般使用session保存用戶的數據,如購物車。
          application :應用  他的生命周期從web 容器啟動或部署該應用開始,一web 容器停止,或取消部署而結束。他的作用范圍最大,一般用于存放應用標題,或其他外部資源連接器等。
          9,監聽器體現了一種監聽事件模型。
            三種事件監聽:1,request事件監聽實現接口(ServltRequestListener)
                         2,session事件監聽接口(HttpSessionListener)
                         3,application事件監聽接口(ServletContextListener)
          10,forward和redirect的區別:
          forward是直接轉發,通過request調用
          redirect是間接轉發,通過response調用
          forward在服務端的內部發生,對于客戶端來說是不可見的,即使請求在服務器端的各個資源間轉發過多次,客戶端瀏覽器的地址欄的地址依然是最初的請求地址,redirect則相反,他的請求轉發實質是向客戶端發送一條請求另一個地址的結果,瀏覽器會修改地址欄的地址,再重新發一次新的請求,對于客戶端來說是可見的。
          11,
           Servlet體系結構和層次結構 

          1,Servlet體系結構       

            

                      ------請求   --->                            ------->                              ------->                       

          客戶端                              HTTP服務器                    Servlet容器                        Servlet   

                       <----- 響應  ----                            <---------                          <-------         

                         

          2,Servlet層次結構   

          Servlet是實現javax.servlet.Servlet接口的對象,大多數Servlet通過GenericServlet或HttpServlet進行擴展.   Servlet API 由兩個程序包組成  

           javax.servlet  包  

          類:     

          ServletInputStream類:從客戶端讀取二進制數據;     

          ServletOutputStream類;向客戶端發送二進制數據;     

          GenericServlet類:抽象類,定義了一個通用的,獨立于底層協議的Servlet。

             接口:    

           Servlet接口:管理Sevlet。定義實現Servlet的必須方法。一個Servlet必須實現Servlet接口或Servlet接口的擴展。     

          ServletConfig接口:Servlet初始化時,向Servlet傳遞配置信息。     

          ServletContext接口;Servlet上下文,使Servlet與其他的Servlet容器進行交互通信。    

           ServletRequest接口:向Servlet客戶端提供請求信息     

          ServletResponse接口;Servlet向客戶端提供響應信息。        

          javax.servlet.http     包

          類:     

           Cookie類      

          HttpServlet類:抽象類,繼承自GenericServlet。應用于HTTP協議的請求和響應的Servlet。    

           接口:     

           HttpSession接口:     

           HttpAttributeListener接口:會話的屬性監聽接口;     

           HttpServletRequest接口;擴展ServletRequest接口,向Servlet客戶端提供HTTP請求信息。    

           HttpServletResponse接口;擴展ServletResponse接口,Servlet向客戶端提供HTTP響應信息。   

            總體可以分為:  

           Servlet類:     實現具體協議的業務類,其目的是一個業務實現的WEB組件類;   

          Servlet接口:     該接口獨立于協議實現,其目的是為了定義服務器的組件標準;   

          GenericServlet抽象類:     該類提供了一個獨立于協議的實現,其目的是為了滿足服務器;   

          HttpServlet:     該類實現了HTTP協議,其目的是為了讓客戶程序擴展;

          posted @ 2012-05-13 18:06 Mr Lee 閱讀(620) | 評論 (0)編輯 收藏

          jdbc連接數據庫步驟

        1. JDBC連接數據庫  
        2. •創建一個以JDBC連接數據庫的程序,包含7個步驟:  
        3. 1加載JDBC驅動程序:  
        4.     在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Java虛擬機),  
        5.     這通過java.lang.Class類的靜態方法forName(String  className)實現。  
        6.     例如:  
        7.     try{  
        8.     //加載MySql的驅動類  
        9.     Class.forName("com.mysql.jdbc.Driver") ;  
        10.     }catch(ClassNotFoundException e){  
        11.     System.out.println("找不到驅動程序類 ,加載驅動失敗!");  
        12.     e.printStackTrace() ;  
        13.     }  
        14.    成功加載后,會將Driver類的實例注冊到DriverManager類中。  
        15. 2、提供JDBC連接的URL  
        16.    •連接URL定義了連接數據庫時的協議、子協議、數據源標識。  
        17.     •書寫形式:協議:子協議:數據源標識  
        18.     協議:在JDBC中總是以jdbc開始  
        19.     子協議:是橋連接的驅動程序或是數據庫管理系統名稱。  
        20.     數據源標識:標記找到數據庫來源的地址與連接端口。  
        21.     例如:(MySql的連接URL)  
        22.     jdbc:mysql:  
        23.         //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;  
        24.    useUnicode=true:表示使用Unicode字符集。如果characterEncoding設置為  
        25.    gb2312或GBK,本參數必須設置為true 。characterEncoding=gbk:字符編碼方式。  
        26. 3創建數據庫的連接  
        27.     •要連接數據庫,需要向java.sql.DriverManager請求并獲得Connection對象,  
        28.      該對象就代表一個數據庫的連接。  
        29.     •使用DriverManager的getConnectin(String url , String username ,   
        30.     String password )方法傳入指定的欲連接的數據庫的路徑、數據庫的用戶名和  
        31.      密碼來獲得。  
        32.      例如:  
        33.      //連接MySql數據庫,用戶名和密碼都是root  
        34.      String url = "jdbc:mysql://localhost:3306/test" ;   
        35.      String username = "root" ;  
        36.      String password = "root" ;  
        37.      try{  
        38.     Connection con =   
        39.              DriverManager.getConnection(url , username , password ) ;  
        40.      }catch(SQLException se){  
        41.     System.out.println("數據庫連接失敗!");  
        42.     se.printStackTrace() ;  
        43.      }  
        44. 4、創建一個Statement  
        45.     •要執行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3 
        46.      種類型:  
        47.       1、執行靜態SQL語句。通常通過Statement實例實現。  
        48.       2、執行動態SQL語句。通常通過PreparedStatement實例實現。  
        49.       3、執行數據庫存儲過程。通常通過CallableStatement實例實現。  
        50.     具體的實現方式:  
        51.         Statement stmt = con.createStatement() ;  
        52.        PreparedStatement pstmt = con.prepareStatement(sql) ;  
        53.        CallableStatement cstmt =   
        54.                             con.prepareCall("{CALL demoSp(? , ?)}") ;  
        55. 5執行SQL語句  
        56.     Statement接口提供了三種執行SQL語句的方法:executeQuery 、executeUpdate  
        57.    和execute  
        58.     1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句  
        59.         ,返回一個結果集(ResultSet)對象。  
        60.      2int executeUpdate(String sqlString):用于執行INSERT、UPDATE或  
        61.         DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等  
        62.      3、execute(sqlString):用于執行返回多個結果集、多個更新計數或二者組合的  
        63.         語句。  
        64.    具體實現的代碼:  
        65.           ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;  
        66.     int rows = stmt.executeUpdate("INSERT INTO ...") ;  
        67.     boolean flag = stmt.execute(String sql) ;  
        68. 6處理結果  
        69.     兩種情況:  
        70.      1、執行更新返回的是本次操作影響到的記錄數。  
        71.      2、執行查詢返回的結果是一個ResultSet對象。  
        72.     • ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法提供了對這些  
        73.       行中數據的訪問。  
        74.     • 使用結果集(ResultSet)對象的訪問方法獲取數據:  
        75.      while(rs.next()){  
        76.          String name = rs.getString("name") ;  
        77.     String pass = rs.getString(1) ; // 此方法比較高效  
        78.      }  
        79.     (列是從左到右編號的,并且從列1開始)  
        80. 7關閉JDBC對象   
        81.      操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲  
        82.      明順序相反:  
        83.      1、關閉記錄集  
        84.      2、關閉聲明  
        85.      3、關閉連接對象  
        86.           if(rs != null){   // 關閉記錄集  
        87.         try{  
        88.             rs.close() ;  
        89.         }catch(SQLException e){  
        90.             e.printStackTrace() ;  
        91.         }  
        92.           }  
        93.           if(stmt != null){   // 關閉聲明  
        94.         try{  
        95.             stmt.close() ;  
        96.         }catch(SQLException e){  
        97.             e.printStackTrace() ;  
        98.         }  
        99.           }  
        100.           if(conn != null){  // 關閉連接對象  
        101.          try{  
        102.             conn.close() ;  
        103.          }catch(SQLException e){  
        104.             e.printStackTrace() ;  
        105.          }  
        106.           } 
        107. posted @ 2012-05-08 13:55 Mr Lee 閱讀(381) | 評論 (0)編輯 收藏

          僅列出標題
          共2頁: 上一頁 1 2 

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          (hibernate)http://www.aygfsteel.com/dyllove98/archive/2012/05/12/377959.html

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 芦溪县| 延安市| 南阳市| 马尔康县| 博客| 景德镇市| 彰化市| 汕尾市| 通道| 望江县| 贵德县| 南皮县| 台州市| 新乡市| 渝中区| 冕宁县| 运城市| 尉犁县| 江口县| 大荔县| 南阳市| 登封市| 沧州市| 新竹县| 永川市| 潍坊市| 昌吉市| 扶沟县| 庆城县| 汉寿县| 玉龙| 沙洋县| 庄浪县| 泰来县| 台中市| 友谊县| 监利县| 武陟县| 绥江县| 温宿县| 平罗县|