`

基于ExtJS-2.2实现的Ajax登录页面

阅读更多

最近对Acegi的改造比较感兴趣,所以基于Acegi和ExtJS做了一个Ajax的权限系统,此篇只讲述Ext登录页面的前台实现。如对Acegi的Ajax实现感兴趣可以参考我另外的Blog。如对此篇内容有疑问,请留言。

 

此篇Blog将由三部分构成:

  1. 实现的效果图

  2. 实现关键点的简要说明

  3. 完整的JS代码清单

 

如对代码部分感兴趣可以直接跳至此文结尾部分。

 

贴了几张效果图,毕竟看图说话比较方便哈。

 

Step01 - 登录窗口初始状态

Diagram01. 登录窗口的初始状态图

 

Step2 - 悬停在"RememberMe"上显示的提示

Diagram02. 悬停在"RememberMe"上显示的提示

 

Step03 - 必输项空值时校验的错误信息

Diagram03. 必输项空值时校验的错误信息

 

Step04 - 点击“校验错误”时的详细信息提示

Diagram04. 点击“校验错误”时的详细信息提示

 

 Step5 - 用户名的ComboBox效果图,记录了此前登录的用户名

Diagram05. 用户名的ComboBox效果图,记录了此前登录的用户名

 

Step06 - 登录页面整体效果

Diagram06. 登录页面整体效果

 

Step7- 点击“帮助”,显示的帮助信息,Json异步数据传递

Diagram07. 点击“帮助”,显示的帮助信息,Json异步数据传递

 

好,图归正传,现在就实现代码的关键部分做一下简要的说明。

 

登录框的实现,参考了Ext的Advanced StatusBar Example,现在说明下单选框的实现。此部分代码为CheckBox的实现,开始时简单的使用了CheckBox布局,但在IE浏览器下,CheckBox居中显示了,而且很难调整,后改用checkboxgroup来实现,在boxLabel中添加了< img >标签用来实现悬停显示提示的功能。

 

{
	                xtype: 'checkboxgroup',
	                fieldLabel: '记住我',
	                height: 20,
	                allowBlank: true,
	                items: [{
	                    boxLabel: '&nbsp;&nbsp;<img style="height: 10px;" src="../images/platform/icon/question_small_no_border.png" ext:qtip="勾选后,5日内无需登录" />',
	                    itemCls : 'required',
	                    id: '_acegi_security_remember_me',
	                    name: '_acegi_security_remember_me',
	                    inputValue: 'true'
	                }]
	            }

  

 

 

以下是完整得JS代码

/**
 * login.js Power by YUI-EXT and JSON.
 * 
 * @author seraph
 * @email seraph115@gmail.com
 */
 
var Login = { 
	author: "Seraph",
	version: "0.1.0"
};

var loginPanel;

Ext.QuickTips.init();

Ext.onReady(function(){
	
		var userNames = [];
	    var store = new Ext.data.Store({
	        proxy: new Ext.data.MemoryProxy(userNames),
	        reader: new Ext.data.ArrayReader({}, [{name: 'userName'}])
	    });
	    store.load();

		var loginFormPanel = new Ext.FormPanel({
	        id: 'login-form',
	        renderTo: Ext.getBody(),
	        labelWidth: 55,
	        frame: false,
	        bodyStyle:'background-color: #DFE8F6; padding-top: 25px; padding-left: 20px; border: 0px solid;',
	        defaults: {
	        	width: 230,
	        	anchor: '88%',
	        	allowBlank: false,
            	selectOnFocus: true,
	        	msgTarget: 'side'
	        },
	        defaultType: 'textfield',
	        method: 'POST',
			bodyBorder: false,
			border: false,
	        items: [
	        	{   xtype: 'combo',
	        		store: store,
					id: 'j_username',
	                name: 'j_username',
	                fieldLabel: '用户名',
	    	        displayField: 'userName',
	    	        valueField: 'userName',
	    	        typeAhead: true,
	    	        mode: 'local',
	    	        triggerAction: 'all',
	    	        selectOnFocus: true,
	    	        allowBlank: false,
	                blankText: '请输入用户名'
	            },{
					id: 'j_password',
	                name: 'j_password',
	                fieldLabel: '密&nbsp;&nbsp;&nbsp;码',
	                inputType: 'password',
	                blankText: '请输入密码'
	            },{
	                xtype: 'checkboxgroup',
	                fieldLabel: '记住我',
	                height: 20,
	                allowBlank: true,
	                items: [{
	                    boxLabel: '&nbsp;&nbsp;<img style="height: 10px;" src="../images/platform/icon/question_small_no_border.png" ext:qtip="勾选后,5日内无需登录" />',
	                    itemCls : 'required',
	                    id: '_acegi_security_remember_me',
	                    name: '_acegi_security_remember_me',
	                    inputValue: 'true'
	                }]
	            }
	        ],
	        buttons: [{
	                    text:'登录',
	                    handler: function(){
	                    	if(loginFormPanel.getForm().isValid()){
			                    var sb = Ext.getCmp('form-statusbar');
			                    sb.showBusy('登录中...');
			                    // loginFormPanel.getEl().mask();
			                    
			                    var rememberMe = null;
			                    if($('_acegi_security_remember_me').checked) {
			                    	rememberMe = $('_acegi_security_remember_me').value;
			                    }

			                    Ext.Ajax.request({
			             		   url: 'j_acegi_security_check',
			             		   success: function(response) {
			             		   		var messager = response.responseText.evalJSON();
			             		   		if(messager.success) {
						                    sb.setStatus({
						                    	text: '登录成功!', 
						                    	iconCls: '',
						                    	clear: true
						                    });
						                    // loginFormPanel.getEl().unmask();
						                    location.href = messager.contents.targetUrl;
			             		   		} else {
				             		   		sb.setStatus({
						                    	text: '登录失败! 原因: ' + messager.contents.error, 
						                    	iconCls: '',
						                    	clear: true
						                    });
				             				userNames.push(new Array([messager.contents.key]));
				             				store.reload();
						                    // loginFormPanel.getEl().unmask();
			             		   		}
			             		   },
			             		   params: {j_username: $('j_username').value, j_password: $('j_password').value, _acegi_security_remember_me: rememberMe, ajax: true}
			             		});
	                    	}
						}
	                },{
	                    text: '重置',
	                    handler: function(){
	                    	loginFormPanel.form.reset();
	                    }
	        		}]
	    });
	
		loginPanel = new Ext.Window({
			el: 'login-window',
	        layout:'fit',
	        title: 'BISP-登录',
			width: 300,
	        height: 200,
			resizable : false,
			closeAction: 'hide',
			items: loginFormPanel,
			iconCls:'login-win',
	        bbar: new Ext.StatusBar({
	            id: 'form-statusbar',
	            defaultText: '待登录',
				plugins: new Ext.ux.ValidationStatus({form:'login-form'})
        	})
		});
		loginPanel.show();
});

var LoginPanel = {
		
	show : function() {
		loginPanel.show();
	}
}

 

24
2
分享到:
评论
12 楼 hunnuxiaobo 2010-05-01  
ExtJS还是蛮强大的!
11 楼 leiwuluan 2009-10-17  
   
10 楼 Seraph115 2009-08-27  
alymail 写道
var messager = response.responseText.evalJSON();
非常想知道是什么值,我这边是跳转后的页面html


Messager是服务器返回的Java对象的json码,调用evalJSON()后json被转为javascript对象。
messager中写入了前台所需的响应,如跳转链接或错误消息
9 楼 alymail 2009-08-27  
var messager = response.responseText.evalJSON();
非常想知道是什么值,我这边是跳转后的页面html
8 楼 alymail 2009-08-27  
lz的messager是什么值,我得到的是页面的html代码.
7 楼 east_java 2009-07-31  
有源码下载就好了。。
6 楼 leon1509 2009-07-29  
是不是用了prototype?
5 楼 kirk1127 2009-07-28  
需要哪些js包能不能贴出来,最好能把源码共享下啊,呵呵
4 楼 Seraph115 2009-07-13  
jamix 写道
url:'j_acegi_security_check'
这是什么地址?新人...好奇的问下...


j_acegi_security_check这个是Acegi安全框架中的保留字,这个框架中还有大概4、5个保留字,链接指向的是鉴权过滤器,就是用来验证身份的,Acegi会调用Spring中配置的Acegi的bean。
3 楼 jamix 2009-07-13  
url:'j_acegi_security_check'
这是什么地址?新人...好奇的问下...
2 楼 jamix 2009-07-13  
NR...顶了...那么多代码从那写起???看API吗???
JS基础不大好...还是要先去啃JS去..
1 楼 hemin108 2009-07-04  
good ```

相关推荐

    extJs-2.2.zip

    ExtJS是一个基于JavaScript的开源用户界面库,专为构建富客户端Web应用程序而设计。这个"extjs-2.2.zip"压缩包包含了ExtJS 2.2版本的所有资源,包括JavaScript库文件、API文档和其他可能的示例或工具。在这个版本中...

    extjs-2.2开发框架

    ExtJS是一个基于JavaScript的开源用户界面库,专为构建富客户端Web应用程序而设计。这个"extjs-2.2"开发框架是该库的一个特定版本,发布于2008年,它提供了一系列强大的组件和工具,使得开发者可以创建功能丰富的、...

    ext-2.2.zip

    EXTJS是一个基于JavaScript的前端框架,它提供了丰富的用户界面组件和强大的数据管理功能,常用于开发交互式Web应用程序。 【描述】提到的情况反映了在某些在线平台上获取资源时需要积分的机制。这种机制可能是为了...

    ExtJS+2.2实现及应用连载.rar

    ExtJS是一种基于JavaScript的开源富客户端框架,专用于构建交互式、数据驱动的Web应用程序。在2.2版本中,ExtJS提供了丰富的组件库、强大的数据管理机制以及优雅的用户界面设计,使得开发者能够轻松创建复杂的桌面级...

    ext-2.2.rar extjs的相关及Ext2.2API中文版

    5. **Ajax通信**:EXTJS内置了Ajax通信功能,可以方便地与服务器进行异步数据交换,实现动态更新。 6. **可拖放功能**:EXTJS支持组件的拖放操作,可以创建高度交互的用户界面。 7. **主题定制**:EXTJS允许开发者...

    Ext_2.2_API(chinese).rar_Ext 2.2 API_ext js 2_ext-2.2 api_ext2.2

    Ext JS 2.2是一个基于浏览器的UI库,提供了大量的组件和工具,用于创建功能丰富的Web应用。这些组件包括表格、树形视图、菜单、窗口、表单、按钮、面板等,几乎涵盖了构建复杂前端界面所需的所有元素。通过使用Ext ...

    ext-2.2.rar

    ExtJS是一个基于JavaScript的开源用户界面库,专为构建富客户端Web应用程序而设计。这个"ext-2.2.rar"压缩包很可能包含了ExtJS库的2.2版本,这是一个在2007年发布的版本,当时它已经在Web开发领域积累了相当的用户...

    [上传下载]ExtJS 2.2 开源网络硬盘系统_dogdisk.zip

    这个开源网络硬盘系统_dogdisk.zip很可能是基于ExtJS 2.2版本开发的一个文件存储和管理应用,它允许用户通过Web界面进行文件的上传、下载、管理和分享。下面将详细介绍ExtJS 2.2的关键特性和在构建网络硬盘系统中的...

    上传下载ExtJS 2.2 开源网络硬盘系统-dogdisk

    在本项目中,dogdisk是一个基于ExtJS 2.2实现的网络存储解决方案,它提供了文件的上传和下载功能,为用户提供了一种在线管理其数据的方式。 【描述】中的"[上传下载]ExtJS 2.2 开源网络硬盘系统_dogdisk"进一步强调...

    extjs2.2 oozie可以使用的 1积分

    在描述中提到,"oozie需要使用extjs2.2",这意味着在Oozie的Web界面开发中,可能使用了ExtJS 2.2来构建用户界面。ExtJS的组件化和丰富的UI库为Oozie提供了一个直观且易于操作的图形化工作流设计器。用户可以通过这些...

    extjs2.2 框架下载

    5. **Ajax支持**:EXTJS 2.2强化了Ajax技术的使用,通过异步请求实现页面的无刷新更新,提升了用户体验。同时,它提供了强大的数据封装和处理能力,方便与服务器进行数据交换。 6. **可扩展性和可定制性**:EXTJS ...

    ExtJS 2.2 API文档

    ExtJS是一个基于JavaScript的开源框架,专为构建富客户端Web应用程序而设计。2.2版本是该框架的一个重要里程碑,提供了丰富的组件库、强大的数据管理功能以及优雅的用户界面。以下是对`ExtJS 2.2 API`文档的详细解析...

    ExtJS 2.2 开源网络硬盘系统-dogdisk.zip

    总的来说,dogdisk是一个基于ExtJS 2.2的网络硬盘系统,结合Java后端提供文件管理服务。理解其工作原理和技术栈,有助于我们分析、维护或升级这样一个系统,或者从中学习到前端与后端交互、文件管理系统设计等方面的...

    extjs2.2开发实战项目 已经发布运行

    3. **数据管理与AJAX**:EXTJS2.2内置了强大的AJAX通信机制,能与后台Java服务无缝对接,实现异步数据交换。项目中,EXTJS通过Store与远程服务器进行数据交互,实现了动态加载、排序、过滤等功能,大大提高了用户...

    extjs-ajax

    ### ExtJS-Ajax 相关知识点详解 #### 一、ExtJS 概述 ##### 1.1 架构特点 - **定义**: ExtJS 是一个功能强大的客户端 JavaScript 库,用于构建现代化、响应迅速的 Web 应用。它不仅支持 AJAX 技术,还能实现丰富的...

    EXTJS 2.2docs CHM格式 帮助文件

    EXTJS 2.2docs CHM格式帮助文件是一款专为EXTJS 2.2框架设计的离线参考手册。EXTJS是一种基于JavaScript的开源UI库,用于构建富客户端Web应用程序。此CHM(Microsoft Compiled HTML Help)文件包含了EXTJS 2.2版本的...

    extjs 2.2 简单资源

    4. **Ajax支持**:EXTJS内置了Ajax通信功能,可以轻松实现与服务器端的数据交互,支持JSON、XML等多种数据格式。 5. **图表和图形**:EXTJS 2.2虽然没有后来版本中的丰富图表,但依然提供了基本的绘图功能,可用于...

Global site tag (gtag.js) - Google Analytics