posts - 78,  comments - 48,  trackbacks - 0
               摘要: 下面的代碼表現(xiàn)出使用set 帶來(lái)的好處。??1public?class?TaskTemplate?{??2????private?String?id;??3????private?String?title;??4????private?String?detail;??5??????6????private?Set<TaskTemplate>?preconditions;??7????p...  閱讀全文
          posted @ 2006-12-01 10:25 黑咖啡 閱讀(367) | 評(píng)論 (0)編輯 收藏
          Coding 生涯已經(jīng)有1年4個(gè)月了,雖然比較熟悉公司框架,用起來(lái)還比較熟練,但是回頭想想,其實(shí)自己還是停留在新手階段,與剛出學(xué)校的那些“大俠”們不相上下。特別是昨天看到我們的CTO-BridGu(相信去過javaeye的朋友沒有不知道這個(gè)名字的吧)給我改寫的一段程序以后,感覺自己的程序是那么的幼稚。絲毫沒有professional的感覺,很是慚愧!
          這個(gè)功能是一個(gè)解析String生成function的功能,當(dāng)然格式要求非常嚴(yán)格的,而且格式驗(yàn)證也是一個(gè)不可缺少,而且是非常重要的環(huán)節(jié)。
          不知道你看到這個(gè)功能腦子里面想到是什么樣的解決方案呢?我沒有多想,拿起來(lái)就當(dāng)String來(lái)處理,split, substring etc.

          看看程序吧:
          下面是我的方法,暫且說(shuō)是方法吧:
          ?1????public?void?addFunction(String?prototype,Long?comId)throws?AlpineException{
          ?2????????ModDao?dao?=?(ModDao)this.getDao("modDao");
          ?3????????Components?com?=?this.findByPrimaryKey(Components.class,?comId);
          ?4????????Functions?function?=?new?Functions();
          ?5????????function.setComponent(com);
          ?6????????prototype?=?delDupSpace(prototype);
          ?7????????String[]?funTtemp?=?prototype.split("\n");
          ?8????????String?fun?=?funTtemp[0];
          ?9????????if(fun.indexOf("(")?==?-1||fun.indexOf(")")?==?-1){
          10????????????throw?new?AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);
          11????????}
          12????????String?funHead?=?fun.substring(0,fun.indexOf("("));
          13????????String[]?typeAndHead?=?funHead.split("?");
          14????????if(typeAndHead.length?<?1){
          15????????????throw?new?AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);
          16????????}else{
          17????????????if(typeAndHead.length?>1){
          18????????????????function.setReturnType(typeAndHead[0]);
          19????????????????function.setFunctionName(typeAndHead[typeAndHead.length-1]);
          20????????????}else{
          21????????????????function.setReturnType("void");
          22????????????????function.setFunctionName(typeAndHead[0]);
          23????????????}
          24????????????if(fun.indexOf("http://")?!=?-1){
          25????????????????String?exp?=?fun.substring(fun.indexOf(";")+1);
          26????????????????exp?=?exp.replaceAll("&#13;",?"");
          27????????????????function.setExplanation(exp);
          28????????????}
          29????????????this.insert(function);
          30????
          31????????????String?paStr?=?fun.substring(fun.indexOf("(")+1,?fun.indexOf(")"));
          32????????????if(!StringHelper.isEmpty(paStr)){
          33????????????????String[]?pas?=?paStr.split(",");
          34????????????????for?(int?i?=?0;?i?<?pas.length;?i++)?{
          35????????????????????Parameters?parameter?=?new?Parameters();
          36????????????????????String[]?pars?=?pas[i].split("?");
          37????????????????????if(pars.length?<?2?||?pars.length?>?3){
          38????????????????????????throw?new?AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);
          39????????????????????}else{
          40????????????????????????if(pars.length?==?2){
          41????????????????????????????Parameters?paDup?=?dao.getParameterByPaName(pars[1],?function.getId());
          42????????????????????????????if(paDup?!=?null)
          43????????????????????????????????throw?new?AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);
          44????????????????????????????????
          45????????????????????????????parameter.setParameterName(pars[1]);
          46????????????????????????????parameter.setParameterType(pars[0]);
          47????????????????????????????parameter.setInOrOut("In");
          48????????????????????????}
          49????????????????????????if(pars.length?==?3){
          50????????????????????????????Parameters?paDup?=?dao.getParameterByPaName(pars[2],?function.getId());
          51????????????????????????????if(paDup?!=?null)
          52????????????????????????????????throw?new?AlpineException(ErrorCode.FUNCTION_FORMAT_ERROR);
          53????????????????????????????
          54????????????????????????????parameter.setParameterName(pars[2]);
          55????????????????????????????parameter.setParameterType(pars[1]);
          56????????????????????????????if(pars[0].contains("In"))
          57????????????????????????????????parameter.setInOrOut("In");
          58????????????????????????????if(pars[0].contains("Out"))
          59????????????????????????????????parameter.setInOrOut("Out");
          60????????????????????????}
          61????????????????????????parameter.setFunction(function);
          62????????????????????????this.insert(parameter);
          63????????????????????????parameter.setOrderF(parameter.getId());
          64????????????????????????this.update(parameter);
          65????????????????????}
          66????????????????}
          67????????????}
          68????????????
          69????????????for?(int?i?=?1;?i?<?funTtemp.length;?i++)?{//start?1
          70????????????????String[]?paTemp?=?funTtemp[i].split(":");
          71????????????????if(paTemp.length?==?2){
          72????????????????????Parameters?parameter?=?dao.getParameterByPaName(paTemp[0].trim(),function.getId());
          73????????????????????if(parameter?!=?null){
          74????????????????????????parameter.setExplanation(paTemp[1]);
          75????????????????????????this.update(parameter);
          76????????????????????}
          77????????????????}
          78????????????}
          79????????}
          80????}
          以下是BirdGu的方案:
          ??1public?class?FunctionParser?{
          ??2????public?static?class?Token?{
          ??3????????private?TokenType?type;
          ??4????????private?String?content;
          ??5????????public?Token(TokenType?type,?String?content)?{
          ??6????????????super();
          ??7????????????this.type?=?type;
          ??8????????????this.content?=?content;
          ??9????????}
          ?10????????public?String?getContent()?{
          ?11????????????return?content;
          ?12????????}
          ?13????????public?TokenType?getType()?{
          ?14????????????return?type;
          ?15????????}
          ?16????????
          ?17????????
          ?18????}
          ?19????
          ?20????private?enum?TokenType?{symbol,?leftParenthese,?rightParenthese,?inOutFlag,?comment,?comma};
          ?21????private?enum?TokenParseStatus?{start,?inSymbol,?comment1,?inOutFlag};
          ?22
          ?23????private?interface?ParseStatus?{
          ?24????????public?ParseStatus?process?(Functions?function,?Token?token,?Stack<String>?symbolStack)
          ?25????????throws?InvalidSyntaxException;
          ?26????}
          ?27????
          ?28????private?static?final?ParseStatus?START?=?new?ParseStatus()?{
          ?29????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)
          ?30????????throws?InvalidSyntaxException?{
          ?31????????????if?(token.getType()?==?TokenType.symbol)?{
          ?32????????????????symbolStack.push(token.getContent());
          ?33????????????????return?GOT_FIRST_SYMBOL;
          ?34????????????}?
          ?35????????????throw?new?InvalidSyntaxException?(token);
          ?36????????}
          ?37????};
          ?38????
          ?39????private?static?final?ParseStatus?GOT_FIRST_SYMBOL?=?new?ParseStatus?()?{
          ?40????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          ?41????????????if?(token.getType()?==?TokenType.leftParenthese)?{
          ?42????????????????function.setReturnType("void");
          ?43????????????????function.setFunctionName(symbolStack.pop());
          ?44????????????????return?WAITING_FIRST_ARG;
          ?45????????????}?else?if?(token.getType()?==?TokenType.symbol)?{
          ?46????????????????function.setFunctionName(token.getContent());
          ?47????????????????function.setReturnType(symbolStack.pop());
          ?48????????????????return?BEFORE_ARG_DEF;
          ?49????????????}?
          ?50????????????throw?new?InvalidSyntaxException?(token);
          ?51????????}
          ?52????};
          ?53????
          ?54????private?static?final?ParseStatus?BEFORE_ARG_DEF?=?new?ParseStatus?()?{
          ?55????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          ?56????????????if?(token.getType()?==?TokenType.leftParenthese)?{
          ?57????????????????return?WAITING_FIRST_ARG;
          ?58????????????}
          ?59????????????throw?new?InvalidSyntaxException?(token);
          ?60????????}
          ?61????};
          ?62????
          ?63????private?static?final?ParseStatus?WAITING_FIRST_ARG?=?new?ParseStatus?()?{
          ?64
          ?65????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          ?66????????????if?(token.getType()?==?TokenType.rightParenthese)?{
          ?67????????????????return?AFTER_ARG_DEF;
          ?68????????????}?else?if?(token.getType()?==?TokenType.symbol)?{
          ?69????????????????symbolStack.push(token.getContent());
          ?70????????????????return?GOT_ARG_TYPE;
          ?71????????????}?else?if?(token.getType()?==?TokenType.inOutFlag)?{
          ?72????????????????symbolStack.push?(token.getContent());
          ?73????????????????return?GOT_IN_OUT_FLAG;
          ?74????????????}
          ?75????????????throw?new?InvalidSyntaxException?(token);????
          ?76????????}
          ?77????};
          ?78????
          ?79????private?static?final?ParseStatus?GOT_IN_OUT_FLAG?=?new?ParseStatus?()?{
          ?80????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          ?81????????????if?(token.getType()?==?TokenType.symbol)?{
          ?82????????????????symbolStack.push(token.getContent());
          ?83????????????????return?GOT_ARG_TYPE;
          ?84????????????}
          ?85????????????throw?new?InvalidSyntaxException?(token);????
          ?86????????}
          ?87????};
          ?88????
          ?89????private?static?final?ParseStatus?GOT_ARG_TYPE?=?new?ParseStatus?()?{
          ?90????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          ?91????????????if?(token.getType()?==?TokenType.symbol)?{
          ?92????????????????Parameters?param?=?new?Parameters?();
          ?93????????????????param.setParameterName(token.getContent());
          ?94????????????????param.setParameterType(symbolStack.pop());
          ?95????????????????String?inOutFlag?=?"In";
          ?96????????????????if?(!symbolStack.isEmpty())?{
          ?97????????????????????inOutFlag?=?symbolStack.pop();
          ?98????????????????}
          ?99????????????????param.setInOrOut(inOutFlag);
          100????????????????function.adParameter(param);
          101????????????????return?GOT_ARG_VALUE;
          102????????????}
          103????????????throw?new?InvalidSyntaxException?(token);????
          104????????}
          105????};
          106????
          107????private?static?final?ParseStatus?GOT_ARG_VALUE?=?new?ParseStatus?()?{
          108????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          109????????????if?(token.getType()?==?TokenType.rightParenthese)?{
          110????????????????return?AFTER_ARG_DEF;
          111????????????}?else?if?(token.getType()?==?TokenType.comma)?{
          112????????????????return?WAITING_ARG;
          113????????????}
          114????????????throw?new?InvalidSyntaxException?(token);????
          115????????}
          116????};
          117????
          118????private?static?final?ParseStatus?WAITING_ARG?=?new?ParseStatus?()?{
          119????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          120????????????if?(token.getType()?==?TokenType.symbol)?{
          121????????????????symbolStack.push(token.getContent());
          122????????????????return?GOT_ARG_TYPE;
          123????????????}?else?if(token.getType()?==?TokenType.inOutFlag)?{
          124????????????????symbolStack.push(token.getContent());
          125????????????????return?GOT_IN_OUT_FLAG;
          126????????????}
          127????????????return?null;
          128????????}
          129????};
          130????
          131????private?static?final?ParseStatus?AFTER_ARG_DEF?=?new?ParseStatus?()?{
          132????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          133????????????if?(token.getType()?==?TokenType.comment)?{
          134????????????????function.setExplanation(token.getContent());
          135????????????????return?END;
          136????????????}
          137????????????throw?new?InvalidSyntaxException?(token);
          138????????}
          139????};
          140????
          141????private?static?final?ParseStatus?END?=?new?ParseStatus?()?{
          142????????public?ParseStatus?process(Functions?function,?Token?token,?Stack<String>?symbolStack)?throws?InvalidSyntaxException?{
          143????????????throw?new?InvalidSyntaxException?(token);
          144????????}
          145????};
          146????
          147????private?StringBuffer?currentLine;
          148????private?int?index;
          149????private?Functions?function;
          150????
          151????public?Functions?parse(String?content)?throws?InvalidSyntaxException?{
          152????????if?(StringHelper.isEmpty(content))?{
          153????????????throw?new?IllegalArgumentException?("content?is?empty.");
          154????????}
          155????????StringTokenizer?tokenizer?=?new?StringTokenizer?(content,?"\n");
          156????????String?line?=?tokenizer.nextToken();
          157????????parseFirstLine?(line);
          158????????while?(tokenizer.hasMoreTokens())?{
          159????????????line?=?tokenizer.nextToken();
          160????????????parseParamLine?(line);
          161????????}
          162????????return?function;
          163????}
          164????
          165????private?void?parseFirstLine?(String?line)?throws?InvalidSyntaxException?{
          166????????currentLine?=?new?StringBuffer?(line);
          167????????index?=?0;
          168????????function?=?new?Functions?();
          169????????Token?token;
          170????????ParseStatus?status?=?START;
          171????????Stack<String>?stack?=?new?Stack<String>?();
          172????????while?(?(token?=?nextToken())?!=?null)?{
          173????????????status?=?status.process(function,?token,?stack);
          174????????}
          175????????if?(status?!=?AFTER_ARG_DEF?&&?status?!=?END)?
          176????????????throw?new?InvalidSyntaxException?("Function?hasn't?finished?properly.");
          177????}
          178
          179????private?void?parseParamLine?(String?line)?
          180????throws?InvalidSyntaxException?{
          181????????int?idx?=?line.indexOf(':');
          182????????if?(idx?<?0)?{
          183????????????throw?new?InvalidSyntaxException?("Expected?':'?from?parameter?line.");
          184????????}
          185????????String?paramName?=?line.substring(0,?idx);
          186????????String?comment?=?line.substring(idx?+?1);
          187????????Parameters?param?=?function.getParameter?(paramName);
          188????????if?(paramName?==?null)
          189????????????throw?new?InvalidSyntaxException?("Unknown?parameter:'paramName'");
          190????????param.setExplanation(comment);
          191????}
          192????
          193????private?Token?nextToken?()?throws?InvalidSyntaxException?{
          194????????if?(index?>=?currentLine.length())
          195????????????return?null;
          196????????StringBuffer?buf?=?new?StringBuffer?();
          197????????TokenParseStatus?status?=?TokenParseStatus.start;
          198????????while?(index?<?currentLine.length?())?{
          199????????????char?ch?=?currentLine.charAt(index);
          200????????????if?(status?==?TokenParseStatus.start)?{
          201????????????????if?(isSymbolLetter(ch))?{
          202????????????????????status?=?TokenParseStatus.inSymbol;
          203????????????????????buf.append(ch);
          204????????????????????++?index;
          205????????????????}?else?if?(ch?==?'(')?{
          206????????????????????++?index;
          207????????????????????return?new?Token?(TokenType.leftParenthese,?"(");
          208????????????????}?else?if?(ch?==?')')?{
          209????????????????????++?index;
          210????????????????????return?new?Token?(TokenType.rightParenthese,?")");
          211????????????????}?else?if?(ch?==?',')?{
          212????????????????????++?index;
          213????????????????????return?new?Token?(TokenType.comma,?",");
          214????????????????}?else?if?(ch?==?'?'?||?ch?==?'\t')?{
          215????????????????????++?index;
          216????????????????}?else?if?(ch?==?'[')?{
          217????????????????????status?=?TokenParseStatus.inOutFlag;
          218????????????????????++?index;
          219????????????????}?else?if?(ch?==?';')?{
          220????????????????????++?index;
          221????????????????????String?str?=?currentLine.substring(index);
          222????????????????????index?=?currentLine.length();
          223????????????????????return?new?Token?(TokenType.comment,?str);
          224????????????????}?else?{
          225????????????????????throw?new?InvalidSyntaxException?("Enexpected?character:?"?+?ch);
          226????????????????}
          227????????????}?else?if?(status?==?TokenParseStatus.inSymbol)?{
          228????????????????if?(isSymbolLetter(ch))?{
          229????????????????????buf.append(ch);
          230????????????????????++?index;
          231????????????????}?else?{
          232????????????????????return?new?Token?(TokenType.symbol,?buf.toString());
          233????????????????}?
          234????????????}?else?if?(status?==?TokenParseStatus.inOutFlag)?{
          235????????????????if?(isSymbolLetter(ch))?{
          236????????????????????buf.append?(ch);
          237????????????????????++?index;
          238????????????????}?else?if?(?ch?==?']')?{
          239????????????????????++?index;
          240????????????????????String?str?=?buf.toString?();
          241????????????????????if?(!?("In".equals(str)?||?"Out".equals(str)))?{
          242????????????????????????throw?new?InvalidSyntaxException?("Invalid?in/out?flag.");
          243????????????????????}
          244????????????????????return?new?Token?(TokenType.inOutFlag,?str);
          245????????????????}
          246????????????}
          247????????}
          248????????if?(status?==?TokenParseStatus.inSymbol)?{
          249????????????return?new?Token?(TokenType.symbol,?buf.toString());
          250????????}
          251????????return?null;
          252????}
          253
          254????private?boolean?isSymbolLetter(char?ch)?{
          255????????return?Character.isLetter(ch)?||?Character.isDigit(ch);
          256????}
          257}

          相比之下,第一種方法相形見絀。
          想必這也是很多“大鳥”找不到合適人選的原因吧。
          上面兩種方法不用多說(shuō),大家一看就知道好在哪里,同時(shí)還是編程思想的截然不同。
          posted @ 2006-12-01 10:13 黑咖啡 閱讀(467) | 評(píng)論 (0)編輯 收藏
          Oracle的Blob字段比較特殊,他比long字段的性能要好很多,可以用來(lái)保存例如圖片之類的二進(jìn)制數(shù)據(jù)。

            寫入Blob字段和寫入其它類型字段的方式非常不同,因?yàn)锽lob自身有一個(gè)cursor,你必須使用cursor對(duì)blob進(jìn)行操作,因而你在寫入Blob之前,必須獲得cursor才能進(jìn)行寫入,那么如何獲得Blob的cursor呢?

            這需要你先插入一個(gè)empty的blob,這將創(chuàng)建一個(gè)blob的cursor,然后你再把這個(gè)empty的blob的cursor用select查詢出來(lái),這樣通過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob數(shù)據(jù)了。

            看下面的JDBC的demo,把oraclejdbc.jar這個(gè)二進(jìn)制文件寫入數(shù)據(jù)庫(kù)表javatest的content字段(這是一個(gè)blob型字段)

            import java.sql.*;
            import java.io.*;
            import oracle.sql.*;
            public class WriteBlob {

            public static void main(String[] args) {

            try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");
            conn.setAutoCommit(false);

            BLOB blob = null;

            PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");
            pstmt.setString(1,"fankai");
            pstmt.executeUpdate();
            pstmt.close();

            pstmt = conn.prepareStatement("select content from javatest where
            }
          posted @ 2006-11-10 11:45 黑咖啡 閱讀(2270) | 評(píng)論 (1)編輯 收藏

          我用過的2個(gè):

          1.xtreexloadtree,總體來(lái)說(shuō),實(shí)現(xiàn)還不錯(cuò),提供了一次性構(gòu)建樹,和動(dòng)態(tài)加載樹(生成指定格式的XML才可以),改變Style,功能中等,用法中等.

          2.yuitreeview,這也是不錯(cuò)的實(shí)現(xiàn),是Yahoo提供的,支持一次性構(gòu)建,動(dòng)態(tài)構(gòu)建,改變Style,Menu樣式等等,功能很多,但用法比較復(fù)雜


          沒用過,只是聽說(shuō)的

          3.dtree,比較中規(guī)中矩的一個(gè)實(shí)現(xiàn),用法簡(jiǎn)單,不支持動(dòng)態(tài)加載。



          還有其他的好的js,大家可以補(bǔ)充。

          posted @ 2006-11-09 16:13 黑咖啡 閱讀(777) | 評(píng)論 (0)編輯 收藏
          ???

          ?
          Oracle8i中使用Java語(yǔ)言來(lái)開發(fā)存儲(chǔ)過程
          本篇文章來(lái)源與時(shí)代朝陽(yáng)數(shù)據(jù)庫(kù)(原曉通數(shù)據(jù)庫(kù))培訓(xùn)部Oracle?資料庫(kù)。
          在Oracle8i之前,開發(fā)人員只能使用PL/SQL來(lái)開發(fā)存儲(chǔ)過程。而在Oracle8i之中,不僅可以使用原有的PL/SQL開發(fā)存儲(chǔ)過程,而且也可以使用Java語(yǔ)言來(lái)開發(fā)存儲(chǔ)過程。本篇文章將簡(jiǎn)單介紹關(guān)于這方面的知識(shí),包括以下內(nèi)容:
          ?
          l???????? 存儲(chǔ)過程簡(jiǎn)介;
          l???????? Java存儲(chǔ)過程
          l???????? Java存儲(chǔ)過程的開發(fā)步驟
          l???????? 使用Java開發(fā)過程;
          l???????? 使用Java開發(fā)函數(shù);
          l???????? 使用Java開發(fā)包;
          l???????? 使用Java開發(fā)觸發(fā)器;
          l???????? 使用Java開發(fā)對(duì)象方法;
          l???????? 使用JDeveloper開發(fā)JSP。 存儲(chǔ)過程簡(jiǎn)介
          存儲(chǔ)過程是存儲(chǔ)在數(shù)據(jù)庫(kù)中的一段存儲(chǔ)程序。當(dāng)創(chuàng)建存儲(chǔ)過程時(shí),系統(tǒng)會(huì)對(duì)其進(jìn)行編譯,并將執(zhí)行代碼存儲(chǔ)到數(shù)據(jù)庫(kù)中。
          ?
          1.???????? 設(shè)計(jì)存儲(chǔ)過程的方針
          ?
          l???????? 在定義存儲(chǔ)過程時(shí),要使用其完成單一、相對(duì)集中的任務(wù)。
          l???????? 在定義存儲(chǔ)過程時(shí),不要定義已經(jīng)由其它特征所提供功能的過程。例如,不要定義強(qiáng)制數(shù)據(jù)完整性的過程(使用完整性約束)。
          ?
          2.???????? 存儲(chǔ)過程的優(yōu)點(diǎn)
          1)??????? 安全性
          ?
          當(dāng)創(chuàng)建了存儲(chǔ)過程之后,可以將執(zhí)行該過程的權(quán)限授予其它用戶,從而使得他可以執(zhí)行特定的數(shù)據(jù)庫(kù)操作,而不能訪問其它模式對(duì)象(例如表)。例如,你可以將執(zhí)行過程(更新表)的權(quán)限授予其它用戶,但不授予它們直接訪問該表的權(quán)限。
          ?
          2)??????? 性能
          ?
          l???????? 存儲(chǔ)過程只被發(fā)送到數(shù)據(jù)庫(kù)一次,相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其網(wǎng)絡(luò)通信量更小。
          l???????? 當(dāng)調(diào)用存儲(chǔ)過程時(shí),數(shù)據(jù)庫(kù)會(huì)直接運(yùn)行該存儲(chǔ)過程,無(wú)需進(jìn)行編譯。相對(duì)于SQL語(yǔ)句或PL/SQL塊而言,其執(zhí)行速度更快。
          ?
          3)??????? 內(nèi)存分配
          ?
          存儲(chǔ)過程充分利用了Oracle共享內(nèi)存的能力。在將存儲(chǔ)過程裝載到內(nèi)存中后,多個(gè)用戶可以同時(shí)調(diào)用該存儲(chǔ)過程,從而降低了應(yīng)用對(duì)Oracle的實(shí)際內(nèi)存需求。
          ?
          4)??????? 生產(chǎn)力
          ?
          存儲(chǔ)過程提高了開發(fā)生產(chǎn)力。通過將公共集合編寫為存儲(chǔ)過程,避免了冗余代碼,從而提高了開發(fā)生產(chǎn)力。例如,我們可以編寫用于插入、更新、刪除AUTHS表的過程,此后應(yīng)用可以直接調(diào)用這些過程,而無(wú)需重寫SQL語(yǔ)句。當(dāng)管理數(shù)據(jù)的方法發(fā)生變化時(shí),只需要修改過程,而不需要對(duì)應(yīng)用進(jìn)行任何修改。 Java存儲(chǔ)過程
          在以前的Oracle版本中,開發(fā)存儲(chǔ)過程是通過PL/SQL來(lái)完成的。而在Oracle8i版本中,我們不僅可以使用PL/SQL開發(fā)存儲(chǔ)過程,而且還可以使用Java語(yǔ)言來(lái)開發(fā)存儲(chǔ)過程。
          ?
          1.???????? PL/SQL與Java存儲(chǔ)過程比較
          ?
          與PL/SQL相比,使用Java語(yǔ)言開發(fā)存儲(chǔ)過程有以下優(yōu)點(diǎn):
          ?
          l???????? Java語(yǔ)言具有更強(qiáng)大的運(yùn)算能力,提供了更多的運(yùn)算方法。當(dāng)要完成進(jìn)行復(fù)雜運(yùn)算的存儲(chǔ)過程時(shí),使用JSP將是你最好的選擇。
          l???????? PL/SQL只能用于Oracle數(shù)據(jù)庫(kù),而Java語(yǔ)言可以應(yīng)用于更多的數(shù)據(jù)庫(kù)系統(tǒng)(如Sybase、DB2、Informix等等),所以Java存儲(chǔ)過程將具有更好的兼容性、可移植性。
          ?
          2.???????? JSP分類
          Java存儲(chǔ)過程包括過程、函數(shù)、觸發(fā)器以及對(duì)象方法四種類型。
          ?
          3.???????? 調(diào)用JSP的四種方法
          ?
          l???????? CALL語(yǔ)法;
          l???????? DML語(yǔ)句;
          l???????? PL/SQL塊、子程序、包;
          l???????? 由觸發(fā)器隱含調(diào)用。 Java存儲(chǔ)過程的開發(fā)步驟
          1.???????? 編寫Java源代碼
          ?
          當(dāng)開發(fā)Java存儲(chǔ)過程時(shí),首先應(yīng)該編寫Java源代碼。如下圖所示:
          注意事項(xiàng):
          ?
          l????????? 當(dāng)以public方式聲明類時(shí),類名必須與其文件名完全一致。
          l????????? 只有public static方法可以作為Java存儲(chǔ)過程。
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          在編寫了Java源代碼之后,接下來(lái)應(yīng)該將Java代碼及相應(yīng)的Java類裝載到Oracle8i數(shù)據(jù)庫(kù)中。如下圖所示:
          裝載Java代碼及類到RDBMS有以下兩種方法:
          ?
          l???????? 使用loadjava工具,通過該工具可以快速裝載Java源代碼(.java)、Java二進(jìn)制代碼(.class)以及Java打包文件(.jar)。
          l???????? 使用CREATE Java、ALTER Java裝載Java代碼。
          ?
          其中,前一種方法相對(duì)簡(jiǎn)單,并且我們推薦你使用這種方法。
          ?
          3.???????? 生成調(diào)用說(shuō)明
          ?
          在裝載了Java類之后,接下來(lái)應(yīng)該生成對(duì)public static方法的調(diào)用說(shuō)明,最終完成Java存儲(chǔ)過程的開發(fā)工作。如下圖所示:
          ?
          完成上述步驟之后,就完成了Java存儲(chǔ)過程的開發(fā)工作,然后就可以調(diào)用并執(zhí)行該Java存儲(chǔ)過程了。 使用Java開發(fā)過程
          過程用于執(zhí)行某種操作。需要注意的是,過程所對(duì)應(yīng)的Java方法返回值必須為空(void)。本節(jié)以創(chuàng)建用于插入、修改和刪除AUTHS表的JSP為例,說(shuō)明使用Java開發(fā)過程的方法。如下圖所示:
          下面講述完成上述任務(wù)的方法及過程:
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(manipulate_auths.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class manipulate_auths {
          ?
          ? public static void insert_auths
          ??? (String code,String name,int sex,String birthdate,String entry_date_time)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          String sql = "INSERT INTO auths
          ?(author_code,name,sex,birthdate,entry_date_time) " +
          ???????????????? "VALUES (?,?,?,?,?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? pstmt.setString(2, name);
          ????? pstmt.setInt(3, sex);
          ????? pstmt.setString(4, birthdate);
          ????? pstmt.setString(5, entry_date_time);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          ?
          ? public static void delete_auths (String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM auths? WHERE author_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          ?
          ? public static void modify_salary (String code,float salary)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setFloat(1, salary);
          ????? pstmt.setString(2, code);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) { }
          ? }
          }
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?

          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過程說(shuō)明了。下面是完成該項(xiàng)任務(wù)的方法:
          ?




          ?
          4.???????? 調(diào)用JSP
          在生成了調(diào)用Java方法的過程說(shuō)明之后,我們就可以調(diào)用JSP了。例如:
          ?

          使用Java開發(fā)函數(shù)
          函數(shù)用于返回特定數(shù)據(jù)。本節(jié)將通過創(chuàng)建用于返回作者的文章標(biāo)題,以及某種類型的文章個(gè)數(shù)為例,說(shuō)明使用Java開發(fā)函數(shù)的方法。如下圖所示:
          ?
          ?
          下面講述完成上述任務(wù)的方法和過程。
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(query_article.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class query_article {
          ?
          ? public static String auths_article(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql1 = "SELECT name FROM auths WHERE author_code=?";
          ??? String sql2 = "SELECT title FROM article WHERE author_code=?";
          ??? /* 聲明并初始化auths_article變量 */
          ??? String auths_article = new String();
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql1);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next())
          ??????? auths_article =auths_article + rset.getString(1);
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? auths_article = auths_article + "所編寫文章的標(biāo)題如下:\n";
          ?
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql2);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next()) {
          ??????? auths_article =auths_article + "??? " + rset.getString(1) + "\n";
          ????? }
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return auths_article;
          ? }
          ?
          ? public static String query_type_article_number(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "SELECT count(*) FROM article WHERE article_code IN "
          ?????? + "(SELECT article_code FROM article_type WHERE type_code=?)";
          ??? String article_number = new String("類型為" + code + "的文章共有 ");
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ? ????/* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
          ????? while(rset.next())
          ??????? article_number = article_number + rset.getString(1) + "篇";
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return article_number;
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:

          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的函數(shù)說(shuō)明了。下面是完成該項(xiàng)任務(wù)的方法:
          ?


          ?
          4.???????? 調(diào)用JSP
          ?
          在生成了調(diào)用Java方法的函數(shù)說(shuō)明之后,就可以調(diào)用這些函數(shù)了。例如:
          ?
          使用Java開發(fā)
          Java類用于封裝Java方法,與此類似,包用于封裝過程和函數(shù)等。本節(jié)將通過創(chuàng)建用于管理表subject的包為例,說(shuō)明使用Java開發(fā)包的方法。如下圖所示:
          ?

          ?
          下面講述完成上述任務(wù)的方法和過程。
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(manage_subject.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class manage_subject {
          ?
          ? public static String query_subject()
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造SQL語(yǔ)句 */
          ??? String sql = "SELECT * FROM subject";
          ??? /* 聲明并初始化subject變量 */
          ??? String subject = new String();
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 創(chuàng)建Statement對(duì)象 */
          ????? Statement stmt = conn.createStatement();
          ????? /* 執(zhí)行SQL語(yǔ)句,并將查詢結(jié)果賦給結(jié)果集 */
          ????? ResultSet rset = stmt.executeQuery(sql);
          ????? /* 循環(huán)獲取并處理結(jié)果集變量 */
          ????? while(rset.next())
          ??????? subject = subject + rset.getString(1) + "\n";
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ??? } catch (SQLException e) {}
          ??? return subject;
          ? }
          ?
          ? public static void insert_subject(String subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "INSERT INTO subject VALUES(?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void delete_subject(String subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM subject WHERE subject=?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void update_subject(String old_subject,String new_subject)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "UPDATE subject SET subject=? WHERE subject=?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, new_subject);
          ????? pstmt.setString(2, old_subject);
          ????? /* 執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的包了。下面是完成該項(xiàng)任務(wù)的方法:



          4.???????? 調(diào)用JSP
          ?
          在生成了調(diào)用Java方法的包后,就可以調(diào)用這些方法所對(duì)應(yīng)的函數(shù)和過程了。例如:
          ?




          使用Java開發(fā)觸發(fā)器
          觸發(fā)器是一段存儲(chǔ)程序,當(dāng)執(zhí)行特定修改操作時(shí),會(huì)觸發(fā)它,并執(zhí)行其中的存儲(chǔ)程序。下面以記載表AUTHS作者工資更新情況的觸發(fā)器為例,說(shuō)明使用Java開發(fā)觸發(fā)器的方法。如下圖所示:
          ?


          ?
          下面講述完成上述任務(wù)的方法和過程。
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(trigger.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          /* 主類 */
          public class trigger {
          ?
          ? public static void log_salary(String name,float old_sal,float new_sal)
          ? throws SQLException {
          ?
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? String sql = "INSERT INTO salary_audit VALUES(?,?,?)";
          ?
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? pstmt.setString(1, name);
          ????? pstmt.setFloat(2, old_sal);
          ????? pstmt.setFloat(3, new_sal);
          ????? pstmt.executeUpdate();
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過程說(shuō)明及觸發(fā)器了。下面是完成該項(xiàng)任務(wù)的方法:




          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了觸發(fā)器之后,當(dāng)修改作者工資時(shí)會(huì)自動(dòng)調(diào)用其中的存儲(chǔ)程序。例如:
          ?

          使用Java開發(fā)對(duì)象方法
          對(duì)象類型是一種用戶自定義的數(shù)據(jù)結(jié)構(gòu),它可以將數(shù)據(jù)類型、函數(shù)以及過程封裝到該數(shù)據(jù)結(jié)構(gòu)中。對(duì)象方法是指對(duì)象類型中的函數(shù)和過程,本節(jié)將以獲取和增加對(duì)象工資信息為例,說(shuō)明使用Java開發(fā)對(duì)象方法的方法。如下圖所示:

          ?
          下面講述完成上述任務(wù)的方法及過程:
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(object_type.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.sql.*;
          import oracle.jdbc.driver.*;
          import oracle.oracore.*;
          import oracle.jdbc2.*;
          import java.math.*;
          ?
          /* 主類,實(shí)現(xiàn)了SQLData接口 */
          public class object_type implements SQLData {
          ?
          ? /* 聲明private變量,它們對(duì)應(yīng)于對(duì)象類型的屬性 */
          ? private String code;
          ? private String name;
          ? private BigDecimal sex;
          ? private BigDecimal salary;
          ?
          ? /* 方法get_name():對(duì)象類型的方法,用于獲取對(duì)象姓名 */
          ? public String get_name() {
          ??? return name;
          ? }
          ?
          ? /* 方法get_salary():對(duì)象類型的方法,用于獲取對(duì)象工資 */
          ? public BigDecimal get_salary() {
          ??? BigDecimal sal = salary;
          ??? return sal;
          ? }
          ? /* 方法raise_salary():對(duì)象類型的方法,用于增加對(duì)象工資 */
          ? public void raise_salary(BigDecimal raise) {
          ??? salary = salary.add(raise);
          ? }
          ?
          ? /* 以下程序段實(shí)現(xiàn)了接口SQLData */
          ? String sql_type;
          ? public String getSQLTypeName() throws SQLException {
          ??? return sql_type;
          ? }
          ?
          ? public void readSQL(SQLInput stream, String typeName) throws SQLException {
          ??? sql_type = typeName;
          ??? code = stream.readString();
          ??? name = stream.readString();
          ??? sex = stream.readBigDecimal();
          ??? salary = stream.readBigDecimal();
          ??}
          ?
          ? public void writeSQL(SQLOutput stream) throws SQLException {
          ??? stream.writeString(code);
          ??? stream.writeString(name);
          ??? stream.writeBigDecimal(sex);
          ??? stream.writeBigDecimal(salary);
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫(kù)中
          ?
          在編寫了Java源代碼之后,就可以將Java對(duì)象裝載到Oracle8i數(shù)據(jù)庫(kù)中了。下面是完成這項(xiàng)任務(wù)的方法:
          ?


          ?
          3.???????? 發(fā)行Java,生成調(diào)用說(shuō)明
          ?
          在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的相應(yīng)對(duì)象方法了。下面是完成該項(xiàng)任務(wù)的方法:
          ?



          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了對(duì)象類型及對(duì)象方法之后,就可以調(diào)用這些對(duì)象方法了。例如:
          ?
          使用JDeveloper開發(fā)JSP
          本節(jié)以創(chuàng)建用于操縱ARTICLE表的JSP為例,說(shuō)明使用JDeveloper 2.0開發(fā)JSP的方法。如下圖所示:

          這里只簡(jiǎn)單介紹使用JDeveloper開發(fā)JSP的過程和步驟,而關(guān)于如何使用JDeveloper請(qǐng)讀者參見相關(guān)手冊(cè)。
          ?
          1.???????? 準(zhǔn)備工作
          ?
          1)??????? 選擇“File—> New Workspace”,創(chuàng)建名稱為jsp.jws的工作組。如下圖所示:
          ?

          ?
          2)??????? 選擇“File—>New Project”,此時(shí)會(huì)啟動(dòng)新項(xiàng)目創(chuàng)建向?qū)В@示如下對(duì)話框:
          ?

          ?
          3)??????? 選中“Create an <Empty Project>”,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:

          ?
          4)??????? 如上圖所示,在“Project Name”框中鍵入“article”,項(xiàng)目路徑框中鍵入“d:\jsp”,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          5)??????? 在上圖的對(duì)話框中鍵入你所需要的信息,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          6)??????? 單擊“Finish”,完成項(xiàng)目的創(chuàng)建過程,此時(shí)的圖形界面如下:
          ?

          ?
          2.???????? 編寫Java源代碼
          ?
          在完成了準(zhǔn)備工作之后,我們就可以編寫Java源代碼了。步驟如下:
          ?
          1)??????? 選擇“File—>New”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?


          ?
          2)??????? 如上圖所示,選中“Class”,然后單擊“OK”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          3)??????? 如上圖所示,在“Class Name”框中鍵入“article”,選中“Style”中的“Public”,然后單擊“OK”,此時(shí)會(huì)增加名稱為“article.java”的節(jié)點(diǎn)。如下圖所示:
          ?

          ?
          4)??????? 雙擊“article.java”節(jié)點(diǎn),會(huì)顯示編輯工作區(qū)。如下圖所示:
          ?

          ?
          5)??????? 然后,在編輯工作區(qū)中編寫如下的Java源代碼(article.java):
          ?
          /* 導(dǎo)入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class article {
          ?
          ? public static String query_article(String code)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句*/
          ??? String sql = "SELECT author_code,title FROM article " +
          ????????????????? "WHERE article_code = ?";
          ??? /* 聲明String變量article_info,該變量將用于存儲(chǔ)文章信息 */
          ??? String article_info = new String();
          ?
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環(huán)獲取并處理結(jié)果 */
          ????? while(rset.next()) {
          ??????? article_info = "作者代碼:? " + rset.getString(1) + "\n";
          ??????? article_info = article_info + "文章標(biāo)題:? " +
          ????????????????????????? rset.getString(2);
          ????? }
          ????? /* 關(guān)閉結(jié)果集 */
          ????? rset.close();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return article_info;
          ? }
          ?
          ? public static void insert_article(String article_code,
          ????? String author_code,String secrate_level,String pub_date)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ??? String sql = "INSERT INTO article (article_code,author_code," +
          ??????????????????? "secrate_level,pub_date) VALUES (?,?,?,?)";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, article_code);
          ????? pstmt.setString(2, author_code);
          ????? pstmt.setString(3, secrate_level);
          ????? pstmt.setString(4, pub_date);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void delete_article (String code)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造SQL語(yǔ)句 */
          ??? String sql = "DELETE FROM article? WHERE article_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ????? pstmt.setString(1, code);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ?? ???pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          ?
          ? public static void update_article (String code,String secrate_level)
          ? throws SQLException {
          ??? /* 建立到數(shù)據(jù)庫(kù)的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構(gòu)造動(dòng)態(tài)SQL語(yǔ)句 */
          ? ??String sql = "UPDATE article SET secrate_level = ?" +
          ????????????????? " WHERE article_code = ?";
          ??? /* 使用try ... catch語(yǔ)句抓取并拋出例外 */
          ??? try {
          ????? /* 準(zhǔn)備動(dòng)態(tài)SQL語(yǔ)句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設(shè)置動(dòng)態(tài)SQL參數(shù)值 */
          ???? ?pstmt.setString(1, secrate_level);
          ????? pstmt.setString(2, code);
          ????? pstmt.executeUpdate();
          ????? /* 關(guān)閉動(dòng)態(tài)SQL語(yǔ)句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ? }
          }
          ?
          3.???????? 配置并發(fā)行JSP
          ?
          步驟如下:
          ?
          1)??????? 選擇“Project—>Deploy—>New Profile”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          2)??????? 如上圖所示,選中“Deploy Java Classes and Stored Procedure to Oracle8i”,然后單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          3)??????? 單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          4)??????? 單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          5)??????? 單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          6)??????? 清除“Default Database Package”框,然后單擊“Next”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          7)??????? 單擊“New”創(chuàng)建數(shù)據(jù)庫(kù)連接,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          該對(duì)話框用于配置數(shù)據(jù)庫(kù)連接信息,按照你的數(shù)據(jù)庫(kù)設(shè)置來(lái)配置相應(yīng)參數(shù)。完成數(shù)據(jù)庫(kù)連接的配置后,單擊“Test Connection”測(cè)試配置是否正確。如果配置不正確,則修改配置參數(shù)。
          ?
          8)??????? 單擊“OK”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          在該對(duì)話框中顯示了相應(yīng)的數(shù)據(jù)庫(kù)連接信息。
          ?
          9)??????? 單擊“Next”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          10)???? 單擊“Finish”,此時(shí)會(huì)彈出如下對(duì)話框:
          ?

          ?
          11)???? 單擊“No”退出配置,然后在主窗口中選中配置文件“Profile1.prf”,單擊鼠標(biāo)右鍵,此時(shí)會(huì)顯示如下彈出菜單:
          ?

          ?
          12)???? 從彈出菜單中選擇“Properties”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          13)???? 選擇“Methods”頁(yè),此時(shí)的對(duì)話框如下所示:
          ?

          ?
          14)???? 如上圖所示,選中Publish下的所有單選框,然后單擊“Done”,此時(shí)會(huì)顯示如下對(duì)話框:
          ?

          ?
          15)???? 單擊“Yes”,會(huì)開始配置和發(fā)行JSP,并最終顯示如下界面:
          ?

          ?
          16)???? 單擊“Done”,此時(shí)會(huì)顯示如下信息框:
          ?

          ?
          17)???? 單擊“OK”,這樣我們就完成了配置和發(fā)行JSP的全部過程了。然后,我們就可以調(diào)用JSP完成相應(yīng)任務(wù)了。
          ?
          4.???????? 調(diào)用JSP
          ?
          在創(chuàng)建了基于Java的函數(shù)和過程之后,就可以調(diào)用這些函數(shù)和過程了。方法如下:
          ?





          posted @ 2006-08-16 15:18 黑咖啡 閱讀(316) | 評(píng)論 (0)編輯 收藏
          Oracle開發(fā)人員 JAVA存儲(chǔ)過程
          利用Java存儲(chǔ)過程簡(jiǎn)化數(shù)據(jù)庫(kù)操作

          作者:Kuassi Mensah

          利用Java存儲(chǔ)過程溝通SQL、XML、Java、J2EE和Web服務(wù)。

          存儲(chǔ)過程(stored procedure)允許將運(yùn)行于數(shù)據(jù)庫(kù)層中的持久性邏輯與運(yùn)行于中間層中的商務(wù)邏輯有效地分離開來(lái)。這種分離可以降低整個(gè)應(yīng)用程序的復(fù)雜性,并提供其重用性、安全性、性能和可伸縮性。

          但是,妨礙存儲(chǔ)過程廣泛采用的一個(gè)主要障礙是不同數(shù)據(jù)庫(kù)廠商使用各種專有的、且依賴于數(shù)據(jù)庫(kù)的實(shí)現(xiàn)語(yǔ)言。使用基于Java的存儲(chǔ)過程可以解決這一問題。Oracle已經(jīng)實(shí)現(xiàn)了ANSI標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)規(guī)定了從SQL中將靜態(tài)Java方法作為過程或函數(shù)進(jìn)行調(diào)用的能力。這種實(shí)現(xiàn)被簡(jiǎn)單地稱作"Java存儲(chǔ)過程"。

          在本文中,你將了解基于Java的存儲(chǔ)過程如何幫助簡(jiǎn)化商務(wù)邏輯、提高其性能,并擴(kuò)展數(shù)據(jù)庫(kù)的功能。本文將介紹Oracle如何在數(shù)據(jù)庫(kù)內(nèi)啟用基于Java的存儲(chǔ)過程。還會(huì)介紹Java存儲(chǔ)過程如何訪問數(shù)據(jù),以及如何創(chuàng)建基本Java存儲(chǔ)過程。

          選擇PL/SQL還是Java

          在考慮Oracle存儲(chǔ)過程時(shí),你可能會(huì)想到PL/SQL。不過,從Oracle8i開始,Oracle已經(jīng)在數(shù)據(jù)庫(kù)中支持Java,從而為存儲(chǔ)過程提供了不同于PL/SQL的開放式和可移植的方法。我可以聽到"$64 000問題":"我如何在PL/SQL和Java之間做出選擇?我是否應(yīng)當(dāng)忘記已經(jīng)學(xué)習(xí)的所有PL/SQL相關(guān)知識(shí),而變?yōu)橐粋€(gè)Java天地的新手?"

          兩種語(yǔ)言都適用于數(shù)據(jù)庫(kù)編程,都有自己的優(yōu)點(diǎn)和弱點(diǎn)。在決定選擇哪一種語(yǔ)言時(shí),可以參考下面根據(jù)經(jīng)驗(yàn)得出的通用規(guī)則:


          對(duì)于要求與SQL進(jìn)行無(wú)縫集成的數(shù)據(jù)庫(kù)中心來(lái)說(shuō)則邏輯使用PL/SQL,從而完成對(duì)數(shù)據(jù)庫(kù)對(duì)象、類型和特性的訪問。


          出于與數(shù)據(jù)庫(kù)的無(wú)關(guān)性考慮時(shí),可以選擇Java作為開放式的語(yǔ)言來(lái)取代PL/SQL,同時(shí)也為了集成和溝通SQL、XML、J2EE和Web服務(wù)等各個(gè)領(lǐng)域。
          OralceJVM使得Java可以運(yùn)行在數(shù)據(jù)庫(kù)中

          從Oracle8i版本1(Oralce8.1.5)開始,Oracle便提供緊密集成的Java虛擬機(jī)(JVM),JVM支持Oralce的數(shù)據(jù)庫(kù)會(huì)話期結(jié)構(gòu)。任何數(shù)據(jù)庫(kù)對(duì)話期都可以在第一Java代碼調(diào)用時(shí)啟動(dòng)一個(gè)虛擬上專用的JVM,后續(xù)的用戶可以使用這一已經(jīng)存在的支持Java的會(huì)話期。事實(shí)上,所有會(huì)話共享同一JVM代碼并保持"僅靜態(tài)"的私有狀態(tài),而垃圾則收集在單個(gè)對(duì)話期空間內(nèi),從而為各個(gè)Java對(duì)話期提供了和SQL操作相同的對(duì)話期隔離和數(shù)據(jù)完整性能力。這里,不需要為了數(shù)據(jù)完整性而進(jìn)行單獨(dú)的Java支持的過程。這一基于對(duì)話期的結(jié)構(gòu)提供了較小的內(nèi)存占用率,并使OracleJVM具有與Oracle數(shù)據(jù)庫(kù)一樣的線性SMP可伸縮性。

          創(chuàng)建Java存儲(chǔ)過程

          要將Java方法轉(zhuǎn)換為Java存儲(chǔ)過程需要幾個(gè)步驟,包括:用loadjava實(shí)用程序?qū)ava類加載到數(shù)據(jù)庫(kù)中,利用調(diào)用規(guī)范(Call Spec)發(fā)布Java方法,將Java方法、參數(shù)類型和返回類型映射到其SQL的對(duì)應(yīng)部分。下面部分說(shuō)明如何完成這些步驟。

          我將使用一個(gè)簡(jiǎn)單的Hello類,它有一個(gè)方法Hello.world(),返回字符串"Hello world":


          public class Hello { public static String world () { return "Hello world"; } }
          Loadjava 實(shí)用程序

          Loadjava是加載Java源文件、Java類文件和Java資源文件的實(shí)用程序,它可以用來(lái)驗(yàn)證字節(jié)碼,并將Java類和JAR文件布置到數(shù)據(jù)庫(kù)中。它既可以通過命令行調(diào)用,也可以通過包含于DBMS_JAVA類中的loadjava()方法調(diào)用。為了加載我們的Hello.class示例,輸入:


          loadjava -user scott/tiger Hello.class

          從Oracle9i版本2開始,loadjava允許通過為包含在被處理的類中的方法創(chuàng)建相應(yīng)的Call Specs來(lái)自動(dòng)將Java類發(fā)布為存儲(chǔ)過程。Oracle為開發(fā)、測(cè)試、調(diào)試和布置Java存儲(chǔ)過程提供了Oracle9i JDeveloper。

          The Resolver Spec

          基于JDK的JVM在列于CLASSPATH中的目錄中查找類引用,并對(duì)其進(jìn)行解析。因?yàn)镺racle數(shù)據(jù)庫(kù)類存在于數(shù)據(jù)庫(kù)模式中,所以O(shè)racleJVM利用數(shù)據(jù)庫(kù)解析器(resolver)通過列于Resolver Spec中的模式查找并解析類引用。與CLASSPATH不同(CLASSPATH可以應(yīng)用于所有的類),Resover Spec根據(jù)每類的情況進(jìn)行應(yīng)用。缺省解析器首先在加載類的模式中搜尋類,然后在公共同義詞(public synonyms)中搜索。


          ?loadjava -resolve <myclass>
          你可能需要指定不同的解析器,也可以在使用loadjava時(shí)強(qiáng)制進(jìn)行解析,從而在布置時(shí)確定可能在以后運(yùn)行時(shí)發(fā)生的任何問題。


          loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))"
          Call Spec和存儲(chǔ)過程調(diào)用

          為了從SQL中調(diào)用Java方法(以及從PL/SQl和JDBC中調(diào)用),必須首先通過Call Spec發(fā)布公共靜態(tài)方法,它為SQL定義方法采用的參數(shù)以及返回的SQL類型。

          在我們的例子中,我們將利用SQL*Plus連接到數(shù)據(jù)庫(kù),并為Hello.world()定義一個(gè)頂級(jí)Call Spec:


          SQL> connect scott/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created.
          可以像下面這樣調(diào)用Java存儲(chǔ)過程:


          SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world
          Java存儲(chǔ)過程可以通過其Call Spec從以下各項(xiàng)中進(jìn)行調(diào)用:SQL DML語(yǔ)句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL塊、子程序、程序包以及數(shù)據(jù)庫(kù)觸發(fā)器。Call Spec的美妙之處在于存儲(chǔ)過程實(shí)現(xiàn)可以從PL/SQL轉(zhuǎn)換為Java,反之亦可,這一點(diǎn)對(duì)于請(qǐng)求者是透明的。

          Call Spec從實(shí)現(xiàn)語(yǔ)言中(PL/SQL或Java)中抽象出調(diào)用界面,因而使之能夠在原有應(yīng)用程序和新的基于Java/J2EE的應(yīng)用程序之間共享商務(wù)邏輯。但是,在從Java客戶程序調(diào)用在數(shù)據(jù)庫(kù)駐留的Java類時(shí),你可能不希望通過PL/SQL包裝器(wrapper)。在以后的版本中,Oracle計(jì)劃提供一種機(jī)制,它可以使開發(fā)人員略過Call Spec。

          高級(jí)數(shù)據(jù)訪問控制

          Java存儲(chǔ)過程可用于控制和限制對(duì)Oracle數(shù)據(jù)的訪問,其方法是只允許用戶通過存儲(chǔ)過程管理數(shù)據(jù),而存儲(chǔ)過程在其調(diào)用者的權(quán)限內(nèi)執(zhí)行,而不能對(duì)表本身進(jìn)行訪問。例如,你可以在特定時(shí)間內(nèi)禁止更新數(shù)據(jù),或者使管理者只具有查詢工資數(shù)據(jù)的權(quán)利,而不能進(jìn)行更新,或者記錄所有的訪問并通知某一安全機(jī)構(gòu)。

          原有應(yīng)用程序與J2EE應(yīng)用程序之間的數(shù)據(jù)邏輯共享

          因?yàn)樵袘?yīng)用程序與J2EE應(yīng)用程序都通過Call Spec調(diào)用存儲(chǔ)過程,所以J2EE和非J2EE應(yīng)用程序可以共享相同的數(shù)據(jù)邏輯。由于有了Call Spec,所以不用考慮所用的是何種實(shí)現(xiàn)語(yǔ)言(無(wú)論是PL/SQL還是Java),該數(shù)據(jù)邏輯都可以共享。

          為BMP實(shí)體Bean自動(dòng)生成主關(guān)鍵字

          在對(duì)EJB實(shí)體bean應(yīng)用BMP時(shí),一個(gè)bean實(shí)例可以由自動(dòng)生成的與新插入的數(shù)據(jù)相關(guān)聯(lián)的主關(guān)鍵字惟一確定,它是ejbCreate()的返回值。可以利用一個(gè)插入相應(yīng)數(shù)據(jù)的存儲(chǔ)過程在一個(gè)數(shù)據(jù)庫(kù)操作中檢索ejbCeater()中的該值,并檢索或計(jì)算主關(guān)鍵字。作為另一種方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一個(gè)SQL語(yǔ)句插入該數(shù)據(jù)并檢索相應(yīng)的關(guān)鍵字(或ROWID)。但是,存儲(chǔ)過程方法在各個(gè)JDBC驅(qū)動(dòng)器版本和數(shù)據(jù)庫(kù)之間更具可移植性。

          可以用以下三個(gè)步驟實(shí)現(xiàn)這一模式:
          >
          創(chuàng)建一個(gè)Java存儲(chǔ)過程,在公共GenPk類中定義一個(gè)公共靜態(tài)Java方法insertAccount()。此方法將插入數(shù)據(jù)、計(jì)算惟一的關(guān)鍵字(通過發(fā)出一個(gè)序列號(hào)),并返回計(jì)算出的關(guān)鍵字作為主關(guān)鍵字。


          定義Call Spec


          CREATE OR REPLACE PROCEDURE insertAccount(owner IN varchar, bal IN number, newid OUT number) AS LANGUAGE JAVA NAME 'GenPK.insertAccount( java.lang.String [])'; /


          在ejbCreate()內(nèi)調(diào)用存儲(chǔ)過程


          Public AccountPK ejbCreate(String ownerName, int balance) throws CreateException { try { CallableStatement call = conn.prepareCall{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } }
          為CMP實(shí)體Bean定制主關(guān)鍵字查找器

          查找器方法(Finder methods)用于檢索已存在的EJB實(shí)體bean實(shí)例。主關(guān)鍵字查找器使你能夠檢索惟一標(biāo)識(shí)的EJB實(shí)例。對(duì)于CMP實(shí)體bean,EJB容器根據(jù)聲明描述,自動(dòng)生成主關(guān)鍵字查找器findByPrimaryKey()方法。但是,在某些情況下,可能需要更多的控制,例如可能需要專門的查找器,如findByStoredProcKey()。在這些情況下,你可以結(jié)合使用Java存儲(chǔ)過程和對(duì)象關(guān)系框架(如Oracle9i應(yīng)用服務(wù)器[Oracle9iAS] TopLink)來(lái)實(shí)現(xiàn)定制的主關(guān)鍵字查找器方法。在將EJB查找器定義為REDIRECT或NAMED查找器后,TopLink將生成一個(gè)SQL查詢用于檢索bean實(shí)例。

          數(shù)據(jù)驅(qū)動(dòng)的EJB調(diào)用

          在數(shù)據(jù)驅(qū)動(dòng)體系結(jié)構(gòu)中,商務(wù)邏輯調(diào)用可以作為數(shù)據(jù)庫(kù)操作(如插入、更新或刪除)的結(jié)果來(lái)觸發(fā)。實(shí)現(xiàn)該數(shù)據(jù)邏輯的Java存儲(chǔ)過程可以被聲明為數(shù)據(jù)庫(kù)觸發(fā)器,用以調(diào)用運(yùn)行于中間層J2EE應(yīng)用服務(wù)器的EJB。EJB的調(diào)用既可以采用J2EE1.3兼容的服務(wù)器通過Interoperable Inter-ORB Protocol(IIOP)標(biāo)準(zhǔn)遠(yuǎn)程方法調(diào)用(remote method invocation,RMI)實(shí)現(xiàn),也可以通過銷售商特定的傳輸協(xié)議(如Oracle9iAS/Oc4J的ORMI,或者通過BEA WebLogic的T3)用RMI來(lái)實(shí)現(xiàn)。每個(gè)應(yīng)用服務(wù)器提供商在提供基于IIOP的RMI,以提供互操作性的同時(shí),都有其自己優(yōu)化的協(xié)議。Oracle9iAS同時(shí)支持基于IIOP的RMI調(diào)用和基于ORMI協(xié)議的RMI調(diào)用。

          數(shù)據(jù)驅(qū)動(dòng)的消息傳送

          Oracle9i數(shù)據(jù)庫(kù)嵌入了Advanced Queuing(AQ,高級(jí)排隊(duì)),它是一種集成的、穩(wěn)定、可靠、安全、可擴(kuò)展和事務(wù)處理式的消息排隊(duì)框架。Oracle通過標(biāo)準(zhǔn)的Java消息傳送系統(tǒng)(Java Messaging System,JMS)API為Java開發(fā)人員提供AQ功能。Java存儲(chǔ)過程可以通過JMS接口調(diào)用AQ操作,從而能夠?qū)崿F(xiàn)快速、在會(huì)話期內(nèi)、可擴(kuò)展的、數(shù)據(jù)驅(qū)動(dòng)的消息傳送。

          Java存儲(chǔ)過程可以利用JMS調(diào)用AQ操作。可以用以下4個(gè)步驟實(shí)現(xiàn)這一模式:


          創(chuàng)建并啟動(dòng)JMS Queue(為此,可以將以下一些操作嵌入SQL腳本內(nèi)):


          execute dbms_aqadm.create_queue_table(queue_table => 'queue1', queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE', comment => 'a test queue', multiple_consumers => false, compatible => '8.1.0'); execute dbms_aqadm.create_queue( queue_name => 'queue1', queue_table => 'queue1' ); execute dbms_aqadm.start_queue(queue_name => 'queue1');


          創(chuàng)建Java存儲(chǔ)過程(代碼摘錄如下):


          public static void runTest(String msgBody) { try { // get database connection ora_drv = new OracleDriver(); db_conn = ora_drv.defaultConnection(); // setup sender (cf online code sample) .. // create message s_msg = s_session.createTextMessage(msgBody); // send message sender.send(s_msg); s_session.commit(); // receive message r_msg = (TextMessage) receiver.receive(); r_session.commit(); // output message text String body = r_msg.getText(); System.out.println("message was '"+body+"'"); ..} }


          創(chuàng)建Call Spec:


          create or replace procedure jmsproc (t1 IN VARCHAR) as language java name 'jmsSample.main (java.lang.String[])'; /


          調(diào)用存儲(chǔ)過程:


          call jmsproc('hello');
          數(shù)據(jù)庫(kù)輔助的Web發(fā)布(緩沖失效)

          各應(yīng)用程序結(jié)構(gòu)必須面對(duì)的一個(gè)共同問題是如果可靠地將數(shù)據(jù)庫(kù)信息進(jìn)行緩存,以提高整個(gè)系統(tǒng)的性能。JCACHE是一種即將公布的標(biāo)準(zhǔn)規(guī)范(JSR 107),它可以解決這一問題。它說(shuō)明了一種對(duì)Java對(duì)象臨時(shí)在內(nèi)存中進(jìn)行緩存的方法,包括對(duì)象的創(chuàng)建、共享訪問、假脫機(jī)(spooling)、失效、各JVM的一致性等。它可被用于緩存JSP內(nèi)最經(jīng)常讀取的數(shù)據(jù),如產(chǎn)品目錄和價(jià)格列表。利用JCACHE,多數(shù)查詢的反應(yīng)時(shí)間會(huì)因?yàn)橛芯彺娴臄?shù)據(jù)而加快(內(nèi)部測(cè)試表明反應(yīng)時(shí)間大約快15倍)。

          為了跟蹤原始數(shù)據(jù)的所有變化,并刷新已緩存的數(shù)據(jù),Java存儲(chǔ)過程會(huì)作為一個(gè)觸發(fā)器被附加在一個(gè)表上。這個(gè)表的任何變化都會(huì)自動(dòng)調(diào)用該存儲(chǔ)過程,后者再調(diào)出一個(gè)已定義的JSP使JCACHE對(duì)象失效,該對(duì)象將其狀態(tài)映射到該數(shù)據(jù)庫(kù)表。在失效時(shí),緊跟其后的查詢將強(qiáng)制緩存器根據(jù)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行更新。 下面的步驟
          閱讀關(guān)于Java存儲(chǔ)過程的更多信息
          本文摘自白皮書"釋放Java存儲(chǔ)過程的能量(Unleash the Power of Java Stored Procedures)",可以在以下位置找到該白皮書:
          otn.oracle.com/tech/java/java_db/pdf/
          OW_30820_JAVA_STORED_PROC_paper.PDF

          Oracle9i數(shù)據(jù)庫(kù)第2版中的新PL/SQL特性
          otn.oracle.com/tech/pl_sql/pdf/
          Paper_30720_Doc.pdf

          Resolver Spec
          otn.oracle.com/docs/products/oracle9i/
          doc_library/release2/java.920/a96659.pdf

          OracleJVM and Java 2 Security
          otn.oracle.com/docs/products/oracle9i/
          doc_library/release2/java.920/a96656.pdf

          下載代碼
          練習(xí)本文中的代碼示例:
          otn.oracle.com/sample_code/tech/
          java/jsp/Oracle9iJSPSamples.html

          了解作為Web服務(wù)的存儲(chǔ)過程
          otn.oracle.com/tech/webservices
          ?


          擴(kuò)展數(shù)據(jù)庫(kù)的功能

          在數(shù)據(jù)庫(kù)中直接運(yùn)行Java代碼的一個(gè)妙處就在于要實(shí)現(xiàn)新的功能,只需要簡(jiǎn)單地加載代碼或庫(kù),并利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的進(jìn)入點(diǎn)(公共靜態(tài)方法)。Oracle9i數(shù)據(jù)庫(kù)用戶可以很容易地?cái)U(kuò)展數(shù)據(jù)庫(kù)

          功能。Oracle自己利用這種能力來(lái)獲得新的應(yīng)用程序和工具包,如XML Developer Kits(XDKs)。

          溝通SQL、PL/SQL、Java、J2EE、.NET和XML

          Oracle XDK是用Java編寫的,并將其公共方法可用作Java存儲(chǔ)過程,從而擴(kuò)展了數(shù)據(jù)庫(kù)的XML可編程能力。SQL、PL/SQL、Java、J2EE和非Java(.NET)商務(wù)邏輯都能夠訪問XML分析器、XSLT處理器、XPath引擎和XML SQL Utility(XSU)。

          XML分析器可以通過xmlparser和xmldom包進(jìn)行訪問。XSU是一種Java實(shí)用程序,它可以由SQL查詢結(jié)果或JDBC ResultSet生成XML文檔,并將XML文檔中的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)表或視圖中。利用XSU,XML輸出可以輸出為文本、Dom樹或DTS。通過dbms_xmlquery和dbms_xmlsave包,XSU即可用于PL/SQL。

          結(jié)論

          Oracle數(shù)據(jù)庫(kù)與Java VM的集成可以創(chuàng)建可移植、功能強(qiáng)大和與數(shù)據(jù)庫(kù)無(wú)關(guān)的數(shù)據(jù)邏輯和持續(xù)性邏輯(persistence logic)。運(yùn)行于中間層的商務(wù)邏輯和運(yùn)行于數(shù)據(jù)庫(kù)層的數(shù)據(jù)邏輯之間的分離提高了應(yīng)用程序的可擴(kuò)展性、靈活性和可維護(hù)性。

          posted @ 2006-08-16 11:55 黑咖啡 閱讀(267) | 評(píng)論 (0)編輯 收藏

          什么是存儲(chǔ)過程呢?

          定義:

          ????? 將常用的或很復(fù)雜的工作,預(yù)先用SQL語(yǔ)句寫好并用一個(gè)指定的名稱存儲(chǔ)起來(lái), 那么以后要叫數(shù)據(jù)庫(kù)提供與已定義好的存儲(chǔ)過程的功能相同的服務(wù)時(shí),只需調(diào)用execute,即可自動(dòng)完成命令。

          講到這里,可能有人要問:這么說(shuō)存儲(chǔ)過程就是一堆SQL語(yǔ)句而已啊?

          Microsoft公司為什么還要添加這個(gè)技術(shù)呢?

          那么存儲(chǔ)過程與一般的SQL語(yǔ)句有什么區(qū)別呢?

          存儲(chǔ)過程的優(yōu)點(diǎn):

          1.存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯,而一般SQL語(yǔ)句每執(zhí)行一次? 就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。

          2.當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。

          3.存儲(chǔ)過程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開發(fā)人員的工作量

          4.安全性高,可設(shè)定只有某此用戶才具有對(duì)指定存儲(chǔ)過程的使用權(quán)

          存儲(chǔ)過程的種類:

          ?????1.系統(tǒng)存儲(chǔ)過程:以sp_開頭,用來(lái)進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定.取得信息.相關(guān)管理工作,

          ?????????????????????????????? 如 sp_help就是取得指定對(duì)象的相關(guān)信息
          ? 2.擴(kuò)展存儲(chǔ)過程?? 以XP_開頭,用來(lái)調(diào)用操作系統(tǒng)提供的功能

          ????????????????????????????? exec master..xp_cmdshell 'ping 10.8.16.1'

          ?? 3.用戶自定義的存儲(chǔ)過程,這是我們所指的存儲(chǔ)過程

          ?? 常用格式

          ?? Create procedure procedue_name

          ?? [@parameter data_type][output]

          ?? [with]{recompile|encryption}

          ?? as

          ??????? sql_statement

          解釋:?

          output:表示此參數(shù)是可傳回的

          with {recompile|encryption}

          recompile:表示每次執(zhí)行此存儲(chǔ)過程時(shí)都重新編譯一次

          encryption:所創(chuàng)建的存儲(chǔ)過程的內(nèi)容會(huì)被加密

          如:

          ?? 表book的內(nèi)容如下

          ?? 編號(hào)??? 書名?????????????????????????? 價(jià)格

          ?? 001????? C語(yǔ)言入門?????????????????? $30

          ?? 002????? PowerBuilder報(bào)表開發(fā)? $52

          ?實(shí)例1:查詢表Book的內(nèi)容的存儲(chǔ)過程

          ?? create proc query_book

          ????? as

          ????? select * from book

          ?? go

          ?? exec query_book

          ?實(shí)例2:加入一筆記錄到表book,并查詢此表中所有書籍的總金額

          ?? Create proc insert_book

          ?? @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output

          ?? with encryption? ---------加密

          ?? as

          ?? insert book(編號(hào),書名,價(jià)格) Values(@param1,@param2,@param3)
          ?? select @param4=sum(價(jià)格) from book
          ? go

          ? 執(zhí)行例子:
          ? declare @total_price money
          ? exec insert_book '003','Delphi 控件開發(fā)指南',$100,@total_price
          ? print '總金額為'+convert(varchar,@total_price)
          ? go
          存儲(chǔ)過程的3種傳回值:
          ?? 1.以Return傳回整數(shù)
          ?? 2.以output格式傳回參數(shù)
          ?? 3.Recordset
          傳回值的區(qū)別:
          ?????? output和return都可在批次程式中用變量接收,而recordset則傳回到執(zhí)行批次的客戶端中?

          實(shí)例3:設(shè)有兩個(gè)表為Product,Order,其表內(nèi)容如下:
          ????? Product
          ?????????? 產(chǎn)品編號(hào)?????? 產(chǎn)品名稱??? 客戶訂數(shù)????
          ??????????? 001???????????? 鋼筆???????? 30????????
          ??????????? 002???????????? 毛筆???????? 50????????
          ??????????? 003???????????? 鉛筆???????? 100???????
          ????? Order?
          ?????????? 產(chǎn)品編號(hào)???????? 客戶名???? 客戶訂金
          ??????????? 001????????????? 南山區(qū)????? $30
          ??????????? 002????????????? 羅湖區(qū)????? $50
          ??????????? 003????????????? 寶安區(qū)????? $4
          請(qǐng)實(shí)現(xiàn)按編號(hào)為連接條件,將兩個(gè)表連接成一個(gè)臨時(shí)表,該表只含編號(hào).產(chǎn)品名.客戶名.訂金.總金額,
          總金額=訂金*訂數(shù),臨時(shí)表放在存儲(chǔ)過程中

          代碼如下:
          ???? Create proc temp_sale
          ???? as
          ?????? select a.產(chǎn)品編號(hào),a.產(chǎn)品名稱,b.客戶名,b.客戶訂金,a.客戶訂數(shù)* b.客戶訂金 as總金額
          ?????? into #temptable from Product a inner join Order b on a.產(chǎn)品編號(hào)=b.產(chǎn)品編號(hào)
          ??? if? @@error=0
          ?????? print 'Good'
          ??? else
          ?????? print 'Fail'
          ???? go

          posted @ 2006-08-16 11:53 黑咖啡 閱讀(234) | 評(píng)論 (0)編輯 收藏
          1、線程 新建線程運(yùn)行機(jī)制。

          2、File IO? 文件建立,讀寫,刪除。?
          posted @ 2006-07-31 17:44 黑咖啡 閱讀(244) | 評(píng)論 (0)編輯 收藏
               摘要: 1 /**/ /* ??2 ?*?Made?In?GamVan.com ??3 ?*?Created?on?2005年3月18日,?下午8:37 ??4 ...  閱讀全文
          posted @ 2006-07-27 13:03 黑咖啡 閱讀(330) | 評(píng)論 (0)編輯 收藏
          文件的建立/檢查與刪除

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>文件的建立、檢查與刪除</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("");
          //out.println(path);
          File f=new File(path,"File.txt");
          //out.println(f);
          //out.println(f.exists());

          if(f.exists()){//檢查File.txt是否存在
          f.delete();//刪除File.txt文件
          out.println(path + "\\File.txt 存在,已刪除。");
          }else{
          f.createNewFile();//在當(dāng)前目錄下建立一個(gè)名為File.txt的文件
          out.println(path + "\\File.txt 不存在,已建立。");//輸出目前所在的目錄路徑
          }
          %>

            目錄的建立/檢查與刪除

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>目錄的建立/檢查與刪除</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("");
          path=path + "\\Sub";//將要建立的目錄路徑
          File d=new File(path);//建立代表Sub目錄的File對(duì)象,并得到它的一個(gè)引用
          if(d.exists()){//檢查Sub目錄是否存在
          d.delete();
          out.println("Sub目錄存在,已刪除");
          }else{
          d.mkdir();//建立Sub目錄
          out.println("Sub目錄不存在,已建立");
          }
          %>
          </body>
          </html>

            如何在JSP中處理虛擬目錄

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>JSP中如何處理虛擬目錄</title>
          </head>
          <body>
          取得虛擬目錄對(duì)應(yīng)的磁盤路徑<br>
          Web站點(diǎn)主目錄的位置為<font color=#ff0000><%=request.getRealPath("/")%></font><br>
          JSP網(wǎng)頁(yè)所在的目錄位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
          JSP網(wǎng)頁(yè)所在目錄上一層目錄的位置<font color=#ff0000><%=request.getRealPath("../")%></font><br>
          </body>
          </html>

          文件屬性的取得

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.util.Date,java.io.*"%>
          <html>
          <head>
          <title>文件屬性的取得</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("/");
          File f=new File(path,"ReadData.txt");
          if(f.exists()){
          %>
          <%=f.getName()%>的屬性如下:<br><br>
          文件長(zhǎng)度為:<%=f.length()%>
          <%=f.isFile()?"是文件":"不是文件"%><br>
          <%=f.isDirectory()?"是目錄":"不是目錄"%><br>
          <%=f.canRead()?"可讀取":"不可讀取"%><br>
          <%=f.canWrite()?"可寫入":"不可寫入"%><br>
          <%=f.isHidden()?"是隱藏文件":"不是隱藏文件"%><br>
          文件的最后修改日期為:<%=new Date(f.lastModified())%><br>
          <%
          }else{
          f.createNewFile();//在當(dāng)前目錄下建立一個(gè)名為ReaData.txt的文件
          %>
          <%=f.getName()%>的屬性如下:<br><br>
          文件長(zhǎng)度為:<%=f.length()%>
          <%=f.isFile()?"是文件":"不是文件"%><br>
          <%=f.isDirectory()?"是目錄":"不是目錄"%><br>
          <%=f.canRead()?"可讀取":"不可讀取"%><br>
          <%=f.canWrite()?"可寫入":"不可寫入"%><br>
          <%=f.isHidden()?"是隱藏文件":"不是隱藏文件"%><br>
          文件的最后修改日期為:<%=new Date(f.lastModified())%><br>
          <%
          }
          %>
          </body>
          </html>

            取出目錄中文件的方法

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>取出目錄中文件的方法--列出目錄中的文件</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("/");
          File d=new File(path);//建立當(dāng)前目錄中文件的File對(duì)象
          File list[]=d.listFiles();//取得代表目錄中所有文件的File對(duì)象數(shù)組
          out.println("<font color=#ff0000>" + path + "目錄下的文件:</font><br>");
          for(int i=0;i<list.length;i++){
          if(list<I>.isFile()){
          out.println(list<I>.getName() + "<br>");
          }
          }
          out.println("<br><font color=#ff0000>" + path + "目錄下的目錄:</font><br>");
          for(int i=0;i<list.length;i++){
          if(list<I>.isDirectory()){
          out.println(list<I>.getName() + "<br>");
          }
          }
          %>
          </body>
          </html>

          判斷是否為空白文件

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>判斷是否為空白文件</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("/");
          out.println(path);
          FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader對(duì)象,并實(shí)例化為fr
          //對(duì)FileReader類生成的對(duì)象使用read()方法,可以從字符流中讀取下一個(gè)字符。
          if(fr.read()==-1)//判斷是否已讀到文件的結(jié)尾
          {
          out.print("AtEnd.txt文件中沒有數(shù)據(jù)<br>");
          }else{
          out.println("AtEnd.txt文件中有數(shù)據(jù)");
          }
          fr.close();
          %>
          </body>
          </html>
          ??? <B>讀取所有的文件數(shù)據(jù)</B>
          <ccid_nobr>
          <table width="400" border="1" cellspacing="0" cellpadding="2"
          bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
          <tr>
          <td bgcolor="e6e6e6" class="code" style="font-size:9pt">
          <pre><ccid_code> <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*,java.lang.*"%>
          <html>
          <head>
          <title>讀取所有的文件數(shù)據(jù)</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          FileReader fr=new FileReader(path + "\\ReadData.txt");
          //關(guān)鍵在于讀取過程中,要判斷所讀取的字符是否已經(jīng)到了文件的末尾,
          并且這個(gè)字符是不是文件中的斷行符,即判斷該字符值是否為13。
          int c=fr.read();//從文件中讀取一個(gè)字符
          //判斷是否已讀到文件結(jié)尾
          while(c!=-1){
          out.print((char)c);//輸出讀到的數(shù)據(jù)
          c=fr.read();//從文件中繼續(xù)讀取數(shù)據(jù)
          if(c==13){//判斷是否為斷行字符
          out.print("<br>");//輸出分行標(biāo)簽
          fr.skip(1);//略過一個(gè)字符
          //c=fr.read();//讀取一個(gè)字符
          }
          }
          fr.close();
          %>
          </body>
          </html>

            一行一行讀取數(shù)據(jù)

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>文件讀取</title>
          </head>
          <body>
          <%
          String path=request.getRealPath("");//取得當(dāng)前目錄的路徑
          FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader對(duì)象,并實(shí)例化為fr
          BufferedReader br=new BufferedReader(fr);//建立BufferedReader對(duì)象,并實(shí)例化為br
          String Line=br.readLine();//從文件讀取一行字符串
          //判斷讀取到的字符串是否不為空
          while(Line!=null){
          out.println(Line + "<br>");//輸出從文件中讀取的數(shù)據(jù)
          Line=br.readLine();//從文件中繼續(xù)讀取一行數(shù)據(jù)
          }
          br.close();//關(guān)閉BufferedReader對(duì)象
          fr.close();//關(guān)閉文件
          %>
          </body>
          </html>
          略過文件中的字符不讀取

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>略過字節(jié)不讀取</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          FileReader fr=new FileReader(path + "\\ReadData.txt");
          fr.skip(2);//跳過2個(gè)字節(jié)
          int c=fr.read();//讀取一個(gè)字節(jié)
          while(c!=-1){
          out.print((char)c);
          c=fr.read();
          }
          fr.close();
          %>
          </body>
          </html>

            將數(shù)據(jù)寫入文件

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>將數(shù)據(jù)寫入文件</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter對(duì)象,并實(shí)例化fw
          //將字符串寫入文件
          fw.write("大家好!");
          fw.write("本書是《JSP編程技巧》");
          fw.write("請(qǐng)多多指教!");
          fw.write("email:stride@sina.com");
          fw.close();

          FileReader fr=new FileReader(path + "\\WriteData.txt");
          BufferedReader br=new BufferedReader(fr);//建立BufferedReader對(duì)象,并實(shí)例化為br
          String Line=br.readLine();
          //讀取一行數(shù)據(jù)
          out.println(Line + "<br>");
          br.close();//關(guān)閉BufferedReader對(duì)象
          fr.close();
          %>
          </body>
          </html>

            將寫入文件的數(shù)據(jù)分行

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>將寫入文件的數(shù)據(jù)分行</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          FileWriter fw=new FileWriter(path + "\\WriteData.txt");
          BufferedWriter bw=new BufferedWriter(fw);
          bw.write("大家好!");
          bw.write("本書是《JSP編程技巧》。");
          bw.newLine();//斷行
          bw.write("請(qǐng)多多指教!");
          bw.newLine();//斷行
          bw.write("email: stride@sina.com");
          bw.flush();//將數(shù)據(jù)更新至文件
          fw.close();//關(guān)閉文件流
          out.println("寫入文件內(nèi)容為:<br>");
          FileReader fr=new FileReader(path + "\\WriteData.txt");
          BufferedReader br=new BufferedReader(fr);
          String Line=br.readLine();//讀取一行數(shù)據(jù)
          while(Line!=null){
          out.println(Line + "<br>");
          Line=br.readLine();
          }
          fr.close();
          %>
          </body>
          </html>

            如何將數(shù)據(jù)追加寫入到文件

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>將寫入文件的數(shù)據(jù)分行</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw");
          //定義一個(gè)類RandomAccessFile的對(duì)象,并實(shí)例化
          rf.seek(rf.length());//將指針移動(dòng)到文件末尾
          rf.writeBytes("\nAppend a line to the file!");
          rf.close();//關(guān)閉文件流
          out.println("寫入文件內(nèi)容為:<br>");
          FileReader fr=new FileReader(path + "\\WriteData.txt");
          BufferedReader br=new BufferedReader(fr);//讀取文件的BufferedRead對(duì)象
          String Line=br.readLine();
          while(Line!=null){
          out.println(Line + "<br>");
          Line=br.readLine();
          }
          fr.close();//關(guān)閉文件
          %>
          </body>
          </html></I></I></I></I>

          posted @ 2006-07-27 13:00 黑咖啡 閱讀(379) | 評(píng)論 (0)編輯 收藏
          取得虛擬目錄對(duì)應(yīng)的磁盤路徑:

          Web站點(diǎn)主目錄的位置為<%=request.getRealPath("/")%
          JSP網(wǎng)頁(yè)所在的目錄位置<%=request.getRealPath("./")%>
          JSP網(wǎng)頁(yè)所在目錄上一層目錄的位置<%=request.getRealPath("../")%>
          posted @ 2006-07-27 12:58 黑咖啡 閱讀(429) | 評(píng)論 (0)編輯 收藏
          (Bloger注)自我感覺一個(gè)初學(xué)者,在經(jīng)歷了一段時(shí)間的編程實(shí)踐以后,應(yīng)該花時(shí)間整體了解一下我們開發(fā)中所用到的技術(shù)和相關(guān)領(lǐng)域的發(fā)展情況。開闊視野是進(jìn)步的一個(gè)必不可少的功課。

          J2EE學(xué)習(xí)者越來(lái)越多,J2EE本身技術(shù)不斷在發(fā)展,涌現(xiàn)出各種概念,本文章試圖從一種容易理解的角度對(duì)這些概念向初學(xué)者進(jìn)行解釋,以便掌握學(xué)習(xí)J2EE學(xué)習(xí)方向。

            首先我們需要知道Java和J2EE是兩個(gè)不同概念,Java不只是指一種語(yǔ)言,已經(jīng)代表與微軟不同的另外一個(gè)巨大陣營(yíng),所以Java有時(shí)是指一種軟件系統(tǒng)的流派,當(dāng)然目前主要是.NET和Java兩大主流體系。

            J2EE可以說(shuō)指Java在數(shù)據(jù)庫(kù)信息系統(tǒng)上實(shí)現(xiàn),數(shù)據(jù)庫(kù)信息系統(tǒng)從早期的dBase、到Delphi/VB等C/S結(jié)構(gòu),發(fā)展到B/S(Browser瀏覽器/Server服務(wù)器)結(jié)構(gòu),而J2EE主要是指B/S結(jié)構(gòu)的實(shí)現(xiàn)。

            J2EE又是一種框架和標(biāo)準(zhǔn),框架類似API、庫(kù)的概念,但是要超出它們。如果需要詳細(xì)了解框架,可先從設(shè)計(jì)模式開始學(xué)習(xí)。

            J2EE是一個(gè)虛的大的概念,J2EE標(biāo)準(zhǔn)主要有三種子技術(shù)標(biāo)準(zhǔn):WEB技術(shù)、EJB技術(shù)和JMS,談到J2EE應(yīng)該說(shuō)最終要落實(shí)到這三個(gè)子概念上。

            這三種技術(shù)的每個(gè)技術(shù)在應(yīng)用時(shí)都涉及兩個(gè)部分:容器部分和應(yīng)用部分,Web容器也是指Jsp/Servlet容器,你如果要開發(fā)一個(gè)Web應(yīng)用,無(wú)論是編譯或運(yùn)行,都必須要有Jsp/Servlet庫(kù)或API支持(除了JDK/J2SE以外)。

            Web技術(shù)中除了Jsp/Servlet技術(shù)外,還需要JavaBeans或Java Class實(shí)現(xiàn)一些功能或者包裝攜帶數(shù)據(jù),所以Web技術(shù)最初裸體簡(jiǎn)稱為Jsp/Servlet+JavaBeans系統(tǒng)。

            談到JavaBeans技術(shù),就涉及到組件構(gòu)件技術(shù)(component),這是Java的核心基礎(chǔ)部分,很多軟件設(shè)計(jì)概念(設(shè)計(jì)模式)都是通過JavaBeans實(shí)現(xiàn)的。

            JavaBeans不屬于J2EE概念范疇中,如果一個(gè)JavaBeans對(duì)象被Web技術(shù)(也就是Jsp/Servlet)調(diào)用,那么JavaBeans就運(yùn)行在J2EE的Web容器中;如果它被EJB調(diào)用,它就運(yùn)行在EJB容器中。

            EJB(企業(yè)JavaBeans)是普通JavaBeans的一種提升和規(guī)范,因?yàn)槠髽I(yè)信息系統(tǒng)開發(fā)中需要一個(gè)可伸縮的性能和事務(wù)、安全機(jī)制,這樣能保證企業(yè)系統(tǒng)平滑發(fā)展,而不是發(fā)展到一種規(guī)模重新更換一套軟件系統(tǒng)。

            至此,JavaBeans組件發(fā)展到EJB后,并不是說(shuō)以前的那種JavaBeans形式就消失了,這就自然形成了兩種JavaBeans技術(shù):EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且這個(gè)JavaBeans不依附某種框架,或者干脆可以說(shuō):這個(gè)JavaBeans是你為這個(gè)應(yīng)用程序單獨(dú)開發(fā)創(chuàng)建的。

            J2EE應(yīng)用系統(tǒng)開發(fā)工具有很多:如JBuilder、Eclipse等,這些IDE首先是Java開發(fā)工具,也就是說(shuō),它們首要基本功能是可以開發(fā)出JavaBeans或Java class,但是如果要開發(fā)出J2EE系統(tǒng),就要落實(shí)到要么是Web技術(shù)或EJB技術(shù),那么就有可能要一些專門模塊功能(如eclipse需要lomboz插件),最重要的是,因?yàn)镴2EE系統(tǒng)區(qū)分為容器和應(yīng)用兩個(gè)部分,所以,在任何開發(fā)工具中開發(fā)J2EE都需要指定J2EE容器。

            J2EE容器分為WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat實(shí)現(xiàn)的。所以你開發(fā)的Web應(yīng)用程序可以在上面兩種容器運(yùn)行,而你開發(fā)的Web+EJB應(yīng)用則只可以在JBoss服務(wù)器上運(yùn)行,商業(yè)產(chǎn)品Websphere/Weblogic等和JBoss屬于同一種性質(zhì)。

            J2EE容器也稱為J2EE服務(wù)器,大部分時(shí)它們概念是一致的。

            如果你的J2EE應(yīng)用系統(tǒng)的數(shù)據(jù)庫(kù)連接是通過JNDI獲得,也就是說(shuō)是從容器中獲得,那么你的J2EE應(yīng)用系統(tǒng)基本與數(shù)據(jù)庫(kù)無(wú)關(guān),如果你在你的J2EE應(yīng)用系統(tǒng)耦合了數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)的配置,那么你的J2EE應(yīng)用系統(tǒng)就有數(shù)據(jù)庫(kù)概念色彩,作為一個(gè)成熟需要推廣的J2EE應(yīng)用系統(tǒng),不推薦和具體數(shù)據(jù)庫(kù)耦合,當(dāng)然這其中如何保證J2EE應(yīng)用系統(tǒng)運(yùn)行性能又是體現(xiàn)你的設(shè)計(jì)水平了。

            衡量J2EE應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)水平高低的標(biāo)準(zhǔn)就是:解耦性;你的應(yīng)用系統(tǒng)各個(gè)功能是否能夠徹底脫離?是否不相互依賴,也只有這樣,才能體現(xiàn)可維護(hù)性、可拓展性的軟件設(shè)計(jì)目標(biāo)。

            為了達(dá)到這個(gè)目的,誕生各種框架概念,J2EE框架標(biāo)準(zhǔn)將一個(gè)系統(tǒng)劃分為WEB和EJB主要部分,當(dāng)然我們有時(shí)不是以這個(gè)具體技術(shù)區(qū)分,而是從設(shè)計(jì)上抽象為表現(xiàn)層、服務(wù)層和持久層,這三個(gè)層次從一個(gè)高度將J2EE分離開來(lái),實(shí)現(xiàn)解耦目的。

            因此,我們實(shí)際編程中,也要將自己的功能向這三個(gè)層次上靠,做到大方向清楚,涇渭分明,但是沒有技術(shù)上約束限制要做到這點(diǎn)是很不容易的,因此我們還是必須借助J2EE具體技術(shù)來(lái)實(shí)現(xiàn),這時(shí),你可以使用EJB規(guī)范實(shí)現(xiàn)服務(wù)層和持久層,Web技術(shù)實(shí)現(xiàn)表現(xiàn)層;

            EJB為什么能將服務(wù)層從Jsp/Servlet手中分離出來(lái),因?yàn)樗鼘?duì)JavaBeans編碼有強(qiáng)制的約束,現(xiàn)在有一種對(duì)JavaBeans弱約束,使用Ioc模式實(shí)現(xiàn)的(當(dāng)然EJB 3.0也采取這種方式),在Ioc模式誕生前,一般都是通過工廠模式來(lái)對(duì)JavaBeans約束,形成一個(gè)服務(wù)層,這也是是Jive這樣開源論壇設(shè)計(jì)原理之一。

            由此,將服務(wù)層從表現(xiàn)層中分離出來(lái)目前有兩種可選架構(gòu)選擇:管理普通JavaBeans(POJO)框架(如Spring、JdonFramework)以及管理EJB的EJB框架,因?yàn)镋JB不只是框架,還是標(biāo)準(zhǔn),而標(biāo)準(zhǔn)可以擴(kuò)展發(fā)展,所以,這兩種區(qū)別將來(lái)是可能模糊,被納入同一個(gè)標(biāo)準(zhǔn)了。 但是,個(gè)人認(rèn)為:標(biāo)準(zhǔn)制定是為某個(gè)目的服務(wù)的,總要犧牲一些換取另外一些,所以,這兩種架構(gòu)會(huì)長(zhǎng)時(shí)間并存。

            這兩種架構(gòu)分歧也曾經(jīng)誕生一個(gè)新名詞:完全POJO的系統(tǒng)也稱為輕量級(jí)系統(tǒng)(lightweight),其實(shí)這個(gè)名詞本身就沒有一個(gè)嚴(yán)格定義,更多是一個(gè)吸引人的招牌,輕量是指容易學(xué)習(xí)容易使用嗎?按照這個(gè)定義,其實(shí)輕量Spring等系統(tǒng)并不容易學(xué)習(xí);而且EJB 3.0(依然叫EJB)以后的系統(tǒng)是否可稱為輕量級(jí)了呢?

            前面談了服務(wù)層框架,使用服務(wù)層框架可以將JavaBeans從Jsp/Servlet中分離出來(lái),而使用表現(xiàn)層框架則可以將Jsp中剩余的JavaBeans完全分離,這部分JavaBeans主要負(fù)責(zé)顯示相關(guān),一般是通過標(biāo)簽庫(kù)(taglib)實(shí)現(xiàn),不同框架有不同自己的標(biāo)簽庫(kù),Struts是應(yīng)用比較廣泛的一種表現(xiàn)層框架。

            這樣,表現(xiàn)層和服務(wù)層的分離是通過兩種框架達(dá)到目的,剩余的就是持久層框架了,通過持久層的框架將數(shù)據(jù)庫(kù)存儲(chǔ)從服務(wù)層中分離出來(lái)是其目的,持久層框架有兩種方向:直接自己編寫JDBC等SQL語(yǔ)句(如iBatis);使用O/R Mapping技術(shù)實(shí)現(xiàn)的Hibernate和JDO技術(shù);當(dāng)然還有EJB中的實(shí)體Bean技術(shù)。

            持久層框架目前呈現(xiàn)百花齊放,各有優(yōu)缺點(diǎn)的現(xiàn)狀,所以正如表現(xiàn)層框架一樣,目前沒有一個(gè)框架被指定為標(biāo)準(zhǔn)框架,當(dāng)然,表現(xiàn)層框架現(xiàn)在又出來(lái)了一個(gè)JSF,它代表的頁(yè)面組件概念是一個(gè)新的發(fā)展方向,但是復(fù)雜的實(shí)現(xiàn)讓人有些忘而卻步。

            在所有這些J2EE技術(shù)中,雖然SUN公司發(fā)揮了很大的作用,不過總體來(lái)說(shuō):網(wǎng)絡(luò)上有這樣一個(gè)評(píng)價(jià):SUN的理論天下無(wú)敵;SUN的產(chǎn)品用起來(lái)撞墻;對(duì)于初學(xué)者,特別是那些試圖通過或已經(jīng)通過SUN認(rèn)證的初學(xué)者,趕快擺脫SUN的陰影,立即開溜,使用開源領(lǐng)域的產(chǎn)品來(lái)實(shí)現(xiàn)自己的應(yīng)用系統(tǒng)。

            最后,你的J2EE應(yīng)用系統(tǒng)如果采取上面提到的表現(xiàn)層、服務(wù)層和持久層的框架實(shí)現(xiàn),基本你也可以在無(wú)需深刻掌握設(shè)計(jì)模式的情況下開發(fā)出一個(gè)高質(zhì)量的應(yīng)用系統(tǒng)了。

            還要注意的是: 開發(fā)出一個(gè)高質(zhì)量的J2EE系統(tǒng)還需要正確的業(yè)務(wù)需求理解,那么域建模提供了一種比較切實(shí)可行的正確理解業(yè)務(wù)需求的方法,相關(guān)詳細(xì)知識(shí)可從UML角度結(jié)合理解。

            當(dāng)然,如果你想設(shè)計(jì)自己的行業(yè)框架,那么第一步從設(shè)計(jì)模式開始吧,因?yàn)樵O(shè)計(jì)模式提供你一個(gè)實(shí)現(xiàn)JavaBeans或類之間解耦參考實(shí)現(xiàn)方法,當(dāng)你學(xué)會(huì)了系統(tǒng)基本單元JavaBean或類之間解耦時(shí),那么系統(tǒng)模塊之間的解耦你就可能掌握,進(jìn)而你就可以實(shí)現(xiàn)行業(yè)框架的提煉了,這又是另外一個(gè)發(fā)展方向了。

            以上理念可以總結(jié)為一句話:
          J2EE開發(fā)三件寶: Domain Model(域建模)、patterns(模式)和framework(框架)。

            推薦一套高質(zhì)量的J2EE開源系統(tǒng): JPestore
            
            如果初學(xué)者沒有理解,歡迎繼續(xù)討論,大膽提出你心中的疑問。

          posted @ 2006-07-20 17:23 黑咖啡 閱讀(217) | 評(píng)論 (0)編輯 收藏
               摘要: 你所需要做的就是:按照你的需求配置Tomcat,只要你正確配置,Tomcat一般都能適合你的要求。下面是一系列關(guān)于Tomcat的配置技巧,這些技巧源自于我的書:《Tomcat權(quán)威指南》,希望對(duì)你有所幫助。 Jason Brittain   1. 配置系統(tǒng)管理(Admin Web Application)  大多數(shù)商業(yè)化的J2EE服務(wù)器都提供一個(gè)功能強(qiáng)大的管理界面,且大都采用易于理解的Web應(yīng)用界面...  閱讀全文
          posted @ 2006-07-20 16:09 黑咖啡 閱讀(275) | 評(píng)論 (0)編輯 收藏

          連續(xù)幾天安裝配置和連接Mysql數(shù)據(jù)庫(kù),今天終于成功了,回想這幾天,
          真的是甜酸苦辣都有,單mysql就重裝了不下10次,而在eclipse上編寫的連接數(shù)據(jù)庫(kù)的程序總是報(bào)錯(cuò).我都已經(jīng)down了oracal準(zhǔn)備放棄mysql了,不過...
          就象電視劇演的那樣,轉(zhuǎn)機(jī)總是在這個(gè)時(shí)候出現(xiàn),先是看到了saulzy關(guān)于mysql4.1.11版本的安裝介紹,接著又找到了一款不錯(cuò)的mysql 界面插件,
          最后在網(wǎng)友的幫助下把mysql的JDBC驅(qū)動(dòng)配好并連通了.一連5天,日子真不好過阿,不過這個(gè)過程中,
          我也覺得自己學(xué)到不少東西,呵呵,反正都撐過來(lái)了,就要繼續(xù)往前走.現(xiàn)在,就這幾天弄的總結(jié)一下,希望對(duì)同是正在學(xué)習(xí)JAVA技術(shù)的同道中人能有幫助.

          我曾寫過一篇叫<<配置Eclpise+tomcat并實(shí)現(xiàn)JSP的編寫與部署>>,現(xiàn)在寫的這些算是它的后續(xù).

          一.??? 軟件下載
          Mysql
          下載版本:4.1.11
          http://dev.mysql.com/downloads/mysql/4.1.html

          JDBC驅(qū)動(dòng)
          下載版本:3.1.8
          http://dev.mysql.com/downloads/connector/j/3.1.html

          Mysql界面插件:mysql-front
          下載版本鏡像:HongKong(我下回來(lái)安裝就是中文版了)
          http://www.mysqlfront.de/download.html

          二.??? 軟件安裝
          1.安裝mysql
          ??? 就如我上面所說(shuō)的,我是參考了saulzy的文章,現(xiàn)在給出saulzy這篇文章的連接:
          http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx
          里面圖文并茂,說(shuō)得非常清楚
          (在這里再一次感謝saulzy)

          2.JDBC驅(qū)動(dòng):mysql-connector-java-3.1.8
          這只是一個(gè)壓縮包,并不需要安裝,只要將其解壓,我么使用的是文件夾mysql-connector-java-3.1.8里的文件:mysql-connector-java-3.1.8-bin.jar.

          3. Mysql界面插件:mysql-front
          這是一個(gè)安裝程序,按照提示安裝就可以了.

          三.??? 環(huán)境配置
           首先,我要說(shuō)明的是我現(xiàn)在
          tomcat的安裝路徑是: D:\Program Files\Java\Tomcat
          ? JDK的安裝路徑是:D:\Program Files\Java\j2sdk

          在這里,需要配置環(huán)境變量的是JDBC驅(qū)動(dòng).在配置前先要把剛才說(shuō)到的mysql-connector-java-3.1.8-bin.jar本地硬盤某處(我放的地方:D:\Program Files\Java\mysqlforjdbc),然后根據(jù)你放的地方,配置classpath,我的配置是這樣的:
          .;D:\Program files\Java\j2sdk\lib\tools.jar;D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar
          配置這個(gè)的目的是讓你的java應(yīng)用程序找到連接mysql的驅(qū)動(dòng).

          配置完環(huán)境變量后還有很重要一步就是為JSP連接數(shù)據(jù)庫(kù)配置驅(qū)動(dòng),這個(gè)其實(shí)很簡(jiǎn)單,就是把mysql-connector-java-3.1.8-bin.jar拷到某些文件夾里就行了,我在網(wǎng)上看了很多資料問了很多人,各種說(shuō)法都有,我綜合了一下,為了保險(xiǎn),我都全做了,呵呵,反正就是拷一個(gè)400K的文件而已,現(xiàn)列出要把mysql-connector-java-3.1.8-bin.jar拷進(jìn)去的文件夾,如下:
          D:\Program Files\Java\Tomcat\common\lib
          D:\Program Files\Java\Tomcat\shared\lib

          四.??? 數(shù)據(jù)庫(kù)的使用

          Mysql安裝完畢以后,還有一些要注意的地方,這里saulzy也寫了篇文章,大家看看就清楚了,連接如下:http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx
          就象在saulzy的文章力提到的,mysql安裝好后最重要一樣就是要看數(shù)據(jù)庫(kù)有沒有作為系統(tǒng)服務(wù)啟動(dòng)了,所以在大家進(jìn)行數(shù)據(jù)庫(kù)操作前,應(yīng)要看看,在操作系統(tǒng)的
          開始->運(yùn)行->輸入services.msc,確定你在安裝時(shí)你設(shè)置的關(guān)于mysql的那個(gè)服務(wù)已經(jīng)啟動(dòng),這樣你在操作數(shù)據(jù)庫(kù)時(shí)不會(huì)報(bào)連接不上的錯(cuò)誤.
          上面提到了一個(gè)較方便的mysql界面插件,但是這個(gè)界面是我在已經(jīng)開始使用mysql后才找到的,剛開始我是在dos下用命令行進(jìn)行操作的.雖然那個(gè)界面也可以進(jìn)行建庫(kù)啊,設(shè)定權(quán)限等操作,但是,我覺得懂得在使用命令行也是一個(gè)很重要的技能,所以我先從命令行開始說(shuō),怎樣簡(jiǎn)單使用mysql.到后面會(huì)談及mysql-front的使用.

          現(xiàn)在我想在mysql里建一個(gè)數(shù)據(jù)庫(kù)shujuku,以及在數(shù)據(jù)庫(kù)里建一個(gè)表biao.具體的命令如下(假設(shè)mysql我是剛安裝好的)

          ?

          ?


          1.??? 進(jìn)入dos狀態(tài)(記住命令行的要運(yùn)行在mysql的安裝目錄下的bin目錄的)如下圖一:
          ?
          2.??? 連接mysql
          輸入:mysql ?h localhost ?u root ?p
          出現(xiàn)要求輸入密碼的界面(如圖二)
          ?

          ?


          輸入在安裝時(shí)已設(shè)好的密碼,就近入了mysql的命令編輯界面了,如圖三:
          ?
          3.??? 使用mysql的基本命令(在mysql命令行編輯每輸入完命令后最后一定要有分號(hào),不然會(huì)報(bào)錯(cuò))
          顯示數(shù)據(jù)庫(kù):show databases;
          使用數(shù)據(jù)庫(kù):use 數(shù)據(jù)庫(kù)名;
          例子如圖四:
          ?


          4.建庫(kù)
          命令:create database shujuku;
          5.為數(shù)據(jù)庫(kù)設(shè)置權(quán)限(用戶和密碼)
          命令:grant all privileges on shujuku.* to test@localhost identified by? “123456”;
          當(dāng)你執(zhí)行完這個(gè)命令以后,只要你再以用戶名:test,密碼:123456登錄時(shí)你就只可以對(duì)shujuku這個(gè)數(shù)據(jù)庫(kù)操作,這樣避開使用root,對(duì)數(shù)據(jù)庫(kù)的安全有很大幫助.如圖五
          ?

          6.建表
          命令:create table biao(id int(8) primary key,name varchar(10));
          如圖六

          剩下來(lái)的與標(biāo)準(zhǔn)sqsl命令基本上是一樣的,具體操作略
          值得一提的是,你在命令行上輸入"?",就會(huì)有mysql命令的簡(jiǎn)單幫助,如圖八:
          ?

          呵呵,那樣,我們還可以知道退出,就是"exit",呵呵!

          五.??? 關(guān)于mysql-front的使用
          我找了好幾個(gè)mysql的界面工具,覺得最簡(jiǎn)潔方便還是mysql-front,可惜的是要收費(fèi),不過還好有試用期,呵呵,可以先感受感受一下,最重要一點(diǎn)是mysql-front有簡(jiǎn)體中文版的,英文不好的我用起來(lái)就舒服多了.下面簡(jiǎn)單說(shuō)說(shuō)使用吧.
          首先,安裝就不用說(shuō)了,有向?qū)В液芎?jiǎn)單.安裝好后第一次運(yùn)行時(shí)會(huì)跳出來(lái)一個(gè)要求添加對(duì)話的框,在這里你可以添加例如上面已經(jīng)設(shè)定好的shujuku,過程如圖九,十,十一:
          ?

          ?

          ?

          當(dāng)你在注冊(cè)的復(fù)選框里填上你在上面mysql設(shè)定好的用戶名和密碼后,在選擇數(shù)據(jù)庫(kù)框里就有shujuku 的數(shù)據(jù)庫(kù)了,選上,按確定.進(jìn)入mysql-fron后,你就會(huì)看到下面的界面,這是你就可以進(jìn)行操作了.如圖十二
          ?
          ?
          要說(shuō)明的是,你還可以把root用戶也加進(jìn)去,這要你在mysql-fron的界面上選
          設(shè)置->對(duì)話->新建,再按上面進(jìn)行就可以,出了root你還可以加入更多的用戶,方法還是一樣的,設(shè)置不同的用戶,是方便對(duì)不同數(shù)據(jù)庫(kù)進(jìn)行管理,呵呵,root是權(quán)限最高的,可不要隨便讓別人使用你的root用戶,保正你數(shù)據(jù)庫(kù)的安全.

          六.??? JSP連接mysql
          現(xiàn)在就是嘗試用jsp連接mysql了
          我在eclipse里建了個(gè)test_mysql.jsp頁(yè)面,代碼如下:

          <%@ page contentType="text/html; charset=gb2312" %>
          <%@ page language="java" %>
          <%@ page import="com.mysql.jdbc.Driver" %>
          <%@ page import="java.sql.*" %>
          <%
          ? //驅(qū)動(dòng)程序名
          ? String driverName="com.mysql.jdbc.Driver";
          ? //數(shù)據(jù)庫(kù)用戶名
          ? String userName="cl41";
          ? //密碼
          ? String userPasswd="123456";
          ? //數(shù)據(jù)庫(kù)名
          ? String dbName="db";
          ? //表名
          ? String tableName="dbtest";
          ? //聯(lián)結(jié)字符串
          ? String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
          ? Class.forName("com.mysql.jdbc.Driver").newInstance();
          ? Connection connection=DriverManager.getConnection(url);
          ? Statement statement = connection.createStatement();
          ? String sql="SELECT * FROM "+tableName;
          ? ResultSet rs = statement.executeQuery(sql);
          ? //獲得數(shù)據(jù)結(jié)果集合
          ?? ResultSetMetaData rmeta = rs.getMetaData();
          ? //確定數(shù)據(jù)集的列數(shù),亦字段數(shù)
          ?? int numColumns=rmeta.getColumnCount();
          ? // 輸出每一個(gè)數(shù)據(jù)值
          ?out.print("id");
          ?out.print("|");
          ?out.print("num");
          ?out.print("<br>");
          while(rs.next()) {
          out.print(rs.getString(1)+" ");??
          out.print("|");
          out.print(rs.getString(2));
          out.print("<br>");?
          }??
          out.print("<br>");
          out.print("數(shù)據(jù)庫(kù)操作成功,恭喜你");
          rs.close();??
          statement.close();??
          connection.close();??
          %>??

          然后把test?_mysql.jsp部署到tomcat處,如何部署可參考我的另一篇文章<<配置Eclpise+tomcat并實(shí)現(xiàn)JSP的編寫與部署>>

          在瀏覽器,你就可以看到如圖十三的:
          ?

          呵呵,文章終于寫完了,原來(lái)寫篇簡(jiǎn)潔清晰,圖文并茂的文章真的不容易.還是那句話,希望對(duì)度這篇文章的你有幫助吧!Good luck!
          由于這里不能貼圖片,我把我文章里面的圖片都打包了,在附件處!
          (如有轉(zhuǎn)載,請(qǐng)注明原作者是cl41,謝謝合作!)

          ?

          posted @ 2006-07-20 14:55 黑咖啡 閱讀(274) | 評(píng)論 (0)編輯 收藏
               摘要: 有很多朋友雖然安裝好了 mysql 但卻不知如何使用它。在這篇文章中我們就從連接 mysql 、 修改密碼、增加用戶等方面來(lái)學(xué)習(xí)一些 mysql 的常用命令。 ...  閱讀全文
          posted @ 2006-07-20 14:02 黑咖啡 閱讀(425) | 評(píng)論 (0)編輯 收藏

          Java中關(guān)于時(shí)間的操作主要是:
          1、獲取當(dāng)前時(shí)間,和某個(gè)時(shí)間進(jìn)行比較。此時(shí)主要拿long型的時(shí)間值。
          ?方法如下:

          要使用
          java.util.Date 。獲取當(dāng)前時(shí)間的代碼如下

          Date date = new Date();

          date.getTime() ;

          還有一種方式,使用 System.currentTimeMillis() ;
          都是得到一個(gè)當(dāng)前的時(shí)間的long型的時(shí)間的毫秒值,這個(gè)值實(shí)際上是當(dāng)前時(shí)間值與1970年一月一號(hào)零時(shí)零分零秒相差的毫秒數(shù)

          2、獲取某種格式的日期。
          方法:

          獲取時(shí)間的格式,需要用到一個(gè)專門用于時(shí)間格式的類 java.text.SimpleDateFormat

          首先,定義一個(gè) SimpleDateFormat 變量

          SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);

          這個(gè)構(gòu)造函數(shù)的定義如下:

          SimpleDateFormat(String ? pattern, Locale ? locale)

          第一個(gè)參數(shù) pattern ,我們后面再解釋,這里我們使用一個(gè) "", 第二個(gè)參數(shù),是用來(lái)設(shè)置時(shí)區(qū)的,這里用到了 java.util.Locale 這個(gè)類,這個(gè)類了面定義了很多靜態(tài)變量,直接拿過來(lái)用就 OK ,我們把時(shí)區(qū)設(shè)置為 Locale.SIMPLIFIED_CHINESE ,只看名字,這個(gè)靜態(tài)變量的意義已經(jīng)很清楚了。

          ?

          接下來(lái)我們使用這個(gè) SimpleDateFormat 把當(dāng)前時(shí)間格式化為一個(gè)如下格式的時(shí)間字符串“ XXXX XX XX _XX 時(shí) XX XX 秒”,代碼:

          sdf.applyPattern("yyyy年MM月dd日_HH時(shí)mm分ss秒");

          String timeStr = sdf.format(new Date());

          ?

          獲取時(shí)間格式的函數(shù)是 format ,這個(gè)函數(shù)的參數(shù)是 java.util.Date 對(duì)象,這個(gè)沒有什么花頭。

          要說(shuō)明一下的是這個(gè) pattern ,所謂的模式。這里, yyyy,MM,dd 等,這就是模式。

          我們可以在 SimpleDateFormat 的構(gòu)造函數(shù)中指定模式,比如

          SimpleDateFormat sdf = new SimpleDateFormat(" yyyy-MM-dd ",Locale.SIMPLIFIED_CHINESE);

          也可以獲取時(shí)間格式的時(shí)候使用applyPattern函數(shù)臨時(shí)指定,上面的例子就是這樣。

          什么字符代表什么,這是 j2se 約定好的,設(shè)置模式的時(shí)候,我們可以使用約定好的字符加上任何我們想要的字符串。

          j2se 對(duì)字符所代表的模式的約定列表如下:

          ?

          ?

          Letter Date or Time Component Presentation
          G Era designator Text
          y Year Year
          M Month in year Month
          w Week in year Number
          W Week in month Number
          D Day in year Number
          d Day in month Number
          F Day of week in month Number
          E Day in week Text
          a Am/pm marker Text?
          H Hour in day (0-23) Number
          k Hour in day (1-24) Number
          K Hour in am/pm (0-11)? Number
          h?? Hour in am/pm (1-12)? Number
          m?? Minute in hour? Number
          s?? Second in minute? Number
          S?? Millisecond? Number??
          z?? Time zone?? General time zone?
          Z?? Time zone? RFC 822 time zone?

          posted @ 2006-07-18 13:53 黑咖啡 閱讀(18877) | 評(píng)論 (1)編輯 收藏
          SAP R/3 是一個(gè)基于客戶/服務(wù)機(jī)結(jié)構(gòu)和開放系統(tǒng)的、集成的企業(yè)資源計(jì)劃系統(tǒng)。其功能覆蓋企業(yè)的財(cái)務(wù)、后勤(工程設(shè)計(jì)、采購(gòu)、庫(kù)存、生產(chǎn)銷售和質(zhì)量等)和人力資源管理、SAP業(yè)務(wù)工作流系統(tǒng)以及因特網(wǎng)應(yīng)用鏈接功能等各個(gè)方面。

          R/3
          應(yīng)用軟體采模組化結(jié)構(gòu)。它們既可以單獨(dú)使用,也可以和其它解決方案相結(jié)合。從流程導(dǎo)向的角度而言,各應(yīng)用軟體間的整合程度越高,它們帶來(lái)的好處就越多。

          FI 財(cái)務(wù)會(huì)計(jì) 集中公司有關(guān)會(huì)計(jì)的所有資料,提供完整的文獻(xiàn)和全面的資訊,同時(shí)作為企業(yè)實(shí)行控制和規(guī)劃的最新基礎(chǔ)。

          TR 財(cái)務(wù)管理 是一個(gè)高效率財(cái)務(wù)管理完整解決方案,確保公司在世界范圍的周轉(zhuǎn),對(duì)財(cái)務(wù)資產(chǎn)結(jié)構(gòu)實(shí)行盈利化組合,并限制風(fēng)險(xiǎn)。

          CO 管理會(huì)計(jì) 是公司管理系統(tǒng)中規(guī)劃與控制工具的完整體系,具有統(tǒng)一的報(bào)表系統(tǒng),協(xié)調(diào)公司內(nèi)部處理業(yè)務(wù)的內(nèi)容和過程。

          EC 企業(yè)控制 根據(jù)特制的管理資訊,連續(xù)監(jiān)控公司的成功因素和業(yè)績(jī)指標(biāo)。

          IM投資管理 提供投資手段和專案,從規(guī)劃到結(jié)算的綜合性管理和處理,包括投資前分析和折舊模擬。

          PP 生產(chǎn)計(jì)劃 提供各種制造類型的全面處理:從重覆性生產(chǎn)、訂制生產(chǎn)、訂裝生產(chǎn),加工制造、批量及訂存生產(chǎn)直至過程生產(chǎn),具有擴(kuò)展MPRⅡ的功能。另外還可以選擇連接PDC、制程控制系統(tǒng),CADPDM

          MM 物料管理 以工作流程為導(dǎo)向的處理功能對(duì)所有采購(gòu)處理最佳化,可自動(dòng)評(píng)估供應(yīng)商,透過精確的庫(kù)存和倉(cāng)儲(chǔ)管理降低采購(gòu)和倉(cāng)儲(chǔ)成本,并與發(fā)票核查相整合。

          PM 工廠維護(hù) 提供對(duì)定期維護(hù)、檢查、耗損維護(hù)與服務(wù)管理的規(guī)劃、控制和處理,以確保各操作性系統(tǒng)的可用性。

          QM 品質(zhì)管理 監(jiān)控、輸入和管理整個(gè)供應(yīng)鏈與品質(zhì)保證相關(guān)的各類處理、協(xié)調(diào)檢查處理、啟動(dòng)校正措施、以及與實(shí)驗(yàn)室資訊系統(tǒng)整合。

          PS 專案管理 協(xié)調(diào)和控制專案的各個(gè)階段,直接與采購(gòu)及控制合作,從報(bào)價(jià)、設(shè)計(jì)到批準(zhǔn)以及資源管理與結(jié)算。

          SD 銷售與分銷 積極支援銷售和分銷活動(dòng),具有出色的定價(jià)、訂單快速處理、按時(shí)交貨,交互式多層次可變配置功能,并直接與盈利分析和生產(chǎn)計(jì)劃模組連接。

          HR 人力資源管理 采用涵蓋所有人員管理任務(wù)和幫助簡(jiǎn)化與加速處理的整合式應(yīng)用程式,為公司提供人力資源規(guī)劃和管理解決方案。

          開放式資訊倉(cāng)儲(chǔ) 包括智能資訊系統(tǒng),該系統(tǒng)把來(lái)自R/3應(yīng)用程式和外部來(lái)源的數(shù)據(jù)歸納成為主管人員資訊,不僅支援使用者部門決策和控制,同時(shí)也支援對(duì)成功具有關(guān)鍵作用的高階控制和監(jiān)控。

          R/3-定制化策略資訊管理

          保持競(jìng)爭(zhēng)領(lǐng)先地位端賴于公司建立有效并盡可能以客戶為導(dǎo)向的企業(yè)流程結(jié)構(gòu)的能力。這就需要具備可最有效支援今后企業(yè)流程的資訊處理系統(tǒng)。

          R/3系統(tǒng)并非只是軟件,它是一種策略性解決方案。

          R/3系統(tǒng)-企業(yè)流程的思維與行動(dòng)。

          公司必須運(yùn)用動(dòng)態(tài)戰(zhàn)略對(duì)瞬息萬(wàn)變的挑戰(zhàn)作出反應(yīng)。迅速適應(yīng)客戶新需求和市場(chǎng)新商機(jī)的能力,是贏得競(jìng)爭(zhēng)勝利的決定性因素。此種適應(yīng)力需要一個(gè)功能強(qiáng)大、開放式的基礎(chǔ)結(jié)構(gòu),它可針對(duì)目前的企業(yè)流程提供最佳化支援,并能靈活適應(yīng)變化與發(fā)展。R/3系統(tǒng)就是應(yīng)付這些挑戰(zhàn)的最佳解答,它是主從式架構(gòu)上最普遍的標(biāo)準(zhǔn)商業(yè)應(yīng)用軟件。

          SAP R/3系統(tǒng)具備以下功能和主要特點(diǎn):

          功能性:R/3以模塊化的形式提供了一整套業(yè)務(wù)措施,其中的模塊囊括了全部所需要的業(yè)務(wù)功能并把用戶與技術(shù)性應(yīng)用軟件相聯(lián)而形成一個(gè)總括的系統(tǒng),用于公司或企業(yè)戰(zhàn)略上和運(yùn)用上的管理。

          集成化: R/3把邏輯上聯(lián)的部分連接在一起。重復(fù)工作和多余數(shù)據(jù)被完全取消,規(guī)程被優(yōu)化,集成化的業(yè)務(wù)處理取代了傳統(tǒng)的人工操作。

          靈活性:R/3系統(tǒng)中方便的裁剪方法使之具有靈活的適應(yīng)性,從而能滿足各種用戶的需要和特定行業(yè)的要求。R/3還配備有適當(dāng)?shù)慕缑鎭?lái)集成用戶自己的軟件或外來(lái)的軟件。

          開放性:R/3的體系結(jié)構(gòu)符合國(guó)際公認(rèn)的標(biāo)準(zhǔn),使客戶得以突破專用硬件平臺(tái)及專用系統(tǒng)技術(shù)的局限。同時(shí),SAP提供的開放性接口,可以方便地將第三方軟件產(chǎn)品有效地集成到R/3系統(tǒng)中來(lái)。

          用戶友好:圖標(biāo)與圖形符號(hào)簡(jiǎn)化了人機(jī)交互時(shí)的操作。統(tǒng)一設(shè)計(jì)的用戶界面確保了工作人員能夠運(yùn)用同樣的熟悉的技術(shù)從事不通的工作。

          模塊化:R/3的模塊結(jié)構(gòu)使用戶既可以一個(gè)一個(gè)的選用新的實(shí)用程序,也可以完全轉(zhuǎn)入一個(gè)新的組織結(jié)構(gòu)體系。

          可靠:作為用戶的商業(yè)伙伴SAP始終不斷地為集成化軟件的質(zhì)量設(shè)立越來(lái)越多的國(guó)際標(biāo)準(zhǔn)。

          低成本高效益:信息處理是取得競(jìng)爭(zhēng)優(yōu)勢(shì)的要點(diǎn)之一。當(dāng)競(jìng)爭(zhēng)加劇時(shí),企業(yè)必須更加努力地獲取其市場(chǎng)占有量。這就要使用高度集成化的數(shù)據(jù)處理軟件,而R/3正是這種軟件的優(yōu)秀典范。

          國(guó)際適用:R/3支持多種語(yǔ)言,而且是為跨國(guó)界操作而設(shè)計(jì)的。R/3可以靈活地適應(yīng)各國(guó)的貨幣及稅物要求。

          服務(wù):R/3系統(tǒng)實(shí)施過程中,用戶將得到SAP技術(shù)專家的全面支持與服務(wù),包括組織結(jié)構(gòu)方面與技術(shù)方面的咨詢,項(xiàng)目計(jì)劃與實(shí)施方面的協(xié)助,以及培訓(xùn)課程。
          posted @ 2006-07-10 19:02 黑咖啡 閱讀(452) | 評(píng)論 (0)編輯 收藏
          據(jù)美國(guó)哥倫比亞大學(xué)心理學(xué)教授STANLEY COREN結(jié)合208位各地馴狗專家,63名小型動(dòng)物獸醫(yī)師,及14名研究警戒犬與護(hù)衛(wèi)狗的專家對(duì)各著名犬種進(jìn)行深入訪談?dòng)^察,并在Vancouver Dog Obedience Club提供的大量相當(dāng)有價(jià)值的資料下,填寫了一份非常復(fù)雜龐大的問卷,對(duì)犬只的工作服從性和智商進(jìn)行了排名,現(xiàn)排行名次公布如下:

          1.邊境牧羊犬
          2.貴賓犬
          3.德國(guó)牧羊犬
          4.金毛獵犬
          5.杜賓犬
          6.喜樂蒂犬(謝德蘭牧羊犬)
          7.拉布拉多獵犬
          8.蝴蝶犬
          9.洛威拿
          10.澳洲牧牛犬
          排名1-10的狗,大部分聽到新指令5次,就會(huì)了解其涵義并輕易記住,主人下達(dá)時(shí),它們遵守的幾率高于95%,此外,即使主人位于遠(yuǎn)處,它們也會(huì)在聽到指令后幾秒種內(nèi)就有反應(yīng)。即使訓(xùn)練它們的人經(jīng)驗(yàn)不足,它們也可以學(xué)習(xí)得很好。
          11.威爾斯科基犬
          12. 迷你型雪納瑞
          13.英國(guó)跳獵犬
          14.比利時(shí)特弗倫犬
          15.史其派克犬/比利史牧羊犬
          16.蘇格蘭牧羊犬
          17.德國(guó)短毛指示犬
          18.英國(guó)可卡/標(biāo)準(zhǔn)型雪納瑞
          19.布列塔尼獵犬
          20.美國(guó)可卡
          21.威瑪獵犬
          22.伯恩山犬
          23.松鼠犬
          24.愛爾蘭水獵犬
          25.維茲拉犬
          26.卡狄肯威爾斯科基犬

          排名11-26的狗,似乎要學(xué)習(xí)5-15次才能學(xué)會(huì)簡(jiǎn)單指令,它們遵守第一次指令的幾率是85%,對(duì)于稍微復(fù)雜的指令有時(shí)候反應(yīng)會(huì)稍微遲緩一些,但只要勤加練習(xí)就能消除這種延緩狀況。當(dāng)主人離它們較遠(yuǎn)時(shí),它們的反應(yīng)有可能也稍微遲緩一些,不過,即使訓(xùn)練人員經(jīng)驗(yàn)稍微不足,還是有辦法將這些狗調(diào)教得很優(yōu)秀。

          27.切薩皮克灣拾列犬/波利犬/約克夏埂
          28.巨型雪納瑞
          29.萬(wàn)能埂
          30.伯瑞犬
          31.威爾斯跳獵犬
          32.曼徹斯特埂
          33.薩莫耶犬
          34.紐芬蘭狗/澳洲埂/美國(guó)斯塔福郡埂/戈登蹲獵犬/長(zhǎng)須牧羊犬
          35.凱恩埂/凱利藍(lán)埂/愛爾蘭埂
          36.挪威獵糜犬
          37.猴面埂/絲毛埂/迷你品犬/法老王獵犬/克倫伯長(zhǎng)毛垂耳獵犬
          38.洛威埂
          39.斑點(diǎn)狗
          排名27-39是屬于中上程度的狗,重復(fù)了15次指令后才會(huì)表現(xiàn)出似懂非懂的反應(yīng),需要很多額外練習(xí),尤其在初級(jí)階段。它們對(duì)第一次指令作出的回應(yīng)幾率是90%,表現(xiàn)的優(yōu)劣取決于練習(xí)時(shí)間的多寡。整體來(lái)說(shuō),表現(xiàn)與排名較前的狗一樣好,只是動(dòng)作沒那么平順連貫,而且反應(yīng)時(shí)間也稍微慢半拍,如果主人站得稍遠(yuǎn),它們可能不會(huì)回應(yīng)主人的指令,如果訓(xùn)練者缺乏經(jīng)驗(yàn),或過于嚴(yán)厲或沒耐心,這些狗的表現(xiàn)就會(huì)很差。

          40.貝林頓埂
          41.愛爾蘭獵狼犬
          42.庫(kù)瓦茲犬
          43.薩路基獵犬
          44.騎士查里王獵犬/德國(guó)剛毛指示犬
          45.西伯利亞雪撬犬/比熊犬
          46.藏獒/靈堤/英國(guó)獵狐犬/美國(guó)獵狐犬/格里芬犬
          47.西高地白埂
          48.拳師狗/大丹狗
          49.臘腸狗
          50.阿拉斯加雪撬犬
          51.沙皮狗
          52.羅德西亞背脊犬
          53.愛爾蘭埂
          54.波斯頓埂/秋田狗


          排名40-54的狗是智商與服從中等程度的狗,在學(xué)習(xí)過程中,會(huì)在。練習(xí)15-20次之后才對(duì)任務(wù)基本了解,若想得到令人滿意的表現(xiàn),可能需要25-40次的練習(xí),如果沒有練習(xí),可能會(huì)忘記曾經(jīng)學(xué)過的動(dòng)作。它們回應(yīng)第一次指令的幾率是50%,但先決條件是必須先重復(fù)訓(xùn)練。如果主人站得很近,它們的表現(xiàn)回較好,如果與主人距離增加一樣好,但經(jīng)驗(yàn)不足的人,或缺乏耐心者,可能拿這些狗沒辦法
          55.斯凱埂
          56.西里罕埂
          57.巴哥犬
          58.法國(guó)斗牛犬
          59.馬爾濟(jì)斯犬
          60.意大利靈堤
          61.中國(guó)冠毛犬
          62.丹地丁蒙埂/西藏埂
          63.英國(guó)老式牧羊犬
          64.比利牛斯山犬
          65.蘇格蘭埂/圣伯納犬
          66.牛頭埂
          67.吉娃娃
          68.拉薩犬
          69.斗牛獒犬

          排名55-69的狗,要使指令達(dá)到完美表現(xiàn),可能需要40-80次的練習(xí)。即使經(jīng)過這么多練習(xí),還是無(wú)法成為永久習(xí)慣,如果練習(xí)中斷了一陣子,它們表現(xiàn)出來(lái)的就像是從來(lái)沒有學(xué)過這些動(dòng)作,經(jīng)過練習(xí)后,狗的回應(yīng)第一次指令的幾率是30%。大部分時(shí)候,這些狗都很容易分心,而且只在它覺得高興的時(shí)候才會(huì)執(zhí)行主人的指令,如果主人站得離狗稍遠(yuǎn),就必須花很多時(shí)間對(duì)它們大叫,因?yàn)樗鼈兒芸赡芟鄳?yīng)不理。通常這些狗被評(píng)價(jià)為“獨(dú)立,冷漠”等等。有經(jīng)驗(yàn)的馴狗者,只要肯花很多時(shí)間,對(duì)狗投注堅(jiān)定而慈祥的關(guān)注,就可以使這些狗對(duì)指令產(chǎn)生立即反應(yīng),不過它們的表現(xiàn)充其量也只不過是差強(qiáng)人意而已。
          70.西施犬
          71.巴吉度獵犬
          72.獒犬/比高犬
          73.北京犬
          74.血堤
          75.蘇俄牧羊犬
          76.松獅犬
          77.老虎狗
          78.見生吉犬
          79.阿富汗獵犬

          排名70-79的狗,要讓它們記住指令,通常要練習(xí)上百次學(xué)會(huì)后必須多加練習(xí),否則它們會(huì)忘得像沒學(xué)過這個(gè)動(dòng)作一樣,即使習(xí)慣養(yǎng)成了,它們還是沒辦法每次都回應(yīng)主人的指令,第一次回應(yīng)的幾率是25%,有時(shí)候它們會(huì)把頭偏離主人,像是故意不理會(huì)主人,或是故意挑戰(zhàn)主人的權(quán)威。當(dāng)它們回應(yīng)指令時(shí),行動(dòng)通常緩慢不確定,或心不甘情不愿。有些狗必須戴上項(xiàng)圈才聽話,一脫下項(xiàng)圈就無(wú)法無(wú)天了。普通訓(xùn)練人員可能控制不了這些狗的表現(xiàn)。
          posted @ 2006-07-10 10:55 黑咖啡 閱讀(243) | 評(píng)論 (0)編輯 收藏
          完全oop的語(yǔ)言(ruby,smalltalk,...)中,smalltalk暫時(shí)是最優(yōu)雅的了,看了它之后,才明白C#/vb/java的語(yǔ)法確實(shí)不能帶來(lái)太多的效率。看看java和smalltalk的語(yǔ)言對(duì)比,就知道java可能采用了smalltalk的思想+c的外觀了:
          http://www.chimu.com/publications/J...talkSyntax.html
          它很small,而且像talk一樣接近人的語(yǔ)言。



          ---------------------以下是轉(zhuǎn)載:
          smalltalk
          可是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言的鼻祖阿,并且正在蓬勃的發(fā)展,沒有過時(shí)。它是純面向?qū)ο蟮恼Z(yǔ)言,就連整數(shù)也是對(duì)象。開放環(huán)境也非常集成,如果感興趣可以到一下網(wǎng)站下載,絕對(duì)有耳目一新的感覺。舉個(gè)例子,

          循環(huán)語(yǔ)句在smalltalk中是向一個(gè)整數(shù)對(duì)象發(fā)送消息:

          10 timesRepeat: [ teresa moveRight: 10 ].

          其中timesRepeat:為消息名稱,10為接受消息的整數(shù)對(duì)象,
          [ teresa moveRight: 10 ].是消息的參數(shù),


          這又是smalltalk強(qiáng)大的地方,它可以把一段程序作為參數(shù)傳遞給某個(gè)對(duì)象!!!
          Squeak Smalltalk
          http://www.squeak.org/ 這是一個(gè)非常有趣的smalltalk版本,看上去就像在你的電腦上模擬了另外一套完成的窗口系統(tǒng),這里面的窗口更加利害,你甚至可以旋轉(zhuǎn)它,不看不知道,看了才發(fā)現(xiàn)還有這么奇妙的語(yǔ)言,這么奇妙的開發(fā)環(huán)境。10M左右

          Cincom Smalltalk
          http://www.cincom.com/scripts/smalltalk.dll/home.ssp 這個(gè)版本比較實(shí)用,有詳細(xì)的幫助,可以開發(fā)真正的windows程序。30M左右

          Dolphin Smalltalk
          http://www.object-arts.com/ 這里提供的免費(fèi)smalltalk版本只有3M不到,如果你想先嘗試一下這種語(yǔ)言的話,可以下載這個(gè)。

          這是一個(gè)支持unicode的smalltalk版本:
          http://www.objectconnect.com/
          可以下載 限時(shí)版
          posted @ 2006-07-06 16:28 黑咖啡 閱讀(1010) | 評(píng)論 (0)編輯 收藏
          C#會(huì)前途黯淡,只因大胡子惹的禍?!有點(diǎn)聳人聽聞吧。可是色列軟件工程師 Tamir Khason自有一套理論(也許他曾學(xué)過中國(guó)的面相術(shù))得出這樣的結(jié)論。不信,咱就瞧瞧他發(fā)在自己Blog上的一篇文章,看看他有什么樣的奇思妙想。


          Fortran.jpg?
          John Backus,F(xiàn)ortran之父

          Prolog.jpg?
          Alain Colmerauer, Prolog之父

          ada.jpg?
          Jean Ichbiah, Ada之父

            以上三人分別發(fā)明了Fortran、 Prolog和 Ada語(yǔ)言。這些語(yǔ)言都有著過人的優(yōu)點(diǎn),每一種在當(dāng)時(shí)都可以稱得上是創(chuàng)意不凡。很可惜,三個(gè)當(dāng)中沒有一個(gè)廣泛流傳。與之相對(duì),下面的Brain Kernighan、Dennis Ritchie和Ken Thompson所“炮制” 出的C和Unix,已經(jīng)使用了三十年了,也許再用100年也沒問題!

          C_BK.jpg?
          C語(yǔ)言宗師Brain Kernighan

          C_KT_DR.jpg?
          UNIX/C創(chuàng)造者Ken Thompson 和 Dennis Ritchie

            Round 2

            以下兩位分別是Alan Kay和Kristen Nygaard。是他們發(fā)明了第一批面向?qū)ο笳Z(yǔ)言 Smalltalk和Simula 67。不過,這些語(yǔ)言都行之不遠(yuǎn)。

          smalltalk.gif?
          Smalltalk之父Alan Kay

          simula.png?
          Simula 67之父Kristen Nygaard

            Brad Cox,曾嘗試把OO加入到C中,于是Objective-C誕生。然而,Objective-C 也是命運(yùn)不濟(jì),目前只有在Mac操作系統(tǒng)中還能看到它的蹤影。 與之相對(duì),另一位所做的相同嘗試卻大紅大紫,這就是Bjarne Stroustrup所寫的C++。其實(shí),看看 Stroustrup的臉就不難明白為什么這兩種語(yǔ)言的命運(yùn)會(huì)如此不同。

          objective-c.gif?
          Objective-C之父Brad Cox

          c++.jpg?
          C++之父Bjarne Stroustrup

            到這里,你能猜出點(diǎn)規(guī)律來(lái)嗎?

            答案揭曉:有大胡子——有旺運(yùn);沒胡子——只有干瞪眼!

            由此,看看下面兩位的胡子,C#和Java究竟鹿死誰(shuí)手,不就是不言自明的嗎?

          csharp.jpg?
          C#之父Anders Hejlsberg

          java.jpg?
          Java之父James Gosling

            Round 3

            當(dāng)然,你也可以不信。不過,還有一個(gè)例證可以很好地說(shuō)明。下面兩位分別是Basic的作者Thomas Kurtz 與Perl的作者Larri Wall。兩人雖然沒有令人咋舌的大胡子,但兩撇小胡子倒也濃密有致。自然,這兩種語(yǔ)言紅得發(fā)紫。

          basic.gif?
          Thomas Kurtz, Basic之父

          perl.jpg?
          Larry Wall, Perl之父

            但是同為動(dòng)態(tài)語(yǔ)言,Python和Ruby的作者Guido van Rossum和松本行弘都沒有胡子,哪怕是兩撇小胡子,所以盡管它們都比Perl語(yǔ)言好,但都沒有Perl使用廣泛。不過,凡事都有轉(zhuǎn)機(jī)。Rossum看樣子極有希望很快長(zhǎng)出大胡子,而日本人松本,看樣子夠嗆。

          python.jpg?
          Guido van Rossum, Python之父

          ruby1.jpg?
          松本行弘, Ruby語(yǔ)言之父

            更有意思的事情還在后面,松本正巧看到了這個(gè)帖子,很不服氣,于是便在自己的blog上貼出這幅照片:

          ruby2.jpg?
            松本行弘:誰(shuí)說(shuō)俺長(zhǎng)不出大胡子?

            看來(lái), Ruby還是大有希望的!

            后記:從2005年發(fā)展的情況來(lái)看,Ruby的火爆再次證明的胡子定律的正確性。
          posted @ 2006-07-06 16:09 黑咖啡 閱讀(253) | 評(píng)論 (0)編輯 收藏
          *********************JAVA資源收藏***********************

          A.書名:《Thinking in Java》2e中文版 侯捷 / 王建興 合譯
          URL: http://jjhou.csdn.net/thinking-in-java-20010919.pdf
          B.書名:JBuilder5中文幫助文件
          URL: http://www.code-labs.com/manual/Jb5cn_help1.rar
          http://www.code-labs.com/manual/Jb5cn_help2.rar
          C.書名:Think in Java(中文版)---chm格式
          URL: http://www.code-labs.com/manual/Think%20In%20Java.chm
          D.書名:Jbuilder開發(fā)人員指南(完整版)
          URL: http://www.java-cn.net/book/books-zip/JbuilderGuide.zip
          E.書名:Java2編程詳解(Special_Edition_Using_Java)
          URL: http://www.java-cn.net/book/books-zip/Java2Xiangjie.zip
          F.書名:Java2 輕松進(jìn)階
          URL: http://www.java-cn.net/book/books-zip/java11.zip
          G.書名: JavaBeans開發(fā)使用手冊(cè)
          URL: http://www.java-cn.net/book/books-zip/JavaBeansDevelop.zip
          H.書名:Java1.3API手冊(cè)
          URL: http://www.java-cn.net/book/books-zip/api.zip

          java 教程與實(shí)例
          http://download.pchome.net/php/download2.php?sid=10837&url=/development/reference/Javateach0307.zip&svr=3

          I.書名:SCJP認(rèn)證筆記
          URL: http://vanstone.myetang.com/scjp/scjpnotes.rar
          J.書名:Sun培訓(xùn)教材中文稿
          URL: http://vanstone.myetang.com/scjp/javabook/sl275cn.pdf
          K.書名:SCJP認(rèn)證Bible
          URL: http://vanstone.myetang.com/scjp/scjpbible.rar
          L.書名:java開發(fā)規(guī)范(html)
          URL: http://www.cn-java.com/target/download.php?id=790&downurl=../download/book/javaformat.zip
          M.書名:EJB2.0 Entity bean(PDF)
          URL: http://www.cn-java.com/target/download.php?id=708&downurl=../download/book/EJB2.0.zip
          N.書名:J2ME用戶使用手冊(cè)(PDF)
          URL: http://www.cn-java.com/target/download.php?id=667&downurl=../download/book/UserGuide.pdf
          O.書名:JavaServerPages基礎(chǔ)
          URL: http://www.java-cn.net/book/books-zip/JSPIntro.zip
          P.書名:RMI Enhancements
          URL: http://www.cn-java.com/target/download.php?id=297&downurl=/download/tools/rmispecjdk12.zip
          Q.書名:無(wú)廢話XML
          URL: http://www.cn-java.com/target/download.php?id=222&downurl=../download/tools/wfhxml_gb.zip

          R.書名:Design Pattens
          注釋:號(hào)稱軟件工程師的床頭必備書籍,非常經(jīng)典,對(duì)面向?qū)ο笏枷朐趯?shí)踐應(yīng)用中的模式做了經(jīng)典性的總結(jié)
          URL: http://automation.seu.edu.cn/auto/content/Design.zip

          S.書名:設(shè)計(jì)模式 可復(fù)用面向?qū)ο筌浖幕A(chǔ)
          注釋:南京大學(xué)翻譯的Design Patterns的中譯本,機(jī)械工業(yè)出版社出版,翻譯質(zhì)量較好
          URL: http://automation.seu.edu.cn/auto/content/DesignCh.zip

          T.書名:Thinking in Java with Patten
          注釋:與Thinking in Java為同一作者所著,設(shè)計(jì)模式與Java的結(jié)合
          URL: http://automation.seu.edu.cn/auto/content/TIPatterns[Thinking%20in%20Pattern%20with%20java].zi
          p

          U.書名:The Design Pattens Java Companion
          注釋:另一本Design patten 與Java相結(jié)合的書 James w.Cooper著
          URL: http://automation.seu.edu.cn/auto/content/DesignJava.zip

          V.書名:Java 2 平臺(tái)安全技術(shù)-結(jié)構(gòu),API設(shè)計(jì)和實(shí)現(xiàn)
          注釋:來(lái)自china pub,PDF文檔,中譯本
          URL: http://automation.seu.edu.cn/auto/content/Java2Safe.zip

          W.書名:Mastering Enterprise JavaBeans
          注釋:Ed Roman著,EJB的優(yōu)秀書籍
          URL: http://automation.seu.edu.cn/auto/content/EJB-book.zip

          X.書名:Pure JSP
          注釋:James Goodwill著 Sams, Macmillan Computer Publishing 2000.6.8出版
          URL: http://automation.seu.edu.cn/auto/content/Pure%20jsp.zip

          Y.書名:Sun Tutorial 2001.5
          注釋:Sun公司的經(jīng)典教程,入門必讀
          URL: http://automation.seu.edu.cn/auto/content/tutorial_2001.zip

          Z.書名:JDK1.3.1 document Winhelp 格式
          注釋:Winhelp格式的JDK文檔,更易閱讀和查找,很棒
          URL: http://automation.seu.edu.cn/auto/content/jdk13doc_help.zip


          1A.書名:The Java Virtual Machine Specification Second Edition
          注釋:Java 虛擬機(jī)規(guī)范,有助于理解Java的實(shí)現(xiàn)原理,Sun出版
          URL:http://automation.seu.edu.cn/auto/content/vmspec.2nded.html.zip

          1B.書名:The Java Language Sepcification Second Edition
          注釋:Java 語(yǔ)言規(guī)范,Java編程語(yǔ)言的詳細(xì)說(shuō)明,Sun出版
          URL: http://automation.seu.edu.cn/auto/content/langspec-2.0.zip

          1C.書名:Java programmer's FAQ
          注釋:Sun公司的FAQ,內(nèi)容豐富,覆蓋面廣
          URL: http://automation.seu.edu.cn/auto/content/faq.zip

          1D.書名:Cocoon 2 簡(jiǎn)介
          注釋:Cocoon 是一種 Java 服務(wù)器框架,它允許使用 XSLT轉(zhuǎn)換動(dòng)態(tài)發(fā)布 XML 內(nèi)容。通過依靠 XML 描述內(nèi)容,使用 XSLT 將內(nèi)容轉(zhuǎn)換成多種格式,Cocoon 提供了用于構(gòu)建內(nèi)容、
          邏輯和表示在很大程度上彼此分離的應(yīng)用程序的平臺(tái)。 本教程將介紹 Cocoon 2,一個(gè)比原始 Cocoon 應(yīng)用程序更有效和更可伸縮的平臺(tái)。
          URL: http://www-900.ibm.com/developerWorks/cn/education/xml/x-cocoon/tutorial/x-cocoon.zip

          1E.書名:java事件傳遞技術(shù)
          注釋:Java 2 平臺(tái)使程序員可以從事件的角度來(lái)思考系統(tǒng),而不從是傳統(tǒng)的調(diào)用-返回(call-return)體系結(jié)構(gòu)風(fēng)格的角度。在該平臺(tái)本身內(nèi)部,就有對(duì)多種事件通知模式的直接支持。思考事件的一種方
          式是通過事件的粒度和所有權(quán)。一些事件模式適合在對(duì)象實(shí)例狀態(tài)變化的粒度上表示事件。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-delivery/tutorial/j-delivery.zip

          1F.書名:使用 JDBC 構(gòu)建基于 Web 的應(yīng)用程序
          注釋:如果您對(duì)構(gòu)建使用 JDBC 訪問數(shù)據(jù)庫(kù)的 Web 應(yīng)用程序的各種方法感興趣,那么本教程適合于您。在這一實(shí)踐指南中,您將通過使用三項(xiàng)獨(dú)立的技術(shù)來(lái)學(xué)習(xí)這一過程的基礎(chǔ)知識(shí),這三項(xiàng)技術(shù)是:servle
          t 方法、JavaServer Pages(JSP)頁(yè)面方法以及 JSP、JavaBeans 與 servlet 相結(jié)合的方法(也稱為 Model Two)。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcweb/tutorial/j-jdbcweb.zip

          1G.書名:Java 3D 探奇
          注釋:本教程是為沒有任何 3D 編程經(jīng)驗(yàn)的 Java 程序員而編寫的。我們將從一些基本的 3D 概念入手,探索如何構(gòu)建一副場(chǎng)景圖 — 用于描述我們想要渲染的場(chǎng)景的基本對(duì)象。然后,我們將接觸 Java
          3D 的一些更強(qiáng)大的功能。我們的重點(diǎn)將放在使用一些 Java 3D 實(shí)用類來(lái)開始您的編程。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-java3d/tutorial/j-java3d.zip
          1Q.書名:Java 調(diào)試
          注釋:即使是最高級(jí)的開發(fā)人員所開發(fā)的最簡(jiǎn)單的應(yīng)用程序也可能包含錯(cuò)誤。如果要成為好的調(diào)試人員,不必象大偵探那樣調(diào)查蛛絲馬跡。您只需了解概念并熟悉正確的工具。在本教程中,我們提供了關(guān)于基本 Java 調(diào)
          試概念和更高級(jí)調(diào)試類型的詳細(xì)信息。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-debug/j-debug.zip

          1R.書名:構(gòu)建定制的樹型視圖
          注釋:在這篇免費(fèi)的 dW 專有的獨(dú)家教程中,講述了關(guān)于 Swing 樹型視圖的概念、它們所顯示的內(nèi)容、如何設(shè)置它們以及如何定制它們。它還講述了使用線程來(lái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行任務(wù)的概念,這樣用戶界面就可以保
          持迅速反應(yīng)。研究 Java Swing 樹的相關(guān)類,演示了如何定制基本數(shù)據(jù)模型和樹節(jié)點(diǎn)的繪制。為說(shuō)明這些概念,我們將生成一個(gè)增強(qiáng)型 JTree,JMagnitudeTree。這個(gè)增強(qiáng)型 JTree 可
          以顯示樹節(jié)點(diǎn)的相對(duì)數(shù)量,以及標(biāo)準(zhǔn)節(jié)點(diǎn)名稱和整個(gè)樹型結(jié)構(gòu)。例如,如果樹顯示的是文件目錄結(jié)構(gòu),那么它可以指出所有文件和目錄的相對(duì)大小。本教程并不試圖充當(dāng)編程參考,因此合適的 Swing 參考資料或在線文檔
          也許會(huì)有幫助。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-magnitudetree/MagnitudeTree.zip

          1S.書名:構(gòu)建 Java 聊天服務(wù)器
          注釋:在這篇免費(fèi)的 dW 專有的獨(dú)家教程中,我們將構(gòu)建一個(gè)簡(jiǎn)單聊天系統(tǒng)的服務(wù)器和客戶機(jī)方。您將在這個(gè)過程中學(xué)到創(chuàng)建這樣一個(gè)服務(wù)器時(shí)可以用到的基本框架,該框架使用在很多情況下都能很好工作的傳統(tǒng)技術(shù)。我
          們還將討論框架的一些限制,并找到克服這些限制的方法。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-chat/tutorial/j-chat.zip

          1T.書名:構(gòu)建帶會(huì)話跟蹤的 Servlet
          注釋:本教程講授使用 Servlet 和 JSP 技術(shù)構(gòu)建因特網(wǎng)應(yīng)用的技巧。其關(guān)鍵是啟用會(huì)話處理,那么 Servlet 就可以知道哪個(gè)用戶在干什么。本教程顯示了一個(gè) URL 書簽系統(tǒng),在這個(gè)系統(tǒng)中,
          多個(gè)用戶訪問一個(gè)系統(tǒng)以添加、除去和更新 HTML 書簽列表。Servlet 使用 JSP 技術(shù)來(lái)處理用戶交互。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-servlets2/tutorial/j-servlets2.zip


          1H.書名:使用 JDBC 的高級(jí)數(shù)據(jù)庫(kù)操作
          注釋:本教程旨在向您介紹幾種高級(jí)數(shù)據(jù)庫(kù)操作,包括存儲(chǔ)過程和高級(jí)數(shù)據(jù)類型,它們可以通過使用 JDBC 的 Java 應(yīng)用程序執(zhí)行。教程中的示例代碼是為 DB2 通用數(shù)據(jù)庫(kù) 7.2 編寫的,但因?yàn)槭褂昧?br />DataSource 對(duì)象,修改這些代碼以適用于其它數(shù)據(jù)庫(kù)是不成問題的。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcadv/tutorial/j-jdbcadv.zip

          1I.書名:用 JDBC 管理數(shù)據(jù)庫(kù)連接
          注釋:本教程介紹了使用“Java 數(shù)據(jù)庫(kù)連接”(Java Database Connection(JDBC))從 Java 應(yīng)用程序內(nèi)部建立和管理數(shù)據(jù)庫(kù)連接所涉及的不同概念。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbc/tutorial/j-jdbc.zip
          1J.書名:Java 集合框架
          注釋:本教程將帶您漫游 “Java 集合框架”(Java Collection Framework)。為了盡快開始學(xué)習(xí)“集合框架”,教程從一些面向初學(xué)者和專家等讀者的簡(jiǎn)單編程示例入手。接著,教程繼續(xù)
          討論集(set)和映射(map),它們的屬性以及它們數(shù)學(xué)上的定義與“集合框架”中的 Set、 Map 和 Collection 定義有何不同。“Java 集合框架”的歷史那一節(jié)澄清了集和映射相關(guān)類的一
          些混淆。本教程徹底介紹了“集合框架”中所有的接口和實(shí)現(xiàn)這些接口的類。本教程不僅談到了用線程安全和只讀方式處理集合,還探討了集合的算法支持。此外,教程還討論了在 JDK 1.1 中使用“集合框架”的一個(gè)
          子集。最后,教程以先于“Java 集合框架”的 ObjectSpace 中一種廣泛使用的算法和數(shù)據(jù)結(jié)構(gòu)庫(kù) JGL 的介紹作為結(jié)束。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-collections/tutorial/j-collections.z
          ip

          1K.書名:Java 套接字(socket)101
          注釋:本教程將告訴您什么是套接字(socket)并教您如何在 Java 程序中使用它。通過實(shí)際分析幾個(gè)示例,從單個(gè)客戶機(jī)/服務(wù)器通訊到池中的一組客戶機(jī)訪問服務(wù)器,您將學(xué)到如何用套接字處理現(xiàn)實(shí)世界中碰
          到的典型情形。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-sockets/tutorial/j-sockets.zip

          1L.書名:Java Message Service 基礎(chǔ)教程
          注釋:本教程向您介紹了 Java 消息服務(wù)(Java Message Service,JMS)概述,并提供了使用它開發(fā)程序的基本知識(shí)。Sun Microsystems 開發(fā) JMS 是為 Java
          程序訪問企業(yè)消息傳遞系統(tǒng)、也稱面向消息的中間件(MOM)提供一種途徑。通過中介這種間接方式來(lái)支持應(yīng)用程序間數(shù)據(jù)的異步傳遞,MOM 提供了一種以松散組織的、靈活的風(fēng)格來(lái)集成應(yīng)用程序的機(jī)制。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jms/tutorial/j-jms.zip

          1M.書名:JavaMail API 基礎(chǔ)教程
          注釋:想將郵件工具結(jié)合到您獨(dú)立于平臺(tái)的 Java 解決方案中嗎?再?zèng)]有比 JavaMail API 更合適的了,它提供了個(gè)獨(dú)立于協(xié)議的模塊,能用于 IMAP、POP、SMTP、MIME 和其它涉及因
          特網(wǎng)的消息傳遞協(xié)議。現(xiàn)在,有了 JavaBeans Activation Framework (JAF)的支持,您的應(yīng)用程序經(jīng)由 JavaMail API 就能啟用郵件功能啦。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-javamail/tutorial/j-javamail.zip

          1N.書名:J2ME 循序漸進(jìn)
          注釋:本教程詳細(xì)審查了袖珍版 Java 2 平臺(tái) (J2ME),它主要面向在 Java 編程及面向?qū)ο笤O(shè)計(jì)與開發(fā)方面有深厚背景的中級(jí)開發(fā)者。 您可以首先了解 J2ME 的背景并研究 J2ME 的配置
          和簡(jiǎn)表。隨后,逐步建立您的開發(fā)環(huán)境,用于開發(fā) J2ME 應(yīng)用程序。
          本教程將向您介紹一些課題如 K 虛擬機(jī) (KVM),和 KJava API -- 用于關(guān)聯(lián)連接有限設(shè)備配置 (CLDC) 和使用 CLDC 的移動(dòng)信息設(shè)備簡(jiǎn)表。之后您將構(gòu)造一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)看看您能
          用 J2ME 做些什么。您將使用 CLDC 和 KJava 開發(fā)一個(gè)基本繪圖應(yīng)用程序以及一個(gè)小型 MIDP 應(yīng)用程序。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j2me/tutorial.zip

          1O.書名:構(gòu)建自己的 Java 庫(kù)
          注釋:此篇教程主要教您怎樣使用 Java 語(yǔ)言來(lái)構(gòu)建自己的可重用的類庫(kù)。內(nèi)容包括設(shè)計(jì)良好類庫(kù)的一些關(guān)鍵事項(xiàng)以及有效方法,為了更好的說(shuō)明內(nèi)容,教程還給出了一個(gè)簡(jiǎn)單的類庫(kù)設(shè)計(jì)的例子。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-library/j-library.zip

          1P.書名:了解 Java ClassLoader
          注釋:Java ClassLoader 是一個(gè)重要的、但又常常被人忽略的 Java 運(yùn)行時(shí)系統(tǒng)組件。它是負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件的類。創(chuàng)建自己的 ClassLoader 可以以實(shí)用且有趣的方式定
          制 JVM,這樣可以讓您徹底重新定義如何將類文件引入系統(tǒng)。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-classloader/j-classloader.zip

          1Q.書名:Java 調(diào)試
          注釋:即使是最高級(jí)的開發(fā)人員所開發(fā)的最簡(jiǎn)單的應(yīng)用程序也可能包含錯(cuò)誤。如果要成為好的調(diào)試人員,不必象大偵探那樣調(diào)查蛛絲馬跡。您只需了解概念并熟悉正確的工具。在本教程中,我們提供了關(guān)于基本 Java 調(diào)
          試概念和更高級(jí)調(diào)試類型的詳細(xì)信息。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-debug/j-debug.zip


          1R.書名:構(gòu)建定制的樹型視圖
          注釋:在這篇免費(fèi)的 dW 專有的獨(dú)家教程中,講述了關(guān)于 Swing 樹型視圖的概念、它們所顯示的內(nèi)容、如何設(shè)置它們以及如何定制它們。它還講述了使用線程來(lái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行任務(wù)的概念,這樣用戶界面就可以保
          持迅速反應(yīng)。研究 Java Swing 樹的相關(guān)類,演示了如何定制基本數(shù)據(jù)模型和樹節(jié)點(diǎn)的繪制。為說(shuō)明這些概念,我們將生成一個(gè)增強(qiáng)型 JTree,JMagnitudeTree。這個(gè)增強(qiáng)型 JTree 可
          以顯示樹節(jié)點(diǎn)的相對(duì)數(shù)量,以及標(biāo)準(zhǔn)節(jié)點(diǎn)名稱和整個(gè)樹型結(jié)構(gòu)。例如,如果樹顯示的是文件目錄結(jié)構(gòu),那么它可以指出所有文件和目錄的相對(duì)大小。本教程并不試圖充當(dāng)編程參考,因此合適的 Swing 參考資料或在線文檔
          也許會(huì)有幫助。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-magnitudetree/MagnitudeTree.zip

          1S.書名:構(gòu)建 Java 聊天服務(wù)器
          注釋:在這篇免費(fèi)的 dW 專有的獨(dú)家教程中,我們將構(gòu)建一個(gè)簡(jiǎn)單聊天系統(tǒng)的服務(wù)器和客戶機(jī)方。您將在這個(gè)過程中學(xué)到創(chuàng)建這樣一個(gè)服務(wù)器時(shí)可以用到的基本框架,該框架使用在很多情況下都能很好工作的傳統(tǒng)技術(shù)。我
          們還將討論框架的一些限制,并找到克服這些限制的方法。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-chat/tutorial/j-chat.zip

          1T.書名:構(gòu)建帶會(huì)話跟蹤的 Servlet
          注釋:本教程講授使用 Servlet 和 JSP 技術(shù)構(gòu)建因特網(wǎng)應(yīng)用的技巧。其關(guān)鍵是啟用會(huì)話處理,那么 Servlet 就可以知道哪個(gè)用戶在干什么。本教程顯示了一個(gè) URL 書簽系統(tǒng),在這個(gè)系統(tǒng)中,
          多個(gè)用戶訪問一個(gè)系統(tǒng)以添加、除去和更新 HTML 書簽列表。Servlet 使用 JSP 技術(shù)來(lái)處理用戶交互。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-servlets2/tutorial/j-servlets2.zip

          1U.書名:Java 語(yǔ)言基礎(chǔ)
          注釋:本教程介紹了 Java 編程語(yǔ)言,包括一些用來(lái)說(shuō)明面向?qū)ο蠹軜?gòu)語(yǔ)言的語(yǔ)法的示例, 以及一些標(biāo)準(zhǔn)編程的練習(xí),如定義實(shí)例方法,使用內(nèi)嵌(built-in)類型,創(chuàng)建用戶自定義類型, 使用引用變量(
          reference variables)等。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/javaintro/tutorial/javaintro.zip


          1V.書名:JavaRMI入門實(shí)戰(zhàn)(實(shí)在找不到頁(yè)面下載,這是ftp下載的)
          URL:ftp://218.242.4.185/pub/work/JAVA_JSP_J2EE/Articles/RMI/JavaRMI%C8%EB%C3%C5%CA%B5%D5%BD.pdf

          1W.書名:Java Xml 編程指南書籍源碼
          URL:ftp://202.115.39.65/--==Incoming==--/Documents/Tech/Java/J2EE/Java%20Xml%20編程指南書籍源碼.rar

          1X.書名:XML解決方案開發(fā)實(shí)務(wù)
          URL:
          http://www.guxiang.com/epubcn/readings/diannaotushu/100/download/xmlsolution.zip
          posted @ 2006-07-06 10:34 黑咖啡 閱讀(332) | 評(píng)論 (0)編輯 收藏

          近段時(shí)間項(xiàng)目任務(wù)相對(duì)比較少,是一個(gè)很好補(bǔ)習(xí)java基礎(chǔ)的機(jī)會(huì),列一些需要著重注意的地方:

          1、基礎(chǔ)。一切活動(dòng)的根基,重點(diǎn)在語(yǔ)法和api的理解,應(yīng)用。
          2、數(shù)據(jù)庫(kù)。oracle 9i
          3、struts
          4、hibernate
          5、sql語(yǔ)法

          需要啃掉的書:
          1、thinking in java
          2、以前的課本有必要再看一下。

          posted @ 2006-07-04 15:32 黑咖啡 閱讀(218) | 評(píng)論 (0)編輯 收藏

          try {
          ?????new Thread(new Runnable() {
          ??????public void run() {
          ???????TaskService taskService = (TaskService)context.getBean(TaskService.SERVICE_NAME);
          ???????List<Task> taskSharedList = taskService.getAllSharedTaskList();
          ???????for (Task task : taskSharedList) {
          ????????task.setOwner(mainFrame.getUserName());
          ???????}
          ???????try {
          ????????((LoginServiceProxyImpl) context.getBean(LoginServiceProxyImpl.SERVICE_NAME))
          ??????????.shareTask(taskSharedList);
          ???????} catch (RemoteException e) {
          ????????e.printStackTrace();
          ???????} catch (ServiceException e) {
          ????????e.printStackTrace();
          ???????}
          ??????}
          ?????}).run();

          ????} catch (Exception e) {
          ????}

          posted @ 2006-06-22 16:54 黑咖啡 閱讀(180) | 評(píng)論 (0)編輯 收藏
          無(wú)意見發(fā)現(xiàn)了這篇文章
          關(guān)于《80前的前輩,你們都做了什么?!》一文對(duì)EasyJF團(tuán)隊(duì)造成惡劣影響的聲明??
          http://www.aygfsteel.com/daxia/archive/2006/06/01/49391.html

          于是順著線索看到了2篇文章,也是80前的一代人何80后的一代人的對(duì)話,也許帶著些抱怨,也許帶著些抨擊,但是我并不能把這個(gè)定義為爭(zhēng)吵,或者是爭(zhēng)論。定義為對(duì)話,是因?yàn)槲矣X得主導(dǎo)自己人生的還是自己,自己的認(rèn)識(shí),自己的經(jīng)歷。如果一概的把自己的成長(zhǎng)依賴于前輩的影響社會(huì)的塑造,那創(chuàng)新一詞就該封存了。

          貼出2篇文章的鏈接:
          《80年代的兄弟,你會(huì)什么?!》http://blog.sina.com.cn/u/1490567244
          80前的前輩,你們都做了些什么?! http://www.aygfsteel.com/daxia/archive/2006/05/29/48664.html
          posted @ 2006-06-01 11:28 黑咖啡 閱讀(190) | 評(píng)論 (0)編輯 收藏

          時(shí)間真的是飛逝,轉(zhuǎn)眼工作快一年了。

          posted @ 2006-05-30 09:34 黑咖啡 閱讀(142) | 評(píng)論 (0)編輯 收藏

          通用惟一標(biāo)識(shí)符(UUID)是128位比特的數(shù)字,用來(lái)惟一地標(biāo)識(shí)因特網(wǎng)上的某些對(duì)象或者實(shí)體。根據(jù)使用的特定機(jī)制,通用惟一標(biāo)識(shí)符不僅需要保證是彼此不相同的,或者最少也是與公元3400年之前其他任何生成的通用惟一標(biāo)識(shí)符有非常大的區(qū)別。通用惟一標(biāo)識(shí)符依靠保證惟一性的部分的組合。有保證的通用惟一標(biāo)識(shí)符包括一個(gè)指向生成通用惟一標(biāo)識(shí)符的主機(jī)的網(wǎng)絡(luò)地址,時(shí)間戳(用來(lái)記錄事務(wù)的精確時(shí)間的記錄),以及一個(gè)隨機(jī)生成的組件。因?yàn)榫W(wǎng)絡(luò)地址標(biāo)識(shí)了惟一的一臺(tái)計(jì)算機(jī) ,并且時(shí)間戳對(duì)于某臺(tái)主機(jī)上的生成的每個(gè)通用惟一標(biāo)識(shí)符也是惟一的,那么這兩個(gè)部分就完全可以保證惟一性了。然而,隨機(jī)生成的通用惟一標(biāo)識(shí)符的元素也可以作為保護(hù)措施來(lái)防止所有的不可預(yù)見的問題。  

          通用惟一標(biāo)識(shí)符是作為tModel 數(shù)據(jù)結(jié)構(gòu)中的一部分,這種數(shù)據(jù)結(jié)構(gòu)標(biāo)識(shí)通用描述、發(fā)現(xiàn),和整合(UDDI)注冊(cè)中的一種服務(wù)的類型(注冊(cè)服務(wù)的通用表示法)。這種機(jī)制可用來(lái)發(fā)現(xiàn)網(wǎng)絡(luò)服務(wù)。  

          通用惟一標(biāo)識(shí)符還可以用來(lái)指向大多數(shù)的可能的物體。微軟和其他一些軟件公司都傾向使用全球惟一標(biāo)識(shí)符(GUID),這也是通用惟一標(biāo)識(shí)符的一種類型,可用來(lái)指向組建對(duì)象模塊對(duì)象和其他的軟件組件。第一個(gè)通用惟一標(biāo)識(shí)符是在網(wǎng)羅計(jì)算機(jī)系統(tǒng)(NCS)中創(chuàng)建,并且隨后成為開放軟件基金會(huì)(OSF)的分布式計(jì)算環(huán)境(DCE)的組件。

          UUID,是128位整數(shù)(16字節(jié))的全局唯一標(biāo)識(shí)符(Universally Unique Identifier)。

          UUID是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。通常平臺(tái)會(huì)提供生成UUID的API。UUID按照開放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字。由以下幾部分的組合:當(dāng)前日期和時(shí)間(UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,過幾秒又生成一個(gè)UUID,則第一個(gè)部分不同,其余相同),時(shí)鐘序列,全局唯一的IEEE機(jī)器識(shí)別號(hào)(如果有網(wǎng)卡,從網(wǎng)卡獲得,沒有網(wǎng)卡以其他方式獲得),UUID的唯一缺陷在于生成的結(jié)果串會(huì)比較長(zhǎng)。關(guān)于UUID這個(gè)標(biāo)準(zhǔn)使用最普遍的是微軟的GUID(Globals Unique Identifiers)。
          在ColdFusion中可以用CreateUUID()函數(shù)很簡(jiǎn)單的生成UUID,其格式為:xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個(gè) x 是 0-9 或 a-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。而標(biāo)準(zhǔn)的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
          ,可以從cflib?下載CreateGUID() UDF進(jìn)行轉(zhuǎn)換。
          使用UUID的好處在分布式的軟件系統(tǒng)中(比如:DCE/RPC, COM+,CORBA)就能體現(xiàn)出來(lái),它能保證每個(gè)節(jié)點(diǎn)所生成的標(biāo)識(shí)都不會(huì)重復(fù),并且隨著WEB服務(wù)等整合技術(shù)的發(fā)展,UUID的優(yōu)勢(shì)將更加明顯。

          PS:在MMColdFusion技術(shù)支持中心找到一篇文章,其中提到使用CreateUUID()會(huì)將WIN平臺(tái)下的系統(tǒng)時(shí)間加快10毫秒,原因是JVM1.3.x?和1.4.x的bug,文章提到了解決方法。
          posted @ 2006-05-26 17:13 黑咖啡 閱讀(526) | 評(píng)論 (0)編輯 收藏
          <span title="第一行&#13;&#10;第二行">haha haha haha</span>
          posted @ 2006-05-19 12:07 黑咖啡 閱讀(373) | 評(píng)論 (0)編輯 收藏
          正在躊躇的時(shí)候發(fā)現(xiàn)下面的這段代碼,終于得意解決。苦于對(duì)js沒有足夠的熟悉,代碼中的具體方法參數(shù)還得繼續(xù)學(xué)習(xí),感謝提供代碼的朋友。
          function SetCwinHeight()
          {
          var cwin=document.getElementById("cwin");
          if (document.getElementById)
          {
          if (cwin && !window.opera)
          {
          if (cwin.contentDocument && cwin.contentDocument.body.offsetHeight)
          cwin.height = cwin.contentDocument.body.offsetHeight;
          else if(cwin.Document && cwin.Document.body.scrollHeight)
          cwin.height = cwin.Document.body.scrollHeight;
          }
          }
          }

          <iframe width="778" align="center" height="200" id="cwin" name="cwin" onload="Javascript:SetCwinHeight(this)" frameborder="0" scrolling="no"></iframe>


          function SetCwinHeight(obj)
          {
          ??var cwin=obj;
          ??if (document.getElementById)
          ??{
          ????if (cwin && !window.opera)
          ????{
          ??????if (cwin.contentDocument && cwin.contentDocument.body.offsetHeight)
          ????????cwin.height = cwin.contentDocument.body.offsetHeight;
          ??????else if(cwin.Document && cwin.Document.body.scrollHeight)
          ????????cwin.height = cwin.Document.body.scrollHeight;
          ????}
          ??}
          }

          引用時(shí)
          onload="javascript:SetCwinHeight(this)"
          posted @ 2006-04-27 15:50 黑咖啡 閱讀(39317) | 評(píng)論 (13)編輯 收藏
          RSS為Really Simple Syndication(簡(jiǎn)易供稿)的縮寫,是某一站點(diǎn)用來(lái)和其它站點(diǎn)之間共享內(nèi)容的一種簡(jiǎn)易方式,也叫聚合內(nèi)容。網(wǎng)絡(luò)用戶可以在客戶端借助于支持RSS的新聞聚合工具軟件(例如SharpReader NewzCrawler、FeedDemon RSSReader),在不打開網(wǎng)站內(nèi)容頁(yè)面的情況下閱讀支持RSS輸出的網(wǎng)站內(nèi)容。可見,網(wǎng)站提供RSS輸出,有利于讓用戶發(fā)現(xiàn)網(wǎng)站內(nèi)容的更新。在高速高質(zhì)高效成為主流呼聲的互聯(lián)網(wǎng)時(shí)代,RSS無(wú)疑推動(dòng)了網(wǎng)上信息的傳播,提出了另一種看世界的方式。

          ????RSS,原意是把網(wǎng)站內(nèi)容如標(biāo)題、鏈接、部分內(nèi)文甚至全文轉(zhuǎn)換為可延伸標(biāo)示語(yǔ)言(XML:eXtensible Markup Language)的格式,以向其它網(wǎng)站供稿,使用者可以用一般的瀏覽器觀看,也可以用特殊的“閱讀器”軟件來(lái)閱讀。
          posted @ 2006-04-27 15:19 黑咖啡 閱讀(195) | 評(píng)論 (0)編輯 收藏

          WikiWiki一詞來(lái)源于夏威夷語(yǔ)的 "wee kee wee kee" ,原本是“快點(diǎn)”的意思。在這里WikiWiki指一種超文本系統(tǒng)。這種超文本系統(tǒng)支持面向社群的協(xié)作式寫作,同時(shí)也包括一組支持這種寫作的輔助工具。我們可以在Web的基礎(chǔ)上對(duì)Wiki文本進(jìn)行瀏覽、創(chuàng)建、更改,而且創(chuàng)建、更改、發(fā)布的代價(jià)遠(yuǎn)比HTML文本為小;同時(shí)Wiki系統(tǒng)還支持面向社群的協(xié)作式寫作,為協(xié)作式寫作提供必要幫助;最后,Wiki的寫作者自然構(gòu)成了一個(gè)社群,Wiki系統(tǒng)為這個(gè)社群提供簡(jiǎn)單的交流工具。與其它超文本系統(tǒng)相比,wiki有使用方便及開放的特點(diǎn),所以wiki系統(tǒng)可以幫助我們?cè)谝粋€(gè)社群內(nèi)共享某領(lǐng)域的知識(shí)。

          1995年Ward Cunningham為了方便模式社群的交流建立了一個(gè)工具-波特蘭模式知識(shí)庫(kù)(Portland Pattern Repository)。在建立這個(gè)系統(tǒng)的過程中,Ward Cunningham創(chuàng)造了Wiki的概念和名稱,并且實(shí)現(xiàn)了支持這些概念的服務(wù)系統(tǒng)。這個(gè)系統(tǒng)是最早的Wiki系統(tǒng)。從1996年至2000年間,波特蘭模式知識(shí)庫(kù)圍繞著面向社群的協(xié)作式寫作,不斷發(fā)展出一些支持這種寫作的輔助工具,從而使Wiki的概念不斷得到豐富。同時(shí)Wiki的概念也得到了傳播,出現(xiàn)了許多類似的網(wǎng)站和軟件系統(tǒng)。

          您現(xiàn)在所訪問的Wikipedia是目前世界上最大的Wiki系統(tǒng),它是一個(gè)基于Wiki和GNU FDL的百科全書網(wǎng)站系統(tǒng)。該系統(tǒng)于2001年1月投入運(yùn)行,2001年2月超過1,000條條目,2001年7月超過10,000條條目,目前(2003年1月)已經(jīng)接近100,000條條目。Wikipedia條目的迅速增長(zhǎng)說(shuō)明了Wikipedia系統(tǒng)的健壯,也說(shuō)明了Wiki的概念是經(jīng)得起驗(yàn)證的。

          Wiki的歷史還不長(zhǎng),無(wú)論是Wiki概念自身,還是相關(guān)軟件系統(tǒng)的特性,還都在熱烈的討論中;所以怎樣的一個(gè)站點(diǎn)才能稱得上是一個(gè)Wiki系統(tǒng)還是有爭(zhēng)議的。與Wiki相關(guān)最近出現(xiàn)的技術(shù)還有Weblog,它們都降低了超文本寫作和發(fā)布的難度。這兩者都與內(nèi)容管理系統(tǒng)關(guān)系緊密。

          Wiki的特點(diǎn)

          使用方便

          維護(hù)快捷:快速創(chuàng)建、存取、更改超文本頁(yè)面(這也是為什么叫作 "wiki wiki" 的原因)。

          格式簡(jiǎn)單:用簡(jiǎn)單的格式標(biāo)記來(lái)取代 HTML 的復(fù)雜格式標(biāo)記。(類似所見即所得的風(fēng)格)

          鏈接方便:通過簡(jiǎn)單標(biāo)記,直接以關(guān)鍵字名來(lái)建立鏈接(頁(yè)面、外部連接、圖像等)。

          命名平易:關(guān)鍵字名就是頁(yè)面名稱,并且被置于一個(gè)單層、平直的名空間中。

          有組織

          自組織的:同頁(yè)面的內(nèi)容一樣,整個(gè)超文本的組織結(jié)構(gòu)也是可以修改、演化的。

          可匯聚的:系統(tǒng)內(nèi)多個(gè)內(nèi)容重復(fù)的頁(yè)面可以被匯聚于其中的某個(gè),相應(yīng)的鏈接結(jié)構(gòu)也隨之改變。

          可增長(zhǎng)

          可增長(zhǎng):頁(yè)面的鏈接目標(biāo)可以尚未存在,通過點(diǎn)擊鏈接,我們可以創(chuàng)建這些頁(yè)面,從而使系統(tǒng)得到增長(zhǎng)。

          修訂歷史:記錄頁(yè)面的修訂歷史,頁(yè)面的各個(gè)版本都可以被獲取。

          開放性

          開放的:社群的成員可以任意創(chuàng)建、修改、刪除頁(yè)面。

          可觀察:系統(tǒng)內(nèi)頁(yè)面的變動(dòng)可以被訪問者觀察到。

          相關(guān)條目

          Wiki引擎

          Web log

          內(nèi)容管理系統(tǒng)

          群件

          posted @ 2006-04-27 15:19 黑咖啡 閱讀(198) | 評(píng)論 (0)編輯 收藏
          總看到別人的Blog那么漂亮,一直不知道怎么才能讓自己的Blog漂亮起來(lái),當(dāng)然我是知道blogjava里面肯定是可以選模板的。但是一直沒找到(可能是沒找,哈哈!)

          今天終于看到了,選了一個(gè)稍微滿意的css ,不是我的最愛,其實(shí)是我不知道自己的最愛是什么樣子的。希望有一天能有自己的個(gè)人網(wǎng)站。
          posted @ 2006-04-26 14:06 黑咖啡 閱讀(158) | 評(píng)論 (0)編輯 收藏
          • Level 0 —— “CSS? Isn’t that a multiplayer game?”
          曾經(jīng)風(fēng)靡一時(shí)的 CS 游戲嗎?
          • Level 1 —— “Yeah, I use it to remove underlines on links sometimes”
          懂一點(diǎn)HTML和基礎(chǔ)的CSS,知道如何用CSS去掉鏈接默認(rèn)有的下劃線,但僅僅是在HTML標(biāo)簽本身不能做到的時(shí)候才會(huì)考慮用用CSS。
          • Level 2 —— “No, I don’t like divs; tables are much easier to work with”
          HTML 很熟練了,有過不少網(wǎng)站的經(jīng)驗(yàn),甚至可能已經(jīng)是Webmaster了。聽說(shuō)過現(xiàn)在流行用div布局,不過還是table 用起來(lái)順手。
          • Level 3 —— “Yes I’ve heard it’s good, but I can’t use it because of…”
          體會(huì)到了CSS的好處,并且嘗試用CSS做一些簡(jiǎn)單的布局,但苦于沒有一個(gè)應(yīng)用的項(xiàng)目或機(jī)會(huì)。
          • Level 4 —— “CSS? Oh! Yes, I use divs for all my layouts”
          已經(jīng)開始應(yīng)用CSS布局,但缺乏經(jīng)驗(yàn),甚至過度應(yīng)用,HTML頁(yè)面如果沒有CSS,結(jié)構(gòu)將亂成一糟。
          • Level 5 —— “I use CSS for design, it’s better than tables because of…”
          已經(jīng)積累了豐富的CSS使用經(jīng)驗(yàn),也有了相當(dāng)?shù)睦碚摶A(chǔ)。開始自覺的宣傳結(jié)構(gòu)與表現(xiàn)分離的原則。
          • Level 6 —— “What version of CSS? Yes, I do. Did you read my book about…”
          牛人! 熟讀W3C的CSS規(guī)范;深諳各個(gè)瀏覽器對(duì)CSS支持的細(xì)微區(qū)別;說(shuō)不定就是 >>Web Standards Project 組織成員;常常發(fā)表優(yōu)秀的文章并吸引大量擁蹙。
          posted @ 2006-04-26 13:36 黑咖啡 閱讀(203) | 評(píng)論 (0)編輯 收藏

          從了解日本,到瓦解日本,最后達(dá)到占領(lǐng)日本的目的。于是我開始學(xué)日語(yǔ)了,哈哈!!!!

          時(shí)間安排不好一直是自己的一個(gè)大毛病。。。。。怎么改正呢???????很暈。。。。。。

          甩甩頭。。。。。。還是得學(xué)啊。從現(xiàn)在坐起,合理安排時(shí)間,看來(lái)還是要把以前定計(jì)劃的習(xí)慣揀起來(lái)了(盡管以前定的計(jì)劃也沒幾個(gè)按照上面來(lái)的。。。暈)


          論成敗人生豪邁,大不了從頭再來(lái)。 --彪子

          posted @ 2006-04-02 13:12 黑咖啡 閱讀(190) | 評(píng)論 (0)編輯 收藏
          最近發(fā)現(xiàn)自己很多基礎(chǔ)問題都不明白。導(dǎo)出搜集。于是有這一貼:
          題目:
          1.java程序在保存文件時(shí),后綴名是?
          2.java程序經(jīng)過編譯過后,后綴名是?
          3.java程序文件保存時(shí),主文件名是?
          4.如何用瀏覽器觀看輸出至命令行模式的結(jié)果?
          5.如何把一個(gè)java applet放到網(wǎng)頁(yè)上?
          6.public class??cjc extends java.applet.Applet{
          public static void main(String args[])
          {
          cjc mf=new cjc();
          mf.init();
          }
          public void init(){
          累加 累加數(shù)字 = new 累加(10);
          System.out.println(累加數(shù)字.總和());
          }
          }
          class 累加{
          int in=;
          public 累加(int in){
          this.in=in;
          }
          public int 總和(){
          int i,sum;
          sum=0;for(i=1;i<=in;i++)??sum+=i;
          return sum;
          }
          }
          如果你想要計(jì)算a加到b的總和,如何修改?
          題目:
          1. 下面哪個(gè)是對(duì)的?
          A.IloveJava???? B.$20?? C.piggy@msl????D.Hello_worle?? E.2two???? F.sum+of+money
          2.下面可能產(chǎn)生什么結(jié)果?如果有錯(cuò)如何改正?
          int i=5;
          int j=2;
          k=i*j;
          3.下面可能產(chǎn)生什么結(jié)果?如果有錯(cuò)如何改正?
          float f=2.5;
          f=f*2;
          4.answer變量的數(shù)據(jù)類型應(yīng)該是?
          byte b=1;???? char c=2;????short s=3;????int i=4;???? float f=5.0f;
          answer=b*c*s*i*f;
          5.如果我想要把[2*2.5]的結(jié)果用一個(gè)float變量存放的話,程序應(yīng)該如何編寫?
          題目:
          1.請(qǐng)問最后a,b變量的數(shù)值是?
          int x,a=5,b3;??????x=a++ + b--;
          A.x=8,a=5,b=3;????B.x=8,a=6,b=2;???? C.x=7,a=5,b=2;???? D.x=9,a=6,b=3;
          2.下列表達(dá)式,哪幾個(gè)是正確的?
          A.int x=6;x=!x;???? B.int x=6;x=~x;?? C.boolean b=true; b=!b;????D. boolean b=true; b=!b;
          3.下列表達(dá)式,哪幾個(gè)x變量的值最后會(huì)是正數(shù)?
          A.int x=-1;x=x>>>5;????B.int x=-1;x=x>>>32;???? C.byte x=-1;x=x>>>5;??
          D.int x=-1;x=x>>5;
          4.下列的變量x,y,哪幾個(gè)運(yùn)算完,結(jié)果使true?
          A.int i=100;float f=500.0f;i==f????? B.int i=40;float f=500.0f;i>f?
          C.int i=20;float f=30.0f;i<f??????????? D.int i=55;float f=33.3f;i!=f?
          5.下列的結(jié)果是?
          int i=100;???? i=((i++>>35) << 32)%10;
          A.0???? B.1???? C.2??????D.3

          題目:
          1.if(score >=90 && score <=100)
          finalScore="甲";
          else if (score >=80 && score <=90)
          finalScore="乙 ";
          else if (score >=70 && score <=80)
          finalScore="丙 ";
          else if (score >=60 && score <=70)
          finalScore="丁 ";
          else
          finalScore="戊 ";
          用更簡(jiǎn)單的方法寫出來(lái)(不能用邏輯表達(dá)式)
          2.寫一個(gè)程序,它能夠計(jì)算a加到b的總和,其中a不一定比b小。
          3.寫一個(gè)程序,它能夠把1到100中的質(zhì)數(shù)顯示出來(lái)。
          4.寫一個(gè)程序,能夠從五個(gè)數(shù)字中跳出最大值。
          5.那些循環(huán)語(yǔ)句的寫法是正確的?
          A.while (int i<5){ i++; System.out.println(i);}
          B.int i=5; while(i)??System.out.println(i);
          C.int j=1; for (int k=1;j+k != 10;j++,k++)????System.out.println("j="+j+"k="+k);
          D.int j=1;??do { System.out.println(j++);?? if(j==5) contine loop1;}?? while (j<20);

          題目:
          1.哪些是合法的重載?
          public class Q1{??????public void method(int i){ };???? }
          A.private void method(int i){ }?????????? B.public void method(int k){ }
          C.public int method(int i){ }?????????????? D.private float method(float f){ }
          E.public String method(int i,int j){ }
          2. 在Q2_2類中,哪些是合法的覆蓋?
          public class Q2_1{
          public void method(int i){ };
          }
          class Q2_2 extends Q2_1{
          }
          A.public void method(int i){ }??????????????B.private void method(int j){ }
          C.public int method(int i){ }????????????????D.public float method(float f){ }
          E.private String method(String s){ }
          3.Q4_2類運(yùn)行的結(jié)果是什么?為什么?若把Q4_2類的第9行改成 Q4_1 q2=new Q4_2();??結(jié)果是多少?為什么?若把第11行改成 ((Q4_2) q2).method(); 結(jié)果是多少?為什么?
          01:????????public class Q4_1{
          02:????????public void method(int i){
          03:????????System.out.println(10);
          04:}
          05:}
          06:????????public class Q4_2 extends Q4_1{
          07:????????public static void main(String args{}){
          08:????????Q4_1 q1=new Q4_1();??????
          09:????????Q4_2 q2=new Q4_2();
          010:??????q1.method(1);????
          011:?? q2.method(2);
          012:}
          013:??????public void method(int k){
          014:??????System.out.println(20);
          015:}

          4.在Q9_1類中應(yīng)該有哪些構(gòu)造函數(shù)?
          public class Q9_2 extends Q9_1{
          public Q9_2(int i){ }
          public Q9_2(int i,float f){ super(i,f)}
          }
          A.public Q9_1(){ }??????????????????????????????????????B.public Q9_1(int k){ }
          C.public Q9_1(int i,float f){ }??????????????????????D.public Q9_1(float f){ }

          題目:
          1.錯(cuò)在哪里?
          public class text{
          public static void main(String args[]){
          A a=new A();
          B b=(B) a;
          C c=new A();
          D d=(D) c;
          }
          }
          class A{}
          class B extends A {}
          class C extends B {}
          class D extends A {}
          2.若一個(gè)抽象類種所有的方法都是抽象方法時(shí),是不是可以改為接口?

          1.兩個(gè)對(duì)象作比較運(yùn)算時(shí),使用==運(yùn)算符和equals方法有什么差別?
          2.如果讓一個(gè)類有復(fù)制能力,應(yīng)該用那個(gè)接口?
          3.如何把一個(gè)對(duì)象用字符串表示出來(lái)?
          4.設(shè)計(jì)一個(gè)三角形和矩形類,修改它們的equals方法,如果兩個(gè)對(duì)象面積相同,則equals方法返回true

          1.如果有個(gè)int[0]型的數(shù)組x,你覺得A、B兩種循環(huán)寫法,哪一種比較好?為什么?
          A.for(int i=1;i<10;i++)????????????B.for(int i=0;i<x.length;i++)
          2.對(duì)象內(nèi)存回收的順序和什么有關(guān)?
          3.可不可以控制何時(shí)啟動(dòng)GC?

          try{
          FileInputStream f=FileInputStream("test.txt");
          System.out.println("Open file successed!");
          }
          catch(FileNotException fe){
          System.out.println("File not found!");
          }
          catch(IOException ie){
          System.out.println("IO??exception!");
          }
          catch(Exception e){
          System.out.println("General??Exception!");
          }
          finally{
          System.out.println("Do finally block!");
          }
          System.out.println("out of try block!");
          1.如果第2行代碼在運(yùn)行時(shí)出現(xiàn)異常,程序會(huì)輸出什么結(jié)果?
          A.Open file successed!????????????????????????????????????B.File not found!
          C.IO??exception!??????????????????????????????????????????????D.General??Exception!
          E.Do finally block!????????????????????????????????????????????F.out of try block!
          2.接第一題,.如果第2行代碼在運(yùn)行時(shí)沒有出現(xiàn)異常,程序會(huì)輸出什么結(jié)果?
          3.接第一題,.如果代碼在運(yùn)行時(shí)出現(xiàn)OutOfMemoryError異常,程序會(huì)輸出什么結(jié)果?
          4.f是個(gè)File類對(duì)象,它有個(gè)方法exists,用來(lái)檢查文件是否存在。下面那一段代碼最合適?
          A.Exception e=new IOException("File not found!");
          if(!exists)
          throw e;
          B.if(!exists)
          throw new IOException("File"+f.getName()+" not found!");
          C.if(!exists)
          throw new IOException;
          D..if(!exists)
          throw "File not found!";
          E.if(!exists)
          throw new IOException();

          1.說(shuō)明Frame使用pack何setSize這兩個(gè)方法的差別。
          2.使用GridBagLayout時(shí),需要設(shè)置那幾種屬性。
          3.用GridBagLayout來(lái)模擬BorderLayout.
          4.用java程學(xué)設(shè)計(jì)出如下的GUI界面。(組建可以設(shè)用Button類)
          posted @ 2006-03-27 16:49 黑咖啡 閱讀(460) | 評(píng)論 (0)編輯 收藏
          系統(tǒng)國(guó)際化最重要的一個(gè)方面就是支持多語(yǔ)言。
          將中文GB2312轉(zhuǎn)換成UTF-8的方法:

          new String(file.getFileName().getBytes(System.getProperty("file.encoding")), "UTF-8")

          這里的System.getProperty("file.encoding")是獲取系統(tǒng)默認(rèn)的編碼。測(cè)試在日文系統(tǒng)下也是可行的。

          補(bǔ)充一個(gè)UTF-8的轉(zhuǎn)換方法
          ?1public?static?String?toUtf8String(String?s)?{
          ?2??StringBuffer?sb?=?new?StringBuffer();
          ?3??for?(int?i?=?0;?i?<?s.length();?i++)?{
          ?4???char?c?=?s.charAt(i);
          ?5???if?(c?>=?0?&&?c?<=?255)?{
          ?6????sb.append(c);
          ?7???}
          ?else?{
          ?8????byte[]?b;
          ?9????try?{
          10?????b?=?Character.toString(c).getBytes("utf-8");
          11????}
          ?catch?(Exception?ex)?{
          12?????System.out.println(ex);
          13?????b?=?new?byte[0];
          14????}

          15????for?(int?j?=?0;?j?<?b.length;?j++)?{
          16?????int?k?=?b[j];
          17?????if?(k?<?0)
          18??????k?+=?256;
          19?????sb.append("%"?+?Integer.toHexString(k).toUpperCase());
          20????}

          21???}

          22??}

          23??return?sb.toString();
          24?}
          posted @ 2006-03-27 15:46 黑咖啡 閱讀(336) | 評(píng)論 (0)編輯 收藏
          最近工作中發(fā)現(xiàn)自己java底子還很差,決定鞏固一下.打算就手邊的一本《java2 編程指南》展開對(duì)java更深入的學(xué)習(xí)。

          不知道是否有更好的學(xué)習(xí)資料呢?

          posted @ 2006-03-27 09:44 黑咖啡 閱讀(234) | 評(píng)論 (0)編輯 收藏

          竟然不知道ERP的全稱

          記錄于下,以備后忘? 哈哈!
          MRP、MRPⅡ和ERP簡(jiǎn)介
          ?
          ?
          MRP、MRPⅡ和ERP,是企業(yè)管理信息系統(tǒng)發(fā)展的不同階段。MPR主要對(duì)制造環(huán)節(jié)中的物流進(jìn)行管理,使企業(yè)達(dá)到“既要保證生產(chǎn)又要控制庫(kù)存”的目的;而MRPⅡ則集成了物流和資金流,將人、財(cái)、物,時(shí)間等各種資源進(jìn)行周密計(jì)劃,合理利用,以提高企業(yè)的競(jìng)爭(zhēng)力;ERP的概念則由Garter Group率先提出,它將供應(yīng)鏈、企業(yè)業(yè)務(wù)流程和信息流程都囊括其中。由于ERP的概念流傳最廣,現(xiàn)在已經(jīng)成為企業(yè)管理信息系統(tǒng)的代名詞。


          現(xiàn)將有關(guān)信息化管理術(shù)語(yǔ)介紹如下:


          MRP(material requirement planning)物料需求計(jì)劃


          MRPⅡ(manufacturing resource planning)制造企業(yè)資源計(jì)劃


          ERP(enterprise resource planning)企業(yè)資源計(jì)劃


          MIS(management information system)管理信息系統(tǒng)


          OA(office automation)辦公自動(dòng)化


          BRP(business process reengineering)業(yè)務(wù)流程優(yōu)化


          CRM(customer relationship management)客房關(guān)系管理


          EIP(enterprise information portal)企業(yè)信息門戶


          EDI(electronic data interchange)電子數(shù)據(jù)交換


          HRM(human resource management)人力資源管理


          KM(knowledge management)知識(shí)管理


          SCM(supply chain management)供應(yīng)鏈管理


          EAI(enterprise application integration)企業(yè)應(yīng)用集成

          ?


          ?

          posted @ 2006-03-22 10:39 黑咖啡 閱讀(146) | 評(píng)論 (0)編輯 收藏
          祝自己狗年,進(jìn)步大大!
          posted @ 2006-02-05 10:29 黑咖啡 閱讀(129) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題
          共2頁(yè): 上一頁(yè) 1 2 

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          留言簿(2)

          隨筆分類(67)

          文章分類(43)

          Good Article

          Good Blogs

          Open Source

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阆中市| 札达县| 濮阳市| 崇仁县| 海阳市| 嘉善县| 淮安市| 彭阳县| 利津县| 五原县| 苗栗市| 南靖县| 望都县| 普兰县| 方城县| 蛟河市| 台南县| 眉山市| 灵山县| 怀远县| 兴义市| 罗山县| 元朗区| 台前县| 永德县| 垫江县| 津南区| 平远县| 深泽县| 普陀区| 娄底市| 柯坪县| 辽中县| 准格尔旗| 内黄县| 旺苍县| 惠水县| 兴仁县| 喜德县| 古浪县| 碌曲县|