BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆檔案

          exams


          java世界

          世界Java

          #

          時(shí)常看到一些人說(shuō)掌握了Java,但是讓他們用Java做一個(gè)實(shí)際的項(xiàng)目可能又困難重重,在這里,筆者根據(jù)自己的一點(diǎn)理解斗膽提出自己的一些對(duì)掌握J(rèn)ava這個(gè)說(shuō)法的標(biāo)準(zhǔn),當(dāng)然對(duì)于新手,也可以提供一個(gè)需要學(xué)習(xí)哪些內(nèi)容的參考。另外這個(gè)標(biāo)準(zhǔn)僅限于J2SE部分,J2EE部分的內(nèi)容有時(shí)間再另說(shuō)。
          1、語(yǔ)法:必須比較熟悉,在寫(xiě)代碼的時(shí)候IDE的編輯器對(duì)某一行報(bào)錯(cuò)應(yīng)該能夠根據(jù)報(bào)錯(cuò)信息知道是什么樣的語(yǔ)法錯(cuò)誤并且知道任何修正。
          2、命令:必須熟悉JDK帶的一些常用命令及其常用選項(xiàng),命令至少需要熟悉:appletviewer、HtmlConverter、jar、java、javac、javadoc、javap、javaw、native2ascii、serialver,如果這些命令你沒(méi)有全部使用過(guò),那么你對(duì)java實(shí)際上還很不了解。
          3、工具:必須至少熟練使用一種IDE的開(kāi)發(fā)工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括進(jìn)行工程管理、常用選項(xiàng)的設(shè)置、插件的安裝配置以及進(jìn)行調(diào)試。
          4、API:Java的核心API是非常龐大的,但是有一些內(nèi)容筆者認(rèn)為是必須熟悉的,否則不可能熟練的運(yùn)用Java,包括:
              1)、java.lang包下的80%以上的類(lèi)的功能的靈活運(yùn)用。
              2)、java.util包下的80%以上的類(lèi)的靈活運(yùn)用,特別是集合類(lèi)體系、規(guī)則表達(dá)式、zip、以及時(shí)間、隨機(jī)數(shù)、屬性、資源和Timer。
              3)、java.io包下的60%以上的類(lèi)的使用,理解IO體系的基于管道模型的設(shè)計(jì)思路以及常用IO類(lèi)的特性和使用場(chǎng)合。
              4)、java.math包下的100%的內(nèi)容。
              5)、java.net包下的60%以上的內(nèi)容,對(duì)各個(gè)類(lèi)的功能比較熟悉。
              6)、java.text包下的60%以上的內(nèi)容,特別是各種格式化類(lèi)。
              7)、熟練運(yùn)用JDBC。
              8)、java.security包下40%以上的內(nèi)容,如果對(duì)于安全沒(méi)有接觸的話根本就不可能掌握java。
              9)、AWT的基本內(nèi)容,包括各種組件事件、監(jiān)聽(tīng)器、布局管理器、常用組件、打印。
              10)、Swing的基本內(nèi)容,和AWT的要求類(lèi)似。
              11)、XML處理,熟悉SAX、DOM以及JDOM的優(yōu)缺點(diǎn)并且能夠使用其中的一種完成XML的解析及內(nèi)容處理。
          5、測(cè)試:必須熟悉使用junit編寫(xiě)測(cè)試用例完成代碼的自動(dòng)測(cè)試。
          6、管理:必須熟悉使用ant完成工程管理的常用任務(wù),例如工程編譯、生成javadoc、生成jar、版本控制、自動(dòng)測(cè)試( 1T6-530  ) 。
          7、排錯(cuò):應(yīng)該可以根據(jù)異常信息比較快速的定位問(wèn)題的原因和大致位置。
          8、思想:必須掌握OOP的主要要求,這樣使用Java開(kāi)發(fā)的系統(tǒng)才能是真正的Java系統(tǒng)。
          9、規(guī)范:編寫(xiě)的代碼必須符合流行的編碼規(guī)范,例如類(lèi)名首字母大寫(xiě),成員和方法名首字母小寫(xiě),方法名的第一個(gè)單詞一般是動(dòng)詞,包名全部小寫(xiě)等,這樣程序的可讀性才比較好。
          posted @ 2007-10-09 10:22 java2java 閱讀(3101) | 評(píng)論 (10)編輯 收藏

          數(shù)據(jù)庫(kù)操作現(xiàn)在是項(xiàng)目開(kāi)發(fā)的根本,學(xué)習(xí)Java首先應(yīng)該學(xué)會(huì)怎么樣連接數(shù)據(jù)庫(kù),用Java連接數(shù)據(jù)庫(kù)可不像用Delphi這類(lèi)工具那樣設(shè)幾個(gè)屬性就OK,說(shuō)簡(jiǎn)單也簡(jiǎn)單,說(shuō)復(fù)雜,其實(shí)也挺復(fù)雜的,而且很麻煩,如果是初學(xué),根本不能保證第一次就連接成功,下面以SQL Server 2000為例,說(shuō)說(shuō)Java連接數(shù)據(jù)庫(kù)的基本方法,也記錄一下心得。


          1、下載SQL Server 2000 driver for JDBC
                 SQL Server 2000 Driver For JDBC Downloads
                
          該驅(qū)動(dòng)截止目前有四個(gè)版本,建議下載最新的SP3版。

                
          該驅(qū)動(dòng)安裝成功后,請(qǐng)將安裝目錄下的lib目錄下的三個(gè).jar文件加到CLASSPATH中;如果你使用的是JBuilderEclipse,將這三個(gè)文件根據(jù)IDE的提示加到工程中也可。


          2、升級(jí)你的SQL Server 2000,為其打上最新的補(bǔ)丁。
                
          這一步可能不是必需的,因操作系統(tǒng)環(huán)境而定,在不打補(bǔ)丁的情況,有時(shí)可以正常連接,有時(shí)卻不能,所以建議還是安裝最新的SQL Server 2000補(bǔ)丁(SP4)和JDBC驅(qū)動(dòng)(SP3)。
                
          如果你的程序在運(yùn)行時(shí)提示:Error establishing socket,一般情況下,打上SQL Server 2000的補(bǔ)丁就可解決 190-534 1T6-530 。

          3、驅(qū)動(dòng)的加載方法
               
          在建立連接之前,要先加載SQL Server 2000 JDBC的驅(qū)動(dòng),代碼形式如下:
                Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
               
          在此注意,forName方法的參數(shù)字符串必須完全相同于以上內(nèi)容,大小寫(xiě)是區(qū)分的,其實(shí)這個(gè)串就是驅(qū)動(dòng)類(lèi)的完整名稱(chēng):包名+類(lèi)名。


          4、獲得一個(gè)連接
               
          在操作數(shù)據(jù)庫(kù)之前,要先獲得與數(shù)據(jù)庫(kù)的一個(gè)連接,使用如下代碼格式:
                DriverManager.getConnection(
          連接字符串, 登錄用戶名, 登錄密碼);
               
          例:

                DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs", "sa", "");
               
          在此處關(guān)鍵的是連接字符串的內(nèi)容,localhost部分即服務(wù)器的名字,可以更改;1433部分為SQL Server使用的端口號(hào),根據(jù)實(shí)際情況修改即可;DatabaseName即為要連接的數(shù)據(jù)庫(kù)的名字,在此注意DatabaseName之前的是分號(hào),而不是冒號(hào)。


          5、代碼實(shí)例


          // 導(dǎo)入Java SQL包,連接數(shù)據(jù)庫(kù)必需;
          import java.sql.*;


          public class TestDB {
             public static void main(String[] args) {
                 String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
                 String dbURL = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs";
                 String userName = "sa";
                 String userPwd = "";
                 Connection dbConn


                 try {
                     Class.forName(driverName);
                     dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
                     System.out.println("Connection Successful!");
                 }
                 Catch (Exception e) {
                     e.printStackTrace();
                 }
             }
          }


          6、可能出現(xiàn)的問(wèn)題
               
          如果以上的代碼運(yùn)行后,輸出"Connection Successful!",那就代表一切正常,連接數(shù)據(jù)庫(kù)成功,你可以進(jìn)行StatementResultSet的操作了;反之的話,一定是出現(xiàn)了相應(yīng)的異常。
               
          如果提示錯(cuò)誤"Error establishing socket",請(qǐng)根據(jù)之前的說(shuō)明安裝相應(yīng)的SQL Server 2000補(bǔ)丁即可。
               
          如果提示"ClassNotFoundException",那一定是 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 該段代碼拼寫(xiě)有誤,或者是SQL Server 2000 Driver For JDBC Lib目錄下的三個(gè).jar文件未加入到CLASSPATH中。

          posted @ 2007-10-07 11:23 java2java 閱讀(1357) | 評(píng)論 (1)編輯 收藏

               摘要:   閱讀全文
          posted @ 2007-09-29 11:32 java2java 閱讀(715) | 評(píng)論 (2)編輯 收藏

               摘要: 1.java數(shù)據(jù)庫(kù)操作基本流程
          a .數(shù)據(jù)庫(kù)連接1.Drivermanager 鏈接數(shù)據(jù)庫(kù)
          String className,url,uid,pwd;
          className="oracle.jdbc.driver.OracleDriver";
          uid="scott";
          pwd="tiger";
          url="jdbc:oracle:thin:@localhost:1521:ora92";
            閱讀全文
          posted @ 2007-09-27 11:02 java2java 閱讀(720) | 評(píng)論 (3)編輯 收藏

          request對(duì)象

              客戶端的請(qǐng)求信息被封裝在request對(duì)象中,通過(guò)它才能了解到客戶的需求,然后做出響應(yīng)。它是HttpServletRequest類(lèi)的實(shí)例。

          序號(hào) 方 法 說(shuō) 明
          1  object getAttribute(String name) 返回指定屬性的屬性值
          2  Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
          3  String getCharacterEncoding() 返回字符編碼方式
          4  int getContentLength() 返回請(qǐng)求體的長(zhǎng)度(以字節(jié)數(shù))
          5  String getContentType() 得到請(qǐng)求體的MIME類(lèi)型
          6  ServletInputStream getInputStream() 得到請(qǐng)求體中一行的二進(jìn)制流
          7  String getParameter(String name) 返回name指定參數(shù)的參數(shù)值
          8  Enumeration getParameterNames() 返回可用參數(shù)名的枚舉
          9  String[] getParameterValues(String name) 返回包含參數(shù)name的所有值的數(shù)組
          10  String getProtocol() 返回請(qǐng)求用的協(xié)議類(lèi)型及版本號(hào)
          11  String getScheme() 返回請(qǐng)求用的計(jì)劃名,如:http.https及ftp等
          12  String getServerName() 返回接受請(qǐng)求的服務(wù)器主機(jī)名
          13  int getServerPort() 返回服務(wù)器接受此請(qǐng)求所用的端口號(hào)
          14  BufferedReader getReader() 返回解碼過(guò)了的請(qǐng)求體
          15  String getRemoteAddr() 返回發(fā)送此請(qǐng)求的客戶端IP地址
          16  String getRemoteHost() 返回發(fā)送此請(qǐng)求的客戶端主機(jī)名
          17  void setAttribute(String key,Object obj) 設(shè)置屬性的屬性值
          18  String getRealPath(String path) 返回一虛擬路徑的真實(shí)路徑
          19    
          20    
               

          <%@ page contentType="text/html;charset=gb2312"%>
          <%request.setCharacterEncoding("gb2312");%>
          <html>
          <head>
          <title>request a00-206 </title>
          </head>
          <body bgcolor="#FFFFF0">
          <form action="" method="post">
            <input type="text" name="qwe">
            <input type="submit" value="提交">
          </form>
          請(qǐng)求方式:<%=request.getMethod()%><br>
          請(qǐng)求的資源:<%=request.getRequestURI()%><br>
          請(qǐng)求用的協(xié)議:<%=request.getProtocol()%><br>
          請(qǐng)求的文件名:<%=request.getServletPath()%><br>
          請(qǐng)求的服務(wù)器的IP:<%=request.getServerName()%><br>
          請(qǐng)求服務(wù)器的端口:<%=request.getServerPort()%><br>
          客戶端IP地址:<%=request.getRemoteAddr()%><br>
          客戶端主機(jī)名:<%=request.getRemoteHost()%><br>
          表單提交來(lái)的值:<%=request.getParameter("qwe")%><br>
          </body>
          </html>
          <%@ page contentType="text/html;charset=gb2312"%>
          <%request.setCharacterEncoding("gb2312");%>
          <%@ page import="java.util.Enumeration"%>
          <html>
          <head>
            <title>request 250-10 </title>
          </head>
          <body bgcolor="#FFFFF0">
          <form action="" method="post">
             用戶名:<input type="text" name="username">&nbsp;&nbsp;
             密 碼:<input type="text" name="userpass">&nbsp;&nbsp;
             <input type="submit" value="進(jìn)入" >
          </form>
          <%
          String str="";
          if(request.getParameter("username")!=null && request.getParameter("userpass")!=null){
             Enumeration enumt = request.getParameterNames();
             while(enumt.hasMoreElements()){
                str=enumt.nextElement().toString();
                out.println(str+":"+request.getParameter(str)+"<br>");
             }
          }
          %>
          </body>
          </html>
          <%@ page contentType="text/html;charset=gb2312"%>
          <%request.setCharacterEncoding("gb2312");%>
          <html>
          <head>
             <title> e20-090 </title>
          </head>
          <body bgcolor="#FFFFF0">
          <form action="" method="post">
            擅長(zhǎng):<input type="checkbox" name="cb" value="ON1">VC++&nbsp;
                 <input type="checkbox" name="cb" value="ON2">JAVA&nbsp;
                 <input type="checkbox" name="cb" value="ON3">DELPHI&nbsp;
                 <input type="checkbox" name="cb" value="ON4">VB&nbsp;
                 <br>
                 <input type="submit" value="進(jìn)入" name="qwe">
          </form>
          <%
          if(request.getParameter("qwe")!=null ){
             for(int i=0;i<request.getParameterValues("cb").length;i++){
                out.println("cb"+i+":"+request.getParameterValues("cb")[i]+"<br>");
             }
             out.println(request.getParameter("qwe"));
          }
          %>
          </body>
          </html>

          posted @ 2007-09-26 09:53 java2java 閱讀(2886) | 評(píng)論 (1)編輯 收藏

          內(nèi)容簡(jiǎn)介

          STEVEN GOULD在文中介紹了JAVA2平臺(tái)企業(yè)版(J2EE)的13種核心技術(shù):JDBC, JNDI, EJBS, RMI, JSP, JAVA SERVLETS, XML, JMS, JAVA IDL, JTS, JTA, JAVAMAIL 和 JAF。為了聯(lián)系實(shí)際,GOULD基于WEBLOGIC應(yīng)用服務(wù)器?來(lái)自BEA SYSTEMS公司的一種廣為應(yīng)用的產(chǎn)品?環(huán)境來(lái)介紹J2EE的這些技術(shù)。

          JAVA最初是在瀏覽器和客戶端機(jī)器中粉墨登場(chǎng)的。當(dāng)時(shí),很多人質(zhì)疑它是否適合做服務(wù)器端的開(kāi)發(fā)。現(xiàn)在,隨著對(duì)JAVA2平臺(tái)企業(yè)版(J2EE)第三方支持的增多,JAVA被廣泛接納為開(kāi)發(fā)企業(yè)級(jí)服務(wù)器端解決方案的首選平臺(tái)之一。

          J2EE平臺(tái)由一整套服務(wù)(SERVICES)、應(yīng)用程序接口(APIS)和協(xié)議構(gòu)成,它對(duì)開(kāi)發(fā)基于WEB的多層應(yīng)用提供了功能支持。

          在本文中我將解釋支撐J2EE的13種核心技術(shù):JDBC, JNDI, EJBS, RMI, JSP, JAVA SERVLETS, XML, JMS, JAVA IDL, JTS, JTA, JAVAMAIL 和 JAF,同時(shí)還將描述在何時(shí)、何處需要使用這些技術(shù)。當(dāng)然,我還要介紹這些不同的技術(shù)之間是如何交互的。

          此外,為了讓您更好地感受 J2EE的真實(shí)應(yīng)用,我將在WEBLOGIC應(yīng)用服務(wù)器?來(lái)自BEA SYSTEMS公司的一種廣為應(yīng)用的產(chǎn)品?環(huán)境下來(lái)介紹這些技術(shù)。不論對(duì)于WEBLOGIC應(yīng)用服務(wù)器和J2EE的新手,還是那些想了解J2EE能帶來(lái)什 么好處的項(xiàng)目管理者和系統(tǒng)分析員,相信本文一定很有參考價(jià)值。

          宏觀印象: 分布式結(jié)構(gòu)和J2EE

          過(guò)去,二層化應(yīng) 用 -- 通常被稱(chēng)為CLIENT/SERVER應(yīng)用 -- 是大家談?wù)摰淖疃嗟摹D1刻畫(huà)了典型的二層化結(jié)構(gòu)。在很多情況下,服務(wù)器提供的唯一服務(wù)就是數(shù)據(jù)庫(kù)服務(wù)。在這種解決方案中,客戶端程序負(fù)責(zé)數(shù)據(jù)訪問(wèn)、實(shí)現(xiàn) 業(yè)務(wù)邏輯、用合適的樣式顯示結(jié)果、彈出預(yù)設(shè)的用戶界面、接受用戶輸入等。CLIENT/SERVER結(jié)構(gòu)通常在第一次部署的時(shí)候比較容易,但難于升級(jí)或改 進(jìn),而且經(jīng)常基于某種專(zhuān)有的協(xié)議?通常是某種數(shù)據(jù)庫(kù)協(xié)議。它使得重用業(yè)務(wù)邏輯和界面邏輯非常困難。更重要的是,在WEB時(shí)代,二層化應(yīng)用通常不能體現(xiàn)出很 好的伸縮性,因而很難適應(yīng)INTERNET的要求。



          圖1. 二層化應(yīng)用結(jié)構(gòu)

          SUN設(shè)計(jì)J2EE的部分起因就是想解決二層化結(jié)構(gòu)的缺陷。于是,J2EE定義了一套標(biāo)準(zhǔn)來(lái)簡(jiǎn)化N層企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)。它定義了一套標(biāo)準(zhǔn)化的組件,并為這些組件提供了完整的服務(wù)。J2EE還自動(dòng)為應(yīng)用程序處理了很多實(shí)現(xiàn)細(xì)節(jié),如安全、多線程等。

          用J2EE開(kāi)發(fā)N層應(yīng)用包括將二層化結(jié)構(gòu)中的不同層面切分成許多層。一個(gè)N層化應(yīng)用A能夠?yàn)橐韵碌拿糠N服務(wù)提供一個(gè)分開(kāi)的層:

          顯示:在一個(gè)典型的WEB應(yīng)用中,客戶端機(jī)器上運(yùn)行的瀏覽器負(fù)責(zé)實(shí)現(xiàn)用戶界面。

          動(dòng)態(tài)生成顯示: 盡管瀏覽器可以完成某些動(dòng)態(tài)內(nèi)容顯示,但為了兼容不同的瀏覽器,這些動(dòng)態(tài)生成工作應(yīng)該放在WEB服務(wù)器端進(jìn)行,使用JSP、SERVLETS,或者XML(可擴(kuò)展標(biāo)記語(yǔ)言)和(可擴(kuò)展樣式表語(yǔ)言)。

          業(yè)務(wù)邏輯:業(yè)務(wù)邏輯適合用SESSION EJBS(后面將介紹)來(lái)實(shí)現(xiàn)。

          數(shù)據(jù)訪問(wèn):數(shù)據(jù)訪問(wèn)適合用ENTITY EJBS(后面將介紹)和JDBC來(lái)實(shí)現(xiàn)。

          后臺(tái)系統(tǒng)集成: 同后臺(tái)系統(tǒng)的集成可能需要用到許多不同的技術(shù),至于何種最佳需要根據(jù)后臺(tái)系統(tǒng)的特征而定。

          您可能開(kāi)始詫異:為什么有這么多的層?事實(shí)上,多層方式可以使企業(yè)級(jí)應(yīng)用具有很強(qiáng)的伸縮性,它允許每層專(zhuān)注于特定的角色。例如,讓W(xué)EB服務(wù)器負(fù)責(zé)提供頁(yè)面,應(yīng)用服務(wù)器處理應(yīng)用邏輯,而數(shù)據(jù)庫(kù)服務(wù)器提供數(shù)據(jù)庫(kù)服務(wù)。

          由于J2EE建立在JAVA2平臺(tái)標(biāo)準(zhǔn)版(J2SE)的基礎(chǔ)上,所以具備了J2SE的所有優(yōu)點(diǎn)和功能。包括“編寫(xiě)一次,到處可用”的可移植性、通過(guò) JDBC訪問(wèn)數(shù)據(jù)庫(kù)、同原有企業(yè)資源進(jìn)行交互的CORBA技術(shù),以及一個(gè)經(jīng)過(guò)驗(yàn)證的安全模型。在這些基礎(chǔ)上,J2EE又增加了對(duì)EJB(企業(yè)級(jí)JAVA組 件)、JAVA SERVLETS、JAVA服務(wù)器頁(yè)面(JSPS)和XML技術(shù)的支持。

          分布式結(jié)構(gòu)與WEBLOGIC應(yīng)用服務(wù)器

          J2EE提供了一個(gè)框架--一套標(biāo)準(zhǔn)API--用于開(kāi)發(fā)分布式結(jié)構(gòu)的應(yīng)用,這個(gè)框架的實(shí)際實(shí)現(xiàn)留給了第三方廠商。部分廠商只是專(zhuān)注于整個(gè)J2EE架構(gòu)中 的的特定組件,例如APACHE的TOMCAT提供了對(duì)JSP和SERVLETS的支持,BEA系統(tǒng)公司則通過(guò)其WEBLOGIC應(yīng)用服務(wù)器產(chǎn)品為整個(gè) J2EE規(guī)范提供了一個(gè)較為完整的實(shí)現(xiàn)。

          WEBLOGIC服務(wù)器已使建立和部署伸縮性較好的分布式應(yīng)用的過(guò)程大為簡(jiǎn)化。WEBLOGIC和J2EE代你處理了大量常規(guī)的編程任務(wù),包括提供事務(wù)服務(wù)、安全領(lǐng)域、可靠的消息、名字和目錄服務(wù)、數(shù)據(jù)庫(kù)訪問(wèn)和連接池、線程池、負(fù)載平衡和容錯(cuò)處理等。

          通過(guò)以一種標(biāo)準(zhǔn)、易用的方式提供這些公共服務(wù),象WEBLOGIC服務(wù)器這樣的產(chǎn)品造就了具有更好伸縮性和可維護(hù)性的應(yīng)用系統(tǒng),使其為大量的用戶提供了增長(zhǎng)的可用性。

          J2EE技術(shù)

          在接下來(lái)的部分里,我們將描述構(gòu)成J2EE的各種技術(shù),并且了解WEBLOGIC服務(wù)器是如何在一個(gè)分布式應(yīng)用中對(duì)它們進(jìn)行支持的。最常用的J2EE技術(shù)應(yīng)該是JDBC、JNDI、EJB、JSP和SERVLETS,對(duì)這些我們將作更仔細(xì)的考察。

          圖2表示了在一個(gè)分布式應(yīng)用中,J2EE技術(shù)的各個(gè)方面通常在何處發(fā)揮作用。



          圖2. 一個(gè)N層應(yīng)用結(jié)構(gòu)的例子

          JAVA DATABASE CONNECTIVITY (JDBC)

          JDBC API以一種統(tǒng)一的方式來(lái)對(duì)各種各樣的數(shù)據(jù)庫(kù)進(jìn)行存取。和ODBC一樣,JDBC為開(kāi)發(fā)人員隱藏了不同數(shù)據(jù)庫(kù)的不同特性。另外,由于JDBC建立在JAVA的基礎(chǔ)上,因此還提供了數(shù)據(jù)庫(kù)存取的平臺(tái)獨(dú)立性。

          JDBC定義了4種不同的驅(qū)動(dòng)程序,現(xiàn)分述如下:

          類(lèi)型 1: JDBC-ODBC BRIDGE

          在JDBC出現(xiàn)的初期,JDBC-ODBC橋顯然是非常有實(shí)用意義的,通過(guò)JDBC-ODBC橋,開(kāi)發(fā)人員可以使用JDBC來(lái)存取ODBC數(shù)據(jù)源。不足 的是,他需要在客戶端安裝ODBC驅(qū)動(dòng)程序,換句話說(shuō),必須安裝MICROSOFT WINDOWS的某個(gè)版本。使用這一類(lèi)型你需要犧牲JDBC的平臺(tái)獨(dú)立性。另外,ODBC驅(qū)動(dòng)程序還需要具有客戶端的控制權(quán)限。

          類(lèi)型 2: JDBC-NATIVE DRIVER BRIDGE

          JDBC本地驅(qū)動(dòng)程序橋提供了一種JDBC接口,它建立在本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)程序的頂層,而不需要使用ODBC。 JDBC驅(qū)動(dòng)程序?qū)?duì)數(shù)據(jù)庫(kù)的API從標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)換為本地調(diào)用。使用此類(lèi)型需要犧牲JDBC的平臺(tái)獨(dú)立性,還要求在客戶端安裝一些本地代碼。

          類(lèi)型 3: JDBC-NETWORK BRIDGE

          JDBC網(wǎng)絡(luò)橋驅(qū)動(dòng)程序不再需要客戶端數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。它使用網(wǎng)絡(luò)上的中間服務(wù)器來(lái)存取數(shù)據(jù)庫(kù)。這種應(yīng)用使得以下技術(shù)的實(shí)現(xiàn)有了可能,這些技術(shù)包括負(fù)載 均衡、連接緩沖池和數(shù)據(jù)緩存等。由于第3種類(lèi)型往往只需要相對(duì)更少的下載時(shí)間,具有平臺(tái)獨(dú)立性,而且不需要在客戶端安裝并取得控制權(quán),所以很適合于 INTERNET上的應(yīng)用 ee0-200 sy0-101  510-305 190-833

          類(lèi)型 4: PURE JAVA DRIVER

          第4種類(lèi)型通過(guò)使用一個(gè)純JAVA數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序來(lái)執(zhí)行數(shù)據(jù)庫(kù)的直接訪問(wèn)。此類(lèi)型實(shí)際上在客戶端實(shí)現(xiàn)了2層結(jié)構(gòu)。要在N-層結(jié)構(gòu)中應(yīng)用,一個(gè)更好的做法是編寫(xiě)一個(gè)EJB,讓它包含存取代碼并提供一個(gè)對(duì)客戶端具有數(shù)據(jù)庫(kù)獨(dú)立性的服務(wù)。

          WEBLOGIC服務(wù)器為一些通常的數(shù)據(jù)庫(kù)提供了JDBC驅(qū)動(dòng)程序,包括ORACLE, SYBASE, MICROSOFT SQL SERVER以及INFORMIX。它也帶有一種JDBC驅(qū)動(dòng)程序用于CLOUDSCAPE,這是一種純JAVA的DBMS,WEBLOGIC服務(wù)器中帶 有該數(shù)據(jù)庫(kù)的評(píng)估版本。

          以下讓我們看一個(gè)實(shí)例。

          JDBC實(shí)例

          在這個(gè)例子中我們假定你已經(jīng)在 CLOUDSCAPE中建立了一個(gè)PHONEBOOK數(shù)據(jù)庫(kù),并且包含一個(gè)表,名為 CONTACT_TABLE ,它帶有2個(gè)字段:NAME 和 PHONE。 開(kāi)始的時(shí)候先裝載CLOUDSCAPE JDBC DRIVER,并請(qǐng)求 DRIVER MANAGER得到一個(gè)對(duì)PHONEBOOK CLOUDSCAPE數(shù)據(jù)庫(kù)的連接。通過(guò)這一連接,我們可以構(gòu)造一個(gè) STATEMENT 對(duì)象并用它來(lái)執(zhí)行一個(gè)簡(jiǎn)單的SQL查詢。最后,用循環(huán)來(lái)遍歷結(jié)果集的所有數(shù)據(jù),并用標(biāo)準(zhǔn)輸出將NAME和PHONE字段的內(nèi)容進(jìn)行輸出。

          IMPORT JAVA.SQL.*;

          PUBLIC CLASS JDBCEXAMPLE
          {
          PUBLIC STATIC VOID MAIN( STRING ARGS[] )
          {
          TRY
          {
          CLASS.FORNAME("COM.CLOUDSCAPE.CORE.JDBCDRIVER");
          CONNECTION CONN = DRIVERMANAGER.GETCONNECTION("JDBC:CLOUDSCAPE:PHONEBOOK");
          STATEMENT STMT = CONN.CREATESTATEMENT();
          STRING SQL = "SELECT NAME, PHONE FROM CONTACT_TABLE ORDER BY NAME";
          RESULTSET RESULTSET = STMT.EXECUTEQUERY( SQL );

          STRING NAME;
          STRING PHONE;
          WHILE ( RESULTSET.NEXT() )
          {
          NAME = RESULTSET.GETSTRING(1).TRIM();
          PHONE = RESULTSET.GETSTRING(2).TRIM();
          SYSTEM.OUT.PRINTLN( NAME + ", " + PHONE );
          }
          }
          CATCH ( EXCEPTION E )
          {
          // HANDLE EXCEPTION HERE
          E.PRINTSTACKTRACE();
          }
          }
          }


          OK。接著我們來(lái)看一看JDBC是如何在企業(yè)應(yīng)用中的進(jìn)行使用。

          JDBC在企業(yè)級(jí)應(yīng)用中的應(yīng)用

          以上實(shí)例其實(shí)是很基本的,可能有些微不足道。它假定了一個(gè)2層結(jié)構(gòu)。在一個(gè)多層的企業(yè)級(jí)應(yīng)用中,更大的可能是在客戶端和一個(gè)EJB進(jìn)行通信,該EJB將 建立數(shù)據(jù)庫(kù)連接。為了實(shí)現(xiàn)和改進(jìn)可伸縮性和系統(tǒng)性能, WEBLOGIC服務(wù)器提供了對(duì)連接緩沖池CONNECTION POOL的支持。

          CONNECTION POOL減少了建立和釋放數(shù)據(jù)庫(kù)連接的消耗。在系統(tǒng)啟動(dòng)以后即可建立這樣的緩沖池,此后如故再有對(duì)數(shù)據(jù)庫(kù)的請(qǐng)求,WEBLOGIC服務(wù)器可以很簡(jiǎn)單地從緩 沖池中取出數(shù)據(jù)。數(shù)據(jù)緩沖池可以在WEBLOGIC服務(wù)器的 WEBLOGIC.PROPERTIES 文件中進(jìn)行定義。(可參考 WEBLOGIC.PROPERTIES 文件中的例子,WEBLOGIC服務(wù)器的文檔中還有更詳細(xì)的參考信息)

          在企業(yè)級(jí)應(yīng)用的另一 個(gè)常見(jiàn)的數(shù)據(jù)庫(kù)特性是事務(wù)處理。事務(wù)是一組申明STATEMENT,它們必須做為同一個(gè)STATEMENT來(lái)處理以保證數(shù)據(jù)完整性。缺省情況下JDBC使 用 AUTO-COMMIT 事務(wù)模式。這可以通過(guò)使用CONNECTION類(lèi)的 SETAUTOCOMMIT() 方法來(lái)實(shí)現(xiàn)。

          現(xiàn)在我們已經(jīng)對(duì)JDBC有了一些認(rèn)識(shí),下面該轉(zhuǎn)向JNDI了。

          JAVA NAMING AND DIRECTORY INTERFACE (JNDI)

          JNDI API被用于執(zhí)行名字和目錄服務(wù)。它提供了一致的模型來(lái)存取和操作企業(yè)級(jí)的資源如DNS和LDAP,本地文件系統(tǒng),后者在應(yīng)用服務(wù)器中的對(duì)象。

          在JNDI中,在目錄結(jié)構(gòu)中的每一個(gè)結(jié)點(diǎn)稱(chēng)為CONTEXT。每一個(gè)JNDI名字都是相對(duì)于CONTEXT的。這里沒(méi)有絕對(duì)名字的概念存在。對(duì)一個(gè)應(yīng)用來(lái)說(shuō),它可以通過(guò)使用 INITIALCONTEXT 類(lèi)來(lái)得到其第一個(gè)CONTEXT:

          CONTEXT CTX = NEW INITIALCONTEXT();

          應(yīng)用可以通過(guò)這個(gè)初始化的CONTEXT經(jīng)有這個(gè)目錄樹(shù)來(lái)定位它所需要的資源或?qū)ο蟆@纾僭O(shè)你在WEBLOGIC服務(wù)器中展開(kāi)了一個(gè)EJB并將 HOME接口綁定到名字 MYAPP.MYEJB ,那么該EJB的某個(gè)客戶在取得一個(gè)初始化CONTEXT以后,可以通過(guò)以下語(yǔ)句定位HOME接口:

          MYEJBHOME HOME = CTX.LOOKUP( "MYAPP.MYEJB" );

          在這個(gè)例子中,一旦你有了對(duì)被請(qǐng)求對(duì)象的參考,EJB的HOME接口就可以在它上面調(diào)用方法。我們將在下面的"ENTERPRISE JAVA BEANS"章節(jié)中做更多的介紹。

          以上關(guān)于JNDI的討論只是冰山之一角而已。如果要更進(jìn)一步地在CONTEXT中查找對(duì)象,JNDI也提供了一些方法來(lái)進(jìn)行以下操作: 

          將一個(gè)對(duì)象插入或綁定到CONTEXT。這在你展開(kāi)一個(gè)EJB的時(shí)候是很有效的。

          從CONTEXT中移去對(duì)象。

          列出CONTEXT中的所有對(duì)象。

          創(chuàng)建或刪除子一級(jí)的CONTEXT。

          接下來(lái),我們要開(kāi)始關(guān)注EJB了。

          ENTERPRISE JAVA BEANS (EJB)

          J2EE技術(shù)之所以贏得某體廣泛重視的原因之一就是EJB。它們提供了一個(gè)框架來(lái)開(kāi)發(fā)和實(shí)施分布式商務(wù)邏輯,由此很顯著地簡(jiǎn)化了具有可伸縮性和高度復(fù)雜 的企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)。EJB規(guī)范定義了EJB組件在何時(shí)如何與它們的容器進(jìn)行交互作用。容器負(fù)責(zé)提供公用的服務(wù),例如目錄服務(wù)、事務(wù)管理、安全性、資源緩 沖池以及容錯(cuò)性。

          EJB規(guī)范定義了3中基本的BEAN類(lèi)型:

          STATELESS SESSION BEANS: 提供某種單一的服務(wù),不維持任何狀態(tài),在服務(wù)器故障發(fā)生時(shí)無(wú)法繼續(xù)存在,生命期相對(duì)較短。例如,一個(gè)STATELESS SESSION BEAN可能被用于執(zhí)行溫度轉(zhuǎn)換計(jì)算。

          STATEFUL SESSION BEAN: T提供了與客戶端的會(huì)話交互,可以存儲(chǔ)狀態(tài)從而代表一個(gè)客戶。典型例子是購(gòu)物車(chē)。STATEFUL SESSION BEAN在服務(wù)器故障時(shí)無(wú)法繼續(xù)生存,生命氣相對(duì)較短。每一個(gè)實(shí)例只用于一個(gè)單個(gè)的線程。

          ENTITY BEANS: 提供了一致性數(shù)據(jù)的表示-- 通常存放在數(shù)據(jù)庫(kù)中 -- 在服務(wù)器故障發(fā)生后能繼續(xù)存在。多用戶情況下可以使用EJB來(lái)表示相同的數(shù)據(jù)。ENTITY EJB的一個(gè)典型例子是客戶的帳號(hào)信息。

          盡管有以上的區(qū)別,所有的EJB還是有許多的共同之處。它們都處理HOME INTERFACE。它定義了一個(gè)客戶端是如何創(chuàng)建與消亡EJB的。可以在BEAN中對(duì)定義了客戶端方法的遠(yuǎn)程接口進(jìn)行調(diào)用;BEAN類(lèi)則執(zhí)行了主要的商務(wù)邏輯。

          描述EJB的開(kāi)發(fā)已經(jīng)超出了本文的范圍。但是,如果一個(gè)EJB已經(jīng)被開(kāi)發(fā)了或者從第三方進(jìn)行了購(gòu)買(mǎi),它就必須在應(yīng)用服務(wù)器中進(jìn)行發(fā)布。WEBLOGIC SERVER 5.1帶有一個(gè)EJB DEPLOYER TOOL來(lái)協(xié)助處理EJB的發(fā)布。當(dāng)你使用EJB DEPLOYER TOOL的時(shí)候,你要定義客戶端所用的JNDI名字來(lái)定位EJB。DEPLOYER TOOL將生成WRAPPER類(lèi)來(lái)處理和容器的通信以及在一個(gè)JAR文件中把被請(qǐng)求的JAVA類(lèi)綁定在一起。

          一旦EJB被發(fā)布,客戶 端就可以使用它的JNDI名字來(lái)定位EJB。首先,它必須得到一個(gè)到HOME接口的REFERENCE。然后,客戶端可以使用該接口,調(diào)用一個(gè) CREATE() 方法來(lái)得到服務(wù)器上運(yùn)行的某個(gè)BEAN實(shí)例的句柄;最后,客戶端可以使用該句柄在BEAN中調(diào)用方法。

          了解 EJB后,讓我們?cè)賮?lái)看JSP。

          JAVASERVER PAGES (JSPS)

          我們中間可能已經(jīng)有許多人已經(jīng)熟悉MICROSOFT的ACTIVE SERVER PAGES (ASP)技術(shù)了。JSP和ASP相對(duì)應(yīng)的,但更具有平臺(tái)對(duì)立性。他們被設(shè)計(jì)用以幫助WEB內(nèi)容開(kāi)發(fā)人員創(chuàng)建動(dòng)態(tài)網(wǎng)頁(yè),并且只需要相對(duì)較少的代碼。 即使WEB設(shè)計(jì)師不懂得如何編程也可以使用JSP,因?yàn)镴SP應(yīng)用是很方便的。 JSP頁(yè)面由HTML代碼和嵌入其中的JAVA代碼所組成。服務(wù)器在頁(yè)面被客戶端所請(qǐng)求以后對(duì)這些JAVA代碼進(jìn)行處理,然后將生成的HTML頁(yè)面返回給 客戶端的瀏覽器。

          下面我們來(lái)看一個(gè)JSP的簡(jiǎn)單實(shí)例。它只顯示了服務(wù)器的當(dāng)前日期和時(shí)間。雖然,對(duì)語(yǔ)法的具體解釋已經(jīng)超出了本文的范圍,但我們還是可以很直觀地看到,JAVA代碼被放在<%和%>的中間,而JAVA的表達(dá)式則放在<%=和%>之間。

          <html>
          <head>
          <title>Sample JSP Page</title>
          </head>
          <body>
          <h1>Date JSP sample</h1>

          <h2>
          <% response.setHeader("Refresh", 5); %>
          The current date is <%= new Date() %>.
          </h2>

          </body>
          </html>

          您可能有時(shí)候聽(tīng)說(shuō)過(guò)JHTML。這是JSP以前的一種較老的標(biāo)準(zhǔn)。WEBLOGIC服務(wù)器既可支持JSP,又可支持JHTML。請(qǐng)注意,在缺省狀況下, JSP在WEBLOGIC服務(wù)器中并沒(méi)有處于有效狀態(tài)。要使之有效,你可以編輯WEBLOGIC.PROPERTIES文件。如果WEB服務(wù)器還沒(méi)有處于 有效狀態(tài),則要先使之有效。SERVLET的情況和JSP是一樣的。

          下面是: JAVA SERVLETS

          JAVA SERVLETS

          SERVLET提供的功能大多與JSP類(lèi)似,不過(guò)實(shí)現(xiàn)的方式不同。JSP通常是大多數(shù)HTML代碼中嵌入少量的JAVA代碼,而SERVLETS全部由JAVA寫(xiě)成并且生成HTML。

          SERVLET是一種小型的JAVA程序,它擴(kuò)展了WEB服務(wù)器的功能。作為一種服務(wù)器端的應(yīng)用,當(dāng)被請(qǐng)求時(shí)開(kāi)始執(zhí)行,這和CGI PERL腳本很相似。SERVLETS和CGI腳本的一個(gè)很大的區(qū)別是:每一個(gè)CGI在開(kāi)始的時(shí)候都要求開(kāi)始一個(gè)新的進(jìn)程 -- 而SERVLETS是在SERVLET引擎中以分離的線程來(lái)運(yùn)行的。因此SERVLETS在可伸縮性上提供了很好的改進(jìn)。

          在開(kāi)發(fā)SERVLETS的時(shí)候,您常常需要擴(kuò)展JAVAX.SERVLET.HTTP.HTTPSERVLET 類(lèi),并且OVERRIDE一些它的方法,其中包括:

          SERVICE(): 作為DISPATCHER來(lái)實(shí)現(xiàn)命令-定義方法

          DOGET(): 處理客戶端的HTTP GET請(qǐng)求。

          DOPOST(): 進(jìn)行HTTP POST操作

          其它的方法還包括處理不同類(lèi)型的HTTP請(qǐng)求 -- 可以參考HTTPSERVLET API文檔。

          以上描述的是標(biāo)準(zhǔn)J2EE SERVLET API的各種方法。WEBLOGIC服務(wù)器提供了一個(gè)該API完整的實(shí)現(xiàn)途徑。一旦你開(kāi)發(fā)了一個(gè)SERVLET,你就可以在 WEBLOGIC.PROPERTIES 中加以注冊(cè)并由此可以在WEBLOGIC服務(wù)器中對(duì)它進(jìn)行配置。

          通過(guò)JAVA SERVLETS,我們已經(jīng)到達(dá)了J2EE主要技術(shù)的末尾了。但J2EE所提供的并不止于這些。下面的段落中我們將簡(jiǎn)要地看一下現(xiàn)存的一些技術(shù),包括RMI, JAVA IDL和CORBA, JTA, 以及XML,等等。

          REMOTE METHOD INVOCATION (RMI)

          正如其名字所表示的那樣,RMI協(xié)議是在遠(yuǎn)程對(duì)象上調(diào)用一些方法。它使用了連續(xù)序列方式在客戶端和服務(wù)器端傳遞數(shù)據(jù)。RMI是一種被EJB使用的更下層的協(xié)議。

          JAVA IDL/CORBA

          在JAVA IDL的支持下,開(kāi)發(fā)人員可以將JAVA和CORBA集成在一起。 他們可以創(chuàng)建JAVA對(duì)象并使之可在CORBA ORB中展開(kāi), 或者他們還可以創(chuàng)建JAVA類(lèi)并作為和其它ORB一起展開(kāi)的CORBA對(duì)象的客戶。后一種方法提供了另外一種途徑,通過(guò)它JAVA可以被用于將你的新的應(yīng) 用和LEGACY系統(tǒng)相集成。

          JAVA TRANSACTION ARCHITECTURE (JTA)/JAVA TRANSACTION SERVICE (JTS)

          JTA定義了一種標(biāo)準(zhǔn)的API,應(yīng)用系統(tǒng)由此可以存取各種事務(wù)監(jiān)控。

          JTS是CORBA OTS事務(wù)監(jiān)控的基本的實(shí)現(xiàn)。JTS規(guī)定了事務(wù)管理器的實(shí)現(xiàn)方式。該事務(wù)管理器是在高層支持JAVA TRANSACTION API (JTA)規(guī)范,并且在較底層實(shí)現(xiàn)OMG OTS SPECIFICATION的JAVA映像。JTS事務(wù)管理器為應(yīng)用服務(wù)器、資源管理器、獨(dú)立的應(yīng)用以及通信資源管理器提供了事務(wù)服務(wù)。

          JAVAMAIL AND JAVABEANS ACTIVATION FRAMEWORK

          JAVAMAIL是用于存取郵件服務(wù)器的API,它提供了一套郵件服務(wù)器的抽象類(lèi)。不僅支持SMTP服務(wù)器,也支持IMAP服務(wù)器。

          JAVAMAIL利用JAVABEANS ACTIVATION FRAMEWORK (JAF)來(lái)處理MIME-編碼的郵件附件。MIME的字節(jié)流可以被轉(zhuǎn)換成JAVA對(duì)象,或者轉(zhuǎn)換自JAVA對(duì)象。由此大多數(shù)應(yīng)用都可以不需要直接使用JAF。

          JAVA MESSAGING SERVICE (JMS)

          JMS是用于和面向消息的中間件相互通信的應(yīng)用程序接口(API)。它既支持點(diǎn)對(duì)點(diǎn)的域,有支持發(fā)布/訂閱(PUBLISH/SUBSCRIBE)類(lèi)型 的域,并且提供對(duì)下列類(lèi)型的支持:經(jīng)認(rèn)可的消息傳遞,事務(wù)型消息的傳遞,一致性消息和具有持久性的訂閱者支持。JMS還提供了另一種方式來(lái)對(duì)您的應(yīng)用與 LEGACY BACKEND系統(tǒng)相集成。

          EXTENSIBLE MARKUP LANGUAGE (XML)

          XML是一種可以用來(lái)定義其它標(biāo)記語(yǔ)言的語(yǔ)言。它被用來(lái)在不同的商務(wù)過(guò)程中共享數(shù)據(jù)。XML的發(fā)展和JAVA是相互獨(dú)立的,但是,它和JAVA具有的相同 目標(biāo)正是平臺(tái)獨(dú)立性。通過(guò)將JAVA和XML的組合,您可以得到一個(gè)完美的具有平臺(tái)獨(dú)立性的解決方案。目前正有許多不同的公司在為JAVA和XML的組合 而努力。如果要了解更多的這方面的信息,可以訪問(wèn)SUN的JAVA-XML頁(yè)面,或者IBM DEVELOPERWORKS的XML ZONE。

          總結(jié)

          在本文中,我們介紹了建立在J2EE上的分布式應(yīng)用結(jié)構(gòu),并且描述了WEBLOGIC服務(wù)器對(duì)J2EE的各種支持。 然而,我們所揭示的僅僅是冰山之一角而已,要以一篇數(shù)千字的文章來(lái)展示J2EE潛在的對(duì)您的企業(yè)級(jí)應(yīng)用的影響可是很不公平的。

          我們已經(jīng)關(guān)注了在您開(kāi)始用J2EE進(jìn)行工作時(shí)最有可能遇到的各類(lèi)技術(shù):JDBC, JNDI, EJB, JSP和SERVLET。我們也為您提供了一些尚未常見(jiàn)的J2EE技術(shù)的背景知識(shí)。不管您是一名開(kāi)發(fā)人員,商務(wù)應(yīng)用分析師,或者項(xiàng)目經(jīng)理,都應(yīng)該對(duì) J2EE和WEBLOGIC服務(wù)器所能提供給我們,給我們的企業(yè)以及我們的企業(yè)級(jí)應(yīng)用所帶來(lái)的意義有一個(gè)更好的認(rèn)識(shí)
          posted @ 2007-09-24 11:49 java2java 閱讀(2761) | 評(píng)論 (1)編輯 收藏

               摘要: import java.io.*;

          //多線程編程
          public class MultiThread
          {
          public static void main(String args[])
          {
          System.out.println("我是主線程!");
          //下面創(chuàng)建線程實(shí)例thread1
          ThreadUseExtends thread1=new ThreadUseExtends();
          //創(chuàng)建thread2時(shí)以實(shí)現(xiàn)了Runnable接口的THhreadUseRunnable類(lèi)實(shí)例為參數(shù)
          Thread thread2=new Thread(new ThreadUseRunnable(),"SecondThread");
          thread1.start();//啟動(dòng)線程thread1使之處于就緒狀態(tài)
          //thread1.setPriority(6);//設(shè)置thread1的優(yōu)先級(jí)為6
            閱讀全文
          posted @ 2007-09-19 11:13 java2java 閱讀(56406) | 評(píng)論 (15)編輯 收藏

               摘要: 測(cè)試環(huán)境:JDK1.5、Tomcat5.5
            1.設(shè)置Cookie

            1Cookie cookie = new Cookie("key", "value");

            2cookie.setMaxAge(60); //設(shè)置60秒生存期,如果設(shè)置為負(fù)值的話,則為瀏覽器進(jìn)程Cookie(內(nèi)存中保存),關(guān)閉瀏覽器就失效。

            3cookie.setPath("/test/test2"); //設(shè)置Cookie路徑,不設(shè)置的話為當(dāng)前路徑(對(duì)于Servlet來(lái)說(shuō)為request.getContextPath() + web.xml里配置的該Servlet的url-pattern路徑部分)

            4response.addCookie(cookie);
            閱讀全文
          posted @ 2007-09-18 10:16 java2java 閱讀(724) | 評(píng)論 (2)編輯 收藏

               摘要: 單例模式
          屬于創(chuàng)建型模式
          一個(gè)類(lèi)只能有一個(gè)實(shí)例,并且自行實(shí)例化,必須自行向其他對(duì)象提供這個(gè)實(shí)例
          關(guān)鍵代碼實(shí)現(xiàn):
          public class DataCenter   
          閱讀全文
          posted @ 2007-09-17 15:42 java2java 閱讀(2435) | 評(píng)論 (1)編輯 收藏

          軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類(lèi):同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用

          方要等待對(duì)方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說(shuō),被調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口;異

          步調(diào)用是一種類(lèi)似消息或事件的機(jī)制,不過(guò)它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時(shí),會(huì)主動(dòng)通知客戶方(即調(diào)

          用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來(lái)實(shí)現(xiàn)異步消息的注冊(cè),通過(guò)異步調(diào)用來(lái)實(shí)現(xiàn)消息的通知。同步調(diào)用

          是三者當(dāng)中最簡(jiǎn)單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ),因此,下面我們著重討論回調(diào)機(jī)制在不同軟件架構(gòu)中的實(shí)現(xiàn)。


          今天學(xué)習(xí)時(shí)碰到的問(wèn)題,特總結(jié)出來(lái)。
          Example:    Class Teacher and Student are subclass of class Person.
              Person p;
              Teacher t;
              Student s;
              p, t and s are all non-null.
              if(t instanceof Person) {  s = (Student)t; }
          What is the result of this sentence?
          A. It will construct a Student object.
          B. The expression is legal.
          C. It is illegal at compilation.
          D. It is legal at compilation but possible illegal at runtime.
          1z0-147   642-964
          instanceof操作符的作用是判斷一個(gè)變量是否是右操作數(shù)指出的類(lèi)的一個(gè)對(duì)象,由于java語(yǔ)言的多態(tài)性使得可以用一個(gè)子類(lèi)的實(shí)例賦值給一個(gè)
          父類(lèi)的變量,而在一些情況下需要判斷變量到底是一個(gè)什么類(lèi)型的對(duì)象,這時(shí)就可以使用instanceof 了。當(dāng)左操作數(shù)是右操作數(shù)指出的類(lèi)的實(shí)
          例或者是子類(lèi)的實(shí)例時(shí)都返回真,如果是將一個(gè)子類(lèi)的實(shí)例賦值給一個(gè)父類(lèi)的變量,用instanceof判斷該變量是否是子類(lèi)的一個(gè)實(shí)例時(shí)也將返
          回真。此題中的if語(yǔ)句的判斷沒(méi)有問(wèn)題,而且將返回真,但是后面的類(lèi)型轉(zhuǎn)換是非法的,因?yàn)閠是一個(gè)Teacher對(duì)象,它不能被強(qiáng)制轉(zhuǎn)換為一個(gè)
          Student對(duì)象,即使這兩個(gè)類(lèi)有共同的父類(lèi)。如果是將t轉(zhuǎn)換為一個(gè)Person對(duì)象則可以,而且不需要強(qiáng)制轉(zhuǎn)換。這個(gè)錯(cuò)誤在編譯時(shí)就可以發(fā)現(xiàn),
          因此編譯不能通過(guò)。
          posted @ 2007-09-12 16:15 java2java 閱讀(1607) | 評(píng)論 (3)編輯 收藏

          僅列出標(biāo)題
          共5頁(yè): 上一頁(yè) 1 2 3 4 5 下一頁(yè) 
          主站蜘蛛池模板: 中宁县| 武清区| 晋宁县| 金昌市| 保康县| 梅州市| 万安县| 南宫市| 桓仁| 布拖县| 杭州市| 西城区| 区。| 万载县| 霍城县| 布拖县| 开原市| 丰都县| 香港 | 镇原县| 原阳县| 西安市| 滁州市| 庄浪县| 科技| 日照市| 即墨市| 普宁市| 红原县| 名山县| 华亭县| 平安县| 玉田县| 游戏| 罗城| 南丹县| 资溪县| 龙井市| 定襄县| 镇巴县| 青州市|