AppFrame基础培训教材-课件_第1页
AppFrame基础培训教材-课件_第2页
AppFrame基础培训教材-课件_第3页
AppFrame基础培训教材-课件_第4页
AppFrame基础培训教材-课件_第5页
已阅读5页,还剩185页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

亚信基础开发平台AppFrame培训姓名培训目标了解AppFrame的功能快速掌握使用AppFrame平台的基本技能培训内容AppFrame简介平台发展过程和应用平台体系结构AppFrame主体功能介绍安装配置开发流程简介配置工具的使用页面组件及使用介绍

AIWebFrame登陆框架AppFrame对OBD的支持控制台管理AppFrame简介AppFrame目标为什么要开发AppFrame?J2EE是一套比较新的技术,相比原来的C/S结构系统或三(多)层结构系统,在设计、开发、部署方面增加了很多新的特点,相对来说变的比较复杂,因此AppFrame着重解决以下问题:解决性能问题统一设计模式提高开发效率提供标准组件,降低编码强度提供稳定的可扩展框架AppFrame与J2EE的关系J2EE是一套标准,是分布式应用程序的运行环境和一套可扩展的javaAPIAppFrame是一个框架,是一个在J2EE标准下开发企业应用的平台,包括API、工具、设计模式AppFrame的实现采用J2EE标准技术平台发展过程和应用AppFrame版本演进(1)Appframe1.0前台界面展现完全采用DHTML和JavaScript实现,采用XMLHTTP控件与服务进行数据交换。所有数据和控制信息采用XML文档进行传递。优点:界面层与数据层完全分离,功能强大。缺点:所有的界面生成和控制都在IE中完成,导致系统运行效率较低。相关项目:浙江网通业务支撑系统AppFrame版本演进(2)Appframe2.0采用Tag与DHTML、JavaScript相结合来改善系统性能,同时保留1.0中灵活适用的功能。优点:解决了1.0中存在的性能问题,同时在使用的方便性方面得到了较大的改善。相关项目:重庆网通业务支撑系统、海南网通业务支撑系统、上海网通业务支撑系统、浙江网上营业厅系统衍生版本:AppframeForCorba(上海移动门户系统)

AppframeForOBD(浙江移动渠道管理系统、移动客服系统。。。)AppFrame版本演进(3)Appframe3.0合并Appframe2.0、AppframeForCorba、AppframeForOBD的版本;增加系统运行期监控功能;增加套打组件、数据报表组件等;加强安全性控制;AppFrame版本演进(4)Appframe3.1、Appframe3.2、Appframe3.3在Appframe3.0版本的基础上又相继发布3.1、3.2、3.3版本,其主要目的是为了满足各个项目实际使用中的需求,而整合了一些新功能或者是修正了一些问题,或者是在性能上进行了调整。AppFrame版本演进(5)而AppFrame5.0版本在结构作出了重大的调整,以下几点总结了该版本对于系统开发所带来的好处:提供符合SOA体系结构、组件化的开发框架,降低业务系统耦合性提供稳定易扩展的基础组件,提升系统开发效率和稳定性提供系统全方位的跟踪监控机制,提升系统问题的快速定位能力提供与权限系统的无缝连接使业务系统的构建是一个自顶而下的可持续改善的过程提供统一的开发模式,使开发维护易于管控提供开发与部署无关的机制,降低开发复杂度,提升系统部署灵活性使企业的软件资产具有继承性和可管理性AppFrame版本演进(6)AppFrame5.5版本AppFrame5.5版本对平台的标准版本和河南版本做了融合,其目的在于整合两个版本的优秀元素,将这两个版本好的特性集成到一个版本中,将其高配置性、高效率性、高稳定性和高性能的特质带入到新版本中,提供一个更加完善的平台技术框架。AppFrame河南版本经过河南移动BOSS3.0项目的淬炼,已经被证实它的高稳定性和高性能,能够很好的支撑5千万的用户量,所以这次融合将平台河南版本的底层实现引入,以后续更好的支撑大型业务应用系统。平台体系结构术语定义(一)Session:存储特定用户会话所需的信息,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。O/Rmapping(ObjectRelationalMapping):java对象和数据库对象之间的映射,通过O/Rmapping实现java对象对数据库的透明访问。XML文档:符合xml规范的文本,在APPFrameV3.0中,xml文档通常用于数据交互。DataModel:数据模型,即J2EE设计模式M-V-C中的M,又称model。RowSet:结果集,由此派生出FormRowSet、TableRowSet等。NormalRowSet:通用结果集,是不可视的结果集,有它自己的js的构造方式术语定义(二)BO(businessobject):BO定义了业务对象数据的来源、数据属性以及业务对象的操作与关联。BO通过configtools配置工具配置生成,包含一个.bo文件和3个自动生成的.java文件,3个文件分别是xxBean.java、xxEngine.java、IxxValue.java。SET:configtools配置生成一个.set文件,定义了web页面的数据来源、展示的格式。DS数据源(datasource):ds定义了页面显示的下拉列表数据源,具体表现为使用configtools配置生成一个.ds文件。DataContainer:数据容器,APPFrameV5.0中传递和处理数据的基本类。AppFrame在系统中的位置流程配置J2EESERVERAppframeAPPDM数据模型业务规则、服务定义BCE权限管理(SecFrame)界面风格配置产品数据定义业务处理逻辑系统系统部署要求PCEUWFE内网系统门户系统客户经理公众客户系统总体构架SecFrame权限管理AppMoitor应用管控SOA体系架构DB数据库、CORBA、EJB等DAO1DAO2DAO3服务1服务2服务3逻辑层(JService)数据操纵层(JService)数据层Action类Action类服务1Action类UI层逻辑功能功能点1JSP页面1JSP页面2JSP页面3功能点2外部服务1外部服务2外部服务3系统各层间全部通过服务进行调用服务之间的依赖通过依赖注入的模式来实现。服务的部署方式包括:POJO、EJB、WEBSERVICE、CORBA服务的部署方式与调用者和实现者都无关提升开发效率Web端提供了稳定的UI组件和前后台的数据交付方式,提高前台web开发效率DBGrid、DBForm、DBTree、AITab等自动实现前台数据展现和后台业务数据对象的自动转换增强的JSP编辑器和项目自定义模板加快jsp的开发效率通过服务注册管理机制和AppframeDeploy可以屏蔽系统部署对开发的影响系统的最后部署模式与开发无关,降低了开发人员的技能要求提高了系统开发调试的速度事务控制的配置化管理从原来的业务逻辑中抽离了事务控制,简化了系统逻辑。减少了代码层次和代码量。提高了系统开发调试的速度业务过程实现了详细设计与开发的同步,避免设计和开发的脱节,提高了开发效率OPFrame实现了O-RMapping,通过配置实现了数据存储的自动化,提高了系统开发效率数据持久化层管理结构数据库连接池管理(监控连接的申请和关闭)自定义数据库连接池JNDI数据库连接池ConfigTool进行BO对象定义,并自动产生相关对象文件BO对象定义信息数据持久化管理数据库CORBAOBD数据对象业务逻辑层界面控制层结构ConfigTool进行SET、DS对象定义SET对象定义信息,DS对象定义信息界面展现控制层HTML输出TAG对象JSP文件业务逻辑层局部HTML输出(XmlHttp)用户操作Action请求AppFrame主体功能介绍数据持久层管理

数据持久化就是通过序列化或者保存到数据库的方式保存对象的状态和数据。

BO对象**Bean.java(数据包装类):是DataContainer类的子类,封装了表的每个记录行,并提供get/set方法。**Engine.java(基本操作引擎类):包含getSysTime、getNewId、getCount、getBeans、save等基本方法.I**Value.java(业务接口类):接口类,在使用配置工具时可选择是否生成。若生成,**Bean则需要implements这个接口业务逻辑层数据枚举服务:static/sql/BO/function/service5种类型对象唯一标识IDgenerator数据源管理DBDataSourceSelfJNDI对象存储管理DataStoreSessionManager和ServiceManager数据对象容器DataContainer日志处理:log4j界面管理层功能可视化的界面元素定义数据类型:数据长度,校验方式展现方式:DBEdit、DBListBox、DBLabel、DBChecbox、DBDate…

数据选择来源:下拉数据源选择、动态关联参数设置…

编辑状态:是否可编辑根据定义自动生成前台需要的数据集

TableRowSetFormRowSetNormalRowSet自动将前台返回的数据转换为标准的数据对象Bean

将一个前台数据集自动拆分为多个后台数据对象数组界面对象元素DBFormDBGridDBTreePopMenuDBListBoxTab

日历控件

……安装配置环境要求JDK1.4或以上版本,确认已经被加入到本机环境变量classpath开发IDE:Jbuilderx+tomcat4.1浏览器IE6.0或以上版本WebServer/AppServer:如果程序需要发布到weblogic,需要weblogic7.0以上版本,如果发布到webSphere,需要webSphere5.0以上版本;开发阶段使用JBuilderx自带的tomcat4.1数据库oracle8.1.2以上版本,相应的jdbc版本。创建APPFrameV5.0必须的数据库表sys_id_generator

工程配置(一)

通常,基于APPFrameV5.0开发一个工程,第一级目录结构为:src:存放java源码及配置工具configtools自动生成的java源码及set、ds、view、bo等配置工具生成的文件html:webmodel目录,也可以为webmodel取另外一个名字,在这个目录下存放页面文件html、jsp、js等源码lib:类库,appframe.jar及其他第三方jar包

*注意:ConfigTool所在的目录在路径中不能含有中文,因为ConfigTool在加载的时候需要读取jsptemplate模版,而这个模版现在还不支持中文工程配置(二)

配置文件AIConfig.xml的说明文件中定义了APPFrameV5.0框架中各个模块的管理器;还有CrossGrid,DBTreeNew的相关配置信息

AIConfig.xml文件要求能通过ClassPath搜索获得。如果APPFrameV5.0框架中没有或缺少某一个模块的实现包,需要在此配置文件中注释掉对应的数据行。

例如:

<ConfigKindname="AppFrameInit"><ConfigItemname="DbDataSourceIniFile"remarks="数据库连接配置文件">aisystem.ini</ConfigItem><ConfigItemname="DefaultSrouceName"remarks="缺省数据源名称">UserDataSource</ConfigItem>……开发流程简介开发流程简介第一步:界面开发

界面主要是jsp、html以及js文件,开发分为两步:使用configtool完成bo、set、ds配置及生成相关java文件按照jsp的语法规范,完成jsp的编写

注意:在编写jsp代码的时候,别忘了包含对APPFrame提供的js文件、css文件的引用如果只是数据查询而且是使用缺省DataModel(缺省DataModel是APPFrame提供的数据集获取方法,与此对应的还有自定义model),只要上面的工作就可以,如果应用涉及对数据库的新增、修改、删除操作,就需要进入第二步:界面控制

第二步:界面控制界面控制层需要写一个servlet,这个servlet必须继承BaseAction类。这个servlet做业务逻辑的判断,决定调用哪个javaclass或者EJB进行业务逻辑处理。APPFrame提供了数据保存的一个缺省实现com.ai.appframe2.web.defaultAction来实现新增、修改、删除操作的保存。在页面开发时指定这个类的方法作为保存方法就可以。前提是要保存的数据对应着一个或几个表BO,这几个表BO之间没有关联关系。对一些逻辑关系复杂的表BO,还是需要自己写servlet。第三步:持久层开发

使用配置工具configtool完成BO的配置,自动生成BO相应的java文件

第四步:业务逻辑开发进行业务逻辑开发,也就是写javaclass或者EJB的过程,在此过程中,需要使用配置工具自动生成的java文件。在配置工具生成的3个java文件中,使用xxEngine.java的save()方法来实现保存。同时这个类还提供getNewID()、getSysTime()、getBeans()等常用方法。第五步:联调程序完成第一到第四步就可以进行最后的调试配置工具的使用配置工具Configtool

Configtool作为APPFrame开发平台的不可或缺的重要部分,主要提供以下功能:

数据源管理-连接数据库的方式BO配置-BO对象,来自表、视图、sqlSet配置-页面数据的格式、来源DS配置-下拉框的数据来源代码自动生成-根据BO生成的java文件

OBD接口文件转换到BO文件(开发OBD环境的应用时使用)JSP代码的快速编辑

数据源管理(1)

数据源管理提供新增、修改、删除数据源的功能。界面如下所示:数据源管理(2)数据源名称:数据源唯一标识数据源类型:有两种,SELF和JNDISELF——用标准的JDBC连接数据库JNDI——通过应用服务器的connectionpool来连接数据库注意:系统默认数据源命名为“UserDataSource”通过配置工具生成的数据源定义文件在工程目录config下aisystem.xml中,其中psd密码是经过加密的BO(业务对象)管理(1)BO的创建根据数据库表结构生成BO

根据sql查询生成BO

根据OBD接口文件生成BOBO多表关联BO(业务对象)管理(2)新建BO界面如下:BO(业务对象)管理(3)配置BO属性如下所示:SET(界面数据)配置管理(1)可视化的界面元素定义数据类型:数据长度,校验方式展现方式:DBEdit、DBListBox、DBLabel、DBChecbox、DBDate…数据选择来源:下拉数据源选择、动态关联参数设置…编辑状态:是否可编辑根据定义自动生成前台需要的数据集TableRowSetFormRowSetNormalRowSet自动将前台返回的数据转换为标准的数据对象Bean可以将一个前台数据集自动拆分为多个后台数据对象数组SET(界面数据)配置管理(2)支持的前台校验数据类型StringDateDateTimeFloatIntegerEmailPostcode支持项目进行数据类型的定义扩展例如:地址、客户经理、组织SET(界面数据)配置管理(3)新增SET,需要选择BO来生成,界面如下:SET(界面数据)配置管理(4)修改Field的属性SET(界面数据)配置管理(5)高级设置——设置在页面显示的一些“是否可视、顺序”等属性。

DS(数据枚举)配置管理(1)

页面数据源是为界面的DBListBox下拉列表框提供数据,DS支持5类数据来源:静态数据:直接在DS配置中定义显示的数据BO数据:通过BO结合条件来查询数据SQL数据:通过自定义的SQL语句查询数据Function数据:通过自己写java方法查询数据作为数据源Service数据:通过指定服务ID和实现服务接口作为数据源DS(数据枚举)配置管理(2)新建DS文件后,配置界面如下:JSP页面辅助编辑器(1)JSP页面辅助编辑器(2)使用模板快捷的创建新JSP文件方便快捷的TAG类属性编辑对特殊的数据控件(Grid,Form)进行方便的排版编辑方便的JavaScript编辑定位和查找提供清晰的页面布局分区页面组件及使用介绍前台界面控件DBGridDBFormDBTreePopMenuDBListBoxDBTab……DBGridDBGrid是一个非常有用的页面组件,以表格方式展现数据,主要用来展示查询的数据结果,或者进行简单的数据维护。一个DBGrid的样式如下:DBGrid实现原理DBGrid是一个表单组件,根据需要通过GridDataModelInterface(表格数据模型)接口的实现类得到结果集,将结果集以DBGrid的形式进行显示。使用时需要在jsp文件中使用tag标签定义表格的显示方式。结果集生成方式:平台提供默认的DefaultDataModel用来生成结果集通过使用ActionDataModel,指定具体的类和方法来生成结果集。通过自定义DBGridDataModelInteface接口的实现类来构造自定义的GridDataModel。通过使用MethodModelForService或者QueryModelForService,以服务的方式生成结果集(推荐使用)通过DBGrid组件展现数据时,需要通过configtools配置生成的页面数据源set。DBGrid接口说明(1)Table标签选项

通常,在一个jsp文件中,table标签使用方法如下:<%@tagliburi="/WEB-INF/APPFrameV2.tld"prefix="ai"%><%pageContext.getRequest().setAttribute("condition","staff_id=:staff_id");//初始化条件HashMapmap=newHashMap();map.put("staff_id",newInteger(400));pageContext.getRequest().setAttribute("parameters",map);%><ai:table

tableid="staff"setname="test.guanwb.staff"height="200"multiselect="true"needrefresh="true" editable="true"oncontextmenu=""ondbclick=""pagesize="20"conditionname="condition"onvalchange="valchange"oncellchange="" width="600"onrowchange=""parametersname="parameters"tablemodel=""initial=”true”><ai:colfieldname=”organize_id”width=”20’editable=”false’visible=”false”/></ai:table>DBGrid接口说明(2)

js对象TabelRowSet支持的事件OnRowFocusChange:行焦点改变事件OnCellFocusChange:单元格焦点改变事件OnValueChange:单元格值改变事件OnGridDbClick:双击事件,当DBGrid标签的editable设置为true时,不响应此事件。OnContextMenu:鼠标右键事件OnBeforeTurnPage:翻页前触发事件OnAfterTurnPage:翻页后触发事件OnRowSelected:行选中触发事件DBGrid接口说明(3)

js对象g_TableRowSetManagerg_TableRowSetManager对象是APPFrameV3.0内建的表格数据集管理器,对页面内的所有表格对象进行管理。g_TableRowSetManager在页面加载时自动构建。方法说明:Get(pk):参数pk为DBGrid唯一标识tableID,通过该方法获得DBGrid表格数据集的引用。Push(SetName):参数SetName为页面数据源set名称,该方法向管理器中增加一个表格数据集。Remove(pk):删除一个表格数据集对象。使用范例:

varstaff_grid=g_TableRowSetManager.get(“staff”);varcurRow=staff_grid.getRow();

DBGrid接口说明(4)js对象TabelRowSet提供的方法

js文件名:jsv2/TableRowSet.js设置DBGrid组件的外观的方法,经常采用平台默认的设置,很少通过以下方法做修改。setEditSts(value):设置表格的编辑状态setRowEditSts(rowIndex,value):根据行号设置行的可编辑属性getRowEditSts(rowIndex):根据行号获取行可编辑属性setColEditSts(colIndex,value):根据列名设置列的可编辑属性setTableBgColor(color):设置表格的背景颜色,参数color类似”#ffff0000”setCurRowBgColor(color):设置表格的当前行背景颜色setRowBgColor(rowIndex,color)::设置指定行的背景颜色

……

DBGrid接口说明(5)以下是对DBGrid有用操作的方法,对开发人员至关重要。getRow():获取当前行号,返回一个整数,第一行行号为0。setRow(rowIndex):设置当前行号,rowIndex为整型。getCol():获取当前列号,返回整数,第一列列号为1。setFocus(rowIndex,colIndex):将焦点设置到指定的单元格上setFocusByName(rowIndex,colName):将焦点设置到指定的单元格上……(具体见demo工程或操作手册)使用范例:varstaff_grid=TableRowSetManager.get(“staff”);staff_grid.refresh(“code=”+staff_code);//查询code为staff_code的记录varcurRow=staff_grid.getRow();varcurCole=staff_grid.getValue(curRow,”name”);//获取当前行name字段的值注意事项在编写页面jsp文件时需要<%@includefile=“/webframe/jspcommon/includedhead.jsp”%>,APPFrameV5.0的includedhead.jsp中没有引入相关组件的js文件,所以编写页面时,要使用某种组件,需引入相关的js文件,如下:

<scriptlanguage="JavaScript“src="<%=request.getContextPath()%>/jsv2/TableRowSet.js"></script>……初始化一个DBGrid时,可以通过页面上下文pageContext设置初始化condition,condition中的参数可以是静态的也可以是动态的。最好是初始化DBGrid为空,获取参数后使用refresh()方法查询数据。

如果某列没有使用<ai:col/>标签定义,则TableRowSet的getValue()、getDisplayText()方法不能使用,如果需要使用但又不希望显示这些列,可以使用<ai:col>标签的visible=”false”属性。练习case1新建AppFrame工程以表organize,staff为例,用configtools配置生成下列文件以及相关java文件:

organize.bo,organize.set(其中organezetype为下拉数据源)

staff.bo,staff.set要求:页面显示两个DBGrid:organize和staff,双击organize表格中一条记录,显示organize下相应的staff记录,可以增加、修改、删除staff表格中记录,(并进行保存)。Stable为了彻底解决表格的“查询条件过期问题”,在Appframe5.2中增加一个新的表格标签stable,该表格一律采用IE客户端缓存的方式,所以不会存在“查询条件过期”问题。该表格为原先表格的简化版,不允许用户自定义DataModel。用户可以在页面上指定需要调用的服务ID或者类名、方法名和参数来获取表格数据。下面描述下这个表格新增的几个字段的含义:invoke_type:从指定类获取数据的方式,只能写”pojo”或者”service”。”pojo”表示从指定的类获取数据;”service”表示从指定的服务获取数据。invoke_name:表示获取数据的类名或者服务名,这个配置项和上述的invoke_type想对应,如果invoke_type为“pojo”,那么该项表示类名,否则表示服务ID。invoke_querymethod:获取表格数据的方法,包括方法名、参数类型和参数的名称。例如:getGridData(inta,Stringb,longc)。invoke_countmethod:获取表格数据的方法,具体格式同invoke_querymethod。Stable--service方式

<ai:stabletableid="xiangtao1" setname="test.stable.web.SysOrganize" invoke_type="service"initial="true" invoke_name="test.stable.service.OrganizeQuerySV" invoke_querymethod="getOrganizeInfo(Stringcondition, int$STARTROWINDEX,int$ENDROWINDEX)" needrefresh="true"footdisplay="none"> <ai:colfieldname="ORGANIZE_ID"width="150"/> <ai:colfieldname="ORGANIZE_NAME"width="150"/> </ai:stable> 红色标注部分是service的服务ID,根据此ID找到对应的服务接口。Stable--pojo方式

<ai:stabletableid="xiangtao2" setname="test.stable.web.SysOrganize" invoke_type="pojo"initial="false"width="300" invoke_name="test.stable.dao.impl.OrganizeQueryDAOImpl" invoke_querymethod="getOrganizeInfo(Stringcondition,int $STARTROWINDEX,int$ENDROWINDEX)" needrefresh="true"footdisplay="none"> <ai:colfieldname="ORGANIZE_ID"width="150"/> <ai:colfieldname="ORGANIZE_NAME"width="150"/> </ai:stable> 红色标注的部分为具体的类,将由该类的全路径找到对应的类以及对应的方法。DBFormDBForm是一个非常有用的页面组件,主要用来以自由格式Form方式展现数据,通常用于对一条数据的详细信息显示、对一条数据的新增,修改页面中。一个DBForm的样式如下:DBForm实现原理DBForm是一个表单组件,将结果集(一条结果)中的每个字段以不同的显示类型(文本框,下拉列表框,文本域,checkbox选择框等)进行显示。使用时需要在jsp文件中定义一个DBFORM的标签生成数据集的方式:平台提供默认的DefaultDataModel用来生成结果集通过自定义DBFormDataModelInteface接口的实现类来构造自定义的FormDataModel通过使用ActionDataModel,指定具体的类和方法来生成结果集。通过使用MethodModelForService或者QueryModelForService,以服务的方式生成结果集(推荐使用)通过DBForm组件展现数据时,需要通过configtools配置生成的页面数据源set。DBForm接口说明(1)Form标签选项

通常,在一个jsp文件中,form标签使用方法如下:<%@tagliburi="/WEB-INF/APPFrameV2.1.tld"prefix="ai"%><ai:dbformformid="form1"setname="SETTableList"conditionname="condition"parametersname="parameters"onvalchange="onValChange1"editable=”true”>TABLE_NAME<ai:dbformfieldfieldname="TABLE_name"formid="form1"visible="true"/>CH_NAME<ai:dbformfieldfieldname="CH_Name"formid="form1"width="300"visible="true"/>PARENT_ID<ai:dbformfieldfieldname="PARENT_ID"formid="form1"editable="true"visible="true"/></ai:dbform>DBForm接口说明(2)

js对象FormRowSet支持的事件onValueChange:field字段值改变事件onFoucsIn:字段获得焦点事件onFoucsOut:字段失去焦点事件DBForm接口说明(3)js对象g_FormRowSetManagerg_FormRowSetManager对象是APPFrameV5.0内建的DBForm数据集管理器,对页面内的所有DBForm对象进行管理。g_FormRowSetManager在页面加载时自动构建。方法说明:Get(pk):参数pk为DBForm唯一标识formID,通过该方法获得DBForm数据集的引用。Push(SetName):参数SetName为页面数据源set名称,该方法向管理器中增加一个DBForm数据集。Remove(pk):删除一个DBForm数据集对象。使用范例:

varstaff_form=g_FormRowSetManager.get(“staff”);varcurRow=staff_form.getValue(“NAME”);

DBForm接口说明(4)js对象FormRowSet提供的方法

js文件名:jsv2/FormRowSet.js提供对DBForm有用操作的方法,对开发人员至关重要。setEditSts(value):设置表格的编辑状态setColEditSts(fieldName,value):根据列名设置列的可编辑性getValue(fieldName):获取指定字段的当前数据值,如果该字段没有使用dbformfield标签显示地定义,则getValue()无法获取字段值。getDisplayText(fieldName):获取指定字段的显示值setValue(fieldName,Text,value):根据行号,列名设置数据值,value数据值text显示值newRow():新增一空白页,refresh(condition):FormRowSet刷新,condition条件中不能出现orderby条件。……(具体见demo或二次开发手册)注意事项在编写页面jsp文件时需要使用Form组件,要引入相应的js文件,例如:<scriptlanguage="JavaScript"src="/jsv2/FormRowSet.js"></script>……如果某字段没有使用<ai:dbformfield>标签定义,则FormRowSet的getValue()、setValue()getDisplayText()方法不能使用,如果需要使用但又不希望显示这些字段,可以使用<ai:dbformfield>标签的visible=”false”属性。

页面初始化后,form就有一条空记录,不需要显式调用newRow()来增加一条空记录。练习case2

要求:页面上显示两个form,都以staff.set为页面数据源。第一个form:初始化为空,(数据录入后并保存)第二个form:根据staff_code进行查询并显示结果。(修改后可以保存)自定义model(1)自定义DataModel做为缺省DataModel的补充,提供给开发人员一种不通过缺省DataModel获得后台数据的方法。因此,自定义DataModel主要是为了实现数据查询而使用。自定义DataModel分为两种:

一种用于DBGrid,必须实现DBGridDataModelInterface;一种用于DBForm,必须实现DBFormDataModelInterface。

DBGrid的自定义ModelDBGrid的自定义Model:必须实现以下3个方法publicvoidinit(ServletRequestrequest,DBGFInterfacepInterface)throwsExceptionpublicintcount()throwsExceptionpublicObjectgetGridData(intstartRowIndex,intendRowIndex)throwsException

DBForm的自定义Model

DBForm的自定义Model:必须实现以下2个方法publicvoidinit(ServletRequestrequest,DBGFInterfaceInterface)throwsExceptionpublicObjectgetFormData()throwsException注意事项使用自定义model之后,<ai:table>和<ai:dbform>标签中的conditionname,parametersname属性就没用了调用refresh方法传递的参数必须使用“=”

,如果需要使用其他运算符,可以通过将条件做为一个字符串赋值给一个参数,在后台JAVA代码中进行处理。例如:

<%pageContext.getRequest().setAttribute("staff_id","<10");%>

在使用Form自定义model时,根据条件查出来的结果集必须只有一条记录,否则后台会抛出异常

MethodModelForService<ai:table/>标签中的属性tablemodel或者<ai:dbform/>标签中的属性datamodel默认使用model:com.ai.appframe2.web.datamodel.MethodModelForService属性implservice_name设置在服务配置文件.xml中配置的服务ID或者接口类全路径属性implservice_querymethod设置服务接口中的查询方法属性implservice_countmethod设置服务接口中的返回记录数的方法实现原理:通过MethodModelForService这个定义好的model,根据implservice_name中设置的服务ID找到定义好的服务,执行implservice_querymethod中设置的方法,获取数据集前台刷新方法:varstationTypeRowSet=g_TableRowSetManager.get("tblStationType");varcond="domainId="+domainId+"&orgRoleTypeId="+curRoleId;stationTypeRowSet.refresh(cond);

其中implservice_querymethod中设置的方法是带全参数的,refresh方法中的参数名完全匹配implservice_querymethod中设置的参数名QueryModelForService(1)<ai:table/>标签中的属性tablemodel或者<ai:dbform/>标签中的属性datamodel默认使用model:com.ai.appframe2.web.datamodel.QueryModelForService属性implservice_name设置在服务配置文件.service中配置的服务ID属性implservice_querymethod设置服务接口中的查询方法属性implservice_countmethod设置服务接口中的返回记录数的方法实现原理:通过QueryModelForService这个定义好的model,根据implservice_name中设置的服务ID找到定义好的服务,执行implservice_querymethod中设置的方法,获取数据集前台刷新方法: varstationTypeRowSet=g_TableRowSetManager.get("tblStationType"); varcond=“DOMAIN_ID=”+domainId+“andORG_ROLE_TYPE_ID="+curRoleId; stationTypeRowSet.refresh(cond);QueryModelForService(2)注明:1、前台js中refresh的参数为标准的sql语句,用来拼接到主sql语句中作为子查询语句2、属性implservice_querymethod中设置的方法名不用带参数和括号,但是在定义接口类的时候,参数必须符合以下格式: query(String[]attrList,StringaCondition,MapaParameterList,intaStartNum,intaEndNum,booleanaFkFlag,String[]aExtenBOArray) 原因是该方法最终将调用Engine类中的以下方法: getBeans(String[]cols,Stringcondition,Mapparameter, intstartNum,intendNum,booleanisShowFK,String[]extendBOAttrs) 所以参数格式必须严格匹配,而参数的获取则是通过refresh方法传递的参数或者web层的代码来实现的。页面数据保存继承BaseAction实现一个保存类。并且保存方法应该写成如下方式:

publicvoidsaveData(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{DataContainerList[]dcLists=HttpUtil.getDataContainerLists(request.getInputStream(),null);save(request,response,dcLists);//具体实现保存的方法

}注意事项HttpServletRequestrequest,HttpServletResponseresponse必须做为保存方法的参数通过HttpUtil.getDataContainerLists(request.getInputStream(),null);获取页面传来的需要保存的数据,APPFrameV5.0会自动把这些数据转换为dataContainer数组,对于简单的页面参数,可以通过request.getParameter()获取。如果页面数据源set不是根据BO对象配置的,那么保存方法不能使用APPFrameV5.0的缺省实现defaultAction。如果页面数据源set是根据BO对象配置的,但又不希望使用APPFrameV5.0缺省的保存方法,或者在保存方法中还需要处理其他逻辑,可以参考com.ai.appframe2.web.defaultAction的写法完成自己的保存。对DBGrid,每次修改、新增、删除只处理一页数据,翻页前注意保存。练习case3以Demo为例,实现单表的保存DBTreeNewDBTreeNew是一个Tag标签组件,从指定的数据模型datamodel类中获取数据,在页面中以tree的方式显示数据。

有关DBTreeNew的定义主要包含在DBTree_New.js文件中,一个DBTreeNew的样式如下:DBTreeNew实现原理与原有基于javascript构造的DBTree组件不同,DBTreeNew将节点的数据构造交由二次开发人员实现。Tree在展开节点时,从后台DataModel中获取其子节点的数据,进而构成UI显示。做到了真正意义上的分层读取。为了版本兼容需要。原有DBTree组件继续保留。但推荐使用新的DBTreeNew组件。Com.ai.appframe2.web.tag.tree.DBTreeNewDataModelInterface.java

是DBTreeNew的数据model接口,Tag类中datamodel属性指定的类必须实现该接口DBTreeNew接口说明(1)DBTreeNew标签选项

通常,在一个jsp文件中,DBTreeNew标签使用方法如下:<ai:dbtree_newid="xx"datamodel="demo.newtree.TreeDemoDataModel"multiselect="true"height=""width="300"onclick="aa"oncheckboxclick="bb"/>DBTreeNew接口说明(2)支持的事件onselect:节点选中触发该事件oncheckboxclick:多选状态下,鼠标点击checkbox触发事件onrightclick:右键点击节点触发事件DBTreeNew接口说明(3)js对象g_DBTreeNewManagerg_DBTreeNewManager对象是APPFrameV5.0内建的DBTreeNew数据集管理器,对页面内的所有DBTreeNew对象进行管理。g_DBTreeNewManager在页面加载时自动构建。

方法说明:Get(pk):参数pk为DBTreeNew唯一标识treeID,通过该方法获得DBTreeNew数据集的引用。使用范例:

vardbtree=g_DBTreeNewManager.get(treeID);DBTreeNew接口说明(4)js对象DBTreeNew提供的方法

js文件:jsv2/DBTree_New.js提供对DBTreeNew有用操作的方法,对开发人员至关重要。tree.getSelectionPath();返回从root到当前选中节点的path路径数组。数组中是节点的值(val)tree.getCurNodeInfo();得到当前点击节点的信息返回元素为Object对象,Object对象包括以下属性Obejct.value,Object.text,Object.userobjtree.getCheckedNodesInfo();多选状态下得到选中的节点的信息数组。数组中的元素为Object对象,包括Object.value,Object.text,Object.userobjtree.clearSelection();单选状态下清空当前节点。多选状态下不仅清空当前节点,还清空所有checkbox的选中状态……(具体见demo或二次开发手册)DBTreeNew的优化该功能主要是为解决页面上报树控件“查询条件过期”而改造的。引起问题的主要原因是因为加载一个树控件时,这个树的相关信息是存放在WEB服务的一个缓存队列中,但是该队列有最大数量限制,所以当页面上树控件太多的时候,可能导致一个在用的树控件信息被挤出队列,导致“查询条件过期”的问题。解决该问题的思路是:加载一个树控件后,将该控件的相关信息存放在IE客户端,当加载子节点或者刷新某节点时,将这个树控件的相关信息发到后台,后台重新构造相关对象。因为树的相关信息是存放在IE客户端,所以永远不会导致树信息被挤出WEB缓存队列的问题。使用方式:需要开发人员在树的DataModle代码中,除了实现com.ai.appframe2.web.tag.dbtree.DBTreeNewDataModelInterface这个标准接口外,还得实现com.ai.appframe2.web.tag.dbtree.DBTreeUseLocalCacheInterface这个接口。该接口里头没有定义任何方法,不需要开发人员增加其它额外的JAVA代码。使用限制:并不是所有树的DataModle都可以实现该接口。使用该接口的前提是:该DataModle中没有定义公共变量,或者所有的公共变量只针对当前的一次操作有效(这一次操作可能是加载树控件、加载子节点,或者刷新一个树节点)。练习case4构造一个DBTree_new,显示组织(organize表)信息。PopMenuPopMenu是页面弹出式菜单。PopMenu的实现包含在PopMenu_v2.js中。一个页面弹出菜单的样式如下:PopMenu实现原理PopMenu的实现采用显示控件和数据源DataModel分离的方式PopMenu的数据源可以是页面直接构造,也可以通过normalRowSet的create()方法从服务器获取。PopMenu接口说明(1)

js对象AIPopMenuModel

AIPopMenuModel是弹出式菜单的数据源,构造方法:

varmodel=newAIPopMenuModel();AIPopMenuModel对象提供的方法:addPopMenuItem(pItemId,pItemName,pParentItemId,pFuncName):增加一个菜单项addPopMenuItemByRowSet(pRowSet,pIdCol,pNameCol,pParentIdCol,pFuncCol):通过NormalRowSet增加菜单项addSeparator(pParentId):增加两个菜单项之间的分隔符‘-’PopMenu接口说明(2)

js对象AIPopMenuAIPopMenu是弹出式菜单的页面控件,构造方法:

varpopMenu=newAIPopMenu(AIPopMenuModel);AIPopMenu对象提供的方法:showPopMenu():显示菜单hidePopMenu():隐藏菜单setItemEnabledById(pItemIdStr,flag):按ID设置菜单项enabled属性,flag=ture/falsesetItemHideById(pItemIdStr,flag):按ID设置菜单项隐藏removeItemById(pItemId):按菜单项ID删除……练习case5以case1的Grid为基础,页面前台直接构造PopMenu,要求右键点击Grid时弹出PopMenu,第一层菜单为“opchoose”和“other”,第二层为“add”,“del”,“copy”,上级菜单为“opchoose”。DBListBox除了在DBForm、DBGrid中使用下拉列表,也可以用tag实现下拉列表框有关DBListBox的定义主要包含在DBListBox.js文件中DBListBox接口说明(1)DBListBox标签选项通常,在一个jsp文件中,DBListBox标签使用方法如下:支持方法

onchange:列表改变时,需要调用的事件函数名称

<ai:listboxds="com.ai.sysmgr.staff.Staff"showtype="list"multiselect="true"listsize="8"parameters="org_id=40"nulltext="请选择"id="test1"width="400"onchange="abc"nullid="-1"/>DBListBox接口说明(2)js对象提供的方法getID():获取选中ID值getValue():获取文本值setValue(value):设置下拉数据源的选中项目addItem(id,value):增加一个选项optiondelItem(value):删除指定value的optiondelSelItem():删除选定的optionrefresh(para):根据参数重新刷新数据,参数名称与ds中的参数名称相同getAllItem():返回列表中所有的值和text练习case6以case1中的staff.bo为基础,配置一个staff.ds,参数为org_id(即令organize_id=:org_id),由页面传入。显示一个listbox(以staff.ds为数据源),三个按钮:“add”,“delSel”,“getall”,点击时分别实现增加一个value为“test”的option,删除选中的option,获得所有option的id和value。日期控件除了根据set配置生成外(一般是在DBForm、DBGrid中使用),可以使用平台提供的js对象直接生成日期控件。示例代码:varmDate=newDate();varmYear=mDate.getYear();varmMonth=mDate.getMonth()+1;varmDay=mDate.getDate();varcurrent=mYear+"-"+mMonth+"-"+mDay;varceaseDate=DBDate(current);document.all.item("ceaseTimeDiv").appendChild(ceaseDate);Tab页tab页是一种常用组件,显示效果如下:实现原理——通过两个标签tab和tabitem实现。Tab页接口说明tab和tabitem标签选项

通常,在一个jsp文件中,标签使用方法如下:方法:

setTabItem(tabId,itemId):设置当前tabpage<ai:tabid="test"height="300"width="500"getParameter="getParameter"><ai:tabitemid="f1"src="f1.htm"title="f1"/><ai:tabitemid="f2"src="f2.htm"title="f2"/></ai:tab><scriptlanguage=javascript>functiongetParameter(itemId){return"item="+itemId;}</script>练习case7显示一个tab页,包括两个tabitem,点第一个tabitem显示case1的页面,点第二个tabitem显示case2的页面逻辑层功能介绍服务服务将包含在企业应用中的离散业务功能提取出来,将其组合为可复用的、基于标准的服务,从而可以在Appframe运行环境中部署,成为SOA体系架构中的组件。使用服务,就享有了服务的松耦合和高复用性的特点。举例来说,客户服务的使用,在BBOSS中,上海移动、浙江移动、或者广西移动,对集团客户信息展示来说,前台展示集团客户的信息应该是基本一样的,因此前台页面和客户服务的接口在上述三个移动公司的BBOSS系统中可以保持不变,几乎可以完全复用。如果后台的数据存储也一样的话,客户服务的实现也可以完全重用。如果后台的数据存储根本不一样,则只要修改客户服务的实现,在BCE中修改接口的服务实现,指向新的服务实现,前台和服务接口无需做任何改变,实现了系统的前后台的松耦合。服务的类型 简单对象服务单实例的POJO服务EJB服务WebService服务APPFrame自定义的action服务JBOSS服务简单对象服务

<serviceid="IEventService"name="简单对象服务"interface="service.addmodule.IEventService"listen="false"> <impl-definetype="simple"use="true" impl-class="service.addmodule.IEventServiceImpl"> </impl-define></service>单实例的POJO服务

<serviceid="IServiceIndependence"name="单实例服务"interface="service.addmodule.IServiceIndependence"listen="false"> <impl-definetype="singleton"use="true" transaction-name="abc" transaction-type="independence" Impl-class="service.addmodule.IServiceIndependenceImpl"> </impl-define></service>ejb服务

<moduleid="service"name="服务测试模块"ejb-deploy="boss20"><serviceid="IEJBService"name="EJB服务测试"interface="erfaces.TestHello"listen="false"> <impl-definetype="ejb"use="true"jndi="ejb.TestHello"

home-interface="erfaces.TestHelloHome"></impl-define></service></module>辅助说明:ejb-deploy="boss20":指明用到的ejb服务器boss20,boss20是在ai-service-config.xml中定义的webservice服务

<moduleid="service"name="服务测试模块"ejb-deploy="boss20" action-deploy="web222"webservice-deploy="web20"> <serviceid="IHelloWorld"name="webservice测试" interface="webservice.IHelloWorld"listen="false"> <impl-definetype="webservice"use="true" impl-class="services/HelloWorld"> </impl-define> </service></module>辅助说明:webservice-deploy="web20":指明用到的webservice服务器是web20,web20是在ai-service-config.xml中定义的Appframe自定义的action服务

<moduleid="service"name="服务测试模块"ejb-deploy="boss20"action-deploy="web222"webservice-deploy="web20"> <serviceid="IActionService"name="action测试" interface="service.addmodule.IActionService"listen="false"> <impl-definetype="action"use="true"transaction-name="abc" transaction-type="join" impl-class="service.addmodule.IActionServiceImpl"> </impl-defin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论