`
adamed
  • 浏览: 181462 次
社区版块
存档分类
最新评论

如何使用ExtJS构建应用系统

阅读更多
原文地址:http://blog.extjs.eu/know-how/writing-a-big-application-in-ext/
Writing a Big Application in Ext (Part 1)
12. April 2008 – 23:20

Preface
I have decided to write this article for those users of Ext 2.x that have already grown up from having one HTML page with embedded script that creates one simple window or form, for those who are already decided that Ext is the way and for those who are fighting with too long files hardly to search in and feeling that their applications need a structure.

The number of approaches to a problem and number of solutions of it is equal to number of people that tackle it. The way I am going to describe in the following text in not the only one and do not want to say that either an application is going to be written my way or it is not good. Nothing like that.

What I do want to say is that this approach is workable, neatly structured, easily maintable, simply stated: It works!



What is “A Big Application”?
If you have a Viewport with BorderLayout, a grid and a form all in one file it certainly is not the big application, right?. If you have tens of windows each with a grid, form or border layout in it in tens of files it certainly is the bit application, right?

(Germans have very nice word: Jein which is combination of Ja = Yes and Nein = No.)

The answer to both above statement is Jein. When the application becomes big, then? The answer is simple: It becomes big when you feel it is big. It is the point when you start to have troubles to orient yourself in number of files or in you have troubles to find a specific place in one file, when you cease to understand relations of components, etc. I am writing you here but imagine when a 2-3 grades less experienced programmer starts to have this feelings.

We can safely state that each application is big as also a small application deserves to be well written and it may likely become really big as we start to add new features, write new lines of code, new CSS rules, etc.

The best and the safest state of the mind at the start of a new application is: I’m starting the big application!



Files and Directories
These we need to organize first. There is always a ServerRoot directory configured in Apache or another HTTP server so all subdirectories I’ll describe later are relative to it.

Recommended directory structure:

./css (optionally link)
./ext (link)
./img (link)
./js
index.html


Link in the above structure means a soft link pointing to a real directory where files are stored. The advantage is that you, for example, download new Ext version to a real directory then you change the link above to point there and without changing a line in your application you can test if everything works also with this new version. If yes, keep it as it is, if no, you just change the link back.

css will hold all your stylesheets. If you have global stylesheets with company colors or fonts you can create css directory as link too.
ext link you your Ext JS Library tree as described above
img link to your images. It can contain icons subdirectory as well.
js will hold all javascript files the Application is composed of.
index.html HTML file that is an entry point of your application. You can name it as you want and you may need some more files for example for a login process. Anyway, there is one application entry point/file.
optionally you can create a directory or a link for your server side part of the application (I have ./classes). You can name it as you wish but consistently for all applications you write (./server, ./php are some good examples)


index.html
Minimal index.html file content is:

Code:
<html>   
<head>   
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
  <link rel="stylesheet" type="text/css" href="./ext/resources/css/ext-all.css">   
  <link rel="stylesheet" type="text/css" href="./css/application.css">   
  <script type="text/javascript" src="./ext/adapter/ext/ext-base.js"></script>   
  <script type="text/javascript" src="./ext/ext-all-debug.js"></script>   
  <script type="text/javascript" src="./application.js"></script>   
  <title>A Big Application</title>   
</head>   

<body></body>  
</html>  



Although you can do with the above file I would recommend to add a descriptive header to not only this file but to all files you create. Also an “End of file” marker has its value. See File Patterns for example of such headers.



application.js
We need a file where the onReady function will be placed; let’s call it application.js. Minimum content is:

Code:
// vim: sw=4:ts=4:nu:nospell:fdc=4    
/**   
* An Application   
*   
* @author    Ing. Jozef Sakáloš   
* @copyright (c) 2008, by Ing. Jozef Sakáloš   
* @date      2. April 2008   
* @version   $Id$   
*   
* @license application.js is licensed under the terms of the Open Source   
* LGPL 3.0 license. Commercial use is permitted to the extent that the   
* code/component(s) do NOT become part of another Open Source or Commercially   
* licensed development library or toolkit without explicit permission.   
*   
* License details: http://www.gnu.org/licenses/lgpl.html   
*/   
     
/*global Ext, Application */   
     
Ext.BLANK_IMAGE_URL = './ext/resources/images/default/s.gif';    
Ext.ns('Application');    
     
// application main entry point    
Ext.onReady(function() {    
     
    Ext.QuickTips.init();    
     
    // code here    
     
}); // eo function onReady    
     
// eof   





Your header and footer may vary but sure you need to set Ext.BLANK_IMAGE_URL to point to your server. This is path to 1×1px transparent image file that is used by Ext as an image placeholder and if it points to an invalid location you can get various rendering problems such as missing combo trigger images, missing icons or similar.

You may also need to create a new global object variable for your application (here it is Application).

What you need for sure is Ext.onReady that is the main application entry point – the place where you write your application.



css/application.css
You will put your css stylesheet to this file, if any. If you need only a couple of rules it may seem as unnecessary to create a separate file for them and it looks like the better idea to put them to <style> tags in the page head.

The reverse is true, remember you’re writing a big application, so everything has to have its place. If you put styles in the page head sooner or later you will solve some rendering problems and you won’t know where the styles are.



The wrong way
What normally follows when we have all basics in as we have at this point? Let’s begin writing. So we sit down and we start to write:

var vp = new Ext.Viewport({
layout:'border'
    ,items:[
        new Ext.grid.GridPanel({
            store:new Ext.data.Store({
                proxy:new Ext.data.HttpProxy({ ...


Wait a minute. This way we will have 10,000 lines in our application.js very soon and that is what we want last. Obviously, some step is missing as if we’re going to create such a big file why we couldn’t write it in index.html in the first place?



The right way: Break it apart
Even the most complex whole consists of smaller system which consist of smaller parts which consist of some elements. Your to-be-written big application is not an exception. Now it is the time to identify this parts, components and relationships between them.

So, sit down, think it over, draw a sketch, make a list, whatever but result has to be that you know the components, at least most important ones, your application will consist of.



Pre-configured classes
Now, that you are done with application analysis and identifying its components you can start to write the first one. But how? The best approach is to write extension classes of Ext components that have all configuration options, otherwise passed as the configuration object, built-in. I call such extensions pre-configured classes as they rarely add much functionality to base Ext ones but the main purpose of having them is to have them configured. For example, to have a “Personnel” grid with personnel specific column model, store, sorting options, editors, etc.

If we had such, our configuration of a Window could look like:

Code:
var win = new Ext.Window({    
     title:'Personnel'   
    ,widht:600    
    ,height:400    
    ,items:{xtype:'personnelgrid'}    
});    
win.show();   


Writing a pre-configured class
Let’s take an example to discuss:

Code:
Application.PersonnelGrid = Ext.extend(Ext.grid.GridPanel, {    
     border:false   
    ,initComponent:function() {    
        var config = {    
           store:new Ext.data.Store({...})    
          ,columns:[{...}, {...}]    
          ,plugins:[...]    
          ,viewConfig:{forceFit:true}    
          ,tbar:[...]    
          ,bbar:[...]    
        }; // eo config object    
     
        // apply config    
        Ext.apply(this, Ext.apply(this.initialConfig, config));    
     
        Application.PersonnelGrid.superclass.initComponent.apply(this, arguments);    
    } // eo function initComponent    
     
    ,onRender:function() {    
        this.store.load();    
     
        Application.PersonnelGrid.superclass.onRender.apply(this, arguments);    
    } // eo function onRender    
});    
     
Ext.reg('personnelgrid', Application.PersonnelGrid);    

 

What we’re doing here? We’re extending Ext.grid.GridPanel creating the new class (extension) Application.PersonnelGrid and we are registering it as the new xtype with name personnelgrid.

We are giving the general grid panel all the configuration options needed to become the specific personnel grid. From this point on we have a new component, a building block for our application that we can use everywhere (window, border panel region, standalone) where the list of personnel is needed. We can create it either as:

Code:
var pg = new Application.PersonnelGrid();    
     
// or using it's xtype    
var win = new Ext.Window({    
     items:{xtype:'personnelgrid'}    
    ,....    
});   


Organizing pre-configured classes
The code above does not need to and should not run within the onReady function because it has nothing to do with DOM structure; it only creates a new javascript object. Therefore it can and it should be written in a separate file (js/Application.PersonnelGrid.js) and it can and must be included in the index.html header as:

<script type="text/javascript" src="./js/Application.PersonnelGrid"><script>So far so good, we have almost everything in place and (almost) all we need to do more is to continue writing our pre-configured classes, put them in ./js; directory, include them in index.html and build your application from instances of them as puzzle is assembled from pieces.

Looks good, yeah?

Anyway, there is a bit more to it.



Inter component communication
Imagine that we need a border layout with a link list in the west and tab panel in the center region. Clicking a link in the west would create a new tab in the center. Now, where should we put the logic of it, event handler and creation routine? In the west, or in the center?

Neither of them. Why? If we have a pre-configured class that creates and displays the west link list and we put the above logic in it it can no longer exist without center region. We just cannot use it without center as then we have no component to create tabs in.

If we put it in center, the result is same: center cannot exist without west.

The only component that should be aware of the existence of both west and center panels is their container with the border layout and this is the only right place where to put inter-component communication.

What should we do then? The container (with border layout) should listen to events fired by the west and it should create tabs in the center as responses to these clicks. The example of the component communication written this way can be found here: Saki’s Ext Examples



Production Systems
As we keep on writing our application we happen to have large number of included javascript files very soon (I have around 80 includes in one application at present and this number grows every day). This can degrade performance of a production system.

The best way to solve it is to concatenate all javascript files in the right order to create one big and to minify it with some of the javascript minfying or compression tools. Also, you do not need debug version of Ext Library for production systems.

We would include:

ext-all.js
app-all.js and
application.js
on a production system.



Conclusion
It’s almost all there is to it… There are specific techniques for specific Ext classes, there is a lot of another server and client side know-how but the above is the overall concept.

Happy coding!
分享到:
评论

相关推荐

    ExtJS4+S2SH+Oracle9i开发电子商业汇票系统

    本教程主要讲述如何利用Struts2,Hibernate,Spring架构来构建企业级应用解决方案,前台用ExtJS展现主要分为两部分完成 第一部分介绍电子商业汇票系统业务。 第二部分,将实际应用(某银行-电子商业汇票系统)为例,...

    信息办公ExtJS 2.2 图书管理系统-bmsh.rar

    标题:探索ExtJS 2.2 图书管理系统:一款适用于毕业与课程设计的高效源码工具在追求高效信息管理和便捷用户操作的今天,基于Web的应用程序已成为软件开发的重要分支。特别是对于在校学生而言,一个功能齐全、界面...

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

    通过分析其源代码,学生可以深入了解如何使用JSP与ExtJS技术协同工作,提升前端与后端开发技能,并掌握构建复杂Web应用的实践经验。综上所述,Dogdisk不仅是一个功能强大的网络硬盘系统,更是一个学习和实践现代Web...

    [信息办公]ExtJS2.2图书管理系统_bmsh.zip

    项目的目标是构建一个高效、可靠、易于维护的Web应用程序。通过使用SSM或SSH框架,可以实现代码的模块化和解耦,提高开发效率和代码质量。MySQL数据库作为数据存储,可以提供稳定的数据存储和快速的数据查询。而JSP...

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

    项目的目标是构建一个高效、可靠、易于维护的Web应用程序。通过使用SSM或SSH框架,可以实现代码的模块化和解耦,提高开发效率和代码质量。MySQL数据库作为数据存储,可以提供稳定的数据存储和快速的数据查询。而JSP...

    spring-extjs-sample

    简单的 spring mvc 应用程序,带有引导皮肤和 extjs 网格组件和嵌入式 H2 数据库。 应用程序由三页组成。 主页以可排序的方式显示所有公司的员工。 其他两个页面显示来自部门 A 和 B 的员工。服务器存储依赖于带有 ...

    基于Spring4+SpringMVC+Hibernate5的燃气进销存管理系统.zip

    ④ 熟练使用 maven 构建工具。 ⑤ 站在企业的角度,试着搭建自己的一个底层基础框架。 ⑥ 建立完整的燃气管进销存管理系统,进行测试并分析结果。 ⑦ 将系统部署到互联网上,以实现真正的 Web 应用。 系统...

    基于ExtJS和SSH的Web应用架构的研究与实现 (2010年)

    为了构建更加动态,响应更加灵敏的Web应用程序,作者对基于AJAX技术的ExtJS框架进行了深入研究,提出了一种新的基于ExtJS+SSH的Web应用架构,极大地提升了Web应用程序的响应速度和用户体验,使服务器更加方便、快捷地和...

    MySQL技术实战开发CRM客户关系管理系统

    由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,...

    GitHub_Gist_API_Demo:使用 Ext JS 构建的演示应用程序,展示了 GitHub Gists API

    该应用程序使用 Ext JS 5.0.1 构建,并使用 Sencha Cmd &#40;5.1.0.26&#41; 搭建脚手架。 因此,原始项目自动生成留下了相当多的样板代码。 GitHub API 根据 Sencha 生态系统的最佳实践和普遍接受的架构,第三方...

    利用Ajax与ExtJS 改善用户体验

    从Ajax原理,ExtJS在OA型系统中的应用及性能调优出发,设计实现了三农电子商城后台管理系统,并探讨了ExtJS在基于B/S结构的OA型电子商务系统中对用户体验的改善。系统界面美观,操作方便,开发效率高,维护规范,...

    Log-viewer-syslog-extjs:系统日志查看 TCC

    sass 构建的支持代码(全局函数、mixin 等)日志/sass/src 此文件夹包含定义与应用程序的 javascript 代码构建中包含的类相对应的 css 规则的 sass 文件。 默认情况下,此文件夹中的文件映射到应用程序的根命名空间...

    个人账户管理系统.zip

     说明:项目采用composer依赖构建,框架采用ZendFramework2,表现层使用ExtJS 4.1.x,ORM采用Propel,项目借鉴J2EE三层设计模式(应用到了Service、DAO,并通过mnapoli/php-di-zf2进行依赖注入以更好的提高可测性)...

    支持桌面和移动的SPA框架RIAEasy.zip

    旨在实现RIA/SPA应用的快速、高质量开发,实现模块化开发,实现移动、桌面系统统一的跨浏览器开发。可以使用RIAStudio在线可视化设计器。 RIAEasy基于webComponent概念设计,包括一整套基础控件,具有良好的运行...

    magnificat-electron:一个使用Ext JS为Electron编写的简单音乐播放器

    壮丽的Magnificat旨在成为具有大量CD收藏的古典音乐发烧友的全功能编目应用程序。 我本打算使用Ext JS在Electron中编写它,但...): Sencha Ext JS 6.2.0 6.5.1+构建工具 6.11以上1.7.6+(通过安装)快速开始 $ git cl

    基于SSH2+Maven+EasyUI+MySQL技术实战开发易买网电子商务交易平台

    由于富客户端技术进一步扩展浏览器功能,使之提供更加高效和友好的用户接口,越来越多的企业和开发人员选择使用富客户端技术构建商业应用,本课程主要是介绍了解最流行的富客户端框架jquery - easyUI API及熟悉掌握...

    sencha-wysiwyg-editor:Sencha WYSIWYG编辑器,可让您编辑应用程序视图,源代码等-Source code editor

    选择一个框架/工具包(经典或现代)来构建您的ExtJS应用程序。 选择您的主题。 选择您的设备布局。 从基于模板的入门视图包中进行选择。 使用WYSIWYG编辑器直观地设计和创建视图: 工具箱(组件托盘): 可...

    gisapp:扩展QGIS Web客户端

    它将QGIS项目转换为带有查看,导航,搜索和打印数据的工具的Web和Mobile GIS应用程序。 最重要的是,还有一个PostgreSQL管理数据库,用于存储项目,层,用户以及一些不在QGIS项目中的特定设置。 数据库管理和项目...

    基于MVCS模式的组件化手机Web前端的研究与应用

    本文以MVC模型为架构,ExtJS组件为基础,数据存储(Store)为数据容器,构建了MVCS (Model-View-Controller-Store)模型,并以书籍信息系统为例,说明使用该模型完成组件化手机Web前端设计的方法和实现步骤,展示了...

    BAMS-JAVA快速开发框架 2.5

    BAMS 2.5 更新日志:2015-07-091、修复了日志无法输出的BUG,增加slf4j lo4j绑定,删除commons-logging,统一通过slf4j使用log4j2、更新 Excel的导入导出功能,使用SpingMVC代替Servlet接收请求,简化代码3、将Word...

Global site tag (gtag.js) - Google Analytics