hot的學(xué)習(xí)筆記

          我是一只弱小的毛毛蟲,想像有一天可以成為強(qiáng)壯的挖土機(jī), 擁有挖掘夢想的神奇手套。。。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            8 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks

          2009年7月21日 #

               摘要: 開源報(bào)表工具現(xiàn)狀
          目前較為知名的開源報(bào)表工具有:
          1、 JasperReports 一個(gè)優(yōu)秀的Java  閱讀全文
          posted @ 2009-08-18 14:04 hot 閱讀(729) | 評論 (0)編輯 收藏

              快下班的時(shí)候,收到小頭的關(guān)于Reset Css的一封郵件,看了一下才發(fā)現(xiàn),哎呀!原來css還有這么玩的。
          2004年,Tantek被不同瀏覽器下默認(rèn)樣式的差異給搞煩了,于是寫了一個(gè)undohtml.css,這也就誕生了世界上第一份reset.css。
              CSS Negotiation and a Sanity Saving Shortcut. * { margin: 0; padding: 0 } 的學(xué)名是Global White Space Reset. 從原文中可以看出這個(gè)方法剛問世時(shí)是非常火爆的,并且作者建議一定要先破后立,要將清掃差異和重置默認(rèn)樣式結(jié)合起來,這樣才是正確的做法。
             為何Global White Space Reset當(dāng)初風(fēng)光一時(shí),如今卻黯然銷魂?* { margin: 0; padding: 0 }的成功之處在于,管你三七二十八,統(tǒng)統(tǒng)抹平,人人生而平等!然而其失敗之處也正是因?yàn)槠渫μ螅m然搗了蜂窩得了蜜,卻惹來群蜂追尾,麻煩無限(因?yàn)楸荒ㄆ降臉邮剑愕迷僦匦略O(shè)置回來,比如input的padding等)。這就如西漢一代名將韓信哪,是成也蕭何,敗也蕭何!
              2007年,Eric Meyer的一篇文章Reset Styles, 重新喚起了一股reset熱潮。下面是Eric Meyer的一個(gè)CSS Reset方案:
            

             
          1. html, body, div, span, applet, object, iframe,
             
          2. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
             
          3. a, abbr, acronym, address, big, cite, code,
             
          4. del, dfn, em, font, img, ins, kbd, q, s, samp,
             
          5. small, strike, strong, sub, sup, tt, var,
             
          6. b, u, i, center,
             
          7. dl, dt, dd, ol, ul, li,
             
          8. fieldset, form, label, legend,
             
          9. table, caption, tbody, tfoot, thead, tr, th, td {
            
          10.     margin: 0;
            
          11.     padding: 0;
            
          12.     border: 0;
            
          13.     outline: 0;
            
          14.     font-size: 100%;
            
          15.     vertical-align: baseline;
            
          16.     background: transparent;
            
          17. }
              哎,真是收獲良多啊!

          posted @ 2009-07-23 21:49 hot 閱讀(141) | 評論 (0)編輯 收藏

              前些日子西安項(xiàng)目中的任務(wù)日志,以及最近參與工作流動態(tài)表單開發(fā)中都使用到了spring的aop。所以,自己簡單的進(jìn)行了一下總結(jié),也算是對前一段時(shí)間工作的一個(gè)總結(jié)吧。

           AOPAspect-Oriented Programming,面向切面編程),可以說是OOP面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來建立一種對象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對象引入公共行為的時(shí)候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關(guān)系。對于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也是如此。這種散布在各處的無關(guān)的代碼被稱為橫切(cross-cutting)代碼,在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。

           而AOP技術(shù)則恰恰相反,它利用一種稱為“橫切”的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護(hù)性。AOP代表的是一個(gè)橫向的關(guān)系,如果說“對象”是一個(gè)空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內(nèi)部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復(fù)原,不留痕跡。

              Spring支持四種攔截類型:目標(biāo)方法調(diào)用前(before),目標(biāo)方法調(diào)用后(after),目標(biāo)方法調(diào)用前后(around),以及目標(biāo)方法拋出異常(throw)。

              前置攔截的類必須實(shí)現(xiàn)MethodBeforeAdvice接口,實(shí)現(xiàn)其中的before方法。

              后置攔截的類必須實(shí)現(xiàn)AfterReturningAdvice接口,實(shí)現(xiàn)其中的afterReturning方法。

              環(huán)繞攔截的類必須實(shí)現(xiàn)MethodInterceptor接口,實(shí)現(xiàn)其中的invoke方法。環(huán)繞攔截是唯一可以控制目標(biāo)方法是否被真正調(diào)用的攔截類型,也可以控制返回對象。而前置攔截或后置攔截不能控制,它們不能印象目標(biāo)方法的調(diào)用和返回。
          但是以上的攔截的問題在于,不能對于特定方法進(jìn)行攔截,而只能對某個(gè)類的全部方法作攔截。所以下面引入了兩個(gè)新概念:切入點(diǎn)引入通知

          切入點(diǎn)的定義相當(dāng)于更加細(xì)化地規(guī)定了哪些方法被哪些攔截器所攔截,而并非所有的方法都被所有的攔截器所攔截。在ProxyFactoryBean的屬性中,interceptorNames屬性的對象也由攔截(Advice)變成了引入通知(Advisor),正是在Advisor中詳細(xì)定義了切入點(diǎn)(PointCut)和攔截(Advice)的對應(yīng)關(guān)系,比如常見的基于名字的切入點(diǎn)匹配(NameMatchMethodPointcutAdvisor類)和基于正則表達(dá)式的切入點(diǎn)匹配(RegExpPointcutAdvisor類)。這些切入點(diǎn)都屬于靜態(tài)切入點(diǎn),因?yàn)樗麄冎辉诖韯?chuàng)建的時(shí)候被創(chuàng)建一次,而不是每次運(yùn)行都創(chuàng)建。

          下面是spring的配置文件 當(dāng)然aop的配置方式有許多種,這只是其中一種

           

          <!-- 獲取相應(yīng)的instance對象 并且不被aop攔截 -->
             
          <bean id="oaTaskInstanceService4Log" parent="transactionProxy">
                  
          <property name="target">
                      
          <bean
                          
          class="com.oa.task.service.impl.OaTaskInstanceServiceImpl">
                          
          <property name="oaTaskInstanceDao">
                              
          <ref local="oaTaskInstanceDao"/>
                          
          </property>
                      
          </bean>
                  
          </property>
              
          </bean>
             
          <!-- instance日志所需DAO -->
             
          <bean id="oaTaskInstanceLogDao" class="com.oa.task.dao.OaTaskInstanceLogDao">
                
          <property name="sessionFactory" ref="sessionFactory"></property>
             
          </bean>
             
          <!-- instance日志所需Service  此接口為 日志的業(yè)務(wù)操作接口-->
              
          <bean id="oaTaskInstanceLogService" parent="transactionProxy"> 
                  
          <property name="target">
                      
          <bean
                          
          class="com.oa.task.service.impl.OaTaskInstanceLogServiceImpl">
                          
          <property name="oaTaskInstanceLogDao">
                              
          <ref local="oaTaskInstanceLogDao"/>
                          
          </property>
                          
          <property name="sysOperDao">
                              
          <ref bean="sysOperDao" />
                          
          </property>
                          
          <property name="ibatisBase">
                              
          <ref bean="ibatisBase" />
                          
          </property>
                      
          </bean>
                  
          </property>
              
          </bean>
             
          <!-- instance日志AOP攔截類 -->
             
          <bean id="oaTaskInstanceLogOper" class="com.oa.task.log.OaTaskInstanceLogOper">
                     
          <property name="oaTaskInstanceLogService">
                      
          <ref local="oaTaskInstanceLogService" />
                  
          </property>
                  
          <property name="oaTaskInstanceService">
                      
          <ref local="oaTaskInstanceService4Log" />
                  
          </property>
             
          </bean>
             
             
          <!-- instance日志AOP配置綁定 -->
             
          <bean id="oaTaskInstanceLogAutoProxy" 
                    
          class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
                    
          <property name="beanNames">
                       
          <list>
                         
          <value>oaTaskInstanceService</value>  //攔截的業(yè)務(wù)接口 oaTaskInstanceService內(nèi)所有方法都進(jìn)行攔截
                       </list>
                    
          </property>
                    
          <property name="interceptorNames">
                       
          <list>
                          
          <value>oaTaskInstanceLogOper</value>  //攔截器
                       
          </list>
                    
          </property>
              
          </bean>
             下面是 攔截器oaTaskInstanceLogOper類,采用的是環(huán)繞攔截的方式。
          public class OaTaskInstanceLogOper  implements MethodInterceptor{
              /**
               * 當(dāng)更新動作發(fā)生時(shí)的記錄
               
          */
              
          public Object invoke(MethodInvocation invocation) throws Throwable {
                  String method 
          = invocation.getMethod().getName();
                  Object result 
          = null;
                  
          if(MODIFY_INSTANCE.equals(method)){//修改日志(業(yè)務(wù)邏輯 判斷方法)
                      ......//業(yè)務(wù)操作,進(jìn)行日志的記錄
                      result
          =invocation.proceed(); 
                  }
          else {//不做任何日志
                      result=invocation.proceed();//調(diào)用原來的方法
                  }
                  
          return result;
              }


          }


          posted @ 2009-07-22 22:39 hot 閱讀(829) | 評論 (0)編輯 收藏

              前一段時(shí)間,曾經(jīng)做過一點(diǎn)flex的開發(fā)工作,最初使用的是cairngorm,后來研究了一下 pureMvc,并進(jìn)行了部分改造。
          由于只是初步涉足flex領(lǐng)域,所以只能提出一點(diǎn)自己的看法,并不具有說服力。
              cairngorm 前端的控件監(jiān)聽用戶的行為,只是監(jiān)聽,并不會做任何反應(yīng)。控件監(jiān)聽以后調(diào)用Commands來做相應(yīng)的事情,Command做了所有工作。把業(yè)務(wù)邏輯委托到 Bussiness Delegates中,Command調(diào)用Business Delegate 后,Business Delegate 通過Service Locator來找到相應(yīng)的RPC services,然后執(zhí)行實(shí)現(xiàn)從服務(wù)器端取數(shù)據(jù)。
              在Model Locator 保存狀態(tài)并且能使Model檢測到View的變化。這樣一來用戶操作就能直接影響Model。
              它的體系主要包含下面幾部分(具體用法就不做分析了):

              1. Business(業(yè)務(wù)邏輯部分)

              2. Command(命令部分)

              3. Control(控制部分)

              4. Model(數(shù)據(jù)模型)

              5. View(界面視圖)

              6. VO(ValueObject)


              使用cairngorm 對于整個(gè)事件的流程會比較的清晰。個(gè)人認(rèn)為它的整個(gè)流程很符合人類的思維方式。但是在實(shí)際開發(fā)中卻感覺 每當(dāng)添加一個(gè)事件的時(shí)候,就要去寫event command delegate,事件一多就會感覺重復(fù)寫這些東西很煩。這時(shí)候就開始考慮更換一下框架,于是在頭的指導(dǎo)下去看了pureMvc框架。
              學(xué)了兩天后,就深深喜歡上pureMvc了,哈哈!
              顧名思義。pureMvc 就是純的mvc框架,許多人都錯(cuò)誤地把PureMVC誤認(rèn)為它是一個(gè)Flash的MVC框架或者是Flex的MVC框架。既然它是一個(gè)純框架,那么,它就不僅僅是支持某種特定 的語言,它的設(shè)計(jì)是與語言無關(guān)的。它支持了好多種常用的編程語言。
              pureMvc的層次結(jié)構(gòu)比cairngorm清晰的多,嚴(yán)格的MVC三層結(jié)構(gòu)。
              1、Model保存對Proxy對象的引用,Proxy負(fù)責(zé)操作數(shù)據(jù)模型,與遠(yuǎn)程服務(wù)通信存取數(shù)據(jù)。

              2、View保存對Mediator對象的引用。由Mediator對象來操作具體的視圖組件(View Component,例如Flex的DataGrid組件),包括:添加事件監(jiān)聽器,發(fā)送或接收Notification ,直接改變視圖組件的狀態(tài)。

              3、Controller保存所有Command的映射。Command可以獲取Proxy對象并與之交互,通過發(fā)送Notification來執(zhí)行其他的Command。

              pureMvc采用了“觀察者模式”(被觀察者是不關(guān)心觀察者是誰的),通過消息機(jī)制,來維持command 與 mediator的關(guān)系,將它們之間的耦合度降到最低。notification機(jī)制也是我最喜歡pureMvc的一個(gè)方面。



          posted @ 2009-07-21 22:03 hot 閱讀(264) | 評論 (0)編輯 收藏

           在西安做項(xiàng)目時(shí) 遇到的一個(gè)文件下載 文件名亂碼的問題 ,下面是解決方案:

           //輸出文件流
                 response.setContentType("application/octet-stream;charset=ISO8859-1");
             String agent = request.getHeader("USER-AGENT");
             if (null != agent && -1 != agent.indexOf("MSIE")){
              response.setHeader("Content-Disposition","attachment;" + "filename=" + URLEncoder.encode( file.getName() , "UTF8"));
             }
             else if (null != agent && -1 != agent.indexOf("Mozilla")){   
              response.setHeader("Content-Disposition","attachment;" + "filename=" + new String(file.getName().getBytes("UTF-8"),"ISO8859-1"));
             }
             else {
                response.setHeader("Content-Disposition","attachment;filename=" + file.getName() );
             }
                 java.io.FileInputStream fr = new java.io.FileInputStream(fpath);
                   java.io.InputStreamReader is = new java.io.InputStreamReader(fr,"ISO8859-1");  
                   java.io.BufferedReader br=new java.io.BufferedReader(is);
             out = response.getOutputStream();
             
             int i = 0;
             while((i= br.read()) != -1){  
                       out.write(i);
                   }  
          posted @ 2009-07-21 16:59 hot 閱讀(192) | 評論 (0)編輯 收藏

          設(shè)置變量
          <s:set name="maxRowIndex" value="%{formInfo.maxRowIndex}"/>

          for 循環(huán)
          <s:bean name="org.apache.struts2.util.Counter" id="counter">
            <s:param name="first" value="0" />
            <s:param name="last" value="#maxRowIndex" />
            <s:iterator>
            </s:iterator>
          </s:bean>

          迭代<s:iterator>用于將List、Map、ArrayList等集合進(jìn)行循環(huán)遍歷
          <s:iterator value="#rowList">
          </s:iterator>

          if語句
          <s:if test="#rowList==null">
          </s:if>

          生成html代碼
          <s:property value="%{formInfo.jsCode}" escape="false"/>
          escape="false" 不進(jìn)行轉(zhuǎn)義

          posted @ 2009-07-21 14:21 hot 閱讀(236) | 評論 (0)編輯 收藏

          private List sortFieldListByRowIndex(List fieldList){
            Comparator<DynamicFormField> comparator = new Comparator<DynamicFormField>(){
             public int compare(DynamicFormField f1, DynamicFormField f2) {
               if(f1.getRowIndex()!=f2.getRowIndex()){
                   return f1.getRowIndex()-f2.getRowIndex();
                }else if(f1.getColIndex()!=f2.getColIndex()){
                 return f1.getColIndex()-f2.getColIndex();
                }else{
                 return (int) (f1.getId() - f2.getId());
                }
             }
            };
            Collections.sort(fieldList, comparator);
            return fieldList;
           }
          這是工作中 使用過的一個(gè)例子。
          對fieldList中DynamicFormField對象 先按其rowIndex排序后按colIndex排序
          posted @ 2009-07-21 14:03 hot 閱讀(494) | 評論 (1)編輯 收藏

          新手上路啊!希望以后可以跟大家多交流!

          posted @ 2009-07-21 13:55 hot 閱讀(122) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 泸溪县| 南昌县| 湟中县| 钦州市| 麻江县| 沭阳县| 碌曲县| 永寿县| 成安县| 河源市| 隆德县| 海安县| 镇安县| 南靖县| 南漳县| 渝北区| 易门县| 岳池县| 祁连县| 乐业县| 永登县| 重庆市| 东乌| 洛南县| 宜阳县| 东乡县| 临沭县| 怀柔区| 留坝县| 洪湖市| 偏关县| 天峨县| 泊头市| 天门市| 泰顺县| 攀枝花市| 政和县| 彭山县| 大埔区| 牡丹江市| 江川县|