<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

    我用過的2個:

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

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


    沒用過,只是聽說的

    3.dtree,比較中規(guī)中矩的一個實現(xiàn),用法簡單,不支持動態(tài)加載。



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

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

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

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




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

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

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


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

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


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



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




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


    ?
    下面講述完成上述任務(wù)的方法和過程。
    ?
    1.???????? 編寫Java源代碼
    ?
    程序清單如下(trigger.java):
    ?
    /* 導(dǎo)入Java類 */
    import java.sql.*;
    import java.io.*;
    import oracle.jdbc.driver.*;
    /* 主類 */
    public class trigger {
    ?
    ? public static void log_salary(String name,float old_sal,float new_sal)
    ? throws SQLException {
    ?
    ??? /* 建立到數(shù)據(jù)庫的缺省連接 */
    ??? 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數(shù)據(jù)庫中
    ?
    在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務(wù)的方法:
    ?


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




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

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

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


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



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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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





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

    作者:Kuassi Mensah

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

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

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

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

    選擇PL/SQL還是Java

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

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


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


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

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

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

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

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


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

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


    loadjava -user scott/tiger Hello.class

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

    The Resolver Spec

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


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


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

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

    在我們的例子中,我們將利用SQL*Plus連接到數(shù)據(jù)庫,并為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.
    可以像下面這樣調(diào)用Java存儲過程:


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

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

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

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

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

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

    為BMP實體Bean自動生成主關(guān)鍵字

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

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


    定義Call Spec


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


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


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

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

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

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

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

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

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


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


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


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


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


    創(chuàng)建Call Spec:


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


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


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

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

    為了跟蹤原始數(shù)據(jù)的所有變化,并刷新已緩存的數(shù)據(jù),Java存儲過程會作為一個觸發(fā)器被附加在一個表上。這個表的任何變化都會自動調(diào)用該存儲過程,后者再調(diào)出一個已定義的JSP使JCACHE對象失效,該對象將其狀態(tài)映射到該數(shù)據(jù)庫表。在失效時,緊跟其后的查詢將強制緩存器根據(jù)數(shù)據(jù)庫的數(shù)據(jù)進行更新。 下面的步驟
    閱讀關(guān)于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數(shù)據(jù)庫第2版中的新PL/SQL特性
    otn.oracle.com/tech/pl_sql/pdf/
    Paper_30720_Doc.pdf

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

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

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

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


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

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

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

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

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

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

    結(jié)論

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

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

    什么是存儲過程呢?

    定義:

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

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

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

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

    存儲過程的優(yōu)點:

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

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

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

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

    存儲過程的種類:

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

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

    ????????????????????????????? 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:表示此參數(shù)是可傳回的

    with {recompile|encryption}

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

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

    如:

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

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

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

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

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

    ?? 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

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

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

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

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

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

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

    if(f.exists()){//檢查File.txt是否存在
    f.delete();//刪除File.txt文件
    out.println(path + "\\File.txt 存在,已刪除。");
    }else{
    f.createNewFile();//在當(dāng)前目錄下建立一個名為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>
    取得虛擬目錄對應(yīng)的磁盤路徑<br>
    Web站點主目錄的位置為<font color=#ff0000><%=request.getRealPath("/")%></font><br>
    JSP網(wǎng)頁所在的目錄位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
    JSP網(wǎng)頁所在目錄上一層目錄的位置<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();//在當(dāng)前目錄下建立一個名為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);//建立當(dāng)前目錄中文件的File對象
    File list[]=d.listFiles();//取得代表目錄中所有文件的File對象數(shù)組
    out.println("<font color=#ff0000>" + path + "目錄下的文件:</font><br>");
    for(int i=0;i<list.length;i++){
    if(list<I>.isFile()){
    out.println(list<I>.getName() + "<br>");
    }
    }
    out.println("<br><font color=#ff0000>" + path + "目錄下的目錄:</font><br>");
    for(int i=0;i<list.length;i++){
    if(list<I>.isDirectory()){
    out.println(list<I>.getName() + "<br>");
    }
    }
    %>
    </body>
    </html>

    判斷是否為空白文件

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

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

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

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

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

    <%@ page contentType="text/html;charset=gb2312"%>
    <%@ page import="java.io.*"%>
    <html>
    <head>
    <title>將數(shù)據(jù)寫入文件</title>
    </head>
    <body>
    <%
    String path=request.getRealPath(".");
    FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter對象,并實例化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();
    //讀取一行數(shù)據(jù)
    out.println(Line + "<br>");
    br.close();//關(guān)閉BufferedReader對象
    fr.close();
    %>
    </body>
    </html>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    JDBC驅(qū)動
    下載版本: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的文章,現(xiàn)在給出saulzy這篇文章的連接:
    http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx
    里面圖文并茂,說得非常清楚
    (在這里再一次感謝saulzy)

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

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

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

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

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

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

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

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

    ?

    ?


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

    ?


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


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

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

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

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

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

    ?

    ?

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

    六.??? JSP連接mysql
    現(xiàn)在就是嘗試用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.*" %>
    <%
    ? //驅(qū)動程序名
    ? String driverName="com.mysql.jdbc.Driver";
    ? //數(shù)據(jù)庫用戶名
    ? String userName="cl41";
    ? //密碼
    ? String userPasswd="123456";
    ? //數(shù)據(jù)庫名
    ? String dbName="db";
    ? //表名
    ? String tableName="dbtest";
    ? //聯(lián)結(jié)字符串
    ? String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
    ? Class.forName("com.mysql.jdbc.Driver").newInstance();
    ? Connection connection=DriverManager.getConnection(url);
    ? Statement statement = connection.createStatement();
    ? String sql="SELECT * FROM "+tableName;
    ? ResultSet rs = statement.executeQuery(sql);
    ? //獲得數(shù)據(jù)結(jié)果集合
    ?? ResultSetMetaData rmeta = rs.getMetaData();
    ? //確定數(shù)據(jù)集的列數(shù),亦字段數(shù)
    ?? int numColumns=rmeta.getColumnCount();
    ? // 輸出每一個數(shù)據(jù)值
    ?out.print("id");
    ?out.print("|");
    ?out.print("num");
    ?out.print("<br>");
    while(rs.next()) {
    out.print(rs.getString(1)+" ");??
    out.print("|");
    out.print(rs.getString(2));
    out.print("<br>");?
    }??
    out.print("<br>");
    out.print("數(shù)據(jù)庫操作成功,恭喜你");
    rs.close();??
    statement.close();??
    connection.close();??
    %>??

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

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

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

    ?

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

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

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

    Date date = new Date();

    date.getTime() ;

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

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

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

    首先,定義一個 SimpleDateFormat 變量

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

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

    SimpleDateFormat(String ? pattern, Locale ? locale)

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

    ?

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

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

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

    ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    靈活性:R/3系統(tǒng)中方便的裁剪方法使之具有靈活的適應(yīng)性,從而能滿足各種用戶的需要和特定行業(yè)的要求。R/3還配備有適當(dāng)?shù)慕缑鎭砑捎脩糇约旱能浖蛲鈦淼能浖?span lang="EN-US">

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

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

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

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

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

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

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

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

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

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

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


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

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

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



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

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

    10 timesRepeat: [ teresa moveRight: 10 ].

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


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

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

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

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


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

    Prolog.jpg?
    Alain Colmerauer, Prolog之父

    ada.jpg?
    Jean Ichbiah, Ada之父

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

    C_BK.jpg?
    C語言宗師Brain Kernighan

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

      Round 2

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

    smalltalk.gif?
    Smalltalk之父Alan Kay

    simula.png?
    Simula 67之父Kristen Nygaard

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

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

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

      到這里,你能猜出點規(guī)律來嗎?

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

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

    csharp.jpg?
    C#之父Anders Hejlsberg

    java.jpg?
    Java之父James Gosling

      Round 3

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

    basic.gif?
    Thomas Kurtz, Basic之父

    perl.jpg?
    Larry Wall, Perl之父

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

    python.jpg?
    Guido van Rossum, Python之父

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

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

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

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

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

    A.書名:《Thinking in Java》2e中文版 侯捷 / 王建興 合譯
    URL: http://jjhou.csdn.net/thinking-in-java-20010919.pdf
    B.書名:JBuilder5中文幫助文件
    URL: http://www.code-labs.com/manual/Jb5cn_help1.rar
    http://www.code-labs.com/manual/Jb5cn_help2.rar
    C.書名:Think in Java(中文版)---chm格式
    URL: http://www.code-labs.com/manual/Think%20In%20Java.chm
    D.書名:Jbuilder開發(fā)人員指南(完整版)
    URL: http://www.java-cn.net/book/books-zip/JbuilderGuide.zip
    E.書名:Java2編程詳解(Special_Edition_Using_Java)
    URL: http://www.java-cn.net/book/books-zip/Java2Xiangjie.zip
    F.書名:Java2 輕松進階
    URL: http://www.java-cn.net/book/books-zip/java11.zip
    G.書名: JavaBeans開發(fā)使用手冊
    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培訓(xùn)教材中文稿
    URL: http://vanstone.myetang.com/scjp/javabook/sl275cn.pdf
    K.書名:SCJP認證Bible
    URL: http://vanstone.myetang.com/scjp/scjpbible.rar
    L.書名:java開發(fā)規(guī)范(html)
    URL: http://www.cn-java.com/target/download.php?id=790&downurl=../download/book/javaformat.zip
    M.書名:EJB2.0 Entity bean(PDF)
    URL: http://www.cn-java.com/target/download.php?id=708&downurl=../download/book/EJB2.0.zip
    N.書名:J2ME用戶使用手冊(PDF)
    URL: http://www.cn-java.com/target/download.php?id=667&downurl=../download/book/UserGuide.pdf
    O.書名:JavaServerPages基礎(chǔ)
    URL: http://www.java-cn.net/book/books-zip/JSPIntro.zip
    P.書名:RMI Enhancements
    URL: http://www.cn-java.com/target/download.php?id=297&downurl=/download/tools/rmispecjdk12.zip
    Q.書名:無廢話XML
    URL: http://www.cn-java.com/target/download.php?id=222&downurl=../download/tools/wfhxml_gb.zip

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    Wiki的特點

    使用方便

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

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

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

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

    有組織

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

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

    可增長

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

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

    開放性

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

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

    相關(guān)條目

    Wiki引擎

    Web log

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

    群件

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

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

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

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

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


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

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

    題目:
    1.if(score >=90 && score <=100)
    finalScore="甲";
    else if (score >=80 && score <=90)
    finalScore="乙 ";
    else if (score >=70 && score <=80)
    finalScore="丙 ";
    else if (score >=60 && score <=70)
    finalScore="丁 ";
    else
    finalScore="戊 ";
    用更簡單的方法寫出來(不能用邏輯表達式)
    2.寫一個程序,它能夠計算a加到b的總和,其中a不一定比b小。
    3.寫一個程序,它能夠把1到100中的質(zhì)數(shù)顯示出來。
    4.寫一個程序,能夠從五個數(shù)字中跳出最大值。
    5.那些循環(huán)語句的寫法是正確的?
    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類運行的結(jié)果是什么?為什么?若把Q4_2類的第9行改成 Q4_1 q2=new Q4_2();??結(jié)果是多少?為什么?若把第11行改成 ((Q4_2) q2).method(); 結(jié)果是多少?為什么?
    01:????????public class Q4_1{
    02:????????public void method(int i){
    03:????????System.out.println(10);
    04:}
    05:}
    06:????????public class Q4_2 extends Q4_1{
    07:????????public static void main(String args{}){
    08:????????Q4_1 q1=new Q4_1();??????
    09:????????Q4_2 q2=new Q4_2();
    010:??????q1.method(1);????
    011:?? q2.method(2);
    012:}
    013:??????public void method(int k){
    014:??????System.out.println(20);
    015:}

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

    題目:
    1.錯在哪里?
    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.如果讓一個類有復(fù)制能力,應(yīng)該用那個接口?
    3.如何把一個對象用字符串表示出來?
    4.設(shè)計一個三角形和矩形類,修改它們的equals方法,如果兩個對象面積相同,則equals方法返回true

    1.如果有個int[0]型的數(shù)組x,你覺得A、B兩種循環(huán)寫法,哪一種比較好?為什么?
    A.for(int i=1;i<10;i++)????????????B.for(int i=0;i<x.length;i++)
    2.對象內(nèi)存回收的順序和什么有關(guān)?
    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行代碼在運行時出現(xiàn)異常,程序會輸出什么結(jié)果?
    A.Open file successed!????????????????????????????????????B.File not found!
    C.IO??exception!??????????????????????????????????????????????D.General??Exception!
    E.Do finally block!????????????????????????????????????????????F.out of try block!
    2.接第一題,.如果第2行代碼在運行時沒有出現(xiàn)異常,程序會輸出什么結(jié)果?
    3.接第一題,.如果代碼在運行時出現(xiàn)OutOfMemoryError異常,程序會輸出什么結(jié)果?
    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時,需要設(shè)置那幾種屬性。
    3.用GridBagLayout來模擬BorderLayout.
    4.用java程學(xué)設(shè)計出如下的GUI界面。(組建可以設(shè)用Button類)
    posted @ 2006-03-27 16:49 黑咖啡 閱讀(460) | 評論 (0)編輯 收藏
    系統(tǒng)國際化最重要的一個方面就是支持多語言。
    將中文GB2312轉(zhuǎn)換成UTF-8的方法:

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

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

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

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

    21???}

    22??}

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

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

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

    竟然不知道ERP的全稱

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


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


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


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


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


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


    OA(office automation)辦公自動化


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


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


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


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


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


    KM(knowledge management)知識管理


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


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

    ?


    ?

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

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

    留言簿(2)

    隨筆分類(67)

    文章分類(43)

    Good Article

    Good Blogs

    Open Source

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲免费人成视频观看| 免费a级毛片永久免费| 精品韩国亚洲av无码不卡区| 亚洲bt加勒比一区二区| 成人av免费电影| 成人久久免费网站| 亚洲精品无码永久在线观看男男 | 鲁丝片一区二区三区免费| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 一级免费黄色毛片| 亚洲福利一区二区| 亚洲色欲久久久综合网东京热| 最近最新的免费中文字幕| 久久99精品免费视频| 成年网在线观看免费观看网址| 亚洲av色香蕉一区二区三区| 日产久久强奸免费的看| 青青青亚洲精品国产| 一区二区三区在线免费观看视频| 永久免费av无码入口国语片| 天天影视色香欲综合免费| 蜜臀91精品国产免费观看| 美女视频黄是免费的网址| 午夜免费福利视频| 性生交片免费无码看人| 99爱在线精品免费观看| 2020因为爱你带字幕免费观看全集 | 美女黄频视频大全免费的| 亚洲精品无码专区久久| 国产精品成人免费观看| 黄色毛片免费网站| 久久精品免费观看国产| 久99久精品免费视频热77| 丁香花在线观看免费观看| 麻豆国产VA免费精品高清在线| 亚洲精品综合久久| 亚洲AV无码一区二区三区在线观看 | 亚洲欧洲一区二区三区| 亚洲日韩乱码久久久久久| 久久精品国产亚洲AV电影| 日韩精品一区二区亚洲AV观看 |