熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

從零開始手把手教你用tomcat

2013-11-23 20:09:16  來源: Java開源技術 
    前言

  本文根據實例詳細介紹了如何在tomcat中配置數據源並且十分詳細的介紹了JDBC簡介事務處理數據源簡介配置數據源本文從最基礎的知識點開始講起讓不太了解tomcat的學者對其在頭腦裡有一個十分清晰透徹的了解

  開發環境

  本文的環境JDKTOMCATOraclei

  JDBC簡介

  提到數據源那就不能不說JDBCJDBC是Java Database Connectivity的縮寫在javasql包中提供了JDBC API定義了訪問數據庫的接口和類但是JDBC API不能直接訪問數據庫必須依賴於數據庫廠商提供的JDBC驅動程序即JDBC DRIVER

  Javasql中常用的接口和類如下
    Driver接口和DriverManager類
    Connection
    Statement
    PreparedSataement
    ResultSet

  Driver接口和DriverManager類
    DriverManager類用來建立和數據庫的連接以及管理JDBC驅動程序常用方法如下
    registerDriver(Driver driver) 在DriverManager中注冊JDBC驅動程序
    getConnection(String urlString userString pwd) 建立和數據庫的連接返回Connection對象
    setLoginTimeOut(int seconds) 設定等待數據庫連接的最長時間
    setLogWriter(PrintWriter out) 設定輸入數據庫日至的PrintWriter對象 

    Connection
    Connection代表和數據庫的連接其常用方法如下    
    getMetaData() 返回數據庫的MetaData數據MetaData數據包含了數據庫的相關信息例如當前數據庫連接的用戶名使用的JDBC驅動程序數據庫允許的最大連接數數據庫的版本等等
    createStatement() 創建並返回Statement對象
    PrepareStatement(String sql) 創建並返回prepareStatement對象    

    Statement
   
Statement用來執行靜態sql語句例如對於insertupdatedelete語句調用executeUpdate(String sql)方法而select語句可以調用executeQuery(String sql)方法executeQuery(String sql)方法返回ResultSet對象

  PrepareStatement
   
PrepareStatement用於執行動態的sql語句即允許sql語句中包含參數使用方法為
    String sql = select col from tablename where col=? And col=?;
    PrepareStatement perpStmt = connpreparestatement(sql);
    perpStmtsetstring(colValue);
    perpStmtsetFloat(colValue);
    ResultSet rs = perpStmtexecuteQuery();

  ResultSet
 ResultSet用來表示select語句查詢得到的記錄集一個StateMent對象在同一時刻只能打開一個ResultSet對象通過ResultSet的getXXX()方法來得到字段值ResultSet提供了getString()getFloat()getInt()等方法可以通過字段的序號或者字段的名字來制定獲取某個字段的值例如在上例中getString()getString(col)都可以獲得字段col的值

  事務處理

  在實際應用中我們會遇到同時提交多個sql語句這些sql語句要麼全部成功要麼全部失敗如果其中一條提交失敗則必須撤銷整個事務為此Connection類提供了個控制事務的方法    
    setAutoCommit(boolen autoCommit) 設置是否自動提交事務默認為自動提交
    commit() 提交事務
    rollback() 撤銷事務    
   參考例子
    try{    
            connSetautoCommit(false);    
            stmt = conncreatestatement();
            stmtexecuteUpdate(delete form table where col=);
            stmteecuteUpdate(delete from table where col=);    
            ();    
        }catch(Exception e){    
             eprintStackTrace;  
             }  
    try{
            connrollback();    
       } catch(Exception e){    
             eprintStackTrace;    
            }    
       }     
    通過一個JSP例子來訪問oracle數據庫
    <%@ page import=javautil*>    
    <%@ page import=javasql*>    
    <%    
    try{    
            Connection conn = null;    
            Statement stmt = null;    
            ResultSet rs = null;    
            //加載oracle驅動程序    
            ClassforName(oraclejdbcdriverOracleDriver);    
            //注冊oracle驅動程序    
            DriverManagerregidterDriver(new
            oraclejdbcdriverOracleDriver());    
            //建立數據庫連接    
            conn=DriverManagergetConnection(jdbc:oracle:thin:@your
            db ip:your db port:siddbuserdbpassword);    
            stmt = conncreateStatement();    
            rs = stmtexecuteQuery(select * from tablename);    
            while(rsnext){
                                    outprint(rsgetstring(colname));    
                               }

  }catch(Exception e){
                              }    
    finally{    
                 rsclose();    
                 stmtclose();    
                 connclose();    
            }
    %> 

    數據源簡介

    JDBC提供了javaxsqlDataSource的接口負責與數據庫建立連接實際應用時不需要編寫連接數據庫代碼直接從數據源獲得數據庫的連接Dataource中事先建立了多個數據庫連接這些數據庫連接保持在數據庫連接池中當程序訪問數據庫時只需要從連接池從取出空閒的連接訪問數據庫結束在將這些連接歸還給連接池DataSource對象由容器(Tomcat)提供不能使用創建實例的方法來生成DataSource對象要采用JAVA的JNDI(Java Nameing and Directory Interfacejava命名和目錄接口)來獲得DataSource對象的引用(另有一種說法其實從技術上來說數據源連接方式是不需要目錄服務的我們同樣可以通過序列化數據源對象直接訪問文件系統這點是需要明確的感興趣的朋友可以試試)JNDI是一種將對象和名字綁定的技術對象工廠負責生產出對象這些對象都和唯一的名字相綁定程序中可以通過這個名字來獲得對象的引用Tomcat把DataSource作為一種可配置的JNDI資源來處理生成DataSource對象的工廠為monsdbcpBasicDataSourceFactory

  配置數據源

  配置數據源其實相當簡單
    首先在serverxml中加入<Resource>元素打開serverxml在<Context>中加入以下代碼(以oracle為例)
    <Resource name=jdbc/ JNDI名字 auth=Container type=javaxsqlDataSource/>
    <ResourceParams name=jdbc/JNDI名字>
    <parameter>
    <name>factory</name> 
    <value>monsdbcpBasicDataSourceFactory</value>
    </parameter>
    <parameter>
    <name>maxActive</name>
    <value></value>
    </parameter>
    <parameter>
    <name>maxIdle</name>
    <value></value>
    </parameter>
    <parameter>
    <name>maxWait</name> 
    <value></value>
    </parameter>
    <parameter> 
    <name>username</name>
    <value>用戶名</value>
    </parameter>
    <parameter>
    <name>password</name>
    <value>密碼</value>
    </parameter>
    <parameter>
    <name>driverClassName</name>
    <value>oraclejdbcdriverOracleDriver</value>
    </parameter>
    <parameter>
    <name>url</name> 
    <value>jdbc:oracle:thin:@ip:端口:sid </value>
    </parameter>
    </ResourceParams>     
    <Resource>元素的屬性如下 
    name 指定Resource的JNDI的名字 
    auth 指定管理Resource的Manager由兩個可選值Container和ApplicationContainer表示由容器來創建和管理ResourceApplication表示由WEB應用來創建和管理Resource如果在web application deployment descriptor中使用<resourceref>這個屬性是必需的如果使用<resourceenvref>這個屬性是可選的
    type 指定Resource所屬的java類名
    
   <ResourceParams>元素的屬性如下
   
name 指定ResourceParams的JNDI的名字必須和Resource的name保持一致
    factory 指定生成DataSource對象的factory的類名
    maxActive 指定數據庫連接池中處於活動狀態的數據庫連接最大數目表示不受限制
    maxIdle 指定數據庫連接池中處於空閒狀態的數據庫連接的最大數目表示不受限制
    maxWait 指定數據庫連接池中的數據庫連接處於空閒狀態的最長時間(單位為毫秒)超過這一事件將會拋出異常表示可以無限期等待
    username 指定連接數據庫的用戶名
    password 指定連接數據庫的密碼
    driverClassName 指定連接數據庫的JDBC驅動程序
    url 指定連接數據庫的URL

  其他文章說以上配置就OK了對於webxml的配置可有可無其實不是這樣子的如果在web應用中訪問了由Servlet容器管理的某個JNDI Resource則必須在webxml中聲明對這個JNDI Resource的引用表示資源引用的元素為<resourceref>該元素加在<wepapp></ wepapp >中    
    <resourceref>
    <descryiption>DB Connection</descryiption>
    <resrefname>jdbc/JNDI名字 </resrefname>
    <restype>javaxsqlDataSource </res type>
    <resauth>Container </resauth>
    </resourceref>

  <resourceref>元素的屬性如下
    description 對所引用的資源的說明
    resrefname 指定所引用資源的JNDI名字與<Resource>元素中的name屬性保持一致
    restype 指定所引用資源的類名字與<Resource>元素中的type屬性保持一致
    resauth 指定所引用資源的Manager與<Resource>元素中的auth屬性保持一致
    
    到這裡數據源就已經配置成功了但是我在測試的時候除了一點小麻煩主要原因是對DataSource的概念沒搞清楚我是這麼測試的寫一個測試類然後在eclipse中進行junit測試捕獲的異常為
    javaxnamingNoInitialContextException: Need to specify class name in environment or system property or as an applet parameter or in an application resource file: javanamingfactoryinitial

  同樣的代碼在JSP文件中正常運行後來翻了一些資料終於找到了問題的所在了原來DataSource是由容器(TOMCAT)提供的所以我的測試會拋出異常為了再次驗證想法是否正確在jsp文件中import剛才拋出異常的類在進行連接數據庫結果一切正常

  下面的例子是實際應用中使用DataSource在jsp文件中連接oracle
    <%@ page language=java import=javautil* pageEncoding=UTF%>
    <%@ page import=javasql*%>
    <%@ page import=javaxnaming*%>
    <%@ page import=javaxsql*%>
    <!DOCTYPE HTML PUBLIC //WC//DTDHTML Transitional//EN>
    <html>
    <head>
    </head>
    <body>
    <%
        Context initContext = new InitialContext();
        Context envContext = (Context) initContextlookup(java:/comp/env);    
        DataSource db = (DataSource)envContextlookup(jdbc/javablogorl);    
        //javablogorl為<Resource>元素中name屬性的值
        Connection conn = dbgetConnection( );
        Statement stmt = conncreateStatement();    
        ResultSet rs = stmtexecuteQuery(SELECT * FROM blog_systemadmin);
        while(rsnext()){
        outprint(rsgetString(admin_name)+ );
        outprint(rsgetString(admin_password)+<br>);
       }
    rsclose();
    stmtclose();
    connclose();
    %>
    </body>
    </html> 
    
另:tomcat的配制方法為:
    <Resource name=jdbc/JNDI名字 auth=Container type=javaxsqlDataSource
               maxActive= maxIdle= maxWait=username=用戶名 password=密碼 driverClassName=oraclejdbcdriverOracleDriver              url=jdbc:oracle:thin:@ip:端口:sid/> 


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28022.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.