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

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

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

    posts - 64,comments - 22,trackbacks - 0
    1  $(document).ready(function () {
    2    $('#test tr').each(function (){    
    3        alert($(this).children('td').eq(1).html());
    4             });
    5         });
    posted @ 2012-03-22 12:07 hellxoul 閱讀(6841) | 評論 (4)編輯 收藏
    鑒于項目需要,開始邊看Demo邊使用JQuery。現將項目中暫時遇到的三種使用JQuery進行Ajax提交的方式做個總結。因為沒有系統學習,有點山寨,只求在項目中實現功能。
        1.URL+GET參數提交
           這種方式是最普遍的,只要包含jquery.js就可以正常使用。
         
    Java代碼  收藏代碼
    1. $.ajax({  
    2.     type: "get",  
    3.     url: "/openshop/control/getCustomerAddress",  
    4.     data:"customerId="+$.trim($("#customerId")[0].value),  
    5.     cache: false,  
    6.     success: function(msg){  
    7.           $("#addressInfo")[0].innerHTML = msg;  
    8.           showTipWindow(newid,oldid,0,e);  
    9.     }  
    10. });   
    11.      


        2.整個form的提交
            如果不使用JQuery的form ajax提交,則必須手動組裝所有的表單元素鍵值對。現在使用JQuery的一個插件:jquery.form.js。將jquery.js,jquery.form.js文件都包含到項目中。然后使用如下代碼:
          
    Java代碼  收藏代碼
    1. $('#'+newid+'_frmNewAddr').ajaxForm({ beforeSubmit: validate ,success: showResponse});  
    2.   
    3. ....  
    4.   
    5. function validate(formData, jqForm, options){  
    6.     var form = jqForm[0];   
    7.     if (!form.new_recipient.value ) {   
    8.         alert('收件人必須填寫!');   
    9.         return false;   
    10.     }   
    11.     if (!form.new_address.value ) {   
    12.         alert('收件地址必須填寫!');   
    13.         return false;   
    14.     }   
    15.   
    16.    ....  
    17.   
    18.    return true;   
    19. }  
    20.   
    21. function showResponse(responseText, statusText, xhr, $form){  
    22.     var address = eval("("+removeDivTag(responseText)+")");   
    23.     $("#address_recipient")[0].innerHTML = address.recipient;  
    24.     $("#address_address")[0].innerHTML = address.address;  
    25.     $("#address_organization")[0].innerHTML = address.organization;  
    26.          ......  
    27. }  
    28.          

          其中$('#'+newid+'_frmNewAddr')獲取表單對象,其中beforeSubmit對應的validate()是一個表單提交前調用 的方法,可以在此方法中做表單驗證,只有該方法返回true,表單才會提交。而success對應的showResponse則是ajax對象成功返回后 的回調方法,可以將回調得到的內容無刷新呈現到當前頁面的相應區域中。較方便的做法是在服務器端以JSON格式返回數據,然后在回調函數中使用 eval("("+removeDivTag(responseText)+")")方法獲取具有指定結構的js對象。

         3.使用JQuery做文件上傳的ajax提交
         本人尋找并比較了多種ajax或類ajax方式上傳文件的做法,譬如使用iframe等。最終覺得使用JQuery是最方便的,不知各位使用后是否與我有 同感。我將我目前的做法總結如下,首先須在項目中包含jquery.js,ajaxfileupload.js,ajaxfileupload.css。
    Java代碼  收藏代碼
    1. <script type="text/javascript">  
    2. function ajaxFileUpload(imgName)  
    3. {  
    4.     $("#loading")  
    5.     .ajaxStart(function(){  
    6.         $(this).show();  
    7.     })  
    8.     .ajaxComplete(function(){  
    9.         $(this).hide();  
    10.     });  
    11.   
    12.     $.ajaxFileUpload  
    13.     (  
    14.         {  
    15.             url:'/productmgr/control/uploadProductImg',  
    16.             secureuri:false,  
    17.             fileElementId: imgName+'File',  
    18.             dataType: 'text',  
    19.             success: function (data, status)  
    20.             {  
    21.                 data = removeDivTag(data);  
    22.                 if(data=="ImgEmptyErr"){  
    23.                     alert("請選擇上傳圖片!");  
    24.                     return;  
    25.                 }  
    26.                 if(data=="sysErr"){  
    27.                     alert("上傳失敗,請重試!");  
    28.                     return;  
    29.                 }  
    30.                 $("#"+imgName)[0].value = data;  
    31.                 $("#"+imgName+"Div")[0].innerHTML = "上傳成功!"  
    32.                 //alert($("#"+imgName)[0].value);  
    33.             },  
    34.             error: function (data, status, e)  
    35.             {  
    36.                 alert("添加產品圖片時發生如下錯誤:"+e);  
    37.             }  
    38.         }  
    39.     )     
    40.     return false;  
    41.   
    42. }  
    43. </script>  

          本人服務器端使用的是beanshell腳本,代碼如下:
    Java代碼  收藏代碼
    1. /* 
    2.  * 產品圖片上傳 
    3.  *  
    4.  * author : Emerson 
    5.  * 
    6.  * Yiihee , Inc. */  
    7.   
    8.   
    9. import org.ofbiz.base.util.*;  
    10. import org.ofbiz.base.util.string.*;  
    11. import org.ofbiz.entity.*;  
    12. import java.text.SimpleDateFormat;  
    13. import java.util.*;  
    14. import java.io.*;  
    15. import org.apache.commons.fileupload.disk.*;  
    16. import org.apache.commons.fileupload.servlet.*;  
    17. import org.apache.commons.fileupload.*;  
    18.   
    19.   
    20.     configProperties = UtilProperties.getProperties("opencommon.properties");  
    21.     String imageUploadServerPath = configProperties.get("openb2c.image.upload.server.path");  
    22.   
    23.     //SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");     
    24.     //Date date = new Date();     
    25.     //String filename = sf.format(date);  
    26.     String fileName;  
    27.   
    28.     File uploadPath = new File(imageUploadServerPath);//上傳文件目錄  
    29.     if (!uploadPath.exists()) {  
    30.        uploadPath.mkdirs();  
    31.     }  
    32.     // 臨時文件目錄  
    33.     File tempPathFile = new File(imageUploadServerPath+"\\temp\\");  
    34.     if (!tempPathFile.exists()) {  
    35.        tempPathFile.mkdirs();  
    36.     }  
    37.     try {  
    38.        // Create a factory for disk-based file items  
    39.        DiskFileItemFactory factory = new DiskFileItemFactory();  
    40.    
    41.        // Set factory constraints  
    42.        factory.setSizeThreshold(4096); // 設置緩沖區大小,這里是4kb  
    43.        factory.setRepository(tempPathFile);//設置緩沖區目錄  
    44.    
    45.        // Create a new file upload handler  
    46.        ServletFileUpload upload = new ServletFileUpload(factory);  
    47.    
    48.        // Set overall request size constraint  
    49.        upload.setSizeMax(4194304); // 設置最大文件尺寸,這里是4MB  
    50.    
    51.        List items = null;  
    52.        items = upload.parseRequest(request);//得到所有的文件  
    53.          
    54.        if(items==null||items.size()==0){  
    55.            String msg = "ImgEmptyErr";  
    56.            context.put("result", msg);  
    57.            return;  
    58.        }  
    59.          
    60.        Iterator i = items.iterator();  
    61.          
    62.        //此處實際只有一個文件  
    63.        while (i.hasNext()) {  
    64.            FileItem fi = (FileItem) i.next();  
    65.            fileName = fi.getName();  
    66.            if (!UtilValidate.isEmpty(fileName)) {  
    67.                File fullFile = new File(fi.getName());  
    68.                //File fullFile = new File(filename);  
    69.                File savedFile = new File(uploadPath, fullFile.getName());  
    70.                int j = 0;  
    71.                while(savedFile.exists()){  
    72.                    j++;  
    73.                    savedFile = new File(uploadPath, savedFile.getName().substring(0,savedFile.getName().lastIndexOf(".")-1)+"("+j+")"+savedFile.getName().substring(savedFile.getName().lastIndexOf("."),savedFile.getName().length()));  
    74.                }  
    75.                fi.write(savedFile);  
    76.                fileName = savedFile.getName();  
    77.            }else{  
    78.                String msg = "ImgEmptyErr";  
    79.                context.put("result", msg);  
    80.                return;  
    81.            }             
    82.        }  
    83.        context.put("result", fileName);  
    84.     } catch (Exception e) {  
    85.         Debug.log("上傳產品圖片發生錯誤:"+e);  
    86.         String msg = "sysErr";  
    87.         context.put("result", msg);  
    88.         return;  
    89.     }  

      然后將result結果渲染到freemarker模板,并經回調函數解析后展示給用戶。

    總結:JQuery強大異常,本文僅從自身使用角度列舉了其部分用法,未曾深究最新最優最簡用法,暫以此文作為經驗總結,以待日后參考修正。代碼片段山寨之處實屬本人技拙,而非JQuery之過。   
    posted @ 2012-03-22 12:04 hellxoul 閱讀(7002) | 評論 (1)編輯 收藏
        <html>  
        <head>  
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
        <title>表格</title>  
        <style type="text/css">  
        .editText  
        {  
            border-width:1px;  
            border-top-style:none;  
            border-left-style:none;  
            border-right-style:none;  
            border-bottom-style:solid;  
            border-color:#030;  
            width:100%;  
        }  
        </style>  
        <script src="jquery-1.3.2.js" type="text/javascript">  
        </script>  
        <script type="text/javascript">  
        function moveUp(obj)  
        {  
            var current=$(obj).parent().parent();  
            var prev=current.prev();  
            if(prev)  
            {  
                current.insertBefore(prev);  
            }  
        }  
        function moveDown(obj)  
        {  
            var current=$(obj).parent().parent();  
            var next=current.next();  
            if(next)  
            {  
                current.insertAfter(next);  
            }  
        }  
        </script>  
        </head>  
        <body>  
        <table class="grid" width="100%" border="1" cellspacing="0" cellpadding="0">  
          <tr>  
            <td>字段英文名</td>  
            <td>字段中文名</td>  
            <td>字段數據類型</td>  
            <td>列寬</td>  
            <td>是否顯示</td>  
            <td>是否作為查詢條件</td>  
            <td>調整順序</td>  
          </tr>  
          <tr>  
            <td>1</td>  
            <td><input type="text" name="textfield" class="editText" id="textfield"></td>  
            <td> </td>  
            <td><input type="text" name="textfield5" id="textfield5"></td>  
            <td><input type="checkbox" name="checkbox" id="checkbox"></td>  
            <td><input type="checkbox" name="checkbox5" id="checkbox5"></td>  
            <td><a href="javascript:void(0)" onClick="moveUp(this)">上移</a><a href="javascript:void(0)" onClick="moveDown(this)">下移</a></td>  
          </tr>  
          <tr>  
            <td>2</td>  
            <td><input type="text" name="textfield2" id="textfield2"></td>  
            <td> </td>  
            <td><input type="text" name="textfield6" id="textfield6"></td>  
            <td><input type="checkbox" name="checkbox2" id="checkbox2"></td>  
            <td><input type="checkbox" name="checkbox6" id="checkbox6"></td>  
            <td><a href="javascript:void(0)" onClick="moveUp(this)">上移</a><a href="javascript:void(0)" onClick="moveDown(this)">下移</a></td>  
          </tr>  
          <tr>  
            <td>3</td>  
            <td><input type="text" name="textfield3" id="textfield3"></td>  
            <td> </td>  
            <td><input type="text" name="textfield7" id="textfield7"></td>  
            <td><input type="checkbox" name="checkbox3" id="checkbox3"></td>  
            <td><input type="checkbox" name="checkbox7" id="checkbox7"></td>  
            <td><a href="javascript:void(0)" onClick="moveUp(this)">上移</a><a href="javascript:void(0)" onClick="moveDown(this)">下移</a></td>  
          </tr>  
          <tr>  
            <td>4</td>  
            <td><input type="text" name="textfield4" id="textfield4"></td>  
            <td> </td>  
            <td><input type="text" name="textfield8" id="textfield8"></td>  
            <td><input type="checkbox" name="checkbox4" id="checkbox4"></td>  
            <td><input type="checkbox" name="checkbox8" id="checkbox8"></td>  
            <td><a href="javascript:void(0)" onClick="moveUp(this)">上移</a><a href="javascript:void(0)" onClick="moveDown(this)">下移</a></td>  
          </tr>  
        </table>  
        </body>  
        </html> 
    posted @ 2012-03-22 12:02 hellxoul 閱讀(2081) | 評論 (0)編輯 收藏
    if($ ("#id")){

    }else{}

    jquery不管對象存不存在都會返回object。

    應該用

    if($ ("#id").length>0){}else{}

    or     

     if($ ("#id")[0]){    } else {   }

    or 

     if(document.getElementById("id")){} else {}

    posted @ 2012-03-22 12:01 hellxoul 閱讀(386) | 評論 (1)編輯 收藏

    不可否認,OFBiz這個開源的系統功能是非常強大的,涉及到的東西太多了,其實對我們現在而言,最有用的只有這么幾個:實體引擎、服務引擎、WebTools、用戶權限管理。

    最先要提醒各位的是,在配置一個OFBiz時,路徑中千萬不要包含空格,要不然老提示出錯,無外乎是scoket write error之類的信息,會讓你郁悶得不停^_^

    用戶登錄鑒權這一塊我們完全可以照搬OFBiz現有的東西,其實也就是調用包org.ofbiz.securityext.login.LoginEvents里面的一些方法來進行處理。

    Component定義:component-load.xml,可根據需要調整需在啟動時引入的Component,比如增加一個Study,定義:

    <load-component component-location="${ofbiz.home}/components/study"/>



    首先需要進行如下幾個項目的總體配置:

    1、 entityengine.xml:實體引擎配置,主要是配置該數據的方式,如通過oracle訪問,就配置一下localoracle,特別需要注意的 是,在dataSource中配置中,一定要配置一個屬性 - schema-name="OFBIZ",這個主要是為了在OFBiz啟動時能夠正常同數據庫的對象進行匹配,如果沒有進行配置,每次都會試圖重新建立對 象,會報對象名已經被占用的情況。

    2、 serviceengine.xml:服務引擎配置,這個基本上不用作太大的修改,如要必要,可在這里邊進行一些參數的調優,比如訪問線程數配置等。

    之后需要在components目錄下新建一個目錄study,目錄里面的一些文件可直接從模板中拷貝,之后再進行必要的修改,涉及修改內容:
    1、 entitygroup.xml & entitymodel 實體定義(3.0版本開始,各實體定義可在各自的Component下定義,而不必統一集中在commonapp下);定義實體及實體的相關屬性(其實也 就是相當于數據庫的各種對象,需要注意的是,后續進行數據提取時,如果需要關聯到多張表,也需要在這里面定義一個view-entity);

    2、 services.xml:如果必要的話,可以這里邊定義一些服務;

    3、 data:一些初始配置數據,應該是相對固定,不經常變動的才放在這邊,可通過Webtool工具導入到數據庫中;

    4、 src:如改動了一些Java源文件內容后,需要重新編譯該目錄的文件,可通過UltraEdit的工具配置來進行ant編譯,非常方便,推薦使用,編譯 后的文件將生成到build目錄下,生成的文件有各個class文件,也有一些.jar包(放在lib目錄下),這些jar包是我們在Web應用中需要引 用到的,當然,引用哪些包也是可配置的,下面會講到;

    5、 ofbiz-component.xml:主要的配置文件,需要注意的一些東西:

    (1)<classpath type="jar" location="build/lib/*"/> 這是jar引用路徑,我在考慮是否可改成直接引用class文件,也就是直接設置class文件所在的目錄;

    (2)title="Study" 這個就是我們通過appbar.ftl文件在主界面顯示的那一排按鈕上顯示的內容,可根據需要調整,調整完要重啟OFBiz,麻煩,可以考慮通過hot-deploy目錄進行發布。

    至于其他一些配置,很簡單,看看就曉得。

    下 面講一下Web應用配置,Web應用配置中涉及到的最重要的兩個文件是:controller.xml和regions.xml, controller.xml文件主要是配置request-map,也就是請求映射關系,所有的請求映射都需要在這里邊進行配置,也就是我們在Web頁 面上常看到的/login等,如果涉及到view-map類型是region,就需要從region.xml文件中去讀取配置,其實也就是配置各個 region引用的處理頁面(可以是各種開發語言,比如Jsp、ftl等等)。另外,在region.xml配置文件中最重要的一部分就是 MAIN_REGION的配置,就是整個網頁布局的配置,包括header、appbar、error、content、footer等等,其中 appbar就是我們在前面剛剛提到的主界面上那一排按鈕的配置了,header、footer和error太簡單,不說了,我們主要要修改的東西都是在 content這一塊上進行展現。
    網頁中用到的一些樣式、公用的定義都是在main_template.jsp中寫入的,也需要在MAIN_REGION的屬性中配置引用的文件。樣式定義文件是引用images這個component,所以這個也是關鍵,不能缺的。

    最 后,講一講我對數據庫訪問的一些簡單的了解:對數據庫的訪問主要是通過GenericDelegator進行控制,包括一些常用的方法,如 findAll、remove、store、create等等,具體的用法要去研究一下,其實也不算復雜,先建立一個GenericDelegator, 如果是create、store就可以通過makeValue方法將一些字段的值設置到GenericValue,之后再進行store或是 create,具體語法要去參考一些文檔,還沒去看這一塊的東西。

    最最需要訪問的一些文檔:OFBizChina 實體引擎配置指南、OFBizChina 區塊(Region)指南、OFBizChina 服務引擎配置指南、OFBizChina JSP標簽庫指南,當然,研究OFBiz的前提是要首先要理解MVC模式的概念,也就是View-Model-Control,否則一切都是空談。

    補充幾點:
    1、 對于Ofbiz構造動態查詢語句
    (1) 構造查詢條件
    (2) 給每個條件之間加上邏輯關系,用mainCond = new EntityConditionList(andExprs, EntityOperator.AND);
    (3) 設置要顯示的字段列表
    (4) 設置排序字段列表
    (5) 設置Distinct列表
    EntityFindOptions findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true);
    (6) 獲取實體列表
    EntityListIterator pli = delegator.findListIteratorByCondition(entityName, mainCond, null, fieldsToSelect, orderBy, findOpts);
    (7) 一個動態查詢語句的具體實例
    <%
    String entityName="study";
    List andExprs = new ArrayList();
    String number="";
    String name="";
    String sex="";
    String tel="";
    //GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");
    EntityConditionList mainCond=null;
    if (request.getParameter("number")!=null)
    number=request.getParameter("number").toString();
    if (request.getParameter("name")!=null)
    name=request.getParameter("name").toString();
    if (request.getParameter("sex")!=null)
    sex=request.getParameter("sex").toString();
    if (request.getParameter("tel")!=null)
    tel=request.getParameter("tel").toString();
    //構造查詢條件
    if (number.compareTo("")!=0)
    andExprs.add(new EntityExpr("number",EntityOperator.EQUALS,number));
    if (name.compareTo("")!=0)
    andExprs.add(new EntityExpr("name1",true,EntityOperator.LIKE,"%"+name+"%",true));
    if (sex.compareTo("")!=0)
    andExprs.add(new EntityExpr("sex1",true,EntityOperator.LIKE,"%"+sex+"%",true));
    if (tel.compareTo("")!=0)
    andExprs.add(new EntityExpr("tel",true,EntityOperator.LIKE,"%"+tel+"%",true));
    //每個條件間的邏輯關系
    if (andExprs.size() > 0)
    mainCond = new EntityConditionList(andExprs, EntityOperator.AND);
    //要顯示的字段列表
    List fieldsToSelect = new ArrayList();
    fieldsToSelect.add("number");
    fieldsToSelect.add("name1");
    fieldsToSelect.add("sex1");
    fieldsToSelect.add("tel");
    //排序字段列表
    List orderBy = UtilMisc.toList("number", "name1");
    //Distinct列表
    EntityFindOptions findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true);
    //獲取實體列表
    EntityListIterator pli = delegator.findListIteratorByCondition(entityName, mainCond, null, fieldsToSelect, orderBy, findOpts);
    while(pli.hasNext())
    {
    GenericValue cust = (GenericValue)pli.next();%>
    <tr>
    <td><%=cust.getString("number")%></td>
    <td><%=cust.getString("name1")%></td>
    <td><%=cust.getString("sex1")%></td>
    <td><%=cust.getString("tel")%></td>
    </tr>
    <%}%>

    </table>

    2、 對于所有的圖片文件,都放在images目錄下
    3、 設置圖片的標簽<ofbiz:contenturl>圖片路徑</ofbiz:contenturl>
    4、 鏈接Tag <ofbiz:url>control.xml里面設置的請求</ofbiz.url>
    5、 <region:render section=‘header‘/>引入header定義的文件
    header這個標識在regions.xml里面定義
    <define id=‘MAIN_REG‘ template=‘/templates/main_template1.jsp‘>
    <put section=‘title‘>Application Page</put> <!-- this is a default and is meant to overridden -->
    <put section=‘header‘ content=‘/includes/bottom.jsp‘/>
    <put section=‘leftbar‘ content=‘/includes/left.jsp‘/>
    <put section=‘middle‘ content=‘/includes/middle.jsp‘/>
    <put section=‘content‘ content=‘/includes/middle.jsp‘/> <!-- this is a default and is meant to overridden -->
    <put section=‘top‘ content=‘/includes/top.jsp‘/>
    <put section=‘error‘ type="jpublish" content=‘/includes/errormsg.ftl‘/>
    <!--<put section=‘footer‘ type="jpublish" content=‘/includes/footer.ftl‘/>-->
    </define>
    然后其它頁面只要如下定義即可
    <define id=‘BasePubEmp‘ region=‘MAIN_REG‘>
    <put section=‘title‘>View BasePubEmp</put>
    <put section=‘content‘ content=‘/BasePubEmp.jsp‘/>
    </define>
    注意,這邊的content所指定的區塊就是我們上面定義的content
    6、 這些標簽都挺簡單的,Ofbiz里面都有例子,參照一下就可以了

    后續將對Ofbiz中的shark工作流進行描述。
    http://www.cnpoint.com/mvnforum/mvnforum/viewthread?thread=67

    posted @ 2012-03-21 11:47 hellxoul 閱讀(2425) | 評論 (0)編輯 收藏
    ofbiz 之entity實體
    1. 實體定義文件
    實體定義文件一般存放位置是在對應模塊的entity文件夾下面,以party為例,party的實體定義文件路徑為%ofbiz-home%\applications\party\entitydef\entitymodel.xml。
    通過對應模塊的ofbiz-component.xml進行加載。
       <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
    <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel_old.xml"/>
    實體定義文件可以為多個。
    2. 實體類型
    2.1. 普通實體
    <entity entity-name="TenantDataSource" package-name="org.ofbiz.entity.tenant">
            <description>
                There should be one record for each tenant and each group-map for the active delegator.
                The jdbc fields will override the datasource -> inline-jdbc values for the per-tenant delegator.
            </description>
            <field name="tenantId" type="id-ne"/>
            <field name="entityGroupName" type="name"/>
            <field name="jdbcUri" type="long-varchar"/>
            <field name="jdbcUsername" type="long-varchar"/>
            <field name="jdbcPassword" type="long-varchar"></field>
            <prim-key field="tenantId"/>
            <prim-key field="entityGroupName"/>
            <relation type="one" fk-name="TNTDTSRC_TNT" rel-entity-name="Tenant">
            <key-map field-name="tenantId"/>
            </relation>
    </entity>
    普通實體和數據庫中的表是一一對應的。程序會根據實體定義在數據庫中創建表,索引,外鍵約束等。
    2.2. 視圖實體
    <view-entity entity-name="WorkEffortAssocView"
                package-name="org.ofbiz.workeffort.workeffort"
                title="Work Effort Association Entity with Name">
          <member-entity entity-alias="WA" entity-name="WorkEffortAssoc"/>
          <member-entity entity-alias="WETO" entity-name="WorkEffort"/>
          <alias-all entity-alias="WA"/>
          <alias entity-alias="WETO" name="workEffortToName" field="workEffortName"/>
          <alias entity-alias="WETO" name="workEffortToSetup" field="estimatedSetupMillis"/>
          <alias entity-alias="WETO" name="workEffortToRun" field="estimatedMilliSeconds"/>
          <alias entity-alias="WETO" name="workEffortToParentId" field="workEffortParentId"/>
          <alias entity-alias="WETO" name="workEffortToCurrentStatusId" field="currentStatusId"/>
          <alias entity-alias="WETO" name="workEffortToWorkEffortPurposeTypeId" field="workEffortPurposeTypeId"/>
          <alias entity-alias="WETO" name="workEffortToEstimatedStartDate" field="estimatedStartDate"/>
          <alias entity-alias="WETO" name="workEffortToEstimatedCompletionDate" field="estimatedCompletionDate"/>
          <alias entity-alias="WETO" name="workEffortToActualStartDate" field="actualStartDate"/>
          <alias entity-alias="WETO" name="workEffortToActualCompletionDate" field="actualCompletionDate"/>
          <view-link entity-alias="WA" rel-entity-alias="WETO">
            <key-map field-name="workEffortIdTo" rel-field-name="workEffortId"/>
          </view-link>
          <relation type="one-nofk" fk-name="WK_EFFRTASSV_FWE" title="From" rel-entity-name="WorkEffort">
            <key-map field-name="workEffortIdFrom" rel-field-name="workEffortId"/>
          </relation>
    </view-entity>
    View entity 一般用做多表連接復雜查詢,view entity 不會在數據庫中反映出來。
    2.3. 擴展實體
    <extend-entity entity-name="UserLogin">
            <field name="partyId" type="id"></field>
            <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
                <key-map field-name="partyId"/>
            </relation>
            <relation type="one-nofk" rel-entity-name="Person">
                <key-map field-name="partyId"/>
            </relation>
            <relation type="one-nofk" rel-entity-name="PartyGroup">
                <key-map field-name="partyId"/>
            </relation>
    </extend-entity>
    繼承已存在的實體并對其進行擴展。
    2.4. 動態實體
    DynamicViewEntity salesUsageViewEntity = new DynamicViewEntity();
                salesUsageViewEntity.addMemberEntity("OI", "OrderItem");
                salesUsageViewEntity.addMemberEntity("OH", "OrderHeader");
                salesUsageViewEntity.addMemberEntity("ItIss", "ItemIssuance");
                salesUsageViewEntity.addMemberEntity("InvIt", "InventoryItem");
                salesUsageViewEntity.addViewLink("OI", "OH", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId"));
                salesUsageViewEntity.addViewLink("OI", "ItIss", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId", "orderId", "orderItemSeqId", "orderItemSeqId"));
                salesUsageViewEntity.addViewLink("ItIss", "InvIt", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("inventoryItemId"));
        salesUsageViewEntity.addAlias("OI", "productId");
        salesUsageViewEntity.addAlias("OH", "statusId");
        salesUsageViewEntity.addAlias("OH", "orderTypeId");
        salesUsageViewEntity.addAlias("OH", "orderDate");
        salesUsageViewEntity.addAlias("ItIss", "inventoryItemId");
        salesUsageViewEntity.addAlias("ItIss", "quantity");
    salesUsageViewEntity.addAlias("InvIt", "facilityId");
    EntityListIterator salesUsageIt = delegator.findListIteratorByCondition(salesUsageViewEntity,
    EntityCondition.makeCondition(
    UtilMisc.toList(
             EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId),
              EntityCondition.makeCondition("productId", EntityOperator.EQUALS, productId),
                EntityCondition.makeCondition("statusId",
    EntityOperator.IN,
    UtilMisc.toList("ORDER_COMPLETED", "ORDER_APPROVED", "ORDER_HELD")),
            EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER"),
               EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, checkTime)
    ),
    EntityOperator.AND),null, null, null, null
    );
    在程序中手動創建實體,對其進行查詢。
    3實體定義
    3.1. 命名規則
    實體名稱(entity-name)首字母大寫,如果實體名稱由多個關鍵字組成,那么關鍵字首字母大寫,例如entity- name="TenantDataSource",ofbiz 會在創建數據庫表的時候根據entity-name 實體名稱除首字母之外的大寫字母前加“_”,所以entity-name="TenantDataSource"生成的數據庫表名為 “Tenant_Data_Source”.
    所以要控制entity-name 實體名稱不要超過25個字母。
    Field 表字段,命名規則與實體名稱差不多,唯一不同的是首字母小寫。
    3.2. 實體與數據庫的關聯
        <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
    <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>
    Entity-group(一般定義在各個模塊的\entitydef\entitygroupXXX.xml中) 對實體進行分組,使不同的實體分屬不同的entity-group。
    也許你會發現并不是每個entity都進行了entity-group 分組。事實上如果你沒有對實體進行分組歸類的話,系統啟動的時候他會將實體默認歸類到"org.ofbiz"中。
    查看數據庫定義文件%ofbiz_home%/framework/entity/config/entityengine.xml
    可以發現:
    <delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
            <group-map group-name="org.ofbiz" datasource-name="localderby"/>
            <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
            <group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
    </delegator>
    可以發現delegator 將多個group-name組織到一起并將group-name與 datasource-name對應起來,datasource-name又是什么?通過查看 entityengine.xml 我們可以發現:
    <datasource name="localderby"
                helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
                schema-name="OFBIZ"
                field-type-name="derby"
                check-on-start="true"
                add-missing-on-start="true"
                use-pk-constraint-names="false"
                use-indices-unique="false"
                alias-view-columns="false"
                use-order-by-nulls="true">
            <read-data reader-name="seed"/>
            <read-data reader-name="seed-initial"/>
            <read-data reader-name="demo"/>
            <read-data reader-name="ext"/>
            <inline-jdbc
                    jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
                    jdbc-uri="jdbc:derby:ofbiz;create=true"
                    jdbc-username="ofbiz"
                    jdbc-password="ofbiz"
                    isolation-level="ReadCommitted"
                    pool-minsize="2"
                    pool-maxsize="250"
                    time-between-eviction-runs-millis="600000"/>
    </datasource>
    Datasource定義了數據庫驅動,數據庫用戶名、密碼等,所以datasource就是我們說的數據庫。
    總結一下:我們通過entity-group將各個實體和數據庫之間關聯起來,然后再將一個或多個數據庫歸屬到一個delegator 中,那我們又是怎么使用數據庫進行數據庫操作的呢??查看每個模塊應用底下的web.xml 我們可以發現:
    <context-param>
            <param-name>entityDelegatorName</param-name>
            <param-value>default</param-value>
            <description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>
    </context-param>
    針對不同的應用,我們可以使用不同的delegator .如果不定義則使用default.
    在啟動各個應用模塊的時候,系統會根據web.xml 中的 entityDelegatorName
    生成delegator 對象,然后將delegator 對象存放到servletContext 中備用。
    我們就是使用這個delegator對象執行數據庫操作,以后會介紹如何使用。
    delegator = DelegatorFactory.getDelegator(delegatorName);
        servletContext.setAttribute("delegator", delegator);


    3.3. no-auto-stamp
    no-auto-stamp="false"
    entity 屬性之一: 將此值設置為true , 則 創建數據庫表時將來不創建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp
    這四個字段。
    3.4. Field.type
    <field name="tenantId" type="id-ne"/>
    Type , 將數據字段類型 與 java 類型關聯起來的設置。 定義文件路徑為:
    %ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml
    其中XXXX為你使用的數據庫名稱。
    <field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
    3.5. prim-key
    <prim-key field="agreementId"/>
    定義主鍵,其中field 需要是已經被定義過的字段,即field 定義過。
    實體支持組合主鍵,即一個實體定義中可以有多個prim-key節點。
    如果不定義主鍵的話,數據庫是不會創建表的。

    3.6. relation
    relation 定義當前實體和其他實體之間的關系,一般用做創建外鍵和根據關系查詢使用。
    :rel-entity-name:被關聯實體名稱。
    :fk-name:如果創建外鍵,那么定義外鍵的名稱。
    :title:給當前關系起個別名。
    : field-name:當前實體的字段,指明當前實體的哪個字段與被關系實體有關系。
    :rel-entity-name:被關系實體名稱
    :rel-field-name:被關系的實體的字段名稱。指明field-name和被關系實體的哪個字段有關系。如果rel-field-name與field-name相同,那么rel-field-name可以不定義。
    :type="one-nofk":關聯類型,主要有三類 “one”、”one-nofk”、”many”
    很多資料上將one 解釋為 one-to-one ,將 many 解釋為 one-to-many .
    個人感覺不是很好理解,如果從數據庫方面去理解的話,one、one-nofk  的使用條件是被關系實體的rel-field-name為主鍵,而many 的使用條件是被關系實體的rel-field-name為非主鍵。而one 與 one-nofk 的區別在于one會在數據庫表結構中創建外鍵約束,而one-nofk 則不會。
    Relation 除了用來創建外鍵約束之外還被用來做關系查詢。
    當訪問關系的時候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作為參數。
    當實體一個"many"關系的時候使用getRelated 返回一個列表,當實體一個"one"關系的時候使用getRelatedOne 返回一個實體對象。

    3.7. Index
    <index name="WEFF_KWD_KWD" unique="false">
                <index-field name="keyword" function="lower"/>
    </index>
    創建索引。
    : name:給索引起個別名。
    : unique:是否唯一索引。
    :index-field:name:對實體哪個字段創建索引,function待確定。
    4. 定義視圖實體
    4.1. Member-entity
    <member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
          <member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>
    member-entity首先定義當前視圖實體可能會用到的實體。entity-name實體名稱
    entity-alias實體別名。實體定義順序很重要,除了第一個實體之外其他都是被關聯實體。

    4.2. alias
    <alias entity-alias="EMPPOSFUL" name="partyId" field="partyId"/>
        <alias entity-alias="EMPPOSFUL" name="emplPositionId" function="count"/>
    <alias entity-alias="EMPPOSREPST" name="emplPositionIdReportingTo" group-by="true"/>

    Alias 定義當前視圖實體中會用到的字段。entity-alias為實體別名,指當前字段是哪個實體的,field實體字段名稱,name字段別名。 group-by依據當前字段進行group-by 分組查詢。function對當前字段執行function 函數處理 。
    4.3. alias-all
    <alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
                <exclude field="dimensionId"/>
    </alias-all>
    alias-all 將某個實體的全部字段定義進來。Prefix定義以規定字段字符開頭的字段。
    Exclude 將實體中某些字段剔除出去。

    4.4. View-link
    <view-link entity-alias="SOIF" rel-entity-alias="ODD" rel-optional="false">
        <key-map field-name="orderDateDimId" rel-field-name="dimensionId"/>
       </view-link>
    視圖實體中relation 只能用來做關系查詢。
    而view-link 用來做 join 關聯查詢。在entityengine.xml中<datasource ..>元素當中的join-style屬性當中設置你的數據庫join語法。
    : rel-optional:關聯類型,默認是內連接,如果將此屬性值設為true ,則為外連接

    4.5. Entity-condition
    <entity-condition>
         <order-by field-name="sequenceId"/>
    </entity-condition>
    待定

    4.6. 復雜字段
    <alias entity-alias="OI" name="quantityOrdered" function="sum">
              <complex-alias operator="-">
                  <complex-alias-field entity-alias="OI" field="quantity" default-value="0"/>
                  <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"/>
              </complex-alias>
    </alias>
    結果為:
    Select  SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。。
    一個缺省值是一個良好的習慣,否則當他們之中有一個為空就會導致結果為空
      這個操作可以支持你使用數據庫的所有函數例如  +, -, * 和 /,字符串連接符||。
    你也可以添加一個 function="" 實現min, max, sum, avg, count, count-distinct, upper 和 lower 在 complex-alias-field中。比如:
    <alias entity-alias="OI" >
          <complex-alias operator="-">
              <complex-alias-field entity-alias="OI" field="quantity" default-value="0" function="sum"/>
              <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"
    function="sum"/>
          </complex-alias>
      </alias>
    結果為SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))
    posted @ 2012-03-08 08:34 hellxoul 閱讀(1101) | 評論 (0)編輯 收藏
    * 保持實體名稱少于25個字符
    這個限制主要是為了Oracle只支持30字符以內的數據庫對象名稱,再加上OFBiz會自動在單詞之間加上"_",所以就得出了這么個限制.

    * 關聯的工作方式
    它們定義于entitymodel.xml文件中的<entity>段,示例如下:
          <relation type="one" fk-name="PROD_CTGRY_PARENT" title="PrimaryParent" rel-entity-name="ProductCategory">
            
    <key-map field-name="primaryParentCategoryId" rel-field-name="productCategoryId"/>
          
    </relation>
          
    <relation type="many" title="PrimaryChild" rel-entity-name="ProductCategory">
            
    <key-map field-name="productCategoryId" rel-field-name="primaryParentCategoryId"/>
          
    </relation>
         type這個屬性標簽定義關聯類型: "one"表示一對一,"many"表示從此實體引出的一對多關系
         fk-name的屬性值是數據庫外鍵名.為自己的外鍵命名是一個好的習慣,雖然如果你不設置此屬性,OFiz也會自己建外建.
         rel-entity-name的屬性值指向關聯的實體名稱
         title用來區分兩個實體之間的多重關系
         <key-map>節點定義關聯中使用到的字段.field-name指向本實體內的引用字段,rel-field-name定義關聯的實體字段,你可以通過多個字段組合關聯
         當你訪問一個關聯,你可以使用title+entityName作為參數調用.getRelated("")或.getRelatedOne("")方 法.在關聯為"many"時使用.getRelated("")是恰當的,因為它返回一個List,同樣在關聯為"one"時通 過.getRelatedOne("")方法獲得一個值.

    * view-entities相關內容
    view-entities的功能非常強大,它允許你可以創建一個join-like查詢,即使你的數據庫不支持join.
    關于你數據庫的join語法存放在entityengine.xml的datasource節點下的join-style屬性中.
    當你通過<view-link...>節點將兩上實體連接起來時,記住:
    1. 實體名稱順序是重要的
    2. 默認的連接方式是inner join(即同樣的值存在于兩個實體類中),外連接需要使用rel-optional="true"
    如果多個實體中擁有相同的字段名稱,比如statusId,結果集中的statusId使用第一個實體中的該列,其它實體中的同名列將被丟棄.如果你想要 同時獲得這些列,你需要通過在其之前加入<alias-all>節點,一個方式是使用<alias ..>節點來為不同實體的同名字段起別名,示例:
    <alias entity="EntityOne" name="entityOneStatusId" field="statusId"/>
    <alias entity="EntityTwo" name="entityTwoStatusId" field="statusId"/>
    另一種方法是在<alias-all>節點中使用<exclude field="">,如下:
    <alias-all entity-alias="EN">
      
    <exclude field="fieldNameToExclude1"/>
      
    <exclude field="fieldNameToExclude2"/>
    </alias-all>

    這樣也可以排除掉很多不打算使用到的信息,特別是在一個非常大的表中查詢時.
    如果你打算執行類似于以下的查詢語句時:
    SELECT count(visitId) FROM GROUP BY trackingCodeId WHERE fromDate > '2005-01-01'
    需要包含字段visitId以及function="count" 標簽,trackingCodeId需加上group-by="true"標簽,fromDate需要加上group-by="false"標簽

    在你進行查詢時,有一件非常重要的事情需要注意,比如說delegator.findByCondition方法,你必須指定檢出的字段列表,并且你不能 指定fromDate字段,否則你將得到一個錯誤.這就是為webtools不能夠使用view-entities來查看的原因.

    你可以查看applications/marketing/entitydef/entitymodel.xml的底部內容學習,及通過 applications/marketing/webapp/marketing/WEB-INF/actions/reports學習 beanshell腳本的調用.

    * 我可以在entitymodel.xml文件中定義自己的view-entities嗎?

    不能, 你可以動態定義它們.你可以查看org.ofbiz.party.party.PartyServices中的findParty方法學習它的使用

    * 如果為有效期間創建條件?

    我們提供了一組非常有用的方法EntityUtil.getFilterByDateExpr ,它能返回一個EntityConditionList根據有效期間來篩選一個結果集.

    * 如何在大數據結果集下工作

    如果你檢出一個大的數據結果集,你應當使用EntityListIterator通過迭代方式讀取數據,而非List.
    示例,如果你使用:

    List products = delegator.findAll("Product");


    你可能獲得一個"java.lang.OutOfMemoryError". 這是由于你通過findAll, findByAnd, findByCondition等方法來獲得一個大的內存數據結果集導致內存溢出. 在這種情況下, 應該使用EntityListIterator迭代方式來讀取你的數據. 這個示例應改寫成:

    productsELI = delegator.findListIteratorByCondition("Product", new EntityExpr("productId", EntityOperator.NOT_EQUAL, null), UtilMisc.toList("productId"), null);

    注意獲得EntityListIterator的方法只用通過條件, 所以你需要將你的條件重寫為EntityExpr (在此次情況下,productId是主鍵字段不可能為空的, 所以將返回所有Proudct實例,)或 EntityConditionList.

    此方法參數中包含檢出的字段(這里為productId)以及排序字段(這里不需要,所以賦了null)

    你可以傳遞一個null作為EntityCondition參數來獲得所有結果.然后這不一定在所有數據庫下都能正常工作! 在maxdb及其它不常用的數據庫下時你要小心使用這些高級功能.

    * 如何使用EntityListIterator

    當我們通過EntityListIterator迭代訪問數據時, 通常是這樣:

    while ((nextProduct = productsELI.next()) != null) {
    .
        
    // operations on nextProduct
    }


    在EntityListIterator 中使用 .hasNext()方法是一種不經濟的做法.

    在你完成你的操作后,要記得關閉此迭代

    productsELI.close();

    * 如何查詢無重結果集

    當前只能通過list iterator方法并指定EntityFindOptions參數,示例如下:

         listIt = delegator.findListIteratorByCondition(entityName, findConditions,
                
    null, // EntityConditions參數
                 fieldsToSelectList,
                 fieldsToOrderByList,  
                
                
    //關鍵部分.   第一個true表示"specifyTypeAndConcur"
                
    // 第二個true指完是一個濾重查詢.   顯然在實體引擎中只能通過這個方法來進行濾重查詢
                new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true));

    在minilang, 它會更簡單:

      <entity-condition entity-name="${entityName}" list-name="${resultList}" distinct="true">
         
    <select field="${fieldName}"/>
         .

    原文:
    http://hi.baidu.com/longer84/blog/item/dbf027cf6e58933af9dc6117.html
    posted @ 2012-03-08 08:32 hellxoul 閱讀(2264) | 評論 (1)編輯 收藏

    “又 是一年畢業時”,看到一批批學子離開人生的象牙塔,走上各自的工作崗位;想想自己也曾經意氣風發、躊躇滿志,不覺感嘆萬千……本文是自己工作6年的經歷沉 淀或者經驗提煉,希望對所有的軟件工程師們有所幫助,早日實現自己的人生目標。本文主要是關于軟件開發人員如何提高自己的軟件專業技術方面的具體建議,前 面幾點旨在確定大的方向,算是廢話吧。  
    謹以此文獻給那個自己為你奉獻3年青春與激情的開發團隊。還有團隊成員:PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。  
    1、 分享第一條經驗:“學歷代表過去、能力代表現在、學習力代表未來。”其實這是一個來自國外教育領域的一個研究結果。相信工作過幾年、十幾年的朋友對這個道 理有些體會吧。但我相信這一點也很重要:“重要的道理明白太晚將抱憾終生!”所以放在每一條,讓剛剛畢業的朋友們早點看到哈!
    2、 一定要確定自己的發展方向,并為此目的制定可行的計劃。不要說什么,“我剛畢業,還不知道將來可能做什么?”,“跟著感覺走,先做做看”。因為,這樣的觀 點會通過你的潛意識去暗示你的行為無所事事、碌碌無為。一直做技術,將來成為專家級人物?向管理方向走,成為職業經理人?先熟悉行業和領域,將來自立門 戶?還是先在行業里面混混,過幾年轉行做點別的?這很重要,它將決定你近幾年、十年內“做什么事情才是在做正確的事情!”。

    3、 軟件開發團隊中,技術不是萬能的,但沒有技術是萬萬不能的!在技術型團隊中,技術與人品同等重要,當然長相也比較重要哈,尤其在MM比較多的團隊中。在軟 件項目團隊中,技術水平是受人重視和尊重的重要砝碼。無論你是做管理、系統分析、設計、編碼,還是產品管理、測試、文檔、實施、維護,多少你都要有技術基 礎。算我孤陋寡聞,我還真沒有親眼看到過一個外行帶領一個軟件開發團隊成功地完成過軟件開發項目,哪怕就一個,也沒有看到。倒是曾經看到過一個“高學歷的 牛人”(非技術型)帶一堆人做完過一個項目,項目交付的第二天,項目組成員扔下一句“再也受不了啦!”四分五裂、各奔東西。那個項目的“成功度”大家可想 而知了。
    4、 詳細制定自己軟件開發專業知識學習計劃,并注意及時修正和調整(軟件開發技術變化實在太快)。請牢記:“如果一個軟件開發人員在1、2年內都沒有更新過自 己的知識,那么,其實他已經不再屬于這個行業了。”不要告訴自己沒有時間。來自時間管理領域的著名的“三八原則”告誡我們:另外的那8小時如何使用將決定 你的人生成敗!本人自畢業以來,平均每天實際學習時間超過2小時。  
    5、 書籍是人類進步的階梯,對軟件開發人員尤其如此。書籍是學習知識的最有效途徑,不要過多地指望在工作中能遇到“世外高人”,并不厭其煩地教你。對于花錢買 書,我個人經驗是:千萬別買國內那幫人出的書!我買的那些家伙出的書,!00%全部后悔了,無一本例外。更氣憤的是,這些書在二手市場的地攤上都很難賣 掉。“擁有書籍并不表示擁有知識;擁有知識并不表示擁有技能;擁有技能并不表示擁有文化;擁有文化并不表示擁有智慧。”只有將書本變成的自己智慧,才算是 真正擁有了它。  
    6、 不要僅局限于對某項技術的表面使用上,哪怕你只是偶爾用一、二次。“對任何事物不究就里”是任何行業的工程師所不應該具備的素質。開發Windows應用 程序,看看Windows程序的設計、加載、執行原理,分析一下PE文件格式,試試用SDK開發從頭開發一個Windows應用程序;用VC++、 Delphi、Java、.Net開發應用程序,花時間去研究一下MFC、VCL、J2EE、.Net它們框架設計或者源碼;除了會用J2EE、 JBoss、Spring、Hibernate等等優秀的開源產品或者框架,抽空看看大師們是如何抽象、分析、設計和實現那些類似問題的通用解決方案的。 試著這樣做做,你以后的工作將會少遇到一些讓你不明就里、一頭霧水的問題,因為,很多東西你“知其然且知其所以然”!  
    7、 在一種語言上編程,但別為其束縛了思想。“代碼大全”中說:“深入一門語言編程,不要浮于表面”。深入一門語言開發還遠遠不足,任何編程語言的存在都有其 自身的理由,所以也沒有哪門語言是“包治百病”的“靈丹妙藥”。編程語言對開發人員解決具體問題的思路和方式的影響與束縛的例子俯拾皆是。我的經驗是:用 面對對象工具開發某些關鍵模塊時,為什么不可以借鑒C、C51、匯編的模塊化封裝方式?用傳統的桌面開發工具(目前主要有VC++、Delphi)進行系 統體統結構設計時,為什么不可以參考來自Java社區的IoC、AOP設計思想,甚至借鑒像Spring、Hibernate、JBoss等等優秀的開源 框架?在進行類似于實時通信、數據采集等功能的設計、實現時,為什么不可以引用來自實時系統、嵌入式系統的優秀的體系框架與模式?為什么一切都必須以個 人、團隊在當然開發語言上的傳統或者經驗來解決問題???“他山之石、可以攻玉”。  
    8、 養成總結與反思的習慣,并有意識地提煉日常工作成果,形成自己的個人源碼庫、解決某類問題的通用系統體系結構、甚至進化為框架。眾所周知,對軟件開發人員 而言,有、無經驗的一個顯著區別是:無經驗者完成任何任務時都從頭開始,而有經驗者往往通過重組自己的可復用模塊、類庫來解決問題(其實這個結論不應該被 局限在軟件開發領域、可以延伸到很多方面)。這并不是說,所有可復用的東西都必須自己實現,別人成熟的通過測試的成果也可以收集、整理、集成到自己的知識 庫中。但是,最好還是自己實現,這樣沒有知識產權、版權等問題,關鍵是自己實現后能真正掌握這個知識點,擁有這個技能。  
    9、 理論與實踐并重,內外雙修。工程師的內涵是:以工程師的眼光觀察、分析事物和世界。一個合格的軟件工程師,是真正理解了軟件產品的本質及軟件產品研發的思 想精髓的人(個人觀點、歡迎探討)。掌握軟件開發語言、應用語言工具解決工作中的具體問題、完成目標任務是軟件工程師的主要工作,但從軟件工程師這個角度 來看,這只是外在的東西,并非重要的、本質的工作。學習、掌握軟件產品開發理論知識、軟件開發方法論,并在實踐中理解、應用軟件產品的分析、設計、實現思 想來解決具體的軟件產品研發問題,才是真正的軟件工程師的工作。站在成熟理論與可靠方法論的高度思考、分析、解決問題,并在具體實踐中驗證和修正這些思想 與方式,最終形成自己的理論體系和實用方法論。  
    10、心態有多開放,視野就有多開闊。不要抱著自己的技術和成果,等到它們都已經過時變成垃圾 了,才拿出來丟人現眼。請及時發布自己的研究成果:開發的產品、有創意的設計或代碼,公布出來讓大家交流或者使用,你的成果才有進化和升華的機會。想想自 己2000年間開發的那些Windows系統工具,5、6年之后的今天,還是那個樣子,今天流行的好多Windows系統工具都比自己的晚,但進化得很 好,且有那么多用戶在使用。并且,不要保守自己的技術和思想,盡可能地與人交流與分享,或者傳授給開發團隊的成員。“與人交換蘋果之后,每個人還是只有一 個蘋果;但交換思想之后,每個人都擁有兩種思想”,道理大家都懂,但有多少人真正能做到呢?  
    11、盡量參加開源項目的開發、或者與朋友共同研 制一些自己的產品,千萬不要因為沒有錢賺而不做。網絡早已不再只是“虛擬世界”,網上有很多的開源項目、合作開發項目、外包項目,這都是涉獵工作以外的知 識的絕好機會,并且能夠結識更廣的人緣。不要因為工作是做ERP,就不去學習和了解嵌入式、實時、通信、網絡等方面的技術,反過來也是一樣。如果當他別人 拿著合同找你合作,你卻這也不會,那也不熟時,你將后悔莫及。  
    12、書到用時方恨少,不要將自己的知識面僅僅局限于技術方面。諾貝爾經濟學獎 得主西蒙教授的研究結果表明: “對于一個有一定基礎的人來說,他只要真正肯下功夫,在6個月內就可以掌握任何一門學問。”教育心理學界為感謝西蒙教授的研究成果,故命名為西蒙學習法。 可見,掌握一門陌生的學問遠遠沒有想想的那么高難、深奧。多方吸取、廣泛涉獵。極力夯實自己的影響圈、盡量擴大自己的關注圈。財務、經濟、稅務、管理等等 知識,有空花時間看看,韜光養晦、未雨綢繆。  
    13、本文的總結與反思:  
    A:不要去做技術上的高手,除非你的目標如此。雖然本文是關于提高軟件開發知識的建議,做技術的高手是我一向都不贊同的。你可以提高自己的專業知識,但能勝任工作即止。  
    B:提高軟件知識和技術只是問題的表面,本質是要提高自己認識問題、分析問題、解決問題的思想高度。軟件專業知識的很多方法和原理,可以很容易地延伸、應用到生活的其它方面。
    C:在能勝任工作的基礎上,立即去涉獵其它領域的專業知識,豐富自己的知識體系、提高自己的綜合素質,尤其是那些目標不在技術方面的朋友。
    出處:http://hi.baidu.com/glaivelee/blog/item/45ea8638b1eff4d0d46225f2.html
    posted @ 2012-02-13 00:10 hellxoul 閱讀(180) | 評論 (0)編輯 收藏
         摘要: 在2012新的一年里,對程序員們來說挑戰自我是非常重要的,要么不斷創新,要么技術停滯不前。新年伊始,我整理了12個月的目標,每個目標都是對技術或個人能力的挑戰,而且可以年復一年循環使用。  閱讀全文
    posted @ 2012-01-31 23:00 hellxoul 閱讀(191) | 評論 (0)編輯 收藏
         摘要: 我們已經踏進了2012年,很自然的也會為新的一年定下目標,那么我們在生活中真正能夠實現的有哪一些目標呢?本文將詳細地給您解說新年要做的10個決定。  閱讀全文
    posted @ 2012-01-31 22:50 hellxoul 閱讀(195) | 評論 (0)編輯 收藏
    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 亚洲精品天堂成人片?V在线播放| 四虎精品亚洲一区二区三区| 亚洲一区二区三区精品视频| 日本一道本高清免费| 三年片在线观看免费观看大全中国 | 国产亚洲视频在线| 久久亚洲高清观看| 成年大片免费视频| a级毛片在线免费| 亚洲国产精品无码观看久久| 国产亚洲精品免费视频播放| 一个人免费观看在线视频www| eeuss在线兵区免费观看| 亚洲制服在线观看| 久久久久亚洲?V成人无码| 久久电影网午夜鲁丝片免费| 中文字幕乱理片免费完整的| 亚洲日韩一区二区三区| 亚洲色WWW成人永久网址| 免费看AV毛片一区二区三区| 成全在线观看免费观看大全 | 亚洲人成色777777老人头| 在线a亚洲v天堂网2019无码| 久久久www成人免费毛片| 久久精品免费视频观看| 午夜在线免费视频| 亚洲免费网站观看视频| 1区1区3区4区产品亚洲| 国产亚洲午夜高清国产拍精品 | 免费在线看片网站| 久久电影网午夜鲁丝片免费| 久久青草精品38国产免费| 无遮挡国产高潮视频免费观看| 亚洲综合色丁香婷婷六月图片| 亚洲AV日韩AV高潮无码专区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲欧洲无码AV电影在线观看| 国产成人高清精品免费鸭子| 91精品视频免费| 伊人久久免费视频| 最近的2019免费中文字幕|