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

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

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

    Shao Fan

    關(guān)于JAVA與軟件工程
    posts - 31, comments - 71, trackbacks - 0, articles - 4
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2006年5月3日

    目前開發(fā)人員對系統(tǒng)開發(fā)的一個共識是使用三層架構(gòu),分為表示層,業(yè)務(wù)層,和持久層。而這三層之間的依賴關(guān)系如何?比較常見的一種看法是

    表示層 --> 業(yè)務(wù)層 --> 持久層

    這表明了層與層之間的調(diào)用關(guān)系,表示層通過調(diào)用業(yè)務(wù)層來完成任務(wù),而業(yè)務(wù)層則調(diào)用持久層。從另一個角度來看,一種依賴關(guān)系是

    表示層 --> 領(lǐng)域模型(Domain Model) <-- 持久層

    表示層和持久層都應(yīng)該理解(recognize)領(lǐng)域模型。而領(lǐng)域模型則是業(yè)務(wù)層的一部分。業(yè)務(wù)層正是系統(tǒng)的價值所在。雖說表示和持久也很重要,在某些系統(tǒng)中可以說是很關(guān)鍵,但是它們的最終目的都是為業(yè)務(wù)服務(wù),所以業(yè)務(wù)層應(yīng)該是系統(tǒng)的核心

    基于以上的認識,在系統(tǒng)設(shè)計的時應(yīng)首先分析需求得到領(lǐng)域模型,找出系統(tǒng)中的實體、對象(靜態(tài)的一面),并明確大致的業(yè)務(wù)流程(動態(tài)的一面)。 而另兩層應(yīng)盡最大努力為業(yè)務(wù)層服務(wù),且盡量減少業(yè)務(wù)層受另兩層的限制。


    各層的職責(zé):

    表示層:負責(zé)顯示信息,及從系統(tǒng)外部得到輸入。表示層的設(shè)計決定系統(tǒng)界面的可用性,及信息輸入和展示的可靠性。表示層只知道如何展示信息,及收集用戶輸入,并不知道該如何對這些輸入進行處理來完成業(yè)務(wù)。

    業(yè)務(wù)層:完成業(yè)務(wù)邏輯。業(yè)務(wù)層設(shè)計決定客戶價值是否能夠得到實現(xiàn)。這是系統(tǒng)的關(guān)鍵。外在的表現(xiàn)是功能性。業(yè)務(wù)層設(shè)計和實現(xiàn)的失誤表現(xiàn)在用戶端即功能缺失,功能不可靠等。如果需要對業(yè)務(wù)層的業(yè)務(wù)規(guī)則進行解耦,則可以使用規(guī)則引擎如Drools,把業(yè)務(wù)規(guī)則分離出來。但分離后的業(yè)務(wù)規(guī)則仍屬于業(yè)務(wù)層。業(yè)務(wù)層知道如何對用戶輸入進行處理,能夠應(yīng)用業(yè)務(wù)規(guī)則完成用戶所需的業(yè)務(wù),但它不知道數(shù)據(jù)如何讀取和保存。

    持久層:負責(zé)用戶信息的持久化。持久層的失誤表現(xiàn)在外即數(shù)據(jù)處理(儲存,展示等)不可靠。持久層完全不知道業(yè)務(wù),只專注于數(shù)據(jù)存儲和讀取。所謂持久化并不一定是指數(shù)據(jù)庫,任何方式的持久化(通過文件,網(wǎng)絡(luò)的持久化等)都應(yīng)由持久層完成。

    各層的設(shè)計都會直接影響系統(tǒng)性能。

    三層的體積大小和復(fù)雜度在不同的系統(tǒng)中可能會有很大的不同。比如說GOOGLE的搜索引擎,它的界面很簡單,可以想像表示層是比較容易實現(xiàn)的,而它的業(yè)務(wù)層,關(guān)系到處理關(guān)鍵字,分析搜索結(jié)果,決定排名等,而持久層則要負責(zé)處理超大量的數(shù)據(jù)。業(yè)務(wù)層和持久層則相當(dāng)復(fù)雜。而有的系統(tǒng)持久層會很小,比如殺毒軟件,媒體播放軟件等。業(yè)務(wù)層小而另兩層大的例子暫時還沒有想到:)


    posted @ 2007-09-08 19:45 shaofan 閱讀(5130) | 評論 (2)編輯 收藏

    help是一個內(nèi)置函數(shù),所謂內(nèi)置函數(shù),就是在Python中被自動加載的函數(shù),任何時候都可以用。參數(shù)分兩種:

    • 如果傳一個字符串做參數(shù)的話,它會自動搜索以這個字符串命名的模塊,方法,等。
    • 如果傳入的是一個對象,就會顯示這個對象的類型的幫助。

    比如輸入help(’print’),它就會尋找以’print’為名的模塊,類,等,找不到就會看到提示信息。而print在python里是一個保留字,和pass,return同等,而非對象,所以help(print)也會出錯((kkkkkkk))。

    舉個例子:

    1 help(’sys’) #會列出sys模塊的幫助
    2 = [1,2,3]
    3 help(a) #會顯示list的幫助
    4 help(a.append) #會顯示list的append方法的幫助

    python安裝自帶的library reference,2.1節(jié)是關(guān)于內(nèi)置函數(shù)的。

    Reference Manual的6.6節(jié)可以找到關(guān)于print的東東。

    posted @ 2007-06-05 06:28 shaofan 閱讀(2766) | 評論 (0)編輯 收藏

    Struts2默認theme是xhtml,它用表格來對表單中的控件進行排版。它也提供一個客戶端的js驗證功能,但是它的js腳本卻有些問題,在某些情況下,前次驗證的提示信息無法被清除,提示信息會不斷的累積顯示在屏幕上。而按照設(shè)計,每次提交表單時應(yīng)只顯示每次驗證的出錯信息。

    它的客戶端驗證的流程大概是這樣,用戶提交表單時,對各個控件的輸入按預(yù)先設(shè)置的規(guī)則進行驗證,如果有問題,則清除表單里原有的出錯提示信息,并寫入新的提示。其設(shè)計的功能是把出錯信息寫表格里出錯控件的上方,以便用戶看得更加清楚。問題就出在其用來清除原出錯信息的函數(shù),其代碼是這樣的(在struts.jar的template/xhtml目錄下可以找到):

     1 function clearErrorMessages(form) {
     2 
     3     var table = form.childNodes[1];
     4     iftypeof table == "undefined" ) {
     5         table = form.childNodes[0];
     6     }
     7 
     8     // clear out any rows with an "errorFor" attribute
     9     var rows = table.rows;
    10     var rowsToDelete = new Array();
    11     if (rows == null){
    12         return;
    13     }
    14 
    15     for(var i = 0; i < rows.length; i++) {
    16         var r = rows[i];
    17         if (r.getAttribute("errorFor")) {
    18             rowsToDelete.push(r);
    19         }
    20     }
    21 
    22     // now delete the rows
    23     for (var i = 0; i < rowsToDelete.length; i++) {
    24         var r = rowsToDelete[i];
    25         table.deleteRow(r.rowIndex);
    26         //table.removeChild(rowsToDelete[i]);
    27     }
    28 }


    看這個函數(shù)的前三行,它試圖取得form的第1個或第2個子節(jié)點,并把它作為table來處理(看接下來的幾行)。要想清除表格里的錯誤信息,首先要取得表格本身,這沒錯,但是如果第1個或第2個子節(jié)點不是table的話,腳本就會出錯,造成原出錯信息無法清除,這樣每次提交后的提示信息就會累積在屏幕上。

    要解決這個問題有兩個辦法:
    • 寫代碼時要小心,保證form的第1或2個子節(jié)點是table,不要在生成table前加其他代碼。
    • 或,修改xhtml的validation.js,使它總能獲得正確的table元素,重新打包到struts.jar。
    剛看了一下Struts的JIRA,已經(jīng)有人報告了這個問題(id WW-1802),而且這個bug在2.1版本中已經(jīng)解決了。

    posted @ 2007-06-03 17:56 shaofan 閱讀(2537) | 評論 (3)編輯 收藏

    假設(shè):用兩者寫一個最小的WEB程序。
    過程可以參照:
    1.struts的就太多了,隨便哪個都可以
    2.python/django可以看limodou寫的Django step by step

     

    Java/Struts/JSP  Python/Django
    開發(fā)步驟 1.在web.xml里配置struts的servlet
    2.在struts-config.xml里配置URL和action的映射
    3.寫action
    4.寫JSP
    1.在urls.py里配置URL到方法的映射
    2.寫相應(yīng)的方法
    3.寫HTML模板
    調(diào)用過程 1.根據(jù)web.xml的映射調(diào)用struts的servlet controller
    2.servlet controller根據(jù)struts-config.xml的映射調(diào)用相應(yīng)的action
    3.action處理請求
    4.JSP渲染顯示
    1.根據(jù)urls.py的映射調(diào)用相應(yīng)的方法
    2.方法處理請求
    3.HTML渲染顯示


    相比之下前者用了兩層才把一個HTTP請求映射到實際處理的方法:第一次是servlet的映射,第二次是struts action的映射。
    而django則一次就從URL映射到相應(yīng)的方法了。

    另外一個比較顯著的區(qū)別,也是基于java和python的語言上的區(qū)別吧,java的所有方法必需包含在一個類中,因此action mapping配置時是映射到類,而action在實現(xiàn)類則應(yīng)實現(xiàn)事先約定的方法(通過繼承或?qū)崿F(xiàn)接口)。而django則直接得多,可以直接在配置里寫明處理請求的方法名。


    posted @ 2007-04-06 19:11 shaofan 閱讀(4975) | 評論 (0)編輯 收藏

    DOM (Document Object Model)是一套語言無關(guān)的XML解析的接口定義。它定義了在XML解析中需要的類型,方法,以及屬性,比如如何獲得一個XML標(biāo)簽,如何改變標(biāo)簽的內(nèi)容,如何改變它的屬性,等等。

    DOM只是一個定義,并不是具體的實現(xiàn),它的目的就是為了讓大家在各個平臺上都能用相同的方式來處理XML,這樣一來,我只要了解DOM,基本上在各個平臺上都可以方便的處理XML,而不用重新學(xué)習(xí)了。比如說,Java, JavaScript, Python都有DOM的實現(xiàn),用它們來處理XML,方式基本上都是一樣的(當(dāng)然也有非DOM的XML解析方式)。在Java下,實現(xiàn)DOM的類庫就有很多,比如JDom,Xerces, 用GOOGLE一搜就一大把。現(xiàn)在Java 5.0內(nèi)置的就是Xerces。而JavaScript本身就內(nèi)置了DOM的實現(xiàn)。Python也默認安裝了DOM的庫。

    正因為DOM致力于實現(xiàn)各個平臺上對XML一致的處理方式,它定義了一堆自己的接口。因此在用DOM的時候,會有很多非NATIVE的東東。比如說,返回節(jié)點的子節(jié)點的方法,childNodes,返回的類型是NodeList。我第一次在Java上用,就以為是返回一個List,然后用get(n)方法來取得某元素。而實際上NodeList是用item(n)的方法來取得某元素的。這就讓我覺得很怪。而DOM正是用這種方式來獲得“語言無關(guān)”的能力的。

    DOM是用IDL(Interface Definition Language)來定義的。完整的定義可以在這里找到 http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html。IDL也很容易看懂。定義的1.1節(jié)列出了所有的接口。

    這些接口里,最重要而且常用的是Node,NodeList,Document,Element,Text,Attr這幾個。DOM把XML文檔看作一棵樹,樹上的每個元素都是Node。每個Node都屬于某個類型,比如Element,attribute,text等。這些類型就表明這個節(jié)點在XML文檔里的類型了。

    比如Node里有個屬性:

    ??readonly?attribute?unsigned? short ??nodeType;

    根據(jù)這個定義,對于取得的節(jié)點,我們就可以通過讀取nodeType這個屬性來判斷這個節(jié)點的類型。在Java里,所有的屬性都是用getter來取得的,因此對某節(jié)點n,就可以用n.getNodeType()取得它的類型。Node接口里也定義了類型常量:

    ??const?unsigned?short??????ELEMENT_NODE???????????????????=?1;
    ??const?unsigned?short??????ATTRIBUTE_NODE?????????????????=?2;
    ??const?unsigned?short??????TEXT_NODE??????????????????????=?3;
    ??const?unsigned?short??????CDATA_SECTION_NODE?????????????=?4;
    ??const?unsigned?short??????ENTITY_REFERENCE_NODE??????????=?5;
    ??const?unsigned?short??????ENTITY_NODE????????????????????=?6;
    ??const?unsigned?short??????PROCESSING_INSTRUCTION_NODE????=?7;
    ??const?unsigned?short??????COMMENT_NODE???????????????????=?8;
    ??const?unsigned?short??????DOCUMENT_NODE??????????????????=?9;
    ??const?unsigned?short??????DOCUMENT_TYPE_NODE?????????????=?10;
    ??const?unsigned?short??????DOCUMENT_FRAGMENT_NODE?????????=?11;
    ??const?unsigned?short??????NOTATION_NODE??????????????????=?12;

    用這些常量和和n.getNodeType()的結(jié)果比較,就可以知道它是不是某種類型。

    Node接口中也定義了一些方法,比如:

    ?Node?????appendChild(in?Node?newChild)????raises(DOMException);

    表明appendChild方法需要一個Node類型的參數(shù),返回一個Node。 具體的說明可以點文檔上的鏈接進去,也很容易看懂。

    Node接口里定義了操縱節(jié)點的方法,比如增加子節(jié)點,返回父節(jié)點,插入新節(jié)點,返回節(jié)點類型,等等。Document,Element等接口都繼承Node接口,因此在它們上面都可以使用操縱節(jié)點的方法。

    Document:代表整個XML文檔。所有DOM元素都不能用類似Java里new的方式來生成,而是要通過調(diào)用Document里的相應(yīng)方法來生成。因此它提供了生成諸如Element, Attr, Text的方法。比如createElement, createTextNode, createComment等。它也提供了名為getElementsByTagName的方法,用來通過標(biāo)簽名稱來取得其對象。比如getElementByTagName("ul")就可以獲得所有ul標(biāo)簽。它也提供一些文檔的屬性,比如xmlEncoding,inputEncoding等。它的一個屬性,documentElement代表文檔的根節(jié)點。所有對XML元素的操作,基本上都是從Document開始的。

    Element:代表一個XML標(biāo)簽。它可以有屬性,子標(biāo)簽,等。比如<ul id="booklist"><li>hello</li></ul>。標(biāo)簽ul是一個Element,它有一個屬性叫id,屬性的值是booklist。它有一個子結(jié)點li。li也是一個標(biāo)簽,它也有個子節(jié)點hello,是一個Text類型的節(jié)點。這個接口提供操縱其標(biāo)簽屬性的方法,比如getAttribute,setAttribute,removeAttribute等。它也提供了和Document中一樣的getElementsByTagName的方法,用來獲得在這個節(jié)點下的元素。

    Attr:代表標(biāo)簽中的屬性。比如上面的id。它也是一個Node。它有名字,值,也可以獲得它的所屬標(biāo)簽。

    Text:代表一段文字,比如上面的hello,它也一個Node,但比較特殊,它不是直接繼承Node,而是繼承CharacterData接口,后者繼承了Node。但是它不能有子節(jié)點。

    用JavaScript給一個例子。假設(shè)有一個HTML文檔:

    < html >< head >< title > Try?DOM </ title ></ head >< body >
    < ul >
    < li > hello </ li >
    < li > world </ li >
    </ ul >
    </ body ></ html >

    下面是增加一個li的JavaScript方法:

    ulList? = ?document.getElementsByTagName( " ul " );
    ul?????
    = ?ulList.item( 0 );
    txt????
    = ?document.createTextNode( " I?am?new?li " );
    li?????
    = ?document.createElement( " li " );
    li.appendChild(txt);
    ul.appendChild(li);

    用Java來寫,是這樣:

    NodeList?ulList? = ?document.getElementsByTagName( " ul " );
    Node??????? ul??????
    = ?ulList.item( 0 );
    Text????????? txt???? ?
    = ?document.createTextNode( " I?am?new?li " );
    Element??? li??? ????
    = ?document.createElement( " li " );
    li.appendChild(txt);
    ul.appendChild(li);

    可以看到處理方式和數(shù)據(jù)類型都是一樣的。如果要了解更多,可以看看DOM的定義,都是IDL。

    posted @ 2007-04-01 18:45 shaofan 閱讀(856) | 評論 (0)編輯 收藏

    我的博客已搬家,請移步到 http://shao-fan.com/blog 閱讀最新內(nèi)容!


    Ubuntu/Debian中的update-alternative用來對系統(tǒng)中不同版本的同個軟件進行管理。
    比如,系統(tǒng)中可能裝有GNU的Java編譯器,和SUN的Java編譯器。可以用update-alternatives來設(shè)置當(dāng)前使用它們中的哪一個。

    它的原理是在/usr/bin中建立一個link,指向/etc/alternatives中的一個文件,而些文件又是一個link,指向當(dāng)前使用的命令。比如java命令,查看如下:

     $ which java
    /usr/bin/java
    $ ls -l /usr/bin/java
    lrwxrwxrwx /usr/bin/java -> /etc/alternatives/java
    $ ls -l /etc/alternatives/java
    lrwxrwxrwx /etc/alternatives/java -> /usr/lib/j2re1.5-sun/bin/java
    $ ls -l /usr/lib/j2re1.5-sun/bin/java
    -rwxr-xr-x /usr/lib/j2re1.5-sun/bin/java

    參數(shù)--display可以某個軟件的當(dāng)前配置,如:

     $ /usr/sbin/update-alternatives --display java
    java - status is auto.
    link currently points to /usr/lib/j2re1.5-sun/bin/java
    /usr/lib/kaffe/bin/java - priority 300
    slave java.1.gz: /usr/share/man/man1/java.kaffe.1.gz
    /usr/lib/j2re1.5-sun/bin/java - priority 315
    slave java.1.gz: /usr/lib/j2re1.5-sun/man/man1/java.1.gz
    Current `best' version is /usr/lib/j2re1.5-sun/bin/java.

    status有auto和manual兩種。一旦用戶更改了系統(tǒng)的默認設(shè)置,它就變?yōu)閙anual。在auto的狀態(tài)下,系統(tǒng)會根據(jù)幾套配置的priority來判斷當(dāng)前應(yīng)該使用哪套配置。

    每套配置可以設(shè)定多個link,它們被稱為slave。上面的例子中,有兩套java的配置。一套是/usr/lib/kafe/bin/java,另一套是/usr/lib/j2re1.5-sun/bin/java,它們各有一個slave。在些例中這些slave設(shè)置的是java命令的 manual。當(dāng)更改了配置時,用man命令查看的幫助也會相應(yīng)更改。

    參數(shù)--config可以用來更改當(dāng)前的配置。

     $ sudo /usr/sbin/update-alternatives --config java 
    There are 2 alternatives which provide `java'.
    Selection Alternative
    -----------------------------------------------
    1 /usr/lib/kaffe/bin/java
    *+ 2 /usr/lib/j2re1.5-sun/bin/java
    Press enter to keep the default*, or type selection number: 1
    Using `/usr/lib/kaffe/bin/java' to provide `java'.

    參數(shù)--install用來設(shè)置一套新的配置。具體參見 http://blog.stevenkroon.com/2006/08/29/debian-update-alternatives/

    posted @ 2006-12-25 01:43 shaofan 閱讀(6308) | 評論 (1)編輯 收藏

    Web開發(fā)真是越來越有意思了。現(xiàn)在居然可以在JavaScript里直接調(diào)用Java寫的方法。大水牛Buffalo的最新版1.2.3發(fā)行離現(xiàn)在已有半年時間了,現(xiàn)在才注意到。在客戶端的代碼相當(dāng)簡單:

    buffalo.remoteCall("userService.listAll",[],function(reply){
     //?不用擔(dān)心,reply.getResult會從聰明的判斷服務(wù)器端遠程調(diào)用的結(jié)果類型。
     var?userList?=?reply.getResult();?
     var?firstUserFamilyName?=?userList[0].name.familyName;
    });

    給Web程序加上Buffalo也相當(dāng)容易。只要下載幾個jar文件放到lib目錄下,外加幾個JS文件,然后在web.xml里加一個Servlet即可。用的時候是需要有個properties文件來定義哪些JAVA方法可以被JS調(diào)用。而服務(wù)器端的JAVA代碼不需要做任何改動。

    暫時手頭上還想不起來哪些地方會用,但是這個東東可是我很久以前曾經(jīng)想過的,現(xiàn)在有人實現(xiàn)了,還是很激動人心的啊。Buffalo的主頁是 http://www.amowa.net/buffalo/zh/index.html?。


    posted @ 2006-09-08 03:59 shaofan 閱讀(8923) | 評論 (6)編輯 收藏

    最近因為Globus的原因,不得不用Linux了。以前幾次想學(xué),都因為難得要領(lǐng)放棄了。這次裝了Ubuntu,又碰巧在它的論壇上看到一篇很不錯的教程,終于有些“入門”的感覺了。看來找到合適的教程真的是很重要啊。這幾天用下來,感覺還真的很不錯。用Python寫了個顯示目錄樹的小程序。也不知道有沒有現(xiàn)成的,反正很簡單,剛好就練練手,功能也夠我自己用了:)

    下載Python腳本


    posted @ 2006-08-01 08:57 shaofan 閱讀(1501) | 評論 (0)編輯 收藏

    最近Firefox出了點問題。我這里用http proxy上網(wǎng),連接設(shè)置里要設(shè)置相應(yīng)的proxy。但發(fā)現(xiàn)每次重啟ff,連接設(shè)置都被重置為“直接連接”。即使改回“通過proxy連接”,下次重啟又被重置了。

    馬上google一把,發(fā)現(xiàn)類似的問題大致有兩種解決辦法:
    1.進入safe mode,會出現(xiàn)一個對話框,把三個選項都勾上,重啟。
    2.在地址欄輸入about:config,會出現(xiàn)所有的配置,把要改的改了即可。
    3.直接修改prefs.js文件。

    但這三個方法對偶的FF都不管用。

    最后的解決方法是,刪除
    C:\Documents and Settings\<user name>\Application Data\Mozilla\Firefox\Profiles\<xxxxxxxx.default>\
    下的user.js,然后再修改prefs.js。然后一切都正常了。

    原來,ff最基本的配置文件是prefs.js。而user.js的優(yōu)先級應(yīng)該是比prefs.js高,因此每次重啟它都從user.js讀取配置。而通過正常途徑,如在選項菜單里改設(shè)置,無法在user.js里保存(不知道為什么)。所以就造成了每次重啟配置被重置的情況,其實就是設(shè)置無法被保存。把user.js刪掉以后,ff就從prefs.js里讀取配置了,而且新的設(shè)置也可以正常保存。

    不管是從選項菜單里修改配置,還是以上的第二種方法,最終的結(jié)果都是配置被保存在prefs.js文件里,效果都是一樣的。

    目前已知的會私自修改FF配置的軟件只有Hide IP Plantium,而以上情況正是在安裝Hide IP Plantium以后出現(xiàn)的。用的時候要注意。

    相關(guān)的討論在mozillazine里有很多。不得不承認,這類的英文資源要比中文的多得多。看這里的詳細討論:
    http://forums.mozillazine.org/viewtopic.php?t=413875&postdays=0&postorder=asc&postsperpage=15&start=15

    posted @ 2006-07-24 18:21 shaofan 閱讀(4635) | 評論 (2)編輯 收藏

    1.理解頁面流(flow),理解幾種不同的定位方式:static, relative, absolute等
    Positioning and other definitions:http://css.maxdesign.com.au/floatutorial/definitions.htm ?

    2.HTML頁面表達內(nèi)容邏輯,把樣式控制寫到CSS文件中

    3.浮動(float)的DIV要配合width屬性來用

    4.怎樣控制層的位置:用float,padding,width,height這些屬性來控制
    Float Tutorial: http://css.maxdesign.com.au/floatutorial/index.htm

    5.設(shè)置可見的border或background-color來幫助排版

    6.出現(xiàn)內(nèi)層的DIV跑到外層之外的情況時,可以在外層DIV的</DIV>前加上一個clear層來解決問題。就是這樣:
    ?? <div class="container">
    ?? ?...
    ?? ?...
    ?? ?<div class="clear"></div>
    ? </div>

    ? css:
    ? .clear{
    ?? ?clear:both;
    ? }

    7.樣式表的選擇符(Selector):
    ?? Type/Class/ID等
    ? Selector Tutorial:http://css.maxdesign.com.au/selectutorial/index.htm

    8.關(guān)于表單的樣式設(shè)計:
    讓我們更好的設(shè)計表單:淺議Web的表單設(shè)計 http://tech.163.com/06/0529/04/2I8UPHTB0009158Q.html
    用CSS制作具有親和力的表單 作者:greengnn
    http://www.jluvip.com/blog/article.asp?id=192

    9.各種瀏覽器對各種標(biāo)簽用不同的方式渲染,如p, h1, ul等,它們會有不同的padding和margin,為了在各種瀏覽器下都正常的顯示,可以把它們清零,如:
    *{
    ?? ?padding:0;
    ?? ?margin:0;
    }

    10.使用list來顯示數(shù)據(jù)或菜單
    List Tutorial:
    http://css.maxdesign.com.au/listamatic/
    http://css.maxdesign.com.au/listamatic2/
    http://css.maxdesign.com.au/listutorial/

    11.關(guān)于各種標(biāo)準,布局,技巧等的網(wǎng)站:
    網(wǎng)頁設(shè)計師:http://www.w3cn.org/
    CSS教程:http://www.netvtm.com/w3s/css/
    網(wǎng)頁制作指導(dǎo) - 致力于網(wǎng)頁制作知識的普及:http://www.jianzhan8.cn/
    當(dāng)然還有必不可少的經(jīng)典論壇blueidea:http://www.blueidea.com/bbs/list.asp?GroupName=%CD%F8%D2%B3%B1%EA%D7%BC%BB%AF%D7%A8%C0%B8

    posted @ 2006-06-21 06:22 shaofan 閱讀(933) | 評論 (0)編輯 收藏

    如果你不幸裝了NetBeans并且啟用了外置的服務(wù)器,那么它會自動在你的web server的web.xml里添加一個filter,名叫HttpMonitorFilter。你用NetBeans時,它會過濾所有的http請求,這樣NetBeans就可以顯示所有的相關(guān)信息。但是如果不用NetBeans,比如我,用eclipse + Tomcat ,那就會得到這個異常:

    NotifyUtil::java.net.ConnectException:?Connection?refused:?connect
    ??at?java.net.PlainSocketImpl.socketConnect(Native?Method)
    ??at?java.net.PlainSocketImpl.doConnect(Unknown?Source)
    ??at?java.net.PlainSocketImpl.connectToAddress(Unknown?Source)
    ??at?java.net.PlainSocketImpl.connect(Unknown?Source)
    ??at?java.net.Socket.connect(Unknown?Source)
    ??at?java.net.Socket.connect(Unknown?Source)
    ??at?sun.net.NetworkClient.doConnect(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.openServer(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.openServer(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.New(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.New(Unknown?Source)
    ??at?sun.net.www.http.HttpClient.New(Unknown?Source)
    ??at?sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown?Source)
    ??at?sun.net.www.protocol.http.HttpURLConnection.connect(Unknown?Source)
    ??at?sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown?Source)
    ??at?org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)



    解決方法是

    第一步. 刪除 Tomcat目錄中common\lib下的兩個和netbeans有關(guān)的jar文件(以org-netbeans開頭的)

    第二步. 修改tomcat目錄下的conf\web.xml,刪除相關(guān)Filter的定義,就是這一段:

    ????<filter>
    ????????
    <filter-name>HTTPMonitorFilter</filter-name>
    ????????
    <filter-class>
    ????????????org.netbeans.modules.web.monitor.server.MonitorFilter
    ????????
    </filter-class>
    ????????
    <init-param>
    ????????????
    <param-name>netbeans.monitor.ide</param-name>
    ????????????
    <param-value>127.0.0.1:8082</param-value>
    ????????
    </init-param>
    ????
    </filter>
    ????
    <filter-mapping>
    ????????
    <filter-name>HTTPMonitorFilter</filter-name>
    ????????
    <url-pattern>/*</url-pattern>
    ????????
    <dispatcher>REQUEST</dispatcher>
    ????????
    <dispatcher>FORWARD</dispatcher>
    ????????
    <dispatcher>INCLUDE</dispatcher>
    ????????
    <dispatcher>ERROR</dispatcher>
    ????
    </filter-mapping>

    posted @ 2006-06-13 20:37 shaofan 閱讀(1045) | 評論 (0)編輯 收藏

    據(jù)英國的職位搜索引擎Workcircle的調(diào)查顯示,93%的IT經(jīng)理人和幾乎所有的CEO和CTO會在英格蘭隊比賽的那天請病假。相比之下,程序員的請假的比例要低得多,JAVA程序員為86%,而最可憐的是SQL程序員,只有14%。更搞笑的是WikiHow上還有一個“怎樣請病假”的教程。

    原文如下:

    Managers most likely to take a sickie to watch England play

    9 June 2006, Cambridge UK – UK job site, Workcircle ran a survey this week asking how likely jobseekers are to take a sick day to watch an England World Cup match.

    World cup surveyThe results show the deep divide between workers and management, just 14% of Engineers surveyed will take a sickie to watch a match, but a shocking 93% of managers will.

    And it gets worse the higher you get – all CEOs and CTOs surveyed will take a day off.

    As far as the developers go, Java programmers are the most patriotic – 86% would call in sick to watch a match, compared to 14% of hard-working SQL developers.

    So when the boss is in an unexplained long meeting during the World Cup, check if there’s an England match on!

    posted @ 2006-06-12 06:45 shaofan 閱讀(687) | 評論 (0)編輯 收藏

    適用于webwork 2.2.2,詳見隨包文檔。源文件下載:Hello.rar

    一共五步:

    1.建立web應(yīng)用程序的目錄結(jié)構(gòu)
    2.拷貝庫文件:ww安裝目錄下的lib\default中的所有jar,以及webwork-2.2.2.jar,復(fù)制到WEB-INF\lib下。
    3.生成配置文件:web.xml在WEB-INF下, xwork.xml在WEB-INF\classes下

    web.xml:
    <?xml?version="1.0"?encoding="ISO-8859-1"?>
    <!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.3//EN"?"http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>

    ????
    <display-name>My?First?Hello?Webwork</display-name>

    ????
    <filter>
    ????????
    <filter-name>webwork</filter-name>
    ????????
    <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    ????
    </filter>

    ????
    <filter-mapping>
    ????????
    <filter-name>webwork</filter-name>
    ????????
    <url-pattern>/*</url-pattern>
    ????
    </filter-mapping>

    ????
    <welcome-file-list>
    ????????
    <welcome-file>index.jsp</welcome-file>
    ????
    </welcome-file-list>

    ????
    <taglib>
    ????????
    <taglib-uri>/webwork</taglib-uri>
    ????????
    <taglib-location>/WEB-INF/lib/webwork-2.2.2.jar</taglib-location>
    ????
    </taglib>
    </web-app>


    xwork.xml:
    <!DOCTYPE?xwork?PUBLIC?"-//OpenSymphony?Group//XWork?1.1.1//EN"?"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">

    <xwork>
    ????
    <!--?Include?webwork?defaults?(from?WebWork?JAR).?-->
    ????
    <include?file="webwork-default.xml"?/>

    ????
    <!--?Configuration?for?the?default?package.?-->
    ????
    <package?name="default"?extends="webwork-default">
    ????
    </package>
    </xwork>


    4. 編寫action和jsp
    5. 在xwork.xml中添加相應(yīng)配置,如在package之間加入:
    ????????<default-interceptor-ref?name="completeStack"/>
    ????????
    <action?name="helloww"?class="net.blogjava.shaofan.helloww.Hello">
    ????????????
    <result?name="success">greetings.jsp</result>
    ????????
    </action>


    下步計劃:
    * 了解package
    * ww的taglibs
    * 在action和jsp間傳遞數(shù)據(jù)的機制(struts中使用formbean,利用session,request等)

    posted @ 2006-06-04 09:13 shaofan 閱讀(2302) | 評論 (7)編輯 收藏

         摘要: 在這篇文章里,Nick Afshartous描述了一種把HTML的內(nèi)容轉(zhuǎn)換為PDF格式的方法。這種方法相當(dāng)有用,比如說,一個web程序可以在它的頁面上提供如“下載為 PDF”的功能。這種功能方便了打印和儲存,以供日后使用。Afshartous的轉(zhuǎn)換方法只使用開源的組件。也有一些商業(yè)產(chǎn)業(yè)可供使用。因此,在這篇文章里描述的這種方法既在價格上可以承擔(dān),又能夠獲得所用組件的源碼。(1600字;2006年4月10日)   閱讀全文

    posted @ 2006-06-01 07:56 shaofan 閱讀(3545) | 評論 (10)編輯 收藏

         摘要: 在這篇文章里,Nick Afshartous描述了一種把HTML的內(nèi)容轉(zhuǎn)換為PDF格式的方法。這種方法相當(dāng)有用,比如說,一個web程序可以在它的頁面上提供如“下載為PDF”的功能。這種功能方便了打印和儲存,以供日后使用。Afshartous的轉(zhuǎn)換方法只使用開源的組件。也有一些商業(yè)產(chǎn)業(yè)可供使用。因此,在這篇文章里描述的這種方法既在價格上可以承擔(dān),又能夠獲得所用組件的源碼。(1600字;2006年4月10日)
      閱讀全文

    posted @ 2006-05-30 06:15 shaofan 閱讀(5684) | 評論 (7)編輯 收藏

    天差點栽在JAVA路徑設(shè)置上。

    本來是想用ANT的。但是在命令行輸入ant,得到了這樣的提示:

    Usage: java [-options] class [args...]
    ?????????? (to execute a class)
    ?? or? java [-options] -jar jarfile [args...]
    ?????????? (to execute a jar file)

    ?? ??? ......
    ?? ??? ......

    奇怪。想來是剛重裝了系統(tǒng),JAVA_HOME沒有設(shè)好。于是檢查了一遍。問題依舊。那是不是虛擬機的問題?虛擬機缷掉重裝。折騰了半天,問題還是沒有解決。

    逼得我只能靜下心來仔細想想問題所在了。ant的命令執(zhí)行的是一個批處理文件,在這個批處理中它會調(diào)用java.exe來運行ant。出現(xiàn)這樣的問題,必定是java.exe的用法格式不對了。于是打開ant.bat,發(fā)現(xiàn)它的執(zhí)行有幾個分支。在每個分支上加上一句echo b1, echo b2,再次運行,確定是哪個分支被執(zhí)行。被運行的語句分支就是這個了:

    :runAntWithClasspath
    "%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%
    goto end

    OK。現(xiàn)在幾乎可以肯定是那一堆%%的變量里出了問題。拿出我們程序員百試不爽的絕招的時候了:打印每個變量。哈哈,問題出來了:

    "D:\lib\apache-ant-1.6.5\\lib\ant-launcher.jar"

    看到了嗎?"lib"前面居然是兩個反斜杠杠。OK。發(fā)現(xiàn)了問題所在,現(xiàn)在是解決的時候了。打開系統(tǒng)變量ANT_HOME,果然,它被設(shè)置為"D:\lib\apache-ant-1.6.5\"。把最后的反斜杠去掉。再試運行ant,得到:

    Buildfile: build.xml does not exist!
    Build failed

    ant可以正常運行,問題解決了。

    這個小小的問題前后用了我快一個小時的時間。但是最后真正發(fā)現(xiàn)并解決問題的時間也不過十分鐘而已。看來還是太浮躁了。如果一開始就用心去想,也不會有這么多的浪費。想想,為什么那后面會多一個\,其實也很簡單,從WINDOWS的地址欄直接拷貝的咯。Windows啊......我知道不能怪Windows,但總要找個出氣桶,對不對?

    自以為用了幾年JAVA已經(jīng)挺熟了,沒想到差點栽到最低級的失誤里了。反省反省。。。。。。

    posted @ 2006-05-29 07:28 shaofan 閱讀(2593) | 評論 (3)編輯 收藏

    Sun 的Java EE 5終于發(fā)布了(上一版本稱作J2EE)!這一版本可說是萬眾矚目了,目前在SUN的站點上已經(jīng)提供下載。值得關(guān)注的特點是:

    "第一個商業(yè)的,比較完善的Java EE 5 實現(xiàn)

    簡化開發(fā)--對編程模式的重新組織
    支持EJB3.0--POJO
    支持Java Persistence API , ORM更簡單
    JAX-WS 2.0 以及 JAXB 2.0 使得開發(fā)web services 以及SOA應(yīng)用更加便捷
    JavaServer Faces 1.2--更簡易開發(fā)AJAX
    效率更高, 同時管理和部署功能更強大
    啟動速度提高30%, 占用內(nèi)存減少30%.
    web services 效率提高至少5倍.
    web services 管理更強大
    整合了NetBeans以及支持Eclipse plug-in
    提供了整合NetBeans的可視化的SOA 開發(fā)以及部署
    Sun's Java System Application Server PE 9.0是完全開源的"

    ???????????????????????????????????????????????? ----摘自www.Matrix.org.cn

    它的結(jié)構(gòu)如下圖:


    Matrix上的相關(guān)文章:http://www.matrix.org.cn/resource/news/728_SUN+JavaEE5+SDK.html
    SUN網(wǎng)站上的下載地址:http://java.sun.com/javaee/downloads/index.jsp

    posted @ 2006-05-17 08:04 shaofan 閱讀(682) | 評論 (0)編輯 收藏

    Google好用嗎?大概很多人會說"Yes"。

    但是老外Don Norman去從另一個角度說明,Google的易用性只是一個假象。因為他的主頁只放一個搜索框,要想使用Google的其他服務(wù),比如Google Map, Google Earth,卻要經(jīng)過很多次不同的點擊,給用戶造成很大的不便。相比之下,其他的比如Yahoo,MSN,大家認為它們復(fù)雜,但實際上從他們的主頁訪問他們提供的各種服務(wù)都很方便。

    要我說,就一個字:贊成。兩個字:非常贊成!

    全文請見:

    英文原文:The truth about Google's so-called "simplicity" ? by Don Norman
    中文譯文:關(guān)于 Google 界面所謂的“簡潔性”的真實情況? 翻譯:張亮

    posted @ 2006-05-14 06:24 shaofan 閱讀(509) | 評論 (0)編輯 收藏

    些天,不記得是用SOHU的郵箱注冊了哪個網(wǎng)站了,現(xiàn)在每天都收到大量的垃圾郵件。不知道別人怎么樣,反正我覺得SOHU的閃電郵件的反垃圾郵件功能基本是個擺設(shè)。而它的“垃圾郵件舉報”的功能似乎也沒什么作用。相比YAHOO和GOOGLE,這兩位業(yè)界大佬提供的郵箱的反垃圾能力則明顯要高一籌。

    我也常用YAHOO的郵箱來注冊網(wǎng)站BBS,它對垃圾郵件的識別率相當(dāng)高,我收到的大部分垃圾郵件它都可以準確識別。此外,YAHOO還提供了“替身郵”的功能,就是可以注冊一堆虛擬的郵件地址,每個地址其實都是指向你原來的那個。用這些替身地址去注冊網(wǎng)站或者留言什么的,所有發(fā)到它的郵件都會自動到達原來的郵箱。以后從這個地址來的垃圾郵件多了,就可以把這個替身地址刪掉,就再也不會收到從它發(fā)來的垃圾了。

    這是個好想法。以前我所想到的方法是,注冊一個郵箱,專門用來在注冊網(wǎng)站用。然后給它設(shè)置自動轉(zhuǎn)發(fā),把郵件轉(zhuǎn)到我原來的郵箱地址。替身郵和這個想法真有異曲同工之妙。但是替身郵有個缺點,一旦把替身地址刪掉,那些有用的郵件也收不到了。我所希望的是,能為這些替身地址增加“白名單”的功能,只收指定地址寄來的郵件。如果是這樣,那就完美了。

    另外,SOHU閃電郵件的“自動轉(zhuǎn)發(fā)”居然不起作用?開了好幾天了,一封都沒轉(zhuǎn)發(fā)過,真是狂暈!!

    posted @ 2006-05-03 18:22 shaofan 閱讀(652) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 性生交片免费无码看人| 欧美a级在线现免费观看| 女人裸身j部免费视频无遮挡| 亚洲国产视频一区| 久久久久亚洲精品日久生情| 亚洲色图在线观看| 亚洲色四在线视频观看| 亚洲精品自在线拍| 亚洲免费闲人蜜桃| 亚洲色偷偷色噜噜狠狠99| 亚洲女女女同性video| 亚洲国产精品18久久久久久| 亚洲欧美日韩国产精品一区| 在线观看亚洲精品专区| 男女男精品网站免费观看| 一级人做人爰a全过程免费视频 | 无码不卡亚洲成?人片| 国产v片免费播放| 一本久久综合亚洲鲁鲁五月天| 天堂亚洲免费视频| 亚洲国产无套无码av电影| 亚洲人成在线电影| 亚洲乱码日产精品BD在线观看| 亚洲看片无码在线视频| 久久久久久亚洲精品无码| 色噜噜狠狠色综合免费视频| 亚洲精品黄色视频在线观看免费资源| a成人毛片免费观看| 久久不见久久见免费视频7| 日韩在线免费视频| 免费日韩在线视频| 亚洲中文字幕第一页在线| 亚洲国产精品一区二区久久| 亚洲国产成人综合| 青青青亚洲精品国产| 久久免费观看视频| 91精品成人免费国产片| 久久久久女教师免费一区| 无码国产精品一区二区免费式芒果| 久久www免费人成看片| 永久免费毛片手机版在线看|