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

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

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

    拾貝殼

    走過的路
    隨筆 - 39, 文章 - 1, 評論 - 14, 引用 - 0
    數(shù)據(jù)加載中……

    2006年7月8日

    System.getProperty()參數(shù)大全

    System.getProperty()參數(shù)大全  
  •   
  • java.version            Java Runtime Environment version  
  • java.vendor            Java Runtime Environment vendor  
  • java.vendor.url            Java vendor URL  
  • java.home            Java installation directory  
  • java.vm.specification.version                    Java Virtual Machine specification version  
  • java.vm.specification.vendor                    Java Virtual Machine specification vendor  
  • java.vm.specification.name                    Java Virtual Machine specification name  
  • java.vm.version            Java Virtual Machine implementation version  
  • java.vm.vendor            Java Virtual Machine implementation vendor  
  • java.vm.name            Java Virtual Machine implementation name  
  • java.specification.version                Java Runtime Environment specification version  
  • java.specification.vendor             Java Runtime Environment specification vendor  
  • java.specification.name        Java Runtime Environment specification name  
  • java.class.version                        Java class format version number  
  • java.class.path                  Java class path  
  • java.library.path                        List of paths to search when loading libraries  
  • java.io.tmpdir                Default temp file path  
  • java.compiler            Name of JIT compiler to use  
  • java.ext.dirs            Path of extension directory or directories  
  • os.name                Operating system name  
  • os.arch                Operating system architecture  
  • os.version            Operating system version  
  • file.separator            File separator ("/" on UNIX)  
  • path.separator            Path separator (":" on UNIX)  
  • line.separator            Line separator ("\n" on UNIX)  
  • user.name            User's account name  
  • user.home            User's home directory  
  • user.dir                User's current working directory 
  • posted @ 2008-02-18 17:43 binge 閱讀(697) | 評論 (0)編輯 收藏

    axis userguide(3)

    服務(wù)類型

    在axis中有4中服務(wù)類型
    RPC服務(wù)采用soap rpc的標(biāo)準(zhǔn),and also the SOAP "section 5" encoding.
    Document 服務(wù)沒有采用任何編碼(所以你在組裝時(shí)不會(huì)看到復(fù)雜對象的序列化以及soap-style數(shù)組),但是仍然作了xml和java對象的互映射。
    Wrapped服務(wù)和Document服務(wù)類似
    Message 服務(wù)接受和返回soap Envelope中的任意的xml而不需要mapping/data得榜定。如果你想處理來自外部的原始的xml,可以采用Message 服務(wù)。

    RPC服務(wù)
       這個(gè)服務(wù)是axis默認(rèn)的服務(wù)。我們在前面的例子中寫的就是rpc服務(wù)。<service ... provider="java:RPC"> 。rpc服務(wù)遵從soap rpc規(guī)范和編碼規(guī)則,意味著來自rpc服務(wù)的xml將類似上面例子中的“echoString”--每個(gè)rpc調(diào)用被模塊化為一個(gè)外部元素,匹配操作名稱,并包含了很多內(nèi)部元素,每一個(gè)都是操作的一個(gè)參數(shù)。axis將把這些xml轉(zhuǎn)化為java對象,配送給你得服務(wù),并將序列化來自服務(wù)的java對象為xml.因?yàn)閞pc服務(wù)默認(rèn)采用soap section 5規(guī)則,對象將會(huì)通過"multi-ref" 序列化來編碼。
    Document / Wrapped 服務(wù)
     這2個(gè)服務(wù)很類似,都不需要用soap編碼來處理數(shù)據(jù)。他就是一個(gè)普通的xml格式。無論哪種情況,axis還是對他們做了xml到j(luò)ava得榜定,所以你最終處理的還是java對象,而不是xml結(jié)構(gòu)的字符串。
     下面的例子來說明他們2個(gè)之間的區(qū)別。
     <soap:Envelope xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      <soap:Body>
        <myNS:PurchaseOrder xmlns:myNS="http://commerce.com/PO">
          <item>SK001</item>
          <quantity>1</quantity>
          <description>Sushi Knife</description>
        </myNS:PurchaseOrder>
      </soap:Body>
    </soap:Envelope>

    相關(guān)的PurchaseOrder類型定義如下:

    <schema targetNamespace="http://commerce.com/PO">
      <complexType name="POType">
        <sequence>
          <element name="item" type="xsd:string"/>
          <element name="quantity" type="xsd:int"/>
          <element name="description" type="xsd:string"/>
        </sequence>
      </complexType>
      <element name="PurchaseOrder" type="POType"/>
    </schema>

    對于一個(gè)document服務(wù)來說,他將對應(yīng)到這樣的方法
    public void method(PurchaseOrder po)

    換句話說,整個(gè)PurchaseOrder元素將被處理為一個(gè)單一的對象,包含3個(gè)屬性。
    而對于wrapped服務(wù)來說,他對應(yīng)于下面的方法
    public void purchaseOrder(String item, int quantity, String description)
    注意到,在wrapped中,PurchaseOrder元素被映射為代表了一個(gè)方法。他的參數(shù)就是他的那些元素。
    他們在wsdd得使用如下
    <service ... style="document"> for document style
    <service ... style="wrapped"> for wrapped style
    Message 服務(wù)
      當(dāng)你需要處理純xml而不是java對象時(shí),你將會(huì)用到這種服務(wù)。
      message服務(wù)的方法有4中簽名
    public Element [] method(Element [] bodies);
    public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
    public Document method(Document body);
    public void method(SOAPEnvelope req, SOAPEnvelope resp);

    posted @ 2008-02-17 20:31 binge 閱讀(621) | 評論 (0)編輯 收藏

    axis userguide(2)

    發(fā)布service
    有2種發(fā)布方式,一種是實(shí)例發(fā)布,一種是描述符發(fā)布
    實(shí)例發(fā)布很簡單
      把我們的java源文件拷貝到axis目錄下,改擴(kuò)展名為jws
      然后就可以直接訪問了,例如:
    java samples.userguide.example2.CalcClient -p8080 add 2 5
     他將調(diào)用add方法,傳遞的2個(gè)變量分別為2和5。
    很顯然,第一種方法有很多弊端,比如需要源文件,不能有包路徑等等
    描述符發(fā)布
    一個(gè)最簡單的例子如下:
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      <service name="MyService" provider="java:RPC">
        <parameter name="className" value="samples.userguide.example3.MyService"/>
        <parameter name="allowedMethods" value="*"/>
      </service>
    </deployment>
    一個(gè)服務(wù)是一個(gè)targeted chain ,可能包含下面的一些或者全部:請求Handler,pivot Handler 支點(diǎn)Handler,響應(yīng)Handler。支點(diǎn)hander在服務(wù)中叫做provider,在例子中我們的provider是java:RPC,他被axis內(nèi)嵌,代表了Java RPC service,具體的類是org.apache.axis.providers.java.RPCProvider.
    我們告訴RPCProvider 我們要調(diào)用的服務(wù)MyService,并以參數(shù)的形式告訴他具體的目標(biāo)以及可以被調(diào)用的方法。
    我們也可以給我們要調(diào)用的對象設(shè)置作用范圍scope,和servlet的scope一樣,有request,session,application.
    我們需要把這個(gè)描述符定義的內(nèi)容告訴應(yīng)用服務(wù)器才能真正提供我們需要的服務(wù)。
    如果已經(jīng)部署axis到tomcat,我們可以這樣發(fā)布
    org.apache.axis.client.AdminClient deploy.wsdd
    這樣我們的服務(wù)就可以通過soap來訪問了
    測試一下
    java samples.userguide.example3.Client
      -lhttp://localhost:8080/axis/services/MyService "test me!"
    可以通過下面來查看所有已經(jīng)部署的服務(wù)
    java org.apache.axis.client.AdminClient list
    來看看更進(jìn)一步的應(yīng)用,使用一下request handler
    <deployment xmlns="http://xml.apache.org/axis/wsdd/"
        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      <!-- define the logging handler configuration -->
      <handler name="track" type="java:samples.userguide.example4.LogHandler">
        <parameter name="filename" value="MyService.log"/>
       </handler>

      <!-- define the service, using the log handler we just defined -->
      <service name="LogTestService" provider="java:RPC">
        <requestFlow>
          <handler type="track"/>
        </requestFlow>

        <parameter name="className" value="samples.userguide.example4.Service"/>
        <parameter name="allowedMethods" value="*"/>
      </service>
    </deployment>
    這個(gè)例子會(huì)在客戶端掉用LogTestService的時(shí)候,先調(diào)用samples.userguide.example4.LogHandler作記錄操作
    遠(yuǎn)程管理
    默認(rèn)狀態(tài)下,axis只允許在axis部署的機(jī)器上使用管理請求,如果希望在其他的機(jī)器上進(jìn)行管理操作可以參照下面的例子

    <service name="AdminService" provider="java:MSG">
      <parameter name="className" value="org.apache.axis.util.Admin"/>
      <parameter name="allowedMethods" value="*"/>
      <parameter name="enableRemoteAdmin" value="true"/>
    </service>
    注意,這樣配置需要作必要的安全配置

    posted @ 2008-02-17 12:17 binge 閱讀(604) | 評論 (0)編輯 收藏

    osworkflow幾個(gè)主要組件和概念

    原文見:

    http://blog.csdn.net/huabingl/archive/2008/02/12/2089145.aspx

    posted @ 2008-02-17 10:36 binge 閱讀(776) | 評論 (0)編輯 收藏

    Javascript 的dtree

    說dtree是使用最廣泛的目錄樹javascript應(yīng)該也不為過.這得意于他簡單的使用方式和良好的結(jié)構(gòu).

    可能這里是他最早的發(fā)源地之一http://www.destroydrop.com/javascripts/tree/

    上面有他的示例和api文檔.

    dtree使用簡單,使用起來就是引入一個(gè)dtree.js,dtree.css和一些小圖片文件。.在需要顯示樹的地方,插入類似下面的代碼

    可以參照這里做些配置,觀看效果.可選的選項(xiàng)有folderLinks, useIcons, useLines, useSelection, useStatusText, closeSameLevel

    http://www.destroydrop.com/javascripts/tree/example/ 

    你可以放置radio或者checkbox在相應(yīng)的節(jié)點(diǎn)上,或者在節(jié)點(diǎn)上加上鏈接.

    posted @ 2008-02-17 10:35 binge 閱讀(1529) | 評論 (0)編輯 收藏

    用opencms java API獲取資源信息

    原文見

    http://blog.csdn.net/huabingl/archive/2008/02/12/2088711.aspx

    posted @ 2008-02-17 10:34 binge 閱讀(733) | 評論 (0)編輯 收藏

    opencms分頁

    opencms列表顯示
     先準(zhǔn)備要顯示的數(shù)據(jù)。比如在站點(diǎn)下建立一個(gè)sports目錄,里面以news的格式放入一些xmlpage.
      注意給這些xmlpage準(zhǔn)備好detail顯示頁面。
    <%@ taglib prefix="cms" uri=" <%@ page import="java.util.*"%>
    <%@ page import="org.opencms.jsp.*"%>

    <%
    String sPageIndex=request.getParameter("pageIndex");
    int iPageIndex=1;
    if(sPageIndex!=null){
    iPageIndex=Integer.parseInt(sPageIndex);
    }

     pageContext.setAttribute("pageIndex", iPageIndex+"");
    %>
    <cms:contentload collector="allInFolderDateReleasedDesc" param="/myfirstsite/sports/%(number)_news.html|news" pageIndex="%(pageContext.pageIndex)" pageSize="2">
    <cms:contentinfo var="contentInfo" scope="request" />
    <a href="<cms:link><cms:contentshow element="%(opencms.filename)"/></cms:link>" target=_blank><cms:contentshow element="Title"/> </a>
    <%out.println("---");%>
    </cms:contentload>
    <%
    CmsContentInfoBean info  = (CmsContentInfoBean)request.getAttribute("contentInfo");
    int totalNum=info.getResultSize();
    %>
    共<%=totalNum%>條數(shù)據(jù),當(dāng)前第<%=info.getPageIndex()%>/<%=info.getPageCount()%>
    <a href="list_taglib?pageIndex=<%=info.getPageNavStartIndex()%>">第一頁</a>
    <a href="list_taglib?pageIndex=<%=(info.getPageNavStartIndex()-1)>0?(info.getPageNavStartIndex()-1):1%>">上一頁</a>
    <a href="list_taglib?pageIndex=<%=(info.getPageNavStartIndex()+1)>info.getPageCount()?info.getPageCount():(info.getPageNavStartIndex()+1)%>">下一頁</a>
    <a href="list_taglib?pageIndex=<%=info.getPageNavEndIndex()%>">最后頁</a>
    上面的例子力求盡可能少的使用標(biāo)簽。主要使用了CmsContentInfoBean ,CmsJspXmlContentBean ,I_CmsXmlContentContainer(CmsJspTagContentLoad )等多個(gè)對象。分頁的關(guān)鍵在CmsContentInfoBean 和 CmsJspTagContentLoad的關(guān)系上。 

    參考資料:

    http://www.javaedu.com/bbs/viewthread?thread=128

    http://wangyi878750.blog.sohu.com/41725191.html

    http://l--w.blog.sohu.com/47996664.html

    http://wangyi878750.blog.sohu.com/41378072.html

     

    posted @ 2008-02-17 10:31 binge 閱讀(1637) | 評論 (0)編輯 收藏

    Ruby之Blocks&Iterator

    Ruby之Blocks,Iterator
    -------讀《Programming Ruby 2nd》

    posted @ 2007-08-09 10:22 binge 閱讀(360) | 評論 (0)編輯 收藏

    Ruby簡介

    Ruby是”一種用于迅速和簡便的面向?qū)ο缶幊痰慕忉屝阅_本語言”;這意味著什么?
    解釋性腳本語言:

    • 有直接呼叫系統(tǒng)調(diào)用的能力
    • 強(qiáng)大的字符串操作和正則表達(dá)式
    • 開發(fā)中快速回饋

    迅速和簡便:

    • 無需變量聲明
    • 變量無類型
    • 語法簡單而堅(jiān)實(shí)
    • 自動(dòng)內(nèi)存管理

    面向?qū)ο缶幊?/p>

    • 任何事物都是一個(gè)對象
    • 類,繼承,方法,等等
    • 單態(tài)方法
    • 模塊糅合
    • 迭代器和閉包(closures)

    以及:

    • 多精度整數(shù)
    • 異常處理模式
    • 動(dòng)態(tài)裝載
    • 線程

    如果你對上面的那些概念還不熟悉,繼續(xù)讀,別擔(dān)心.Ruby的箴言是”迅速和簡便”.

    posted @ 2007-08-02 10:16 binge 閱讀(444) | 評論 (0)編輯 收藏

    ruby日記

    ruby初體驗(yàn)
    參考網(wǎng)址:
    http://sitekreator.com/satishtalim/ruby_tools.html
    http://blog.linuxmine.com/23633/viewspace-5329

      ror  制作簡單網(wǎng)頁
    helloworld達(dá)成
    (啟動(dòng)服務(wù)器的時(shí)候,錯(cuò)誤的直接切到script目錄去啟動(dòng),耽誤了不少時(shí)間)
    參考網(wǎng)址:
    http://www.javaeye.com/article/35929
    ror實(shí)現(xiàn)簡單的mvc
    參考資料:
    http://www.onlamp.com/pub/a/onlamp/2007/01/05/revisiting-ruby-on-rails-revisited-2.html?page=1
    http://www.ibm.com/developerworks/cn/linux/l-rubyrails/   (最后的修改的 form標(biāo)簽應(yīng)該寫成<%= start_form_tag :action => 'update', :id => @contact.id %>)
    ror作復(fù)雜的mvc
    制作中。。。。
    需要解決的問題有:
    1,登陸以及session處理
    參考文檔:
    http://wiki.rubyonrails.org/rails/pages/UnderstandingSessions
    2,多表關(guān)聯(lián)以及復(fù)雜查詢
    參考文檔:
    http://tech.it168.com/j/d/2006-10-20/200610200913835_2.shtml
    3,分頁實(shí)現(xiàn)
    參考文檔:
    http://wiki.rubyonrails.com/rails/pages/HowtoPagination



     

    posted @ 2007-07-31 16:40 binge 閱讀(592) | 評論 (0)編輯 收藏

    javascript操作word控件

    <script language="javascript">
    //定義全局變量,用于清理工作
    var word;
    var doc;
    function editFile(){
    //調(diào)用word控件
     word= new ActiveXObject("Word.Application");
    //屏蔽“另存為”按鈕
     word.CommandBars("File").Controls(5).Enabled= false;
      word.CommandBars("File").Controls(5).visible= false;
    //屏蔽"另存為網(wǎng)頁"按鈕

     word.CommandBars("File").Controls(6).Enabled= false;
     word.CommandBars("File").Controls(6).visible= false;

     word.visible = true;
     // word.activate();
    try{
    //打開文件
      doc=word.Documents.Open("  //痕跡保留
      word.ActiveDocument.TrackRevisions   =true; 
    //切換成web視圖
      word.ActiveDocument.ActiveWindow.View.Type=3
     
          }catch(e){
           alert(e.message);
          };  
    }
    function myfinalize(){
    //文檔保存
        doc.save();
    //文檔關(guān)閉
       doc.close();
    //把屏蔽的功能打開
       word.CommandBars("File").Controls(5).Enabled= true;
      word.CommandBars("File").Controls(5).visible= true;
    //word退出
     word.quit();
     
    }
    //參考文檔
      
    http://bbs.hidotnet.com/712/ShowPost.aspx

    posted @ 2007-07-25 10:54 binge 閱讀(3163) | 評論 (0)編輯 收藏

    DB2

    原文:

    http://blog.csdn.net/huabingl/archive/2008/02/11/2088477.aspx

    posted @ 2007-07-09 16:20 binge 閱讀(340) | 評論 (0)編輯 收藏

    AXIS User Guide(1)

         摘要: AXIS User Guide(1)  閱讀全文

    posted @ 2007-01-03 20:54 binge 閱讀(1172) | 評論 (0)編輯 收藏

    Sliding into WebDAV

         摘要: Sliding into WebDAV  閱讀全文

    posted @ 2007-01-03 20:49 binge 閱讀(2420) | 評論 (0)編輯 收藏

    HibernateTemplate方法

         摘要: HibernateTemplate方法索引  閱讀全文

    posted @ 2006-12-26 15:47 binge 閱讀(4395) | 評論 (0)編輯 收藏

    小心對js函數(shù)命名,避免和它的內(nèi)置函數(shù)重名

    最近又遇到個(gè)對js取名不帥導(dǎo)致錯(cuò)誤的問題,特開此貼,以示警戒:
    不要把自己的js函數(shù)取成close(),open(),start()之類的名字!!

    window得resizeto和resizeby方法對模式窗口無效。

    posted @ 2006-12-10 13:25 binge 閱讀(719) | 評論 (0)編輯 收藏

    webdav使用指南

      最近研究了一下webdav,關(guān)于webdav的詳細(xì)信息可以在 google上搜索或者參看官方網(wǎng)站 筆者簡單的嘗試了它下面的slide和mod_dav.
    slide是jakarta下面的子項(xiàng)目,分為服務(wù)端和客戶端.個(gè)人認(rèn)為服務(wù)端是專門為tomcat定做的一個(gè)webdav實(shí)現(xiàn).關(guān)于slide,javaeye上有些討論,可以參考
    http://www.javaeye.com/t/5267.html.本人涉入的不是很深,中文問題讓我碰到了,slide提供2中存儲(chǔ)方式,文件形式和數(shù)據(jù)庫形式,限于時(shí)間,筆者沒有對數(shù)據(jù)庫形式進(jìn)行測試.slide的工作目錄默認(rèn)在服務(wù)器bin目錄下.
    用mod_dav來實(shí)現(xiàn)相比就簡單多了,如果你熟悉apache httpserver,應(yīng)該很容易搞定.http://www.webdav.org/mod_dav/ 上的有部分資料.可以根據(jù)http://www.webdav.org/mod_dav/install.html 的講解來配置.apache server1.3以后(包括1.3)在發(fā)布的時(shí)候都自帶了mod_dav包.需要做的就是加載和配置它.
    LoadModule dav_module libexec/libdav.so
    AddModule mod_dav.c
    筆者在配置的時(shí)候由于沒有認(rèn)真看文檔,犯了個(gè)小小的錯(cuò)誤.所以注意下面的文字:
    "In the following example, the DAV lock database will be stored in the /usr/local/apache/var directory (which must be writable by the server process). The file's name will be DAVLock when mod_dav needs to create it.
    (actually, mod_dav will create one or more files using this file name plus an extension)

    DAVLockDB /usr/local/apache/var/DAVLock"
    然后你需要配置一個(gè)webdav的工作目錄,由于訪問apache服務(wù)的用戶會(huì)默認(rèn)是nobody用戶,所以你至少得讓工作目錄對nobody可讀寫.在目錄的定義中加入DAV on這樣的屬性就 ok了
    eg:
    "Alias /pages /home/www/davhome
    <Location /pages>
        DAV On
    </Location>
    "
    測試webdav
    安裝完webdav后,你可以做簡單的測試:
       IE瀏覽器-〉文件-〉打開,然后輸入配置的url,客戶端API.
    如果是 java可以 采用slide的客戶端.(php用戶咋辦?).
    這個(gè)最新的客戶端使用的是最新的jdom,注意哦..
    參考資料:
    http://www.uplinux.com/www/net/02/131.shtml

    posted @ 2006-12-10 12:40 binge 閱讀(6004) | 評論 (0)編輯 收藏

    mvnforum權(quán)限系統(tǒng)分析

    ?? mvnforum是一個(gè)開源的論壇軟件.網(wǎng)址如下:
    http://sourceforge.net/projects/mvnforum/
    ?? 本文主要研究它的權(quán)限部分,以作為使用借鑒.
    ?? 這里有篇中文的文檔,以作參考:
    ? http://www.cn-java.com/target/news.php?news_id=3298


    權(quán)限部分的UML圖如下:
    ??

    數(shù)據(jù)流程:
    1,系統(tǒng)從OnlineUserManager這個(gè)入口進(jìn)入.這個(gè)部件有個(gè)Map用來存儲(chǔ)當(dāng)前的非過期用戶。OnlineUserManager會(huì)先根據(jù)當(dāng)前時(shí)間和最后一個(gè)用戶的請求時(shí)間做對比,檢查是否有刷新過期用戶的必要,如果超過所設(shè)置的時(shí)間,那么先更新Map。然后OnlineUserManager根據(jù)提供的用戶的 sessionid和username在這個(gè)Map中查找。如果找到,則刷新該用戶的最后一次訪問時(shí)間;否則,OnlineUserManager調(diào)用OnlineUserFactory部件創(chuàng)建該OnlineUser,并把這個(gè)OnlineUser存入Map之中。
    判對用戶是否過期的原理是:從OnlineUser的OnlineUserAction中取出最后一次的訪問時(shí)間和當(dāng)前時(shí)間做對比.
    2,OnlineUserFactory負(fù)責(zé)創(chuàng)建OnlineUser并為該OnlineUser提供完整的權(quán)限信息.OnlineUser包括3大部分信息,一部分是用戶的基本信息,一部分是用戶的權(quán)限信息,一部分是用戶的在線信息.在線信息由OnlineUserManager負(fù)責(zé)管理,其他2部分信息由OnlineUserFactory從持久層獲得.
    獲得權(quán)限信息并把它設(shè)置到OnlineUser部件上,提供給OnlineUserManager管理.
    3.CNMPermissionFactory類似我們常說的service.主要負(fù)責(zé)和持久層通信,最終返回一個(gè)CNMPermission部件供OnlineUserFactory合成OnlineUser部件.在下面的章節(jié)里,筆者會(huì)對他細(xì)化討論.
    權(quán)限結(jié)構(gòu):
    用來實(shí)現(xiàn)用戶權(quán)限的主要的是CNMPermission接口和他是2個(gè)子類AbstractPermission和CNMPermissionImpl.CNMPermission接口負(fù)責(zé)定義權(quán)限有關(guān)的常量和對外API.AbstractPermission設(shè)置了保存權(quán)限信息的變量并實(shí)現(xiàn)了CNMPermission接口中定義的抽象方法,因此,筆者把這個(gè)抽象類叫做鑒權(quán)類.CNMPermissionImpl 則負(fù)責(zé)對AbstractPermission使用的變量進(jìn)行設(shè)值,因此,筆者稱之為賦權(quán)類.
    先看看AbstractPermission的結(jié)構(gòu)。這里涉及到這么幾個(gè)概念:全局權(quán)限,特定權(quán)限,單個(gè)權(quán)限,組合權(quán)限。
    全局權(quán)限用true/false來設(shè)置。
    特定權(quán)限是指某一個(gè)動(dòng)作所作用的不同的對象。比如:某用戶只能將寫操作作用于1,2,4這3個(gè)論壇板塊之上。表示為這個(gè)特定權(quán)限內(nèi)部的ArrayList容器中只有1,2,4三個(gè)編號。
    單個(gè)權(quán)限是指單個(gè)動(dòng)作。比如讀操作。
    組合權(quán)限是為了方便設(shè)置提供的對單個(gè)權(quán)限的組合。比如對某用戶一次設(shè)置某板塊的“讀”和“發(fā)布”2種權(quán)限。
    前2種權(quán)限是一個(gè)緯度的劃分,后2個(gè)是另一個(gè)緯度的劃分。
    如何鑒權(quán)?
    鑒權(quán)的接口都會(huì)在CNMPermission中定義。對全局權(quán)限,直接返回對應(yīng)的標(biāo)志位的值,對于特定權(quán)限,則先判斷是否特定權(quán)限全開,否,則然后判斷其ArrayList中是否包含對應(yīng)的對象編號。
    如何賦權(quán)?
    這里要承接到上述數(shù)據(jù)流程的第三步。由CNMPermissionFactory根據(jù)一定先后循序(其實(shí)無關(guān)順序,因?yàn)椴捎玫臑檎娓采w原則,即持久層返回的權(quán)限都是真值,后面的真值對前面的真值可覆蓋)從持久層獲得所有的全局權(quán)限和特定權(quán)限。mvnforum只有用戶和角色2種概念(當(dāng)然也可以擴(kuò)展),因此它的順序是:用戶全局全縣-〉用戶特定權(quán)限-〉角色全局全縣-〉角色特定權(quán)限。當(dāng)然無論哪一部都是對同一個(gè)CNMPermission進(jìn)行操作。
    無論在設(shè)置全局權(quán)限還是特定權(quán)限的時(shí)候都可能會(huì)遇到所定義的組合權(quán)限。具體的組合權(quán)限拆分是由CNMPermissionImpl來做的.
    相關(guān)的表結(jié)構(gòu):
    ?? member表,存貯用戶基本信息。
    ?? membergroup ,存儲(chǔ)用戶和組(角色)的對應(yīng)關(guān)系。
    ?? groups表,存儲(chǔ)組/角色的基本信息
    ?? grouppermission,存儲(chǔ)組/角色的全局權(quán)限,字段為groupid permissionid
    ?? groupforum,存儲(chǔ)組/角色 的論壇權(quán)限, 字段為groupid ,forum,permissionid
    ?? memberpermission 存貯用戶的全局權(quán)限,字段為 memberid permissionid
    ?? memberforum 存貯用戶的論壇權(quán)限,字段為memberid ,forum,permissionid


    ? 修改于2006/12/16? 晚8時(shí)

    posted @ 2006-09-19 10:07 binge 閱讀(1545) | 評論 (0)編輯 收藏

    Log4j/common log和各種服務(wù)器集成的問題

    ? 目前的很多商業(yè)和非商業(yè)的服務(wù)器中間件都默認(rèn)集成了common-log甚至是log4j.因此當(dāng)我門把我們的應(yīng)用發(fā)布在上面的時(shí)候,都會(huì)遇到關(guān)于log方面的問題.
    ? 1.webshpere下面集成log4j.
    ? "WebSphere的類裝入器方式有兩種方式:PARENT_FIRST和PARENT_LAST。默認(rèn)值是PARENT_FIRST,這種方式在載入當(dāng)前classpath的類之前先載入其上一級classloader能夠裝入的類。這是標(biāo)準(zhǔn)的JVM classloader的默認(rèn)策略。如果采用PARENT_LAST,則過程正好相反,即先載入當(dāng)前classpath的類,再載入其上一級classloader能夠裝入的類,這樣可以用當(dāng)前classpath中更新的類覆蓋其上一級classloader的相同類。受類裝入器方式影響的classloader包括application classloader、WAR classloader以及共享類庫的classloader。"
    ?因?yàn)閣ebsphere在共享類庫的classloader中有一套common logging,但是確沒有合適配置文件.如果我們把配置正確的log4j.properties文件放在共享類庫下,我們會(huì)發(fā)現(xiàn)log4j可以運(yùn)行.但還有另外一個(gè)很通用的方式--改變webshpere的類庫加載順序.我們讓他先加載我們web應(yīng)用所需的類庫.即我們把web應(yīng)用的加栽方式改為PARENT_LAST.
    ? 哎,盡管我小心的提防,今天還是中招了,在我的配置里,log4j的配置文件只能讀取一次,不能一個(gè)應(yīng)用一個(gè)配置文件.為了讓它加載自己的配置,可以自己寫(或者用spring的)servlet/listener去手動(dòng)加載這個(gè)配置文件.
    ?2.jboss下面的集成log4j
    ? 大家可能都曾在為jboss下面配置log4j郁悶過.jboss比webshpere走的還遠(yuǎn).無論你的項(xiàng)目是否使用了log4j,jboss在自己啟動(dòng)的時(shí)候就已經(jīng)運(yùn)行他了.也就是說在jboss加載自己共享類庫的時(shí)候,已經(jīng)讀取了自己log4j.xml文件配置.這個(gè)文件在conf中可以找到.如果你需要為你的應(yīng)用單獨(dú)配置一個(gè)catagory,你需要直接在這里配置.
    ???在webloader裝載應(yīng)用的時(shí)候,如果應(yīng)用中有l(wèi)og4j的包,似乎總出現(xiàn)appender已被占用的問題.筆者把log4j的包連帶應(yīng)用中的log4j配置文件一并移去,世界清凈了.
    關(guān)于為了讓應(yīng)用自帶的log4j配置文件生效,有人建議修改
    ?<attribute name="Java2ClassLoadingCompliance">false</attribute>

    ?<attribute name="UseJBossWebLoader">false</attribute>
    這兩個(gè)屬性.
     3.sunone下面集成log4j
    ??? 距離上次用SunOne服務(wù)器已經(jīng)好長時(shí)間了,似乎sunOne的log有些類似jboss,也是一個(gè)服務(wù)器的log集中管理.由于使用的不是很多,暫且在這里站個(gè)位子.
    隨手貼點(diǎn)關(guān)于log的信息:
    http://wiki.apache.org/jakarta-commons/Logging/FrequentlyAskedQuestions
    http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0408_baigang/part3.html

    ?

    posted @ 2006-09-05 17:23 binge 閱讀(1489) | 評論 (1)編輯 收藏

    OpenLDAP快速上手

    OpenLDAP 快速上手

    ?? Ben 的項(xiàng)目里面要用到 OpenLDAP, 我的項(xiàng)目里面也要用到 LDAP, 所以這 2 天集中看了一下 LDAP 相關(guān)的內(nèi)容。做了個(gè)筆記,也算是為人類知識的積累做點(diǎn)或有或無的貢獻(xiàn)。

    ?? OpenLDAP 的官方站點(diǎn)是 http://www.openldap.org

    ?????? 上面有個(gè) QuickStart, 我將大致按照這個(gè)來講解。

    一、 安裝
    在官方站點(diǎn)上發(fā)布的是 linux/unix 下的 OpenLDAP 源文件,當(dāng)然也很容易找到 windows 系統(tǒng)下的版本。筆者學(xué)習(xí)安裝的就是 windows 版本的。

    二、 配置

    OpenLDAP 2 個(gè)用戶最關(guān)注的配置文件。

    一個(gè)是 slapd.conf 在他里面定義了最基本的 DN 以及管理員的賬號和密碼。

    另一個(gè)是 LDIF 的文件。在它里面可以配置所有的用戶和組織。

    1、? 我們先來了解 LDAP 的相關(guān)概念。
    我們知道 LDAP 的全稱為( Lightweight Directory Access Protocol ),即輕量級目錄訪問協(xié)議。

    Ldap 是怎樣的一個(gè)結(jié)構(gòu)呢 ?用官方的話說:“ In LDAP, directory entries are arranged in a hierarchical tree-like structure. Traditionally, this structure reflected the geographic and/or organizational boundaries. Entries representing countries appear at the top of the tree. Below them are entries representing states and national organizations. Below them might be entries representing organizational units, people, printers, documents, or just about anything else you can think of.. ”他是一個(gè)樹狀的結(jié)構(gòu)。每一個(gè)節(jié)點(diǎn)被稱為一個(gè) Entry 。這些 Entry 有著有趣的含義。

    下面是他的 2 個(gè)實(shí)例。一個(gè)反映了 geographic ,一個(gè)反映了 organizational

    ?????????????????????????????????????????????????????????? 傳統(tǒng)命名

    ?????????????????????????????????????????????????????????? 網(wǎng)絡(luò)命名

    我們來看看個(gè)個(gè)節(jié)點(diǎn)的定義方式。

    每個(gè) Entry 都有一個(gè)自己得一個(gè)標(biāo)示 ,我們把他叫 DN(Distinguished Name) ,這個(gè) dn 包含了一個(gè) RDN Relative Distinguished Name )。在上面的第二個(gè)圖例 中,Barbara Jensen的RDN是 uid=babs,他的dn是 uid=babs,ou=People,dc=example, dc=com。

    每個(gè)節(jié)點(diǎn)都需要一個(gè)類別 這個(gè)類別信息用objectClass來表示。ObjectClass就是該節(jié)點(diǎn)的schema,他定義了該節(jié)點(diǎn)該有和不該有的屬性。默認(rèn)的objectClass都在schema/core.schema中有定義。如果在你的配置過程中出現(xiàn)了關(guān)于找不到objectClass的問題,您不妨參看一下這里面有沒有你用到的objectClass . 在schema文件夾下還有其他一些schema文件,你也可以定義自己的schema.想要加載其他的schema,你可以在slapd.conf文件中用include加入.如:include??./schema/core.schema. 為了方便識別,其實(shí)我們在DN里面用的都是objectClass的簡寫形式。如:ou代表organizationUnit,c代表country,st代表state,dc代表??等。

    2、? 來看看 slapd.conf 這個(gè)文件
    這個(gè)文件的主要信息是如下幾行:

    database bdb

    suffix "dc=<MY-DOMAIN>,dc=<COM>"

    rootdn "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>"

    rootpw secret

    directory /usr/local/var/openldap-data

    定義了數(shù)據(jù)庫,最基本的后綴,管理員的 dn 和密碼,以及數(shù)據(jù)存放路徑。

    編輯好這個(gè)文件,我們就可以啟動(dòng)了。

    如果你把 ldap 安裝為 windows 服務(wù),你可以像我一樣啟動(dòng):

    net start OpenLDAP-slapd

    ?

    3、? 我們主要操作的就是這個(gè) LDIF 文件
    我們需要在這個(gè)文件里面加入所需要的 dn.

    注意,因?yàn)槲覀冊?/span> slapd.conf 中定義了一個(gè) base dn 和一個(gè)管理員 dn ,所以我們需要首先把這 2 個(gè) dn 加進(jìn)來。

    dn: dc=<MY-DOMAIN>,dc=<COM>

    objectclass: dcObject

    objectclass: organization

    o: <MY ORGANIZATION>

    dc: <MY-DOMAIN>

    ?

    dn: cn=Manager,dc=<MY-DOMAIN>,dc=<COM>

    objectclass: organizationalRole

    cn: Manager

    保存為 ldif 后綴的文件。然后我們用命令把這些信息加到 ldap 中去:

    ldapadd -x -D "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>" -W -f example.ldif

    讓我們來查看以下我們的設(shè)置是否出現(xiàn)問題:

    ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'

    上面的是 linux/unix 下的命令, windows 下我們需要做點(diǎn)更改:

    ldapsearch -x -b dc=example,dc=com (objectclass=*)

    對,就是去掉引號。

    為了察看方便,筆者建議使用 GUI 工具來查看,比如筆者使用的 Softerra LDAP Browser 2.6

    ?

    三、 java 集成
    我們的 ldap Server 已經(jīng)搭建起來了,我們需要在我們的 java 程序中訪問這個(gè)服務(wù)。

    Openldap.org 上有沒有講?有講?下面介紹的 JLDAP 就是干這個(gè)的。

    我們需要看一下“ Java LDAP Overview ”里面的內(nèi)容。內(nèi)容不是很多,但很實(shí)用。

    要在 java 中訪問 ldap ,我們需要一套 api, 你可以在下面的網(wǎng)站上獲得:

    http://developer.novell.com/wiki/index.php/LDAP_Classes_for_Java

    在下在的文件里面有許多的例子,在 novell 的網(wǎng)站上也有很多的例子。我就不講了。 Try yourself

    posted @ 2006-08-26 08:37 binge 閱讀(9159) | 評論 (7)編輯 收藏

    JUDE還是很好用的

    ?? 沒有華麗的Rose,也沒有Togather,用JUDE的感覺也不錯(cuò).剛剛把PicoContainer反向了.可惜,好東西都陸續(xù)要收費(fèi)了.只能用用Community /Free 版.
    ?
    JUDE的一個(gè)下載地址:
    ?? http://jude.change-vision.com/jude-web/product/community.html

    posted @ 2006-07-23 15:27 binge 閱讀(896) | 評論 (1)編輯 收藏

    PicoContainer源碼導(dǎo)讀

         摘要: 一、簡介?? 感謝“簡易java框架”分享的學(xué)習(xí)心得。循著他的足跡,我把picocontainer讀了一遍。源代碼的版本是1.2-RC-2。?? pico的官方站點(diǎn):http://www.picocontainer.org/?? 由于它是一個(gè)專門的ioc容器,所以使用起來沒有spring那么麻煩。關(guān)于他的文檔,在官方站點(diǎn)上有一篇《5分鐘搞定pico》的文章。國人似乎也有很多的翻譯版本。講解得很詳細(xì)...  閱讀全文

    posted @ 2006-07-23 14:30 binge 閱讀(3016) | 評論 (0)編輯 收藏

    一個(gè)簡單的ThreadPool分析

    一個(gè)簡單的ThreadPool
    ? 原文來自http://www.informit.com/articles/printerfriendly.asp?p=30483&r1=1&rl=1
    ? 項(xiàng)目是多線程的,所以引入了線程池這個(gè)東西。池子是個(gè)老美寫的。在項(xiàng)目中表現(xiàn)的還不錯(cuò)。所以把它摘出來,介紹給以后或許需要用到它的同行們。
    ? 關(guān)于為什么要采用ThreadPool,原文已經(jīng)提到了:創(chuàng)建一個(gè)線程是需要開銷的;如果線程數(shù)量過大的話,cpu就會(huì)浪費(fèi)很大的精力做線程切換。
    ? ThreadPool的實(shí)現(xiàn)過程就是對WorkerThread的同步和通信的管理過程。
    ? 我們來看代碼。
    ? 首先,在ThreadPool構(gòu)造的時(shí)候,創(chuàng)建10個(gè)WorkerThread(size=10)并讓他們運(yùn)行。每個(gè)WorkerThread線程都有個(gè)ThreadPool的引用,用于查詢ThreadPool的狀態(tài)和獲得同步鎖.WorkerThread運(yùn)行以后,循環(huán)調(diào)用ThreadPool的方法進(jìn)行查詢,如果沒有發(fā)現(xiàn)任務(wù),ThreadPool告訴正在查詢的線程進(jìn)入休眠狀態(tài),WorkerThread釋放對查詢方法的鎖定.這樣在還沒有任務(wù)的時(shí)候,所有的10個(gè)WorkerThread都會(huì)進(jìn)入休眠狀態(tài),進(jìn)入等待ThreadPool對象的等待鎖定池,只有ThreadPool對象發(fā)出notify方法(或notifyAll)后WorkerThread線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。
    代碼片斷:
    while ( !assignments.iterator().hasNext() )
    ??? wait();
    如果你有jprofile或者其他的觀察線程的工具,你可以看到有10個(gè)線程都在休眠狀態(tài).
    ? 接著,我們向ThreadPool中加入任務(wù),這些任務(wù)都實(shí)現(xiàn)了Runnable的run方法.(至于為什么把任務(wù)都做成Runnable,譯者至今也有些疑問?預(yù)定俗成?TimerTask也是實(shí)現(xiàn)自Runnable,弄得初學(xué)者經(jīng)常把真正運(yùn)行的線程搞混).ThreadPool每assign一個(gè)任務(wù),就會(huì)發(fā)出一條消息,通知它的等待鎖定池中的線程.各個(gè)線程以搶占的方式獲得對象鎖,然后很順利的獲得一條任務(wù).并把此任務(wù)從ThreadPool里面刪除.沒有搶到的繼續(xù)等待.
    Runnable r = (Runnable)assignments.iterator().next();
    ?? assignments.remove(r);
    WorkerThread從ThreadPool那里獲得了任務(wù),繼續(xù)向下執(zhí)行。
    target = owner.getAssignment();
    ?? if (target!=null) {
    ??? target.run();?????
    ??? owner.done.workerEnd();
    ?? }
    記住,這里調(diào)用的是target.run();而不是調(diào)用的線程的start()方法。也就是說在這里表現(xiàn)出的WorkerThread和task之間的關(guān)系僅僅是簡單的方法調(diào)用的關(guān)系,并沒有額外產(chǎn)生新線程。(這就是我上面納悶為什么大家都實(shí)現(xiàn)Runnable來做task的原因)
    ?大家可能注意到,WorkerThread并沒有對異常作處理。而我們知道發(fā)生在線程上的異常會(huì)導(dǎo)致線程死亡。解決的辦法有2中,一種是通過threadpool的管理來重新激起一個(gè)線程,一種是把異常在線程之內(nèi)消滅。在項(xiàng)目中,我采用的是第二中,因此這個(gè)片斷改稱這樣:
    if (target!=null) {
    ? try{
    ??? target.run();?????
    ?? }
    ? catch(Throwable t){
    ?.......
    ?? }
    ??? owner.done.workerEnd();
    }
    在WorkerThread完成一個(gè)task以后,繼續(xù)循環(huán)作同樣的流程.
    在這個(gè)ThreadPool的實(shí)現(xiàn)里面,Jeff Heaton用了一個(gè)Done類來觀察WorkerThread的執(zhí)行情況.和ThreadPoool的等待鎖定池不同,Done的等待鎖定池里面放的是初始化ThreadPool的線程(可能是你的主線程),我們叫他母線程.
    ? 在給出的測試?yán)又?母線程在調(diào)用complete()方法后進(jìn)入休眠(在監(jiān)視中等待),一開始是waitBegin()讓他休眠,在assign加入task以后,waitDone()方法讓他休眠.在WorkerThread完成一個(gè)task以后,通知waitDone()起來重新檢查activeThreads的數(shù)值.若不為0,繼續(xù)睡覺.若為0,那么母線程走完,死亡(這個(gè)時(shí)候該做的task已經(jīng)做完了).母線程走完,ThreadPool還存在嗎?答案是存在,因?yàn)閃orkerThread還沒有消亡,他們在等待下一批任務(wù),他們有ThreadPool的引用,保證ThreadPool依然存在.大家或許已經(jīng)明白Done這個(gè)類的作用了.
    ? 細(xì)心的讀者或許會(huì)發(fā)現(xiàn),發(fā)生在Done實(shí)例上的notify()并不是像ThreadPool上的notify()那樣每次都能完成一項(xiàng)工作.比如除了第一個(gè)被assign的task,其他的task在assign進(jìn)去的時(shí)候,發(fā)出的notify()對于waitDone()來說是句"狼來了".
    ?最后在ThreadPool需要被清理得時(shí)候,使每一個(gè)WorkerThread中斷(這個(gè)時(shí)候或許所有的WorkerThread都在休眠)并銷毀.記住這里也是一個(gè)異步的過程.等到每一個(gè)WorkerThread都已經(jīng)銷毀,finalize()的方法體走完.ThreadPool被銷毀.
    ?for (int i=0;i<threads.length;i++) {
    ?? threads[i].interrupt();
    ?? done.workerBegin();
    ?? threads[i].destroy();
    ? }
    ? done.waitDone();
    為什么有句done.workerBegin();?不明白.
    參考文章:
    http://www.zdnet.com.cn/developer/common/printfriend/printfriendly.htm?AT=39276905-3800066897t-20000560c

    posted @ 2006-07-16 20:07 binge 閱讀(7186) | 評論 (1)編輯 收藏

    關(guān)于作者

    ??? 呂華兵,男,24歲。
    ??? 2000-2004年,在中國民航大學(xué)讀書。學(xué)習(xí)期間,筆者以技術(shù)部長身份參與了校易航工作室暨易航網(wǎng)站的創(chuàng)建和發(fā)展工作,參與和獨(dú)立完成了多個(gè)項(xiàng)目的設(shè)計(jì)和開發(fā)。
    ?? 2004年5月到2006年5月,在北京環(huán)亞時(shí)代(港新合資)天津軟件中心從事Java的開發(fā)工作。參與了CMCC的OA的實(shí)施工作,主力開發(fā)了MOCHA AM的前端顯示和MOCHA ITAM的報(bào)表系統(tǒng)。
    ? 2006年5月至今,在美國易達(dá)軟件有限公司工作。設(shè)計(jì)并開發(fā)了Information Publisher的多線程后端程序。
    ??
    ? 筆者長期從事j2se,j2ee的開發(fā)工作,對各種設(shè)計(jì)模式亦有豐富的使用經(jīng)驗(yàn)。
    ? 筆者從來重視規(guī)范的軟件流程,對RUP有很深的理解。
    ? 對于javascript,dhtml,ajax,筆者有著豐富的經(jīng)驗(yàn)。
    ? 筆者也是“拿來主義”的擁躉,不遺余力的翻譯、學(xué)習(xí)、使用和宣傳各種開源項(xiàng)目。目前使用過的開源項(xiàng)目有:spring、picocontainer、hibernate、ibatis、struts、webwork等框架系列,DOM系列,commons系列,Quartz,log4j,ant,oscache,proxool以及各種報(bào)表工具等等。

    ?筆者從來重視知識的提取和積累,這也是筆者開此blog的主要原因,同時(shí),也希望通過此blog結(jié)交更多的朋友。

    posted @ 2006-07-16 10:15 binge 閱讀(416) | 評論 (0)編輯 收藏

    關(guān)于GWT的第一手經(jīng)驗(yàn)

    譯者安:你敢大膽采用最新的技術(shù)嗎?你顧慮哪些方面?下面的采訪將給我們提供一個(gè)參考。
    ?原文:
    ? ?? 在java中,對技術(shù)的采用是一件讓人心煩的事情,因?yàn)槲覀儷@得通知的途徑太多。不同的會(huì)議,不同的站點(diǎn)如slashdot和theserverside,而且還有數(shù)不清的個(gè)人博客如dhh和o'Reilly's Radar.
    一個(gè)讓人感興趣的技術(shù)總是讓業(yè)界議論紛紛,正如人們所意識到的,這個(gè)產(chǎn)品并不是成熟期。
    ??? 為了讓一個(gè)產(chǎn)品成為主流,早期的采用者必須足夠喜歡這項(xiàng)產(chǎn)品來承擔(dān)很多非常的任務(wù)以便
    讓更為膽怯的開發(fā)者相信這項(xiàng)新技術(shù)值得采用。像Hibernate和Spring Framework這樣的技術(shù)花了好幾年
    才成為一個(gè)成熟產(chǎn)品。許多產(chǎn)品,比如maven,在版本確定之前經(jīng)歷了痛苦的時(shí)期因?yàn)樗麄冊缙谌狈?br />足夠的文檔或者有不同的足夠強(qiáng)大的挑戰(zhàn)者比如ant.本人對這個(gè)過程中的盲點(diǎn)很感興趣,從議論這個(gè)產(chǎn)品的介紹到大范圍的采用往往要經(jīng)歷成月上年,而且很難指定時(shí)間表。hibernate并不是暴雨似的到來,而是通過大量用戶自我采用.一個(gè)失敗的項(xiàng)目比如ojb出來的時(shí)候也是引起轟動(dòng),但是它最終沒有承諾的那么好.在這種情況下,早期的hibernate使用者其實(shí)信心不足.
    ? 讓我們來看Google Web Toolkit (GWT)…
    GWT在這個(gè)進(jìn)程中處于什么位置?
    gwt看起來是在早期使用(early-adopter)的中期。一開始的議論聲已經(jīng)消去,現(xiàn)在陸續(xù)出現(xiàn)了許多關(guān)于gwt的文章和博客,表明了人們正在期待關(guān)于gwt的第一個(gè)helloworld的反饋報(bào)告。我的很多謹(jǐn)慎的同行都在回避他,事實(shí)上認(rèn)為它是個(gè)不好的主意。風(fēng)險(xiǎn)阻礙了開發(fā)者對大多數(shù)新技術(shù)的評估直到他們在現(xiàn)實(shí)中看到了一個(gè)活生生的實(shí)例解決方案--就像maven被ibm使用一樣。那些有能力來嘗試風(fēng)險(xiǎn)的開發(fā)者正在對這個(gè)框架進(jìn)行測試。他們中的某一個(gè)或許宣稱gwt不適合它的組織。另外一個(gè)同行已經(jīng)原則上接受了gwt的觀點(diǎn),但是沒有時(shí)間來在他的應(yīng)用中集成。所以,到底gwt處于什么時(shí)期?早期的使用人群有哪些經(jīng)驗(yàn)?zāi)兀?br />?? 關(guān)于這個(gè)問題,我專門采訪了Grassroots Technologies公司的Michael Podrazik。Grassroots Technologies是一個(gè)在紐約的咨詢小組。通過在Grassroots的工作,michael已經(jīng)正在把gwt應(yīng)用在他們的一個(gè)新的正在開發(fā)的web應(yīng)用當(dāng)中。在下面的采訪里面,我要求他來交流他的產(chǎn)品經(jīng)驗(yàn)來幫助其他人去理解gwt.我特別要求他給一些gwt客觀的意見,而且細(xì)致的描述他在用gwt開發(fā)過程中遇到的挑戰(zhàn)。幸運(yùn)的是,他的信息將會(huì)幫助你決定是否gwt是你項(xiàng)目的正確選擇。
    采訪內(nèi)容:
    q:什么使你選擇了gwt?
    a:我訂閱了google的blog,所以我聽說了gwt當(dāng)他發(fā)布到j(luò)avaone的時(shí)候。在閱讀了他的文檔之后我開始對這種方式很好奇,因此我把它down了下來而且開始使用它(play with it).我剛剛開始了一個(gè)項(xiàng)目,這個(gè)項(xiàng)目是把遺留的 Access/VBA的桌面應(yīng)用升級為一個(gè)web應(yīng)用。在UI方面有許多ajaxian特性所以我想我可以讓gwt一展身手。我認(rèn)為(figure)只要我保持我的架構(gòu)足夠抽象,我就有能力用更為傳統(tǒng)的web應(yīng)用框架來替換gwt層。gwt會(huì)很傷腦筋嗎?至少目前為止我很開心。
    q:gwt出現(xiàn)了那些挑戰(zhàn)?你圍繞著gwt設(shè)計(jì)的web框架嗎?gwt是否挑戰(zhàn)了你關(guān)于web應(yīng)用開發(fā)的觀點(diǎn)?
    a:你確實(shí)不能簡單的認(rèn)為gwt是一個(gè)webapp的框架,他更是一個(gè)有著rpc和對象序列化的ui類庫。因?yàn)槟阈枰淖兡沩?xiàng)目組織的assumptions以及包的結(jié)構(gòu)。在java服務(wù)端開發(fā)rich-client用戶界面我們有大量的經(jīng)驗(yàn),比如flash/actionscript.gwt和他們十分類似,因此可以想象有這些元素的項(xiàng)目--分隔的服務(wù)端和客戶端而不是同一的webapp--很爽。
    ? 朝著這個(gè)方向,你需要明確區(qū)分服務(wù)端和客戶端的功能。我相信一個(gè)好的哲學(xué)就是使你的客戶端僅僅用于展示。
    ? 你需要思考你服務(wù)接口的設(shè)計(jì),比如每個(gè)操作的粒度
    ? 你不能在客戶端代碼上用java5得語法
    Q:你的意思是不能再gwt的具體類或者普通的web應(yīng)用里面用java5的語法?
    a:你不能在客戶代碼里面使用java5的語法。我們在服務(wù)端代碼中使用了許多java5的特性,但是所有將要被轉(zhuǎn)換成javascript的代碼必須是1.4的規(guī)范。
    這個(gè)也包括許多事實(shí)上你用在服務(wù)端的類。因?yàn)閞pc框架允許用戶定義的數(shù)據(jù)類型的序列化,意思是你將在瀏覽器端得到一個(gè)已經(jīng)被轉(zhuǎn)化為javascript實(shí)例的類,這個(gè)類作為一個(gè)參數(shù)傳遞到服務(wù)端的實(shí)現(xiàn)中。在你的服務(wù)端代碼中,你將操縱同一個(gè)class而且是編譯過的字節(jié)碼。
    ?這個(gè)時(shí)候就出現(xiàn)了一個(gè)選擇,domain module和gwt的耦合度怎樣才合適呢?
    What we decided was to keep value objects implementation-agnostic so as to avoid “infecting” the API and persistence layers with beans implementing GWT’s IsSerializable interface.
    舉個(gè)例子,在服務(wù)端我們有個(gè)IUser接口的用戶模塊,這個(gè)借口繼承自IPersistable.gwt的實(shí)現(xiàn)接受和返回實(shí)現(xiàn)IsSerializable接口的GwtUser的實(shí)例并把這些實(shí)例利用commons-beanutils發(fā)送到服務(wù)端。
    ?對于這一點(diǎn)可能有些爭論,這樣做并不非必要。但是我覺得這點(diǎn)額外的工作將帶給你更為清晰的層次劃分。我們可以嵌入gwt到任何一點(diǎn),而且可以轉(zhuǎn)換到springmvc或者struct或者其他的地方,而不需要擔(dān)心代碼上?的反應(yīng)。
    q:你發(fā)現(xiàn)gwt產(chǎn)生的javascript不能垮瀏覽器的地方了嗎?你發(fā)現(xiàn)gwt產(chǎn)生的javascript包含一些錯(cuò)誤需要手動(dòng)調(diào)試了嗎?
    a:都沒有,這正是令我們驚訝的地方。跨瀏覽器javascript的開發(fā)是PITA,而且GWT真正的把你從他那里隔離開來。
    我發(fā)現(xiàn)了大量的在FIREFOX和IE不同的地方,但是這些最后被確認(rèn)都是CSS支持的問題而于GWT無關(guān)。
    我也遇到了一大隊(duì)JAVASCRIPT錯(cuò)誤,但是這些錯(cuò)誤都是應(yīng)為變量而不在初始化,這些問題很快就會(huì)找到并且不需要大量的調(diào)試。目前已經(jīng)完成的大多數(shù)工作并不全是ui控件的問題,或許隨著我們的深入,我們會(huì)遇到一些問題,但是目前為止,我們還沒有多少麻煩。
    q:你的工作組的成員是更喜歡java還是javascript呢?
    顯然是java,哈哈。但是我們有人對javascript和actionscript也很精通。就像譯者本人。
    q:一句話,對正在考慮gwt的人,你有什么建議?你會(huì)推薦他嗎?你對這項(xiàng)技術(shù)的客觀觀點(diǎn)是什么?thumbs up or thumbs down?
    a:目前是thumbs up.我們目前仍然在開發(fā)的早期,而且我還不想說在它是完美的或者在以后的進(jìn)程中不會(huì)咬我們一口。意思是說,你的建構(gòu)要搭好。 它真的像是在作swing或者其他UI的桌面應(yīng)用。
    ?我們用基于Controller和IView實(shí)現(xiàn)的GWT生成了全部的ui.除了gwt模塊引入以外,那里沒有html。
    ? 這是對幾乎所有主流web應(yīng)用范例的違背,但是如果你喜歡ui編程,他完美的抽象了ajax/dhtml的行為到一個(gè)十分友好和可擴(kuò)展的api.
    ? 我或許會(huì)說如果你的工作是php,asp或者其他語言,你或許需要花更多的功夫。如果你已經(jīng)是一個(gè)有經(jīng)驗(yàn)的java程序員,那么你可以很快投入其中。

    posted @ 2006-07-08 13:47 binge 閱讀(1170) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 日本特黄特色aa大片免费| 久久er国产精品免费观看2| 亚洲第一综合天堂另类专| 色在线亚洲视频www| 亚洲Av无码一区二区二三区| 亚洲欧洲综合在线| 亚洲小说区图片区| 亚洲人成网站日本片| 亚洲一卡二卡三卡| 亚洲人成在线中文字幕| 亚洲免费在线观看视频| 67194在线午夜亚洲| 亚洲综合一区二区三区四区五区| 亚洲欧美日本韩国| 羞羞视频免费网站入口| 日本在线观看免费高清| 成人A毛片免费观看网站| 黄网站免费在线观看| 最近中文字幕电影大全免费版| 最近免费中文字幕大全免费| 精品国产无限资源免费观看| 欧洲乱码伦视频免费| 免费看的黄色大片| 亚洲国产精品碰碰| 亚洲精品午夜无码电影网| 亚洲成在人天堂一区二区| 亚洲精品一卡2卡3卡三卡四卡| 亚洲一级大黄大色毛片| 亚洲国产熟亚洲女视频| 美女裸体无遮挡免费视频网站| 未满十八私人高清免费影院| 在线观看免费黄网站| 88av免费观看| 午夜老司机免费视频| 亚洲国产中文v高清在线观看| 亚洲欧洲精品无码AV| 亚洲性色高清完整版在线观看| 亚洲精品欧美综合四区| eeuss免费影院| 亚洲精品在线免费观看| 国产免费观看网站|