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

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

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

    隨筆-46  評論-64  文章-2  trackbacks-0
      2007年11月28日
         摘要: 廢話不多說,先看看我們最終達到的效果.? 源碼下載在文章最后。Style1:Style2:上面的tag cloud實現思想如下:1. Server端提供Tag的相關信息,包括TagName,Posts等,使用JSON格式傳輸數據??? 這個例子中,我使用Servlet,使用json-lib將Bean轉成JSON字符串。當然Tag的相關信息這里只是演示,真實環境中可能就需要從數據庫取出來再處理了。?...  閱讀全文
    posted @ 2008-09-28 16:10 jht 閱讀(3160) | 評論 (3)編輯 收藏
    1. response.setHeader("Cache-Control","no-cache");

    This is used to prevent the browser from caching your dynamic content generated by a JSP or Servlet.

    You set this attribute in the HTTP header of the response object which would tell the browser not to cache this content. So everytime you request the page again, the browser would make a new request, instead of showing you a cached page.

    2.使用服務器端控制AJAX頁面緩存:
    ??? response.setHeader( "Pragma", "no-cache" );
    ??? response.addHeader( "Cache-Control", "must-revalidate" );
    ??? response.addHeader( "Cache-Control", "no-cache" );
    ??? response.addHeader( "Cache-Control", "no-store" );
    ??? response.setDateHeader("Expires", 0);
    單純的使用 xmlhttp.setRequestHeader("Cache-Control","no-cache")無效。

    3.Cache-Control頭域
      Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control并不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各個消息中的指令含義如下:
      Public指示響應可被任何緩存區緩存。
      Private指示對于單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對于其他用戶的請求無效。
      no-cache指示請求或響應消息不能緩存
      no-store用于防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。
      max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應。
      min-fresh指示客戶機可以接收響應時間小于當前時間加上指定時間的響應。
      max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。

    Read more:
    ???http://www.jiehoo.com/browser-cache-problem.htm?(作者: Cherami?原載: 瀏覽器緩存)
    ???再論怎么有效利用瀏覽器緩存之怎么避免瀏覽器緩存靜態文件
    ???HTTP協議header頭域- PetitPrince - 博客園
    posted @ 2008-09-27 10:23 jht 閱讀(16590) | 評論 (3)編輯 收藏
    < link?id = " css " ?rel = StyleSheet?type = " text/css " ?href = " ./button.css " ? />

    < script?type = " text/javascript " >
    ?
    var ?cssArray? = ? new ?Array( " button.css " , " button1.css " , " button2.css " , " button3.css " , " button4.css " , " button5.css " , " button6.css " );
    ?
    var ?index? = ? 0 ;
    ?
    function ?changeCssFile()
    ?
    {
    ??
    var ?css? = ?document.getElementById( " css " );
    ??index
    ++ ;
    ??
    if (index < cssArray.length)
    ??
    {
    ???css.href?
    = ?cssArray[index];
    ??}

    ??
    else
    ??
    {
    ???index?
    = 0 ;
    ???css.href?
    = ?cssArray[index];
    ??}

    ?}

    </ script >

    ? < a? class ="button" ?href ="#" ?onclick ="changeCssFile()" >
    ??
    < span? id ="buttonText" > Change?another?style </ span >
    ?
    </ a >
    posted @ 2008-09-25 12:26 jht 閱讀(767) | 評論 (0)編輯 收藏
    A:瀏覽器問題,可能會把透明區域顯示成有灰度的區域,解決辦法,轉成gif格式吧,支持比較好

    see: GIF or PNG? - Quality Web Tips
    posted @ 2008-09-24 23:02 jht 閱讀(1189) | 評論 (1)編輯 收藏
    比如說下面的這個header.jsp中有中文,那么包含這個文件的網頁可能就會出現亂碼
    <jsp:include page="header.jsp"></jsp:include>

    解決辦法是在header.jsp里加上下面這段話:
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    posted @ 2008-09-23 12:46 jht 閱讀(462) | 評論 (0)編輯 收藏
         摘要: log4j 支持運行時修改日志的相關配置,看了一下他的source code, 用FileWatchdog這個類來做的,代碼也很簡單,通過循環在一定時間間隔讀取配置文件,如果文件變更,調用一個doOnChange()方法。如果自己要做一個支持運行時修改配置的系統可參考上面的做法。下面是一段支持運行時修改配置的系統Prototype代碼,和log4j的做法稍有不同,使用Observer模式,使其更加...  閱讀全文
    posted @ 2008-09-04 14:49 jht 閱讀(1320) | 評論 (0)編輯 收藏

    可以用下面這個方法來做到

    import ?org.apache.log4j.Logger;
    import ?org.apache.log4j.PropertyConfigurator;

    public ? class ?DemoRunTimeChangeLog4J? {

    ?
    private ? static ? final ?Logger?logger? = ?Logger.getLogger(DemoRunTimeChangeLog4J. class );

    ?
    public ? static ? void ?main(String[]?args)? {
    ??PropertyConfigurator.configureAndWatch(
    " src/log4j.configureAndWatch " , 60000 );
    ??
    ??
    while ?( true )? {
    ???
    if ?(logger.isDebugEnabled())? {
    ????logger.debug(
    " DEBUG?MESSAGE " );
    ???}


    ???logger.info(
    " Info?Message " );

    ???
    try ? {
    ????Thread.sleep(
    5000 );
    ???}
    ? catch ?(InterruptedException?e)? {
    ???}

    ??}

    ?}

    }


    posted @ 2008-09-03 17:35 jht 閱讀(634) | 評論 (0)編輯 收藏
    自定義TagLib的時候碰到這個錯誤,原因是編輯tld文件的時候沒有使用DTD或者Schema文件驗證,拼寫錯誤導致最終報這個錯誤消息

    如果遇到同樣問題的同學,不妨檢查一下自己的tld文件對不對。

    BTW: tld類的異常需要處理好
    posted @ 2008-08-19 15:53 jht 閱讀(7765) | 評論 (1)編輯 收藏
    這個問題可能由兩個地方導致

    1. 你的POJO類不是一個JavaBean,最可能的原因是沒有一個無參構造函數
    2. 在dwr.xml里這個類的<convert>指定的不對,或者是沒有指定
    posted @ 2008-08-11 11:21 jht 閱讀(4203) | 評論 (4)編輯 收藏
    數獨游戲小程序

    數獨的游戲規則很簡單:在九個九宮格里,填入1到9的數字,讓每個數字在每個行、列及九宮格里都 只出現一次就可以過關了!?雖然游戲的規則十分簡單,但很多人在沒有計算機輔助時,常常會不小心造成違規狀況。

    下面是我做的一個數獨小程序 1.0 版本,目前功能如下:

    選擇外觀;
    數獨自動出題;
    數獨自動解題;
    游戲計時功能;
    開啟解答輔助功能,出錯提示;
    開啟解答輔助功能,輔助線;

    程序基于Java Swing,運行需要JRE1.6以上版本。
    ?
    可雙擊執行的JAR包,點此下載。(Napkin的LookAndFeel蠻好玩,我就一起弄在里面了)
    程序的源碼,點此下載。(有興趣修改源碼的朋友可以DIY出自己喜歡的版本。)

    或者也可以從 http://groups.google.com/group/afun?這個group的files里面找到上面的兩個文件。

    對數獨有興趣的朋友可以玩一下這個小工具,歡迎留下寶貴意見,讓這個小程序更完善。 可能我會另開一篇日志說一下Source Code相關的東西。
    ?
    Figure: 填值的出錯提示
    Figure: 填值的出錯提示2
    演示如何使用輔助線功能:
    首先選中Enable help system選項, 然后選擇按鈕 1 ,這時候關于 1 的輔助線開啟,把不能填1的單元格都畫了線,畫線規則是,1所在的行畫桃紅色橫線,1所在的列畫橙色豎線,1所在的九宮格畫粉色X線,如下圖,這時候我們發現,在第五行只有第二列這一單元格格沒有被畫上線,那么這一個肯定只能填上1。
    這時候我們就可以把1填入到 第五行第二列,這時輔助線會自動更新。如下圖,此時沒有可以確定填入1的單元格了,我們可以換一個數看輔助線。
    ?OK,我們選擇3,這時候輔助線如下,我們發現第五行第四格可以確定填入3這個值。
    填入3之后的圖如下:
    解答成功之后,會彈出恭喜解答成功的對話框。
    自動解答功能可能出現的異常情況
    當題目比較復雜的時候,可能會彈出如下的提示異常的對話框,這是因為解答數獨用了遞歸的解法,難度大時遞歸深度很深,導致棧溢出,可以通過運行JVM時指定線程棧大小的方法來解決這個問題。
    posted @ 2008-08-02 17:32 jht 閱讀(2714) | 評論 (4)編輯 收藏
    new & valueof & 直接賦值的區別
    首先來看下面這段代碼
    public static void main(String[] args) {
    ??String s1 = "s1";
    ??String s2 = new String("s2");
    ??String s3 = String.valueOf(12345);
    }
    ?
    編譯成class文件之后,使用eclipse class file viewer查看
    ?
    ? // Method descriptor #15 ([Ljava/lang/String;)V
    ? // Stack: 3, Locals: 4
    ? public static void main(java.lang.String[] args);
    ???? 0? ldc <String "s1"> [16]
    ???? 2? astore_1 [s1]

    ???? 3? new java.lang.String [18]
    ???? 6? dup
    ???? 7? ldc <String "s2"> [20]
    ???? 9? invokespecial java.lang.String(java.lang.String) [22]
    ??? 12? astore_2 [s2]
    ??? 13? sipush 12345
    ??? 16? invokestatic java.lang.String.valueOf(int) : java.lang.String [25]
    ??? 19? astore_3 [s3]

    ??? 20? return
    ????? Line numbers:
    ??????? [pc: 0, line: 12]
    ??????? [pc: 3, line: 13]
    ??????? [pc: 13, line: 14]
    ??????? [pc: 20, line: 20]
    ????? Local variable table:
    ??????? [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[]
    ??????? [pc: 3, pc: 21] local: s1 index: 1 type: java.lang.String
    ??????? [pc: 13, pc: 21] local: s2 index: 2 type: java.lang.String
    ??????? [pc: 20, pc: 21] local: s3 index: 3 type: java.lang.String
    }
    ?
    對于第一行代碼 String s1 = "s1"; 編譯成字節碼之后,對應兩條指令,
    1. ldc指令從運行時常量池push一個值到Frame的操作數棧上面,這個值在這里就是"s1"字符串的引用,
    2. astore指令將objectref存儲到局部變量,這里也就是存儲到局部變量s1。
    ?
    對于第二行代碼???String s2 = new String("s2");編譯成字節碼之后,對于的指令也用高亮標注出來了,這里把操作數棧的情況畫了出來,希望能幫助理解。橙色標注的為棧頂元素。
    1. new指令會在堆上創建對象,操作數棧里壓入創建的objectref,
      ?
      objectref
      ...
    2. dup指令復制操作數棧頂的元素,?
      objectref
      objectref
      ...
    3. ldc指令依然是從常量池push一個值到Frame的操作數棧上,這個值是"s2"字符串的引用。?
      "s2"_ref
      objectref
      objectref
      ...
    4. invokespecial 指令調用一個方法,這里就是調用String的構造函數,調用完成之后棧上還有一個objectref?
      objectref
      ...
    5. astore指令將objectref存儲到局部變量,這里也就是存儲到局部變量s2。?
      ????????????
      ...
    ?
    對于第三行代碼??String s3 = String.valueOf(12345); 編譯成字節碼之后對應的指令,
    1. sipush 將 12345 壓棧
    2. invokestatic 調用 String.valueof(int) 方法
    3. astore 將棧頂的對象引用存儲到本地變量s3 (這里不再深究這個棧頂元素是怎么來的了)
    ?
    PMD檢查代碼的時候,有這樣的warning: Avoid instantiating?String objects.Call String.valueOf() instead. PMD給出的原因是In JDK 1.5, calling new String() causes memory allocation. String.valueOf() is more memory friendly.
    ?
    經過上面的分解,我們應該知道原因了,以后寫代碼的時候,初始化一個字符串,??String s1 = "s1"; 這樣的代碼肯定比??String s2 = new String("s2");代碼強,將其他類型的值轉換成String的時候,valueof方法比new方法效率也高。

    ?
    備注:
    A frame is used to store data and partial results(局部變量,操作數棧), as well as to perform dynamic linking , return values for methods, and dispatch exceptions.
    ?
    ldc指令的操作數棧: ...->...,value (value是int,float 或者 string 類型的引用)
    astore的操作數棧: ...,objectref->...
    new指令的操作數棧: ...->...,objectref
    dup指令的操作數棧: ...,value->...,value,value
    invokespecial的操作數棧: ...,objectref, [agr1,[arg2...]]->...
    invloestatic的操作數棧:..., [arg1, [arg2...]]?-> ...

    ?
    如果要理解的更透徹建議閱讀以下參考資料:
    posted @ 2008-07-28 14:27 jht 閱讀(1704) | 評論 (1)編輯 收藏

    java.awt.Component.requestFocusInWindow

    posted @ 2008-07-22 14:34 jht 閱讀(386) | 評論 (1)編輯 收藏
    http://m.tkk7.com/Files/jht/MyScreenSnap_2.0.zip

    截圖程序,設計目標:簡單易用

    支持全屏截圖和選擇截圖,運行需要JRE1.5以上版本

    在1.0版http://m.tkk7.com/Files/jht/MyScreenSnap.zip的基礎上,

    ?? * 修改了一下主界面,增加圖片保存為BMP,GIF,JPG,PNG格式的功能

    ?? * 參考了千里冰封的代碼,加上了調整選擇區域的功能

    Source Code已經包含在壓縮包里面了,有興趣的可以down下來改改。

    下面是1.0版本和2.0版本的兩個界面。

    1.0vs2.0.png
    posted @ 2008-07-02 09:17 jht 閱讀(331) | 評論 (1)編輯 收藏
    其實是個簡單的小問題,僅在此做個記錄。

    遇到這個問題的不妨讀一下這篇文章先:Access查詢和過濾條件 http://www.fontstuff.com/access/acctut06.htm

    我遇到的報錯語句如下:

    update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?='2008-04-06?16:56:36'?

    讀了上面的文章,知道 MS Access的時間分隔符號為 # ,而 MS SQL Server的時間分隔符為 '

    所以正確的語句應該是:

    update?monitor_table?set?logoffTime?='2008-04-06?16:58:54',?keyClickCount?='17'?where?userName?='abcd'?and?logonTime?=#2008-04-06?16:56:36#?

    posted @ 2008-05-19 15:39 jht 閱讀(1912) | 評論 (1)編輯 收藏
    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96616/arxml24.htm
    posted @ 2008-05-19 15:38 jht 閱讀(192) | 評論 (0)編輯 收藏
    如題,有人真的遇到過這個問題,開始被問到的時候還真覺得奇怪,心想不會啊,從JDK5開始就支持這個枚舉類型了啊,為什么呢?

    開始還懷疑他的JDK版本太低導致的,但是一看是JDK1.6的,迷惑了幾秒。。。

    然后我打開了Eclipse的Java編譯選項,發現原來遇到這個問題的人的Java編譯級別設置的是1.4,如下圖,當然就會出問題了。

    compile_setting.png

    呵呵,雖然,這是個小問題,但是如果遇到了還真夠新手郁悶一陣的。
    posted @ 2008-04-02 20:56 jht 閱讀(899) | 評論 (2)編輯 收藏

    作者簡介

    徐皓,北京航空航天大學計算機系本科生,你可以通過ertri@163.com與他聯系。

    正文

    不靈敏的圖形用戶界面會降低應用程序的可用性。當以下現象出現的時候,我們通常說這個用戶界面反應不靈敏。

    1. 不響應事件的現象;
    2. 沒有更新的現象
    [@more@]

    這些現象在很大程度上與事件的處理方法相關,而在編寫Swing應用程序的時候,我們幾乎必然要編寫方法去響應鼠標點擊按鈕,鍵盤回車等事件。在這些方法中我們要編寫一些代碼,在運行時去觸發一些動作。常見動作包括查找,更新數據庫等。在這篇文章中通過對一個實例的分析,介紹了一些基本概念,常見的錯誤以及提出了一個解決方案。

    event-dispatching thread

    我們一定要記住,事件響應方法的代碼都是在event-dispatching thread中執行的,除非你啟用另一個線程。

    那么,什么是event-dispatching thread呢?在《Java Tutorial》[1]中,作者給出了一條單一線程規則:一旦一個Swing組件被實現(realized),所有的有可能影響或依賴于這個組件的狀態的代碼都應該在event-dispatching thread中被執行。而實現一個組件有兩種方式:

    1. 對頂層組件調用show(), pack(), 或者setVisible(true);
    2. 將一個組件加到一個已經被實現的容器中。

    單一線程規則的根源是由于Swing組件庫的大部分方法是對多線程不安全的,盡管存在一些例外。這些例外的情況可以在《Java Tutorial》[1]的相關章節找到,這里不再展開。

    為了支持單一線程模型,Swing組件庫提供了一個專門來完成這些與Swing組件相關的操作的線程,而這一線程就是event-dispatching thread。我們的事件響應方法通常都是由這一線程調用的,除非你自己編寫代碼來調用這些事件響應方法。在這里初學者經常犯的一個錯誤就是在事件響應方法中完成過多的與修改組件沒有直接聯系的代碼。其最有可能的效果就是導致組件反應緩慢。比如以下響應按鈕事件的代碼:

    String str = null;
    this.textArea.setText("Please wait...");
    try {
    //do something that is really time consuming
    str = "Hello, world!";
    Thread.sleep(1000L);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.textArea.setText(str); ? ?

    執行之后的效果就是按鈕似乎定住了一段時間,直到Done.出現之后才彈起來。原因就是Swing組件的更新和事件的響應都是在event-dispatching thread中完成的,而事件響應的時候,event-dispatching thread被事件響應方法占據,所以組件不會被更新。而直到事件響應方法退出時才有可能去更新Swing組件。

    為了解決這個問題,有人也許會試圖通過調用repaint()方法來更新組件:

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";

    jTextArea1.setText(str[0]);

    但是這一個方法沒有起到預期的作用,按鈕仍然定住一段時間,在察看了repaint()方法的源代碼之后就知道原因了。

    PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,
    new Rectangle(x, y, width, height));
    Toolkit.getEventQueue().postEvent(e); ? ? ? ?

    repaint()方法實際上是在事件隊列里加了一個UPDATE的事件,而沒有直接去重畫組件,而且這一個事件只能等待當前的事件響應方法結束之后才能被分配。因此只有繞過分配機制直接調用paint方法才能達到目的。

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.paint(this.getGraphics());

    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";

    jTextArea1.setText(str[0]);

    這樣卻是實現了更新,但是還存在著以下的問題。雖然從感覺上,按鈕已經彈起來了,但是在Done.出現之前,我們卻無法按下這個按鈕。可以說按鈕還是定住了,只不過定在了彈起的狀態。調用重繪方法無法從根本上解決問題,因此我們需要尋求其他的方法。

    使用多線程

    有效的解決方法是使用多線程。首先看一看一個更好的解決方案,這一方案是在參考《Rethinking Swing Threading》[3]的一個程序片段完成的:

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    new Thread() {
    public void run() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    jTextArea1.setText(str[0]);
    }
    });
    }
    }.start();

    在這個程序中,要花費大量時間的操作被放到另一個線程當中,從而使事件響應方法能快速返回,event-dispatching thread就可以更新UI和響應其它事件了。注意到這個程序使用了invokeLater()方法。invokeLater()方法的作用是讓event-dispatching thread去運行制定的代碼。當然也可以不使用invokeLater()方法,但是這樣就違背了單一線程原則,同時帶來了一定程度的相對多線程的不安全性。到現在,解決方案似乎是完美的了,但是我們看一看在原來的程序添加下面的代碼,盡管我們通常不這樣做。

    public void paint(java.awt.Graphics g) {
    super.paint(g);
    g.drawRect(1, 1, 100, 100);
    }

    我們會發現以前畫的矩形被覆蓋了一部分,原因是由于我們沒用重畫這一個矩形,因此在結尾加上對repaint()方法的調用。

    final String[] str = new String[1];
    this.jTextArea1.setText("Please wait...");
    this.repaint();

    new Thread() {
    public void run() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    str[0] = "Done.";
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    jTextArea1.setText(str[0]);
    repaint();
    }
    });
    }
    }.start();

    如果你認為這段代碼過于缺乏可讀性,通過在《Java Tutorial》[1]里面介紹的SwingWorker來簡化編程的方法。可以通過實現一個construct()方法來實現花費大量時間的操作和重寫finished()方法來完成組件更新的工作。

    this.jTextArea1.setText("Please wait...");

    final SwingWorker worker = new SwingWorker() {
    public Object construct() {
    try {
    Thread.sleep(1000L);
    }catch(InterruptedException e) {
    e.printStackTrace();
    }
    return "Done.";
    }
    public void finished() {
    jTextArea1.setText(getValue().toString());
    repaint();
    }
    };
    worker.start();

    在《Rethinking Swing Threading》[3],作者將以上的編程方式稱為同步方式。另外作者提出了一個通過消息機制來實現相同功能的更清晰,但是需要編寫更多代碼的"異步"的方法。

    結論

    總之,我們在編寫使用Swing組件的程序是要記住以下幾點:

    1、不要過多地占用event-dispatching thread;

    2、與更新組件相關的代碼要使用event-dispatching thread去執行;

    3、要更新組件。

    編寫反應靈敏的圖形用戶界面還需要考慮很多問題,以上只是最基本的一部分。歡迎有興趣的讀者來信進行討論。

    posted @ 2008-03-13 17:53 jht 閱讀(574) | 評論 (0)編輯 收藏

    打開注冊表編輯器,進入主鍵[HKEY_CURRENT_USER\Software\Microsoft\Command Processor],將“CompletionChar”鍵值設置為9。  

    posted @ 2008-01-30 16:40 jht 閱讀(708) | 評論 (0)編輯 收藏
    在Struts中我們用html:errors標簽在JSP頁面上輸出驗證過程中產生的錯誤信息,錯誤信息一般來自于消息資源文件(xxx.properties文件,一般位于classes目錄下,文本文件),當然錯誤信息也可以是不是資源文件中的文本消息,而是自定義的文本。接下來將詳細講述。

      先來看一個簡單例子

    1、資源文件錯誤信息來源(其格式為 key = value )
    ???
    ?? error.test = this is a test error.

    2、JSP頁面中用于顯示錯誤信息標簽
    ??
    ?? <html:errors property="testerror"/>

    3、ActionFormBean的validate()方法中產生錯誤信息

    ?? ActionErrors error = new ActionErrors();

    ?? error.add("testerror",new ActionMessage("error.test"))
    ??
    ?? return error;

    ?

      這個例子的功能就是在ActionForm Bean的validate()方法中產生一條名為:testerror的錯誤信息,錯誤信息息是資源文件中key為error.test的值。然后在頁面上用html:errors標簽輸出testerror這條錯誤信息。

      這是最常用的一種功能,所有的錯誤信息都在資源文件里面。

      有人會問,錯誤信息只能存放在資源文件中嗎,其實不是這樣。不需要資源文件也可以產生錯誤信息

      我們再來看一下ActionMessage的另一種構造方法:

      ActionMessage(String key,boolean isresource)

      如果isresource值為true,則表示key是資源文件中的key,產生的消息就是與key相對應的消息
      如果isresource值為false,則表示key為一條普通的消息。

      如果上面的error.add改為error.add("testerror",new ActonMessage("這是一條自定義消息",false",));那么頁面上顯示的將是:這是一條自定義消息.


      另外還可以用ActionMessage產生復合消息,比如我們要輸出:xxx不能用作用戶名,其中xxx是一個變量。

      首先我們在資源文件中加一個條復合消息

      testmsg = {0}不能用作用戶名。這里{0}是要被替換的參數。

      我們再來看一下ActionMessage的另一中構造方法
      ActionMessage(String key,Object value0);

      也就是說用value0的值來替換{0}

      我們修改error.add為error.add("testerror",new ActonMessage("testmsg","毛澤東"))

      那么JSP頁面上將顯示:毛澤東不能用作用戶名。


      當然在一條復合消息中也可帶多個參數,參數依次為{0},{1},{2}或更多
      例如:loginUser = 用戶名:{0} 姓名:{1} 登錄次數:{2}.....
      那么在產生錯誤消息時就用new ActionMessage(String key,Object value0,Object value1,Object? value2.....)或者使用對象數組new ActionMessage(String key,Object[] values)
      

      String[] detail = {"Admin","王晶","12"};
      error.add("testerror",new ActionMessage("loginUser",detail))


    Note:

    Cannot find message resources under key org.apache.struts.action.MESSAGE? 錯誤的原因是沒有配置資源文件

    解決辦法: 在struts-config.xml 中加入如下的一段

    <message-resources parameter="application" null="false"></message-resources>


    posted @ 2008-01-14 22:20 jht 閱讀(1150) | 評論 (1)編輯 收藏

    備忘:

    >?sqlplus?( < username > [/ < password > ][@ < connect_identifier > ]?|?/)?[AS?SYSDBA?|?AS?SYSOPER]?|?/NOLOG
    ?SQL? > ??? desc ??user_source;
    ?Name???????????????????????????????????????
    Null ??????Type
    ??
    -- ?---------------------------------------?--------?----------------------------?
    ??NAME???????????????????????????????????????????????? VARCHAR2 ?(? 30 ?)
    ?TYPE????????????????????????????????????????????????
    VARCHAR2 ?(? 12 ?)
    ?LINE????????????????????????????????????????????????
    NUMBER ?
    ??
    TEXT ????????????????????????????????????????????????? VARCHAR2 ?(? 4000 ?)

    SQL?
    > ??? select ??? TEXT ??? from ??user_source?? where ??TYPE? = ? ' ?PROCEDURE? ' ??? and ??NAME? = ? ' ?Your_Procedure_name? ' ?;

    no?rows?selected

    SQL?
    > ?? var ?out_var? number
    exec ?Your_Procedure_name?( '' , '' , '' ,:out_var)
    print ?out_var

    posted @ 2007-11-28 14:00 jht 閱讀(2739) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 国产精品亚洲精品日韩动图| 91免费福利视频| 亚洲中文字幕无码爆乳av中文| 日本高清不卡aⅴ免费网站| 亚洲成aⅴ人片在线影院八| 国产高清在线免费| 久久aⅴ免费观看| 亚洲精品自偷自拍无码| 国产亚洲av片在线观看播放| 波多野结衣在线免费观看| 免费很黄无遮挡的视频毛片| 亚洲国产综合精品中文第一区| 免费看AV毛片一区二区三区| 国产麻豆一精品一AV一免费 | 亚洲精品无码mⅴ在线观看| 亚洲国产精品综合久久网络| 久久免费看黄a级毛片| 美女的胸又黄又www网站免费| 久久青青草原亚洲AV无码麻豆| 韩国欧洲一级毛片免费| 污污网站免费观看| 男女猛烈激情xx00免费视频| 亚洲国产成人在线视频| 亚洲国产精品无码久久久秋霞2| 成人看的午夜免费毛片| 久久久久免费精品国产小说| 老妇激情毛片免费| 亚洲五月综合缴情婷婷| 亚洲成人激情在线| 亚洲片国产一区一级在线观看 | 亚洲一区在线免费观看| 你懂的免费在线观看| 日韩亚洲人成网站| 亚洲精品一二三区| 亚洲色偷偷av男人的天堂| 亚洲熟妇无码AV在线播放| 国产在线19禁免费观看国产| 国拍在线精品视频免费观看| 免费A级毛片无码A∨| a级毛片毛片免费观看久潮喷| 丰满妇女做a级毛片免费观看|