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

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

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

    posts - 41, comments - 15, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2012年4月16日

    有時候在客戶端使用svg畫圖,而在服務器端需要同樣的圖片,在服務器端重新畫一遍是非常費事的。這時候我們就可以利用已有的svg直接通過下面的類轉換成png格式。

    使用這個方法需要引用batic相關的包,maven pom文件如下:

    <!-- svg 生成png格式圖片  -->
    <dependency><groupId>batik</groupId><artifactId>batik-svggen</artifactId><version>1.6</version></dependency>        
    <dependency><groupId>batik</groupId><artifactId>batik-awt-util</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-bridge</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-css</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-dom</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-gvt</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-parser</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-script</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-svg-dom</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-transcoder</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-util</artifactId><version>1.6</version></dependency>
    <dependency><groupId>batik</groupId><artifactId>batik-xml</artifactId><version>1.6</version></dependency>
    <!-- 此處不能使用2.9.1版本,使用2.9.1生成png會失敗 -->
    <dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.5.0</version></dependency>
    <dependency><groupId>xml-apis</groupId><artifactId>xmlParserAPIs</artifactId><version>2.0.2</version></dependency>
    <dependency><groupId>org.axsl.org.w3c.dom.svg</groupId><artifactId>svg-dom-java</artifactId><version>1.1</version></dependency>
    <dependency><groupId>xml-apis</groupId>    <artifactId>xml-apis</artifactId><version>2.0.0</version></dependency>
    <dependency><groupId>org.w3c.css</groupId> <artifactId>sac</artifactId>    <version>1.3</version></dependency>
    <!-- svg 生成png格式圖片結束  -->
    package com.yhb.web.util;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URL;
    import org.apache.batik.transcoder.TranscoderException;
    import org.apache.batik.transcoder.TranscoderInput;
    import org.apache.batik.transcoder.TranscoderOutput;
    import org.apache.batik.transcoder.image.PNGTranscoder;
    public final class FileUtil {
    /** 
         *@Description: 將svg字符串轉換為png 
         *@Author: 
         *@param svgCode svg代碼 
         *@param pngFilePath  保存的路徑 
         *@throws IOException io異常 
         *@throws TranscoderException svg代碼異常 
        */  
    public static void convertToPng(String svgCode,String pngFilePath) throws IOException,TranscoderException{  
     
            File file = new File (pngFilePath);  
      
            FileOutputStream outputStream = null;  
            try {  
                file.createNewFile ();  
                outputStream = new FileOutputStream (file);  
                convertToPng (svgCode, outputStream);  
            } finally {  
                if (outputStream != null) {  
                    try {  
                        outputStream.close ();  
                    } catch (IOException e) {  
                        e.printStackTrace ();  
                    }  
                }  
            }  
        }  
    /** 
         *@Description: 將svgCode轉換成png文件,直接輸出到流中 
         *@param svgCode svg代碼 
         *@param outputStream 輸出流 
         *@throws TranscoderException 異常 
         *@throws IOException io異常 
         */  
        public static void convertToPng(String svgCode,OutputStream outputStream) throws TranscoderException,IOException{  
            try {  
            byte[] bytes = svgCode.getBytes ("UTF-8");  
                PNGTranscoder t = new PNGTranscoder ();  
                TranscoderInput input = new TranscoderInput (new ByteArrayInputStream (bytes));  
                TranscoderOutput output = new TranscoderOutput (outputStream);  
                t.transcode (input, output);  
                outputStream.flush ();  
            } finally {  
                if (outputStream != null) {  
                    try {  
                        outputStream.close ();  
                    } catch (IOException e) {  
                        e.printStackTrace ();  
                    }  
                }  
            }  
        }  
    }

    posted @ 2015-10-19 15:17 yuhaibo736 閱讀(313) | 評論 (0)編輯 收藏

    方法1: 設定環境變量
    set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT (sh)
    or setenv NLS_SORT SCHINESE_RADICAL_M (csh)
    or regedit 
    HKLC/SOFTWARE/ORACLE/home0/NLS_SORT        (win)

    方法2: 在session中修改
    alter session set NLS_SORT='SCHINESE_RADICAL_M'

    方法3: 直接使用NLSSORT函數 (推薦)
    select name,id from t
    order by NLSSORT(name,'NLS_SORT = SCHINESE_STROKE_M')

    設置NLS_SORT值:

    SCHINESE_RADICAL_M 按照部首(第一順序)、筆劃(第二順序)排序 

    SCHINESE_STROKE_M 按照筆劃(第一順序)、部首(第二順序)排序 

    SCHINESE_PINYIN_M 按照拼音排序

    posted @ 2014-08-29 14:13 yuhaibo736 閱讀(1285) | 評論 (0)編輯 收藏

        在IBATIS中,框架內置了對OSCache的支持,如果我們想使用EHCache,則需要通過我們手工實現來完成二級緩存的功能機制。

        在mybatis中,開發組織只提供了一些默認的二級緩存實現的機制,并沒有直接內置的支持OSCache和EHCache等二級緩存機制,而是作為一個集成jar包來提供二級緩存的實現,在官方網站上我們可以找到mybatis-ehcache-1.0.1-bundle.zip,mybatis-oscache-1.0.1-bundle.zip等ehcache和oscache提供二級緩存的獨立工具包. 這里我就拿oscache在mybatis中的使用來舉例說明:

           1.   將mybatis-oscache-1.0.1-bundle.zip中涉及到的jar包放入到classpath路徑下 
                 maven下可以這樣配置
                   <dependencies>  
                        
    ... 

                        <dependency> 

                            <groupId>org.mybatis.caches</groupId> 

                            <artifactId>mybatis-oscache</artifactId>      
                             <version>1.0.2-SNAPSHOT</version> 

                        </dependency>             

                        <dependency>
                            <groupId>javax.jms</groupId>
                            <artifactId>jms</artifactId>
                            <version>1.1</version>
                        </dependency>

                        <dependency>
                             <groupId>opensymphony</groupId>
                             <artifactId>oscache</artifactId>
                             <version>2.4</version>
                             <exclusions>       
                                   <exclusion>
                                       <groupId>com.sun.jdmk</groupId>
                                       <artifactId>jmxtools</artifactId>
                                   </exclusion>
                               <exclusion>
                               <groupId>com.sun.jmx</groupId>
                               <artifactId>jmxri</artifactId>
                           </exclusion>
                         </exclusions>
                    </dependency>

                        ... 

                    </dependencies>

           2.   在mapper文件中的配置如下:

                 <mapper namespace="org.test.AuthMapper" >         

                     <cache  type="org.mybatis.caches.oscache.OSCache"/>

                 </mapper>
                注意下面兩點
                 (a)在
    <select id="getAuth" parameterType="Map" resultType="Auth"  useCache="false">中使用useCache="false"或useCache="true"來決定是否使用二級緩存。    
                 (b)在增刪改中<insert id="insertAuth" parameterType="Auth"  flushCache="true">使用flushCache="true"或flushCache="flase"來決定對這些進行操作后清空該xml文件中所有查詢語句的二級緩存。 

           3.  在src目錄下創建一個oscache.properties的屬性文件,在里面指定緩存的各種屬性的設置:
                 cache.memory=true             
                 cache.path=c:\\myapp\\cache
                 cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
                 cache.persistence.overflow.only=true
                 cache.capacity=100000

                

    posted @ 2014-08-11 18:22 yuhaibo736 閱讀(2730) | 評論 (0)編輯 收藏

    import java.awt.Color;
    import java.io.FileOutputStream;

    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;

    public class CellEvents {


     /**
      * @param args
      */
     public static void main(String[] args) {
      Object[] objArr = new Object[]{100,20,300};
      
      Document document = new Document(PageSize.A4.rotate(),50,50,50,50);
      try{
       //bfSongti = BaseFont.createFont("/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
       Font songtiSFivefont = new Font(BaseFont.createFont("/simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED), 9f);//宋體小五號字
             //設置存放位置
             PdfWriter.getInstance(document, new FileOutputStream("D:/test.pdf"));
             document.open();
     
             PdfPTable table = new PdfPTable(5);
       table.setSpacingBefore(10f);
       table.getDefaultCell().setPadding(5);
       //HowbuyBorderPdfPTableEvent event = new HowbuyBorderPdfPTableEvent();
       //table.setTableEvent(event);
       //table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
       table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
       PdfPCell cellTitle = new PdfPCell(new Phrase("總資產\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       cellTitle.setMinimumHeight(25);
       table.addCell(cellTitle);
     
       cellTitle = new PdfPCell(new Phrase(""));
       cellTitle.setBorder(Rectangle.NO_BORDER);
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       cellTitle = new PdfPCell(new Phrase("當前收益\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
     
       cellTitle = new PdfPCell(new Phrase("",songtiSFivefont));
       cellTitle.setBorder(Rectangle.NO_BORDER);
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       
       cellTitle = new PdfPCell(new Phrase("累計收益\n(萬元)",songtiSFivefont));
       cellTitle.setBorderWidth(2f);
       cellTitle.setBackgroundColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cellTitle.setHorizontalAlignment(Element.ALIGN_CENTER);
       cellTitle.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cellTitle);
       
       float[] widths2 = { 24.5f, 12.25f,24.5f,12.25f,24.5f};

       table.setWidths(widths2);
       
       table.setHorizontalAlignment(Element.ALIGN_LEFT);//
       table.setWidthPercentage(70);
       double zzc = objArr[0]==null ? 0:Double.parseDouble(objArr[0].toString());
       double dqsy = objArr[1]==null ? 0:Double.parseDouble(objArr[1].toString());
       double ljsy = objArr[2]==null ? 0:Double.parseDouble(objArr[2].toString());
       PdfPCell cell1 = new PdfPCell(new Phrase(String.valueOf(zzc),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       cell1.setMinimumHeight(20);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase("",songtiSFivefont));
       cell1.setBorder(Rectangle.NO_BORDER);
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase(String.valueOf(dqsy),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase("",songtiSFivefont));
       cell1.setBorder(Rectangle.NO_BORDER);
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       
       cell1 = new PdfPCell(new Phrase(String.valueOf(ljsy),songtiSFivefont));
       cell1.setBorderWidth(2f);
       cell1.setBorderColor(new BaseColor(new Color(153, 51, 0)));
       cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
       cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell1);
       document.add(table);
      }catch(Exception ex){
       ex.printStackTrace();
      }
            document.close();

     }

    }

    posted @ 2014-06-24 16:27 yuhaibo736 閱讀(1462) | 評論 (0)編輯 收藏

    相信很多人都聽過nginx,這個小巧的東西慢慢地在吞食apache和IIS的份額。那究竟它有什么作用呢?可能很多人未必了解。

    說到反向代理,可能很多人都聽說,但具體什么是反向代理,很多人估計就不清楚了。摘一段百度百科上的描述:

    Html代碼 復制代碼 收藏代碼
    1. 反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。 

    這里講得很直白。反向代理方式實際上就是一臺負責轉發的代理服務器,貌似充當了真正服務器的功能,但實際上并不是,代理服務器只是充當了轉發的作用,并且從真正的服務器那里取得返回的數據。這樣說,其實nginx完成的就是這樣的工作。我們讓nginx監聽一個端口,譬如80端口,但實際上我們轉發給在8080端口的tomcat,由它來處理真正的請求,當請求完成后,tomcat返回,但數據此時沒直接返回,而是直接給nginx,由nginx進行返回,這里,我們會以為是nginx進行了處理,但實際上進行處理的是tomcat。

    說到上面的方式,也許很多人又會想起來,這樣可以把靜態文件交由nginx來進行處理。對,很多用到nginx的地方都是作為靜態伺服器,這樣可以方便緩存那些靜態文件,比如CSS,JS,html,htm等文件。

    閑話就不多說了,我們直接來看看nginx怎么使用。

    1)要用到的軟件當然要下載啦。到nginx官網下一個。http://nginx.org/en/download.html可以到這里去下。我現在用的版本是1.1.7,但基本上以后的版本都兼容,而且我們用到的并不涉及到太底層的,應該不會有什么變化。

    這里,由于我的是windows,當然下windows版啦。下完后首先要啟動吧。進入到nginx文件夾,直接start nginx就OK了。

    比如我下載后放在D:\software\developerTools\server\nginx-1.1.7,直接cmd后cd D:\software\developerTools\server\nginx-1.1.7,有些不習慣命令行的可能會奇怪,它沒有進行到那個文件夾。windows并不會在分區間跳轉,除非你自己指定了。所以我們要直接d:如下:

    然后,我們直接start nginx,這里也許你會看到一個窗口一閃而過,根據我們使用tomcat的經驗,如果一閃而過,證明有錯誤了,是吧?但實際上不是。

    此時我們打開任務管理器,可以看到兩個nginx.exe在那里好好的。這說明我們已經啟動了,至于為什么兩個,我們這里不深究。

    現在,我們已經啟動了nginx,這時就可以啟動tomcat,想著直接訪問http://localhost就可以直接訪問tomcat了。

    先不急,我們來看看啟動后的nginx是怎樣的。直接訪問http://localhost可以看到:

        我們可以看到nginx啟動成功,現在訪問是直接進到nginx的目錄里面了。

    那么這些實際上是在哪里配置的。這就涉及到nginx的一個重要配置文件nginx.conf了。

    2)我們可以看到nginx文件夾內有一個conf文件夾,其中有好幾個文件,其他先不管,我們打開nginx.conf,可以看到一段:

    這段代碼在server里面,相當于一個代理服務器,當然可以配置多個。

    下面我們仔細來分析一下:

    listen:表示當前的代理服務器監聽的端口,默認的是監聽80端口。注意,如果我們配置了多個server,這個listen要配置不一樣,不然就不能確定轉到哪里去了。

    server_name:表示監聽到之后需要轉到哪里去,這時我們直接轉到本地,這時是直接到nginx文件夾內。

    location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這里

    root:里面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件,這里對我們之后的靜態文件伺服很有用。

    index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,并按順序來加載,如果第一個不存在,則找第二個,依此類推。

    下面的error_page是代表錯誤的頁面,這里我們暫時不用,先不管它。

    那我們知道了具體的配置了,怎么讓它訪問localhost時轉到tomcat時。實際上就修改兩個地方:

    Java代碼 復制代碼 收藏代碼
    1. server_name localhost:8080
    2.  
    3. location / { 
    4.     proxy_pass http://localhost:8080 

    我們就修改了上面兩個地方,我的tomcat在8080端口,可以根據自己的需要修改。這里有一個新元素proxy_pass,它表示代理路徑,相當于轉發,而不像之前說的root必須指定一個文件夾。

    此時我們修改了文件,是不是就意思著必須先關了nginx再重新啟動了,其實不必,nginx可以重新加載文件的。

    我們直接運行:

    Html代碼 復制代碼 收藏代碼
    1. nginx -s reload 

    高興得太早了,我們發現有一個錯誤:

    什么來的,45行發現錯誤,不希望在那一行找到},于是我們仔細找,發現我們加入的proxy_pass很奇怪,沒有;號結尾,這就是問題了,直接修改,然后再運行一下,發現沒錯誤,OK了。

    如果不想直接加載,而只是想看看自己的配置文件有沒有問題,可以直接輸入:

    Xml代碼 復制代碼 收藏代碼
    1. nginx -t 

    這可以檢查配置文件中是否有錯。 下面我們所有的修改都假設我們修改完成后運行了nginx -s reload進行重新加載配置文件,請注意。

    一切沒問題了,然后我們再重新打開http://localhost,我們看到下面的頁面:

    這時,我們發現它并不是剛才的welcome頁面了,而是tomcat的管理頁面了,不管我們點擊什么鏈接都是沒問題的,相當于直接訪問http://localhost:8080一樣。

    3)上面我們直接試了一個小例子,讓nginx進行轉發,即所謂的反向代理。但實際上我們的需求不會是這樣的,我們需要分文件類型來進行過濾,比如jsp直接給tomcat處理,因為nginx并不是servlet容器,沒辦法處理JSP,而html,js,css這些不需要處理的,直接給nginx進行緩存。

    下面我們來進行一下配置,讓JSP頁面直接給tomcat,而html,png等一些圖片和JS等直接給nginx進行緩存。

    這時最主要用的還是location這個元素,并且涉及到一部分正則,但不難:

    Xml代碼 復制代碼 收藏代碼
    1. location ~ \.jsp$ { 
    2.         proxy_pass http://localhost:8080; 
    3.          
    4. location ~ \.(html|js|css|png|gif)$ { 
    5.     root D:/software/developerTools/server/apache-tomcat-7.0.8/webapps/ROOT; 

    我們先要去掉之前配的location /,避免全部請求被攔截了。

    然后我們再來看看http://localhost

    當我們不指定jsp頁面的時候,它會出現找不到,因為,此時并沒有相應的location匹配,所以就會有404錯誤,這時就跳到了nginx自定義的error頁面去了。

    而當我們用http://localhost/index.jsp去訪問時,我們看到了熟悉的頁面:

    而且圖片那些都顯示正常,因為圖片是png的,所以直接在tomcat/webapps/ROOT目錄下直接查找,當然,如果我們點擊Manager Application HOW-TO這個鏈接,我們發現:

    它還是找不到,為什么呢?因為這是個html頁面,但它并不在ROOT目錄下,而是在docs目錄下,但當我們匹配html時,我們卻到ROOT目錄下去找,所以還是找不到這個頁面。

    一般情況下,如果我們需要用nginx來進行靜態文件伺服,一般都會把所有靜態文件,html,htm,js,css等都放在同一個文件夾下,這樣就不會有tomcat這樣的情況了,因為tomcat下的是屬于不同的項目,這個我們就沒辦法了。

    3)有些人會說,這些都只會找一臺服務器,但如果我們想在一臺服務器掛了的時候,自動去找另外一臺,這怎么辦?這實際上nginx都考慮到了。

    這時,我們之前用的proxy_pass就有大用途了。

    我們把之前的第一個例子,即全部都代理的修改一下:

    最后修改如下:

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080; 
    3.  
    4. server{ 
    5.         location / { 
    6.            proxy_pass http://local_tomcat; 
    7.         } 
    8.         #......其他省略 

    我們在server外添加了一個upstream,而直接在proxy_pass里面直接用http://+upstream的名稱來使用。

    我們還是直接來http://localhost,還是和第一個一樣的效果,所有鏈接都沒問題,說明我們配置正確。

    upstream中的server元素必須要注意,不能加http://,但proxy_pass中必須加。

    我們剛才說可以在一個服務器掛了的情況下連到另外一個,那怎么弄呢?

    其實很簡單,在upstream中的local_tomcat中配置多一個server。比如我現在弄多一個jetty,端口在9999,所以我們配置如下:

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080; 
    3.     server localhost:9999; 

    此時,我們關閉tomcat,而只開jetty。我們來運行http://localhost看看效果:

    我們看到它請求到了jetty的頁面,但由于jetty的機制,這時沒有顯示jetty主頁,這個我們先不管。但我們的在一個服務器掛的情況下自動使用另外一個的功能實現了。

    但有時我們就不想它掛的時候訪問另外一個,而只是希望一個服務器訪問的機會比另外一個大,這個可以在server最后加上一個weight=數字來指定,數字越大,表明請求到的機會越大。

    Xml代碼 復制代碼 收藏代碼
    1. upstream local_tomcat { 
    2.     server localhost:8080 weight=1
    3.     server localhost:9999 weight=5

    這時我們給了jetty一個更高的權值,讓它更有機會訪問到,實際上當我們刷新http://localhost訪問的時候發現jetty訪問機率大很多,tomcat幾乎沒機會訪問,一般情況下,如果我們必須這樣用,不要相關太大,以免一個服務器負載太大。

    當然,server還有一些其他的元素,比如down表示暫時不用到該服務器等等。這些可以參考nginx的wiki。也許寫了一大堆,有人會有問題,那nginx怎么關閉呢?這倒是個問題,其實直接運行nginx -s stop就可以關閉了。

    基本上nginx的用法是這樣,深入的以后我們如果用到再學習。

    posted @ 2014-06-17 15:24 yuhaibo736 閱讀(1381) | 評論 (0)編輯 收藏

    第一步:

       1)下載jad.exe文件:http://www.varaneckas.com/jad

       2)下載jadeclipse插件:http://sourceforge.net/projects/jadclipse/files/


    第二步:
        1)解壓縮jad158g.win.zip成jad.exe,把它copy至jre的bin目錄下,比如我的jre安裝到了c盤下,copy的路徑即為c:\Program Files\Java\jre6\bin(下一步配置等待net.sf.jadclipse_3.3.0.jar配置完成之后再說)
        2)找到myeclipse的安裝目錄,我的myeclipse安裝在c盤下,路徑如下:c:\ Program Files\yEclipse10。該目錄下有dropins文件,我們需要在該文件夾下,新建jad文件夾,jad文件夾下新建 features 和 plugins 兩個文件夾,把net.sf.jadclipse_3.3.0.jar 復制到兩個文件夾下,然后重啟myeclipse。

    第三步:
        1)在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Path to Decompiler。(設置jad的絕對路徑,如 c:\Program Files\Java\jre6\bin\jad.exe  )。Use Eclipse code formatter(overrides Jad formatting instructions)選項打勾,與格式化出來的代碼樣式一致。

        2)在eclipse窗口下,點擊Window > Preferences > Java > JadClipse > Misc,將Convert Unicode strings into ANSI strings選項打勾,避免反編譯后可能出現的中文亂碼。
    第四步:
        安裝完成后,myeclipse沒有自動將JadClipse Class File Viewer設置成class文件的缺省打開方式,設置方法如

    在Eclipse的Windows—> Perference—>General->Editors->File
    Associations中修改“*.class”默認關聯的編輯器為“JadClipse Class File Viewer”。

    第五步:
        設置完成,找一個jar包中的*.class文件,myeclipse將自動反編譯。

    posted @ 2014-05-26 16:05 yuhaibo736 閱讀(1368) | 評論 (0)編輯 收藏

    首先在網上下載Eclipse Class Decompiler插件: http://download.csdn.net/detail/ibm_hoojo/5250263
    下載后,解壓可以看到如下目錄,復制所有文件粘貼到你的eclipse或MyEclipse的目錄:D:\MyEclipse 6.5\dropins\eclipse或D:\eclipse\dropins\eclipse下,沒有對應的文件夾就新建,選擇覆蓋即可。然后重新啟動eclipse。 

    再次打開.class文件就是反編譯后的文件了

    posted @ 2014-05-21 17:14 yuhaibo736 閱讀(1112) | 評論 (0)編輯 收藏

    用oracle用戶登陸系統,
    用戶名/密碼  oracle/oracle
    sqlplus / as sysdba
    startup
    啟動后然后 exit
    然后啟動監聽 lsnrctl start

    Linux 下啟動oracle步驟
    1.進入到sqlplus啟動實例
    [oracle@redhat ~]$ su - oracle --“切換到oracle用戶”
    2.[oracle@redhat ~]$ lsnrctl start --“打開監聽”
    3.[oracle@redhat ~]$ sqlplus /nolog --“進入到sqlplus”
    4.SQL> conn /as sysdba --“連接到sysdba”
    5.SQL> startup --“啟動數據庫實例”
    6.SQL> shutdown immediate --“關閉數據庫實例”
    7.[oracle@redhat ~]$ lsnrctl stop --“關閉監聽”

    posted @ 2013-09-10 22:38 yuhaibo736 閱讀(993) | 評論 (0)編輯 收藏



    一、vi的基本概念



    基本上vi可分為三種操作狀態,分別是命令模式(Command mode)、插入模式(Insert mode)和底線命令模式(Last line mode),



    各模式的功能區分如下:



    1. Comand mode:控制屏幕光標的移動,字符或光標的刪除,移動復制某區段及進入Insert mode下,或者到Last line mode。



    2. Insert mode:唯有在Insert mode下,才可做文字數據輸入,按Esc等可回到Comand mode。



    3. Last line mode:將儲存文件或離開編輯器,也可設置編輯環境,如尋找字符串、列出行號等。



    不過可以把vi簡化成兩個模式,即是將Last line mode也算入Command mode,把vi分成Command
    和Insert mode。



    二、vi的基本操作



    1.進入vi



    在系統提示符號輸入vi及文件名稱后,即可進入vi全屏幕編輯畫面:



    $
    vi testfile



    注意:進入vi之后是處于“Command mode”下,要切換到Insert mode才能輸入文字。



    初次用vi的用戶都會想先用上下左右鍵移動光標,結果電腦一直叫,把自己氣個半死,所以進入vi后,先不要亂動,轉換入Insert后再說。



    (1)切換至Insert mode編輯文件在Command mode下按‘i’、‘a’或‘o’三鍵就可進入Insert mode。這時候就可以開始輸入文字了。



    i: 插入,從目前光標所在之處插入所輸入的文字。



    a: 增加,目前光標所在的下一個字開始輸入文字。



    o: 插入新的一行,從行首開始輸入文字。



    (2)Insert的切換→Command
    mode
    ,按Esc鍵



    您目前處于Insert mode,您就只能一直打字。假如您發現打錯字了,想用光標鍵往回移動,將該字刪除,就要按ESC鍵轉換回Command mode,再刪除文字。



    (3)離開vi及存文件



    在Command mode下,可按冒號“:”鍵入入Last line mode,例如:



    :w
    filename (
    輸入“w filename”,將文章存入指定的文件名filename)



    :wq
    (
    輸入“wq”,因為進入之時已經指定文件名testfile,所以會寫入testfile并離開vi)



    :q!
    (
    輸入“q!”,強制離開并放棄編輯的文件)



    2.Command
    mode
    功能鍵列表



    在介紹command mode指令的時后,指令后面加上“常用”字眼的功能鍵,表示比較常用的vi指令,



    請讀者您一定要學會、記住。



    (1)I、a、o切換進入Insert mode。[超級常用]



    (2)移動光標



    vi可以直接用鍵盤上的光標鍵來上下左右移動,但正規的vi是用小寫英文字母



    h、j、k、l,分別控制光標左、下、上、右移一格。



    按Ctrl+B:屏幕往后移動一頁。[常用]



    按Ctrl+F:屏幕往前移動一頁。[常用]



    按Ctrl+U:屏幕往后移動半頁。



    按Ctrl+D:屏幕往前移動半頁。



    按 0 (數字零):移動文章的開頭。[常用]



    按 G:移動到文章的最后。[常用]



    按 w:光標跳到下個word的開頭。[常用]



    按 e:光標跳到下個word的字尾。



    按 b:光標回到上個word的開頭。



    按 $:移到光標所在行的行尾。[常用]



    按 ^:移到該行第一個非空白的字符。



    按 0:移到該行的開頭位置。[常用]



    按 #:移到該行的第#個位置,例:51、121。[常用]



    (3)刪除文字



    x:每按一次刪除光標所在位置的后面一個字符。[超常用]



    #x:例如,6x 表刪除光標所在位置的后面6個字符。[常用]



    X:大字的X,每按一次刪除光標所在位置的前面一個字符。



    #X:例如,20X 表刪除光標所在位置的前面20個字符。



    dd:刪除光標所在行。[超常用]



    #dd:例如,6dd表刪除從光標所在的該行往下數6行之文字。[常用]



    (4)復制



    yw:將光標所在處到字尾的字符復制到緩沖區中。



    (想在和#x、#X的功能相反)



    p:將緩沖區內的字符粘貼到光標所在位置(指令‘yw’與‘p必須搭配使用)。



    yy:復制光標所在行。[超常用]



    p:復制單行到您想粘貼之處。(指令‘yy’與‘p’必須搭配使用)



    #yy:如:6yy表示拷貝從光標所在的該行往下數6行之文字。[常用]



    p:復制多行到您想粘貼之處。(指令‘#yy’與‘p’必須搭配使用)



    “ayy:將復制行放入buffer a, vi提供buffer功能,可將常用的數據存在buffer



    “ap:將放在buffer a的數據粘貼。



    “b3yy:將三行數據存入buffer b。



    “b3p:將存在buffer b的資料粘貼



    (5)取代



    r: 取代光標所在處的字符:[常用]



    R:取代字符直到按Esc為止。



    (6)復原(undo)上一個指令



    u:假如您誤操作一個指令,可以馬上按u,回復到上一個操作。[超常用]



    .:
    .
    可以重復執行上一次的指令。



    (7)更改



    cw:更改光標所在處的字到字尾$處。



    c#w:例如,c3w代表更改3個字。



    (8)跳至指定行



    Ctrl+G:列出光標所在行的行號。



    #G:例如,15G,表示移動光標至文章的第15行行首。[常用]



    3.Last
    line mode
    下指令簡介



    讀者您要使用Last line mode之前,請記得先按Esc鍵確定您已經處于Command mode下后,再按冒號“:”或“/”或“?”



    三鍵的其中一鍵進入Last line mode。



    (1).列出行號



    set
    nu:
    輸入“set
    nu
    或者set number”后,會在文章的每一行前面列出行號。



    set
    nonu
    :輸入“set
    nonu
    或者set nonumber”,取消行號



    (2).跳到文章的某一行



    #:井號代表一個數字,在Last line
    mode
    提示符號“:”前輸入數字,再按Enter就會跳到該行了,



    如:15[Enter]就會跳到文章的第15行。[常用]



    (3).尋找字符串



    /關鍵字:先按/,再輸入您想尋找的字,如果第一次找的關鍵字不是您相盡可能的,可以一直按n會往下尋找到您要的關鍵字為止。自上而下進行搜索!



    ?關鍵字:先按?,再輸入您想尋找的字,如果第一次找的關鍵字不是您想要的,可以按n會往前尋找到您要的關鍵字為止。自下而上搜索!



    如:3/x 表示查找當前點第三次出現 x 的地方,就像是 /x 后跟 2n。類似地,2/^e 將從當前位置開始的第二行查找以 e 開始的內容。



    注意,到達文件底部之后,搜索將回到頂部。



    (4).取代字符串



    1,$s/string/replae/g:在last line mode輸入“1,$s/string/replace/g”會將全文的string字符串取代為replace字符串,



    其中1,$s就是指搜尋區間為文章從頭至尾的意思,g則是表示全部取代不必確認。



    %s/string/replace/c:同樣會將全文的string字符串取代為replace字符串,和上面指令不同的地方是,%s和1,$s是相同的功能,



    c則是表示要替代之前必須再次確認是否取代。



    1,20s/string/replace/g:將1至20行間的string替代為relpace字符串。



    (5).存文件



    w:在last line mode提示符號“:”前按w即可將文件存起來。[超常用]



    #,# w filename:如果您想摘取文章的某一段,存成另一個文件,可用這個指令#代表行號,例如30,50 w nice,



    將您正在編輯文章的第30~50行存成nice這個文件。



    或者是30,50 w >> nice ,表示把內容附加到nice文件,不覆蓋



    (6).離開



    q:按q就離開,有時如果無法離開vi,可搭配“!:強置離開vi,如“q!”



    qw:一般建議離開時,搭配w一起使用,如此離開時還可存文件。[常用]



    posted @ 2013-09-09 18:31 yuhaibo736 閱讀(858) | 評論 (0)編輯 收藏

    系統信息
    arch 顯示機器的處理器架構(1)
    uname -m 顯示機器的處理器架構(2)
    uname -r 顯示正在使用的內核版本
    dmidecode -q 顯示硬件系統部件 - (SMBIOS / DMI)
    hdparm -i /dev/hda 羅列一個磁盤的架構特性
    hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作
    cat /proc/cpuinfo 顯示CPU info的信息
    cat /proc/interrupts 顯示中斷
    cat /proc/meminfo 校驗內存使用
    cat /proc/swaps 顯示哪些swap被使用
    cat /proc/version 顯示內核的版本
    cat /proc/net/dev 顯示網絡適配器及統計
    cat /proc/mounts 顯示已加載的文件系統
    lspci -tv 羅列 PCI 設備
    lsusb -tv 顯示 USB 設備
    date 顯示系統日期
    cal 2007 顯示2007年的日歷表
    date 041217002007.00 設置日期和時間 - 月日時分年.秒
    clock -w 將時間修改保存到 BIOS

     

    關機 (系統的關機、重啟以及登出 )
    shutdown -h now 關閉系統(1)
    init 0 關閉系統(2)
    telinit 0 關閉系統(3)
    shutdown -h hours:minutes & 按預定時間關閉系統
    shutdown -c 取消按預定時間關閉系統
    shutdown -r now 重啟(1)
    reboot 重啟(2)
    logout 注銷

     

    文件和目錄
    cd /home 進入 '/ home' 目錄'
    cd .. 返回上一級目錄
    cd ../.. 返回上兩級目錄
    cd 進入個人的主目錄
    cd ~user1 進入個人的主目錄
    cd - 返回上次所在的目錄
    pwd 顯示工作路徑
    ls 查看目錄中的文件
    ls -F 查看目錄中的文件
    ls -l 顯示文件和目錄的詳細資料
    ls -a 顯示隱藏文件
    ls *[0-9]* 顯示包含數字的文件名和目錄名
    tree 顯示文件和目錄由根目錄開始的樹形結構(1)
    lstree 顯示文件和目錄由根目錄開始的樹形結構(2)
    mkdir dir1 創建一個叫做 'dir1' 的目錄'
    mkdir dir1 dir2 同時創建兩個目錄
    mkdir -p /tmp/dir1/dir2 創建一個目錄樹
    rm -f file1 刪除一個叫做 'file1' 的文件'
    rmdir dir1 刪除一個叫做 'dir1' 的目錄'
    rm -rf dir1 刪除一個叫做 'dir1' 的目錄并同時刪除其內容
    rm -rf dir1 dir2 同時刪除兩個目錄及它們的內容
    mv dir1 new_dir 重命名/移動 一個目錄
    cp file1 file2 復制一個文件
    cp dir/* . 復制一個目錄下的所有文件到當前工作目錄
    cp -a /tmp/dir1 . 復制一個目錄到當前工作目錄
    cp -a dir1 dir2 復制一個目錄
    ln -s file1 lnk1 創建一個指向文件或目錄的軟鏈接
    ln file1 lnk1 創建一個指向文件或目錄的物理鏈接
    touch -t 0712250000 file1 修改一個文件或目錄的時間戳 - (YYMMDDhhmm)
    file file1 outputs the mime type of the file as text
    iconv -l 列出已知的編碼
    iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
    find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)

     

    文件搜索
    find / -name file1 從 '/' 開始進入根文件系統搜索文件和目錄
    find / -user user1 搜索屬于用戶 'user1' 的文件和目錄
    find /home/user1 -name \*.bin 在目錄 '/ home/user1' 中搜索帶有'.bin' 結尾的文件
    find /usr/bin -type f -atime +100 搜索在過去100天內未被使用過的執行文件
    find /usr/bin -type f -mtime -10 搜索在10天內被創建或者修改過的文件
    find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 結尾的文件并定義其權限
    find / -xdev -name \*.rpm 搜索以 '.rpm' 結尾的文件,忽略光驅、捷盤等可移動設備
    locate \*.ps 尋找以 '.ps' 結尾的文件 - 先運行 'updatedb' 命令
    whereis halt 顯示一個二進制文件、源碼或man的位置
    which halt 顯示一個二進制文件或可執行文件的完整路徑

     

    掛載一個文件系統
    mount /dev/hda2 /mnt/hda2 掛載一個叫做hda2的盤 - 確定目錄 '/ mnt/hda2' 已經存在
    umount /dev/hda2 卸載一個叫做hda2的盤 - 先從掛載點 '/ mnt/hda2' 退出
    fuser -km /mnt/hda2 當設備繁忙時強制卸載
    umount -n /mnt/hda2 運行卸載操作而不寫入 /etc/mtab 文件- 當文件為只讀或當磁盤寫滿時非常有用
    mount /dev/fd0 /mnt/floppy 掛載一個軟盤
    mount /dev/cdrom /mnt/cdrom 掛載一個cdrom或dvdrom
    mount /dev/hdc /mnt/cdrecorder 掛載一個cdrw或dvdrom
    mount /dev/hdb /mnt/cdrecorder 掛載一個cdrw或dvdrom
    mount -o loop file.iso /mnt/cdrom 掛載一個文件或ISO鏡像文件
    mount -t vfat /dev/hda5 /mnt/hda5 掛載一個Windows FAT32文件系統
    mount /dev/sda1 /mnt/usbdisk 掛載一個usb 捷盤或閃存設備
    mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 掛載一個windows網絡共享

     

    磁盤空間
    df -h 顯示已經掛載的分區列表
    ls -lSr |more 以尺寸大小排列文件和目錄
    du -sh dir1 估算目錄 'dir1' 已經使用的磁盤空間'
    du -sk * | sort -rn 以容量大小為依據依次顯示文件和目錄的大小
    rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小為依據依次顯示已安裝的rpm包所使用的空間 (fedora, redhat類系統)
    dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小為依據顯示已安裝的deb包所使用的空間 (ubuntu, debian類系統)

    返回頂部索引 ^

    用戶和群組
    groupadd group_name 創建一個新用戶組
    groupdel group_name 刪除一個用戶組
    groupmod -n new_group_name old_group_name 重命名一個用戶組
    useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 創建一個屬于 "admin" 用戶組的用戶
    useradd user1 創建一個新用戶
    userdel -r user1 刪除一個用戶 ( '-r' 排除主目錄)
    usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用戶屬性
    passwd 修改口令
    passwd user1 修改一個用戶的口令 (只允許root執行)
    chage -E 2005-12-31 user1 設置用戶口令的失效期限
    pwck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的用戶
    grpck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的群組
    newgrp group_name 登陸進一個新的群組以改變新創建文件的預設群組

    返回頂部索引 ^

    文件的權限 - 使用 "+" 設置權限,使用 "-" 用于取消
    ls -lh 顯示權限
    ls /tmp | pr -T5 -W$COLUMNS 將終端劃分成5欄顯示
    chmod ugo+rwx directory1 設置目錄的所有人(u)、群組(g)以及其他人(o)以讀(r )、寫(w)和執行(x)的權限
    chmod go-rwx directory1 刪除群組(g)與其他人(o)對目錄的讀寫執行權限
    chown user1 file1 改變一個文件的所有人屬性
    chown -R user1 directory1 改變一個目錄的所有人屬性并同時改變改目錄下所有文件的屬性
    chgrp group1 file1 改變文件的群組
    chown user1:group1 file1 改變一個文件的所有人和群組屬性
    find / -perm -u+s 羅列一個系統中所有使用了SUID控制的文件
    chmod u+s /bin/file1 設置一個二進制文件的 SUID 位 - 運行該文件的用戶也被賦予和所有者同樣的權限
    chmod u-s /bin/file1 禁用一個二進制文件的 SUID位
    chmod g+s /home/public 設置一個目錄的SGID 位 - 類似SUID ,不過這是針對目錄的
    chmod g-s /home/public 禁用一個目錄的 SGID 位
    chmod o+t /home/public 設置一個文件的 STIKY 位 - 只允許合法所有人刪除文件
    chmod o-t /home/public 禁用一個目錄的 STIKY 位

    返回頂部索引 ^

    文件的特殊屬性 - 使用 "+" 設置權限,使用 "-" 用于取消
    chattr +a file1 只允許以追加方式讀寫文件
    chattr +c file1 允許這個文件能被內核自動壓縮/解壓
    chattr +d file1 在進行文件系統備份時,dump程序將忽略這個文件
    chattr +i file1 設置成不可變的文件,不能被刪除、修改、重命名或者鏈接
    chattr +s file1 允許一個文件被安全地刪除
    chattr +S file1 一旦應用程序對這個文件執行了寫操作,使系統立刻把修改的結果寫到磁盤
    chattr +u file1 若文件被刪除,系統會允許你在以后恢復這個被刪除的文件
    lsattr 顯示特殊的屬性

    返回頂部索引 ^

    打包和壓縮文件
    bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件
    bzip2 file1 壓縮一個叫做 'file1' 的文件
    gunzip file1.gz 解壓一個叫做 'file1.gz'的文件
    gzip file1 壓縮一個叫做 'file1'的文件
    gzip -9 file1 最大程度壓縮
    rar a file1.rar test_file 創建一個叫做 'file1.rar' 的包
    rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1'
    rar x file1.rar 解壓rar包
    unrar x file1.rar 解壓rar包
    tar -cvf archive.tar file1 創建一個非壓縮的 tarball
    tar -cvf archive.tar file1 file2 dir1 創建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件
    tar -tf archive.tar 顯示一個包中的內容
    tar -xvf archive.tar 釋放一個包
    tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下
    tar -cvfj archive.tar.bz2 dir1 創建一個bzip2格式的壓縮包
    tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包
    tar -cvfz archive.tar.gz dir1 創建一個gzip格式的壓縮包
    tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包
    zip file1.zip file1 創建一個zip格式的壓縮包
    zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包
    unzip file1.zip 解壓一個zip格式壓縮包

    返回頂部索引 ^

    RPM 包 - (Fedora, Redhat及類似系統)
    rpm -ivh package.rpm 安裝一個rpm包
    rpm -ivh --nodeeps package.rpm 安裝一個rpm包而忽略依賴關系警告
    rpm -U package.rpm 更新一個rpm包但不改變其配置文件
    rpm -F package.rpm 更新一個確定已經安裝的rpm包
    rpm -e package_name.rpm 刪除一個rpm包
    rpm -qa 顯示系統中所有已經安裝的rpm包
    rpm -qa | grep httpd 顯示所有名稱中包含 "httpd" 字樣的rpm包
    rpm -qi package_name 獲取一個已安裝包的特殊信息
    rpm -qg "System Environment/Daemons" 顯示一個組件的rpm包
    rpm -ql package_name 顯示一個已經安裝的rpm包提供的文件列表
    rpm -qc package_name 顯示一個已經安裝的rpm包提供的配置文件列表
    rpm -q package_name --whatrequires 顯示與一個rpm包存在依賴關系的列表
    rpm -q package_name --whatprovides 顯示一個rpm包所占的體積
    rpm -q package_name --scripts 顯示在安裝/刪除期間所執行的腳本l
    rpm -q package_name --changelog 顯示一個rpm包的修改歷史
    rpm -qf /etc/httpd/conf/httpd.conf 確認所給的文件由哪個rpm包所提供
    rpm -qp package.rpm -l 顯示由一個尚未安裝的rpm包提供的文件列表
    rpm --import /media/cdrom/RPM-GPG-KEY 導入公鑰數字證書
    rpm --checksig package.rpm 確認一個rpm包的完整性
    rpm -qa gpg-pubkey 確認已安裝的所有rpm包的完整性
    rpm -V package_name 檢查文件尺寸、 許可、類型、所有者、群組、MD5檢查以及最后修改時間
    rpm -Va 檢查系統中所有已安裝的rpm包- 小心使用
    rpm -Vp package.rpm 確認一個rpm包還未安裝
    rpm2cpio package.rpm | cpio --extract --make-directories *bin* 從一個rpm包運行可執行文件
    rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 從一個rpm源碼安裝一個構建好的包
    rpmbuild --rebuild package_name.src.rpm 從一個rpm源碼構建一個 rpm 包

    返回頂部索引 ^

    YUM 軟件包升級器 - (Fedora, RedHat及類似系統)
    yum install package_name 下載并安裝一個rpm包
    yum localinstall package_name.rpm 將安裝一個rpm包,使用你自己的軟件倉庫為你解決所有依賴關系
    yum update package_name.rpm 更新當前系統中所有安裝的rpm包
    yum update package_name 更新一個rpm包
    yum remove package_name 刪除一個rpm包
    yum list 列出當前系統中安裝的所有包
    yum search package_name 在rpm倉庫中搜尋軟件包
    yum clean packages 清理rpm緩存刪除下載的包
    yum clean headers 刪除所有頭文件
    yum clean all 刪除所有緩存的包和頭文件

    返回頂部索引 ^

    DEB 包 (Debian, Ubuntu 以及類似系統)
    dpkg -i package.deb 安裝/更新一個 deb 包
    dpkg -r package_name 從系統刪除一個 deb 包
    dpkg -l 顯示系統中所有已經安裝的 deb 包
    dpkg -l | grep httpd 顯示所有名稱中包含 "httpd" 字樣的deb包
    dpkg -s package_name 獲得已經安裝在系統中一個特殊包的信息
    dpkg -L package_name 顯示系統中已經安裝的一個deb包所提供的文件列表
    dpkg --contents package.deb 顯示尚未安裝的一個包所提供的文件列表
    dpkg -S /bin/ping 確認所給的文件由哪個deb包提供

    返回頂部索引 ^

    APT 軟件工具 (Debian, Ubuntu 以及類似系統)
    apt-get install package_name 安裝/更新一個 deb 包
    apt-cdrom install package_name 從光盤安裝/更新一個 deb 包
    apt-get update 升級列表中的軟件包
    apt-get upgrade 升級所有已安裝的軟件
    apt-get remove package_name 從系統刪除一個deb包
    apt-get check 確認依賴的軟件倉庫正確
    apt-get clean 從下載的軟件包中清理緩存
    apt-cache search searched-package 返回包含所要搜索字符串的軟件包名稱

    返回頂部索引 ^

    查看文件內容
    cat file1 從第一個字節開始正向查看文件的內容
    tac file1 從最后一行開始反向查看一個文件的內容
    more file1 查看一個長文件的內容
    less file1 類似于 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
    head -2 file1 查看一個文件的前兩行
    tail -2 file1 查看一個文件的最后兩行
    tail -f /var/log/messages 實時查看被添加到一個文件中的內容

    返回頂部索引 ^

    文本處理
    cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
    cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一個文件的詳細說明文本,并將簡介寫入一個新文件中
    cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一個文件的詳細說明文本,并將簡介寫入一個已有的文件中
    grep Aug /var/log/messages 在文件 '/var/log/messages'中查找關鍵詞"Aug"
    grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"開始的詞匯
    grep [0-9] /var/log/messages 選擇 '/var/log/messages' 文件中所有包含數字的行
    grep Aug -R /var/log/* 在目錄 '/var/log' 及隨后的目錄中搜索字符串"Aug"
    sed 's/stringa1/stringa2/g' example.txt 將example.txt文件中的 "string1" 替換成 "string2"
    sed '/^$/d' example.txt 從example.txt文件中刪除所有空白行
    sed '/ *#/d; /^$/d' example.txt 從example.txt文件中刪除所有注釋和空白行
    echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下單元格內容
    sed -e '1d' result.txt 從文件example.txt 中排除第一行
    sed -n '/stringa1/p' 查看只包含詞匯 "string1"的行
    sed -e 's/ *$//' example.txt 刪除每一行最后的空白字符
    sed -e 's/stringa1//g' example.txt 從文檔中只刪除詞匯 "string1" 并保留剩余全部
    sed -n '1,5p;5q' example.txt 查看從第一行到第5行內容
    sed -n '5p;5q' example.txt 查看第5行
    sed -e 's/00*/0/g' example.txt 用單個零替換多個零
    cat -n file1 標示文件的行數
    cat example.txt | awk 'NR%2==1' 刪除example.txt文件中的所有偶數行
    echo a b c | awk '{print $1}' 查看一行第一欄
    echo a b c | awk '{print $1,$3}' 查看一行的第一和第三欄
    paste file1 file2 合并兩個文件或兩欄的內容
    paste -d '+' file1 file2 合并兩個文件或兩欄的內容,中間用"+"區分
    sort file1 file2 排序兩個文件的內容
    sort file1 file2 | uniq 取出兩個文件的并集(重復的行只保留一份)
    sort file1 file2 | uniq -u 刪除交集,留下其他的行
    sort file1 file2 | uniq -d 取出兩個文件的交集(只留下同時存在于兩個文件中的文件)
    comm -1 file1 file2 比較兩個文件的內容只刪除 'file1' 所包含的內容
    comm -2 file1 file2 比較兩個文件的內容只刪除 'file2' 所包含的內容
    comm -3 file1 file2 比較兩個文件的內容只刪除兩個文件共有的部分

    返回頂部索引 ^


    字符設置和文件格式轉換
    dos2unix filedos.txt fileunix.txt 將一個文本文件的格式從MSDOS轉換成UNIX
    unix2dos fileunix.txt filedos.txt 將一個文本文件的格式從UNIX轉換成MSDOS
    recode ..HTML < page.txt > page.html 將一個文本文件轉換成html
    recode -l | more 顯示所有允許的轉換格式

    返回頂部索引 ^

    文件系統分析
    badblocks -v /dev/hda1 檢查磁盤hda1上的壞磁塊
    fsck /dev/hda1 修復/檢查hda1磁盤上linux文件系統的完整性
    fsck.ext2 /dev/hda1 修復/檢查hda1磁盤上ext2文件系統的完整性
    e2fsck /dev/hda1 修復/檢查hda1磁盤上ext2文件系統的完整性
    e2fsck -j /dev/hda1 修復/檢查hda1磁盤上ext3文件系統的完整性
    fsck.ext3 /dev/hda1 修復/檢查hda1磁盤上ext3文件系統的完整性
    fsck.vfat /dev/hda1 修復/檢查hda1磁盤上fat文件系統的完整性
    fsck.msdos /dev/hda1 修復/檢查hda1磁盤上dos文件系統的完整性
    dosfsck /dev/hda1 修復/檢查hda1磁盤上dos文件系統的完整性

    返回頂部索引 ^

    初始化一個文件系統
    mkfs /dev/hda1 在hda1分區創建一個文件系統
    mke2fs /dev/hda1 在hda1分區創建一個linux ext2的文件系統
    mke2fs -j /dev/hda1 在hda1分區創建一個linux ext3(日志型)的文件系統
    mkfs -t vfat 32 -F /dev/hda1 創建一個 FAT32 文件系統
    fdformat -n /dev/fd0 格式化一個軟盤
    mkswap /dev/hda3 創建一個swap文件系統

    返回頂部索引 ^

    SWAP文件系統
    mkswap /dev/hda3 創建一個swap文件系統
    swapon /dev/hda3 啟用一個新的swap文件系統
    swapon /dev/hda2 /dev/hdb3 啟用兩個swap分區

    返回頂部索引 ^

    備份
    dump -0aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的完整備份
    dump -1aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的交互式備份
    restore -if /tmp/home0.bak 還原一個交互式備份
    rsync -rogpav --delete /home /tmp 同步兩邊的目錄
    rsync -rogpav -e ssh --delete /home ip_address:/tmp 通過SSH通道rsync
    rsync -az -e ssh --delete ip_addr:/home/public /home/local 通過ssh和壓縮將一個遠程目錄同步到本地目錄
    rsync -az -e ssh --delete /home/local ip_addr:/home/public 通過ssh和壓縮將本地目錄同步到遠程目錄
    dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通過ssh在遠程主機上執行一次備份本地磁盤的操作
    dd if=/dev/sda of=/tmp/file1 備份磁盤內容到一個文件
    tar -Puf backup.tar /home/user 執行一次對 '/home/user' 目錄的交互式備份操作
    ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通過ssh在遠程目錄中復制一個目錄內容
    ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通過ssh在遠程目錄中復制一個本地目錄
    tar cf - . | (cd /tmp/backup ; tar xf - ) 本地將一個目錄復制到另一個地方,保留原有權限及鏈接
    find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 從一個目錄查找并復制所有以 '.txt' 結尾的文件到另一個目錄
    find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 結尾的文件并做成一個bzip包
    dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一個將 MBR (Master Boot Record)內容復制到軟盤的動作
    dd if=/dev/fd0 of=/dev/hda bs=512 count=1 從已經保存到軟盤的備份中恢復MBR內容

    返回頂部索引 ^

    光盤
    cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一個可復寫的光盤內容
    mkisofs /dev/cdrom > cd.iso 在磁盤上創建一個光盤的iso鏡像文件
    mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盤上創建一個壓縮了的光盤iso鏡像文件
    mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 創建一個目錄的iso鏡像文件
    cdrecord -v dev=/dev/cdrom cd.iso 刻錄一個ISO鏡像文件
    gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻錄一個壓縮了的ISO鏡像文件
    mount -o loop cd.iso /mnt/iso 掛載一個ISO鏡像文件
    cd-paranoia -B 從一個CD光盤轉錄音軌到 wav 文件中
    cd-paranoia -- "-3" 從一個CD光盤轉錄音軌到 wav 文件中(參數-3)
    cdrecord --scanbus 掃描總線以識別scsi通道
    dd if=/dev/hdc | md5sum 校驗一個設備的md5sum編碼,例如一張 CD

    返回頂部索引 ^

    網絡 - (以太網和WIFI無線)
    ifconfig eth0 顯示一個以太網卡的配置
    ifup eth0 啟用一個 'eth0' 網絡設備
    ifdown eth0 禁用一個 'eth0' 網絡設備
    ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
    ifconfig eth0 promisc 設置 'eth0' 成混雜模式以嗅探數據包 (sniffing)
    dhclient eth0 以dhcp模式啟用 'eth0'
    route -n show routing table
    route add -net 0/0 gw IP_Gateway configura default gateway
    route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16'
    route del 0/0 gw IP_gateway remove static route
    echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing
    hostname show hostname of system
    host www.example.com lookup hostname to resolve name to ip address and viceversa(1)
    nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2)
    ip link show show link status of all interfaces
    mii-tool eth0 show link status of 'eth0'
    ethtool eth0 show statistics of network card 'eth0'
    netstat -tup show all active network connections and their PID
    netstat -tupl show all network services listening on the system and their PID
    tcpdump tcp port 80 show all HTTP traffic
    iwlist scan show wireless networks
    iwconfig eth1 show configuration of a wireless network card
    hostname show hostname
    host www.example.com lookup hostname to resolve name to ip address and viceversa
    nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
    whois www.example.com lookup on Whois database

    GO TOP INDEX ^
    Microsoft Windows networks (SAMBA)
    nbtscan ip_addr netbios name resolution
    nmblookup -A ip_addr netbios name resolution
    smbclient -L ip_addr/hostname show remote shares of a windows host
    smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb
    mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share

     

    posted @ 2013-09-09 18:30 yuhaibo736 閱讀(818) | 評論 (0)編輯 收藏

    手工建庫后出現ORA-06553:PLS-213:Standard包不可訪問 問題,在網上查下了資料解決了!

    ORACLE數據庫,在一次意外操作中,使得ORACLE數據庫出現故障,提示:ORA-06553:PLS-213:Standard包不可訪問。一般都是由于操作不當引起的,如:刪除某一用戶權限、刪除某一數據等等。下面把我總結出來的處理經驗公布如下:

    另外說幾點:網上很多人的博客雖然也有說明此問題的解決方法,但都比較專業,沒有一些操作經驗的根本看不懂,也不知道如何操作,往往使讀者更糊涂。

    首先,本文測試平臺:windows 2003,oracle 9i

    我們的目標:執行catalog.sql和catproc.sql重建數據字典。

    1.點擊左下角的“開始”--運行 輸入 sqlplus /nolog

    2.使用“超級管理員”(sys)的賬戶和密碼 進入你的系統,命令如下:

    sql > connect sys/你的密碼@你的數據庫 as sysdba

    如果提示正確登錄,則已經成功一半了。如果沒有成功登錄,則參考是否忘記密碼,忘記密碼的補救不在本文的范圍,涉及到的請自行參考資料。

    3. SQL>@D:\oracle\ora90\rdbms\admin\catalog.sql

    4. SQL>@D:\oracle\ora90\rdbms\admin\CATPROC.SQL

    5. SQL>@D:\oracle\ora90\rdbms\admin\DBMSSUTIL.SQL

    6. SQL>ALTER PACKAGE STANDARD COMPILE;

    7. SQL>ALTER PACKAGE DBMS_STANDARD COMPILE;

    8. SQL>SHUTDOWN ABOUT;

    9. SQL>STARTUP;

    參考:(一般不用,如果恢復成功。)

    @ORACLE_BASE\ORACLE_HOME\rdbms\admin\utlrp.sql

    posted @ 2013-09-09 18:29 yuhaibo736 閱讀(995) | 評論 (0)編輯 收藏

    webservice的原理及概念

    1 webservice

    所謂webservice就是定義了一套標準的調用過程:

    a 服務器首先用一套標準的方法向外界描述它所提供的服務的內容,就屬于WSDL

    b 客戶端需要以一種標準的協議來調用此服務,這屬于SOAP.

    c 服務提供者將服務內容放在一個公共的網址讓大家查詢,就屬于UDDI.

    2 命名空間

    命名空間其主要目的通過加一個命名屬性,使名稱保持唯一性。WSDL有大量的使用命名空間的地方。本質上WSDL是一個XML文件,作為一個XML文件,為了區別同名的元素,就需要采用命名空間的概念。

    3 WSDL的本質:服務內容的標準化描述

    WSDL的全稱是web service Description Language,是一種基于XML格式的關于web服務的描述語言。其主要目的在于web service的提供者將自己的web服務的所有相關內容,如所提供的服務的傳輸方式,服務方法接口,接口參數,服務路徑等,生成相應的完全文檔,發布給使用者。使用者可以通過這個WSDL文檔,創建相應的SOAP請求消息,通過HTTP傳遞給webservice提供者;web服務在完成服務請求后,將SOAP返回消息傳回請求者,服務請求者再根據WSDL文檔將SOAP返回消息解析成自己能夠理解的內容。

    4 SOAP的本質:標準的傳輸協議

    SOAP是web service的標準通信協議,SOAP為simple object access protocoll的縮寫,簡單對象訪問協議. 它是一種標準化的傳輸消息的XML消息格式。

    5 UDDI的本質:服務的公共網址

    將web service進行UDDI注冊發布,UDDI是一種創建注冊表服務的規范,以便大家將自己的web service進行注冊發布供使用者查找.然而當服務提供者想將自己的web service向全世界公布,以便外部找到其服務時,那么服務提供者可以將自己的web service注冊到相應的UDDI商用注冊網站,目前全球有IBM等4家UDDI商用注冊網站。因為WSDL文件中已經給定了web service的地址URI,外部可以直接通過WSDL提供的URI進行相應的web service調用。所以UDDI并不是一個必需的web service組件,服務方完全可以不進行UDDI的注冊。

    posted @ 2013-04-23 11:17 yuhaibo736 閱讀(258) | 評論 (0)編輯 收藏

    java處理word已經存在很多種方法了,但是用起來都不是那么方便,而且不太靈活,而使用xml的方法可以做到非常靈活,你可以先建好模板,然后往里面填數,模板怎么建,填出來的效果就是怎么樣的。首先說說word和xml的關系,每個word它都對應著一個xml文件,也就是說你修改了xml,對應的word文件也就跟著修改了。通過word的保存功能可以將一個word文件保存為xml文件,該文件雖然是.xml格式的,但是直接雙擊打開的話還是使用word打開,所以你只能用txt將它打開,用txt打開之后將里面的一句話:<?mso-application progid="Word.Document"?>去掉,然后保存,接著就可以雙擊直接打開了,這樣使用的就是IE打開的,你這樣就可以查看里面的節點具體的構造。

    最上面的主節點是<w:wordDocument>(如果不是的話,相信你將word文件保存成xml的時候使用的是07word,選擇的是:word xml文檔(*.xml),你可以選擇word 2003 xml文檔(*.xml)試試);該主節點下面有大致8個節點,其中我們要操作的就是<w:body>節點,該節點是word的正文節點,其他的節點沒有去研究;<w:body>下面包含的節點可能會有:<w:p>段落節點、<w:tbl>表格節點。

    接著要做的就是在java程序中,使用dom來解析編輯xml文件,這里貼出一些代碼來供大家參考:

     

    public Document loadXML(String filename){//////////加載xml文件

    Document document = null; 

       try{

       DocumentBuilderFactory   factory = DocumentBuilderFactory.newInstance();    

           DocumentBuilder builder=factory.newDocumentBuilder();    

           document=builder.parse(new File(filename));    

           document.normalize(); 

       }catch (Exception ex){

           ex.printStackTrace(); 

       }   

       return document; 

    }

     

    public boolean doc2XmlFile(Document document,File targetFile){ ///////回寫xml文件

    boolean flag = true; 

       try{

       TransformerFactory tFactory = TransformerFactory.newInstance();    

           Transformer transformer = tFactory.newTransformer();  

           DOMSource source = new DOMSource(document);  

           StreamResult result = new StreamResult(targetFile.toURI().getPath());

           transformer.transform(source, result);  

       }catch(Exception ex){ 

           flag = false; 

           ex.printStackTrace(); 

       } 

       return flag;       

    }

    String void function(){///////////程序入口

     

    String rootPath=ServletActionContext.getServletContext().getRealPath("/excelTemplate")+"\\";

    try{

    Document document=loadXML(rootPath+"projectModel.xml");

    Element root = document.getDocumentElement();

    NodeList rootList=root.getChildNodes();

    Node bodyNode=null;///////w:body

    for(int i=0;i<rootList.getLength();i++){////////找到<w:body>節點

    bodyNode=rootList.item(i);

    if("w:body".equals(bodyNode.getNodeName())){

    break;

    }

    }

    NodeList nodeList=bodyNode.getChildNodes();

    for(int i=0;i<nodeList.getLength();i++){

    Node node=nodeList.item(i);

    if("w:tbl".equals(node.getNodeName())){

    dealWithTableNode(document,node);

    }else if("w:p".equals(node.getNodeName())){

    dealWithWPNode(document,node);

    }

     

    }

    File destFile = File.createTempFile("project", ".xml");

    doc2XmlFile(document,destFile);///////回寫

    inputStream = new FileInputStream(destFile);/////////生成流,用于下載

    fileName=URLEncoder.encode(project.getProjectName(),"utf-8")+".doc";

    }catch(Exception e){

    e.printStackTrace();

    }

     

    }

    注意:

    1、在解析編輯xml文件的時候一定好看好節點的位置,比如一般的文本內容的話可能是在<w:p>節點下的<w:r>節點下的<w:t>里設置,使用的是getTextContent()方法來獲取它的內容,setTextContent()來設置它的參數

    2、對于圖片如何插入呢?首先最好在模板中插入一張圖片,主要用于定下圖片的那些格式,然后圖片必須用java轉成base64的字符串,這里也提供一個方法:

     

    private String toBASE64codeFile(File file){

    String codeString="";

    try{

    FileInputStream fis=new FileInputStream(file);

    BASE64Encoder encoder=new BASE64Encoder();

    byte[] b=new byte[228];

    int count=-1,n=0;

    while((count=fis.read(b))!=-1){

    codeString+=encoder.encode(b);

    }

    return codeString;

    }catch(Exception e){

    e.printStackTrace();

    return "";

    }

    }

    然后找到<w:pict>節點:一般如果圖片是在table里的話,該節點就是在<w:tbl>-<w:tr>-<w:tc>-<w:p>-<w:r>節點下面,不在table里的話就是:<w:p>-<w:r>,建議仿照用IE打開的xml對照一下。然后將該節點下的<w:binData>的內容置成你所要插入的圖片的base64碼即可。

    posted @ 2013-03-06 13:30 yuhaibo736 閱讀(613) | 評論 (0)編輯 收藏

    將幾個word文件合并到一個word文件,需要下載jacob-1.17-M2.zip,將壓縮文件內的jacob-1.17-M2-x64.dll放到windows/system32下,將jacob.jar放到項目中
    public static void main(String[] args) {
       List list  = new ArrayList();
       String file1= "D:\\file1.doc";
       String file2= "D:\\file2.doc";
       String file3= "D:\\file3.doc";
       list.add(file1);
       list.add(file2);
       list.add(file3);
       uniteDoc(list,"d:\\file.doc");
     }
     public static void uniteDoc(List fileList, String savepaths) {
      if (fileList.size() == 0 || fileList == null) {
       return;
      }
      //打開word
      ActiveXComponent app = new ActiveXComponent("Word.Application");//啟動word
      try {
       // 設置word不可見
       app.setProperty("Visible", new Variant(false));
       //獲得documents對象
       Object docs = app.getProperty("Documents").toDispatch();
       //打開第一個文件
       Object doc = Dispatch
                    .invoke(
                            (Dispatch) docs,
                            "Open",
                            Dispatch.Method,
                            new Object[] { (String) fileList.get(0),
                                    new Variant(false), new Variant(true) },
                            new int[3]).toDispatch();
       //追加文件
       for (int i = 1; i < fileList.size(); i++) {
        Dispatch.invoke(app.getProperty("Selection").toDispatch(),
                        "insertFile", Dispatch.Method, new Object[] {
                                (String) fileList.get(i), "",
                                new Variant(false), new Variant(false),
                                new Variant(false) }, new int[3]);
       }
       //保存新的word文件
       Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method,
                    new Object[] { savepaths, new Variant(1) }, new int[3]);
       Variant f = new Variant(false);
       Dispatch.call((Dispatch) doc, "Close", f);
      } catch (Exception e) {
       throw new RuntimeException("合并word文件出錯.原因:" + e);
      } finally {
       app.invoke("Quit", new Variant[] {});
      }
     }


    posted @ 2013-03-06 13:20 yuhaibo736 閱讀(1242) | 評論 (0)編輯 收藏


    package com.cbd.dk.test;

    import java.util.ListIterator;
    import java.util.Stack;

    public class Test {

     private String src;

     public Test(String src) {
      this.src = src;
     }
     public double getResult() {
      String postfix = getPostfix();
      Stack<String> stk = new Stack<String>();
      //System.out.println(postfix);
      String parts[] = postfix.split(" +");
      double result=0;
      for(int i=0; i<parts.length; i++){
       char tmp = parts[i].charAt(0);
       if(!isOperator(tmp)){
        stk.push(parts[i]);
       }else{
        double a = Double.parseDouble(stk.pop());
        double b = Double.parseDouble(stk.pop());
        result = calculate(b,a,tmp);
        stk.push(String.valueOf(result));
       }
      }
      return result;
     }


     /**
      * test if the character is an operator,such +,-,*,/
      * @param op  the character to test
      * @return  true if op is an operator otherwise false
      */
     private boolean isOperator(char op){
      return (op=='+'||op=='-'||op=='*'||op=='/');
     }


     /**
      * calculate an expression such (a op b)
      * @param a  number 1
      * @param b  number 2
      * @param op the operator
      * @return  (double)(a op b)
      */
     public double calculate(double a, double b, char op) {
      switch (op) {
       case '+':
        return a + b;
       case '-':
        return a - b;
       case '*':
        return a * b;
       case '/':
        return a / b;
      }
      return -1;
     }


     /**
      * convert the suffix to postfix
      * @return the postfix as a string
      */
     private String getPostfix() {
      Stack<String> stk = new Stack<String>();
      String postfix = new String();
      char op;
      int i = 0;
      while (i < src.length()) {
       if (Character.isDigit(src.charAt(i))||src.charAt(i)=='.') {
        postfix += " ";
        do {
         postfix += src.charAt(i++);
        } while ((i < src.length()) && (Character.isDigit(src.charAt(i))));
        postfix += " ";
       }else {
        switch (op = src.charAt(i++)) {
         case '(':
          stk.push("(");
          break;
         case ')':
          while (stk.peek() != "(") {
           String tmp = stk.pop();
           postfix += tmp;
           if(tmp.length()==1 && isOperator(tmp.charAt(0)))
            postfix += " ";
          }
          stk.pop();
          postfix += " ";
          break;
         case '+':
         case '-':
          while ((!stk.empty()) && (stk.peek() != "(")) {
           postfix += stk.pop()+" ";
          }
          stk.push(new Character(op).toString());
          break;
         case '*':
         case '/':
          while ((!stk.empty()) && ((stk.peek() == "*") || (stk.peek() == "/"))) {
           postfix += stk.pop()+" ";
          }
          stk.push(new Character(op).toString());
          break;
        }
       }
      }
      ListIterator it = stk.listIterator(stk.size());
      while (it.hasPrevious())
       postfix += it.previous() + " ";
      return postfix.trim().replaceAll(" +\\.",".");
     }

     /**
      * main function
      * @param args
      */
     public static void main(String args[]) {
      //System.out.println(new Test("((1.5+6.000)*9+9.36)*(8-8*8+8*7)").getResult());
      System.out.println(new Test("(2+(3*2)/2)").getResult());
     }
    }

    posted @ 2012-12-11 16:24 yuhaibo736 閱讀(1134) | 評論 (0)編輯 收藏

    WITH CTE AS
    (
    SELECT OBJ_VW_ID,NODE_CODE ,P_NODE_CODE,NODE_TYP ,NODE_CAP,OBJ_VW_ENG_NAME,SN,ICON_TYP,rn=cast(NODE_CODE  as varchar(max)),level = 1 FROM DSK_OBJ_VW_DISP  WHERE NODE_CODE in (select NODE_CODE from DSK_OBJ_VW_DISP where P_NODE_CODE='2')
    UNION ALL
    SELECT T.OBJ_VW_ID,T.NODE_CODE,T.P_NODE_CODE,T.NODE_TYP,T.NODE_CAP,T.OBJ_VW_ENG_NAME,T.SN,T.ICON_TYP,rn=rn+cast(T.NODE_CODE AS VARCHAR(MAX)), level=level+1 FROM DSK_OBJ_VW_DISP T,CTE WHERE CTE.NODE_CODE=T.P_NODE_CODE
    )
    SELECT OBJ_VW_ID,NODE_CODE ,P_NODE_CODE,NODE_TYP,NODE_CAP,OBJ_VW_ENG_NAME,SN,ICON_TYP,rn,level FROM CTE  ORDER BY rn

    posted @ 2012-10-23 15:04 yuhaibo736 閱讀(722) | 評論 (0)編輯 收藏

    package test;

    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.lang3.StringUtils;

    public class TestStringUtils {
     
     public static void main(String[] args) {
      // 空字符串檢查
      String t1_1 = "";
      String t1_2 = "\n\n\t";
      String t1_3 = null;
      String t1_4 = "Test";
      System.out.println("t1_1 blank? " + StringUtils.isBlank(t1_1));
      System.out.println("t1_2 blank? " + StringUtils.isBlank(t1_2));
      System.out.println("t1_3 blank? " + StringUtils.isBlank(t1_3));
      System.out.println("t1_4 blank? " + StringUtils.isBlank(t1_4));
      // 清除空白字符
      String t2_1 = "\t";
      String t2_2 = "  A  Test  ";
      String t2_3 = null;
      System.out.println("t2_1 trimToNull: " + StringUtils.trimToNull(t2_1));
      System.out.println("t2_2 trimToNull: " + StringUtils.trimToNull(t2_2));
      System.out.println("t2_3 trimToNull: " + StringUtils.trimToNull(t2_3));
      System.out.println("t2_1 trim: " + StringUtils.trim(t2_1));
      System.out.println("t2_2 trim: " + StringUtils.trim(t2_2));
      System.out.println("t2_3 trim: " + StringUtils.trim(t2_3));
      // 取得字符串的縮寫
      String t3_1 = "This is a test of the abbreviation.";
      String t3_2 = "Test";
      System.out.println(StringUtils.abbreviate(t3_1, 15));
      System.out.println(StringUtils.abbreviate(t3_1, 5, 15));
      System.out.println(StringUtils.abbreviate(t3_2, 10));
      // 劈分字符串
      String t4_1 = "A b,c.d|e";
      String t4_2 = "Pharmacy, basketball funky";
      String[] array1 = StringUtils.split(t4_1, " ,.|");
      String[] array2 = StringUtils.split(t4_2, " ,", 2);
      System.out.println(ArrayUtils.toString(array1));
      System.out.println(ArrayUtils.toString(array2));
      // 查找嵌套字符串
      String t5_1 = "ABC1234ABC4567";
      System.out.println(StringUtils.substringBetween(t5_1, "1234", "4567"));
      System.out.println(StringUtils.substringBetween(t5_1, "12345", "4567"));
      // 去除尾部換行符
      String t6_1 = "Hello\n";
      System.out.println(StringUtils.chomp(t6_1));
      String t6_2 = "Another test\r\n";
      System.out.println(StringUtils.chomp(t6_2));
      // 重復字符串
      System.out.println(StringUtils.repeat("*", 10));
      System.out.println(StringUtils.repeat("China ", 5));
      // 顛倒字符串
      System.out.println(StringUtils.reverse("ABCDE"));
      // 判斷字符串內容的類型
      String t7_1 = "Virginia";
      System.out.println("Is state number? " + StringUtils.isNumeric(t7_1));// 全由數字組成
      System.out.println("Is state alpha? " + StringUtils.isAlpha(t7_1));// 全由字母組成
      System.out.println("Is state alphanumeric? " + StringUtils.isAlphanumeric(t7_1));// 全由數字或數字組成
      System.out.println("Is state alphaspace? " + StringUtils.isAlphaSpace(t7_1));// 全由字母或空格組成
      // 取得某字符串在另一字符串中出現的次數
      System.out.println(StringUtils.countMatches("Chinese People", "e"));
      // 部分截取字符串
      String t8_1 = " 25 * (30,40) [50,60] | 30";
      System.out.print("N0: " + StringUtils.substringBeforeLast(t8_1, "*"));
      System.out.print(", N1: " + StringUtils.substringBetween(t8_1, "(", ","));
      System.out.print(", N2: " + StringUtils.substringBetween(t8_1, ",", ")"));
      System.out.print(", N3: " + StringUtils.substringBetween(t8_1, "[", ","));
      System.out.print(", N4: " + StringUtils.substringBetween(t8_1, ",", "]"));
      System.out.print(", N5: " + StringUtils.substringAfterLast(t8_1, "|"));
     }

    }

    posted @ 2012-08-30 11:02 yuhaibo736 閱讀(573) | 評論 (0)編輯 收藏

    依賴包 json-lib-2.2.3-jdk13.jar、dom4j-1.6.1.jar

     

    package com.shine.framework.core.util;
    import java.io.ByteArrayOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import net.sf.json.JSON;
    import net.sf.json.JSONSerializer;
    import net.sf.json.xml.XMLSerializer;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;
    /**
    * common xml conver utility
    *
    * @author viruscodecn@gmail.com
    * @version Framework 2010.10.26
    */
    public class XmlConverUtil {
    /**
    * map to xml xml <node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node>
    *
    * @param map
    * @return
    */
    public static String maptoXml(Map map) {
    Document document = DocumentHelper.createDocument();
    Element nodeElement = document.addElement("node");
    for (Object obj : map.keySet()) {
    Element keyElement = nodeElement.addElement("key");
    keyElement.addAttribute("label", String.valueOf(obj));
    keyElement.setText(String.valueOf(map.get(obj)));
    }
    return doc2String(document);
    }
    /**
    * list to xml xml <nodes><node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node><node><key
    * label="key1">value1</key><key
    * label="key2">value2</key>......</node></nodes>
    *
    * @param list
    * @return
    */
    public static String listtoXml(List list) {
    Document document = DocumentHelper.createDocument();
    Element nodesElement = document.addElement("nodes");
    for (Object o : list) {
    Element nodeElement = nodesElement.addElement("node");
    for (Object obj : ((Map) o).keySet()) {
    Element keyElement = nodeElement.addElement("key");
    keyElement.addAttribute("label", String.valueOf(obj));
    keyElement.setText(String.valueOf(((Map) o).get(obj)));
    }
    }
    return doc2String(document);
    }
    /**
    * json to xml {"node":{"key":{"@label":"key1","#text":"value1"}}} conver
    * <o><node class="object"><key class="object"
    * label="key1">value1</key></node></o>
    *
    * @param json
    * @return
    */
    public static String jsontoXml(String json) {
    try {
    XMLSerializer serializer = new XMLSerializer();
    JSON jsonObject = JSONSerializer.toJSON(json);
    return serializer.write(jsonObject);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to map xml <node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node>
    *
    * @param xml
    * @return
    */
    public static Map xmltoMap(String xml) {
    try {
    Map map = new HashMap();
    Document document = DocumentHelper.parseText(xml);
    Element nodeElement = document.getRootElement();
    List node = nodeElement.elements();
    for (Iterator it = node.iterator(); it.hasNext();) {
    Element elm = (Element) it.next();
    map.put(elm.attributeValue("label"), elm.getText());
    elm = null;
    }
    node = null;
    nodeElement = null;
    document = null;
    return map;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to list xml <nodes><node><key label="key1">value1</key><key
    * label="key2">value2</key>......</node><node><key
    * label="key1">value1</key><key
    * label="key2">value2</key>......</node></nodes>
    *
    * @param xml
    * @return
    */
    public static List xmltoList(String xml) {
    try {
    List<Map> list = new ArrayList<Map>();
    Document document = DocumentHelper.parseText(xml);
    Element nodesElement = document.getRootElement();
    List nodes = nodesElement.elements();
    for (Iterator its = nodes.iterator(); its.hasNext();) {
    Element nodeElement = (Element) its.next();
    Map map = xmltoMap(nodeElement.asXML());
    list.add(map);
    map = null;
    }
    nodes = null;
    nodesElement = null;
    document = null;
    return list;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    * xml to json <node><key label="key1">value1</key></node> 轉化為
    * {"key":{"@label":"key1","#text":"value1"}}
    *
    * @param xml
    * @return
    */
    public static String xmltoJson(String xml) {
    XMLSerializer xmlSerializer = new XMLSerializer();
    return xmlSerializer.read(xml).toString();
    }
    /**
    *
    * @param document
    * @return
    */
    public static String doc2String(Document document) {
    String s = "";
    try {
    // 使用輸出流來進行轉化
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    // 使用UTF-8編碼
    OutputFormat format = new OutputFormat(" ", true, "UTF-8");
    XMLWriter writer = new XMLWriter(out, format);
    writer.write(document);
    s = out.toString("UTF-8");
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return s;
    }
    public static void main(String args[]) {
    XmlConverUtil util = new XmlConverUtil();
    String xml = "{/"node/":{/"key/":{/"@lable/":/"key1/",/"#text/":/"value1/"}}}";
    System.out.println(util.jsontoXml(xml));
    }
    }

    posted @ 2012-08-28 15:16 yuhaibo736 閱讀(2018) | 評論 (0)編輯 收藏

    commons-beanutils-1.8.0.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean
    commons-collections.jar 不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap
    commons-lang-2.4.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException
    commons-logging-1.1.1.jar不加這個包
    java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    ezmorph-1.0.4.jar不加這個包
    java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
    json-lib-2.3-jdk15.jar不加這個包
    java.lang.NoClassDefFoundError: net/sf/json/JSONObject
    相應jar包可到網上下載!
    實例:
    import java.util.ArrayList;
    import java.util.List;

    import net.sf.json.JSONArray;

    public class JsonTest {

    /**
    * @param args
    */
    public static void main(String[] args) throws Exception{
    boolean[] boolArray = new boolean[]{true,false,true}; 
    JSONArray jsonArray = JSONArray.fromObject( boolArray ); 
    System.out.println( jsonArray );

    List list = new ArrayList(); 
    list.add( "first" ); 
    list.add( "second" ); 
    JSONArray jsonArray2 = JSONArray.fromObject( list ); 
    System.out.println( jsonArray2 );
    }
    }

    posted @ 2012-08-15 14:04 yuhaibo736 閱讀(4684) | 評論 (2)編輯 收藏

      1.將Image圖像文件存入到數據庫中 我們知道數據庫里的Image類型的數據是"二進制數據",因此必須將圖像文件轉換成字節數組才能存入數據庫中。

      //根據文件名(完全路徑)

      public byte[] SetImageToByteArray(string fileName)

      { FileStream fs = new FileStream(fileName, FileMode.Open);

      int streamLength = (int)fs.Length; byte[] image = new byte[streamLength];

      fs.Read(image, 0, streamLength);

      fs.Close();

      return image; }

      //另外,在ASP.NET中通過FileUpload控件得到的圖像文件可以通過以下方法

      public byte[]

      SetImageToByteArray(FileUpload FileUpload1)

      { Stream stream = FileUpload1.PostedFile.InputStream;

      byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];

      stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);

      stream.Close();

      return photo;

      }

      2.從SQL Server數據庫讀取Image類型的數據,并轉換成bytes[]或Image圖像文件

      //要使用SqlDataReader要加載using System.Data.SqlClient命名空間

      //將數據庫中的Image類型轉換成byte[] public byte[] SetImage(SqlDataReader reader)

      { return (byte[])reader["Image"];//Image為數據庫中存放Image類型字段 }

      //將byte[]轉換成Image圖像類型 //加載以下命名空間using System.Drawing;/using System.IO;

      using System.Data.SqlClient;*/ public Image SetByteToImage(byte[] mybyte)

      { Image image; MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);

      image = Image.FromStream(mymemorystream);

      return image;

      }

    posted @ 2012-08-14 13:07 yuhaibo736 閱讀(317) | 評論 (0)編輯 收藏

    如果大家在ORACLE里面用慣了Sequence,要在SqlServer里實現Sequence,就會發現沒有現成的Sequence對象可以Create了。那應該怎么辦呢?

    當然這點小問題是難不倒我們程序員的,“max+1啊”,有人會說這樣的方式。是的,這種方式實現起來也比較簡單。當然你也許還會說,最Sql的方式是采用identity列,自增的方式去增加就ok了。但是這樣的列如果要實現“YYYYMMDD”+“部門編號(如ZX)”+Sequence值 (例如:20100707ZX000002)的格式就不行了。還是老老實實用存儲過程來取得一個Sequence值吧,使用起來也就隨心所欲了。

     

    網上常見的一個存儲過程為 為當前庫所有用到Sequence建一張表,譬如“AllSequence”,內含四個字段【名字,起點值,遞增值,當前值】,創建Sequence的時候就創建一條記錄,獲取Sequence的時候就從對應行的當前值按遞增值增加得到。

     

    在并發性請求不那么高的系統里,這種過程是沒有問題的。但是并發性請求一旦處于某個量級以后,這個過程常常會遇到問題。

     

    以下為一個改進方法,適合于高吞吐量的訪問請求,比如每秒數千次的請求:

    復制代碼
    -- 假定要給T_0101001創建一個Sequence

    -- 創建表SeqT_0101001
    create table SeqT_0101001(

          
    -- ID列為自增列
          SeqID int identity(1,1primary key,

          
    -- Sequence值
          SeqVal varchar(1)
    )

    -- 創建從SeqT_0101001表獲取最新Sequence值的存儲過程
    create procedure P_GetNewSeqVal_SeqT_0101001
    as
    begin
          
    -- 聲明新Sequence值變量
          declare @NewSeqValue int

          
    -- 設置插入、刪除操作后的條數顯示取消
          set NOCOUNT ON

          
    -- 插入新值到SeqT_0101001表
          insert into SeqT_0101001 (SeqVal) values ('a')   

          
    -- 設置新Sequence值為插入到SeqT_0101001表的標識列內的最后一個標識值  
          set @NewSeqValue = scope_identity()   

          --如果組合的Sequence值<999999999(大于的話數值會溢出),如:“YYYY”+5位的Sequence值(201019988),可以采用下面的方式來實現
          --set @NewSeqValue = Convert(char(4),Getdate(),112) + right('00000'+CAST(scope_identity() AS varchar(5)),5)
          --這樣直接Print @NewSeqVal 就可以得到類似“201019988”的Sequence值

          
    -- 刪除SeqT_0101001表(不顯示被鎖行)
          delete from SeqT_0101001 WITH (READPAST)

    -- 返回新Sequence值
    return @NewSeqValue

    end

    --使用Sequence
    Declare @NewSeqVal int
    Exec @NewSeqVal =  P_GetNewSeqVal_SeqT_0101001
    Print @NewSeqVal
    Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)
    復制代碼

     


    要獲取剛才我們提到的 “20100707ZX000002”這種格式的話,下面這樣就可以了
    Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)



    缺點:不能直接在非存儲過程的select的語句中直接使用。

    信息來源:http://www.cnblogs.com/heekui/archive/2008/07/24/1250842.html

    posted @ 2012-08-06 14:48 yuhaibo736 閱讀(1111) | 評論 (0)編輯 收藏

    Mongo是沒有like查詢的方式的 
    要進行模糊匹配只能借助于正則表達式


    Java代碼:

         Mongo m=new Mongo();  

          DB db=m.getDB("UserDB");  

          DBCollection collection=db.getCollection("userCollection");  

           

          BasicDBObject cond=new BasicDBObject();          


          if(province!=""){  

             cond.put("province", province);

          }  

          if(area!=""){  

             cond.put("area", area);  

          }              

          if(keywords!=""){  

              Pattern pattern=Pattern.compile("^.*"+keywords+".*$");            

              cond.put("name", pattern);

          }  

     

          DBCursor returns=collection.find(cond);  

     

    還有一種是mongoDB 和Spring結合的 Spring-data的模式查詢  代碼如下 :

           public List<User> findUserTop9(String s) {  

                 mongoTemplate.setDatabaseName("UserDB");

     

                 mongoTemplate.setDefaultCollectionName("userColl");  

                 List<User> users = mongoTemplate.find(new Query(new Criteria(      "name").regex(".*?"+"張"+".*")).limit(9), User.class);  

                 return users;

            }  

    posted @ 2012-06-27 15:44 yuhaibo736 閱讀(10448) | 評論 (1)編輯 收藏

    CronTrigger配置格式:

    格式: [秒] [分] [小時] [日] [月] [周] [年]

     序號 說明
     是否必填  允許填寫的值 允許的通配符
     1  秒  是  0-59    , - * /
     2  分  是  0-59
      , - * /
     3 小時  是  0-23   , - * /
     4  日  是  1-31   , - * ? / L W
     5  月  是  1-12 or JAN-DEC   , - * /
     6  周  是  1-7 or SUN-SAT   , - * ? / L #
     7  年  否  empty 或 1970-2099  , - * /


    通配符說明:
    * 表示所有值. 例如:在分的字段上設置 "*",表示每一分鐘都會觸發。
    ? 表示不指定值。使用的場景為不需要關心當前設置這個字段的值。例如:要在每月的10號觸發一個操作,但不關心是周幾,所以需要周位置的那個字段設置為"?" 具體設置為 0 0 0 10 * ?
    - 表示區間。例如 在小時上設置 "10-12",表示 10,11,12點都會觸發。
    , 表示指定多個值,例如在周字段上設置 "MON,WED,FRI" 表示周一,周三和周五觸發
    / 用于遞增觸發。如在秒上面設置"5/15" 表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每月1號開始,每隔三天觸發一次。
    L 表示最后的意思。在日字段設置上,表示當月的最后一天(依據當前月份,如果是二月還會依據是否是潤年[leap]), 在周字段上表示星期六,相當于"7"或"SAT"。如果在"L"前加上數字,則表示該數據的最后一個。例如在周字段上設置"6L"這樣的格式,則表示“本 月最后一個星期五"
    W 表示離指定日期的最近那個工作日(周一至周五). 例如在日字段上設置"15W",表示離每月15號最近的那個工作日觸發。如果15號正好是周六,則找最近的周五(14號)觸發, 如果15號是周未,則找最近的下周一(16號)觸發.如果15號正好在工作日(周一至周五),則就在該天觸發。如果指定格式為 "1W",它則表示每月1號往后最近的工作日觸發。如果1號正是周六,則將在3號下周一觸發。(注,"W"前只能設置具體的數字,不允許區間"-").

    小提示

    'L'和 'W'可以一組合使用。如果在日字段上設置"LW",則表示在本月的最后一個工作日觸發(一般指發工資

    # 序號(表示每月的第幾個周幾),例如在周字段上設置"6#3"表示在每月的第三個周六.注意如果指定"#5",正好第五周沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)

    小提示

    周字段的設置,若使用英文字母是不區分大小寫的 MON 與mon相同.


           
    常用示例:
     

    0 0 12 * * ? 每天12點觸發
    0 15 10 ? * * 每天10點15分觸發
    0 15 10 * * ? 每天10點15分觸發
    0 15 10 * * ? * 每天10點15分觸發
    0 15 10 * * ? 2005 2005年每天10點15分觸發
    0 * 14 * * ? 每天下午的 2點到2點59分每分觸發
    0 0/5 14 * * ? 每天下午的 2點到2點59分(整點開始,每隔5分觸發)
    0 0/5 14,18 * * ? 每天下午的 2點到2點59分(整點開始,每隔5分觸發)
    每天下午的 18點到18點59分(整點開始,每隔5分觸發)
    0 0-5 14 * * ? 每天下午的 2點到2點05分每分觸發
    0 10,44 14 ? 3 WED 3月分每周三下午的 2點10分和2點44分觸發
    0 15 10 ? * MON-FRI 從周一到周五每天上午的10點15分觸發
    0 15 10 15 * ? 每月15號上午10點15分觸發
    0 15 10 L * ? 每月最后一天的10點15分觸發
    0 15 10 ? * 6L 每月最后一周的星期五的10點15分觸發
    0 15 10 ? * 6L 2002-2005 從2002年到2005年每月最后一周的星期五的10點15分觸發
    0 15 10 ? * 6#3 每月的第三周的星期五開始觸發
    0 0 12 1/5 * ? 每月的第一個中午開始每隔5天觸發一次
    0 11 11 11 11 ? 每年的11月11號 11點11分觸發(光棍節)

    posted @ 2012-06-04 17:22 yuhaibo736 閱讀(190) | 評論 (0)編輯 收藏

    1、下載Quartz java包copy到WEB-INF/lib下
    2、先寫一個抽象類繼承QuartzJobBean
    package org.yhb.task;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;

    /**
     *
     * @author yuhb create on 2012-6-4
     *
     */
    public abstract class AbstractTask extends QuartzJobBean {
        protected final Log log = LogFactory.getLog(this.getClass());
        protected void executeInternal(JobExecutionContext context)
                throws JobExecutionException {
            this.execute();
        }
        protected abstract void execute();
    }

    然后寫一個類繼承上面的抽象類

    package org.yhb.task;

    public class MyTask extends AbstractTask {
        @Override
        protected void execute() {
            System.out.println("測試定時任務!!!");
        }
    }

    3、編寫beans-quarz.xml配置文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        <!-- ============================= Spring Quartz ================================ -->
        <bean id="myTask" class="org.springframework.scheduling.quartz.JobDetailBean">
            <property name="jobClass" value="org.yhb.task.MyTask" />
            <property name="jobDataAsMap">
                <map>
                    <entry key="timeout">
                        <value>60</value>
                    </entry>
                </map>
            </property>
        </bean>
        <!-- 每隔2分鐘觸發一次-->
        <bean id="myTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
            <property name="jobDetail">
                <ref bean="myTask" />
            </property>
            <property name="cronExpression">
                <value>0 0/2 * * * ?</value>
            </property>
        </bean>
        <!-- ########  總調配中心 ########## -->    
        <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref local="myTaskTrigger" />
                 </list>
            </property>
        </bean>    
    </beans>
    4、在web.xml中進行配置
         <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/beans-quarz.xml</param-value>
        </context-param>
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>

    完成上面四項后,啟動服務器就執行定時任務了。

    posted @ 2012-06-04 16:25 yuhaibo736 閱讀(1477) | 評論 (0)編輯 收藏

    1.下載安裝:plsqldev
        注意:不要安裝在默認的C:\Program Files (x86)目錄下,否則會報錯,原因是不能解析這個帶()的路徑
    2.下載安轉Oracle32位客戶端
        下載Oracle客戶端軟件:instantclient-basic-win32-11.1.0.7.0.zip  http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html
    3.配置客戶端
    1).解壓instantclient-basic-win32-11.1.0.7.0.zip后的instantclient_11_2文件放到到D:\oracle_client(具體放那個盤里,自己決定)下,在instantclient_11_2目錄下新建network文件,在network目錄下建admin文件,在admin文件下建tnsnames.ora這個文件:
    bd22 =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = orcl)
        )
      )
               
    2)啟動PL/SQL Developer ,點擊取消不要登錄,在Tools\Perferences 下的Connection 配置Oracle_Home和OCI Library,如下:
    OracleHome:D:\oracle_client\instantclient_11_2
    OCI library: D:\oracle_client\instantclient_11_2\oci.dll

    3)啟動PL/SQL Developer,登陸DB

    posted @ 2012-05-31 13:11 yuhaibo736 閱讀(15674) | 評論 (1)編輯 收藏


    MyEclipse9.0與其他版本不一樣:


    1.首先下載svn的zip包:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240


     
    我的是:site-1.6.18.zip


    2.將下載的包解壓,*.xml全部不要,只保留plugins和features兩個文件夾


    3.在任意位置建立文件夾,命名隨意,只要符合規范,將上面的兩個文件夾拷貝到剛才所建立的文件路徑下,我在E盤下建立如下路徑:E:\plugins\svn,plugins和features兩個文件夾放在svn下


    4.建立一個java程序:


    import java.io.File; 
    import java.util.ArrayList; 
    import java.util.List; 

    /**
    * MyEclipse9 插件配置代碼生成器
    *
    *
    */

    public class PluginConfigCreator 

        public PluginConfigCreator()

        public void print(String path) 
            List<String> list = getFileList(path); 
            if (list == null)
                return; 
            } 

            int length = list.size(); 
            for (int i = 0; i < length; i++)
                String result = ""; 
                String thePath = getFormatPath(getString(list.get(i))); 
                File file = new File(thePath); 
                if (file.isDirectory())
                    String fileName = file.getName(); 
                    if (fileName.indexOf("_") < 0)
                        print(thePath); 
                        continue; 
                    } 
                    String[] filenames = fileName.split("_"); 
                    String filename1 = filenames[0]; 
                    String filename2 = filenames[1]; 
                    result = filename1 + "," + filename2 + ",file:/" + path + "\\"  + fileName + "\\,4,false"; 
                    System.out.println(result); 
                } else if (file.isFile()) 
                    String fileName = file.getName(); 
                    if (fileName.indexOf("_") < 0)
                        continue; 
                    } 
                    int last = fileName.lastIndexOf("_");// 最后一個下劃線的位置 
                    String filename1 = fileName.substring(0, last); 
                   String filename2 = fileName.substring(last + 1, fileName.length() - 4); 
                    result = filename1 + "," + filename2 + ",file:/" + path + "\\" + fileName + ",4,false"; 
                    System.out.println(result); 
                } 
            } 
        } 

        public List<String> getFileList(String path) 
            path = getFormatPath(path); 
            path = path + "/"; 
            File filePath = new File(path); 
            if (!filePath.isDirectory()) 
                return null; 
            } 
            String[] filelist = filePath.list(); 
            List<String> filelistFilter = new ArrayList<String>(); 
            for (int i = 0; i < filelist.length; i++) 
                String tempfilename = getFormatPath(path + filelist[i]); 
                filelistFilter.add(tempfilename); 
            } 
            return filelistFilter; 
        } 

        public String getString(Object object) 
            if (object == null) 
                return ""; 
            } 
            return String.valueOf(object); 
        } 

        public String getFormatPath(String path) 
            path = path.replaceAll("\\\\", "/"); 
            path = path.replaceAll("http://", "/"); 
            return path; 
        } 

        public static void main(String[] args) 
            /*你的插件的安裝目錄*/
                String plugin = "E:\\plugins\\svn";   //這里的目錄路徑要注意
            new PluginConfigCreator().print(plugin); 
        } 
    }


    運行該程序,將生成的控制臺數據拷貝復制到bundles.info文件中,該文件的所在路徑是MyEclipse的安裝路徑,我采用的是默認路徑:


    D:\MyEclipse\MyEclipse-9.0M1\configuration\org.eclipse.equinox.simpleconfigurator


    最后重啟MyEclipse就可以使用SVN了

    posted @ 2012-05-30 13:23 yuhaibo736 閱讀(2119) | 評論 (2)編輯 收藏

    jQuery.ajax({
           url: 'getAssessmentStaffEvaluation.html',
           type: 'post',
           data: 'userId=' + userid + '&startDate=' + startDate + '&endDate=' + endDate,
           dataType:'json',
           success: function(returnObj){
            $("#countTd").text("服務客戶次數:" + returnObj.customerService + "    閱讀報告篇數:" + returnObj.reportReadLog +"    撰寫產品篇數:" + returnObj.htreport + "    完成任務情況:" + returnObj.task + "    工作申請情況:" + returnObj.applyTask);
           }
          });

    public ModelAndView getAssessmentStaffEvaluationHandler(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException, ParseException {

      String userId = Utils.trim(request.getParameter("userId"));
      String startDate = Utils.trim(request.getParameter("startDate"));
      String endDate = Utils.trim(request.getParameter("endDate"));
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Map param = new HashMap();
      param.put("inputid", userId);
      param.put("beginDate", sdf.parse(startDate));
      param.put("endDate", sdf.parse(endDate));
      Response response1 = customerServiceService.getCustomerServiceCount(param);
      Integer count1 = response1.getReturnInt();

      Calendar c = Calendar.getInstance();
      c.setTime(sdf.parse(endDate));
      c.add(Calendar.DATE, 1);
      Map param1 = new HashMap();
      param1.put("userid", userId);
      param1.put("beginDate", sdf.parse(startDate));
      param1.put("endDate", c.getTime());
      Response response2 = reportReadLogService.getReportReadLogCount(param1);
      Integer count2 = (Integer) response2.getReturnObject();

      Response response3 = htreportService.getHtreportCount(param1);
      Integer count3 = (Integer) response3.getReturnObject();

      Map param2 = new HashMap();
      param2.put("createId", userId);
      param2.put("flag", 1);
      param2.put("startTime", sdf.parse(startDate));
      param2.put("endTime", c.getTime());
      Response response4 = taskService.getTaskCount(param2);
      Integer count4 = (Integer) response4.getReturnObject();

      Map param3 = new HashMap();
      param3.put("createId", userId);
      param3.put("beginDate", sdf.parse(startDate));
      param3.put("endDate", c.getTime());
      Response response5 = applyTaskService.getApplyTaskCount(param3);
      Integer count5 = (Integer) response5.getReturnObject();

      response.setContentType("text/json");
      PrintWriter out = response.getWriter();
      out.println("{\"customerService\":\"" + count1 + "\", \"reportReadLog\":\"" + count2 + "\", \"htreport\":\""
              + count3 + "\", \"task\":\"" + count4 + "\", \"applyTask\":\"" + count5 + "\"}");
      out.flush();
      out.close();

      return null;
     }

    posted @ 2012-04-18 16:36 yuhaibo736 閱讀(2285) | 評論 (2)編輯 收藏

    最主要的是設置font
    
    柱狀圖(CategoryPlot):
        CategoryPlot plot=chart.getCategoryPlot();//獲取圖表區域對象
       CategoryAxis domainAxis=plot.getDomainAxis();
        //水平底部列表
        domainAxis.setLabelFont(new Font("黑體",Font.BOLD,14));
        //水平底部標題
        domainAxis.setTickLabelFont(new Font("宋體",Font.BOLD,12));
        //垂直標題
        ValueAxis rangeAxis=plot.getRangeAxis();//獲取柱狀
        rangeAxis.setLabelFont(new Font("黑體",Font.BOLD,15));
         chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 15));
    餅圖(PiePlot):
         JFreeChart chart = ChartFactory.createPieChart3D("IT行業職業分布圖", dataset, true, false, false);
        chart.getTitle().setFont(new Font("黑體",Font.BOLD,20));//設置標題字體
        PiePlot piePlot= (PiePlot) chart.getPlot();//獲取圖表區域對象
        piePlot.setLabelFont(new Font("黑體",Font.BOLD,10));
        chart.getLegend().setItemFont(new Font("黑體",Font.BOLD,10));
    時序圖(TimeSeries)  
       XYPlot plot = (XYPlot) chart.getPlot();
        //縱軸字體
        plot.getRangeAxis().setLabelFont(new Font("宋體", Font.BOLD, 15));
        //橫軸框里的標題字體
        chart.getLegend().setItemFont(new Font("宋體", Font.ITALIC, 15));
        //橫軸列表字體
        plot.getDomainAxis().setTickLabelFont(new Font("新宋體", 1, 15));
        //橫軸小標題字體
        plot.getDomainAxis().setLabelFont(new Font("新宋體", 1, 12));
    折線圖
    chart.getTitle().setFont(new Font("宋體", Font.BOLD, 15));
       chart.getLegend().setItemFont(new Font("黑體", Font.BOLD, 15));
       CategoryAxis domainAxis = plot.getDomainAxis();   
       /*------設置X軸坐標上的文字-----------*/ 
       domainAxis.setTickLabelFont(new Font("黑體", Font.PLAIN, 11));   
       /*------設置X軸的標題文字------------*/ 
       domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));   
       NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();   
       /*------設置Y軸坐標上的文字-----------*/ 
       numberaxis.setTickLabelFont(new Font("黑體", Font.PLAIN, 12));   
        
       /*------設置Y軸的標題文字------------*/ 
       numberaxis.setLabelFont(new Font("黑體", Font.PLAIN, 12)) 

    posted @ 2012-04-16 14:55 yuhaibo736 閱讀(1151) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 久久精品国产亚洲AV果冻传媒| 亚洲情侣偷拍精品| 日韩亚洲Av人人夜夜澡人人爽 | 亚洲综合一区二区| 久久A级毛片免费观看| 亚洲日本香蕉视频| 国产成人免费网站| 亚洲成a人片在线观看天堂无码| 夫妻免费无码V看片| 亚洲av午夜电影在线观看| 日韩亚洲国产二区| 在线观看黄片免费入口不卡| 国产成A人亚洲精V品无码性色 | 久久精品国产亚洲AV高清热| 亚欧在线精品免费观看一区| 亚洲免费视频网址| 日本免费人成黄页在线观看视频| 在线观看国产一区亚洲bd| 亚洲日韩人妻第一页| 成人性做爰aaa片免费看| 亚洲成无码人在线观看| 好大好硬好爽免费视频| 男人和女人高潮免费网站 | 亚洲一级特黄大片无码毛片| 成人电影在线免费观看| 亚洲成电影在线观看青青| 日韩a级毛片免费观看| 一区二区三区免费看| 亚洲一本综合久久| 色视频色露露永久免费观看| 日本免费精品一区二区三区| 亚洲福利在线观看| 狠狠久久永久免费观看| aa毛片免费全部播放完整| 亚洲国产精品美女| 免费va在线观看| 亚洲日本在线免费观看| 黄色免费网站在线看| 久久久亚洲欧洲日产国码二区 | 永久免费无码网站在线观看| 97在线免费视频|