D盘

workspace
posts - 165, comments - 53, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

可以从这个网站查询:http://www.ora-error.com/

可以参考这个文件:Oracle_Errors.zip

当然,也可以自己一个一个去试:)

posted @ 2008-12-22 16:37 巴西木 阅读(196) | 评论 (0)编辑 收藏

首先,在删除数据库用户时遇到了正在连接的用户,此时无法drop掉。

那么,是否可以强制断开连接呢?答案似乎是肯定的:
我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: 
alter system kill session ’sid,serial#’ ;  
对于kill session 的解释,可以参考:Oracle中Kill session的研究

有两个概念必须清楚:v$process的spid与v$session的process
 v$process
这个视图提供的信息,都是oracle服务进程的信息,没有客户端程序相关的信息
服务进程分两类,一是后台的,一是dedicate
/shared server
pid, serial# 这是oracle分配的PID
spid 这才是操作系统的pid
program 这是服务进程对应的操作系统进程名

v$session:
这个视图主要提供的是一个数据库connect的信息,
主要是client端的信息,比如以下字段:
machine 在哪台机器上
terminal 使用什么终端
osuser 操作系统用户是谁
program 通过什么客户端程序,比如TOAD
process 操作系统分配给TOAD的进程号
logon_time 在什么时间
username 以什么oracle的帐号登录
command 执行了什么类型的SQL命令
sql_hash_value SQL语句信息

有一些是server端的信息:
paddr 即v$process中的server进程的addr
server 服务器是dedicate
/shared

还有其它一些信息,可以理解为是client
/server共享的信息,主要是针对这个session而言的
 

了解了以上知识,可以通过下面的语句关闭指定用户的所有连接(将...put_line改为exec即可执行):
 1DECLARE
 2   u_sid  varchar2(50);
 3   u_serialnumber varchar2(50);
 4   u_name varchar2(50);
 5   CURSOR c1 IS select trim(s.sid),trim(s.serial#)
 6                              from v$session s,v$process p
 7                              where s.paddr = p.addr  and (s.username=u_name);  
 8BEGIN
 9    u_name:='TESTUSERNAME';
10   OPEN c1;  
11   LOOP
12      FETCH c1 INTO u_sid,u_serialnumber;
13      EXIT WHEN c1%NOTFOUND;
14      dbms_output.put_line('alter system kill session '||''''||trim(u_sid)||','||trim(u_serialnumber)||''';');
15      --exec('');
16   END LOOP;
17END;

断开连接后,用户可以被drop掉。

查看所有用户的连接:
1select s.username,s.osuser,s.program,s.MACHINE, s.sid, s.serial#, p.spid, 
2       'alter system kill session '||''''||trim(s.sid)||','||trim(s.serial#)||''';'
3from v$session s,v$process p
4where s.paddr = p.addr   and s.username is not null


posted @ 2008-12-22 16:01 巴西木 阅读(3978) | 评论 (0)编辑 收藏

困扰了好几天的问题居然这么容易就解决了哈。

程序中需要调用一个存储过程,这个存储过程的执行时间很长,而程序也并不需要得到他的返回值,为了使程序等待的时间不致于太长,就需要在存储过程执行结束之前停止调用。

开始,想在存储过程中控制,没有实现;
后来,想专门起一个线程,让他自己靠边执行,因为时间原因没有顾得上实现,也太麻烦;
再后来,小林提醒说网上有人说可以让存储过程主动超时;
最后,居然看到statment有这么个方法:setQueryTimeout(seconds)

哈哈,没想到,设置个超时时间为1秒,一秒钟以后就立刻返回了。



============
后记

第二天试验发现,其实根本就没有起作用,后来还是起了一个新的线程让他执行,唉,居然被欺骗了......

可是,为什么就不起作用呢?

posted @ 2008-12-17 18:25 巴西木 阅读(1887) | 评论 (0)编辑 收藏

首先,必须面对的现实是,不经修改的mfc程序是不能在linux下运行的,道理很简单,mfc的基石是windowsAPI,而linux上不可能有他。

那么mfc开发的程序就没办法在linux上重用了吗?下面这篇文章为我们提供了一种方法:
将 MFC 应用程序移植到 Linux

当然,如果你在编写软件的一开始就知道自己的程序需要运行在window和linux下,那么有人会建议你放弃mfc,而直接使用GTK+做为基础类库进行开发:
GTK+简介

关于MFC与GTK+的对比有此一家之言:
GTK+与MFC不完全对比

可以看到,MFC程序经过改造是可以移植到linux下的,不过,更直接的方法就是使用移植性强的类库,比如GTK+。

==========================摘录==========================

将 MFC 应用程序移植到 Linux

将 Windows 应用程序移植到 Linux 不必涉及再培训的痛苦经历。Markus Neifer 演示了如何使用 wxWindows 移植 MFC,指导读者使用 wxWindows 这一开放源码工具箱,并循序渐进地向读者介绍了一个完整的移植示例。

您可能仍然在维护用微软基础类库(Microsoft Foundation Classes(MFC))构建的旧的 Windows 应用程序,而现在却有客户要求 Linux 版本,该怎么办呢?在您的团队中可能有技术熟练的 MFC 开发人员,但如何达到加速 Linux 开发呢?别急;本文就是针对您这种情况而写的。依靠 wxWindows(一种用于 C++ 和 Python 的可移植 GUI 工具箱)的帮助,我将以多文档界面(Multiple Document Interface (MDI))文本编辑器为例向您演示如何将仅 Windows 的 MFC 应用程序移植到 Linux。类似这样的小型应用程序有助于我们将讨论集中在移植框架的具体细节上,从而避免我们迷失在代码的汪洋中。可以在本文后面的 参考资料一节中获取完整的 MFC 应用程序和 wxWindows 应用程序的源代码。

文档/视图概述

我将演示的应用程序使用众所周知的文档/视图体系结构,因为它可以象大多数应用程序一样处理文档。即使您的应用程序不使用文档/视图体系结构,我也建议您读下去。只要您已在转向这种框架,您就可能想要添加这项功能。

在我的关于 wxWindows 的 前一篇文章中,曾经指出过 MFC 和 wxWindows 之间具有某些相似性。字符串类 CStringwxString 和事件系统之间都非常相似。但还不止这些相似性。wxWindows 工具箱还提供对文档/视图体系结构的类 MFC 支持。

我将从核心类的比较开始。下表列出了两种框架的文档/视图体系结构所涉及的类。

表 1. 文档/视图类比较

MFC 类 wxWindows 类
文档(Document) CDocument wxDocument
视图(View) CView wxView
编辑视图(Edit view) CEditView n/a
模板类(Template class) CMultiDocTemplate wxDocTemplate
MDI 父框架(MDI parent frame) CMDIFrameWnd wxDocMDIParentFrame
MDI 子框架(MDI child frame) CMDIChildWnd wxDocMDIChildFrame
文档管理器(Document manager) n/a wxDocManager

除编辑视图类以外,每个 MFC 类都有其对应的 wxWindows 类。(最后一项中 MFC 的部分为空,因为 MFC 没有独立的文档管理器类。由应用程序类 CWinApp 内部处理文档。)下列 UML 图演示了这些类之间的关系:


图 1. MFC 类
MFC 类

图 2. wxWindows 类
wxWindows 类




回页首


应用程序

每个框架都提供一个表示应用程序本身的类。MFC 应用程序类声明了一个构造器、一个用于初始化的方法、一个用于事件处理的方法和一个消息映射表。您需要这个消息映射表声明和事件处理方法,因为应用程序的“about”对话框将由该类处理。


应用程序类:MFC
class CPortMeApp : public CWinApp
            {
            public:
            CPortMeApp();
            virtual BOOL InitInstance();
            afx_msg void OnAppAbout();
            DECLARE_MESSAGE_MAP()
            };
            

注:最初创建 MFC 应用程序时,我使用 Microsoft Visual Studio 所包含的应用程序向导来创建,但在我的代码片段中,我将不给出由向导生成的、有时会使人迷惑的注释( //{{AFX_MSG 及类似的东西)。完整的源代码,请参阅 ZIP 压缩文档。

对应的 wxWindows 类看起来略微有些不同。它也声明了一个构造器及一个用于初始化的方法,但却不需要任何东西来处理消息。如同您随后将看到的一样,在主框架类中处理“about”对话框。


应用程序类:wxWindows
class PortedApp : public wxApp
            {
            public:
            PortedApp();
            bool OnInit();
            int OnExit();
            protected:
            wxDocManager* m_docManager;
            };

正如下面所描述的那样,这个类需要一个 wxDocManager 属性来处理在初始化方法 OnInit() 中创建的模板。应用程序退出时,清理方法 OnExit() 将删除这个 wxDocManager 对象。

所有应用程序都需要其入口点(也称为 main()WinMain() )。在实现这一点的方法上,两种框架略微有些不同。在 MFC 中,象这样创建应用程序类的静态对象:

CPortMeApp theApp;
            

在 wxWindows 中,则象这样使用 IMPLEMENT_APP() 宏:

IMPLEMENT_APP(PortedApp)
            

如果对该宏所做的事情感兴趣,请查看头文件 wx/app.h 中它的定义,在可下载的源代码中找到该头文件。基本上,它是为所使用的平台插入适当的入口点函数。创建了应用程序类的对象之后,需要对其进行初始化。对于 MFC,Microsoft 建议不使用应用程序对象的构造器来初始化对象。而是应该使用其 InitInstance() 方法。要执行任何清理,请实现 ExitInstance() 方法。

虽然应用程序初始化有很多事情要做,这里我将只着重讨论与文档/视图有关的代码。要建立文档/视图框架, InitInstance() 方法必须创建一个 CMultiDocTemplate ,如下所示:


创建文档/视图代码:MFC
CMultiDocTemplate* pDocTemplate;
            pDocTemplate = new CMultiDocTemplate(
            IDR_PORTMETYPE,
            RUNTIME_CLASS(CPortMeDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CPortMeView));
            

wxWindows 应用程序提供 OnInit() 方法来做任何初始化工作,并提供 OnExit() 用于清理。要在 wxWindows 应用程序中建立文档/视图框架, OnInit() 方法必须象这样创建 wxDocTemplate


创建文档/视图代码:wxWindows
m_docManager = new wxDocManager();
            wxDocTemplate* pDocTemplate;
            pDocTemplate = new wxDocTemplate(
            m_docManager, "Pom", "*.pom", "", "pom", "Pom Doc", "Text View",
            CLASSINFO(PortedDoc),
            CLASSINFO(PortedView));
            

MFC 和 wxWindows 所做的事情基本上相同。框架需要关于哪个文档同哪个视图有关以及这个组合处理哪种文档的信息。类型包括文档的描述性名称以及这类文档的文件扩展名。两种框架都使用模板来处理这一问题(请注意这与标准 C++ 模板没有什么关系)。

MFC CMultiDocTemplate 也保存关于同文档相关联的子框架的信息,并且该模板被添加到管理该模板的应用程序对象中。wxWindows wxDocTemplate 额外需要一个管理模板的 wxDocManager 对象。请记住, wxDocManager 是 wxWindows 应用程序的应用程序类的一个属性。

完成文档/视图框架初始化之后,就创建了应用程序的主框架。在 MFC 应用程序的 InitInstance() 方法中,按如下创建一个主框架:


创建主框架:MFC
CMainFrame* pMainFrame = new CMainFrame;
            if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
            return FALSE;
            m_pMainWnd = pMainFrame;
            pMainFrame->ShowWindow(m_nCmdShow);
            pMainFrame->UpdateWindow();
            

调用 pMainFrame->LoadFrame(IDR_MAINFRAME) 从资源文件装入所有关于主框架的信息。

在 wxWindows 中,可以从资源文件建立菜单、对话框以及控件,或者可以在代码中创建它们。我更喜欢在代码中创建它们,但如果您愿意将代码同资源分离,就应该看一看 wxWindows 资源系统(请参阅 wxWindows 文档中的主题概述)。


创建主框架:wxWindows
m_mainFrame = new MainFrame(m_docManager, (wxFrame*) NULL, "DocView Demo",
            wxPoint(0, 0), wxSize(500, 400),
            wxDEFAULT_FRAME_STYLE);
            // Set up menu bar...
            m_mainFrame->SetMenuBar(menu_bar);
            m_mainFrame->Centre(wxBOTH);
            m_mainFrame->Show(TRUE);
            SetTopWindow(m_mainFrame);
            

在查看应用程序初始化完成后发生了什么事情之前,让我向您演示每个框架的文档和视图类。





回页首


文档

文档保存应用程序处理的基于文件的数据。它负责从文件装入该数据,并在必要的时候将该数据保存回文件。该 MFC 类的声明类似于这样:


文档类声明:MFC
class CPortMeDoc : public CDocument
            {
            protected:
            CPortMeDoc();
            DECLARE_DYNCREATE(CPortMeDoc)
            public:
            virtual BOOL OnNewDocument();
            virtual void Serialize(CArchive& ar);
            virtual ~CPortMeDoc();
            DECLARE_MESSAGE_MAP()
            };
            

请注意:该类有一个受保护(protected)的构造器。决不要直接创建该类的任何对象;相反,框架使用序列化来创建文档。因此,需要使用 DECLARE_DYNCREATE() 宏。wxWindows 类的声明类似于这样:


文档类声明:wxWindows
class PortedDoc : public wxDocument
            {
            public:
            virtual bool OnSaveDocument(const wxString& filename);
            virtual bool OnOpenDocument(const wxString& filename);
            virtual bool IsModified() const;
            virtual void Modify(bool mod);
            private:
            DECLARE_DYNAMIC_CLASS(PortedDoc)
            };
            

DECLARE_DYNAMIC_CLASS() 宏是必需的,因为 wxWindows 就象 MFC 一样动态地创建该类的对象。





回页首


视图

如果 MFC 应用程序处理文本文档,那么从 CEditView 派生视图类是一个好主意。该类已经在其客户机窗口内提供了基本的编辑功能和文本控件。这里我遵循自己的建议,MFC 视图类的声明类似于这样:


视图类声明:MFC
class CPortMeView : public CEditView
            {
            protected:
            CPortMeView();
            DECLARE_DYNCREATE(CPortMeView)
            public:
            CPortMeDoc* GetDocument();
            virtual void OnDraw(CDC* pDC);
            virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
            virtual ~CPortMeView();
            DECLARE_MESSAGE_MAP()
            };
            

在 wxWindows 中,(还)没有专门的编辑视图。但是创建您自己的编辑视图却很容易。只需在视图框架内有一个由 wxTextCtrl 派生的文本控件。视图类将控件和框架都当作类属性来处理。因此 wxWindows 声明类似于这样:


视图类声明:wxWindows
class PortedView : public wxView
            {
            public:
            MyTextCtrl* textsw;
            PortedView();
            bool OnCreate(wxDocument* doc, long flags);
            void OnDraw(wxDC* dc);
            bool OnClose(bool deleteWindow = TRUE);
            private:
            wxMDIChildFrame* CreateChildFrame(wxDocument* doc, wxView* view);
            wxFrame* frame;
            DECLARE_DYNAMIC_CLASS(PortedView)
            };
            

除了常见的用于窗口创建、窗口重画以及窗口关闭的事件处理程序之外,该类还有一个创建框架并填充其菜单栏的方法。

虽然拥有公共(public)属性不是一个好主意,但是为简单起见,我在这里还是这么做。在您的应用程序中应该避免这么做(我将在以后的版本中除去它)。





回页首


主框架

既然已经有了处理和显示数据的文档和视图类,并且也有了处理文档/视图框架的应用程序类,现在需要一个主框架类来同用户交互。同样,两种框架提供类似的功能,而实际实现有略微不同。MFC 主框架类将一个状态栏和一个工具栏作为属性保存,同时 MFC 主框架类还提供一些方法来处理窗口创建,以及声明消息映射表。请注意:该类是从 CMDIFrameWnd 派生而来的,因为该应用程序有一个 MDI 界面。


主框架类:MFC
class CMainFrame : public CMDIFrameWnd
            {
            public:
            CMainFrame();
            virtual ~CMainFrame();
            virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
            protected:
            CStatusBar  m_wndStatusBar;
            CToolBar    m_wndToolBar;
            afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
            DECLARE_MESSAGE_MAP()
            private:
            DECLARE_DYNAMIC(CMainFrame)
            };
            

wxWindows 主框架类将菜单作为属性保存,还具有创建其工具栏的方法,以及声明一个事件表外加一个处理应用程序的 about 对话框的方法。因为这个应用程序有一个 MDI 界面,所以该类是从 wxDocMDIParentFrame 派生而来。


主框架类:wxWindows
class MainFrame : public wxDocMDIParentFrame
            {
            public:
            wxMenu* editMenu;
            MainFrame(wxDocManager* manager, wxFrame* frame, const wxString& title,
            const wxPoint& pos, const wxSize& size, long type);
            void OnAbout(wxCommandEvent& event);
            void RecreateToolbar();
            private:
            DECLARE_CLASS(MainFrame);
            DECLARE_EVENT_TABLE();
            };
            





回页首


全部工作原理

移植完成了。我来回顾一下实现这一点所需做的事情。MFC 应用程序类(派生自 CWinApp )移植到派生自 wxApp 的应用程序类,包括初始化代码。将 MFC 文档类(派生自 CDocument )移植到派生自 wxDocument 的文档类。将 MFC 视图类(派生自 CView )移植到派生自 wxView 的文档类。除了这些同文档/视图有关的类之外,将 MFC 主框架类(派生自 CMDIFrameWnd )移植到派生自 wxDocMDIParentFrame 的类。

在其目前的版本中,该应用程序已经能够做很多工作。可以处理多个文本文件。可以打开、编辑并保存这些文件,并且应用程序保持最近打开文件的历史记录。如果不得不从头编写这些功能,那么将需要更多行代码 ― 更多行代码意味着要测试和维护更多行。在两种框架中,都使用了专门的命令标识符来处理常用的同文档/视图有关的命令。常用的文件命令是新建、打开和保存。常用的编辑命令是剪切、复制和粘贴。其它经常使用的命令有打印命令(这个应用程序中还没有实现该命令)和帮助命令。下表列出了这两种框架结构的文档/视图体系结构所包含的命令标识符。

表 2. 标准的命令标识符

MFC wxWindows
ID_FILE_OPEN wxID_OPEN
ID_FILE_CLOSE wxID_CLOSE
ID_FILE_NEW wxID_NEW
ID_FILE_SAVE wxID_SAVE
ID_FILE_SAVE_AS wxID_SAVEAS
ID_EDIT_CUT wxID_CUT
ID_EDIT_COPY wxID_COPY
ID_EDIT_PASTE wxID_PASTE
ID_APP_EXIT wxID_EXIT
ID_EDIT_UNDO wxID_UNDO
ID_EDIT_REDO wxID_REDO
ID_HELP_INDEX wxID_HELP
ID_FILE_PRINT wxID_PRINT
ID_FILE_PRINT_SETUP wxID_PRINT_SETUP
ID_FILE_PRINT_PREVIEW wxID_PREVIEW





回页首


窗口管理器

如果您对 Linux 开发真的很感兴趣,则可能已经做了一些研究,发现 Linux 上有不同的窗口管理器。曾经是 MFC 开发人员的您可能觉得这很奇怪。在进行 Windows 开发时,您无须操心不同的窗口管理器,因为只有一个窗口管理器。

开始 wxWindows 开发时,您可能想知道您的应用程序是否将运行在两个主流的窗口管理器 ― K 桌面环境(K Desktop Environment (KDE))和 GNOME ― 之上。我已经在 Microsoft Windows NT 4.0、使用公共桌面环境(Common Desktop Environment (CDE))的 Sun Solaris 2.6 以及使用 KDE 的 Linux 2.2 上使用了 wxWindows 工具箱,没有任何问题。由于 wxWindows 仅仅是一个建立在其它低级别 GUI 工具箱上的高级别层次,所以可以选择如何构建 Linux 应用程序。可以使用 Motif 版本(或者还要更好一些的,免费 Lesstif)或者 wxWindows 的 GTK+ 版本。GTK+ 是 GNOME 使用的基础窗口构件工具箱,但是它在 KDE 下也运行得非常好。我建议您使用 GTK+ 版本,因为它通常更新,有许多开发人员对它进行开发,而且有用户在使用它。因此,如果您希望获得更多帮助,则可以求助于邮件列表或新闻组,询问关于 GTK+ 版本的问题。

下面是前前后后的抓屏,可以让您对移植的应用程序有一个大致的认识。


图 3. 原始的 MFC 应用程序
原始的 MFC 应用程序

图 4. Windows 上的 wxWindows 应用程序
Windows 上的 wxWindows 应用程序

图 5. Linux/KDE 上的 wxWindows 应用程序
Linux/KDE 上的 wxWindows 应用程序




回页首


真实的故事

wxWindows 工具箱不只是书呆子的另一个玩具。它成熟、稳定,并且人们在实际应用程序中用它来解决实际问题。

wxWindows 项目创始人 Julian Smart 目前致力于 Red Hat,他已经将 eCos 配置工具(eCos Configuration Tool)移植到了 wxWindows。eCos 配置工具是一个配置 eCos 嵌入式操作系统的图形工具。人们已将最初的 MFC 应用程序移植到了 wxWindows,尤其是在 Linux 上(参阅 参考资料)。 SciTech Software 的人员也已经使用 wxWindows 来全部重新开发用于 SciTech Display Doctor 产品的前端 GUI。IBM 已经获得了 SciTech Display Doctor 的一个专门版本的许可证,IBM 现在将其作为 IBM 所有基于 OS/2 Warp 的操作系统(包括 Warp Client、Workspace On Demand 及 Warp Server for e-business)的主要显示驱动程序来分发。SciTech Software 对 wxWindows 社区做出了积极的贡献,它提交了扩展包 wxApplet、wxUniversal 和 wxMGL。使用 wxMGL,wxWindows 应用程序甚至可以运行在 DOS 和其它嵌入式操作系统之上,例如 QNX、RT-Target、SMX 等等。SciTech Software 全力资助 wxUniversal 和 wxMGL 项目(参阅 参考资料)。





回页首


结束语

本文演示了使用 wxWindows 工具箱将 MFC 文档/视图框架的 Windows 应用程序移植到 Linux 的基本原理。wxWindows 工具箱同 MFC 框架有一些相似性,从而帮助 MFC 开发人员可以达到加速 Linux 开发。有了这些基础知识,您应该能够将最棒的应用程序移植到 Linux。但不要忘了:wxWindows 不是只能用于 Linux。也许该是考虑在其它 UNIX 或者甚至 Macintosh 上来运行您的应用程序一个版本的时候了。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 从 Markus 的主页下载本文所演示的原始应用程序和移植的应用程序的 完整源代码


  • 有关 wxWindows 的概述,请阅读 Markus 的文章 细述 wxWindowsdeveloperWorks,2001 年 2 月)。


  • wxWindows 主页是 wxWindows 社区成员要去的主要场所。它提供关于 wxWindows 的信息及对它的支持,包括下载、邮件列表、样本应用程序以及与 wxWindows 有关的工具。


  • Coding with KParts讨论了 K 桌面环境(K Desktop Environment)图形组件的 KParts 体系结构( developerWorks,2002 年 2 月)。


  • 有关更多关于 K 桌面环境的内容,请访问 KDE 主页


  • 有关更多关于 GNOME 的信息,请查看 GNOME 主页


  • 在 Red Hat 站点上可以找到更多关于 Red Hat eCos 配置工具的内容。


  • 可以在 SciTech Software 站点上获取更多关于 SciTech Display Doctor的信息。


  • 可以在 OS/2 Warp 页面上找到更多关于 OS/2 设备驱动程序包(它使用 SciTech Display Doctor)的信息。


  • developerWorksLinux 专区里可以找到 更多 Linux 文章


关于作者

Markus Neifer 最初使用 LOGO 教学语言来编程,后来他使用过多种 BASIC 语言。在研究地理信息学期间,他学了一些 C,但很快又转向了 C++ 和 Java,因为这两种语言具有面向对象的本质。他曾在研发领域工作过,期间他出版过关于科技软件的面向对象开发的文章。目前,他是地理信息系统领域的软件工程师。可以通过 howlingmad@users.sourceforge.net和 Markus 联系。




GTK+

  最初,GTK+ 是作为另一个著名的开放源码项目 —— GNU Image Manipulation Program (GIMP) —— 的副产品而创建的。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 创建了 GTK(它代表 GIMP Toolkit),作为 Motif 工具包的替代,后者在那个时候不是免费的。(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号。)
  这差不多已经 10 年过去了。今天,在 GTK+ 的最新版本 —— 2.8 版上,仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过现在它已经不是惟一的使用 GTK+ 的程序了。已经为 GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce 和 GNOME)用 GTK+ 为用户提供完整的工作环境。
  为什么使用 GUI 工具包?
  使用 GTK+ 这样的库比起编写自己的 GUI 代码来有多个优势。例如,它可以显著节约开发时间,让开发人员把精力集中在项目真正重要和真正独特的地方,而不必重复公共的功能。对于用户来说,这意味着他们使用的应用程序之间具有更好的一致性:工具包能在哪使用,应用程序就能跟到哪里。就像使用 LEGO 一样,所有的人都使用同一兼容尺寸这一事实,意味着设计可以在使用库的人之间共享,不论他们在哪里使用它。
  在现实中,现代的 GUI 工具包做的工作不仅仅是避免重复。它们提供了许多高级功能,用户希望在他们的应用程序中拥有这些功能,但是用别的方法得不到这些功能,因为在这类工具包上所投入的时间和工作,要远远超过在单一应用程序上的花费。所以,如果在应用程序中使用 GUI 对您来说很重要,那么请使用工具包。除此之外别无他法。现在剩下的惟一问题就是,应当使用哪个工具包?
  GTK+ 的优势
  不论开发的需要是什么,GTK+ 可能就是您正在寻找的答案。GTK+ 提供了许多东西:
  它既现代,而且得到了积极的开发与维护,围绕它有一个充满活力的社区。
  它提供了广泛的选项,用于把工作扩展到尽可能多的人,其中包括一个针对国际化、本地化和可访问性的完善的框架。
  它简单易用,对开发人员和用户来说都是这样。
  它的设计良好、灵活而可扩展。
  它是自由软件,有一个自由的开放源码许可。
  它是可移植的,从用户和开发人员的角度都是这样。
  现代的且开发积极的工具包
  GTK+ 是采用软件开发中的最新技术开发的,只要发现缺陷(肯定有缺陷,因为没有任何软件是完美的),开发人员就会尽力在下一版本中修补缺陷。使用现代的软件意味着,您不会陷在过时的工作中,而跟不上时代的发展。
  持续的维护和开发也意味着您拥有影响工具包的未来发展方向的能力。另外,在出现新的发行版时,会引入基于用户反馈的新特性和新功能,而旧的问题则得到修补。
  国际化、本地化和可访问性
  在创建要让所有人使用的软件的时候,请记住三个关键字:国际化、本地化和可访问性(通常分别缩写为 i18n、l10n 和 a11y)。
  国际化 是将程序准备为被母语不是开发应用程序所采用的语言的人使用的过程,所以应用程序不依赖于对任何特定语言的任何假设。
  i18n 远远不只是对程序使用的文本进行翻译。它还意味着要考虑所使用的不同脚本和字母表、不同的编写方向、显示许多语言所需要的特殊处理以及为用户提供输入文本的适当方法。不是每种语言都可以简单地把每个字母映射到键盘上的不同键,而且还必须实现更好的复杂性,例如确保在错误消息中使用正确的复数。
  本地化 与 i18n 密切相关,因为为国际用户准备应用程序不仅仅是改变语言。程序还必须能够理解并尊重日期、货币显示、数字标注、文本排序所使用的不同习惯,以及许多可能不太注意的细节之处 —— 例如有些符号的使用,在世界的不同地方可能会被认为是不恰当的或无礼的。
  正像 i18n,正确的 l10n 要求在代码中添加很多东西,而这些是事后很难轻松加入的。GTK+ 提供了针对 i18n 和 l10n 的恰当工具,会让代码(和二进制)可以在许多语言和地域上不加修改地运行。切换地域所需要的就是随操作系统(针对 l10n)或者一个可独立于实际的程序进行处理和发布的翻译文件(针对 i18n)一起发布的一组数据。带来的灵活性会得到开发人员、翻译者和用户的热爱。
  可访问性 是让每个人都可以使用您的程序。有些用户的视力不佳,有些人可能不能用键盘或鼠标,而有些人可能只能移动他们的眼睛。要确保每个想使用您的应用程序的用户都能使用,需要做许多工作。幸运的是,GTK+ 提供了一个途径,可以通过一个完善的预先存在的 a11y 框架,立即得到这方面的支持,而您这边几乎什么工作也不需要做。使用这个框架(它是 UNIX® 系统上的事实标准),可以把应用程序带给各类用户。
  您也能享受 a11y 的许多优势 —— 例如执行自动 GUI 测试的能力。通过让特殊需求用户运行的可访问性软件可以使用您的应用程序,您也可以让测试软件可以访问它,例如,检查行为是否正确 —— 这在传统的 GUI 编程中会带来严重的问题。(还值得记住的是:现在,a11y 不再被当作 “好” 东西。许多法规 —— 例如有关美国政府用软件的规则 —— 实际上要求软件对特殊需求的用户有恰当的支持。)
  以上三点可能是使用工具包的充足理由 —— 特别是 GTK+,它在这三个领域都有优秀的支持。这个支持绝不完美,但在同类软件中是最好的,而且把这些关键字整合进应用程序的重要性并没有提到应有高度。在今天的世界中,计算机无处不在,用户众多而且独特,所以不能认为一个遗漏一整群用户的应用程序是一个完整的产品。
  简单易用
  这一点应当很明显,但是它实际上含义丰富。工具包对用户应当容易,这样才有可能创建简单的、直觉的和乐于使用的界面,哪怕针对的是新手。创建人机交互的正确模型不是一项简单的任务,GTK+ 正是长时间工作的结果,而且是众多的甚至困难的决策的结果。
  GTK+ 对于开发人员也易于使用。它允许开发人员用简单的方式说出自己想要的东西,不会用所谓正规方式给开发人员带来负担,这些正规方式是计算机为了弥补它们固有的缺乏想像力的缺陷而施加给人类的负担。
  设计良好、灵活和可扩展
  编写 GTK+ 的方式允许在不扭曲基本设计的情况下,让维护人员添加新功能、让用户利用新功能。工具包也是可扩展的,这意味着可以向其中添加自己的块,并用使用内置块一样的方式使用它们。例如,可以编写自己的控制元素,比如说用于显示应用程序处理的科学数据,并让它正确地遵照用户选择的显示风格,就像 GTK+ 自身的控件那样。
  更进一步,GTK+ 是可定制的,这样就可以让它适应自己的需求。GTK+ 有一个系统,可以在所有应用程序之间复制设置,包括主题的选择。主题 是一组一同发布的定制设置,会影响 GTK+ 使用的基本控件看起来的效果,甚至某种程度上的行为方式。使用主题,可以(例如)模拟另一个操作系统的观感。
  带有自由开放源码许可的自由软件
  自由软件 意味着每个人不仅可以自由地获得和使用这个工具包,还可以在满足某些条件的情况下修改并重新发布它。自由开放源码许可 意味着这些条件不是严格限制的,可以得到的自由程度是显著的。最重要的是,GTK+ 采用了 Lesser General Public License (LGPL) 许可,这是 GNU 许可家族中一个不太严格的许可。LGPL 允许自由地获取、修改和发布它覆盖的任何软件,只要对修改也保持自由即可。LGPL 还允许任何人使用该库提供的功能,而不 要求用户公开应用程序代码。(这对于许多工业应用来说很重要,因为由于以前的协议或许可,这种场合下一般不希望公开代码或者公开代码是显然不现实的。)使用 LGPL 许可,您既可以是开放源码社区的好伙伴也可以是好公民。
  可移植
  最后(但并不是最不重要),GTK+ 是可移植的。这意味着用户可以在许多平台和系统上运行它。另一方面,开发人员可以把软件提供给众多用户,却只要编写一次程序,还可以使用许多不同的编程和开发平台、工具和编程语言。所有这些都可以理解为更多的潜在用户,您可以利用更好地满足需求的更广泛的技能和工具。
  所有这些优势组合在一起,让 GTK+ 成为软件开发的坚实基础。有了它,就能够把注意力集中在解决实际问题上,而不必重新发明轮子,而且您也可以确信创建的应用程序会按照用户预期的方式运作、解决他们的问题,而不必创建新的应用程序。



GTK+与MFC不完全对比

    MFC已经江河日下,日渐式微,而GTK+可谓欣欣向荣,如日中天。这里无意于落井下石,痛打落水狗,贬MFC而尊GTK+。自己即在使用MFC也在使用GTK+,不会偏袒其中之任何一方。这个对比完全出于个人对两者的理解,说它是不完全对比,一方面只是一时兴起想做个笔记而已,另外一方面我对两者的理解也是有限的。

 

1.         两者都是基于面向对象设计的。尽管MFC是用C++写的,而GTK+是用C写的,但思想都是面向对象的。GTK+使用glib的对象机制,由于用C写的,其实现相对有点繁琐。

 

2.         两者都是基于消息驱动的。这是GUI系统的共性,消息可以是硬件上报的,如鼠标事件、键盘事件和触摸屏等等,也可以是程序产生,如一个窗口给另外一个窗口发送了一个消息。但两者并不完全相同,GTK+通过select挂在多个文件描述符上,可以同时等待多个事件源,比如socket、子进程退出和内核事件等等,而MFC只能通过GetMessage挂到消息队列上。

 

3.         两者都不是线程安全的,即只有一个线程可以操作GUI资源。主要是出于性能的考虑,这个问题不大,因大多数应用程序都是单线程的。而且它们都提供一些机制,让其它线程可以在必要时操作GUI资源。在GTK+中可以通过idle函数来实现,在MFC中可以通过PostMessage来实现(附带说明一下:Win32原生的GUI API是线程安全)

 

4.         GTK+整合了一系列的基础函数库,功能强大,而MFC孤军做战,势单力薄。GlibGTK+的基本库,里面实现了常见的容器和算法,可谓应有尽有,同时隔离了平台相关的功能。PangoGTK+用于文字渲染的函数库,它负责控制不同文字的layout布局,而把字模的绘制交给freetype等字体函数库处理。MFC虽然实现了一些容器,但数量不多也不好用,除了对原生GUI API的包装外,没提供多少其它功能,与Microsoft Foundation Class Library这个名称一点都不相称。

 

5.         GTK+是跨平台的,而MFC则不是。GTK+在设计时就考虑了可移植性,它按分层模型来组织整个系统,Glib封装了依赖于OS平台的函数,提供一套抽象的接口,在不同的平台有不同的实现。GDK封装了依赖于输入/输出设备的功能,如键盘事件的获取和显示缓冲的输出,同时实现了基本的绘图功能。GTK+几乎可以在所有PC平台下运行,而MFC从来都没有考虑过可移植性,它是与Win32 GUI绑定在一起的。

 

6.         GTK+小巧,而MFC笨重。GTK+编译出来的可执行文件约3M左右,而MFC本身虽然不大,但它各种版本加在一起就可观了。MFCansi版本、有unicode版、有debug版、有release版、还有一些组合,如果你因此而晕倒了,那是很正常的。

 

7.         GTK+的使用简单,MFC的使用繁琐。GTK+的使用比较简单,即使在没有工具的帮助下,要写一个GTK+的应用程序也不难,实际上绝大多数GTK+应用程序都是一行代码一行代码的敲出来的。而MFC的使用则太麻烦了,很难想象没有VC的向导的帮助,写一个基于MFC的应用程序。即有了VC的向导,仍有大量的程序员说MFC很难用。

 

8.         GTK+使用signal机制,解开消息源与消息目标之间耦合。而MFC使用消息,将消息源与消息目标硬编码在一起。Signal的好处是,不需要知道目标是谁,谁关心谁就注册,这种出版订阅机制是解耦的最佳方式。而MFC的消息则是必须知道目标是谁,把消息源与消息目标死死的绑在一起。MFC提供了一套文档/视图框架,实现了类似出版订阅的功能,这本是设计者引以自豪的东西,结果因为太复杂不能被人理解,反而为开发人员所诟病。

 

9.         GTK+采用layout机制动态计算各子窗口的坐标位置,自适应屏幕大小的变化。而MFC要求子窗口的坐标位置硬编码,结果要适应不同分辨率的屏幕非常困难。GTK+在窗口布局时分为两个阶段,第一个阶段父窗口先询问子窗口的最佳大小,第二个阶段父窗口根据自己的大小计算子窗口的实际大小,子窗口根据实际大小进行调整。

 

10.     GTK+采用容器机制来合理分离控件的职责,MFC没有容器这个概念,很难实现递归组合。GTK+中差不多所有控件都是容器,都可以容纳其它任何控件,而MFC只有顶层窗口才是容器,可以容纳其它子控件。容器这个概念对代码重用的影响非常之大,这里举两个例子:其一是带图片的按钮(BitmapButton),在GTK+中它就是GtkImageGtkLabel的组合,而在MFC中,图片和文字都要自己绘制。前者的GtkImageGtkLabel可以在很多地方重用,而后都的绘制代码和事件处理代码只有自己才能使用。其二是列表框,在GTK+中,它只是一个容器,你可以向里面放编辑器、下拉框和其它任何者你想得到的控件。而在MFC中,即使只是实现一个不同外观的列表框,你都要采用自绘的方式,代码重用非常困难,向列表框中加入其它控件就更麻烦了,要使用一些非同寻常的手段不可。

 

11.     GTK+采用容器机制优先使用组合而不是继承,符合现代设计的原则。MFC强制使用继承,使用麻烦而且耦合紧密。GTK+应用程序不需要继承任何窗口。MFC应用程序必须继承对话框或者其它顶层窗口才行,虽然可以采用中介者模式,把控件之间的交互集中在顶层窗口中,不需要继承控件,但仍然很麻烦。


posted @ 2008-12-17 09:54 巴西木 阅读(1563) | 评论 (0)编辑 收藏

这几天偶尔会碰到ecside的问题,零零碎碎碰下来也对他有了一点了解,有些问题从网上搜到了答案,有些问题绕开了解决。不过,总的来说,ec还是一个不错的作品,虽然原作者已经改为开发一个新的替代产品。
下面是从网上转载的资料,可以用来参考:
http://blog.sina.com.cn/s/blog_4b22130e010009b5.html~type=v5_one&label=rela_prevarticle

1.使用方法:
ec:table标签内 增加
listHeight="数字" 属性 (指定列表体的高度)
同时把要指定 width="数字" 不能省略 同时要使用绝对大小而不要使用百分比

 

请教楼主,下了你的代码试了一下,如果把默认DEFAULT_PAGE_SIZE改为别的数字,比如每页显示5条,分页错误,点击下一页,显示还是10条,

你的jsp页面里的 ec:table的 rowsDisplayed 属性也要修改 改为5

 

 

bjwulin 写道

fins 写道


没太看明白  :(

reload第一个表格 你是在怎么reload的??

我描述不清楚,这样说吧,如果表格有21条数据,每页10条,现在在第三页,如果我在数据库里面手工删除1条数据,然后调用EcUtil.reload(...)的话,怎么让它显示第二页的数据。因为我在后台得到的还是pageNo=3

我不明白的就是
为什么"后台得到的还是pageNo=3"??

你后台是怎么计算页数的?
我怀疑可能是你没有调用EccnUtil.refresh(...)
如果数据数目发生变化了
建议 先
EccnUtil.refresh(...)

EccnUtil.reload(...)

 

 

1)     实现了灵活的可定制的“可编辑列表”功能 (详见help.txt 200行左右的描述 以及示例)
支持多种编辑方式(文本框 下拉框将来还会支持更多),可自定义模版(使用自定义的文本框下拉框),还提供了:
对可编辑列进行标识,对编辑过的cell进行标识(默认为改变单元格背景色),
使用ajax技术提交后台,提交成功的cell将清除编辑标识等贴心设计。
2) 增加了 高亮显示选种行的功能,使用 ec:table属性: selectlightRow="true"
3) 去掉了 fullnavigation导航条,将其与navigation导航条合并
改为为ec:table增加属性 nearPageNum="数字" 用来设置导航条前后显示的邻近页数 等于0时 为不使用邻近页。
4) 为ec:table增加了 maxRowsExported="数字" 属性,用来限制导出大最大条数,如果数据超过这个数目,则不执行导出操作。
5) 为之前增加的ec:table的pageSizeList属性 增加了特性
pageSizeList="max:200,10,15,30,50,100,all" 如果 10--100以及all中,某一项大过了max的200则不在列表中显示。
也可以只使用pageSizeList="max:200" 此时将使用默认设置,并进行max控制。
6) 解决了pdf中文编码问题,终于支持pdf导出了。
7) 恢复了对sitemesh的支持,用法见原版ec文档(我没有亲自没有测试,因为我不会用sitemesh )。
8) Ajax翻页优化,同时增加了 ECSide.findAjaxZoneAtClien 属性,可设置客户端 还是 服务端进行 html代码剪裁。
默认推荐使用 服务器端。
9) 再次对js和java代码进行了较大规模的重构,清理了一些无用代码,添加了必要的协议信息。
10) 还有一些细节的修改(例如对滚轮的支持更自然) 和对一些小bug的修正,但是由于变化较大,肯定还会带来一些新bug。
11) 整个示例的应用逐步发展为 ecside 的最佳实践,加入了hsqldb(hsqldb的使用参考了springside),全新的例子。
当然还不够好 会在以后的日子里继续完善。
12) 做了一个简单的logo 。

 

 

使用方法:
ec:table标签内 增加
listHeight="数字" 属性 (指定列表体的高度)
同时把要指定 width="数字" 不能省略 同时要使用绝对大小而不要使用百分比

 

 

 

smalldeer 写道

一直关注ecside,谢谢你们的无私奉献,真的增强好多。
有一个问题请教,我在一个页面中,要使用2个表格,
如果不写request.setAttribute("totalRows", new Integer(rowc));
就会报 You need to specify the totalRows (as an Integer) to use the org.extremecomponents.table.callback.LimitCallback.
如果写,但是有2个table,参数只有一个totalRows,我如何为2个表格分别指定它的totalRows呢

请教一下,十分感谢。

说来惭愧啊
我虽然一直在研究ec的代码 并做出改造
但是 有几个地方我一直没有深入的涉及
其中就包括 同一叶面显示多表格的设计

因为我一直认为这不是一个好的实现方式

其实代码是这样的
他先去找 tableId+"_totalRows"
找不到了 才去找 totalRows
我的那个例子对你有误导 我的错

 

ecside介绍:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ecside是一个开源的列表组件。

他源自著名开源列表组件 eXtremeComponents (http://www.extremecomponents.org),

但现在已经脱离eXtremeComponents,独立发展(仍有大量代码来自 eXtremeComponents)。

由于各种协议和各种授权的问题,目前还不能独立成为一个开源项目,但“做最实用易用的列表组件”是ecside最终的目标。

作者: fins ( name: Wei Zijun    email:fins@163.com   blog:http://fins.javaeye.com )

 

(详见readme.txt)

 

 

 

基础功能的使用请参考 eXtremeComponents 官方网站(http://www.extremecomponents.org)的wiki(有中文版)

 

增强的功能简介:

 

ec:table属性增加  toolbarLocation

 用来控制工具条在上还是在下显示

 可选值 "bottom" "top" "none"(不显示)

 

 

ec:table属性增加  toolbarContent

 可自定义工具条显示那些内容,以及排列顺序

默认: toolbarContent="navigation|pagejump|pagesize|export|extend|status"

例子    toolbarContent="pagejump|navigation|export|extend|status"

此时 工具条将不显示"页面行数调整"框同时顺序也会和默认的发生变化

 

navigation 导航条

pagejump 页面跳转

pagesize 页面行数设置

export 导出按钮区

extend 自定义扩展区

status 数据信息区

 

同时 为ec:table增加属性 nearPageNum="数字",

用来设置导航条前后显示的邻近页数,不设置将使用默认值,设置为0则不显示邻近页

 

ec:table属性增加  pageSizeList

可用来设置“页面行数选择列表”中的具体数值

默认:pageSizeList="10,20,50,100,1000,2000,all"

其中的all为增加全部显示功能。

例子   pageSizeList="10,20,50"

此时列表里将只显示 10 20 50供选择

max:数字 特性 :

pageSizeList="max:200,10,15,30,50,100,all"

如果 10--100以及all中,某一项大过了max的200则不在列表中显示。

也可以只使用pageSizeList="max:200" 此时将使用默认设置,并用max限制。

 

 

 

4 ec:table属性增加 xlsFileName  和 pdfFileName

用来快捷的实现导出xls文件

如果你只是想使用默认的方式导出 xls 和 pdf文件 不用再使用 ec:exportXls  ec:exportPdf标签了

直接在ec:table里使用这个属性就ok.

使用方法 xlsFileName="文件名.xls"

 

 

 

ec:table属性增加  showPrint

显示打印按钮,该功能只能在ie 5.5以上浏览器中使用没有使用第三方组件 使用了ie内置组件

使用方法: showPrint="true"

打印按钮将作为导出的一种类型而存在

 

 

 

6 ec:table属性增加  resizeColWidth 和 minColWidth

默认:  resizeColWidth="false"  minColWidth="20"

用来实现手动调节列宽的功能 在ie 5.5+ 和ff 2.0下测试通过

resizeColWidth="true" 实现列宽调整

minColWidth="20" 调整时列的最小宽度

目前不能和过滤功能一同使用(当filterable="true"时候不可以用)

 

 

7 为ec:row 添加更多的html事件支持,现支持:onmouserover onmouserout onclick ondbclick

 

8 为ec:column 添加更多的html事件支持,现支持:onmouserover onmouserout onclick ondbclick

 

9 为ec:table ec:row ec:column 增加了 tagAttributes属性

该属性用来为元素增加一些自定义的html属性

例如  ec:column 现在并不支持  onmouseup事件

可以通过下面的方式实现

 

<ec:column tagAttributes="onmouseup=\"alert('test mouse up');\" " .......

 

 

10 ec:column属性增加 ellipsis

实现单元格内数据过长的时候 自动截短并加"..."的功能 ie only

因为ff不支持 text-overflow: ellipsis;

使用 ellipsis="true"

使用时 还要为ec:table加上 style="table-layout:fixed;" (如果您已经使用了调整列宽功能 则不用添加)

 

11 ec:column属性增加  headerSpan

实现表头的跨列显示

使用

<ec:column  headerSpan="2" ...

<ec:column  headerSpan="0" ...

注意当把 一个column 的 headerSpan=设置为 n的时候

那么他下面的 n-1个 column 的 headerSpan 一定要为 0 (这个以后会想办法修正现在这么处理太麻烦了)

 

 

12 ec:column属性增加  calcSpan

 实现统计行的标题跨列显示

 使用 

 <ec:column  calc="total" calcTitle= "合计" calcSpan="2" ....

 

 

 

 13 增加 ec:extendrow 标签

在列表前/后加一行或多行 取决于你的html代码怎么写因为这个是绝对自由的 连tr标签都要自己写

 before="true"  (true top false(默认))

 当 before="top"的时候 所加行会出现在 列表表头的上面

 这样你可以做多行表头了  (但这时候 不支持列宽调整 想支持需要自己做些动作详见示例文件demo2.jsp)

例如

    <ec:extendrow before="true">

    <tr>

    <td style="background-color:#ffeedd" >*列表前扩展行</td>

    <td style="background-color:#ffeedd">可以在这里加一些自定内容</td>

    <td style="background-color:#ffeedd" colspan="2">该行与ectable在同一table内</td>

    </tr>

    </ec:extendrow>

 

    <ec:extendrow>

    <tr>

    <td style="background-color:#eeddff"> </td>

    <td style="background-color:#eeddff">*列表后扩展行</td>

    <td style="background-color:#eeddff">可以在这里加一些自定内容</td>

    <td style="background-color:#eeddff">该行与ectable在同一table内</td>

    </tr>

    </ec:extendrow>

 

 

 

 14 增加 ec:extend 标签

用来在toolbar内增加一些自定义的html代码属性

例如 <ec:extend><a href="#">自定义扩展内容</a></ec:extend>

这时该连接 将会出现在 toolbarContent 中的 extend所在位置

 

 

 15 增加 ec:extendbar 标签

在列表前/后加些html代码  属性  before="true"  (true top false(默认))

如果要加的东西比较多  建议使用这个而不要使用ec:extend

ec:extendbar 添加的内容不会和组件自带的tool放到一行

 当 before="top"的时候 所加内容会出现在 列表和列表标题之间

例如

    <ec:extendbar before="true" >

        <span style="color:#999999">*工具条 前扩展块:可以在工具条前加些你自己想加的东西,<b>所加内容和ectable在同一form内</b></span>

        </ec:extendbar>

    <ec:extendbar>

        <span style="color:#999999">*工具条 后扩展块:可以在工具条后加些你自己想加的东西,<b>所加内容和ectable在同一form内</b></span>

    </ec:extendbar>

 

 

16 增加了cell类型

复选框 cell="checkbox"  headerCell="checkbox"

单选框 cell="radiobox"  headerCell="riadiobox"

例如

<ec:column cell="checkbox"  headerCell="checkbox"

alias="chkBoxNameXXX" value="chkValue${pre.nickname}"

width="22" viewsAllowed="html" />

注意 value对应生成的 checkBox 的 value ,alias 对应生成的 checkBox 的name

 

 

17 增加页面变量 ${TOTALROWCOUNT} 用来标示当前纪录在全部记录中的行数

${ROWCOUNT}用来标示当前纪录在当前页中的行数)

例子

<ec:column property="name" title="姓名" width="160">${TOTALROWCOUNT},${pre.name}</ec:column>

 

 

18 增加了“固定列表头,滚动列表体”(“列表内部滚动条”)的功能

这个功能实现起来比我一开始想像的复杂

不是简单的使用一个 div overflow:scroll就可以搞定的

虽然功能是支持了但是代码肯定还有很多bug或者是可以改进的地方

欢迎大家积极的提出宝贵的意见谢谢了

 

使用方法:

ec:table标签内增加

listHeight="数字" 属性 (指定列表体的高度)

同时把要指定 width="数字" 不能省略同时要使用绝对大小 而不要使用百分比

详见例子:

demo0.jsp

 

 

 

19 增加shadowRow功能

shadowRow我自己瞎起的名字解释如下:

每行下面可以再加一个子行这个行里显示什么可以由大家自己定义

常见的应用是在有些论坛论坛主题列表里当你点击行开头的小加号的时候 会在这行下面展开一个区域那里面显示的是主帖的内容.

我们可以把这个扩展一下利用ajax从后台去读取我们想读取的信息,这样我们就可以做任何我们想做的事情了)

该功能是不通过标签或java代码实现 纯js实现。

详见例子 demo0.jsp (大家一定要注意看demo0.jsp里的注释啊 呵呵)

其实有了这个功能,大家已经可以自己比较容易的实现可编辑表格的功能了呵呵过一阵我会发一个例子上来

 

 

20 ec:table 增加了 excludeParameters 和 includeParameters 属性

使用后,ecside将自动排除或保留属性中所指定的“表单属性”

这个如果你理解了 autoIncludeParameters 的用处就不难理解这两个属性的用处了

注意: excludeParameters 比 includeParameters 有更高的优先级

excludeParameters="a"  includeParameters ="a" 时 a仍然将被排除

建议尽量使用 excludeParameters 不要使用 includeParameters ,除非你非常明确自己要包含的东西。

includeParameters 使用不当会使你忘记包含一些必须包含的东西.

 

excludeParameters="表单属性名称1,表单属性名称2"    (表单属性名称不能含有半角的逗号)

includeParameters="表单属性名称3,表单属性名称4"

 

21 实现了灵活的可定制的“可编辑列表”:

ec:column 中指定下列属性:

 

cellName="这个cell在数据库中真正对应的列名,省略时则自动使用 property对应的名称"

cellValue="这个cell在数据库中真正对应的值"

cellEdit="a1,a2,a3" 

    a1编辑类型(目前可选input select 其他如radio等还不完善),

    a2对应的模版textarea的ID(默认是 "ec_edit_template_'+编辑类型 ),

    a3触发编辑的事件(默认是ondblclick)

模版为一段写在textarea内的表单域的html代码,书写是完全自由的但是一定要注意不要缺少必要的事件方法和属性。

 

 

22 增加了 高亮显示选种行的功能,使用 ec:table属性: selectlightRow="true"

 

 

23 为ec:table增加了 maxRowsExported="数字" 属性,用来限制导出大最大条数,

如果数据超过这个数目,则不执行导出操作。

 

 

24 实现了cell的映射功能(详见示例的性别和 角色列)

用法:

<ec:column mappingItem="用来映射的MAP在context内的key" mappingDefaultValue="当找不到映射值时要使用的默认值".../>

例如,在示例中,角色的信息以 “标识--名称”的形式放到了一个 map内

action中把这个map放到了 request.setAttribute("USERROLE_MAP", CommonDictionary.USERROLE);内

在页面使用

<ec:column property="USERROLE" title="角色" mappingItem="USERROLE_MAP" mappingDefaultValue="[错误的角色]"/>

就会自动将名称显示出来。

 

 

25 做了一个简单的小标签用来从map生成 select的option列表

<ec:options items="MAP在context内的key" defaultKey="默认选中的option的value" tagAttributes="附加的html属性"/>

 

 

 

还有很多细节的改动,暂略...

 

 

 

内部变化:

 

 

1 提炼了ectable生成的js

ectable 原先的实现会在页面内生成大量的js代码非常不好

现在翻页相关的js代码全部提炼成了 js函数

 

2 翻页按钮的外观提炼成由css决定而不是图片决定。

ectable原版生成的是 <img ... src="图片路径" />

现在生成的是 <input type="button" class="样式" />

这样要改变外观只要去修改“样式” 中的背景图片就ok了

filter clear 按钮 暂时还没有这么处理

 

3 !!!翻页机制全部使用ajax实现!!!

(没有使用任何的ajax后台框架(如dwr ajaxAnywhere),纯js端实现)

filter 排序功能还没有使用ajax

 

4 支持 预查询功能(利用ajax实现)

例如在用户察看第5 页数据的时候,系统会偷偷的把 上一页和下一页的数据也查出来

并放到隐藏的textarea内 ,翻页的时候无需再查询

当然这个功能有利弊,所以是可设置是否开启

 

 

5 将导出excel所使用的组件由poi切换成了 jxl

原因有2

1 jxl这个项目没有死仍然在继续发展

2 jxl似乎对内存要求更小

(poi在导出20000条纪录的时候outofmemery了,jxl则顺利完成任务)

 

jxl官方网址

http://www.andykhan.com/jexcelapi/index.html

 

 

6 xls导出方式修改如果了解代码的人一定知道 默认的导出xls时是导出的vo/map里的原始数值

而不是页面实际显示的内容,这个问题现在解决了。

 

 

7 代码进行了较大规模的重构分离出了tool模块(但这个模块还不够灵活下一版本打算在这个基础上争强扩展性灵活性)

你可以自己写tool来取代组件内设的tool

组件默认的 tool 配制在 extremetable.properties 文件内

 

tool.navigation=org.ecside.tool.PageNavigationTool

tool.pagejump=org.ecside.tool.PageJumpTool

tool.pagesize=org.ecside.tool.PageSizeTool

tool.export=org.ecside.tool.ExportTool

tool.status=org.ecside.tool.StatusTool

tool.extend=org.ecside.tool.ExtendTool

tool.blank=org.ecside.tool.BlankTool

tool.|=org.ecside.tool.SeparatorTool

tool.,=org.ecside.tool.NewLineTool

 

如果你想实现 自己的导航 可以 继承抽象类BaseTool

然后修改配制例如

tool.navigation=com.mytest.MyNavigationTool

posted @ 2008-12-16 11:21 巴西木 阅读(4194) | 评论 (1)编辑 收藏

仅列出标题
共33页: First 5 6 7 8 9 10 11 12 13 Last