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

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

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

    春風博客

    春天里,百花香...

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    #

    分頁技術及其實現

         摘要: 本文就分頁的理由,分頁的方式和MySql,Oracle中兩種不同的分頁技術進行了一些闡述,比較淺顯。  閱讀全文

    posted @ 2008-09-13 19:20 sitinspring 閱讀(10306) | 評論 (2)編輯 收藏

    Web頁面表單域驗證方式在Struts1.3.8中的使用

         摘要: 此文是“Web頁面表單域驗證方式的改進”的續篇。 示例頁面:登錄頁面 <%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"...  閱讀全文

    posted @ 2008-09-05 21:52 sitinspring 閱讀(1223) | 評論 (0)編輯 收藏

    使用模板方法模式簡化控制層類(Action)的設計

         摘要: 在基于Model2的應用中,控制層的類總會包含對業務層諸類的調用,業務層諸類不可避免的要產生各種異常,如果統一到控制層進行處理的話會導致代碼變得龐大臃腫還有不少重復,這種的例子在Web應用中的Servlet和Action諸類中并不少見。

    如果我們使用模板方法模式(Template Method Pattern)將業務處理和異常處理分開,能有效簡化控制層諸類的代碼,借用這種模式,我們可以把固定的異常處理代碼放在基類中,而讓子類來實現具體的業務,如果執行業務過程中出現異常如數據庫無法連接,用戶找不到等異常后,直接將異常拋出讓基類來處理,這樣做成功的把業務處理和異常處理分開到了子類和基類兩種類中,涉及具體業務處理的子類代碼得到了很大的簡化,更方便閱讀,修改和管理。

    有點疑惑的是,現在還不確定這樣做會有什么消極印象,如安全性或結構方面的,大家要是覺得有問題請不吝賜教。  閱讀全文

    posted @ 2008-09-01 11:51 sitinspring 閱讀(2207) | 評論 (8)編輯 收藏

    Spring的ID增長器使用示例(MySql數據庫)

         摘要: 一般來說涉及數據庫的應用中,表的主鍵有兩種生成方案,一種是專門定義一個主鍵表,在其中放置一個自增長的字段為其它表提供主鍵;另一種是使用Oracle的sequence。這兩種方案都有一定麻煩,Spring為此專門提供了一個ID增長器以簡化具體步驟,下文就是它的相關使用方法的,使用的數據庫是MySql5.

    歸納
    使用Spring的自增長ID生成器完成以下三步即可:
    1)配置自增長id生成器,它需要一個數據源的支持。
    2)根據配置將自增長id生成器注入DAO各類中。
    3)使用nextStringValue,nextIntValue,nextLongValue方法得到ID。  閱讀全文

    posted @ 2008-09-01 11:30 sitinspring 閱讀(4436) | 評論 (1)編輯 收藏

    某大型招聘會Java職位相關技術名詞統計





    posted @ 2008-08-11 21:44 sitinspring 閱讀(687) | 評論 (1)編輯 收藏

    log4j在桌面程序和Web程序中的配置

    注意:本文說到的log4j版本為1.2.15,使用的配置文件是屬性文件(properties),如果這些與您的環境不符則請快速離開,以免耽誤你的寶貴時間。

     

    一.log4j在桌面程序中的配置

    這個相對簡單了,它的步驟就這樣兩步:

    1)將log4j-1.2.15.jar引入到工程的lib目錄中.
    2)確保配置文件log4j.properties在程序的代碼目錄(如src目錄,cfg目錄)中,它編譯后應該位于類路徑classes中.

     

    log4j.properties示例(可以拷貝使用):

    1. log4j.rootLogger=debug, stdout, R
    2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    4. # Pattern to output the caller's file name and line number.
    5. log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n
    6. log4j.appender.R=org.apache.log4j.RollingFileAppender
    7. log4j.appender.R.File=輸出log文件.log
    8. log4j.appender.R.MaxFileSize=1000KB
    9. # Keep one backup file
    10. log4j.appender.R.MaxBackupIndex=1
    11. log4j.appender.R.layout=org.apache.log4j.PatternLayout
    12. log4j.appender.R.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

    要對這個文件進行修改的話,基本上改兩個地方就行了。

    一個是輸出文件名稱,一個是輸出等級設置。

    1) 輸出文件名稱:
    log4j.appender.R.File=輸出log文件.log

     

    2) 輸出等級:
    log4j.rootLogger=debug, stdout, R
    Debug說明只要是logger.debug以上的都記錄

     

    配置到這里,就結束了。下面請看如何在程序中使用log4j。

     

    二.log4j的使用

    1) 首先,那個類要用到log4j記錄日志,就應該為類添加一個靜態的成員變量loogger,示例如下:

    1. public class Main{
    2.  private static Logger logger = Logger.getLogger(Main.class);
    3.  public static void main(String[] args){
    4.   logger.info("成員管理程序啟動");
    5.   new MemberMngCtrl();  
    6.  }
    7. }

    2) 其次,你就可以使用logger.debug ,logger.info, logger.warn, logger.error, logger.fatal等函數(記錄等級依次提高)來記錄日志內容了,確實是很簡單方便的。
     

    三.log4j在Web工程中的配置

    與桌面程序一樣的是,properties文件也需要能被編譯到classes(WEB-INF/classes/)中,建議將屬性文件放在特定的目錄下并設置為源碼目錄,另外放在WEB-INF\src下也不錯。

    這一步比前面稍多的是需要配置一個初始化log4j的initServlet,就是在一開始就啟動的Servlet,代碼如下:

    1. public class Log4jInit extends HttpServlet {
    2.     private static final long serialVersionUID = -4499302208753939187L;
    3.     static Logger logger = Logger.getLogger(Log4jInit.class);
    4.      public void init(ServletConfig config) throws ServletException {
    5.          String prefix = config.getServletContext().getRealPath("/");
    6.          String file = config.getInitParameter("log4j");
    7.          String filePath = prefix + file;
    8.          Properties props = new Properties();
    9.          
    10.          try {
    11.              FileInputStream istream = new FileInputStream(filePath);
    12.              props.load(istream);
    13.              istream.close();
    14.              String logFile = prefix + props.getProperty("log4j.appender.R.File");//設置路徑
    15.              props.setProperty("log4j.appender.R.File",logFile);
    16.              
    17.              // 裝入log4j配置信息
    18.              PropertyConfigurator.configure(props);
    19.          } catch (IOException e) {
    20.              System.out.println("Could not read configuration file [" + filePath + "].");
    21.              System.out.println("Ignoring configuration file [" + filePath + "].");
    22.              return;
    23.          }
    24.      }
    25. }

    然后,在Web.xml中配置一下,讓它在一開始啟動就可以了。

    1.     <!-- InitServlet -->
    2.     <servlet>
    3.          <servlet-name>log4j-init</servlet-name>
    4.          <servlet-class>
    5.             com.sitinspring.action.Log4jInit
    6.          </servlet-class>
    7.          <init-param>
    8.            <param-name>log4j</param-name>
    9.            <param-value>WEB-INF/classes/log4j.properties</param-value>
    10.          </init-param>
    11.          <load-on-startup>1</load-on-startup>
    12.     </servlet>

    全文完。

    posted @ 2008-08-08 12:57 sitinspring 閱讀(1340) | 評論 (1)編輯 收藏

    應用程序的層次淺談

    一般來說, 在創建一個應用程序之前,首先要決定這個應用程序的體系結構。應用程序體系結構(Application Architecture)由應用程序開發者設計,它指定了在各種各樣的終端系統上,應用程序是如何組織在一起的。為了降低設計難度,大部分程序都以層(稱為layer或level)的方式組織在一起,每一層都建立在它的下層基礎上,使用下層提供的服務,下層對上層隱藏了許多服務實現的細節。這種方法幾乎應用于整個計算機科學領域,也可以稱為信息隱藏,數據類型抽象,數據封裝,面向對象編程等。

     

    分層即是對類進行一些規劃,以流程中的類的用途和所處環節劃分,把程序中將要用到的各個類分別歸納到各個包(目錄)中。分層是對系統進行細分的第一步,它旨在將系統按具體功能和用途分解為相對獨立的各個部分.如果說細分是將把難以解決的大問題分解成了各個容易解決的小問題的話,分層則是把解決同類小問題的類歸納到一起,這樣程序的結構更加清晰,程序的可讀性和可維護性越好,也更容易得到重用。

    從大的尺度來講,一個程序可粗略的分成三個層次:

    界面層(UI layer),這是用戶能直接感受到的,包含顯示和控制兩部分;

    業務層(Business layer),其中包含了業務邏輯和業務處理;

    持久層(Persistence layer),它用來將數據存儲和將數據從持久層提取出來。

    界面層(UI layer)中,包含兩個層次:視圖層View和控制層Controller.

    視圖層View是用戶查看數據,輸入和向用戶輸出結果的一層,這一層是用戶唯一能夠感受軟件功能的窗口,它或者由Swing組件搭建(桌面系統或C/S系統中),或者由JSP搭建(B/S系統),它負責讓用戶輸入數據和將控制層返回的數據顯示給客戶。其中返回的數據一般是領域對象的變體或者直接就是領域對象或其集合。在Web程序中jsp基本就屬于這一層的。

    控制層Controller是用來將界面和業務層聯系在一起的,在系統的各層次中,應該和View層打交道一般只有Controller層, Controller層是View層和系統其它層次進行交互的中介者, View層越過中介者直接調用其它層次的行為應該盡量避免。

    一般來說,為了減少耦合,提高程序的可維護性,我們一般采用MVC架構模式將業務層,視圖層和控制層分開。

     

    業務層(Business layer)中包含領域層 Domain,服務層 Service和實用工具層Util。

    業務層是整個系統的關鍵部分,它主要由領域模型和業務邏輯組成,領域模型定義系統內相互作用的各個實體,業務邏輯則定義了領域模型所能執行的不同操作, 領域層的各個類代表了領域模型,而服務層的各個類代表了業務邏輯. 領域層和服務層是起點,其它各層都從這里起步.

    領域層 Domain:領域對象是對現實世界業務處理對象的抽象和歸納,領域層中的類基本上都是實體(Entity)類,如員工管理系統中的Employee,學籍管理系統中的Student,借貸管理系統中的Contract等,系統的業務處理中用到那些實體對象,領域層中一般就應該有和這個實體對象相對應的實體類。這些類在剛開始設計時可能只有一些屬性和對應的getter/setter方法,以后會不斷的加入新的內容(主要是方法),如果有必要的話,可以為這些領域對象設計一些上層的抽象類或者接口,借助于泛型,反射,控制反轉等高級技能能在一定程度上簡化程序的編寫過程。此外,領域層是程序的核心內容,因為其他層次都在很大程度上依賴Domain層的設計,如果這一層設計不夠完善會使以后的工作步履蹣跚.

    服務層Service:這一層就是為領域對象提供服務用的,領域對象一般不直接和表現層,持久層直接打交道而是通過服務層進行代理.服務層是UI層到持久層的中間通道,它處于上通界面下通持久層的中間環節,這個特性是使的這一層決定了軟件功能的多少。
    一般來說,UI層向服務層傳入的是用戶輸入的一些參數,服務層進行驗證,重組后向下層DAO傳輸;而服務層從Dao層收到的是領域對象或其集合,而它向UI層返回的是領域對象或者其集合的變體或者直接是領域對象或者其集合本身。Service諸類的實例在桌面程序和CS程序中一般作為Model的一個私有成員,而在Web程序中常常要用到時再創建出來。除領域層外,其余各層是在圍繞它而設計.

    實用工具層Util:這一層相對簡單,它包含了各種工具類,類中包含的主要是靜態函數和靜態成員變量,這些類對共通的函數,變量進行了歸納,它旨在消除重復代碼,降低主體代碼的復雜程度.一般此層中類的復用程度很高.值得通過項目積累.

     

    持久層(Persistence layer)是直接與持久介質打交道的層次,持久介質可以是常見的關系型數據庫,文件甚至Web Service,它一般包含兩個部分。

    數據存儲對象層(DAO層),sql語句一般寫在這層中, 然后由它調用;DAO層是最低的一層,與持久介質直接打交道,它包含具體文件的位置,數據庫連接等;

    另一個部分就是持久介質,通常是關系型數據庫
    Dao層中各個類一般作為Service的私有成員,供Service調用。

     

    下圖是各層間的位置關系圖:

     

    如何從需求中分析出諸個層次中的類呢,我們在大尺度上可以按照下面的步驟進行:

    Domain the first:首先從業務流和業務規則中歸納總結出領域對象.
    Service the second:為領域對象設計服務類。
    Persistence the third:持久層的負責領域對象持久化到持久介質以及逆過程,它的設計在領域層和服務層之后,比較典型的持久層設計有數據庫表的設計和ER圖(實體關系圖)的繪制.
    View the last:最后設計表現層,表現層受領域層和服務層制約, 容易變化且易于修改,通常放在最后實現.

     

    具體步驟如下

    1.理解,分析,鉆研需求,徹底了解你的客戶想要什么,需要你做些什么.
    2.將大系統分解成一個個子系統,細分出各個層次,搞清楚各層的任務。
    3.分析業務邏輯,歸納出業務流.
    4.從業務流和業務規則中總結出領域對象.
    5.為領域層實現服務層.
    6.以Domain層和Service層為核心設計表現層和持久層,直到形成完整的程序.
    7.加入實用層消除重復代碼,梳理結構和簡化流程,.
    8.限制跨層的調用.

    posted @ 2008-08-08 12:57 sitinspring 閱讀(1663) | 評論 (3)編輯 收藏

    從模板方法模式到反射再到Spring的IoC

    軟件開發過程中,唯一不變的就是變化。這是一句老生常談,也就是說軟件開發中永恒的主題就是變化。當你把代碼都寫好了,測試也完成了,準備交付的時候客戶忽然要求你在指定時間做出變化,這種情況在外包行業中很常見;而對一些銀行金融項目,邊調研邊開發邊測試屢見不鮮;對于一些Web項目,從來就只有永遠的Beta版,改來改去的事更是家常便飯。對此,程序員一定要求清晰的認識,抱怨只能是嘴上痛快,不解決實際問題。真要解決實際問題,非要動一番腦筋不可,如果合理使用了設計模式,反射或是Spring的IoC,便能變修改噩夢為一次有趣的智慧之旅。

     

    首先我們看原始要求:客戶要求將一批雇員名單存入到CSV和XML兩種文件中去,以后還有可能增加別的文件格式,比如PDF,XLS等,雖然這是下一期的內容,但這一期應該考慮到變化,客戶要求擴展性一定要好。

    沒問題,有了設計模式響應變化不難。這時我們可以用到模板方法模式:

    定義一個操作中的算法的骨架,而將一些步驟延遲到子類中

     

    先請看骨架抽象類:

    1. public abstract class FileMaker {
    2.   /**
    3.    * 雇員集合
    4.    */
    5.   private List<Employee> employees;
    6.   /**
    7.    * 生成雇員列表文件,公開接口,供外界調用
    8.    * 定義成final是不想讓子類改寫,因為調用的步驟在父類中就可以確定,子類只需實現makeFile函數
    9.    * @param employees
    10.    * @param fileName
    11.    */
    12.   public final void makeFile(List<Employee> employees,String fileName){
    13.     setEmployees(employees);
    14.     makeFile(fileName);
    15.   }
    16.   
    17.   /**
    18.    * 生成具體的雇員列表文件,此函數留待子類實現
    19.    * @param fileName
    20.    */
    21.   protected abstract void makeFile(String fileName);  
    22.   
    23.   public final void setEmployees(List<Employee> employees) {
    24.     this.employees = employees;
    25.   }
    26.   public List<Employee> getEmployees() {
    27.     return employees;
    28.   }   
    29. }

    很好,固定的函數和步驟都在抽象基類中寫定了,再看兩個具體實現類,它們要實現的就是makeFile函數而已。

    1. public class CSVFileMaker extends FileMaker{
    2.   protected void makeFile(String fileName){
    3.     try {
    4.           BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
    5.           
    6.           for(Employee emp:getEmployees()){
    7.             String line="";
    8.             line+=emp.getName()+",";
    9.             line+=(emp.isMale()?"男":"女")+",";
    10.             line+=emp.getAge()+",";
    11.             
    12.             out.write(line+"\r\n");
    13.           }
    14.           
    15.           out.close();
    16.       } catch (Exception e) {
    17.         e.printStackTrace();
    18.       }
    19.   }
    20. }
    1. public class XMLFileMaker extends FileMaker{
    2.   protected void makeFile(String fileName){
    3.     try {
    4.       Document document = DocumentHelper.createDocument();
    5.             Element root = document.addElement("employees");
    6.             
    7.             for(Employee emp:getEmployees()){
    8.             Element empElm=root.addElement("employee");
    9.             
    10.             Element nameElm=empElm.addElement("name");
    11.             nameElm.setText(emp.getName());
    12.             
    13.             Element sexElm=empElm.addElement("sex");
    14.             sexElm.setText(emp.isMale()?"男":"女");
    15.             
    16.             Element ageElm=empElm.addElement("age");
    17.             ageElm.setText(String.valueOf(emp.getAge()));
    18.           }
    19.             
    20.             OutputFormat format = OutputFormat.createPrettyPrint();
    21.             format.setEncoding("GBK");    // 指定XML編碼        
    22.             XMLWriter writer = new XMLWriter(new FileWriter(fileName),format);
    23.             
    24.             writer.write(document);
    25.             writer.close();
    26.       } catch (Exception e) {
    27.         e.printStackTrace();
    28.       }
    29.   }
    30. }

    這樣昨完以后感覺很好,因為我們成功的把變化和不變分離開來,不變的部分放在了抽象基類中,而容易變化的部分放在了兩個具體的子類中,這樣如果再增加一種新文件格式,從抽象基類再擴展出一個子類即可。很好,這樣就不怕變化了。客戶對此也沒有異議。

     

    調用示例如下:

    1. List<Employee> emps=new ArrayList<Employee>();
    2. emps.add(new Employee("Andy",true,21));
    3. emps.add(new Employee("Bill",false,23));
    4. emps.add(new Employee("Cindy",true,25));
    5. emps.add(new Employee("Douglas",false,28));
    6. FileMaker fileMaker=new CSVFileMaker();
    7. fileMaker.makeFile(emps, "1.csv");
    8. fileMaker=new XMLFileMaker();
    9. fileMaker.makeFile(emps, "2.xml");

    客戶看到了我們的調用的例子,覺得應該更靈活一些,他說存成各種不同的文件是通過點擊按鈕來實現的,如果每個按鈕的事件處理函數都要生成具體子類豈不是太死板了嗎?這樣做每個文件下載按鈕的事件處理代碼不是都不一樣?

     

    有點道理,如今理解到這一層的客戶實在是不多見了。不過很容易滿足他的需求,我們可以引入反射的方法:

    1. public static void main(String[] args) {
    2.   List<Employee> emps=new ArrayList<Employee>();
    3.   emps.add(new Employee("Andy",true,21));
    4.   emps.add(new Employee("Bill",false,23));
    5.   emps.add(new Employee("Cindy",true,25));
    6.   emps.add(new Employee("Douglas",false,28));
    7.   
    8.   callByReflect("csv",emps,"1.csv");
    9.   callByReflect("xml",emps,"2.xml");
    10. }
    11. public static void callByReflect(String type,List<Employee> emps,String fileName){
    12.   try{
    13.     Class cls=Class.forName("com.heyang."+type.toUpperCase()+"FileMaker");
    14.     FileMaker fileMaker=(FileMaker)cls.newInstance();
    15.     fileMaker.makeFile(emps, fileName);
    16.   }
    17.   catch(Exception ex){
    18.     ex.printStackTrace();
    19.   }
    20. }

    因為按鈕上的文字和類名是有關的,如下載CSV的按鈕上就有CSV的文字,這可以通過正則表達式取道,再組合一下不就是類名了嗎?csv到com.heyang.CSVFileMaker,xml到com.heyang.XMLFileMaker,其實變化就是三個字母而已。如果增加按鈕,取出按鈕中的三個字母再調用callByReflect函數即可,這個過程簡直可以固化。

     

    客戶看到反射方法以后很是滿意,沒有意見了。待客戶走后,項目經理把你拉到一邊,說:

    “你剛才的方法不錯,確實很強,但看得懂反射并能靈活掌握的人水平要夠一年經驗才行,維護的活讓一年經驗的人去干太可惜了,最好改改,最好達到讓新手也能掌握并修改的程度。”。

     

    沒辦法,領導總有領導的考慮,他這么說也很合理,成本問題我可以不考慮,但如果把程序搞得復雜貌似NB,能讓一些學藝不精的人產生云山霧罩的感覺,有時還能被人尊稱一聲“大俠”,但誰也不比誰傻多少,這聲大俠不是白叫的,但是出了問題或是有了變化別人還是要找你,到頭來還是給自己添亂,這些都是義務勞動,何苦來呢?還是應該改得容易些,讓大家都能修改,我可不愿意半夜三更被人叫起來問問題。

     

    用Spring的IoC就可以解決問題,寫一個新類并配置到XML文件中對新手來說問題不大,這下可以讓領導放心了,自己就更放心了。

     

    IoC方案代碼如下:

    1. public class Main {
    2.   public static void main(String[] args) {
    3.     List<Employee> emps=new ArrayList<Employee>();
    4.     emps.add(new Employee("Andy",true,21));
    5.     emps.add(new Employee("Bill",false,23));
    6.     emps.add(new Employee("Cindy",true,25));
    7.     emps.add(new Employee("Douglas",false,28));
    8.     
    9.     callByIoc("csv",emps,"1.csv");
    10.     callByIoc("xml",emps,"2.xml");
    11.   }
    12.   
    13.   public static void callByIoc(String type,List<Employee> emps,String fileName){
    14.     try{
    15.       ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
    16.       FileMaker fileMaker=(FileMaker)ctx.getBean(type);
    17.       fileMaker.makeFile(emps, fileName);
    18.     }
    19.     catch(Exception ex){
    20.       ex.printStackTrace();
    21.     }
    22.   }
    23. }

    Bean。xml文件內容很簡單吧:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    3. <beans>
    4. <bean id="csv" class="com.heyang.CSVFileMaker"/>
    5. <bean id="xml" class="com.heyang.XMLFileMaker"/>
    6. </beans> 

    好了。到這里問題就徹底結束了,終于滿足了客戶和上級的要求,可以回家睡個好覺了,不用擔心別人打攪了。

     

    態度改變一切,變化來了人總是要多做一些,心理當然是不愿意的,但抱怨或是消極抵制都不是解決問題之道;如果把它看做一個挑戰的契機,凡事多思考一些,不但能解決問題,自己也會有所提高,這就是積極的態度帶來的好處。

    posted @ 2008-08-08 12:55 sitinspring 閱讀(1043) | 評論 (0)編輯 收藏

    使用Spring提供的MailSender異步發送文本郵件

         摘要: 在工程中經常有發送郵件的任務,如果使用JavaMail來發送郵件,用到的代碼較多,過程和細節也相對復雜,而使用Spring的MailSender能相對簡單方便些,這樣使程序員能更快捷的完成郵件發送任務。下面請看示例代碼:   注意在執行代碼前,請確認已經將activation.jar,commons-logging-1.0.4.jar,mail.jar和spring.jar載入工程。...  閱讀全文

    posted @ 2008-08-08 12:55 sitinspring 閱讀(3857) | 評論 (0)編輯 收藏

    JavaMail郵件發送實用類

    在Web開發中,文本郵件發送的任務比較常見,我們可以利用它進行一些客戶通知和異常通知,文本郵件發送一般用到JavaMail API,下面是一個我有時用到的郵件發送實用工具類,把其中一些參數修改一下就能為你所用。

     

    注意:在執行代碼前,請把mail.jaractivation.jar載入工程。 

     

    代碼如下:

    1. package com.heyang;
    2. import java.util.Date;
    3. import java.util.Properties;
    4. import javax.mail.Address;
    5. import javax.mail.Message;
    6. import javax.mail.Session;
    7. import javax.mail.Transport;
    8. import javax.mail.internet.InternetAddress;
    9. import javax.mail.internet.MimeMessage;
    10. /**
    11.  * 常規JavaMail 郵件發送實用類
    12.  * @author: 何楊(heyang78@gmail.com)
    13.  * @date: 2008-8-6-下午02:43:22
    14.  */
    15. public final class MailUtil {
    16.     // 郵件發送者地址
    17.     private static final String SenderEmailAddr = "XXXXXXX@163.com";
    18.     // 郵件發送者郵箱用戶
    19.     private static final String SMTPUserName = "XXXX";
    20.     
    21.     // 郵件發送者郵箱密碼
    22.     private static final String SMTPPassword = "XXXXXXX";
    23.     // 郵件發送者郵箱SMTP服務器
    24.     private static final String SMTPServerName = "smtp.163.com";
    25.     // 傳輸類型
    26.     private static final String TransportType = "smtp";
    27.     // 屬性
    28.     private static Properties props;
    29.     /**
    30.      * 私有構造函數,防止外界新建本實用類的實例,因為直接使用MailUtil.sendMail發送郵件即可
    31.      *
    32.      */
    33.     private MailUtil() {
    34.     }
    35.     /**
    36.      * 靜態構造器
    37.      */
    38.     static {
    39.         MailUtil.props = new Properties();
    40.         // 存儲發送郵件服務器的信息
    41.         MailUtil.props.put("mail.smtp.host", MailUtil.SMTPServerName);
    42.         // 同時通過驗證
    43.         MailUtil.props.put("mail.smtp.auth""true");
    44.     }
    45.     /**
    46.      * 發送郵件
    47.      * @param emailAddr:收信人郵件地址
    48.      * @param mailTitle:郵件標題
    49.      * @param mailConcept:郵件內容
    50.      */
    51.     public static void sendMail(String emailAddr, String mailTitle,
    52.             String mailConcept) {
    53.         // 根據屬性新建一個郵件會話,null參數是一種Authenticator(驗證程序) 對象
    54.         Session s = Session.getInstance(MailUtil.props, null);
    55.         // 設置調試標志,要查看經過郵件服務器郵件命令,可以用該方法
    56.         s.setDebug(false);
    57.         
    58.         // 由郵件會話新建一個消息對象
    59.         Message message = new MimeMessage(s);
    60.         try {
    61.             // 設置發件人
    62.             Address from = new InternetAddress(MailUtil.SenderEmailAddr);
    63.             message.setFrom(from);
    64.             // 設置收件人
    65.             Address to = new InternetAddress(emailAddr);
    66.             message.setRecipient(Message.RecipientType.TO, to);
    67.             // 設置主題
    68.             message.setSubject(mailTitle);
    69.             // 設置信件內容
    70.             message.setText(mailConcept);
    71.             // 設置發信時間
    72.             message.setSentDate(new Date());
    73.             // 存儲郵件信息
    74.             message.saveChanges();
    75.             Transport transport = s.getTransport(MailUtil.TransportType);
    76.             // 要填入你的用戶名和密碼;
    77.             transport.connect(MailUtil.SMTPServerName, MailUtil.SMTPUserName,
    78.                     MailUtil.SMTPPassword);
    79.             // 發送郵件,其中第二個參數是所有已設好的收件人地址
    80.             transport.sendMessage(message, message.getAllRecipients());
    81.             transport.close();
    82.             System.out.println("發送郵件,郵件地址:" + emailAddr + " 標題:" + mailTitle
    83.                     + " 內容:" + mailConcept + "成功!");
    84.         } catch (Exception e) {
    85.             System.out.println(e.getMessage());
    86.             System.out.println("發送郵件,郵件地址:" + emailAddr + " 標題:" + mailTitle
    87.                     + " 內容:" + mailConcept + "失敗! 原因是" + e.getMessage());
    88.         }
    89.     }
    90.     /**
    91.      * 測試郵件發送情況
    92.      * @param args
    93.      */
    94.     public static void main(String[] args){
    95.         MailUtil.sendMail("XXXXXX@gmail.com""title""concept");
    96.     }
    97. }

    posted @ 2008-08-08 12:54 sitinspring 閱讀(2504) | 評論 (5)編輯 收藏

    僅列出標題
    共13頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    sitinspring(http://www.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 国产精品二区三区免费播放心| 亚洲伦乱亚洲h视频| 亚洲精品综合久久| 久久久久亚洲AV无码专区体验| 亚洲偷偷自拍高清| 国产乱子伦精品免费视频| 亚欧在线精品免费观看一区| 四虎永久免费地址在线观看| 日韩亚洲Av人人夜夜澡人人爽| 蜜臀亚洲AV无码精品国产午夜.| 久草视频在线免费看| 日韩一区二区在线免费观看 | 在线播放高清国语自产拍免费| 亚洲黄片手机免费观看| 亚洲国产日韩在线人成下载 | 91青青青国产在观免费影视| 成人免费视频国产| 亚洲精品福利网站| 黄色网址免费在线观看| 韩国免费三片在线视频| 亚洲精品自产拍在线观看动漫| 男女污污污超污视频免费在线看| 亚州免费一级毛片| 国产亚洲一区二区三区在线观看 | 亚洲一卡2卡三卡4卡无卡下载 | 成人性生交大片免费看午夜a| 亚洲国产精品特色大片观看完整版| 亚洲精品又粗又大又爽A片| 无码A级毛片免费视频内谢| 亚洲精品无码专区久久同性男| 99久久国产亚洲综合精品| 久久久久久国产精品免费免费男同 | 亚洲免费综合色在线视频| 国产亚洲精品观看91在线| 爱情岛论坛免费视频| 毛片免费全部免费观看| 亚洲自偷自偷精品| 中文字幕乱码免费看电影| 亚洲av午夜精品一区二区三区| 一本色道久久综合亚洲精品蜜桃冫| 免费无码成人AV在线播放不卡|