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

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

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

    隨筆-12  評(píng)論-6  文章-0  trackbacks-0
      2016年12月16日
         摘要: 需求描述:公司通過(guò)APP產(chǎn)品分享出去的需求和簡(jiǎn)歷是做了一個(gè)H5頁(yè)面作為分享的鏈接,通過(guò)APP分享出去自然是沒問(wèn)題,也是第一次分享,之后通過(guò)微信打開H5頁(yè)面后想再次分享出去時(shí)候就變成了一個(gè)鏈接了,而不是自己定制的卡片模式,初次分享后如下:但是打開以后的H5頁(yè)面再分享出去就變成這個(gè)樣子了:也就是說(shuō)需要在H5頁(yè)面做微信分享的相關(guān)工作,JS-SDK上場(chǎng)了,首先看看JS-SDK的官方說(shuō)明文檔:https:/...  閱讀全文
    posted @ 2016-12-16 17:05 小人物_Amor 閱讀(3554) | 評(píng)論 (0)編輯 收藏
      2016年11月9日
    Apache Zeppelin啟動(dòng)默認(rèn)是匿名(anonymous)模式登錄的,也就是任何人都可以訪問(wèn),這個(gè)可以在/zeppelin/conf下的zeppelin-site.xml中看到:
    <property>
    <name>zeppelin.anonymous.allowed</name>
    <value>true</value>
    <description>Anonymous user allowed by default</description>
    </property>
    description中寫道Anonymous user allowed by default(匿名用戶默認(rèn)被允許),這樣我們?cè)L問(wèn)我們安裝的zepplin界面里是這樣的:
    右上角顯示anonymous表示匿名模式。
    接下來(lái)我們要做的就是如何通過(guò)修改配置來(lái)讓我們的zeppelin擁有驗(yàn)證登錄的功能:
    1. 修改/zeppelin/conf/zeppelin-site.xml文件選項(xiàng)zeppelin.anonymous.allowed的value為false,表示不允許匿名訪問(wèn):
      1. <property>
    <name>zeppelin.anonymous.allowed</name>
    <value>false</value>
    <description>Anonymous user allowed by default</description>
    </property>
    1. 修改/zeppelin/conf/shiro.ini文件,顯然zeppelin采用了shiro作為他的驗(yàn)證登錄權(quán)限控制框架,那么我們需要對(duì)shiro有一些了解,我們?nèi)タ丛撐募淖詈髱仔校?/li>
    [urls]
    # anon means the access is anonymous.
    # authcBasic means Basic Auth Security
    # authc means Form based Auth Security
    # To enfore security, comment the line below and uncomment the next one
    /api/version = anon
    /** = anon
    #/** = authc
    顯然是對(duì)localhost:7878/#/**的進(jìn)行驗(yàn)證,對(duì)/**的不驗(yàn)證,那我們就修改為對(duì)任何url訪問(wèn)都需要驗(yàn)證:把/**=anon修改為/**=authc,這樣重啟zeppelin后訪問(wèn)我們的zeppelin主頁(yè)就變成這個(gè)樣子了:
    看見右上角的Login按鈕了吧?對(duì)的,你現(xiàn)在zeppelin已經(jīng)需要登錄才能繼續(xù)訪問(wèn)了,可是滿屏幕的去找也沒找到注冊(cè)的地方,那么我們通過(guò)什么賬號(hào)來(lái)進(jìn)行登錄呢?繼續(xù)修改zeppelin/conf/shiro.ini文件:
    [users]
    # List of users with their password allowed to access Zeppelin.
    # To use a different strategy (LDAP / Database / ...) check the shiro doc at http://shiro.apache.org/configuration.html#Configuration-INISections
    admin = admin
    user1 = password2, role1, role2
    user2 = password3, role3
    user3 = password4, role2
    已經(jīng)給我們加了這些賬號(hào)了,看第一條注釋提供了用戶以及對(duì)應(yīng)的密碼用來(lái)允許訪問(wèn)zeppelin,然后你自己可以在下面加一些用戶xxx = yyy,其中的角色也可以自行選擇,需要詳細(xì)了解的可以熟悉熟悉shiro的角色權(quán)限控制。重啟zeppelin用你知道的賬號(hào)去登錄吧~!
    輸入對(duì)應(yīng)賬號(hào)進(jìn)入主頁(yè)后選擇一個(gè)你已經(jīng)添加過(guò)的notebook進(jìn)去然后去右上角看見有一把小鎖:
    會(huì)顯示Note Permissions點(diǎn)擊后出現(xiàn)上圖所示可以填寫該notebook的Owners(所有者)、Readers(只讀用戶)、Writers(讀寫用戶),這樣每一個(gè)notebook就可以歸屬于某一個(gè)具體的用戶了,避免了多用戶同時(shí)使用zeppelin可能造成的沖突。
    還有很多其他功能值得你去發(fā)現(xiàn)、研究!
    posted @ 2016-11-09 15:32 小人物_Amor 閱讀(3129) | 評(píng)論 (0)編輯 收藏
    Apache Zeppelin官網(wǎng):http://zeppelin.apache.org/
    Apache Zeppelin介紹:A web-based notebook that enables interactive data analytics.  You can make beautiful data-driven, interactive and collaborative documents with SQL, Scala and more.

    安裝說(shuō)明:
        下載地址:http://zeppelin.apache.org/download.html當(dāng)前最新版是0.6.1 
    點(diǎn)擊下載后解壓到指定文件夾,你的zeppelin就安裝完成了,很簡(jiǎn)單。但是zeppelin依賴于jdk,所以使用zeppelin前還需要機(jī)器擁有jdk環(huán)境。
    解壓完畢后需要配置幾個(gè)地方:
    • 將conf中的zeppelin-env.sh.template與zeppelin-site.xml.template 重命名,去掉template
    • 修改conf/zepplin-env.sh 新增
      export  SPARK_MASTER_IP=127.0.0.1
      export  SPARK_LOCAL_IP=127.0.0.1
      修改 export ZEPPELIN_MEM="-Xmx2048m -XX:PermSize=256M"  
    需要注意的是lib下的jar包,默認(rèn)帶的jackson-databind-2.5.3.jar包是無(wú)法使用的,這點(diǎn)不知道為什么zeppelin怎么處理的,需要將jackson-databind/jackson-annonations/jackson-core三個(gè)jar包全部替換成2.6.5版本的就可以了。
    啟動(dòng)zeppelin:進(jìn)入bin目錄下執(zhí)行 ./zeppelin-daemon.sh start 
    然后瀏覽器訪問(wèn)127.0.0.1:8080就進(jìn)入如下頁(yè)面:
    ok,你的zeppelin安裝成功了!
    其實(shí)zeppelin就是一個(gè)java web項(xiàng)目,這樣理解起來(lái)似乎就容易點(diǎn)了,接下來(lái)為了可以使用sql統(tǒng)計(jì)數(shù)據(jù),我們來(lái)操作一下如何添加interpreter:
    1. 首先修改conf/zeppelin-site.xml,添加org.apache.zeppelin.jdbc.JdbcInterpreter
    2. 進(jìn)入lib目錄下上傳 JdbcInterpreter.jar、mysql-connection-.....jar兩個(gè)jar包
    3. 然后重啟zeppelin,進(jìn)入web頁(yè)面的interpreter下,點(diǎn)擊create:添加完成之后是這個(gè)樣子:
    4. 然后進(jìn)入notebook頁(yè)面:綁定剛剛添加的interpreter就可以使用了:
              
    這樣一個(gè)JdbcInterpreter就添加完畢了。
    至于以后再想和redis、solr一起使用也是相應(yīng)的加入jar包就可以了~
    就我個(gè)人來(lái)說(shuō)zeppelin可以滿足企業(yè)運(yùn)營(yíng)這塊的需求,包括日活、百度引流統(tǒng)計(jì)、ngnix日志分析、用戶行為分析、熱門詞匯、整體數(shù)據(jù)統(tǒng)計(jì)、多維度數(shù)據(jù)統(tǒng)計(jì)等等。
    posted @ 2016-11-09 15:16 小人物_Amor 閱讀(2044) | 評(píng)論 (0)編輯 收藏
      2014年10月8日
    1.JDK和JRE的區(qū)別:
        JDK是Java Development Kit。是面向開發(fā)人員使用的SDK,提供了java的開發(fā)環(huán)境以及運(yùn)行環(huán)境。
         JRE是Java Runtime Enviroment。是指java的運(yùn)行環(huán)境,是面向java程序得使用者,而不是開發(fā)者。

    2.序列化的目的:
        Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將Object從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。這就需要有一種可以在兩端傳輸數(shù)據(jù)的協(xié)議。Java序列化機(jī)制就是為了解決這個(gè)問(wèn)題而產(chǎn)生。
        以某種存儲(chǔ)形式使自定義對(duì)象持久化。
        將對(duì)象從一個(gè)地方傳到另一個(gè)地方。

    3.equals和==的區(qū)別:
        基本數(shù)據(jù)類型應(yīng)該用“==”來(lái)比較他們的值。
        當(dāng)比較對(duì)象時(shí)候,如果對(duì)象里重寫了equals方法,比如String,Integer,Date這些類,比較對(duì)象的內(nèi)存地址應(yīng)該用“==”,比較對(duì)象的值用“equals”,如果沒有重寫equals方法,兩者本質(zhì)上是相同的,都是比較值。

    4.什么時(shí)候使用Comparator and Comparable 接口
        當(dāng)需要排序的集合或數(shù)組不是單純的數(shù)字類型的時(shí)候,通??梢允褂肅omparator或Comparable,以簡(jiǎn)單的方式實(shí)現(xiàn)對(duì)象排序和自定義排序。
        Comparable用在對(duì)象本身,說(shuō)明這個(gè)對(duì)象是可以被比較的,也就是說(shuō)可以被排序的。(String和Integer之所以可以比較大小,是因?yàn)樗鼈兌紝?shí)現(xiàn)了Comparable接口,并實(shí)現(xiàn)了compareTo()方法)。
        Compator用在對(duì)象外,相當(dāng)于定義了一個(gè)排序算法。

    5.轉(zhuǎn)發(fā)和重定向的區(qū)別:
        轉(zhuǎn)發(fā)時(shí)URL不會(huì)改變,request請(qǐng)求內(nèi)的對(duì)象將可以繼續(xù)使用,重定向時(shí)瀏覽器URL會(huì)改變,之前的request會(huì)丟失,因此request里的數(shù)據(jù)也不會(huì)得到。
        通常情況下轉(zhuǎn)發(fā)速度更快,而且能保持request內(nèi)的對(duì)象,但是轉(zhuǎn)發(fā)之后,瀏覽器的連接還在先前頁(yè)面所以可以重載先前頁(yè)面。
        轉(zhuǎn)發(fā):request.getRequestDispatcher("apage.jsp").forward(request, response);
       重定向:response.sendRedirect("apage.jsp");
       
    6.編譯期異常和運(yùn)行時(shí)異常
        編譯時(shí)異常可以捕捉,比如我們讀寫文件時(shí)候會(huì)拋出IOException,操作數(shù)據(jù)庫(kù)時(shí)會(huì)有SQLException,運(yùn)行時(shí)異常不可以捕捉,比如數(shù)組下標(biāo)溢出,空指針異常等

    7.Struts1原理和Struts2原理以及區(qū)別和聯(lián)系,在什么項(xiàng)目中用過(guò),有什么體會(huì)?
        struts1原理:客戶端發(fā)送HttpServletRequest請(qǐng)求給ActionServlet,ActionServlet會(huì)檢索和用戶請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在就返回請(qǐng)求路徑無(wú)效的信息,如果存在就會(huì)把請(qǐng)求的表單數(shù)據(jù)保存到ActionForm中去,如果ActionForm不存在就會(huì)創(chuàng)建一個(gè)ActionForm對(duì)象,然后再根據(jù)配置信息決定是否需要表單驗(yàn)證,如果需要驗(yàn)證就調(diào)用ActionForm的validate()方法,驗(yàn)證通過(guò)后ActionServlet根據(jù)ActionMapping實(shí)例包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在就先創(chuàng)建這個(gè)Action然后調(diào)用Action的execute()方法。Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指向的jsp組件。
       struts2原理:客戶端發(fā)送HttpServletRequest請(qǐng)求,請(qǐng)求被提交到一系列的Filter,首先是ActionContextCleanUp,然后是其他Filter,最后是FilterDispatcher。FilterDispatcher是Struts2的核心,就是MVC的Struts2實(shí)現(xiàn)中控制層的核心。FilterDispatcher詢問(wèn)ActionMapper決定需要調(diào)用哪個(gè)Action,F(xiàn)ilterDispatcher會(huì)把請(qǐng)求交給ActionProxy,ActionProxy會(huì)根據(jù)Struts.xml配置文件找到需要調(diào)用的Action類。ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,同時(shí)ActionInvocation通過(guò)代理模式調(diào)用Action類,調(diào)用之前會(huì)加載Action相關(guān)的所有攔截器,一旦Action執(zhí)行完畢,ActionInvocation根據(jù)Struts.xml配置文件返回對(duì)應(yīng)的result。
        區(qū)別:1.Struts1是通過(guò)Servlet啟動(dòng)的,struts1要求Action繼承一個(gè)抽象類,而不是接口,Struts2的Action類可以實(shí)現(xiàn)一個(gè)Action接口也可以實(shí)現(xiàn)其他接口。
                   2.struts1的Action是單例模式線程是不安全的,struts2是線程安全的,Action為每一個(gè)請(qǐng)求都生成了一個(gè)實(shí)例。
                   3.struts1是以ActionServlet為核心控制器,struts2是以FilterDispatcher為核心控制器。
        執(zhí)行流程:

    a)struts1 
    jsp發(fā)起httprequest請(qǐng)求->servlet捕獲->struts.xml->namespace+ActionName-> Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁(yè)
    b) Action(jsp發(fā)起httprequest請(qǐng)求,被過(guò)濾器捕獲)->FilterDispatcher->struts.xml->namespace+ActionName->new Action->填充表單setXxx()->action.execute()->”success”->Result->設(shè)置request屬性->跳轉(zhuǎn)目標(biāo)頁(yè)



    8.spring原理
        spring的最大作用ioc/di,將類與類的依賴關(guān)系寫在配置文件中,程序在運(yùn)行時(shí)根據(jù)配置文件動(dòng)態(tài)加載依賴的類,降低的類與類之間的藕合度。它的原理是在applicationContext.xml加入bean標(biāo)記,在bean標(biāo)記中通過(guò)class屬性說(shuō)明具體類名、通過(guò)property標(biāo)簽說(shuō)明該類的屬性名、通過(guò)constructor-args說(shuō)明構(gòu)造子的參數(shù)。其一切都是反射,當(dāng)通過(guò)applicationContext.getBean(“id名稱”)得到一個(gè)類實(shí)例時(shí),就是以bean標(biāo)簽的類名、屬性名、構(gòu)造子的參數(shù)為準(zhǔn),通過(guò)反射實(shí)例對(duì)象,喚起對(duì)象的set方法設(shè)置屬性值、通過(guò)構(gòu)造子的newInstance實(shí)例化得到對(duì)象。正因?yàn)閟pring一切都是反射,反射比直接調(diào)用的處理速度慢,所以這也是spring的一個(gè)問(wèn)題。
        spring第二大作用就是aop,其機(jī)理來(lái)自于代理模式,代理模式有三個(gè)角色分別是通用接口、代理、真實(shí)對(duì)象。代理、真實(shí)對(duì)象實(shí)現(xiàn)的是同一接口,將真實(shí)對(duì)象作為代理的一個(gè)屬性,向客戶端公開的是代理,當(dāng)客戶端調(diào)用代理的方法時(shí),代理找到真實(shí)對(duì)象,調(diào)用真實(shí)對(duì)象方法,在調(diào)用之前之后提供相關(guān)的服務(wù),如事務(wù)、安全、日志。其名詞分別是代理、真實(shí)對(duì)象、裝備、關(guān)切點(diǎn)、連接點(diǎn)。

    9.簡(jiǎn)要概述一下SpringMVC和StrutsMVC
        Spring的MVC框架主要由DispatcherServlet、處理器映射、處理器、視圖解析器、視圖組成。
            1)DispatcherServlet接收到請(qǐng)求后,根據(jù)對(duì)應(yīng)配置文件中配置的處理器映射,找到對(duì)應(yīng)的處理器映射項(xiàng)(HandlerMapping),根據(jù)配置的映射規(guī)則,找到對(duì)應(yīng)的處理器(Handler)。
            2)調(diào)用相應(yīng)處理器中的處理方法,處理該請(qǐng)求,處理器處理結(jié)束后會(huì)將一個(gè)ModelAndView類型的數(shù)據(jù)傳給DispatcherServlet,這其中包含了處理結(jié)果的視圖和視圖中要使用的數(shù)據(jù)。
            3)DispatcherServlet 根據(jù)得到的ModelAndView中的視圖對(duì)象,找到一個(gè)合適的ViewResolver(視圖解析器),根據(jù)視圖解析器的配 置,DispatcherServlet將視圖要顯示的數(shù)據(jù)傳給對(duì)應(yīng)的視圖,最后給瀏覽器構(gòu)造一個(gè)HTTP響應(yīng)。

            DispatcherServlet是整個(gè)Spring MVC的核心。它負(fù)責(zé)接收HTTP請(qǐng)求組織協(xié)調(diào)Spring MVC的各個(gè)組成部分。其主要工作有以下三項(xiàng):
                1)截獲符合特定格式的URL請(qǐng)求。
                2)初始化DispatcherServlet上下文對(duì)應(yīng)的WebApplicationContext,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)。
                3)初始化Spring MVC的各個(gè)組成組件,并裝配到DispatcherServlet中。

        StrutsMVC
              1.當(dāng)啟動(dòng)容器時(shí),容器(tomcat、weblogic)實(shí)例化ActionServlet,初始化ActionServlet,在初始化
    ActionServlet時(shí)加載struts-config.xml文件。
             2.當(dāng)客戶通過(guò)url.do將請(qǐng)求發(fā)給ActionServlet,ActionServlet將處理轉(zhuǎn)發(fā)給助手RequestProcessor,RequestProcess通過(guò)struts-config.xml找到對(duì)應(yīng)的actionForm及 action,如果有ActionForm用已有的,沒有通過(guò)類的反射實(shí)例化一個(gè)新的ActionForm,放置到作用域?qū)ο?,通過(guò)反射
    1. 將表單域的值填充到actionForm中。如果有Action用已有的,沒有產(chǎn)生一個(gè)新的,通過(guò)反射調(diào)用action實(shí)例的execute方法,在執(zhí)行前將actionForm通過(guò)參數(shù)注入到execute方法中。
    2.          3.execute方法執(zhí)行結(jié)束前通過(guò)actionMapping找到actionForward轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面。

    10.Servlet的工作原理、生命周期
        Servlet的工作原理:
            Servlet 生命周期:Servlet 加載--->實(shí)例化--->服務(wù)--->銷毀。
            init():在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的,負(fù)責(zé)初始化Servlet 對(duì)象。可以配置服務(wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet,都不會(huì)重復(fù)執(zhí)行 init()。
            service():它是Servlet的核心,負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的 Service()方法就要調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請(qǐng)求”(ServletRequest)對(duì)象和一個(gè)“響應(yīng)” (ServletResponse)對(duì)象作為參數(shù)。在HttpServlet中已存在Service()方法。默認(rèn)的服務(wù)功能是調(diào)用與HTTP請(qǐng)求的方法 相應(yīng)的do功能。
            destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資 源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程,因此需要確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已經(jīng)終止或完成。

        Servlet工作原理:
            1、首先簡(jiǎn)單解釋一下Servlet接收和響應(yīng)客戶請(qǐng)求的過(guò)程,首先客戶發(fā)送一個(gè)請(qǐng)求,Servlet是調(diào)用service()方法對(duì)請(qǐng)求進(jìn)行響應(yīng) 的,通過(guò)源代碼可見,service()方法中對(duì)請(qǐng)求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對(duì)應(yīng)的方法中調(diào)用邏輯層 的方法,實(shí)現(xiàn)對(duì)客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法 的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個(gè)Servlet的時(shí)候,都必須實(shí)現(xiàn)doGet或 doPost等這些方法。
            2、每一個(gè)自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個(gè)方法,其中比較重要的三個(gè)方法涉及到 Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個(gè)通用的,不 特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此 HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時(shí)候只需要繼承HttpServlet即可。
            3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以 HttpServlet中實(shí)現(xiàn)了service()方法,并將請(qǐng)求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。

    11.OOA、OOD、OOP含義
        Object-Oriented Analysis:面向?qū)ο蠓治龇椒?/span>
        Object-Oriented Design:面向?qū)ο笤O(shè)計(jì)
        Object Oriented Programming:面向?qū)ο缶幊?/span>
        OOA是對(duì)系統(tǒng)業(yè)務(wù)調(diào)查了解之后根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)分析,在OOA分析的基礎(chǔ)上對(duì)系統(tǒng)根據(jù)面向?qū)ο蟮乃枷脒M(jìn)行系統(tǒng)設(shè)計(jì),從而能夠直接進(jìn)行OOP面向?qū)ο缶幊獭?/span>
    12.mysql分頁(yè)查詢
       對(duì)于有大數(shù)據(jù)量的mysql表來(lái)說(shuō),使用LIMIT分頁(yè)存在很嚴(yán)重的性能問(wèn)題。
       查詢從第1000000之后的30條記錄:

            SQL代碼1:平均用時(shí)6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30

            SQL代碼2:平均用時(shí)0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30

        因?yàn)橐〕鏊凶侄蝺?nèi)容,第一種需要跨越大量數(shù)據(jù)塊并取出,而第二種基本通過(guò)直接根據(jù)索引字段定位后,才取出相應(yīng)內(nèi)容,效率自然大大提升。

        可以看出,越往后分頁(yè),LIMIT語(yǔ)句的偏移量就會(huì)越大,兩者速度差距也會(huì)越明顯。

        實(shí)際應(yīng)用中,可以利用類似策略模式的方式去處理分頁(yè),比如判斷如果是一百頁(yè)以內(nèi),就使用最基本的分頁(yè)方式,大于一百頁(yè),則使用子查詢的分頁(yè)方式。

        Oracle查詢:SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40WHERE RN >= 21


    13.單例模式、工廠模式、代理模式

        枚舉實(shí)現(xiàn)單例模式:

        public enum Singleton {

        /**
    * 定義一個(gè)枚舉的元素,它就代表了Singleton的一個(gè)實(shí)例。
    */

    uniqueInstance;

    /**
    * 單例可以有自己的操作
    */
    public void singletonOperation(){
    //功能處理
    }
    }
      懶漢同步單例模式:
      public class LazySingleton { 
        private static LazySingleton instance = null; 
        /** 
         * 私有默認(rèn)構(gòu)造子 
         */ 
        private LazySingleton(){} 
        /** 
         * 靜態(tài)工廠方法 
         */ 
        public static synchronized LazySingleton getInstance(){ 
            if(instance == null){ 
                instance = new LazySingleton(); 
            } 
            return instance; 
        } 
    }
    工廠模式:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
    代理模式:http://yangguangfu.iteye.com/blog/815787

    未完待續(xù)...











    posted @ 2014-10-08 16:50 小人物_Amor 閱讀(350) | 評(píng)論 (0)編輯 收藏
    1. Servlet 生命周期:Servlet 加載--->實(shí)例化--->服務(wù)--->銷毀。
    2. init():在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的,負(fù)責(zé)初始化Servlet 對(duì)象??梢耘渲梅?wù)器,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet,都不會(huì)重復(fù)執(zhí)行 init()。
    3. service():它是Servlet的核心,負(fù)責(zé)響應(yīng)客戶的請(qǐng)求。每當(dāng)一個(gè)客戶請(qǐng)求一個(gè)HttpServlet對(duì)象,該對(duì)象的 Service()方法就要調(diào)用,而且傳遞給這個(gè)方法一個(gè)“請(qǐng)求”(ServletRequest)對(duì)象和一個(gè)“響應(yīng)” (ServletResponse)對(duì)象作為參數(shù)。在HttpServlet中已存在Service()方法。默認(rèn)的服務(wù)功能是調(diào)用與HTTP請(qǐng)求的方法 相應(yīng)的do功能。
    4. destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對(duì)象退出生命周期時(shí),負(fù)責(zé)釋放占用的資 源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程,因此需要確認(rèn)在調(diào)用destroy()方法時(shí),這些線程已經(jīng)終止或完成。

    Tomcat 與 Servlet 是如何工作的:

    步驟:

    1. Web Client 向Servlet容器(Tomcat)發(fā)出Http請(qǐng)求
    2. Servlet容器接收Web Client的請(qǐng)求
    3. Servlet容器創(chuàng)建一個(gè)HttpRequest對(duì)象,將Web Client請(qǐng)求的信息封裝到這個(gè)對(duì)象中。
    4. Servlet容器創(chuàng)建一個(gè)HttpResponse對(duì)象
    5. Servlet容器調(diào)用HttpServlet對(duì)象的service方法,把HttpRequest對(duì)象與HttpResponse對(duì)象作為參數(shù)傳給 HttpServlet 對(duì)象。
    6. HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息。
    7. HttpServlet調(diào)用HttpResponse對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)。
    8. Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client。

     

    Servlet工作原理:

    1、首先簡(jiǎn)單解釋一下Servlet接收和響應(yīng)客戶請(qǐng)求的過(guò)程,首先客戶發(fā)送一個(gè)請(qǐng)求,Servlet是調(diào)用service()方法對(duì)請(qǐng)求進(jìn)行響應(yīng) 的,通過(guò)源代碼可見,service()方法中對(duì)請(qǐng)求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對(duì)應(yīng)的方法中調(diào)用邏輯層 的方法,實(shí)現(xiàn)對(duì)客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法 的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個(gè)Servlet的時(shí)候,都必須實(shí)現(xiàn)doGet或 doPost等這些方法。

    2、每一個(gè)自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個(gè)方法,其中比較重要的三個(gè)方法涉及到 Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個(gè)通用的,不 特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此 HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時(shí)候只需要繼承HttpServlet即可。

    3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以 HttpServlet中實(shí)現(xiàn)了service()方法,并將請(qǐng)求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。

     

     

    創(chuàng)建Servlet對(duì)象的時(shí)機(jī):

    1. Servlet容器啟動(dòng)時(shí):讀取web.xml配置文件中的信息,構(gòu)造指定的Servlet對(duì)象,創(chuàng)建ServletConfig對(duì)象,同時(shí)將ServletConfig對(duì)象作為參數(shù)來(lái)調(diào)用Servlet對(duì)象的init方法。
    2. 在Servlet容器啟動(dòng)后:客戶首次向Servlet發(fā)出請(qǐng)求,Servlet容器會(huì)判斷內(nèi)存中是否存在指定的Servlet對(duì)象,如果沒有則 創(chuàng)建它,然后根據(jù)客戶的請(qǐng)求創(chuàng)建HttpRequest、HttpResponse對(duì)象,從而調(diào)用Servlet 對(duì)象的service方法。
    3. Servlet Servlet容器在啟動(dòng)時(shí)自動(dòng)創(chuàng)建Servlet,這是由在web.xml文件中為Servlet設(shè)置的<load- on-startup>屬性決定的。從中我們也能看到同一個(gè)類型的Servlet對(duì)象在Servlet容器中以單例的形式存在。
      <servlet>
              
      <servlet-name>Init</servlet-name>
              
      <servlet-class>org.xl.servlet.InitServlet</servlet-class>
              
      <load-on-startup>1</load-on-startup>
      </servlet>

     

    posted @ 2014-10-08 15:16 小人物_Amor 閱讀(284) | 評(píng)論 (0)編輯 收藏
      2014年9月29日
    Arrays.sort(T[], Comparator < ? super T > c) 方法用于對(duì)象數(shù)組按用戶自定義規(guī)則排序。
    Collections.sort(List<T>, Comparator < ? super T > c)方法用于對(duì)象集合按用戶自定義規(guī)則排序。

    Comparable用在對(duì)象本身,說(shuō)明這個(gè)對(duì)象是可以被比較的,也就是說(shuō)可以被排序的。(String和Integer之所以可以比較大小,是因?yàn)樗鼈兌紝?shí)現(xiàn)了Comparable接口,并實(shí)現(xiàn)了compareTo()方法)。
    Compator用在對(duì)象外,相當(dāng)于定義了一個(gè)排序算法。
    所以當(dāng)對(duì)象本身實(shí)現(xiàn)了Comparable接口,那么Arrays.sort(T[])就可以了。同理Collections.sort(List<T>)就可以了。

    還是代碼來(lái)的直接:
    package com.zx.ww.comparable;

    import java.util.Arrays;
    import java.util.Comparator;

    public class ComparatorTest {
        
        
    public static void main(String[] args) {
            Dog d1 
    = new Dog(2);
            
            Dog d2 
    = new Dog(1);
            
            Dog d3 
    = new Dog(3);
            
            Dog[] dogArray 
    = {d1, d2, d3};
            
            printDogs(dogArray);
            
            Arrays.sort(dogArray, 
    new DogSizeComparator());
            
            printDogs(dogArray);
        }
        
        
    public static void printDogs(Dog[] dogArray) {
            
    for (Dog dog : dogArray) {
                System.out.print(dog.size
    +" ");
            }
            System.out.println();
        }

    }

    class Dog{
        
    int size;
        
    public Dog(int size) {
            
    this.size = size;
        }
    }

    class DogSizeComparator implements Comparator<Dog> {
        @Override
        
    public int compare(Dog dog1, Dog dog2) {
            
    // TODO Auto-generated method stub
            return dog1.size - dog2.size;
        }
    }
    輸出結(jié)果:
    2 1 3 
    1 2 3
    這是對(duì)象數(shù)組用了Comparator的結(jié)果。

    下面看對(duì)象自身實(shí)現(xiàn)了Comparable接口的方式:
    /**
     * 
     
    */
    package com.zx.ww.comparable;

    import java.util.Arrays;

    /**
     * 
    @author wuwei
     * 2014年9月29日
     
    */
    public class User implements Comparable<Object>{

        
    private int id;
        
        
    private String name;
        
        
    private int age;
        
        
    public User(int id, String name, int age) {
            
    this.id = id;
            
    this.name = name;
            
    this.age = age;
        }
        
        
        
        
    public int getId() {
            
    return id;
        }



        
    public void setId(int id) {
            
    this.id = id;
        }



        
    public String getName() {
            
    return name;
        }



        
    public void setName(String name) {
            
    this.name = name;
        }



        
    public int getAge() {
            
    return age;
        }



        
    public void setAge(int age) {
            
    this.age = age;
        }


        @Override
        
    public int compareTo(Object o) {
            
    // TODO Auto-generated method stub
            return this.age - ((User)o).getAge();
        }
        
        
    public static void main(String[] args) {
            User[] users 
    = new User[] {new User(1,"zhangsan",28), new User(2,"lisi",25)};
            Arrays.sort(users);
            
    for (int i = 0; i < users.length; i++) {
                User user 
    = users[i];
                System.out.println(user.getId()
    +" "+user.getAge());
            }
        }
        
    }
    輸出結(jié)果:
    2 25
    1 28
    上述都是Arrays.sort()的應(yīng)用方式,同理Collections.sort()一樣的實(shí)現(xiàn),代碼如下,比較簡(jiǎn)單:
    package com.zx.ww.comparable;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;

    public class CollectionSortTest {

        
    public static void main(String[] args) {
            List
    <String> list = new ArrayList<String>();
            list.add(
    "ac");
            list.add(
    "ab");
            list.add(
    "aa");
            list.add(
    "db");
            list.add(
    "ca");
            
            
    for (String string : list) {
                System.out.print(string 
    + " ");
            }
            System.out.println();
            Collections.sort(list);
            
            
    for (String string : list) {
                System.out.print(string 
    + " ");
            }
            System.out.println();
            
            
    //對(duì)象A自身實(shí)現(xiàn)Comparable接口
            List<A> aList = new ArrayList<A>();
            aList.add(
    new A("wuwei"1));
            aList.add(
    new A("zhangsan"3));
            aList.add(
    new A("lisi"2));
            
    for (A a : aList) {
                System.out.print(a
    +" ");
            }
            System.out.println();
            Collections.sort(aList);
            
    for (A a : aList) {
                System.out.print(a
    +" ");
            }
            System.out.println();
            
            
    //重寫Conparator接口方法
            List<B> bList = new ArrayList<B>();
            bList.add(
    new B("wuwei"1));
            bList.add(
    new B("zhangsan"3));
            bList.add(
    new B("lisi"2));
            
    for (B b : bList) {
                System.out.print(b
    +" ");
            }
            System.out.println();
            Collections.sort(bList, 
    new Comparator<B>() {

                @Override
                
    public int compare(B b1, B b2) {
                    
    // TODO Auto-generated method stub
                    return b1.getCount().compareTo(b2.getCount());
                }
            });
            
    for (B b : bList) {
                System.out.print(b
    +" ");
            }
            System.out.println();
            
        }
        
        
    }

    //對(duì)象A自身實(shí)現(xiàn)Comparable接口
    class A implements Comparable<A>{

        
    private String name;
        
        
    private Integer order;
        
        
    public A(String name, Integer order) {
            
    this.name = name;
            
    this.order = order;
        }
        
        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    public Integer getOrder() {
            
    return order;
        }

        
    public void setOrder(Integer order) {
            
    this.order = order;
        }

        
    public String toString() {
            
    return "name is " +name+" order is "+order;
        }
        
        @Override
        
    public int compareTo(A o) {
            
    // TODO Auto-generated method stub
            return this.order.compareTo(o.getOrder());
        }
        
    }

    class B{
        
    private String name;
        
        
    private Integer count;
        
        
    public B(String name, Integer count) {
            
    this.name = name;
            
    this.count = count;
        }

        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    public Integer getCount() {
            
    return count;
        }

        
    public void setCount(Integer count) {
            
    this.count = count;
        }
        
        
    public String toString() {
            
    return "name is "+name+" count is "+count;
        }
    }
    輸出結(jié)果:
    ac ab aa db ca 
    aa ab ac ca db 
    name is wuwei order is 
    1 name is zhangsan order is 3 name is lisi order is 2 
    name is wuwei order is 
    1 name is lisi order is 2 name is zhangsan order is 3 
    name is wuwei count is 
    1 name is zhangsan count is 3 name is lisi count is 2 
    name is wuwei count is 
    1 name is lisi count is 2 name is zhangsan count is 3








    posted @ 2014-09-29 16:08 小人物_Amor 閱讀(1104) | 評(píng)論 (0)編輯 收藏
      2014年9月25日
    /**
     * 
     
    */
    package com.zx.ww.arraysort;

    import java.text.Collator;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Comparator;
    import java.util.Locale;

    /**
     * 
    @author xue
     * 2014年9月24日
     
    */
    public class QuickSort {

        
    public static void main(String[] args) {
            
    for (int i = 0; i < 10; i++) {
                test();
            }
        }
        
        
    public static void test() {
            
            
    int len = 8000000;
            
    int[] array = new int[len];
            
    for (int i = 0; i < len; i++) {
                array[i] 
    = (int)(Math.random()*10000);
            }
            
            Calendar cal_before 
    = Calendar.getInstance();
            
    double before = cal_before.getTimeInMillis();
            System.out.println(cal_before.getTime());
            quickSort(array, 
    0, array.length-1);
            
            Calendar cal_after 
    = Calendar.getInstance();
            
    double after = cal_after.getTimeInMillis();
            System.out.println(cal_after.getTime());
            
            
            
    double time = after-before;
            System.out.println(
    "用時(shí):" + time + "ms");
            System.out.println(
    "==================================");
            
        }
        
        
    public static void quickSort(int[] array, int left, int right) {
            
    if(left < right) {
                
    int privot = getPrivot(array, left, right);
                quickSort(array, left, privot
    -1);
                quickSort(array, privot
    +1, right);
            }
            
        }
        
        
        
    //將數(shù)組劃分為兩個(gè)數(shù)組,左邊的數(shù)組都比中軸privot小,右邊的都比中軸privot大
        public static int getPrivot(int[] array, int left, int right) {
            
            
    int tmp = array[left];
            
            
    while(left < right) {
                
                
    while(left < right && array[right] >= tmp) {
                    right
    --;
                }
                
                array[left] 
    = array[right];
                
                
    while(left < right && array[left] <= tmp) {
                    left
    ++;
                }
                
                array[right] 
    = array[left];
                
            }
            
            array[left] 
    = tmp;
            
            
    return left;
        }
        
    }

    運(yùn)行十次輸出的結(jié)果:

    Thu Sep 25 13:09:40 CST 2014
    Thu Sep 
    25 13:09:41 CST 2014
    用時(shí):
    1613.0ms
    ==================================
    Thu Sep 
    25 13:09:41 CST 2014
    Thu Sep 
    25 13:09:43 CST 2014
    用時(shí):
    1614.0ms
    ==================================
    Thu Sep 
    25 13:09:43 CST 2014
    Thu Sep 
    25 13:09:45 CST 2014
    用時(shí):
    1691.0ms
    ==================================
    Thu Sep 
    25 13:09:45 CST 2014
    Thu Sep 
    25 13:09:47 CST 2014
    用時(shí):
    1622.0ms
    ==================================
    Thu Sep 
    25 13:09:47 CST 2014
    Thu Sep 
    25 13:09:48 CST 2014
    用時(shí):
    1621.0ms
    ==================================
    Thu Sep 
    25 13:09:49 CST 2014
    Thu Sep 
    25 13:09:50 CST 2014
    用時(shí):
    1615.0ms
    ==================================
    Thu Sep 
    25 13:09:50 CST 2014
    Thu Sep 
    25 13:09:52 CST 2014
    用時(shí):
    1614.0ms
    ==================================
    Thu Sep 
    25 13:09:52 CST 2014
    Thu Sep 
    25 13:09:54 CST 2014
    用時(shí):
    1632.0ms
    ==================================
    Thu Sep 
    25 13:09:54 CST 2014
    Thu Sep 
    25 13:09:55 CST 2014
    用時(shí):
    1614.0ms
    ==================================
    Thu Sep 
    25 13:09:56 CST 2014
    Thu Sep 
    25 13:09:57 CST 2014
    用時(shí):
    1614.0ms
    ==================================
    上述是快速排序八百萬(wàn)條數(shù)據(jù)用時(shí)基本在1.6s左右。

    接下來(lái)看冒泡排序:
    /**
     * 
     
    */
    package com.zx.ww.arraysort;

    import java.text.Collator;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Comparator;
    import java.util.Locale;

    /**
     * 
    @author wuwei
     * 2014年9月24日
     
    */
    public class BubbleSort {

        
    public static void main(String[] args) {
            
            
    for (int i = 0; i < 5; i++) {
                test();
            }
            
        }
        
        
    public static void test() {
            
            
    int len = 80000;
            
    int[] array = new int[len];
            
    for (int i = 0; i < array.length; i++) {
                array[i] 
    = (int)(Math.random()*10000);
            }
            
            Calendar calBefore 
    = Calendar.getInstance();
            System.out.println(calBefore.getTime());
            
            bubbleSort(array);
            
            Calendar calAfter 
    = Calendar.getInstance();
            System.out.println(calAfter.getTime());
            
            System.out.println(
    "總共用時(shí)" + (calAfter.getTimeInMillis()-calBefore.getTimeInMillis()) + "ms");
            
            System.out.println(
    "==========================");
            
        }
        
        
    public static void bubbleSort(int[] array) {
            
            
    int tmp;
            
    for (int i = 0; i < array.length; i++) {
                
    for (int j = 0; j < array.length-i-1; j++) {
                    
                    
    if(array[j] > array[j+1]) {
                        tmp 
    = array[j+1];
                        array[j
    +1= array[j];
                        array[j] 
    = tmp;
                    }
                    
                }
            }
        }
        
    }
    運(yùn)行五次輸出如下結(jié)果:
    Thu Sep 25 14:44:14 CST 2014
    Thu Sep 
    25 14:44:23 CST 2014
    總共用時(shí)8822ms
    ==========================
    Thu Sep 
    25 14:44:23 CST 2014
    Thu Sep 
    25 14:44:32 CST 2014
    總共用時(shí)8829ms
    ==========================
    Thu Sep 
    25 14:44:32 CST 2014
    Thu Sep 
    25 14:44:41 CST 2014
    總共用時(shí)8915ms
    ==========================
    Thu Sep 
    25 14:44:41 CST 2014
    Thu Sep 
    25 14:44:50 CST 2014
    總共用時(shí)8748ms
    ==========================
    Thu Sep 
    25 14:44:50 CST 2014
    Thu Sep 
    25 14:44:58 CST 2014
    總共用時(shí)8529ms
    ==========================
    冒泡排序八萬(wàn)條數(shù)據(jù)用時(shí)接近9s。

    需要注意的是快速排序是八百萬(wàn)條數(shù)據(jù)只用了1.6s左右。


    posted @ 2014-09-25 13:09 小人物_Amor 閱讀(262) | 評(píng)論 (0)編輯 收藏
      2014年9月24日
    /**
     * 
     
    */
    package com.infopatent.juangetljc.web.controller.util;

    import java.lang.reflect.Field;
    import java.text.Collator;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Locale;

    /**
     * 
    @author xue
     * 2014年9月24日
     
    */
    public class SortListByBeanPropertyUtil {

        
    //根據(jù)集合里的Bean擁有的屬性進(jìn)行排序
        
        
    public static <T> void sort(List<T> list, final String sortProperty, final String sort) {
            
            
    if(list == null || sortProperty == null || "".equals(sortProperty) || list.isEmpty())
                
    return;
            
            Collections.sort(list, 
    new Comparator<T>() {

                @Override
                
    public int compare(T t1, T t2) {
                    Object o1 
    = new Object();
                    Object o2 
    = new Object();
                    
    try {
                        o1 
    = SortListByBeanPropertyUtil.getFieldValue(t1, sortProperty);
                        o2 
    = SortListByBeanPropertyUtil.getFieldValue(t2, sortProperty);
                        
                    } 
    catch (Exception e) {
                        e.printStackTrace();
                    }
                    
    int result = 0;
                    
    if(o1 == null) {
                        result 
    = -1;
                    }
    else if(o2 == null) {
                        result 
    = 1;
                    }
    else if(o1 instanceof String) {
                        result 
    = Collator.getInstance(Locale.CHINESE).compare(o1, o2);
                    }
    else{
                        result 
    = ((Comparable)o1).compareTo(o2);
                    }
                    
                    
    //是否降序排序
                    if("desc".equalsIgnoreCase(sort)) {
                        result 
    = 0-result;
                    }
                    
                    
    return result;
                }
                
            });
            
        }
        
        
    //反射方法,反射出類型
        public static Object getFieldValue(Object obj, String fieldName) throws Exception {
            
    //反射出對(duì)象類型
            Class<?> cls = obj.getClass();
            
    //反射出類型字段
            Field field = cls.getDeclaredField(fieldName);
            
    //獲取屬性是,壓制java對(duì)訪問(wèn)修飾符的檢查
            field.setAccessible(true);
            
    //在對(duì)象obj上讀取field屬性的值
            Object val = field.get(obj);
            
    return val;
            
        }
        
    }
    posted @ 2014-09-24 16:25 小人物_Amor 閱讀(345) | 評(píng)論 (0)編輯 收藏
      2014年7月29日
        因?yàn)轫?xiàng)目框架hibernate里的hibernate.hbm2ddl.auto屬性設(shè)置為create(為了使得開發(fā)人員只關(guān)注于實(shí)體類而不必去關(guān)心數(shù)據(jù)庫(kù)設(shè)計(jì)。。。),所以我們每次部署項(xiàng)目的時(shí)候都會(huì)把數(shù)據(jù)庫(kù)生成的表全刪除了然后根據(jù)實(shí)體類生成數(shù)據(jù)表,這樣就需要在maven項(xiàng)目寫一個(gè)測(cè)試類來(lái)初始化項(xiàng)目需要的一些基礎(chǔ)數(shù)據(jù),如用戶、權(quán)限、資源、字典等。因?yàn)閙aven在構(gòu)建到特定的生命周期階段的時(shí)候會(huì)通過(guò)插件來(lái)執(zhí)行JUnit或者TestNG的測(cè)試用例,這個(gè)插件就是maven-surefire-plugin(這是需要配置的,當(dāng)然也可以禁止去執(zhí)行測(cè)試類,甚至禁止編譯測(cè)試類),需要了解的請(qǐng)學(xué)習(xí)相關(guān)maven文檔,或者參考http://blog.csdn.net/sin90lzc/article/details/7543262。
        考慮到上述因素,那么我就在src/test/java文件夾下新建一個(gè)測(cè)試類,那么這個(gè)測(cè)試類就會(huì)在clean install時(shí)候會(huì)執(zhí)行,那么在這個(gè)時(shí)候執(zhí)行數(shù)據(jù)初始化是合適的。因?yàn)槌跏蓟瘮?shù)據(jù)來(lái)自于sql腳本,所以我得讀取sql腳本的內(nèi)容并解析成相關(guān)的sql語(yǔ)句通過(guò)java的jdbc執(zhí)行sql語(yǔ)句。那就開始做吧。不多說(shuō),上代碼:
       
       
      1 package com.infopatent.juangetljc.core;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.FileInputStream;
      5 import java.io.InputStream;
      6 import java.sql.Connection;
      7 import java.sql.DriverManager;
      8 import java.sql.SQLException;
      9 import java.sql.Statement;
     10 import java.util.ArrayList;
     11 import java.util.Arrays;
     12 import java.util.List;
     13 
     14 import org.junit.Test;
     15 
     16 import junit.framework.TestCase;
     17 
     18 public class InitDataTest extends TestCase {
     19 
     20     private String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8";
     21     private String driver = "com.mysql.jdbc.Driver"
     22     private String userName = "root";
     23     private String password = "";
     24     String filePathIn = "F://workspace/juange-tljc/juange-tljc-core/src/test/java/basedata.sql";
     25 
     26     @Test
     27     public void test() {
     28         
     29         try {
     30             execute(filePathIn);
     31         } catch (Exception e) {
     32             // TODO Auto-generated catch block
     33             e.printStackTrace();
     34         }
     35     }
     36     
     37     /*
     38      * 讀取sql文件,獲取sql語(yǔ)句
     39      * 返回所有sql語(yǔ)句的list集合
     40      * */
     41     private List<String> loadSql(String sqlFile) throws Exception {
     42         List<String> sqlList = new ArrayList<String>();
     43         /*
     44          * 讀取文件的內(nèi)容并寫道StringBuffer中去
     45          * */
     46         InputStream sqlFileIn = new FileInputStream(sqlFile);
     47         StringBuffer sqlSb = new StringBuffer();
     48         byte[] buff = new byte[sqlFileIn.available()];
     49         int byteRead = 0;
     50         while((byteRead = sqlFileIn.read(buff)) != -1) {
     51             sqlSb.append(new String(buff, 0, byteRead));
     52         }
     53         /*
     54          * windows下?lián)Q行是/r/n,Linux下是/n,
     55          * 此處需要根據(jù)導(dǎo)出的sql文件進(jìn)行具體的處理,我在處理的時(shí)候
     56          * 也遇到了很多的問(wèn)題,如果我這個(gè)不行可以在網(wǎng)上找找別的解析方法
     57          * */
     58         String sqlArr[] = sqlSb.toString().split("(;\\s*\\rr\\n)|(;\\s*\\n)");
     59         for(int i = 0; i<sqlArr.length; i++) {
     60             String sql = sqlArr[i].replaceAll("--.*""").trim();
     61             if(!"".equals(sql)) {
     62                 sqlList.add(sql);
     63             }
     64         }
     65         return sqlList;
     66         
     67     }
     68     
     69     /*
     70      * 傳入文件執(zhí)行sql語(yǔ)句
     71      * 
     72      * */
     73     private void execute(String sqlFile) throws SQLException {
     74         Statement stmt = null;
     75         List<String> sqlList = new ArrayList<String>();
     76         Connection conn = getConnection();
     77         try {
     78             sqlList = loadSql(sqlFile);
     79             conn.setAutoCommit(false);
     80             stmt = conn.createStatement();
     81             for (String sql : sqlList) {
     82                 System.out.println(sql);
     83                 stmt.addBatch(sql);
     84             }
     85             int[] rows = stmt.executeBatch();
     86             System.out.println("Row count:" + Arrays.toString(rows));
     87             conn.commit();
     88             System.out.println("數(shù)據(jù)更新成功");
     89         } catch (Exception e) {
     90             e.printStackTrace();
     91             conn.rollback();
     92         }finally{
     93             stmt.close();
     94             conn.close();
     95         }
     96         
     97     }
     98     
     99     /*
    100      * 獲取sql連接
    101      * */
    102     private Connection getConnection(){
    103         Connection conn = null;
    104         try {
    105             Class.forName(driver);
    106             conn = DriverManager.getConnection(url, userName, password);
    107             if(!conn.isClosed()) {
    108                 System.out.println("數(shù)據(jù)庫(kù)連接成功!");
    109             }
    110         } catch (Exception e) {
    111             e.printStackTrace();
    112         }
    113         return conn;
    114     }
    115 }
    116 

        在這個(gè)過(guò)程中遇到了很多的問(wèn)題,曾經(jīng)一度使我陷入迷糊狀態(tài)中,后來(lái)好好梳理了一下思路,一個(gè)一個(gè)的去排查問(wèn)題終于成功了~
        首先在讀取文件的時(shí)候,發(fā)現(xiàn)讀取的文件內(nèi)容顯示是正常的不是亂碼,但是插入到數(shù)據(jù)庫(kù)中就是亂碼,好吧,我又遇到了這種問(wèn)題,我依次檢查了我java文件的編碼,數(shù)據(jù)庫(kù)的編碼,都設(shè)置為utf-8,url也加上編碼"jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"。結(jié)果還是亂碼,那就再看看mysql下的my.ini文件中的編碼設(shè)置在[mysqld]節(jié)點(diǎn)下加上default-character-set=utf8(如果沒有就改為utf8),這下終于不是亂碼了。然后我開始maven clean install,去查看數(shù)據(jù)庫(kù)發(fā)現(xiàn)又出現(xiàn)了亂碼的問(wèn)題,真是折磨人啊,我發(fā)現(xiàn)唯一不同的就是之前正常的插入數(shù)據(jù)是我在測(cè)試類下run as junit,而現(xiàn)在用的是maven clean install,剛接觸maven完全不知道癥結(jié)所在啊,百度一下,發(fā)現(xiàn)maven構(gòu)建到特定的生命周期時(shí)候運(yùn)行測(cè)試用例是依靠maven-surefire-plugin這個(gè)插件的,而這個(gè)插件也需要指定字符集編碼的,于是我在項(xiàng)目的pom.xml中加入了如下代碼(本來(lái)竟然沒有?。?br />
     1 <build> 
     2         <plugins>
     3             <plugin>
     4                 <groupId>org.apache.maven.plugins</groupId>
     5                 <artifactId>maven-surefire-plugin</artifactId>
     6                 <version>2.7.2</version>
     7                 <configuration>
     8                     <forkMode>once</forkMode>
     9                     <argLine>-Dfile.encoding=UTF-8</argLine>
    10                     <systemProperties>
    11                         <property>
    12                                 <name>net.sourceforge.cobertura.datafile</name>
    13                                 <value>target/cobertura/cobertura.ser</value>
    14                         </property>
    15                     </systemProperties>
    16                 </configuration>
    17             </plugin>
    18         </plugins> 
    19     </build>

    這個(gè)時(shí)候再去maven clean install,終于不亂碼了,終于不亂碼了!花了我四個(gè)小時(shí),長(zhǎng)見識(shí)了!此處記錄自己遇到的問(wèn)題以及如何解決,希望對(duì)各位有幫助!





    posted @ 2014-07-29 15:07 小人物_Amor 閱讀(3331) | 評(píng)論 (0)編輯 收藏
      2014年5月30日
    各位如果想找合適的樹形菜單,不放試試dtree,去官網(wǎng)看看www.destroydrop.com/javascript/tree/,下載dtree.zip下來(lái)解壓之后有dtree.js,dtree.css,img文件夾,api.html,example01.html這幾個(gè)文件,可以看看api.html,里面有參數(shù)和方法說(shuō)明,實(shí)際上在項(xiàng)目應(yīng)用時(shí),我們是需要從數(shù)據(jù)庫(kù)里的菜單表里讀取數(shù)據(jù)進(jìn)行樹形菜單構(gòu)建的,根據(jù)api.html里面的參數(shù)說(shuō)明可建立一張s_menu的數(shù)據(jù)表:
    CREATE TABLE `s_menu` (
      `id` 
    int(11NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
      `pid` 
    int(11DEFAULT NULL COMMENT '父級(jí)id',
      `name` 
    varchar(45DEFAULT NULL COMMENT '菜單名稱',
      `url` 
    varchar(255DEFAULT NULL COMMENT '菜單url',
      `title` 
    varchar(45DEFAULT NULL COMMENT '鼠標(biāo)放上去顯示的title',
      `target` 
    varchar(45DEFAULT NULL COMMENT '目標(biāo)iframe',
      `icon` 
    varchar(255DEFAULT NULL COMMENT '菜單折疊時(shí)候顯示的圖片',
      `iconOpen` 
    varchar(255DEFAULT NULL COMMENT '菜單打開時(shí)候顯示的圖片',
      `
    openint(1DEFAULT '0' COMMENT '是否打開',
      
    PRIMARY KEY (`id`)
    ) ENGINE
    =MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

    并且插入一些測(cè)試數(shù)據(jù)來(lái)使用:
    INSERT INTO `s_menu` VALUES ('1''-1''瀏覽器''#''瀏覽器'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('2''1''IE''#''IE瀏覽器'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('3''2''IE6''#''IE6'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('4''2''IE7''#''IE7'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('5''2''IE8''#''IE8'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('6''2''IE10''#''IE10'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('7''1''Firefox''#''Firefox'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('8''7''Firefox15.0''#''Firefox15.0'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('9''7''Firefox15.1''#''Firefox15.1'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('10''1''360瀏覽器''#''360瀏覽器'nullnullnull'0');
    INSERT INTO `s_menu` VALUES ('11''1''搜狗瀏覽器''#''搜狗瀏覽器'nullnullnull'0');

    接下來(lái)把解壓好的dtree.js以及dtree.css放到項(xiàng)目的對(duì)應(yīng)目錄下,并在頁(yè)面引入,后臺(tái)執(zhí)行方法我就不說(shuō)了,就是查詢出s_menu里所有的數(shù)據(jù)就可以了,在jsp里面實(shí)現(xiàn):
    <%@ page contentType="text/html;charset=UTF-8" %>
    <%@ include file="/common/taglibs.jsp" %>
    <%@ page import="org.springframework.context.ApplicationContext,org.springframework.context.support.ClassPathXmlApplicationContext,com.zx.ww.entity.base.Menu,com.zx.ww.service.base.MenuManager,java.util.List"  %>
    <%
        ApplicationContext context 
    = new ClassPathXmlApplicationContext("applicationContext.xml");
        MenuManager menuManager 
    = (MenuManager)context.getBean("menuManager");
        List
    <Menu> menus = menuManager.findAllMenu();
        request.setAttribute(
    "menus", menus);
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        
    <head>
            
    <title>SSH2</title>
        
    </head>
        
    <body>
            
    <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
                
    <tr>
                    
    <td valign="top">
                        
    <div id="treearea" style="overflow: scroll;height:100%;width:100%"></div>
                    
    </td>
                
    </tr>
            
    </table>
        
    </body>
    </html>
    <script type="text/javascript">
        
    var dtree = new dTree('dtree', '${ctx}/images/dtree/');
        dtree.config.folderLinks 
    = true;
        dtree.config.useCookies 
    = true;
        
    <c:forEach items="${menus}" var="menu">
            dtree.add(${menu.id},${menu.pid},
    "${menu.name}","${menu.url}","${menu.title}");
        
    </c:forEach>
        document.getElementById('treearea').innerHTML 
    = dtree;
        
    </script>

    看效果:

    這是從數(shù)據(jù)庫(kù)里讀出數(shù)據(jù)的方式,本地的話構(gòu)建這樣的數(shù)據(jù)就行了:
    <script type="text/javascript">
            
    <!--

            d 
    = new dTree('d');

            d.add(
    0,-1,'My example tree');
            d.add(
    1,0,'Node 1','example01.html');
            d.add(
    2,0,'Node 2','example01.html');
            d.add(
    3,1,'Node 1.1','example01.html');
            d.add(
    4,0,'Node 3','example01.html');
            d.add(
    5,3,'Node 1.1.1','example01.html');
            d.add(
    6,5,'Node 1.1.1.1','example01.html');
            d.add(
    7,0,'Node 4','example01.html');
            d.add(
    8,1,'Node 1.2','example01.html');
            d.add(
    9,0,'My Pictures','example01.html','Pictures I\'ve taken over the years','','','img/imgfolder.gif');
            d.add(
    10,9,'The trip to Iceland','example01.html','Pictures of Gullfoss and Geysir');
            d.add(
    11,9,'Mom\'s birthday','example01.html');
            d.add(
    12,0,'Recycle Bin','example01.html','','','img/trash.gif');

            document.write(d);

            
    //-->
        </script>
    網(wǎng)上有很多關(guān)于dtree的說(shuō)明,在此看不明白的再去網(wǎng)上找找別的,有說(shuō)的比較詳細(xì)的PPT,關(guān)于各個(gè)參數(shù)以及方法說(shuō)明都有~
    ok,留著以后會(huì)有用的!
    posted @ 2014-05-30 17:46 小人物_Amor 閱讀(1261) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題  下一頁(yè)
    主站蜘蛛池模板: 亚洲午夜久久久影院伊人| 亚洲色图校园春色| 青青草无码免费一二三区| 亚洲明星合成图综合区在线| 无码日韩人妻av一区免费| 曰批免费视频播放在线看片二| 国产亚洲AV无码AV男人的天堂| 九九精品免费视频| 久久嫩草影院免费看夜色| 亚洲视频一区在线观看| 亚洲AV成人精品日韩一区18p| 午夜影院免费观看| 免费看一级一级人妻片 | 久久国产亚洲精品麻豆| 免费无码又爽又刺激聊天APP| 一区二区三区免费电影| 亚洲av无码片在线观看| 亚洲人成无码网站| 国产真人无遮挡作爱免费视频| 日本xxxx色视频在线观看免费| 蜜臀亚洲AV无码精品国产午夜.| 亚洲视频在线免费观看| 亚洲综合精品网站在线观看| 四虎永久在线观看免费网站网址| 中国一级毛片免费看视频| 亚洲精品无码成人| 91嫩草亚洲精品| 亚洲AV无码国产精品麻豆天美| 免费又黄又爽的视频| 成年人视频在线观看免费| 18禁无遮挡无码国产免费网站| 巨胸狂喷奶水视频www网站免费| 亚洲精品无码你懂的| 亚洲天堂一区二区三区| 九月丁香婷婷亚洲综合色| 亚洲AV之男人的天堂| 成人免费a级毛片| www视频免费看| 在线免费观看国产| 精品一卡2卡三卡4卡免费视频| 暖暖免费中文在线日本|