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

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

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

    張慧的博客

    張慧的博客

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

    #

    順序隊列各種基本運算算法的實現

    順序隊列是較為普遍的一種隊列實現方式,采用環狀數組來存放隊列元素,并用兩個變量分別指向隊列的前端(front)和尾端(rear),往隊列中加進或取出元素時分別改變這兩個變量的計數(count)。
    隊列中用環狀數組存儲數據(合理利用空間、減少操作),通過基本的append()將元素加入隊列,serve()將元素移出隊列,先進入的先移出,retieve得到最先加入隊列的元素。此外在繼承的Extended_queue()中我增加了empty()和serve_and_retrieve()的功能。

    【實驗說明】

    我選擇的題目:課本中Programming Projects 3.3 P1
    問題描述:Write a function that will read one line of input from the terminal. The input is supposed to consist of two parts separated by a colon ':'. As its results, your function should produce a single character as follows:
    N   No colon on the line.
    L   The left part(before the colon) is longer than the right.
    R   The right part(after the colon) is longer than the left.
    D   The left and right parts have the same length but are different.
    S   The left and right are exactly the same.
    Examples:
    Use either a queue or an extended queue to keep track of the left part of the line while reading the right part.
    1.分析隊列要實現的基本功能以及繼承的類要拓展的功能從而確定基本成員函數——append(),serve(),retireve(),拓展隊列中:empty(),serve_and_retrieve(),確定隊列中以環形數組存儲數據從而確定成員函數——Queue_entry entry[],count(記錄隊列中數據數量)
    2.編寫隊列的頭文件及實現
    3.分析題目中結束程序并輸出幾種字母的條件,簡略畫出功能實現的流程圖,編寫程序。(具體思路見源代碼注釋)
    4.簡單測試程序的幾種情況,分析需要改進的地方

    【相關代碼】

    queue.h

    #ifndef QUEUE_H
    #define QUEUE_H

    const int maxqueue=10;
    enum Error_code {success,overflow,underflow};
    typedef 
    char Queue_entry ;

    class Queue{
    public:
        Queue();
        
    bool empty() const;
        Error_code append(
    const Queue_entry &item);
        Error_code serve();
        Error_code retrieve(Queue_entry 
    &item)const;
    protected:
        
    int count;
        
    int front,rear;
        Queue_entry entry[maxqueue];
    };

    class Extended_queue:public Queue{
    public:
        
    bool full()const;
        
    int size()const;
        
    void clear();
        Error_code serve_and_retrieve(Queue_entry 
    &item);
    };

    #endif

    #include"queue.h"

    Queue::Queue()
    {
        count
    =0;
        rear
    =maxqueue-1;
        front
    =0;
    }

    bool Queue::empty() const
    {
        
    return count==0;
    }

    Error_code Queue::append(
    const Queue_entry &item)
    {
        
    if(count>=maxqueue)return overflow;
        count
    ++;
        rear
    =((rear+1)==maxqueue)?0:(rear+1);
        entry[rear]
    =item;
        
    return success;
    }

    Error_code Queue::serve()
    {
        
    if(count<=0)return underflow;
        count
    --;
        front
    =((front+1)==maxqueue)?0:(front+1);
        
    return success;
    }

    Error_code Queue::retrieve(Queue_entry 
    &item) const
    {
        
    if(count<=0)return underflow;
        item
    =entry[front];
        
    return success;
    }
    bool Extended_queue::full() const{
        
    return count==maxqueue;
    }
    int Extended_queue::size()const{
        
    return count;
    }
    void Extended_queue::clear(){
        count
    =0;
        rear
    =front;
    }
    Error_code Extended_queue::serve_and_retrieve(Queue_entry 
    &item){
        
    if(count==0)return underflow;
        count
    --;
        item
    =entry[front];
        front
    =((front+1)==maxqueue)?0:(front+1);
        
    return success;
    }

    【過程記錄】

    實驗截圖:


    【結果分析】

    1.實驗中我以課本后面的練習題為例,實現并驗證了順序隊列的更種功能。
    2.隊列與棧一樣是在類中以數組存儲數據,但由于隊列先進先出的特點在實現存儲形式上與棧有一定的不同。因為如果與棧一樣對數據操作,隊列會無限向后擴大,而前面取出過數據的地方將不會再被利用,十分浪費,也很容易溢出。所以我們采用循環數組來存儲,這樣合理利用了資源。但在類的實現要要極為時刻考慮周全rear和front的各種可能,要判斷是不是循環到了前面,count在此時的功能也極為突出。
    3.書中的程序看似簡單,但實際判斷各種輸出情況的時候卻極難考慮周全。我首先做出了簡易的流程圖,然后才寫函數,具體分析及思路可見我源碼的注釋。另外本題還有另外一種實現思路:即將左右輸入分別存放在兩個隊列中,邊取去邊比較,那樣在邏輯上容易理解一些。但鑒于題目的要求,我還是用邊從左邊隊列中取出邊比較右邊輸入的方法。
    4.我在實驗中遇到的問題:
    (1)自己一開始在循環判斷用的是cin.get()=='\n'即遇到回車就停止輸入,但卻無法如料想中結束循環……最終采用cin>>a && waiting(用以標志‘:’的輸入)來作為循環終止的條件,這樣雖然可以運行,但用戶必須輸入Ctrl+‘Z’以結束輸入。看來自己對輸入流的理解與掌握還沒有到位。
    (2)另外在檢驗的時候,我發現輸入‘:’之前是否輸入回車情況是有區別的。如
    輸入“sam:sam”(無空格),結果為“R”
    輸入“sam : sam”(有空格),結構為“S”
    顯然后者是我希望得到的結果,我分析可能是前面情況‘:’被列入了right的判斷,從而使結構右邊比左邊長。還沒有想到如何改進。


    posted @ 2012-07-16 22:14 張慧 閱讀(1740) | 評論 (0)編輯 收藏

    (以oracle9i版本為例,本機必須安裝oralce9i的客戶端)

    第一步:orahome92-configuration and migration tools- net managers


    第二步:在“服務命名”中點“+


    第三步:編輯一個你的服務名,(不是對方的數據庫名)


    第四步:默認選擇TCP/IP


    第五步:主機名填入對方的機器IP地址,端口默認(不要改)


    第六步:服務名是對方的數據庫名(要問對方),連接類型默認(不要改)


    第七步:連接測試


    一般測試結果需要“更改登錄”


    更改登錄中,在用戶名和口令中,錄入對方數據庫的用戶名口令(你要訪問的庫)


    測試成功!點擊“關閉”

    點“完成”


    第八步:保存網絡配置


    在“E:\oracle\ora92\network\admin”中打開tnsnames.ora,可以看到配置情況:

    MORCL =

      (DESCRIPTION =

        (ADDRESS_LIST =

          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.34)(PORT = 1521))

        )

        (CONNECT_DATA =

          (SERVICE_NAME = orcl)

        )

      )

    第九步:到此,可以檢查配置是否正確,是否連接成功

    運行—輸入sqlplus,在“請輸入用戶名”中鍵入 數據庫連接方式


    第十步:連接成功,可以通過PLSQL等客戶端工具連接別人的數據庫了!

    posted @ 2012-07-16 22:12 張慧 閱讀(6166) | 評論 (0)編輯 收藏

    假如你要在linux下刪除大量文件,比如100萬、1000萬,像/var/spool/clientmqueue/的mail郵件, 

    像/usr/local/nginx/proxy_temp的nginx緩存等,那么rm -rf *可能就不好使了。 
    rsync提供了一些跟刪除相關的參數 
    rsync --help | grep delete 
         --del                   an alias for --delete-during 
         --delete                delete files that don't exist on the sending side 
         --delete-before         receiver deletes before transfer (default) 
         --delete-during         receiver deletes during transfer, not before 
         --delete-after          receiver deletes after transfer, not before 
         --delete-excluded       also delete excluded files on the receiving side 
         --ignore-errors         delete even if there are I/O errors 
         --max-delete=NUM        don't delete more than NUM files 

    其中--delete-before    接收者在傳輸之前進行刪除操作 
    可以用來清空目錄或文件,如下: 
    1、先建立一個空目錄 
    mkdir /data/blank 
    2、用rsync刪除目標目錄 
    rsync --delete-before -d /data/blank/ /var/spool/clientmqueue/ 
    這樣目標目錄很快就被清空了 

    又假如你有一些特別大的文件要刪除,比如nohup.out這樣的實時更新的文件,動輒都是幾十個G上百G的,也可 

    以用rsync來清空大文件,而且效率比較高 
    1、創建空文件 
    touch /data/blank.txt 
    2、用rsync清空文件 
    rsync -a --delete-before --progress --stats /root/blank.txt /root/nohup.out 
    building file list ... 
    1 file to consider 
    blank.txt 
               0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1) 

    Number of files: 1 
    Number of files transferred: 1 
    Total file size: 0 bytes 
    Total transferred file size: 0 bytes 
    Literal data: 0 bytes 
    Matched data: 0 bytes 
    File list size: 27 
    File list generation time: 0.006 seconds 
    File list transfer time: 0.000 seconds 
    Total bytes sent: 73 
    Total bytes received: 31 

    sent 73 bytes  received 31 bytes  208.00 bytes/sec 
    total size is 0  speedup is 0.00 


    tips: 
    當SRC和DEST文件性質不一致時將會報錯 
    當SRC和DEST性質都為文件【f】時,意思是清空文件內容而不是刪除文件 
    當SRC和DEST性質都為目錄【d】時,意思是刪除該目錄下的所有文件,使其變為空目錄 
    最重要的是,它的處理速度相當快,處理幾個G的文件也就是秒級的事 
    最核心的內容是:rsync實際上用的就是替換原理 
    posted @ 2012-07-12 22:26 張慧 閱讀(7580) | 評論 (0)編輯 收藏

    核心思想:加密和解密采用不同的密鑰 

    一般發送者和接收者擁有自己的公鑰和密鑰,公鑰是公開的,密鑰不公開。 

    保密機制:A向B發送消息時,首先用B的公鑰對消息進行加密,生成密文發送,B接收到密文后,用自己的密鑰進行解密,進而得到消息原文。因為B公鑰加密過的消息只有B的密鑰才能解密,所以實現了保密功能。 
    認證機制:A向B發送消息時,首先用自己的密鑰加密,B接收到密文后用A的公鑰解密,得到原文。因為只有A的公鑰才可解開A密鑰加密過的消息,所以可以確認解密后的原文必是來自A。 

    若要同時實現保密和認證機制,需要對消息進行兩次加密。  
    posted @ 2012-07-12 22:26 張慧 閱讀(1504) | 評論 (0)編輯 收藏


    為什么要拆分樣式文件?

    更易于查找樣式規則. 簡化維護,方便管理. 還可以針對某一頁面提供特定的樣式.

    為什么要添加橋接樣式?

    你可以隨時添加或移除樣式而不需要修改HTML 文檔.

     

    為什么要定義兩種媒體類型?

    NN4 不支持@import ,故識別不到橋接樣式.

     

    @import ‘header.css’;

    @import ‘content.css’;

    @import ‘footer.css’;

     

    @imports 如何工作?

    它將所有CSS 規則從一個文件導入到另外一個文件.@import 不能被老的

    瀏覽器所識別.

     

     

    對于 大型站點 來說,這是一個理想的概念.

     

     

    Hack-free CSS

    處理諸如IE 這樣煩人的瀏覽器 的兼容性是我們最頭疼的事兒之一.

    很多朋友使用CSS Hack 來解決這些問題.

    問題是當IE版本進行升級更替,改進對CSS的支持后,之前使用的hacks將會無效 !

    你是怎么解決這個問題 的呢?

    “我們要求你在不使用CSS hacks 的情況下更新你的頁面.假如你想針對IE或者避開IE,你可以使用條件注釋.”

    條件注釋 如何工作?

    步驟一、針對IE,創建一個心得樣式文件

    步驟二、在HTML文檔的開頭添加條件注釋 代碼

    只有指定的IE瀏覽器版本識別這個心的樣式,其它的瀏覽器將會徹底忽略 它.

    平常的瀏覽器識別:(非IE瀏覽器,如火狐、Chrome等等)

     

    特定IE 版本識別:

    舉個例子, 大多數瀏覽器會將補白加進容器的寬度里,但是IE5 不會. 這種情況下,IE5 顯示的是一個比較小的容器.

     

    main.css (被包含IE5在內的所有瀏覽器識別):

    #container{ width: 600px; padding: 100px;}

     

    ie5.css (只有IE5識別):

    #container {width: 800px; }

     

     

    為什么條件注釋是一個好的解決方案呢?

    1.  No hacks
    特定的CSS 規則僅出現在新的樣式表里.

    2.  文件分離
    針對特定版本的IE 定義的樣式脫離了主樣式表,可以在IE 瀏覽器升級更新對屬性支持時輕松移除這些文件.

    3.  針對性
    可對不同版本的IE 瀏覽器有針對性的進行相關屬性的定義。

    posted @ 2012-07-12 22:25 張慧 閱讀(1326) | 評論 (0)編輯 收藏

         摘要: 本人的重點是怎么構建一個簡單有效可擴展的jQuery表單驗證插件,這篇文章沒有教你怎么用 validate plugin。我們的重點在學習一些jQuery,Javascript面向對象編程的知識。下面是一個完整的html頁面代碼,可以直接運行測試的。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www....  閱讀全文
    posted @ 2012-07-12 22:24 張慧 閱讀(2480) | 評論 (1)編輯 收藏

    自己寫了一個基于jquery的返回頁面頂端的組件。 
    (function($) { 
    var g; 
    $.backtop = function(options) { 
    extend($.backtop.config, options); 
    this.config = $.backtop.config; 
    this.init(); 
    g = this; 
    }; 
    $.backtop.config = { 
    title : null,// 返回頂端文字說明 
    df_color : "#77AA55"http:// 組件默認顏色 
    }; 
    $.backtop.prototype = { 
    config : null, 
    backtop : null,// 當前創建返回頂端對象 
    init : function() { 
    this._scrool(); 
    }, 
    _scrool : function() { 
    window.onscroll = function() { 
    g._create_ob($(window).scrollTop()); 
    }; 
    }, 
    _create_ob : function(top) { 
    if(top==0){ 
    $("#back_top").remove(); 
    return; 

    $("#back_top").remove(); 
    this.backtop = $("<div class='mouseover'><img src='ui/main/gotop.gif'></img></div>"); 
    $(this.backtop).bind("click",function(){ 
    g._moveTo(); 
    }); 
    $(this.backtop).bind("mouseover",function(){ 
    $(g.backtop).removeClass(); 
    $(g.backtop).addClass("mouse"); 
    }); 
    $(this.backtop).bind("mouseout",function(){ 
    $(g.backtop).removeClass(); 
    $(g.backtop).addClass("mouseover"); 
    }); 
    $(this.backtop).attr("id","back_top"); 
    /*$(this.backtop).css("backgroundColor", this.config.df_color);*/ 
    $(this.backtop).css("zIndex", 1000); 
    $(this.backtop).css("position", "absolute"); 
    $(this.backtop).css("cursor","pointer"); 
    $(this.backtop).width(30); 
    $(this.backtop).height(30); 
    $(this.backtop).css("left",$("body").attr("clientWidth")-50); 
    $(this.backtop).css("top", top+300); 
    $("body").append(this.backtop); 
    },// 創建返回頂端jquery對象 
    _moveTo:function(){ 
    $("#back_top").remove(); 
    window.scroll(0,0); 

    }; 
    })(jQuery); 
    var extend = function($cf, options) { 
    for ( var a in options) { 
    $cf[a] = options[a]; 

    }; 
    posted @ 2012-07-12 22:22 張慧 閱讀(755) | 評論 (0)編輯 收藏

    準備階段:

    Hibernate可用于各種類型的項目,要在項目中使用Hibernate,需要下載Hibernate的API.
    通過http://www.hibernate.org/網址可以下載到Hibernate的API和一些幫助文檔.

    點擊downloads —> release bundles即可下載

    下載解壓后,在lib -> required目錄下可找到項目中需要的jar包(API).

    官網上好像沒有API的幫助文檔,大家可以到這里下載:http://115.com/file/bensl2vy#hibernate api幫助文檔.chm

     

    開發階段:

    新建一個JAVA項目,目錄結構如下:

    將準備的jar包引入到項目中。

     

    hibernate.cfg.xml:(Hibernate的配置文件,放在項目的src目錄下):<?xml version='1.0' encoding='UTF-8'?>

     <!DOCTYPE hibernate-configuration PUBLIC
               "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
               "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
    >
     
         <!-- Generated by MyEclipse Hibernate Tools.                   -->
     <hibernate-configuration>
     
         <session-factory>
             <!-- 設置驅動類 -->
             <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
             <!-- 設置連接池默認個數 -->
             <property name="connection.pool_size">20</property>
             <!-- 設置JDBC URL -->
             <property name="connection.url">jdbc:mysql://localhost:3306/book</property>
             <!-- 設置數據庫用戶名 -->
             <property name="connection.username">username</property>
             <!-- 設置數據庫用戶密碼 -->
             <property name="connection.password">passwrod</property>
             <!-- 設置SQL方言 -->
             <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
             <!-- 設置是否顯示SQL語句 -->
             <property name="show_sql">true</property>
             <!-- 設置格式化SQL語句 -->
             <property name="format_sql">true</property>
             <property name="current_session_context_class">thread</property>
     
             <mapping resource="com/sunflower/bean/Person.hbm.xml" />
         </session-factory>
     
     </hibernate-configuration>

    這里配置的是MySQL數據庫的驅動和連接,在開始的時候忘了加26行,結果調試的時候出錯,得不到session,關于這個標簽的使用,請參考如下文章:http://blog.sina.com.cn/s/blog_5ecfe46a0100e467.html 第28行是對象關系映射文件的配置.

    Person.java:(人的實體類,對應到關系數據庫中的blog表)package com.sunflower.bean;

     
     import java.io.Serializable;
     
     /**
      * 博客用戶的實體類
      * 
      * 
    @author hanyuan
      * @time 2012-7-8 下午11:53:23
      
    */
     public class Person implements Serializable {
         private Integer id;
         private String username;
         private String password;
         private String caption;
         private String content;
     
         public Integer getId() {
             return id;
         }
     
         public void setId(Integer id) {
             this.id = id;
         }
     
         public String getUsername() {
             return username;
         }
     
         public void setUsername(String username) {
             this.username = username;
         }
     
         public String getPassword() {
             return password;
         }
     
         public void setPassword(String password) {
             this.password = password;
         }
     
         public String getCaption() {
             return caption;
         }
     
         public void setCaption(String caption) {
             this.caption = caption;
         }
     
         public String getContent() {
             return content;
         }
     
         public void setContent(String content) {
             this.content = content;
         }
     
     }

     第12~16行中的屬性對應到數據庫中的blog表的字段,其中id是主鍵索引.

    Person.hbm.xml:(對象關系映射配置文件)<?xml version="1.0"?>

     <!DOCTYPE hibernate-mapping PUBLIC 
         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"
    >
     
     <hibernate-mapping>
         <!-- 設置實體類與數據庫中表的對應關系 -->
         <class name="com.sunflower.bean.Person" table="blog">
     
             <id name="id" type="java.lang.Integer">
                 <column name="id"></column>
                 <!-- 將逐漸設置為自增 -->
                 <generator class="increment"></generator>
             </id>
     
             <property name="username" type="java.lang.String" not-null="true">
                 <column name="username"></column>
             </property>
     
             <property name="password" type="java.lang.String">
                 <column name="password"></column>
             </property>
     
             <property name="caption" type="java.lang.String">
                 <column name="caption"></column>
             </property>
     
             <property name="content" type="java.lang.String">
                 <column name="content"></column>
             </property>
     
         </class>
     </hibernate-mapping>

    <class name="com.sunflower.bean.Person" table="blog">表示對象對應的表,<id>字段是必須要有的,表示主鍵。開始的時候沒有加第13行,結果調試出錯,需要加上<generator>標簽,這里設置為自增類型.關于<generator>標簽的使用,參考下列文章:http://sarin.iteye.com/blog/605712

    這個配置文件的是以hbm.xml結尾的,名字建議命名為對象名.hbm.xml,并且和實體類對象放在同一個包下,這樣比較好找.

    Test.java:(調用Hibernate API 插入數據)package com.sunflower.main;

     
     import org.hibernate.Session;
     import org.hibernate.SessionFactory;
     import org.hibernate.Transaction;
     import org.hibernate.cfg.Configuration;
     
     import com.sunflower.bean.Person;
     
     public class Test {
         @SuppressWarnings("deprecation")
         public static void main(String[] args) {
             // 讀取Hibernate的配置信息
             Configuration config = new Configuration();
             config.configure();
     
             // 讀取配置里面的SessionFactory
             SessionFactory sessionFactory = config.buildSessionFactory();
             Session session = sessionFactory.getCurrentSession();
             Transaction transaction = session.beginTransaction();
     
             Person person = new Person();
             person.setUsername("鄧光橋");
             person.setPassword("123");
             person.setCaption("Hibernate");
             person.setContent("Hibernate 入門實例");
     
             // 提交事務
             session.save(person);
             transaction.commit();
             sessionFactory.close();
         }
     }

     

     

    posted @ 2012-07-10 00:46 張慧 閱讀(1109) | 評論 (0)編輯 收藏

    在Java Web開發中,經常需要導出大量的數據到Excel,使用POI、JXL直接生成Excel,很容易就造成內存溢出了。

      1、有一種方式,就是把數據寫成csv格式文件。

      1)csv文件可以直接用Excel打開。

      2)寫csv文件的效率和寫txt文件的效率一樣高。

      3)同樣的數據內容,生成的csv文件的大小遠遠小于生成的Excel文件。

      從以上優點就可以看出生成csv文件消耗的內存絕對小于生成Excel文件。

      2、按一定的格式去生成csv文件,在Excel中打開的時候就是完整的行和列格式。

      例如:在Excel中的格式:

                                       

      那么,在csv文件中格式就必須為:

                                      

      就是說,列和列之間,需要用英文輸入法狀態下的逗號","間隔:風云第一刀,古龍。

      3、在Struts2中導出數據到Excel,一個簡單的例子。

      CsvAction,生成csv文件,并且將生成的csv文件完整路徑傳遞到下載Action。

    package cn.luxh.struts2.action;

    import java.io.FileWriter;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;

    import cn.luxh.struts2.entity.Novel;

    import com.opensymphony.xwork2.ActionSupport;


    /**
     * 導出數據到csv文件
     * 
    @author Luxh
     
    */
    public class CsvAction extends ActionSupport {

        private static final long serialVersionUID = -2862629695443964658L;
        
        /**
         * 包含完整路徑的文件名
         * 傳遞給下載Action進行下載
         
    */
        private String fileName;
        
        
        /**
         * 導出數據
         
    */
        public String exportData2CSV() {
            List<Novel> novels = getNovels();
            fileName = "D:/novels.csv";
            writeData2CSV(novels,fileName);
            return SUCCESS;
            
        }
        
        /**
         * 構造一些數據
         * 實際上可能是從數據庫中把大量的數據查出來
         
    */
        private List<Novel> getNovels() {
            List<Novel> novels = new ArrayList<Novel>();
            
            Novel novel1 = new Novel("風云第一刀","古龍",new Date());
            Novel novel2 = new Novel("書劍恩仇錄","金庸",new Date());
            Novel novel3 = new Novel("陸小鳳傳奇","古龍",new Date());
            Novel novel4 = new Novel("鹿鼎記","金庸",new Date());
            
            novels.add(novel1);
            novels.add(novel2);
            novels.add(novel3);
            novels.add(novel4);
            
            return novels;
        }
        
        /**
         * 把數據按一定的格式寫到csv文件中
         * 
    @param novels     數據集合
         * 
    @param fileName  csv文件完整路徑
         
    */
        public void writeData2CSV(List<Novel> novels,String fileName) {
            FileWriter fw = null;
            try {
                fw = new FileWriter(fileName);
                //輸出標題頭
                
    //注意列之間用","間隔,寫完一行需要回車換行"\r\n"
                String title = "序號,小說名稱,作者,出版日期\r\n";
                fw.write(title);
                
                String content = null;
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                for(int i=0;i<novels.size();i++) {
                    Novel novel = novels.get(i);
                    //注意列之間用","間隔,寫完一行需要回車換行"\r\n"
                    content =(i+1)+","+novel.getName()+","+novel.getAuthor()+","+sdf.format(novel.getPublishDate())+"\r\n";
                    fw.write(content);
                }
            }catch(Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }finally {
                try {
                    if(fw!=null) {
                        fw.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    復制代碼

      配置文件:

    <!--將csv文件路徑傳遞到公共的下載Action進行下載  -->
             <action name="exportData2CSV" class="cn.luxh.struts2.action.CsvAction" method="exportData2CSV">
                <result type="redirectAction">
                    <param name="actionName">download</param>
                    <param name="nameSpace">/download</param>
                    <!--附件的完整路徑 ,傳遞給下載Action -->
                    <param name="fileName">${fileName}</param>
                </result>
            </action>

      提供下載功能的Action參考http://www.cnblogs.com/luxh/archive/2012/07/01/2571778.html

      4、看一下同樣的數據內容,csv文件和Excel文件的大小對比: 

                                            

     

     

     

     

     

     

     

      

    posted @ 2012-07-10 00:43 張慧 閱讀(7379) | 評論 (1)編輯 收藏

    對于Servlet的生命周期,主要圍繞著init()、service()和destroy()三個回調方法展開的。什么是回調方法?通俗的說就是這三個方法定義完后由web容器負責在特定時間(需要的時候)調用。

    Servlet容器,如Tomcat一般會在用戶第一次請求Servlet的時候實例化該對象。另一種情況是在服務器啟動時立即加載并實例化,但這需要在web.xml文件中對Servlet進行load-on-startup的配置。

    當第一個用戶請求到來時,服務器根據部署描述符找到所訪問的Servlet類,并查找當前容器,發現沒有此類的實例,說明是第一次訪問此Servlet,所以容器開始加載Servlet,并實例化此對象,實例化之后會立即調用init()方法,而且init()方法由始至終只被調用一次,所以比較適合進行對象的初始化工作,比如讀取配置文件,初始化屬性等。當調用完init()方法后,Servlet實例處于ready狀態,這時開始調用其service()方法,并等待著下一次請求的到來。

    service()方法是服務方法,只要再有請求到來,服務器都會產生一個新的線程,調用service()方法,進行相關的服務。service()方法會檢查HTTP請求的類型(GET、POST等),來相應的調用doGet()、doPost()等。GET請求起因于正常URL請求,或沒有指定Method的HTML表單;Post請求起因于將Method定為Post的HTML表單。從圖中可見,service()方法可以被調用多次,因為之后用戶每一次訪問該Servlet,都會觸發服務器調用service()方法。

    如果實例長時間未被訪問,或者web服務器關閉,則容器會負責調用destroy()方法,該方法可以將一些資源釋放,destroy()方法也是只被調用一次,之后Servlet實例將被JVM回收空間。這樣通過init()-->service()-->destroy(),完成了Servlet的一個生命周期。

    上圖是UML中的狀態圖,形象的描述了一個對象在不同事件觸發時,其內部狀態的變更過程。實心的圓圈代表初始狀態,代表Servlet剛剛被實例化:中間寫Ready的橢圓形代表就緒狀態,最下面的圓圈代表結束,這時對象已被JVM的GC回收。圖中的另外一個分支,代表在執行init()操作時拋出了異常,造成無法調用service()方法,生命周期提前終止。

    posted @ 2012-07-08 23:33 張慧 閱讀(1416) | 評論 (0)編輯 收藏

    僅列出標題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: 午夜影视日本亚洲欧洲精品一区| 中文字幕一区二区免费| 国产97视频人人做人人爱免费| 亚洲资源在线视频| 伊人亚洲综合青草青草久热| 成人最新午夜免费视频| 亚洲人成色4444在线观看| 婷婷亚洲综合五月天小说| 国产亚洲精品a在线观看| 日本一道一区二区免费看| 一本岛高清v不卡免费一三区| 免费成人高清在线视频| 亚美影视免费在线观看| 国产亚洲视频在线| 亚洲高清视频在线观看| 久久久久噜噜噜亚洲熟女综合| 四虎影视www四虎免费| 91嫩草国产在线观看免费| 91精品国产免费| 无码国产精品一区二区免费式芒果 | 久久亚洲精品中文字幕无码 | 国产成人人综合亚洲欧美丁香花 | 国内精品免费麻豆网站91麻豆| 国产精品免费高清在线观看| 国产一区二区三区免费观在线| 免费无毒a网站在线观看| 日韩亚洲综合精品国产| 亚洲精品无码av片| 亚洲综合精品成人| 中文文字幕文字幕亚洲色| 久久国产亚洲精品| 亚洲日韩精品无码AV海量| 亚洲区日韩精品中文字幕| 亚洲人成网站999久久久综合| 亚洲 欧洲 视频 伦小说| 亚洲欧美成人av在线观看| 亚洲熟妇成人精品一区| 亚洲色少妇熟女11p| 久久久久久久久无码精品亚洲日韩| 亚洲AV无码一区二区乱子仑| 亚洲欧美国产欧美色欲|