posts - 78,  comments - 48,  trackbacks - 0
               摘要: 下面的代碼表現出使用set 帶來的好處。??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 黑咖啡 閱讀(374) | 評論 (0)編輯 收藏
          Coding 生涯已經有1年4個月了,雖然比較熟悉公司框架,用起來還比較熟練,但是回頭想想,其實自己還是停留在新手階段,與剛出學校的那些“大俠”們不相上下。特別是昨天看到我們的CTO-BridGu(相信去過javaeye的朋友沒有不知道這個名字的吧)給我改寫的一段程序以后,感覺自己的程序是那么的幼稚。絲毫沒有professional的感覺,很是慚愧!
          這個功能是一個解析String生成function的功能,當然格式要求非常嚴格的,而且格式驗證也是一個不可缺少,而且是非常重要的環節。
          不知道你看到這個功能腦子里面想到是什么樣的解決方案呢?我沒有多想,拿起來就當String來處理,split, substring etc.

          看看程序吧:
          下面是我的方法,暫且說是方法吧:
          ?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}

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

            寫入Blob字段和寫入其它類型字段的方式非常不同,因為Blob自身有一個cursor,你必須使用cursor對blob進行操作,因而你在寫入Blob之前,必須獲得cursor才能進行寫入,那么如何獲得Blob的cursor呢?

            這需要你先插入一個empty的blob,這將創建一個blob的cursor,然后你再把這個empty的blob的cursor用select查詢出來,這樣通過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob數據了。

            看下面的JDBC的demo,把oraclejdbc.jar這個二進制文件寫入數據庫表javatest的content字段(這是一個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 黑咖啡 閱讀(2279) | 評論 (1)編輯 收藏

          我用過的2個:

          1.xtreexloadtree,總體來說,實現還不錯,提供了一次性構建樹,和動態加載樹(生成指定格式的XML才可以),改變Style,功能中等,用法中等.

          2.yuitreeview,這也是不錯的實現,是Yahoo提供的,支持一次性構建,動態構建,改變Style,Menu樣式等等,功能很多,但用法比較復雜


          沒用過,只是聽說的

          3.dtree,比較中規中矩的一個實現,用法簡單,不支持動態加載。



          還有其他的好的js,大家可以補充。

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

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

          ?
          3.???????? 發行Java,生成調用說明
          ?
          在裝載了Java類后,就可以發行該Java類,并生成調用其方法的過程說明了。下面是完成該項任務的方法:
          ?




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

          使用Java開發函數
          函數用于返回特定數據。本節將通過創建用于返回作者的文章標題,以及某種類型的文章個數為例,說明使用Java開發函數的方法。如下圖所示:
          ?
          ?
          下面講述完成上述任務的方法和過程。
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(query_article.java):
          ?
          /* 導入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.jdbc.driver.*;
          ?
          /* 主類 */
          public class query_article {
          ?
          ? public static String auths_article(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數據庫的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構造動態SQL語句 */
          ??? 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語句抓取并拋出例外 */
          ??? try {
          ????? /* 準備動態SQL語句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql1);
          ????? /* 設置動態SQL參數值 */
          ????? pstmt.setString(1, code);
          ????? /* 執行查詢,并將結果保存到結果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環獲取并處理結果集數據 */
          ????? while(rset.next())
          ??????? auths_article =auths_article + rset.getString(1);
          ????? /* 關閉結果集 */
          ????? rset.close();
          ????? /* 關閉動態SQL語句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? auths_article = auths_article + "所編寫文章的標題如下:\n";
          ?
          ??? try {
          ????? /* 準備動態SQL語句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql2);
          ????? /* 設置動態SQL參數值 */
          ????? pstmt.setString(1, code);
          ????? /* 執行查詢,并將結果保存到結果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環獲取并處理結果集數據 */
          ????? while(rset.next()) {
          ??????? auths_article =auths_article + "??? " + rset.getString(1) + "\n";
          ????? }
          ????? /* 關閉結果集 */
          ????? rset.close();
          ????? /* 關閉動態SQL語句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return auths_article;
          ? }
          ?
          ? public static String query_type_article_number(String code)
          ? throws SQLException {
          ?
          ??? /* 建立到數據庫的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? /* 構造動態SQL語句 */
          ??? 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語句抓取并拋出例外 */
          ??? try {
          ????? /* 準備動態SQL語句 */
          ????? PreparedStatement pstmt = conn.prepareStatement(sql);
          ????? /* 設置動態SQL參數值 */
          ????? pstmt.setString(1, code);
          ? ????/* 執行查詢,并將結果保存到結果集中 */
          ????? ResultSet rset = pstmt.executeQuery();
          ????? /* 循環獲取并處理結果集數據 */
          ????? while(rset.next())
          ??????? article_number = article_number + rset.getString(1) + "篇";
          ????? /* 關閉結果集 */
          ????? rset.close();
          ????? /* 關閉動態SQL語句 */
          ????? pstmt.close();
          ??? } catch (SQLException e) {}
          ??? return article_number;
          ? }
          }
          ?
          2.???????? 裝載Java代碼及類到Oracle8i數據庫中
          ?
          在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數據庫中了。下面是完成這項任務的方法:

          ?
          3.???????? 發行Java,生成調用說明
          ?
          在裝載了Java類后,就可以發行該Java類,并生成調用其方法的函數說明了。下面是完成該項任務的方法:
          ?


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

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


          ?
          3.???????? 發行Java,生成調用說明
          ?
          在裝載了Java類后,就可以發行該Java類,并生成調用其方法的包了。下面是完成該項任務的方法:



          4.???????? 調用JSP
          ?
          在生成了調用Java方法的包后,就可以調用這些方法所對應的函數和過程了。例如:
          ?




          使用Java開發觸發器
          觸發器是一段存儲程序,當執行特定修改操作時,會觸發它,并執行其中的存儲程序。下面以記載表AUTHS作者工資更新情況的觸發器為例,說明使用Java開發觸發器的方法。如下圖所示:
          ?


          ?
          下面講述完成上述任務的方法和過程。
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(trigger.java):
          ?
          /* 導入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 {
          ?
          ??? /* 建立到數據庫的缺省連接 */
          ??? Connection conn = new OracleDriver().defaultConnection();
          ??? String sql = "INSERT INTO salary_audit VALUES(?,?,?)";
          ?
          ??? /* 使用try ... catch語句抓取并拋出例外 */
          ??? 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數據庫中
          ?
          在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數據庫中了。下面是完成這項任務的方法:
          ?


          3.???????? 發行Java,生成調用說明
          ?
          在裝載了Java類后,就可以發行該Java類,并生成調用其方法的過程說明及觸發器了。下面是完成該項任務的方法:




          ?
          4.???????? 調用JSP
          ?
          在創建了觸發器之后,當修改作者工資時會自動調用其中的存儲程序。例如:
          ?

          使用Java開發對象方法
          對象類型是一種用戶自定義的數據結構,它可以將數據類型、函數以及過程封裝到該數據結構中。對象方法是指對象類型中的函數和過程,本節將以獲取和增加對象工資信息為例,說明使用Java開發對象方法的方法。如下圖所示:

          ?
          下面講述完成上述任務的方法及過程:
          ?
          1.???????? 編寫Java源代碼
          ?
          程序清單如下(object_type.java):
          ?
          /* 導入Java類 */
          import java.sql.*;
          import java.io.*;
          import oracle.sql.*;
          import oracle.jdbc.driver.*;
          import oracle.oracore.*;
          import oracle.jdbc2.*;
          import java.math.*;
          ?
          /* 主類,實現了SQLData接口 */
          public class object_type implements SQLData {
          ?
          ? /* 聲明private變量,它們對應于對象類型的屬性 */
          ? private String code;
          ? private String name;
          ? private BigDecimal sex;
          ? private BigDecimal salary;
          ?
          ? /* 方法get_name():對象類型的方法,用于獲取對象姓名 */
          ? public String get_name() {
          ??? return name;
          ? }
          ?
          ? /* 方法get_salary():對象類型的方法,用于獲取對象工資 */
          ? public BigDecimal get_salary() {
          ??? BigDecimal sal = salary;
          ??? return sal;
          ? }
          ? /* 方法raise_salary():對象類型的方法,用于增加對象工資 */
          ? public void raise_salary(BigDecimal raise) {
          ??? salary = salary.add(raise);
          ? }
          ?
          ? /* 以下程序段實現了接口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數據庫中
          ?
          在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數據庫中了。下面是完成這項任務的方法:
          ?


          ?
          3.???????? 發行Java,生成調用說明
          ?
          在裝載了Java類后,就可以發行該Java類,并生成調用其方法的相應對象方法了。下面是完成該項任務的方法:
          ?



          ?
          4.???????? 調用JSP
          ?
          在創建了對象類型及對象方法之后,就可以調用這些對象方法了。例如:
          ?
          使用JDeveloper開發JSP
          本節以創建用于操縱ARTICLE表的JSP為例,說明使用JDeveloper 2.0開發JSP的方法。如下圖所示:

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

          ?
          2)??????? 選擇“File—>New Project”,此時會啟動新項目創建向導,并顯示如下對話框:
          ?

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

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

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

          ?
          6)??????? 單擊“Finish”,完成項目的創建過程,此時的圖形界面如下:
          ?

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


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

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

          ?
          4)??????? 雙擊“article.java”節點,會顯示編輯工作區。如下圖所示:
          ?

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

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

          ?
          3)??????? 單擊“Next”,此時會彈出如下對話框:
          ?

          ?
          4)??????? 單擊“Next”,此時會顯示如下對話框:
          ?

          ?
          5)??????? 單擊“Next”,此時會顯示如下對話框:
          ?

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

          ?
          7)??????? 單擊“New”創建數據庫連接,此時會彈出如下對話框:
          ?

          ?
          該對話框用于配置數據庫連接信息,按照你的數據庫設置來配置相應參數。完成數據庫連接的配置后,單擊“Test Connection”測試配置是否正確。如果配置不正確,則修改配置參數。
          ?
          8)??????? 單擊“OK”,此時會彈出如下對話框:
          ?

          ?
          在該對話框中顯示了相應的數據庫連接信息。
          ?
          9)??????? 單擊“Next”,此時會彈出如下對話框:
          ?

          ?
          10)???? 單擊“Finish”,此時會彈出如下對話框:
          ?

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

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

          ?
          13)???? 選擇“Methods”頁,此時的對話框如下所示:
          ?

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

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

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

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





          posted @ 2006-08-16 15:18 黑咖啡 閱讀(321) | 評論 (0)編輯 收藏
          Oracle開發人員 JAVA存儲過程
          利用Java存儲過程簡化數據庫操作

          作者:Kuassi Mensah

          利用Java存儲過程溝通SQL、XML、Java、J2EE和Web服務。

          存儲過程(stored procedure)允許將運行于數據庫層中的持久性邏輯與運行于中間層中的商務邏輯有效地分離開來。這種分離可以降低整個應用程序的復雜性,并提供其重用性、安全性、性能和可伸縮性。

          但是,妨礙存儲過程廣泛采用的一個主要障礙是不同數據庫廠商使用各種專有的、且依賴于數據庫的實現語言。使用基于Java的存儲過程可以解決這一問題。Oracle已經實現了ANSI標準,這些標準規定了從SQL中將靜態Java方法作為過程或函數進行調用的能力。這種實現被簡單地稱作"Java存儲過程"。

          在本文中,你將了解基于Java的存儲過程如何幫助簡化商務邏輯、提高其性能,并擴展數據庫的功能。本文將介紹Oracle如何在數據庫內啟用基于Java的存儲過程。還會介紹Java存儲過程如何訪問數據,以及如何創建基本Java存儲過程。

          選擇PL/SQL還是Java

          在考慮Oracle存儲過程時,你可能會想到PL/SQL。不過,從Oracle8i開始,Oracle已經在數據庫中支持Java,從而為存儲過程提供了不同于PL/SQL的開放式和可移植的方法。我可以聽到"$64 000問題":"我如何在PL/SQL和Java之間做出選擇?我是否應當忘記已經學習的所有PL/SQL相關知識,而變為一個Java天地的新手?"

          兩種語言都適用于數據庫編程,都有自己的優點和弱點。在決定選擇哪一種語言時,可以參考下面根據經驗得出的通用規則:


          對于要求與SQL進行無縫集成的數據庫中心來說則邏輯使用PL/SQL,從而完成對數據庫對象、類型和特性的訪問。


          出于與數據庫的無關性考慮時,可以選擇Java作為開放式的語言來取代PL/SQL,同時也為了集成和溝通SQL、XML、J2EE和Web服務等各個領域。
          OralceJVM使得Java可以運行在數據庫中

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

          創建Java存儲過程

          要將Java方法轉換為Java存儲過程需要幾個步驟,包括:用loadjava實用程序將Java類加載到數據庫中,利用調用規范(Call Spec)發布Java方法,將Java方法、參數類型和返回類型映射到其SQL的對應部分。下面部分說明如何完成這些步驟。

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


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

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


          loadjava -user scott/tiger Hello.class

          從Oracle9i版本2開始,loadjava允許通過為包含在被處理的類中的方法創建相應的Call Specs來自動將Java類發布為存儲過程。Oracle為開發、測試、調試和布置Java存儲過程提供了Oracle9i JDeveloper。

          The Resolver Spec

          基于JDK的JVM在列于CLASSPATH中的目錄中查找類引用,并對其進行解析。因為Oracle數據庫類存在于數據庫模式中,所以OracleJVM利用數據庫解析器(resolver)通過列于Resolver Spec中的模式查找并解析類引用。與CLASSPATH不同(CLASSPATH可以應用于所有的類),Resover Spec根據每類的情況進行應用。缺省解析器首先在加載類的模式中搜尋類,然后在公共同義詞(public synonyms)中搜索。


          ?loadjava -resolve <myclass>
          你可能需要指定不同的解析器,也可以在使用loadjava時強制進行解析,從而在布置時確定可能在以后運行時發生的任何問題。


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

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

          在我們的例子中,我們將利用SQL*Plus連接到數據庫,并為Hello.world()定義一個頂級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.
          可以像下面這樣調用Java存儲過程:


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

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

          高級數據訪問控制

          Java存儲過程可用于控制和限制對Oracle數據的訪問,其方法是只允許用戶通過存儲過程管理數據,而存儲過程在其調用者的權限內執行,而不能對表本身進行訪問。例如,你可以在特定時間內禁止更新數據,或者使管理者只具有查詢工資數據的權利,而不能進行更新,或者記錄所有的訪問并通知某一安全機構。

          原有應用程序與J2EE應用程序之間的數據邏輯共享

          因為原有應用程序與J2EE應用程序都通過Call Spec調用存儲過程,所以J2EE和非J2EE應用程序可以共享相同的數據邏輯。由于有了Call Spec,所以不用考慮所用的是何種實現語言(無論是PL/SQL還是Java),該數據邏輯都可以共享。

          為BMP實體Bean自動生成主關鍵字

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

          可以用以下三個步驟實現這一模式:
          >
          創建一個Java存儲過程,在公共GenPk類中定義一個公共靜態Java方法insertAccount()。此方法將插入數據、計算惟一的關鍵字(通過發出一個序列號),并返回計算出的關鍵字作為主關鍵字。


          定義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()內調用存儲過程


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

          查找器方法(Finder methods)用于檢索已存在的EJB實體bean實例。主關鍵字查找器使你能夠檢索惟一標識的EJB實例。對于CMP實體bean,EJB容器根據聲明描述,自動生成主關鍵字查找器findByPrimaryKey()方法。但是,在某些情況下,可能需要更多的控制,例如可能需要專門的查找器,如findByStoredProcKey()。在這些情況下,你可以結合使用Java存儲過程和對象關系框架(如Oracle9i應用服務器[Oracle9iAS] TopLink)來實現定制的主關鍵字查找器方法。在將EJB查找器定義為REDIRECT或NAMED查找器后,TopLink將生成一個SQL查詢用于檢索bean實例。

          數據驅動的EJB調用

          在數據驅動體系結構中,商務邏輯調用可以作為數據庫操作(如插入、更新或刪除)的結果來觸發。實現該數據邏輯的Java存儲過程可以被聲明為數據庫觸發器,用以調用運行于中間層J2EE應用服務器的EJB。EJB的調用既可以采用J2EE1.3兼容的服務器通過Interoperable Inter-ORB Protocol(IIOP)標準遠程方法調用(remote method invocation,RMI)實現,也可以通過銷售商特定的傳輸協議(如Oracle9iAS/Oc4J的ORMI,或者通過BEA WebLogic的T3)用RMI來實現。每個應用服務器提供商在提供基于IIOP的RMI,以提供互操作性的同時,都有其自己優化的協議。Oracle9iAS同時支持基于IIOP的RMI調用和基于ORMI協議的RMI調用。

          數據驅動的消息傳送

          Oracle9i數據庫嵌入了Advanced Queuing(AQ,高級排隊),它是一種集成的、穩定、可靠、安全、可擴展和事務處理式的消息排隊框架。Oracle通過標準的Java消息傳送系統(Java Messaging System,JMS)API為Java開發人員提供AQ功能。Java存儲過程可以通過JMS接口調用AQ操作,從而能夠實現快速、在會話期內、可擴展的、數據驅動的消息傳送。

          Java存儲過程可以利用JMS調用AQ操作。可以用以下4個步驟實現這一模式:


          創建并啟動JMS Queue(為此,可以將以下一些操作嵌入SQL腳本內):


          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');


          創建Java存儲過程(代碼摘錄如下):


          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+"'"); ..} }


          創建Call Spec:


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


          調用存儲過程:


          call jmsproc('hello');
          數據庫輔助的Web發布(緩沖失效)

          各應用程序結構必須面對的一個共同問題是如果可靠地將數據庫信息進行緩存,以提高整個系統的性能。JCACHE是一種即將公布的標準規范(JSR 107),它可以解決這一問題。它說明了一種對Java對象臨時在內存中進行緩存的方法,包括對象的創建、共享訪問、假脫機(spooling)、失效、各JVM的一致性等。它可被用于緩存JSP內最經常讀取的數據,如產品目錄和價格列表。利用JCACHE,多數查詢的反應時間會因為有緩存的數據而加快(內部測試表明反應時間大約快15倍)。

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

          Oracle9i數據庫第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

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

          了解作為Web服務的存儲過程
          otn.oracle.com/tech/webservices
          ?


          擴展數據庫的功能

          在數據庫中直接運行Java代碼的一個妙處就在于要實現新的功能,只需要簡單地加載代碼或庫,并利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的進入點(公共靜態方法)。Oracle9i數據庫用戶可以很容易地擴展數據庫

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

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

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

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

          結論

          Oracle數據庫與Java VM的集成可以創建可移植、功能強大和與數據庫無關的數據邏輯和持續性邏輯(persistence logic)。運行于中間層的商務邏輯和運行于數據庫層的數據邏輯之間的分離提高了應用程序的可擴展性、靈活性和可維護性。

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

          什么是存儲過程呢?

          定義:

          ????? 將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來, 那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。

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

          Microsoft公司為什么還要添加這個技術呢?

          那么存儲過程與一般的SQL語句有什么區別呢?

          存儲過程的優點:

          1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次? 就編譯一次,所以使用存儲過程可提高數據庫執行速度。

          2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。

          3.存儲過程可以重復使用,可減少數據庫開發人員的工作量

          4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權

          存儲過程的種類:

          ?????1.系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,

          ?????????????????????????????? 如 sp_help就是取得指定對象的相關信息
          ? 2.擴展存儲過程?? 以XP_開頭,用來調用操作系統提供的功能

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

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

          ?? 常用格式

          ?? Create procedure procedue_name

          ?? [@parameter data_type][output]

          ?? [with]{recompile|encryption}

          ?? as

          ??????? sql_statement

          解釋:?

          output:表示此參數是可傳回的

          with {recompile|encryption}

          recompile:表示每次執行此存儲過程時都重新編譯一次

          encryption:所創建的存儲過程的內容會被加密

          如:

          ?? 表book的內容如下

          ?? 編號??? 書名?????????????????????????? 價格

          ?? 001????? C語言入門?????????????????? $30

          ?? 002????? PowerBuilder報表開發? $52

          ?實例1:查詢表Book的內容的存儲過程

          ?? create proc query_book

          ????? as

          ????? select * from book

          ?? go

          ?? exec query_book

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

          ?? Create proc insert_book

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

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

          ?? as

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

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

          實例3:設有兩個表為Product,Order,其表內容如下:
          ????? Product
          ?????????? 產品編號?????? 產品名稱??? 客戶訂數????
          ??????????? 001???????????? 鋼筆???????? 30????????
          ??????????? 002???????????? 毛筆???????? 50????????
          ??????????? 003???????????? 鉛筆???????? 100???????
          ????? Order?
          ?????????? 產品編號???????? 客戶名???? 客戶訂金
          ??????????? 001????????????? 南山區????? $30
          ??????????? 002????????????? 羅湖區????? $50
          ??????????? 003????????????? 寶安區????? $4
          請實現按編號為連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
          總金額=訂金*訂數,臨時表放在存儲過程中

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

          posted @ 2006-08-16 11:53 黑咖啡 閱讀(241) | 評論 (0)編輯 收藏
          1、線程 新建線程運行機制。

          2、File IO? 文件建立,讀寫,刪除。?
          posted @ 2006-07-31 17:44 黑咖啡 閱讀(250) | 評論 (0)編輯 收藏
               摘要: 1 /**/ /* ??2 ?*?Made?In?GamVan.com ??3 ?*?Created?on?2005年3月18日,?下午8:37 ??4 ...  閱讀全文
          posted @ 2006-07-27 13:03 黑咖啡 閱讀(337) | 評論 (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();//在當前目錄下建立一個名為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對象,并得到它的一個引用
          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>
          取得虛擬目錄對應的磁盤路徑<br>
          Web站點主目錄的位置為<font color=#ff0000><%=request.getRealPath("/")%></font><br>
          JSP網頁所在的目錄位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
          JSP網頁所在目錄上一層目錄的位置<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>
          文件長度為:<%=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();//在當前目錄下建立一個名為ReaData.txt的文件
          %>
          <%=f.getName()%>的屬性如下:<br><br>
          文件長度為:<%=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);//建立當前目錄中文件的File對象
          File list[]=d.listFiles();//取得代表目錄中所有文件的File對象數組
          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對象,并實例化為fr
          //對FileReader類生成的對象使用read()方法,可以從字符流中讀取下一個字符。
          if(fr.read()==-1)//判斷是否已讀到文件的結尾
          {
          out.print("AtEnd.txt文件中沒有數據<br>");
          }else{
          out.println("AtEnd.txt文件中有數據");
          }
          fr.close();
          %>
          </body>
          </html>
          ??? <B>讀取所有的文件數據</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>讀取所有的文件數據</title>
          </head>
          <body>
          <%
          String path=request.getRealPath(".");
          FileReader fr=new FileReader(path + "\\ReadData.txt");
          //關鍵在于讀取過程中,要判斷所讀取的字符是否已經到了文件的末尾,
          并且這個字符是不是文件中的斷行符,即判斷該字符值是否為13。
          int c=fr.read();//從文件中讀取一個字符
          //判斷是否已讀到文件結尾
          while(c!=-1){
          out.print((char)c);//輸出讀到的數據
          c=fr.read();//從文件中繼續讀取數據
          if(c==13){//判斷是否為斷行字符
          out.print("<br>");//輸出分行標簽
          fr.skip(1);//略過一個字符
          //c=fr.read();//讀取一個字符
          }
          }
          fr.close();
          %>
          </body>
          </html>

            一行一行讀取數據

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

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

            將數據寫入文件

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

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

            將寫入文件的數據分行

          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="java.io.*"%>
          <html>
          <head>
          <title>將寫入文件的數據分行</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("請多多指教!");
          bw.newLine();//斷行
          bw.write("email: stride@sina.com");
          bw.flush();//將數據更新至文件
          fw.close();//關閉文件流
          out.println("寫入文件內容為:<br>");
          FileReader fr=new FileReader(path + "\\WriteData.txt");
          BufferedReader br=new BufferedReader(fr);
          String Line=br.readLine();//讀取一行數據
          while(Line!=null){
          out.println(Line + "<br>");
          Line=br.readLine();
          }
          fr.close();
          %>
          </body>
          </html>

            如何將數據追加寫入到文件

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

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

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

          J2EE學習者越來越多,J2EE本身技術不斷在發展,涌現出各種概念,本文章試圖從一種容易理解的角度對這些概念向初學者進行解釋,以便掌握學習J2EE學習方向。

            首先我們需要知道Java和J2EE是兩個不同概念,Java不只是指一種語言,已經代表與微軟不同的另外一個巨大陣營,所以Java有時是指一種軟件系統的流派,當然目前主要是.NET和Java兩大主流體系。

            J2EE可以說指Java在數據庫信息系統上實現,數據庫信息系統從早期的dBase、到Delphi/VB等C/S結構,發展到B/S(Browser瀏覽器/Server服務器)結構,而J2EE主要是指B/S結構的實現。

            J2EE又是一種框架和標準,框架類似API、庫的概念,但是要超出它們。如果需要詳細了解框架,可先從設計模式開始學習。

            J2EE是一個虛的大的概念,J2EE標準主要有三種子技術標準:WEB技術、EJB技術和JMS,談到J2EE應該說最終要落實到這三個子概念上。

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

            Web技術中除了Jsp/Servlet技術外,還需要JavaBeans或Java Class實現一些功能或者包裝攜帶數據,所以Web技術最初裸體簡稱為Jsp/Servlet+JavaBeans系統。

            談到JavaBeans技術,就涉及到組件構件技術(component),這是Java的核心基礎部分,很多軟件設計概念(設計模式)都是通過JavaBeans實現的。

            JavaBeans不屬于J2EE概念范疇中,如果一個JavaBeans對象被Web技術(也就是Jsp/Servlet)調用,那么JavaBeans就運行在J2EE的Web容器中;如果它被EJB調用,它就運行在EJB容器中。

            EJB(企業JavaBeans)是普通JavaBeans的一種提升和規范,因為企業信息系統開發中需要一個可伸縮的性能和事務、安全機制,這樣能保證企業系統平滑發展,而不是發展到一種規模重新更換一套軟件系統。

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

            J2EE應用系統開發工具有很多:如JBuilder、Eclipse等,這些IDE首先是Java開發工具,也就是說,它們首要基本功能是可以開發出JavaBeans或Java class,但是如果要開發出J2EE系統,就要落實到要么是Web技術或EJB技術,那么就有可能要一些專門模塊功能(如eclipse需要lomboz插件),最重要的是,因為J2EE系統區分為容器和應用兩個部分,所以,在任何開發工具中開發J2EE都需要指定J2EE容器。

            J2EE容器分為WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat實現的。所以你開發的Web應用程序可以在上面兩種容器運行,而你開發的Web+EJB應用則只可以在JBoss服務器上運行,商業產品Websphere/Weblogic等和JBoss屬于同一種性質。

            J2EE容器也稱為J2EE服務器,大部分時它們概念是一致的。

            如果你的J2EE應用系統的數據庫連接是通過JNDI獲得,也就是說是從容器中獲得,那么你的J2EE應用系統基本與數據庫無關,如果你在你的J2EE應用系統耦合了數據庫JDBC驅動的配置,那么你的J2EE應用系統就有數據庫概念色彩,作為一個成熟需要推廣的J2EE應用系統,不推薦和具體數據庫耦合,當然這其中如何保證J2EE應用系統運行性能又是體現你的設計水平了。

            衡量J2EE應用系統設計開發水平高低的標準就是:解耦性;你的應用系統各個功能是否能夠徹底脫離?是否不相互依賴,也只有這樣,才能體現可維護性、可拓展性的軟件設計目標。

            為了達到這個目的,誕生各種框架概念,J2EE框架標準將一個系統劃分為WEB和EJB主要部分,當然我們有時不是以這個具體技術區分,而是從設計上抽象為表現層、服務層和持久層,這三個層次從一個高度將J2EE分離開來,實現解耦目的。

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

            EJB為什么能將服務層從Jsp/Servlet手中分離出來,因為它對JavaBeans編碼有強制的約束,現在有一種對JavaBeans弱約束,使用Ioc模式實現的(當然EJB 3.0也采取這種方式),在Ioc模式誕生前,一般都是通過工廠模式來對JavaBeans約束,形成一個服務層,這也是是Jive這樣開源論壇設計原理之一。

            由此,將服務層從表現層中分離出來目前有兩種可選架構選擇:管理普通JavaBeans(POJO)框架(如Spring、JdonFramework)以及管理EJB的EJB框架,因為EJB不只是框架,還是標準,而標準可以擴展發展,所以,這兩種區別將來是可能模糊,被納入同一個標準了。 但是,個人認為:標準制定是為某個目的服務的,總要犧牲一些換取另外一些,所以,這兩種架構會長時間并存。

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

            前面談了服務層框架,使用服務層框架可以將JavaBeans從Jsp/Servlet中分離出來,而使用表現層框架則可以將Jsp中剩余的JavaBeans完全分離,這部分JavaBeans主要負責顯示相關,一般是通過標簽庫(taglib)實現,不同框架有不同自己的標簽庫,Struts是應用比較廣泛的一種表現層框架。

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

            持久層框架目前呈現百花齊放,各有優缺點的現狀,所以正如表現層框架一樣,目前沒有一個框架被指定為標準框架,當然,表現層框架現在又出來了一個JSF,它代表的頁面組件概念是一個新的發展方向,但是復雜的實現讓人有些忘而卻步。

            在所有這些J2EE技術中,雖然SUN公司發揮了很大的作用,不過總體來說:網絡上有這樣一個評價:SUN的理論天下無敵;SUN的產品用起來撞墻;對于初學者,特別是那些試圖通過或已經通過SUN認證的初學者,趕快擺脫SUN的陰影,立即開溜,使用開源領域的產品來實現自己的應用系統。

            最后,你的J2EE應用系統如果采取上面提到的表現層、服務層和持久層的框架實現,基本你也可以在無需深刻掌握設計模式的情況下開發出一個高質量的應用系統了。

            還要注意的是: 開發出一個高質量的J2EE系統還需要正確的業務需求理解,那么域建模提供了一種比較切實可行的正確理解業務需求的方法,相關詳細知識可從UML角度結合理解。

            當然,如果你想設計自己的行業框架,那么第一步從設計模式開始吧,因為設計模式提供你一個實現JavaBeans或類之間解耦參考實現方法,當你學會了系統基本單元JavaBean或類之間解耦時,那么系統模塊之間的解耦你就可能掌握,進而你就可以實現行業框架的提煉了,這又是另外一個發展方向了。

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

            推薦一套高質量的J2EE開源系統: JPestore
            
            如果初學者沒有理解,歡迎繼續討論,大膽提出你心中的疑問。

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

          連續幾天安裝配置和連接Mysql數據庫,今天終于成功了,回想這幾天,
          真的是甜酸苦辣都有,單mysql就重裝了不下10次,而在eclipse上編寫的連接數據庫的程序總是報錯.我都已經down了oracal準備放棄mysql了,不過...
          就象電視劇演的那樣,轉機總是在這個時候出現,先是看到了saulzy關于mysql4.1.11版本的安裝介紹,接著又找到了一款不錯的mysql 界面插件,
          最后在網友的幫助下把mysql的JDBC驅動配好并連通了.一連5天,日子真不好過阿,不過這個過程中,
          我也覺得自己學到不少東西,呵呵,反正都撐過來了,就要繼續往前走.現在,就這幾天弄的總結一下,希望對同是正在學習JAVA技術的同道中人能有幫助.

          我曾寫過一篇叫<<配置Eclpise+tomcat并實現JSP的編寫與部署>>,現在寫的這些算是它的后續.

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

          JDBC驅動
          下載版本:3.1.8
          http://dev.mysql.com/downloads/connector/j/3.1.html

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

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

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

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

          三.??? 環境配置
           首先,我要說明的是我現在
          tomcat的安裝路徑是: D:\Program Files\Java\Tomcat
          ? JDK的安裝路徑是:D:\Program Files\Java\j2sdk

          在這里,需要配置環境變量的是JDBC驅動.在配置前先要把剛才說到的mysql-connector-java-3.1.8-bin.jar本地硬盤某處(我放的地方:D:\Program Files\Java\mysqlforjdbc),然后根據你放的地方,配置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
          配置這個的目的是讓你的java應用程序找到連接mysql的驅動.

          配置完環境變量后還有很重要一步就是為JSP連接數據庫配置驅動,這個其實很簡單,就是把mysql-connector-java-3.1.8-bin.jar拷到某些文件夾里就行了,我在網上看了很多資料問了很多人,各種說法都有,我綜合了一下,為了保險,我都全做了,呵呵,反正就是拷一個400K的文件而已,現列出要把mysql-connector-java-3.1.8-bin.jar拷進去的文件夾,如下:
          D:\Program Files\Java\Tomcat\common\lib
          D:\Program Files\Java\Tomcat\shared\lib

          四.??? 數據庫的使用

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

          現在我想在mysql里建一個數據庫shujuku,以及在數據庫里建一個表biao.具體的命令如下(假設mysql我是剛安裝好的)

          ?

          ?


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

          ?


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


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

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

          剩下來的與標準sqsl命令基本上是一樣的,具體操作略
          值得一提的是,你在命令行上輸入"?",就會有mysql命令的簡單幫助,如圖八:
          ?

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

          五.??? 關于mysql-front的使用
          我找了好幾個mysql的界面工具,覺得最簡潔方便還是mysql-front,可惜的是要收費,不過還好有試用期,呵呵,可以先感受感受一下,最重要一點是mysql-front有簡體中文版的,英文不好的我用起來就舒服多了.下面簡單說說使用吧.
          首先,安裝就不用說了,有向導,而且很簡單.安裝好后第一次運行時會跳出來一個要求添加對話的框,在這里你可以添加例如上面已經設定好的shujuku,過程如圖九,十,十一:
          ?

          ?

          ?

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

          六.??? JSP連接mysql
          現在就是嘗試用jsp連接mysql了
          我在eclipse里建了個test_mysql.jsp頁面,代碼如下:

          <%@ page contentType="text/html; charset=gb2312" %>
          <%@ page language="java" %>
          <%@ page import="com.mysql.jdbc.Driver" %>
          <%@ page import="java.sql.*" %>
          <%
          ? //驅動程序名
          ? String driverName="com.mysql.jdbc.Driver";
          ? //數據庫用戶名
          ? String userName="cl41";
          ? //密碼
          ? String userPasswd="123456";
          ? //數據庫名
          ? String dbName="db";
          ? //表名
          ? String tableName="dbtest";
          ? //聯結字符串
          ? 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);
          ? //獲得數據結果集合
          ?? ResultSetMetaData rmeta = rs.getMetaData();
          ? //確定數據集的列數,亦字段數
          ?? int numColumns=rmeta.getColumnCount();
          ? // 輸出每一個數據值
          ?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("數據庫操作成功,恭喜你");
          rs.close();??
          statement.close();??
          connection.close();??
          %>??

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

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

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

          ?

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

          Java中關于時間的操作主要是:
          1、獲取當前時間,和某個時間進行比較。此時主要拿long型的時間值。
          ?方法如下:

          要使用
          java.util.Date 。獲取當前時間的代碼如下

          Date date = new Date();

          date.getTime() ;

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

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

          獲取時間的格式,需要用到一個專門用于時間格式的類 java.text.SimpleDateFormat

          首先,定義一個 SimpleDateFormat 變量

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

          這個構造函數的定義如下:

          SimpleDateFormat(String ? pattern, Locale ? locale)

          第一個參數 pattern ,我們后面再解釋,這里我們使用一個 "", 第二個參數,是用來設置時區的,這里用到了 java.util.Locale 這個類,這個類了面定義了很多靜態變量,直接拿過來用就 OK ,我們把時區設置為 Locale.SIMPLIFIED_CHINESE ,只看名字,這個靜態變量的意義已經很清楚了。

          ?

          接下來我們使用這個 SimpleDateFormat 把當前時間格式化為一個如下格式的時間字符串“ XXXX XX XX _XX XX XX 秒”,代碼:

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

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

          ?

          獲取時間格式的函數是 format ,這個函數的參數是 java.util.Date 對象,這個沒有什么花頭。

          要說明一下的是這個 pattern ,所謂的模式。這里, yyyy,MM,dd 等,這就是模式。

          我們可以在 SimpleDateFormat 的構造函數中指定模式,比如

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

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

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

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

          ?

          ?

          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 黑咖啡 閱讀(18889) | 評論 (1)編輯 收藏
          SAP R/3 是一個基于客戶/服務機結構和開放系統的、集成的企業資源計劃系統。其功能覆蓋企業的財務、后勤(工程設計、采購、庫存、生產銷售和質量等)和人力資源管理、SAP業務工作流系統以及因特網應用鏈接功能等各個方面。

          R/3
          應用軟體采模組化結構。它們既可以單獨使用,也可以和其它解決方案相結合。從流程導向的角度而言,各應用軟體間的整合程度越高,它們帶來的好處就越多。

          FI 財務會計 集中公司有關會計的所有資料,提供完整的文獻和全面的資訊,同時作為企業實行控制和規劃的最新基礎。

          TR 財務管理 是一個高效率財務管理完整解決方案,確保公司在世界范圍的周轉,對財務資產結構實行盈利化組合,并限制風險。

          CO 管理會計 是公司管理系統中規劃與控制工具的完整體系,具有統一的報表系統,協調公司內部處理業務的內容和過程。

          EC 企業控制 根據特制的管理資訊,連續監控公司的成功因素和業績指標。

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

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

          MM 物料管理 以工作流程為導向的處理功能對所有采購處理最佳化,可自動評估供應商,透過精確的庫存和倉儲管理降低采購和倉儲成本,并與發票核查相整合。

          PM 工廠維護 提供對定期維護、檢查、耗損維護與服務管理的規劃、控制和處理,以確保各操作性系統的可用性。

          QM 品質管理 監控、輸入和管理整個供應鏈與品質保證相關的各類處理、協調檢查處理、啟動校正措施、以及與實驗室資訊系統整合。

          PS 專案管理 協調和控制專案的各個階段,直接與采購及控制合作,從報價、設計到批準以及資源管理與結算。

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

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

          開放式資訊倉儲 包括智能資訊系統,該系統把來自R/3應用程式和外部來源的數據歸納成為主管人員資訊,不僅支援使用者部門決策和控制,同時也支援對成功具有關鍵作用的高階控制和監控。

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

          保持競爭領先地位端賴于公司建立有效并盡可能以客戶為導向的企業流程結構的能力。這就需要具備可最有效支援今后企業流程的資訊處理系統。

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

          R/3系統-企業流程的思維與行動。

          公司必須運用動態戰略對瞬息萬變的挑戰作出反應。迅速適應客戶新需求和市場新商機的能力,是贏得競爭勝利的決定性因素。此種適應力需要一個功能強大、開放式的基礎結構,它可針對目前的企業流程提供最佳化支援,并能靈活適應變化與發展。R/3系統就是應付這些挑戰的最佳解答,它是主從式架構上最普遍的標準商業應用軟件。

          SAP R/3系統具備以下功能和主要特點:

          功能性:R/3以模塊化的形式提供了一整套業務措施,其中的模塊囊括了全部所需要的業務功能并把用戶與技術性應用軟件相聯而形成一個總括的系統,用于公司或企業戰略上和運用上的管理。

          集成化: R/3把邏輯上聯的部分連接在一起。重復工作和多余數據被完全取消,規程被優化,集成化的業務處理取代了傳統的人工操作。

          靈活性:R/3系統中方便的裁剪方法使之具有靈活的適應性,從而能滿足各種用戶的需要和特定行業的要求。R/3還配備有適當的界面來集成用戶自己的軟件或外來的軟件。

          開放性:R/3的體系結構符合國際公認的標準,使客戶得以突破專用硬件平臺及專用系統技術的局限。同時,SAP提供的開放性接口,可以方便地將第三方軟件產品有效地集成到R/3系統中來。

          用戶友好:圖標與圖形符號簡化了人機交互時的操作。統一設計的用戶界面確保了工作人員能夠運用同樣的熟悉的技術從事不通的工作。

          模塊化:R/3的模塊結構使用戶既可以一個一個的選用新的實用程序,也可以完全轉入一個新的組織結構體系。

          可靠:作為用戶的商業伙伴SAP始終不斷地為集成化軟件的質量設立越來越多的國際標準。

          低成本高效益:信息處理是取得競爭優勢的要點之一。當競爭加劇時,企業必須更加努力地獲取其市場占有量。這就要使用高度集成化的數據處理軟件,而R/3正是這種軟件的優秀典范。

          國際適用:R/3支持多種語言,而且是為跨國界操作而設計的。R/3可以靈活地適應各國的貨幣及稅物要求。

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

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

          排名11-26的狗,似乎要學習5-15次才能學會簡單指令,它們遵守第一次指令的幾率是85%,對于稍微復雜的指令有時候反應會稍微遲緩一些,但只要勤加練習就能消除這種延緩狀況。當主人離它們較遠時,它們的反應有可能也稍微遲緩一些,不過,即使訓練人員經驗稍微不足,還是有辦法將這些狗調教得很優秀。

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

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


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

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

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



          ---------------------以下是轉載:
          smalltalk
          可是面向對象的程序設計語言的鼻祖阿,并且正在蓬勃的發展,沒有過時。它是純面向對象的語言,就連整數也是對象。開放環境也非常集成,如果感興趣可以到一下網站下載,絕對有耳目一新的感覺。舉個例子,

          循環語句在smalltalk中是向一個整數對象發送消息:

          10 timesRepeat: [ teresa moveRight: 10 ].

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


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

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

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

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


          Fortran.jpg?
          John Backus,Fortran之父

          Prolog.jpg?
          Alain Colmerauer, Prolog之父

          ada.jpg?
          Jean Ichbiah, Ada之父

            以上三人分別發明了Fortran、 Prolog和 Ada語言。這些語言都有著過人的優點,每一種在當時都可以稱得上是創意不凡。很可惜,三個當中沒有一個廣泛流傳。與之相對,下面的Brain Kernighan、Dennis Ritchie和Ken Thompson所“炮制” 出的C和Unix,已經使用了三十年了,也許再用100年也沒問題!

          C_BK.jpg?
          C語言宗師Brain Kernighan

          C_KT_DR.jpg?
          UNIX/C創造者Ken Thompson 和 Dennis Ritchie

            Round 2

            以下兩位分別是Alan Kay和Kristen Nygaard。是他們發明了第一批面向對象語言 Smalltalk和Simula 67。不過,這些語言都行之不遠。

          smalltalk.gif?
          Smalltalk之父Alan Kay

          simula.png?
          Simula 67之父Kristen Nygaard

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

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

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

            到這里,你能猜出點規律來嗎?

            答案揭曉:有大胡子——有旺運;沒胡子——只有干瞪眼!

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

          csharp.jpg?
          C#之父Anders Hejlsberg

          java.jpg?
          Java之父James Gosling

            Round 3

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

          basic.gif?
          Thomas Kurtz, Basic之父

          perl.jpg?
          Larry Wall, Perl之父

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

          python.jpg?
          Guido van Rossum, Python之父

          ruby1.jpg?
          松本行弘, Ruby語言之父

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

          ruby2.jpg?
            松本行弘:誰說俺長不出大胡子?

            看來, Ruby還是大有希望的!

            后記:從2005年發展的情況來看,Ruby的火爆再次證明的胡子定律的正確性。
          posted @ 2006-07-06 16:09 黑咖啡 閱讀(259) | 評論 (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開發人員指南(完整版)
          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 輕松進階
          URL: http://www.java-cn.net/book/books-zip/java11.zip
          G.書名: JavaBeans開發使用手冊
          URL: http://www.java-cn.net/book/books-zip/JavaBeansDevelop.zip
          H.書名:Java1.3API手冊
          URL: http://www.java-cn.net/book/books-zip/api.zip

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

          I.書名:SCJP認證筆記
          URL: http://vanstone.myetang.com/scjp/scjpnotes.rar
          J.書名:Sun培訓教材中文稿
          URL: http://vanstone.myetang.com/scjp/javabook/sl275cn.pdf
          K.書名:SCJP認證Bible
          URL: http://vanstone.myetang.com/scjp/scjpbible.rar
          L.書名:java開發規范(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用戶使用手冊(PDF)
          URL: http://www.cn-java.com/target/download.php?id=667&downurl=../download/book/UserGuide.pdf
          O.書名:JavaServerPages基礎
          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.書名:無廢話XML
          URL: http://www.cn-java.com/target/download.php?id=222&downurl=../download/tools/wfhxml_gb.zip

          R.書名:Design Pattens
          注釋:號稱軟件工程師的床頭必備書籍,非常經典,對面向對象思想在實踐應用中的模式做了經典性的總結
          URL: http://automation.seu.edu.cn/auto/content/Design.zip

          S.書名:設計模式 可復用面向對象軟件的基礎
          注釋:南京大學翻譯的Design Patterns的中譯本,機械工業出版社出版,翻譯質量較好
          URL: http://automation.seu.edu.cn/auto/content/DesignCh.zip

          T.書名:Thinking in Java with Patten
          注釋:與Thinking in Java為同一作者所著,設計模式與Java的結合
          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相結合的書 James w.Cooper著
          URL: http://automation.seu.edu.cn/auto/content/DesignJava.zip

          V.書名:Java 2 平臺安全技術-結構,API設計和實現
          注釋:來自china pub,PDF文檔,中譯本
          URL: http://automation.seu.edu.cn/auto/content/Java2Safe.zip

          W.書名:Mastering Enterprise JavaBeans
          注釋:Ed Roman著,EJB的優秀書籍
          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公司的經典教程,入門必讀
          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 虛擬機規范,有助于理解Java的實現原理,Sun出版
          URL:http://automation.seu.edu.cn/auto/content/vmspec.2nded.html.zip

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

          1O.書名:構建自己的 Java 庫
          注釋:此篇教程主要教您怎樣使用 Java 語言來構建自己的可重用的類庫。內容包括設計良好類庫的一些關鍵事項以及有效方法,為了更好的說明內容,教程還給出了一個簡單的類庫設計的例子。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-library/j-library.zip

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

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


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

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

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

          1U.書名:Java 語言基礎
          注釋:本教程介紹了 Java 編程語言,包括一些用來說明面向對象架構語言的語法的示例, 以及一些標準編程的練習,如定義實例方法,使用內嵌(built-in)類型,創建用戶自定義類型, 使用引用變量(
          reference variables)等。
          URL: http://www-900.ibm.com/developerWorks/cn/education/java/javaintro/tutorial/javaintro.zip


          1V.書名:JavaRMI入門實戰(實在找不到頁面下載,這是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解決方案開發實務
          URL:
          http://www.guxiang.com/epubcn/readings/diannaotushu/100/download/xmlsolution.zip
          posted @ 2006-07-06 10:34 黑咖啡 閱讀(336) | 評論 (0)編輯 收藏

          近段時間項目任務相對比較少,是一個很好補習java基礎的機會,列一些需要著重注意的地方:

          1、基礎。一切活動的根基,重點在語法和api的理解,應用。
          2、數據庫。oracle 9i
          3、struts
          4、hibernate
          5、sql語法

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

          posted @ 2006-07-04 15:32 黑咖啡 閱讀(224) | 評論 (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 黑咖啡 閱讀(185) | 評論 (0)編輯 收藏
          無意見發現了這篇文章
          關于《80前的前輩,你們都做了什么?!》一文對EasyJF團隊造成惡劣影響的聲明??
          http://www.aygfsteel.com/daxia/archive/2006/06/01/49391.html

          于是順著線索看到了2篇文章,也是80前的一代人何80后的一代人的對話,也許帶著些抱怨,也許帶著些抨擊,但是我并不能把這個定義為爭吵,或者是爭論。定義為對話,是因為我覺得主導自己人生的還是自己,自己的認識,自己的經歷。如果一概的把自己的成長依賴于前輩的影響社會的塑造,那創新一詞就該封存了。

          貼出2篇文章的鏈接:
          《80年代的兄弟,你會什么?!》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 黑咖啡 閱讀(197) | 評論 (0)編輯 收藏

          時間真的是飛逝,轉眼工作快一年了。

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

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

          通用惟一標識符是作為tModel 數據結構中的一部分,這種數據結構標識通用描述、發現,和整合(UDDI)注冊中的一種服務的類型(注冊服務的通用表示法)。這種機制可用來發現網絡服務。  

          通用惟一標識符還可以用來指向大多數的可能的物體。微軟和其他一些軟件公司都傾向使用全球惟一標識符(GUID),這也是通用惟一標識符的一種類型,可用來指向組建對象模塊對象和其他的軟件組件。第一個通用惟一標識符是在網羅計算機系統(NCS)中創建,并且隨后成為開放軟件基金會(OSF)的分布式計算環境(DCE)的組件。

          UUID,是128位整數(16字節)的全局唯一標識符(Universally Unique Identifier)。

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

          PS:在MMColdFusion技術支持中心找到一篇文章,其中提到使用CreateUUID()會將WIN平臺下的系統時間加快10毫秒,原因是JVM1.3.x?和1.4.x的bug,文章提到了解決方法。
          posted @ 2006-05-26 17:13 黑咖啡 閱讀(532) | 評論 (0)編輯 收藏
          <span title="第一行&#13;&#10;第二行">haha haha haha</span>
          posted @ 2006-05-19 12:07 黑咖啡 閱讀(378) | 評論 (0)編輯 收藏
          正在躊躇的時候發現下面的這段代碼,終于得意解決。苦于對js沒有足夠的熟悉,代碼中的具體方法參數還得繼續學習,感謝提供代碼的朋友。
          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;
          ????}
          ??}
          }

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

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

          WikiWiki一詞來源于夏威夷語的 "wee kee wee kee" ,原本是“快點”的意思。在這里WikiWiki指一種超文本系統。這種超文本系統支持面向社群的協作式寫作,同時也包括一組支持這種寫作的輔助工具。我們可以在Web的基礎上對Wiki文本進行瀏覽、創建、更改,而且創建、更改、發布的代價遠比HTML文本為小;同時Wiki系統還支持面向社群的協作式寫作,為協作式寫作提供必要幫助;最后,Wiki的寫作者自然構成了一個社群,Wiki系統為這個社群提供簡單的交流工具。與其它超文本系統相比,wiki有使用方便及開放的特點,所以wiki系統可以幫助我們在一個社群內共享某領域的知識。

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

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

          Wiki的歷史還不長,無論是Wiki概念自身,還是相關軟件系統的特性,還都在熱烈的討論中;所以怎樣的一個站點才能稱得上是一個Wiki系統還是有爭議的。與Wiki相關最近出現的技術還有Weblog,它們都降低了超文本寫作和發布的難度。這兩者都與內容管理系統關系緊密。

          Wiki的特點

          使用方便

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

          格式簡單:用簡單的格式標記來取代 HTML 的復雜格式標記。(類似所見即所得的風格)

          鏈接方便:通過簡單標記,直接以關鍵字名來建立鏈接(頁面、外部連接、圖像等)。

          命名平易:關鍵字名就是頁面名稱,并且被置于一個單層、平直的名空間中。

          有組織

          自組織的:同頁面的內容一樣,整個超文本的組織結構也是可以修改、演化的。

          可匯聚的:系統內多個內容重復的頁面可以被匯聚于其中的某個,相應的鏈接結構也隨之改變。

          可增長

          可增長:頁面的鏈接目標可以尚未存在,通過點擊鏈接,我們可以創建這些頁面,從而使系統得到增長。

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

          開放性

          開放的:社群的成員可以任意創建、修改、刪除頁面。

          可觀察:系統內頁面的變動可以被訪問者觀察到。

          相關條目

          Wiki引擎

          Web log

          內容管理系統

          群件

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

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

          從了解日本,到瓦解日本,最后達到占領日本的目的。于是我開始學日語了,哈哈!!!!

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

          甩甩頭。。。。。。還是得學啊。從現在坐起,合理安排時間,看來還是要把以前定計劃的習慣揀起來了(盡管以前定的計劃也沒幾個按照上面來的。。。暈)


          論成敗人生豪邁,大不了從頭再來。 --彪子

          posted @ 2006-04-02 13:12 黑咖啡 閱讀(192) | 評論 (0)編輯 收藏
          最近發現自己很多基礎問題都不明白。導出搜集。于是有這一貼:
          題目:
          1.java程序在保存文件時,后綴名是?
          2.java程序經過編譯過后,后綴名是?
          3.java程序文件保存時,主文件名是?
          4.如何用瀏覽器觀看輸出至命令行模式的結果?
          5.如何把一個java applet放到網頁上?
          6.public class??cjc extends java.applet.Applet{
          public static void main(String args[])
          {
          cjc mf=new cjc();
          mf.init();
          }
          public void init(){
          累加 累加數字 = new 累加(10);
          System.out.println(累加數字.總和());
          }
          }
          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;
          }
          }
          如果你想要計算a加到b的總和,如何修改?
          題目:
          1. 下面哪個是對的?
          A.IloveJava???? B.$20?? C.piggy@msl????D.Hello_worle?? E.2two???? F.sum+of+money
          2.下面可能產生什么結果?如果有錯如何改正?
          int i=5;
          int j=2;
          k=i*j;
          3.下面可能產生什么結果?如果有錯如何改正?
          float f=2.5;
          f=f*2;
          4.answer變量的數據類型應該是?
          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]的結果用一個float變量存放的話,程序應該如何編寫?
          題目:
          1.請問最后a,b變量的數值是?
          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.下列表達式,哪幾個是正確的?
          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.下列表達式,哪幾個x變量的值最后會是正數?
          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,哪幾個運算完,結果使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.下列的結果是?
          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="戊 ";
          用更簡單的方法寫出來(不能用邏輯表達式)
          2.寫一個程序,它能夠計算a加到b的總和,其中a不一定比b小。
          3.寫一個程序,它能夠把1到100中的質數顯示出來。
          4.寫一個程序,能夠從五個數字中跳出最大值。
          5.那些循環語句的寫法是正確的?
          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類運行的結果是什么?為什么?若把Q4_2類的第9行改成 Q4_1 q2=new Q4_2();??結果是多少?為什么?若把第11行改成 ((Q4_2) q2).method(); 結果是多少?為什么?
          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類中應該有哪些構造函數?
          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.錯在哪里?
          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.若一個抽象類種所有的方法都是抽象方法時,是不是可以改為接口?

          1.兩個對象作比較運算時,使用==運算符和equals方法有什么差別?
          2.如果讓一個類有復制能力,應該用那個接口?
          3.如何把一個對象用字符串表示出來?
          4.設計一個三角形和矩形類,修改它們的equals方法,如果兩個對象面積相同,則equals方法返回true

          1.如果有個int[0]型的數組x,你覺得A、B兩種循環寫法,哪一種比較好?為什么?
          A.for(int i=1;i<10;i++)????????????B.for(int i=0;i<x.length;i++)
          2.對象內存回收的順序和什么有關?
          3.可不可以控制何時啟動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行代碼在運行時出現異常,程序會輸出什么結果?
          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行代碼在運行時沒有出現異常,程序會輸出什么結果?
          3.接第一題,.如果代碼在運行時出現OutOfMemoryError異常,程序會輸出什么結果?
          4.f是個File類對象,它有個方法exists,用來檢查文件是否存在。下面那一段代碼最合適?
          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.說明Frame使用pack何setSize這兩個方法的差別。
          2.使用GridBagLayout時,需要設置那幾種屬性。
          3.用GridBagLayout來模擬BorderLayout.
          4.用java程學設計出如下的GUI界面。(組建可以設用Button類)
          posted @ 2006-03-27 16:49 黑咖啡 閱讀(466) | 評論 (0)編輯 收藏
          系統國際化最重要的一個方面就是支持多語言。
          將中文GB2312轉換成UTF-8的方法:

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

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

          補充一個UTF-8的轉換方法
          ?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 黑咖啡 閱讀(341) | 評論 (0)編輯 收藏
          最近工作中發現自己java底子還很差,決定鞏固一下.打算就手邊的一本《java2 編程指南》展開對java更深入的學習。

          不知道是否有更好的學習資料呢?

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

          竟然不知道ERP的全稱

          記錄于下,以備后忘? 哈哈!
          MRP、MRPⅡ和ERP簡介
          ?
          ?
          MRP、MRPⅡ和ERP,是企業管理信息系統發展的不同階段。MPR主要對制造環節中的物流進行管理,使企業達到“既要保證生產又要控制庫存”的目的;而MRPⅡ則集成了物流和資金流,將人、財、物,時間等各種資源進行周密計劃,合理利用,以提高企業的競爭力;ERP的概念則由Garter Group率先提出,它將供應鏈、企業業務流程和信息流程都囊括其中。由于ERP的概念流傳最廣,現在已經成為企業管理信息系統的代名詞。


          現將有關信息化管理術語介紹如下:


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


          MRPⅡ(manufacturing resource planning)制造企業資源計劃


          ERP(enterprise resource planning)企業資源計劃


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


          OA(office automation)辦公自動化


          BRP(business process reengineering)業務流程優化


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


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


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


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


          KM(knowledge management)知識管理


          SCM(supply chain management)供應鏈管理


          EAI(enterprise application integration)企業應用集成

          ?


          ?

          posted @ 2006-03-22 10:39 黑咖啡 閱讀(148) | 評論 (0)編輯 收藏
          祝自己狗年,進步大大!
          posted @ 2006-02-05 10:29 黑咖啡 閱讀(131) | 評論 (0)編輯 收藏
          僅列出標題
          共2頁: 上一頁 1 2 

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿(2)

          隨筆分類(67)

          文章分類(43)

          Good Article

          Good Blogs

          Open Source

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 香河县| 定远县| 集贤县| 博客| 安顺市| 莱芜市| 大竹县| 五峰| 威海市| 临高县| 白银市| 星子县| 菏泽市| 揭西县| 民县| 邹平县| 霍邱县| 北安市| 汉沽区| 贵德县| 醴陵市| 全南县| 兴安盟| 吉木乃县| 三穗县| 新郑市| 报价| 慈溪市| 苏尼特左旗| 太仆寺旗| 龙里县| 农安县| 革吉县| 隆化县| 溧阳市| 洞口县| 康定县| 永寿县| 怀安县| 黑龙江省| 黄浦区|