2008年5月15日 
效果如圖 :
  
                       

以下是代碼:

login.js  代碼如下:

 

LoginPanel = function() {
 
    var win, f;
    var buildForm = function() {
        // 構(gòu)建一個(gè)表單面板容器
        f = new Ext.form.FormPanel( {
            // 給面板的body元素指定自定義的CSS樣式信息
            bodyStyle : 'padding-top:6px',
            // 容器中元素的默認(rèn)類型
            defaultType : 'textfield',
            // 標(biāo)簽的默認(rèn)對(duì)齊方式
            labelAlign : 'right',
            // 指定標(biāo)簽的默認(rèn)長(zhǎng)度
            labelWidth : 55,
            // 標(biāo)簽與字段錄入框之間的空白
            labelPad : 0,
            // 窗口是否顯示背景色
            frame : true,
            // 容器中組件默認(rèn)統(tǒng)一配置選項(xiàng)
            defaults : {
            // 驗(yàn)證字段是否能為空
            allowBlank : false,
            // 字段寬度
            width : 158
            },
            // 指定容器中的元素
            items : [ {
                // 給元素添加CSS樣式
                    cls : 'user',
                    // 元素的名稱
                    name : 'name',
                    // 指定字段的標(biāo)簽
                    fieldLabel : '帳號(hào)',
                    // 為空時(shí)提示信息
                    blankText : '帳號(hào)不能為空'
                   
                }, {
                    cls : 'key',
                    name : 'pws',
                    fieldLabel : '密碼',
                    blankText : '密碼不能為空',
                    inputType : 'password'
                },{
                
 name: 'validateCode',
                    fieldLabel: '驗(yàn)證碼',
                    maxLength: 4,
                    width: 100,
                    style: 'font-size:14px;font-weight:bold;letter-spacing: 1px; background:url(validateCode.jsp); background-repeat: no-repeat; background-position: 40px 1px;center right no-repeat;',  //validateCode.jsp 是產(chǎn)生驗(yàn)證碼的圖片的JSP頁(yè)面
                    allowBlank:false,
                    blankText:'驗(yàn)證碼不能為空!'
                }
]
        });
    };
    var buildWin = function() {
        // 構(gòu)建一個(gè)窗口面板容器
        win = new Ext.Window( {
            // 把該面板綁定于wins這個(gè)DIV對(duì)象上
            el : 'wins',
            // 窗口面板標(biāo)題
            title : '登陸系統(tǒng)',
            // 窗口面板寬度
            width : 265,
            // 高度
            height : 165,
            // 該面板布局類型
            layout : 'column',
            // 面板是否可以關(guān)閉及打開(kāi)
            collapsible : true,
            //窗體拖拽 默認(rèn)是TRUE
            draggable: false,
            defaults : {
                // 容器內(nèi)元素是否顯示邊框
                border : false
            },
            items : {
                // 指定內(nèi)部元素所占寬度1表示100% .5表示50%
                columnWidth : 1,
                // 把表單面板容器增加入其中,使之成為窗口面板容器的子容器
                items : f
            },
            // 面板中按鈕的排列方式
            buttonAlign : 'left',
            // 面板底部的一個(gè)或多個(gè)按鈕對(duì)象
            buttons : [ {
                // 按鈕上需顯示的文本
                    text : '登陸',
                    // 單擊按鈕時(shí)響應(yīng)的動(dòng)作
                    handler : login
                }, {
                    text : '重置',
                    handler : reset
                }, {
                    text : '注冊(cè)',
                    handler : link
                }]
        });
    };
    // 單擊按鈕時(shí)執(zhí)行登陸操作
    var login = function(){
     if(f.form.isValid()){//驗(yàn)證合法后使用加載進(jìn)度條
          // 執(zhí)行當(dāng)前表單面板的submit
          f.form.submit( {
               // 動(dòng)作發(fā)生期間顯示的文本信息
                waitMsg : '正在登陸驗(yàn)證,請(qǐng)稍后...',
                // submit發(fā)生時(shí)指向的地址
                url : 'test.jsp',
                //發(fā)送參數(shù)
                // params:'{name='+f.name+'pws='+f.pws+'}',
                // 表單提交方式
                method : 'POST',
                // 數(shù)據(jù)驗(yàn)證通過(guò)時(shí)發(fā)生的動(dòng)作
                success : function(form, action) {
                       if(action.result.msg=='ok'){
                            window.location.href = 'MyJsp.jsp';
                         }
                },
                // 反之
                failure : function(form, action) {
                    reset();
                    if (action.failureType == Ext.form.Action.SERVER_INVALID)
                        Ext.MessageBox.alert('登陸失敗', action.result.errors.crying);
                }
            });
    }};
    // 清空當(dāng)前表單面板內(nèi)的數(shù)據(jù)
    var reset = function() {
        f.form.reset();
    };
    // 注冊(cè)按鈕指向的地址
    var link = function() {
        window.open('reg.jsp', '_blank')
    };
   
    return {
        init : function() {
         //使用表單提示
            Ext.QuickTips.init();
            Ext.form.Field.prototype.msgTarget = 'side';
            buildForm();
            buildWin();
            // 最后把窗口面板顯示出來(lái)
            win.show();
        }
    }
}();
// 當(dāng)當(dāng)前頁(yè)面DOM加載完畢后,在LoginPanel作用域內(nèi)執(zhí)行LoginPanel.init.
Ext.onReady(LoginPanel.init, LoginPanel);

 --------------------------------------------------------------------------

login.jsp如下:

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
  <style type="text/css">
  #loading-mask{
        position:absolute;
        left:0;
        top:0;
        width:100%;
        height:100%;
        z-index:20000;
        background-color:white;
    }
    #loading{
        position:absolute;
        left:45%;
        top:40%;
        padding:2px;
        z-index:20001;
        height:auto;
    }
    #loading .loading-indicator{
        background:white;
        color:#444;
        font:bold 20px tahoma,arial,helvetica;
        padding:10px;
        margin:0;
        height:auto;
    }
    #loading-msg {
        font: normal 18px arial,tahoma,sans-serif;
    }
  </style>
  </head>
  <body>
<!-- 加載效果 -->
<div id='loading-mask'></div>
<div id="loading">
    <div class="loading-indicator">
      <img src="ext/resources/images/default/shared/large-loading.gif" width="32" height="32" style="margin-right:8px;float:left;vertical-align:top;"/>
       <br/><span id="loading-msg">Loading ...</span>
    </div>
</div>
  <!-- 加載類庫(kù) -->
  <script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
  <script type="text/javascript" src="ext/ext-all.js"></script>
  <script type="text/javascript" src="login.js"></script>
  <!-- 退去加載效果 -->
  <script type="text/javascript">
     Ext.get('loading').setOpacity(0.0,{duration:1.0,callback:function(){this.hide();}});
     Ext.get('loading-mask').setOpacity(0.0,{duration:1.0,callback:function(){this.hide();}});
  </script>
   <!-- 登陸界面 --> 
 <div id='wins'></div>
 <!--  -->
 </body>
</html>

---------------------------------------------------------------------------

后臺(tái)測(cè)試 頁(yè)面 test.jsp 如下:

<%@ page language="java" pageEncoding="UTF-8" %>
    <%
    String name=request.getParameter("name");
    String pws=request.getParameter("pws");
     String validateCode=request.getParameter("validateCode");//驗(yàn)證碼
    System.out.println(name+"  "+ pws+"  "+validateCode+"  "+session.getAttribute("rand"));
    if("crying".equals(name)&&"123".equals(pws)&&session.getAttribute("rand").equals(validateCode)){
     out.println( "{success: true,msg:\'ok\'}");
    }else if(!session.getAttribute("rand").equals(validateCode)){
    out.println("{ success: false, errors: { crying: \'驗(yàn)證碼不正確!\'}}");
    }else{
     out.println("{ success: false, errors: { crying: \'用戶帳號(hào)或密碼不正確!\'}}");
    }
  %>


----------------------------------------------
產(chǎn)生驗(yàn)證碼圖片 validateCode.jsp 如下:

 <%@ page language="java" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"
     contentType="image/jpeg" pageEncoding="UTF-8"%>


<%  //設(shè)置頁(yè)面不緩存
   response.setHeader("Pragma","No-cache");
   response.setHeader("Cahce-Control","no-cache");
   response.setDateHeader("Expires",0);
   //在內(nèi)存中創(chuàng)建圖片
   int width=60,height=20;
   BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
   //獲取圖形上下文
   Graphics g= image.getGraphics();
   //生成隨機(jī)類
   Random random= new Random();
   //設(shè)置背景顏色
   g.setColor(new Color(160,200,100));
   g.fillRect(0,0,width,height);
   //設(shè)置字體
   g.setFont(new Font("Times New Roman",Font.PLAIN,18));
   //隨機(jī)產(chǎn)生50條干擾線,使圖形中的驗(yàn)證碼不易被其他的程序探測(cè)到
    g.setColor(new Color(160,200,200));
   for(int i=0;i<50;i++)
   {
     int x=random.nextInt(width);
     int y=random.nextInt(height);
     int x1=random.nextInt(width);
     int y1=random.nextInt(height);
     g.drawLine(x,y,x+x1,y+y1);
   }
   //隨機(jī)產(chǎn)生驗(yàn)證碼(4為數(shù)字)
   String sRand="";
   for(int i=0;i<4;i++)
   {
     String rand=String.valueOf(random.nextInt(10));
     sRand+=rand;
     //將驗(yàn)證碼顯示到圖象
     g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
     g.drawString(rand,13*i+6,16);
   }
   session.setAttribute("rand",sRand);  //////將產(chǎn)生的驗(yàn)證碼存儲(chǔ)到sesson中
   g.dispose();
   ImageIO.write(image,"JPEG",response.getOutputStream());
   out.clear(); //***********
   out=pageContext.pushBody();//**********
 %>