溫馨提示:您的每一次轉載,體現了我寫此文的意義!!!煩請您在轉載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          雪山飛鵠

          溫馨提示:您的每一次轉載,體現了我寫此文的意義!!!煩請您在轉載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks

          #

                  之前了,在blog上發了FusionCharts的一些demo,后來好多朋友加Q發email給我,要求發一些資料,作為學習參考。現將資料提供出來。有需要的可以直接下載。大家有事發mail,不要加Q了,加Q有可能我不能及時回復你。
                  點我下載FusionCharts Free中文開發指南.pdf
          posted @ 2010-07-26 08:39 雪山飛鵠 閱讀(1714) | 評論 (2)編輯 收藏

                  近期在項目中使用到了大量的報表開發,需要將html頁面中的表格內容導出到pdf word excel和圖片,前三者都比較好實現。唯獨后者生成圖片使用ImageIo操作時生成的圖片有點慘不忍睹。經過大量google后發現,pdfbox這個組件不錯,可以將pdf文件輕松生成圖片。這不問題解決了,但在使用過程中不然,受到了很多致命性的打擊。pdfbox在處理中文pdf的時候就會表現的比較脆弱點。但對英文版的pdf導出圖片,那是杠杠的。盡管這樣,還是記錄一下,畢竟這方面的資料很少。我幾乎搜遍了整個google,baidu才搜集到那么一點點資料。這里跟大家分享下。
                  所依賴的JAR:
                  commons-logging-1.1.1.jar
                  fontbox-1.2.1.jar
                  pdfbox-1.2.1.jar
                  示例代碼:
          /*
           * Licensed to the Apache Software Foundation (ASF) under one or more
           * contributor license agreements.  See the NOTICE file distributed with
           * this work for additional information regarding copyright ownership.
           * The ASF licenses this file to You under the Apache License, Version 2.0
           * (the "License"); you may not use this file except in compliance with
           * the License.  You may obtain a copy of the License at
           *
           *      
          http://www.apache.org/licenses/LICENSE-2.0
           *
           * Unless required by applicable law or agreed to in writing, software
           * distributed under the License is distributed on an "AS IS" BASIS,
           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
           * See the License for the specific language governing permissions and
           * limitations under the License.
           
          */

          package com.future.pdfbox.image;

          import java.awt.image.BufferedImage;
          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.util.Iterator;
          import java.util.List;

          import javax.imageio.IIOImage;
          import javax.imageio.ImageIO;
          import javax.imageio.ImageWriter;
          import javax.imageio.stream.ImageOutputStream;

          import org.apache.pdfbox.pdmodel.PDDocument;
          import org.apache.pdfbox.pdmodel.PDPage;

          public class ExtractImages 
          {
              
          public static void main(String[] args) throws IOException 
                  PDDocument doc 
          = PDDocument.load("F:\\1.pdf");
                  
          int pageCount = doc.getPageCount(); 
                  System.out.println(pageCount); 
                  List pages 
          = doc.getDocumentCatalog().getAllPages(); 
                  
          for(int i=0;i<pages.size();i++){
                      PDPage page 
          = (PDPage)pages.get(i); 
                      BufferedImage image 
          = page.convertToImage(); 
                      Iterator iter 
          = ImageIO.getImageWritersBySuffix("jpg"); 
                      ImageWriter writer 
          = (ImageWriter)iter.next(); 
                      File outFile 
          = new File("C:/"+i+".jpg"); 
                      FileOutputStream out 
          = new FileOutputStream(outFile); 
                      ImageOutputStream outImage 
          = ImageIO.createImageOutputStream(out); 
                      writer.setOutput(outImage); 
                      writer.write(
          new IIOImage(image,null,null)); 
                  }

                  doc.close(); 
                  System.out.println(
          "over"); 
              }


          }


                  
          posted @ 2010-07-23 08:46 雪山飛鵠 閱讀(11372) | 評論 (7)編輯 收藏

                  之前,在項目中一直用jfreechart,感覺jfreechart做的挺不錯的.唯一遺憾的是文檔收費.再者圖片乃靜態的不能滿足客戶端與圖片進行動態交互.為了滿足客戶的需求,所以不得不尋求更好的報表解決方案.本人在項目中收藏了以下幾種報表.總的來說效果還是很滿意的.上手操作也很簡單,這里貼出效果圖.借mop中最流行的一句話來說就是:無圖無真相.呵呵廢話不多說,直接上圖.在最后我會針對每種圖傳上demo.供大家快速上手,本來實地項目中的效果遠比貼出來的圖漂亮逼真,但為了數據安全性,本人就針對每種圖單獨做了小demo.大家可以參考下.呵呵
              演示視頻:  本打算錄制成swf格式的直接傳到blog上,結果發現blogjava不支持插入flash,汗,由于文件格式是swf,所以大家可以使用瀏覽器或者adobe的flash player觀看 文件大小 8M多
              演示視頻下載
              第一組圖:
              FusionCharts  
              官方主頁:http://www.fusioncharts.com/
              文檔:http://www.fusioncharts.com/docs/
              來自國外的flash圖,效果極其棒,極力推薦大家使用,遺憾的是官方給的免費版會在生成的圖片上帶上超鏈接.可喜的是絕頂聰明的國人破解了它,在隨后會為大家提供破解過的flash文件.廢話不多說,上圖,無圖無真相
           
                  注:在以上每個報表左上角大家都會看到一個google的logo,其實我要表達的意思是在此處可以設置一個公司或者其他的logo什么的.希望沒有誤導大家
                  第二組圖:
                  一款來自小日本小巧的js報表組件,俺不通日語,所以也不曉得他叫什么名字.所以廢話不多數直接上圖
                  
                   第三組圖:
                  構建與jquery之上的jscharts,感覺很不錯,雖然沒以上圖花哨,但js能做到這般田地已經不錯了
           
           
                      附件下載:
                      fusionchart       破解文件:fusionchart破解文件

                      來自日本的報表組件

                      jscharts 

                      演示視頻下載
          posted @ 2010-07-21 21:34 雪山飛鵠 閱讀(2713) | 評論 (1)編輯 收藏

           

          1@Entity(name="EntityName")

          必須,name為可選,對應數據庫中一的個表

           

          2@Table(name="",catalog="",schema="")

          可選,通常和@Entity配合使用,只能標注在實體的class定義處,表示實體對應的數據庫表的信息

          name:可選,表示表的名稱.默認地,表名和實體名稱一致,只有在不一致的情況下才需要指定表名

          catalog:可選,表示Catalog名稱,默認為Catalog("").

          schema:可選,表示Schema名稱,默認為Schema("").

           

          3@id

          必須

          @id定義了映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射為主鍵.置于getXxxx().

           

          4@GeneratedValue(strategy=GenerationType,generator="")

          可選

          strategy:表示主鍵生成策略,AUTO,INDENTITY,SEQUENCE TABLE 4,分別表示讓ORM框架自動選擇,

          根據數據庫的Identity字段生成,根據數據庫表的Sequence字段生成,以有根據一個額外的表生成主鍵,默認為AUTO

          generator:表示主鍵生成器的名稱,這個屬性通常和ORM框架相關,例如,Hibernate可以指定uuid等主鍵生成方式.

          示例:

              @Id

              @GeneratedValues(strategy=StrategyType.SEQUENCE)

              public int getPk() {

                 return pk;

              }

           

          5@Basic(fetch=FetchType,optional=true)

          可選

          @Basic表示一個簡單的屬性到數據庫表的字段的映射,對于沒有任何標注的getXxxx()方法,默認即為@Basic

          fetch: 表示該屬性的讀取策略,EAGERLAZY兩種,分別表示主支抓取和延遲加載,默認為EAGER.

          optional:表示該屬性是否允許為null,默認為true

          示例:

              @Basic(optional=false)

              public String getAddress() {

                 return address;

              }

           

          6@Column

          可選

          @Column描述了數據庫表中該字段的詳細定義,這對于根據JPA注解生成數據庫表結構的工具非常有作用.

          name:表示數據庫表中該字段的名稱,默認情形屬性名稱一致

          nullable:表示該字段是否允許為null,默認為true

          unique:表示該字段是否是唯一標識,默認為false

          length:表示該字段的大小,僅對String類型的字段有效

          insertable:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中,默認為true

          updateable:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認為true.對于一經創建就不可以更改的字段,該屬性非常有用,如對于birthday字段.

          columnDefinition:表示該字段在數據庫中的實際類型.通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對于Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是TIMESTAMP.此外,String的默認映射類型為VARCHAR,如果要將String類型映射到特定數據庫的BLOBTEXT字段類型,該屬性非常有用.

          示例:

              @Column(name="BIRTH",nullable="false",columnDefinition="DATE")

              public String getBithday() {

                 return birthday;

              }

           

          7@Transient

          可選

          @Transient表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略該屬性.

          如果一個屬性并非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic

          示例:

              //根據birth計算出age屬性

              @Transient

              public int getAge() {

                 return getYear(new Date()) - getYear(birth);

              }

           

          8@ManyToOne(fetch=FetchType,cascade=CascadeType)

          可選

          @ManyToOne表示一個多對一的映射,該注解標注的屬性通常是數據庫表的外鍵

          optional:是否允許該字段為null,該屬性應該根據數據庫表的外鍵約束來確定,默認為true

          fetch:表示抓取策略,默認為FetchType.EAGER

          cascade:表示默認的級聯操作策略,可以指定為ALL,PERSIST,MERGE,REFRESHREMOVE中的若干組合,默認為無級聯操作

          targetEntity:表示該屬性關聯的實體類型.該屬性通常不必指定,ORM框架根據屬性類型自動判斷targetEntity.

          示例:

              //訂單Order和用戶User是一個ManyToOne的關系

              //Order類中定義

              @ManyToOne()

              @JoinColumn(name="USER")

              public User getUser() {

                 return user;

              }

           

          9@JoinColumn

          可選

          @JoinColumn@Column類似,介量描述的不是一個簡單字段,而一一個關聯字段,例如.描述一個@ManyToOne的字段.

          name:該字段的名稱.由于@JoinColumn描述的是一個關聯字段,ManyToOne,則默認的名稱由其關聯的實體決定.

          例如,實體Order有一個user屬性來關聯實體User,Orderuser屬性為一個外鍵,

          其默認的名稱為實體User的名稱+下劃線+實體User的主鍵名稱

          示例:

              @ManyToOne

           

          10@OneToMany(fetch=FetchType,cascade=CascadeType)

          可選

          @OneToMany描述一個一對多的關聯,該屬性應該為集體類型,在數據庫中并沒有實際字段.

          fetch:表示抓取策略,默認為FetchType.LAZY,因為關聯的多個對象通常不必從數據庫預先讀取到內存

          cascade:表示級聯操作策略,對于OneToMany類型的關聯非常重要,通常該實體更新或刪除時,其關聯的實體也應當被更新或刪除

          例如:實體UserOrderOneToMany的關系,則實體User被刪除時,其關聯的實體Order也應該被全部刪除

          示例:

              @OneTyMany(cascade=ALL)

              public List getOrders() {

                 return orders;

              }

           

          11@OneToOne(fetch=FetchType,cascade=CascadeType)

          可選

          @OneToOne描述一個一對一的關聯

          fetch:表示抓取策略,默認為FetchType.LAZY

          cascade:表示級聯操作策略

          示例:

              @OneToOne(fetch=FetchType.LAZY)

              public Blog getBlog() {

                 return blog;

              }

           

          12@ManyToMany

          可選

          @ManyToMany 描述一個多對多的關聯.多對多關聯上是兩個一對多關聯,但是在ManyToMany描述中,中間表是由ORM框架自動處理

          targetEntity:表示多對多關聯的另一個實體類的全名,例如:package.Book.class

          mappedBy:表示多對多關聯的另一個實體類的對應集合屬性名稱

          示例:

              User實體表示用戶,Book實體表示書籍,為了描述用戶收藏的書籍,可以在UserBook之間建立ManyToMany關聯

              @Entity

              public class User {

                 private List books;

                 @ManyToMany(targetEntity=package.Book.class)

                 public List getBooks() {

                     return books;

                 }

                 public void setBooks(List books) {

                     this.books=books;

                 }

              }

             

              @Entity

              public class Book {

                 private List users;

                 @ManyToMany(targetEntity=package.Users.class, mappedBy="books")

                 public List getUsers() {

                     return users;

                 }

                 public void setUsers(List users) {

                     this.users=users;

                 }

              }

          兩個實體間相互關聯的屬性必須標記為@ManyToMany,并相互指定targetEntity屬性,

          需要注意的是,有且只有一個實體的@ManyToMany注解需要指定mappedBy屬性,指向targetEntity的集合屬性名稱

          利用ORM工具自動生成的表除了UserBook表外,還自動生成了一個User_Book,用于實現多對多關聯

           

          13@MappedSuperclass

          可選

          @MappedSuperclass可以將超類的JPA注解傳遞給子類,使子類能夠繼承超類的JPA注解

          示例:

              @MappedSuperclass

              public class Employee() {

                 ....

              }

             

              @Entity

              public class Engineer extends Employee {

                 .....

              }

              @Entity

              public class Manager extends Employee {

                 .....

              }

           

          14@Embedded

          可選

          @Embedded將幾個字段組合成一個類,并作為整個Entity的一個屬性.

          例如User包括id,name,city,street,zip屬性.

          我們希望city,street,zip屬性映射為Address對象.這樣,User對象將具有id,nameaddress這三個屬性.

          Address對象必須定義為@Embededable

          示例:

              @Embeddable

              public class Address {city,street,zip}

              @Entity

              public class User {

                 @Embedded

                 public Address getAddress() {

                     ..........

                 }

              }

           

          Hibernate驗證注解

          注解

           適用類型

           說明

           示例

           

          @Pattern

           String

           通過正則表達式來驗證字符串

           @attern(regex=”[a-z]{6}”)

           

          @Length

           String

           驗證字符串的長度

           @length(min=3,max=20)

           

          @Email

           String

           驗證一個Email地址是否有效

           @email

           

          @Range

           Long

           驗證一個整型是否在有效的范圍內

           @Range(min=0,max=100)

           

          @Min

           Long

           驗證一個整型必須不小于指定值

           @Min(value=10)

           

          @Max

           Long

           驗證一個整型必須不大于指定值

           @Max(value=20)

           

          @Size

           集合或數組

           集合或數組的大小是否在指定范圍內

           @Size(min=1,max=255)

           

          以上每個注解都可能性有一個message屬性,用于在驗證失敗后向用戶返回的消息,還可以三個屬性上使用多個注解

          posted @ 2010-07-20 10:13 雪山飛鵠 閱讀(18097) | 評論 (2)編輯 收藏

                      環境:myeclipse8.5+flex4+blazeds
                      描述:flex4中httpservice與服務器端交互的值傳遞問題
                      方式一:通過<s:request/>標簽進行交互,在該標簽內部以要傳遞的參數名作為該標簽內的子標簽,值作為內容進行傳遞,服務端接受數據采用request.getParmeter("參數名")獲取數據.
                      示例代碼:
                      flex中的代碼:
          <!--定義HttpService發送請求-->
                  
          <s:HTTPService id="service" 
                                 url
          ="http://localhost:8080/testhttpservice/testHttpServiceServlet" 
                                 useProxy
          ="false" 
                                 fault
          ="service_faultHandler(event)" 
                                 result
          ="service_resultHandler(event)">
                      
          <!--第一種傳值方式-->
                      
                      
          <s:request >
                          
          <!--參數名稱作標簽,中間填充參數值-->
                          
          <username>{txtusername.text}</username>
                          
          <password>{txtpassword.text}</password>
                      
          </s:request>
                      
                  
          </s:HTTPService>
                  后臺接受參數的代碼:
                  //獲取flex傳遞的參數 username password
                  String username=request.getParameter("username");
                  
          //get方式處理亂碼
                  
          //username=new String(username.getBytes("ISO-8859-1"),"utf-8");
                  String password=request.getParameter("password");
                  
          //password=new String(password.getBytes("ISO-8859-1"),"utf-8");
                  方式二:第二種傳值方式通過send()方法傳值send方法中傳遞參數 ,服務端接受數據采用request.getParmeter("參數名")獲取數據.
                  示例代碼:
                          //第二種傳值方式 通過send()方法傳值 send方法中傳遞參數 
                          //定義一object對象
                          var val:Object=new Object();
                          //分別將文本框username,password的值傳遞到后臺
                          //object對象.參數名=值   傳值操作
                          val.username=txtusername.text;
                          val.password=txtpassword.text;
                          service.send(val);
                  貼出完整的代碼:
                  服務器端:
          package com.servlet;

          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.ArrayList;
          import java.util.List;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          /**
           * 功能描述:flex httpservice與java交互參數傳遞探討<br>
           * 
          @author sxyx2008<br>
           * @date 2010-07-19
           *
           
          */

          @SuppressWarnings(
          "serial")
          public class TestHttpServiceServlet extends HttpServlet {
              
              @Override
              
          protected void service(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException {
                  
          //處理post方式亂碼
                  request.setCharacterEncoding("utf-8");
                  
          //設置瀏覽器輸出字符編碼
                  response.setCharacterEncoding("utf-8");
                  PrintWriter writer
          =response.getWriter();
                  
          //獲取flex傳遞的參數 username password
                  String username=request.getParameter("username");
                  
          //get方式處理亂碼
                  
                  
          //username=new String(username.getBytes("ISO-8859-1"),"utf-8");
                  String password=request.getParameter("password");
                  
          //password=new String(password.getBytes("ISO-8859-1"),"utf-8");
                  
                  
          //構建一個list存放一些數據用來模擬用戶是否存在這一功能
                  List<String> list=new ArrayList<String>();
                  list.add(
          "張三");
                  list.add(
          "李四");
                  list.add(
          "王五");
                  list.add(
          "曹操");
                  list.add(
          "孫權");
                  list.add(
          "劉備");
                  
          //檢驗用戶
                  if(list.contains(username)){
                      writer.print(
          "存在:"+username+"客戶端傳遞的密碼是:"+password);
                  }
          else{
                      writer.print(
          "找不到:"+username+"客戶端傳遞的密碼是:"+password);
                  }

                  
              }

          }

                  flex代碼:
          <?xml version="1.0" encoding="utf-8"?>
          <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                         xmlns:s
          ="library://ns.adobe.com/flex/spark" 
                         xmlns:mx
          ="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
              
          <fx:Script>
                  
          <![CDATA[
                      import mx.controls.Alert;
                      import mx.rpc.events.FaultEvent;
                      import mx.rpc.events.ResultEvent;

                      //調用失敗
                      protected function service_faultHandler(event:FaultEvent):void
                      {
                          Alert.show("失敗了:"+event.message,"提示");
                      }

                      //調用成功
                      protected function service_resultHandler(event:ResultEvent):void
                      {
                          Alert.show("成功了:"+event.result as String,"提示");
                      }
              
                      //調用
                      protected function button1_clickHandler(event:MouseEvent):void
                      {
                          //第一種傳值方式                
                          //service.send();
                          
                          //第二種傳值方式 通過send()方法傳值 send方法中傳遞參數 
                          //定義一object對象
                          var val:Object=new Object();
                          //分別將文本框username,password的值傳遞到后臺
                          //object對象.參數名=值   傳值操作
                          val.username=txtusername.text;
                          val.password=txtpassword.text;
                          service.send(val);
                      }

                  
          ]]>
              
          </fx:Script>
              
          <fx:Declarations>
                  
          <!-- 將非可視元素(例如服務、值對象)放在此處 -->
                  
          <!--定義HttpService發送請求-->
                  
          <s:HTTPService id="service" 
                                 url
          ="http://localhost:8080/testhttpservice/testHttpServiceServlet" 
                                 useProxy
          ="false" 
                                 fault
          ="service_faultHandler(event)" 
                                 result
          ="service_resultHandler(event)">
                      
          <!--第一種傳值方式-->
                      
                      
          <s:request >
                          
          <!--參數名稱作標簽,中間填充參數值-->
                          
          <username>{txtusername.text}</username>
                          
          <password>{txtpassword.text}</password>
                      
          </s:request>
                      
                  
          </s:HTTPService>
                  
                  
              
          </fx:Declarations>
              
          <s:TextInput x="332" y="196" id="txtusername"/>
              
          <s:TextInput x="332" y="256" id="txtpassword" displayAsPassword="true"/>
              
          <s:Button x="357" y="311" label="發送" click="button1_clickHandler(event)"/>
              
          <s:Label x="290" y="206" text="用戶名:"/>
              
          <s:Label x="297" y="266" text="密碼:"/>
          </s:Application>
                  工程文件:
                  點我下載工程文件
          posted @ 2010-07-19 17:31 雪山飛鵠 閱讀(11489) | 評論 (10)編輯 收藏

               摘要:         flex4出來一段時間了,去年看了一段時間flex3,后來由于暫時沒有項目需求.所以flex遺忘了很多.這次使用flex4+myeclipse8.5錄制了一個視頻.以免時間長了遺忘.         軟件環境:window...  閱讀全文
          posted @ 2010-07-17 02:57 雪山飛鵠 閱讀(21252) | 評論 (90)編輯 收藏

                  各位大牛,小弟打算把自己寫的一些代碼提交到google code交給google提供的svn進行管理.下午折騰了一下午也沒通過svn提交上去.郁悶的很.目前google code好像只支持文件上傳,svn托管好像用不了.很郁悶,在公司折騰了一下午,還沒搞定,心里很不爽.晚上回家后接著整,咨詢了下群友,大家說需要翻墻,找了網上大名鼎鼎的"張生翻墻"還是未果.不知道大家的google code好著了么?知道的告訴俺一聲.先謝過了(目前我的問題是連不上SVN,但是可以通過文件上傳的方式上傳文件)
                  QQ:184675420
                  Email:sxyx2008@163.com
          posted @ 2010-07-15 23:19 雪山飛鵠 閱讀(2660) | 評論 (15)編輯 收藏

               摘要:         功能描述:平常在項目中使用xfire來寫webservice返回值大都為字符串,今天無意間查看了xfire的官方文檔,發現用xfire來編寫返回值為list的web服務也很簡單。但步驟稍微繁瑣一點。怕遺忘,特此記錄一番。       &nbs...  閱讀全文
          posted @ 2010-07-14 11:05 雪山飛鵠 閱讀(8978) | 評論 (4)編輯 收藏

                  需求描述:任何程序都會存在bug,雖然項目經過反復測試,已經上線運行了,但難免會遇到各種錯誤,在這里輕松配置log4j實現錯誤消息的email通知.
                  兩個文件:web.xml log4j.properties
                  web.xml
                  在web.xml中添加如下代碼

          <!-- 設置上下文參數 -->
              
          <context-param>
                  
          <!-- log4j配置文件位置 -->
                  
          <param-name>log4jConfigLocation</param-name>
                  
          <param-value>/WEB-INF/classes/log4j.properties</param-value>
              
          </context-param>
              
          <context-param>
                  
          <param-name>log4jRefreshInterval</param-name>
                  
          <param-value>6000</param-value>
              
          </context-param>
              
          <!-- log4j監聽器 -->
              
          <listener>
                  
          <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
              
          </listener>
                  log4j.properties
          ## ROOT
          log4j.rootLogger=INFO,CONSOLE,MAIL

          ## CONSOLE
          log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
          log4j.appender.Threshold=INFO
          log4j.appender.CONSOLE.Target=System.out
          log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
          #log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          log4j.appender.CONSOLE.layout.ConversionPattern=[\u8C03\u8BD5\u4FE1\u606F]%-5p %c %x - %m%n

          ## File
          log4j.appender.A_default=org.apache.log4j.RollingFileAppender
          log4j.appender.A_default.Threshold=INFO
          log4j.appender.A_default.File=e\:/logs/log4j.log
          log4j.appender.A_default.MaxFileSize=4000KB
          log4j.appender.A_default.MaxBackupIndex=10
          log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
          log4j.appender.A_default.layout.ConversionPattern=[\u8C03\u8BD5\u4FE1\u606F]%-5p %c %x - %m%n

          ## MAIL
          log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
          # 日志的錯誤級別
          log4j.appender.MAIL.Threshold=ERROR
          # 緩存文件大小,日志達到512K時發送Email
          log4j.appender.MAIL.BufferSize=10
          # 發送郵件的服務器
          log4j.appender.MAIL.SMTPHost=smtp.163.com
          # 郵件的標題
          log4j.appender.MAIL.Subject=\u6D4B\u8BD5log4j\u8F93\u51FA\u9519\u8BEF\u4FE1\u606F\u5230\u65E5\u5FD7
          # 用戶名
          log4j.appender.MAIL.SMTPUsername=你的用戶名
          # 密碼
          log4j.appender.MAIL.SMTPPassword=你的密碼
          # 發件人地址
          log4j.appender.MAIL.From=xxxxx@163.com
          # 日志郵件的接收者
          log4j.appender.MAIL.To=xxx@qq.com
          # 日志PatternLayout
          log4j.appender.MAIL.layout=com.quartz.demo.Loger4JHTMLLayOut
          # 日志的格式
          log4j.appender.MAIL.layout.ConversionPattern=[ErrorMessage] %d - %c -%-4r [%t] %-5p %c %x - %m%n

                  注:在以上log4j.properties文件中配置了自己的自定義layout,由于log4j默認采用的純文本方式.這樣不便于我們在郵件中查看,因此覆蓋它的layout,自定義屬于我們自己的layout
                  自定義類com.quartz.demo.Loger4JHTMLLayOut完成了該功能
          package com.quartz.demo;

          import org.apache.log4j.HTMLLayout;

          public class Loger4JHTMLLayOut extends HTMLLayout{
              
              @Override
              
          public String getContentType() {
                  
          return "text/html;charset=utf-8"
              }

          }

                  即:只需設置contentType為text/html即可
                  效果圖:

                      log4j.properties
          posted @ 2010-07-14 01:44 雪山飛鵠 閱讀(8425) | 評論 (2)編輯 收藏

                  功能描述:剛開始接觸Quartz,試著用Quartz整合spring實現每隔一分鐘發送一封郵件連續發送10次
                  核心jar:
                              郵件發送:commons-email-1.2.jar mail.jar(必須的)
                              quartz:quartz-all-1.8.3.jar quartz-all-1.8.3/lib/下所有jar
                              spring:spring-context-support.ajr(必須的)
                  只貼出核心代碼:
                  Email發送:使用apache commons-email跟mail
          package com.ssh.commonsemail;

          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;

          import javax.mail.internet.InternetAddress;

          import org.apache.commons.mail.SimpleEmail;

          /**
           * 功能描述:此代碼主要實現郵件發送功能
           * 
          @author coder
           *
           
          */

          public class SendSimplEmail {
              
              
              
          public static void sendMail()throws Exception{
                  List
          <InternetAddress> list=new ArrayList<InternetAddress>();
                  list.add(
          new InternetAddress("313698683@qq.com"));
                  list.add(
          new InternetAddress("184675420@qq.com"));
                  SimpleEmail email
          =new SimpleEmail();
                  email.setFrom(
          "184675420@163.com");
                  email.setCharset(
          "utf-8");
                  email.setSentDate(
          new Date());
                  email.setSubject(
          "測試Quartz");
                  email.setHostName(
          "smtp.163.com");
                  email.setAuthentication(
          "xxxx""xxxx");
                  email.setTo(list);
                  email.setContent(
          "<h1>Hello,把鳳姐許配給你,你看咋樣?</h1>""text/html;charset=utf-8");
                  email.send();
              }

              
              
          }

                  定義調度工作任務:繼承自org.springframework.scheduling.quartz.QuartzJobBean次類在spring-context-support.jar中
          package com.ssh.quantz;

          import org.quartz.JobExecutionContext;
          import org.quartz.JobExecutionException;
          import org.springframework.scheduling.quartz.QuartzJobBean;

          import com.ssh.commonsemail.SendSimplEmail;

          /**
           * 發送email任務
           * 
          @author coder
           *
           
          */

          public class SendEmailJob extends QuartzJobBean{
              
              @Override
              
          protected void executeInternal(JobExecutionContext context)
                      
          throws JobExecutionException {
                  
          try {
                      
          //調用郵件發送代碼
                      SendSimplEmail.sendMail();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }


              

          }

                  spring核心配置文件
          <!-- 定義調度工作任務 -->
              
          <bean id="quantzjobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
                  
          <property name="jobClass">
                      
          <!-- 實現了org.springframework.scheduling.quartz.QuartzJobBean的JobBean -->
                      
          <value>com.ssh.quantz.SendEmailJob</value>
                  
          </property>
                  
          <!-- 調用業務邏輯 -->
                  
          <!--  
                  <property name="jobDataAsMap">
                      <map>
                          <entry key="biz">
                              <ref bean="users"/>
                          </entry>
                      </map>
                  </property>
                  
          -->
              
          </bean>

              
          <!-- 觸發任務條件 -->
              
          <bean id="simpletriggerbean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
                  
          <property name="jobDetail" ref="quantzjobBean"></property>
                  
          <!-- 延遲一分鐘啟動 -->
                  
          <property name="startDelay">
                      
          <value>60000</value>
                  
          </property>
                  
          <!-- 每隔2分鐘調用一次 -->
                  
          <property name="repeatInterval">
                      
          <value>60000</value>
                  
          </property>
                  
          <!-- 執行10次 -->
                  
          <property name="repeatCount">
                      
          <value>10</value>
                  
          </property>
                  
              
          </bean>
              
              
          <!-- 啟動調度 -->
              
          <bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                  
          <property name="triggers">
                      
          <list>
                          
          <ref bean="simpletriggerbean"/>
                      
          </list>
                  
          </property>
              
          </bean>


                                  
          posted @ 2010-07-13 18:03 雪山飛鵠 閱讀(6243) | 評論 (2)編輯 收藏

          僅列出標題
          共22頁: First 上一頁 12 13 14 15 16 17 18 19 20 下一頁 Last 
          主站蜘蛛池模板: 香河县| 吉隆县| 连江县| 潞城市| 东方市| 茶陵县| 老河口市| 贡觉县| 中阳县| 元氏县| 昌乐县| 江源县| 西贡区| 德清县| 华坪县| 固安县| 曲沃县| 龙口市| 若尔盖县| 绥德县| 元氏县| 湘潭市| 边坝县| 梓潼县| 崇州市| 永胜县| 濉溪县| 三明市| 永宁县| 花垣县| 汕头市| 灯塔市| 乌海市| 内黄县| 仙游县| 汉川市| 高碑店市| 绥德县| 桓仁| 固阳县| 登封市|