- 浏览: 225264 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (212)
- 架构师-01-文档目录 (3)
- 架构师-02-组织 (7)
- 架构师-03-实施 (35)
- 架构师-04-监督 (14)
- 架构师-05-工具 (29)
- 架构师-09-引用文集 (63)
- 专题-01-微博应用 (5)
- 专题-02-GoogleEarth (1)
- 专题-03-运行维护 (9)
- 专题-04-经纪人营平 (3)
- 专题-05-RCP&RAP (5)
- 专题-06-框架PK (3)
- 专题-07-Android (13)
- 专题-08-UI (3)
- 专题-liferay6 (6)
- 专题-extjs4 (3)
- 专题-CXF (3)
- 专题-封闭网络的社会化 (0)
- 扯谈 (4)
- 外包 (9)
- 专题-C++ (4)
- 专题-09-BI (2)
- jquery&easyui (2)
- 专题-搜索引擎 (1)
最新评论
-
brighter:
oMapper.configure(Deserializati ...
jackson 抛出 bean 中没有定义字段的错误,只好用 gson -
PassFeed_free:
public Bitmap decode(ImageDecod ...
android universalimageloader 几点改进 -
PassFeed_free:
楼主你好, 请问这个库, 在大屏显示高清图片 ,listvie ...
android universalimageloader 几点改进 -
yonghong:
楼主只是揣测
JIRA4.1 升级到 JIRA5.1 -
abdxj:
"Could NOT parse license t ...
JIRA4.1 升级到 JIRA5.1
RIA 是必须的了,实现 RIA 的路径也特别的多,摸索正确的框架搭档和最佳实践路径也成了必须。
1、基调
(1)后端用: java
(2)前端用: Dojo 或 JQuery
(3)前端组件库:smartClient 或 dojo/jquery官方组件库
2、路径
(1)struts,chain,tile,dojo,smartClient
(2)struts,dwr,jquery,自写UI组件
3、路径 1 解剖(struts,chain,tile,dojo,smartClient)
(1)目录
(2)应用按模块方式组织,一个模块分三个部份存放
。class 直接放入 classes 或 lib
。jsp 页面和struts 配置放入 /WEB-INF/services-xxx 下的 config 和 pages
。前端脚本放入应用根目录 /service-xxx/js/
(3)载入
。跳到独立页面 uum.jsp
<%@ include file="uum.jsinc" %> 其中载入应用模块 js 文件 ... <c:set var="services-uum/js/uum.js" value="true" scope="request"/> ...
。初始化 isomorhpic
。session 中取得 userData
。初始化 dojo
。载入应用
// uum.js var acUnifiedUserManagement = new function() { this.load = function() { dojo.require("dojo.event.*"); // Specify non-Dojo module prefixes dojo.setModulePrefix("infa", "../../services-uum/js/infa"); // Load Informatica common code dojo.require("infa.ajax.*"); // Load application dojo.require("infa.ajax.application.Application"); dojo.require("infa.tools.uum.ApplicationProperties"); dojo.hostenv.writeIncludes(); // TODO should move to ApplicationProperties isc.Page.setAppImgDir(isc.Page.getAppDir() + "services-uum/images/"); } }
<!----- Load the dojo toolkit ----->
<script type="text/javascript" src="${acGlobalVars.jsPath}/dojo/dojo.js"></script> <script type="text/javascript"> acUnifiedUserManagement.load(); </script> <body scroll="no" style="overflow:hidden"> <script type="text/javascript"> // set flag indicating which perspective appears by default window.infa_defaultPerspective = "admin"; infa.ajax.application.Application.run( new infa.tools.uum.ApplicationProperties(window.infa_defaultPerspective) ); infa.ajax.application.Application.baseURL = "${acGlobalVars.ctxPath}"; </script> </body>
(4)应用模块调用入口
。infa.ajax.application.Application.run()
。this._run(), 初始化 title,history,bookmark,perspective,_init(),layout.show(),_runSession()
。this._init(), 初始化 本地语言,创建 layout
// create layout dojo.require("infa.ajax.application.View"); this.layout = infa.ajax.application.View.create({ ID: "infa_app_layout", left: 0, top: 0, className: this.properties.layoutStyle, width: "100%", height: "100%", showToolbar: this.properties.showToolbar, showHeader: this.properties.showHeader, helpMenuItems: this.properties.helpMenuItems, toolbarClassName: "infa_applicationToolbar", toolbarHeight: 27, bundle: this.bundle, application: this, initWidget: function() { this.Super("initWidget", arguments); if (this.showToolbar) { dojo.require("infa.ajax.widgets.Menu"); this.helpMenu = infa.ajax.widgets.Menu.create({ data: this.helpMenuItems, width: 200, variableWidth: true }); this.commands = [ {cmd:"account", title:this.bundle.applicationAccountCommand, showTitle:true, icon:"account.gif"}, {cmd:"helpMenu", title:this.bundle.applicationHelpMenu, showTitle:true, submenu:this.helpMenu, showMenuButtonImage:true} ]; this.toolbarCommands = [ "helpMenu" ]; } }, createHeader: function() { return this.application._createHeader(); }, doCommand: function(cmd) { var handled = this.Super("doCommand", arguments); if (cmd == "account") { this.application.showAccount(); handled = true; } else if (!handled) { handled = this.application.perspectives[this.application.activePerspective].instance.doCommand(cmd); } return handled; }, enableCommand: function(cmd) { switch(cmd) { case "account": case "helpMenu": return true; default: return this.application.perspectives[this.application.activePerspective].instance.enableCommand(cmd); } } });
(5)View 是继承于 isc.VLayout
// define class isc.ClassFactory.definePackageClass( "infa.ajax.application.View", // class name isc.VLayout // superclass );
(6)View.initWidget()
// initialize CSS classes // initialize images // call overridden method // get base resource bundle // command bars array holds on to menus and toolbars whose state // will get updated in response to events (such as selection changed) // create header // create toolbar // by default, detach/attach and min/maximization occurs to this class // force toolbar/menu commands to be updated at a point later in time // when this view has been fully initialized
(7)数据源
。集中一个文件存放模块内的全部数据源 /infa/tools/uum/ds/DataSources.js , 标准的 smartClient 数据源格式
infa.tools.uum.ds.user = isc.DataSource.create({ fields:{ id:{type:"text", required:true, primaryKey:true, title:"ID", name:"id", canEdit:false}, userName:{type:"text", required:true, title:"Login", name:"userName", canEdit:false}, namespace:{type:"text", required:true, title:"Namespace", name:"namespace", canEdit:false}, fullName:{type:"text", title:"Full Name", name:"fullName"}, description:{type:"text", title:"Description", name:"description"}, password:{type:"text", title:"Password", name:"password"}, email:{type:"text", title:"Email", name:"email"}, phone:{type:"text", title:"Phone Number", name:"phone"}, disable:{type:"boolean", hidden:true, name:"disable"}, administrator:{type:"boolean", hidden:true, name:"administrator"}, path:{type:"text", required:true, hidden:true, name:"path"} }, ID:"infa_uum_ds_user" })
。UsersView 中 doCommand 新增用户,将弹窗的 saveData 事件绑定到 View._addUserFromDialog 事件
。_addUserFromDialog 从弹窗中获取数据,调用 user 数据源增加事件。
(8)前后端数据传送
。前端数据源 ID:"infa_uum_ds_user"
。后端 chain-config.xml 配置 chain 操作
<chain name="infa_uum_ds_user"> <command className="app.services.uum.chain.commands.GetUserInfoCommand"/> <command className="app.services.uum.chain.commands.AddUserCommand"/> <command className="app.services.uum.chain.commands.UpdateUserCommand"/> <command className="app.services.uum.chain.commands.DeleteUserCommand"/> </chain>
。AddUserCommand -> UserBaseCommand -> BaseDSCommand -> DSCommand -> RPCCommand -> AbstractCommand -> implements org.apache.commons.chain.Command
。增加用户的 java 代码
protected boolean executeOperation(WebContext actionCtx, ISCRequest request, ISCResponse response) throws Exception { logger.debug("\n\n\n.....addData for " + request.getDSRequest().getDataSourceName() + "\n\n\n"); UserFacade facade = (UserFacade)getFacade(UserFacade.class); try { Map newValues = request.getData(); String userName = newValues.get("userName") == null ? "" : (String)newValues.get("userName"); String fullName = newValues.get("fullName") == null ? "" : (String)newValues.get("fullName"); String password = newValues.get("password") == null ? "" : (String)newValues.get("password"); String description = newValues.get("description") == null ? "" : (String)newValues.get("description"); String email = newValues.get("email") == null ? "" : (String)newValues.get("email"); String phone = newValues.get("phone") == null ? "" : (String)newValues.get("phone"); User user = new User(); user.setUserName(userName); user.setNameSpace("Native"); try { user.setEncryptedPassword(Cryptographer.encryptData(password)); } catch (PCSFException e) { e.printStackTrace(); } UserInfo info = new UserInfo(); info.setFullName(fullName); info.setDescription(description); info.setEmail(email); info.setPhone(phone); info.setDisable(false); user.setInfo(info); facade.addUser(user); newValues.put("disable", Boolean.valueOf(false)); newValues.put("path", UserTreeNode.buildPath(user.getNameSpace(), user.getUserName())); response.setData(newValues); } catch (UUMOperationException e) { response.addError(null, e.getISCErrorMessage()); } return true; }
。然后调用 service 操作数据库。
4、路径 2 解剖(struts,freemarker,dwr,jquery,自写UI组件)
(1)目录
。整个站点以 freemarker + struts 显示,
。/WEB-INF/classes/template ,全部页面模板文件 ftl,没有明确独立模块存放标志。
。/WEB-INF/classes/spring-*.xml 配置文件,
(2)/WEB-INF/classes/template/decorator/default/template.ftl - 主页全局文件,全站唯一入口。
<!----> <html> <head> ... </head> <body class="${page.getProperty("body.class")!}" > <div id="plus-wrapper" class="clearfix"> <#include "/template/decorator/default/page-header.ftl" /> <#if !page.getProperty("meta.nouserbar")??> <#include skin.userBar.pageUserBarTemplate /> </#if> <div id="${bodyID!('plus-body')}"> <#include "/template/decorator/default/page-breadcrumb.ftl" /> ${page.body} </div> <#if !page.getProperty("meta.nofooter")??> <#include "/template/decorator/default/page-footer.ftl" /> </#if> </div> ... </body> </html>
(3)sturts-config.xml
// struts-config.xml <action name="profile" class="com.plusrun.community.action.ViewProfile"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="profileUserHistory"/> <interceptor-ref name="store"> <param name="operationMode">RETRIEVE</param> </interceptor-ref> <result name="refresh" type="redirect">/people/${targetUser.username}</result> <result name="success">/template/global/view-profile.ftl</result> <result name="success-projects">/template/global/view-profile-projects.ftl</result> <result name="success-communities">/template/global/view-profile-communities.ftl</result> <result name="success-watches">/template/global/view-profile-watches.ftl</result> ... </action>
(4)view-profile-communities.ftl
// view-profile-communities.ftl <@resource.dwr file="FollowingActionBean" /> ... function startFollowing() { FollowingActionBean.followContainer(14, communityID, true, { callback:function() { $j('#plus-link-community-startFollowing').hide(); $j('#plus-link-community-stopFollowing').show(); Plus.AlertMessage('thread.watch.notify', { beforeStart:function() { <#assign indexStartFollowingCommunityDesc><@s.text name="index.startFollowingCommunity.desc" /></#assign> $j('[id=thread.watch.notify]').html('<div><span class="plus-icon-med plus-icon-info"></span>' + '${indexStartFollowingCommunityDesc?html?js_string}' + '</div>'); } }); }, errorHandler:function(msg, e) { alert("<@s.text name='global.follow.error.messsage'/>"); } }); } function stopFollowing() { FollowingActionBean.followContainer(14, communityID, false, { callback:function() { $j('#plus-link-community-startFollowing').show(); $j('#plus-link-community-stopFollowing').hide(); Plus.AlertMessage('thread.watch.notify', { beforeStart:function() { <#assign indexStopFollowingCommunityDesc><@s.text name="index.stopFollowingCommunity.desc" /></#assign> $j('[id=thread.watch.notify]').html('<div><span class="plus-icon-med plus-icon-info"></span>' + '${indexStopFollowingCommunityDesc?html?js_string}' + '</div>'); } }); }, errorHandler:function(msg, e) { alert("<@s.text name='global.follow.error.messsage'/>"); } }); }
(5)dwr 配置 spring-dwrContext.xml
<bean id="followingActionBean" class="com.plusrun.community.follow.dwr.FollowingActionBean" parent="remoteSupport"> <property name="followingManager" ref="followingManager"/> <property name="plusContainerManager" ref="plusContainerManager"/> <dwr:remote javascript="FollowingActionBean"> <dwr:include method="followContainer"/> </dwr:remote> </bean> <bean id="remoteSupport" class="com.plusrun.community.dwr.RemoteSupport" abstract="true"> <property name="authenticationProvider" ref="authenticationProvider"/> <property name="userManager" ref="userManager"/> <property name="localeManager" ref="localeManager"/> </bean>
(6)后台处理
public abstract class RemoteSupport implements LocaleProvider, TextProvider public class FollowingActionBean extends RemoteSupport ... this.followingManager.followContainer(getUser(), container); ... public class FollowingManagerImpl implements FollowingManager, EventSource ... this.followingDAO.create(user.getID(), descriptor); ...
发表评论
-
集成Hibernate Search做全文检索
2014-05-03 15:42 539集成Hibernate Search做全文检索 原文来自 h ... -
Base64扩展,自定义字串和顺序
2012-12-06 11:10 1676Base64很标准,sun 的 jdk 包含了实现,JS ... -
避免跨域问题 ajax proxy
2012-12-04 09:31 818前端全是 AJAX 框架,其中用到一些动态 API 调用,动静 ... -
Arc-03-32 用户事件跟踪
2012-07-05 15:25 729参照 clickstream 项目,保存到数据库 1.实现原 ... -
CXF 结合jaxb返回json字符串时,当属性为数值型字符串时,没有双引号问题
2012-06-04 14:00 2098问题:CXF 结合jaxb返回json字符串时,当属性为数值型 ... -
Arc-03-30-Postgresql 数据导出到Sqlite
2012-05-15 09:39 0用了空间数据库 PostGis,所以用了 Postgresql ... -
extjs4 有用的资源链接
2012-05-12 01:07 659对 Ext 扩展的一些小总结 http://laodaoba ... -
Arc-03-29 CXF 实现 REST 方式上传文件
2012-04-09 00:46 3069CXF 实现 REST 方式上传文件 /** ... -
Arch-03-28 Jndi 配置 Mongodb jetty 实现
2012-03-06 15:20 1622使用 springdata mongodb,直接使用 spri ... -
Arc-03-27-FTP 服务和客户端小结
2012-01-29 18:08 772尽管局域网中传输文件有 n 多方法,samba,webdav, ... -
Arc-03-26-相册图片短码编码实现
2011-12-29 17:01 911应用中需要上传用户图片,不想数据库单独维护图片的信息,想直接从 ... -
Arch-03-25-JAVA异常列表
2011-12-20 09:37 916ClassCastException 类型转换异常类 ... -
Arch-03-24- Spring Security 应用
2011-11-08 17:47 1434Spring Security 用了几次,还没有在集群环境中使 ... -
Arch-03-23- ActiveMQ 实践
2011-10-28 15:03 823ActiveMQ 到了非用不可的地步了,学习一下吧。主要用途定 ... -
Arch-03-22- 编程实现多数据源,水平切分,异种数据源
2011-10-20 17:35 815在 Spring 的框架下,通过编程实现多数据源(JDBC), ... -
Arch-03-21- Spring 中调用 Guice 中的注入
2011-10-06 20:27 881当 spring 和 guice 共同存在一个项目中,且 sp ... -
Arch-03-20- Shindig 实践
2011-10-06 16:53 779之前已经抄录了几篇网文,初步了解 shindig 功能与特性, ... -
Arch-03-19- NoSQL实践
2011-09-26 10:27 1333虽然对新技术甚为谨慎,但目前大家所做的伪 sns 的 nosq ... -
Arch-03-18- 用 Mysql-proxy 搭建 MySQL 集群
2011-09-20 10:21 882对应上篇 pgpool2 搭建 postgresql 集群,因 ... -
Arch-03-17- 用 pgpool-II 搭建 PostgreSQL 集群
2011-09-19 10:00 3014(一)方案 尽管做数据库 postgresql 集群的方式 ...
相关推荐
Arch-Linux-Install-ScriptArch_Linux_安装脚本_Arch-Linux-Installer
Next Generation On Demand (NGOD) Asset Architecture Comcast-SP-NGOD-ASSET-ARCH-I03-100731 Issued July 31, 2010
"cacti-plugin-arch-2.0.tar.gz" 是一个针对Cacti的插件包,用于扩展Cacti的功能,提供更丰富的监控选项。此插件名为“Arch”,可能是对系统架构或性能分析相关的增强。 该压缩包文件的名称表明它是版本2.0,通常这...
标题“Arch-03-08-热敏打印机集成方法”指的是关于在计算机系统或应用程序中集成热敏打印机的技术过程。热敏打印机是一种利用热敏纸进行打印的设备,广泛应用于零售、餐饮和其他需要快速、小票打印的场景。集成热敏...
变系数ARCH-M模型是时间...研究者和实践者可以根据变系数ARCH-M模型的检验结果采取相应的策略,以减少市场波动带来的风险。此外,通过深入分析影响波动率的宏观经济因素,可以帮助决策者制定更加有效的宏观经济政策。
基于android8.1源码平台中生成的jar,亲测可用!!!!
标题“Arch-03-15- Nginx+tomcat 配置负载均衡动静分离”涉及的是在Web服务器架构中使用Nginx与Tomcat的集成,通过配置实现负载均衡和动静态资源分离。这样的架构可以提高系统的可用性和响应速度,减轻后端应用...
OpenRISC是一种开源的指令集架构(ISA),它致力于提供一个简单、易于实现和使用的处理器核心,适用于广泛的嵌入式系统和应用程序。该文档是关于OpenRISC1000架构的手册,版本号为1.0,修订号为0,发布日期为2012年...
Next Generation On Demand (NGOD) Overall Architecture Comcast-SP-NGOD-GEN-ARCH-I03-100731 Issued July 31, 2010
标题中的"Python库 | arch-4.11-cp35-cp35m-win32.whl"指的是一个特定版本的Python库,名为“arch”,版本为4.11,适用于Python 3.5解释器(由"cp35"标识),且是针对32位Windows操作系统("win32")的。"cp35m"表示...
NULL 博文链接:https://cnmqw.iteye.com/blog/1243596
python库。 资源全名:arch-4.8.0-cp27-cp27m-win32.whl
安装克隆这个仓库git clone https://github.com/jannispinter/arch-openwrt-buildroot.git构建 docker 镜像 cd arch-openwrt-buildrootdocker build -t= " arch-openwrt-buildroot:trunk " . 最后的点表示Dockerfile...
资源来自pypi官网。 资源全名:arch-4.17-cp39-cp39-manylinux1_x86_64.whl
我的Arch_Linux安装步骤和日志_Arch-Linux-install-log
资源来自pypi官网。 资源全名:arch-4.9.1-cp36-cp36m-macosx_10_6_intel.whl
arch-model-estimation_solution.ipynb
arch-snds100驱动程序是专为s3c44b0x处理器设计的一款核心驱动,用于管理和优化硬件资源的使用。s3c44b0x是一款由Samsung生产的微处理器,常用于嵌入式系统,如工业控制、移动设备和消费电子产品等。驱动程序在操作...
Arch_Linux_盒装安装媒介的小盒子_arch-media-box-typst