- 浏览: 122290 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
弦月001:
楼主目前对jcifs还记得吗?我目前在做jcifs sso研究 ...
JCIFS支持多域的SSO -
jusescn:
effort.mjb 写道博主好,请问怎么样才能直接获取到当前 ...
JCIFS支持多域的SSO -
effort.mjb:
博主好,请问怎么样才能直接获取到当前客户端的用户的域信息呢?( ...
JCIFS支持多域的SSO -
jusescn:
yingzhor 写道博主,您好。 如果,我想扩展一下,如果客 ...
JCIFS支持多域的SSO -
yingzhor:
博主,您好。 如果,我想扩展一下,如果客户端不再域内,直接把请 ...
JCIFS支持多域的SSO
原文可以去springside的论坛上找。
我的思路如下:
一、增加一套基于EXTJS的控件
我感觉可以通过增加Struts2的一个theme,干脆叫做ext_xhtml,可以参考ajax theme,做一套。
控件包括:
1、tree可以支持拖拉,编辑还是权限,在基本树的基础上扩展为用户、角色、部门选择树。
2、grid应该支持右键菜单,右键菜单中包括编辑、打开、删除以及其他定制操作,
当然支持shift、ctrl多选,多选和单选后,右键菜单是不一致的。
3、表单。
3.1 富文本编辑。
3.2 日期选择控件。
3.3 BeanEditForm,功能类似Tapestry 5的BeanEditForm,
3.3.1 通过property设置那些属性编辑、那些不需要;
3.3.2 通过Model的property的类型和JPA Annotation,自动选择input type而且自动增加类型validation。
属性类型和input type 对应如下:
@Basci,String => text
@Basci,long,int、float等数据类型 => text
@one-to-many等数据类型 => select
或者(option="id",value="name")需要实现IEntity和IName,必须有id,name属性
或者自定义实现ISelectModel
@Basci,date、time等日期类型 =>日期选择控件
@lob,byte[] =>file
@lob,String =>富文本编辑
其他 =>定制
3.4 FileUpload,文件上传主要需要统一考虑性能和存储管理问题,最好增加Cache.
3.4.1 文件上传流程:文件先放在Cache中,然后通过JMS异步写入到数据库中。
3.4.2 文件下载流程:先从Cache中读文件,Cache如果没有,从数据库中读,并写入到cache中。
4、struts2支持json
4.1 增加JSON interrupter
4.2 增加JSON Result
4.3 基于Json-lib(http://json-lib.sourceforge.net/)
5、工具条
一般来说,每个gird都带有一个工具条。包括统一查询、新建等快捷键。
二、支持Restful 2
2.1 URL路由规则。在StrutsEntityAction中实现index、view、edit、editNew、create、update、remove方法就可以。
子类一般无需实现,但留有回调就可以。路由规则如下:
GET: /groupId/7/user => method="index" ,groupId=7 =>listUser.jsp
GET: /groupId/7/user/5 => method="view", id=5 ,groupId=7 =>viewUser.jsp
GET: /groupId/7/user/5!edit => method="edit", id=5 ,groupId=7 =>editUser.jsp
GET: /groupId/7/user/new => method="editNew" ,groupId=7 =>newUser.jsp
POST: /groupId/7/user => method="create" ,groupId=7 =>listUser.jsp
PUT: /groupId/7/user/5 => method="update",id=5 ,groupId=7 =>listUser.jsp
DELETE: /user/5 => method="remove" =>listUser.jsp
DELETE: /id/1/id/2/id/3/user => method="remove" =>listUser.jsp (批量删除)
2.2 在StrutsEntityAction,增加getHelper,实现ROR的部分help功能.
2.2.1 url helper。public String url(String action, String... params);
比如<s:set name="thisUrl" value="helper.url('user','groupId=2','roleId=5')" />
2.2.2 获得参数的功能;这方面比动态语言稍微不方便一点。
helper.getParam("groupId").toString();
helper.getParam("selectUserIds").toList();//比如客户在用户表中,一次选择多个用户。
不过在JSP中也很简单。
<c:set var="groupId" value="${params.groupId}" />
三、零配置
3.1 Struts2的零配置。通过Annotation和Restful2ActionMapper和CodeBehind。
3.1.1 需要修改Struts2的源码(ClasspathConfigurationProvider),支持wizard功能。(无奈的办法)
3.1.2 增加类似Restful2ActionMapper,CodeBehind功能的RuleActionMapper和RuleCodeBehind支持动态路由规则。
3.2 Spring的零配置. 基于sannotations(http://sannotations.sourceforge.net/)。
需要修改源码来支持parent和abstract属性。(无奈的办法)
3.3 JPA的零配置.比较容易做到。
四、DAO
4.1 dao采用CRUD GenericDAO模式.
4.1.1 参考文章
http://forum.springframework.org/showthread.php?p=120962
http://www-128.ibm.com/developerworks/java/library/j-genericdao.html
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
4.2 增加 JPA 的DSL Criteria Style api。Hibernate的Criteria不太易用。
这方面BBA 96 这个开源项目做的很不错。不过可以再优化。基本思路如下:
4.2.1 简单的
List users = GenericDAO.find(User.class,"groups:g.name","开发部")
4.2.2 复杂的
Criterion criterion = Criterions.select(distinct(),count(),"g.name")
.and(
in("groups:g.name", "开发部","测试部","人事部","行政部门").eq("roles::r.name", "admin")
).or(
eq("disable", true).gt("menus.m",1)
)
.group("g.name")
.having(gt(count(),1))
.order(asc("createtime"));
//这个只是例子,
List users = GenericDAO.find(User.class,criterion)
介绍以下:
4.2.2.1、"groups:g.name"是用户和部门内连接,g是部门的别名,g.name是部门的name属性
4.2.2.2、"roles::r.name"是用户和角色左连接,r是角色的别名,r.name是角色的name属性
4.2.2.3、目前只支持内连接和左外连接,其他连接在实际应用中一般极少用到.如果碰到这种情况,你可以试试去买彩票了。^_^
4.2.2.4、如果没有select方法,那么就是select *。and、in、or 、eq、gt、group、having、order都可以没有,根据情况而定。
4.2.2.5、支持eq、ne、le、ge、gt、lt、between、in、like、ilike等操作。
4.2.3 支持QBE
User user = new User();
List<User> Users = UserDao.find(like(User).excludeProperty("name"));
4.2.4 支持智能行数计算
count(criterion),具体做法就是去掉group和order,
然后在select count(o) from (去掉group和order的JPA QL) o。
4.2.5 支持常用MODEL
4.2.5.1 主键统一名称为id,类型为Long的EntityImpl implement IEntity
public Long getId();
public void setId(Long id);
4.2.5.2 具有名称属性的NameEntityImpl extends EntityImpl implement IName
public String getName();
public void setName(String name);
4.2.5.3 名称唯一的UniqueNameEntityImpl extends NameEntityImpl implement IUniqueName
4.2.5.4 有创建和更新时间,RecordableEntityImpl extends EntityImpl implement IRecordable
4.2.5.5 当然都是各种接口。比如说,RecordableUniqueEntity extends UniqueNameEntityImpl implement IRecordable
五、Service
5.1 增加BaseEntityManager,其他Entity Service来继承这个BaseEntityManager
5.2 组件,比如说compass、jbossrules、jbpm等应该在这个层次上定义
SearchManager,RuleManager,WorkFlowManager,CacheManager,SecurityManager
5.3 不能光看到ROR开发效率高,但同时也要看到ROR复用程度并不是很高。当然只是我个人意见,ROR fans别用砖头砸我。^_^
5.4 增加异类关联。有点像@hibernate.any,不是一般的1:n或者m:n关联。实际情况很常见。
而且就是hibernate.any也不能做到双向关联。
比如说表单和工作流实例的关系、表单和附件的关系,日志和被记录实体的关系
六、增强测试
6.1 基于Testng。junit无法实现测试方法的依赖关系。
6.2 做各种测试基类。比如AbstractBaseManagerTests、BaseSearchManagerTests、BaseRuleManagerTests。
6.3 坚持Pragmatic风格的测试。减少mock测试。毕竟我们是给他人提供框架的人。
框架本身可以给二次开发人员提供mock测试。
七、项目管理
7.1 做持续继承。可以通过CiruseControl,建议continuum更好。
7.2 做单元测试覆盖率.
7.3 彻底maven2,不要看到任何ant target。开发maven2 Mojo相当easy.
我的E-Mail: yangxionghui@263.net
我的思路如下:
一、增加一套基于EXTJS的控件
我感觉可以通过增加Struts2的一个theme,干脆叫做ext_xhtml,可以参考ajax theme,做一套。
控件包括:
1、tree可以支持拖拉,编辑还是权限,在基本树的基础上扩展为用户、角色、部门选择树。
2、grid应该支持右键菜单,右键菜单中包括编辑、打开、删除以及其他定制操作,
当然支持shift、ctrl多选,多选和单选后,右键菜单是不一致的。
3、表单。
3.1 富文本编辑。
3.2 日期选择控件。
3.3 BeanEditForm,功能类似Tapestry 5的BeanEditForm,
3.3.1 通过property设置那些属性编辑、那些不需要;
3.3.2 通过Model的property的类型和JPA Annotation,自动选择input type而且自动增加类型validation。
属性类型和input type 对应如下:
@Basci,String => text
@Basci,long,int、float等数据类型 => text
@one-to-many等数据类型 => select
或者(option="id",value="name")需要实现IEntity和IName,必须有id,name属性
或者自定义实现ISelectModel
@Basci,date、time等日期类型 =>日期选择控件
@lob,byte[] =>file
@lob,String =>富文本编辑
其他 =>定制
3.4 FileUpload,文件上传主要需要统一考虑性能和存储管理问题,最好增加Cache.
3.4.1 文件上传流程:文件先放在Cache中,然后通过JMS异步写入到数据库中。
3.4.2 文件下载流程:先从Cache中读文件,Cache如果没有,从数据库中读,并写入到cache中。
4、struts2支持json
4.1 增加JSON interrupter
4.2 增加JSON Result
4.3 基于Json-lib(http://json-lib.sourceforge.net/)
5、工具条
一般来说,每个gird都带有一个工具条。包括统一查询、新建等快捷键。
二、支持Restful 2
2.1 URL路由规则。在StrutsEntityAction中实现index、view、edit、editNew、create、update、remove方法就可以。
子类一般无需实现,但留有回调就可以。路由规则如下:
GET: /groupId/7/user => method="index" ,groupId=7 =>listUser.jsp
GET: /groupId/7/user/5 => method="view", id=5 ,groupId=7 =>viewUser.jsp
GET: /groupId/7/user/5!edit => method="edit", id=5 ,groupId=7 =>editUser.jsp
GET: /groupId/7/user/new => method="editNew" ,groupId=7 =>newUser.jsp
POST: /groupId/7/user => method="create" ,groupId=7 =>listUser.jsp
PUT: /groupId/7/user/5 => method="update",id=5 ,groupId=7 =>listUser.jsp
DELETE: /user/5 => method="remove" =>listUser.jsp
DELETE: /id/1/id/2/id/3/user => method="remove" =>listUser.jsp (批量删除)
2.2 在StrutsEntityAction,增加getHelper,实现ROR的部分help功能.
2.2.1 url helper。public String url(String action, String... params);
比如<s:set name="thisUrl" value="helper.url('user','groupId=2','roleId=5')" />
2.2.2 获得参数的功能;这方面比动态语言稍微不方便一点。
helper.getParam("groupId").toString();
helper.getParam("selectUserIds").toList();//比如客户在用户表中,一次选择多个用户。
不过在JSP中也很简单。
<c:set var="groupId" value="${params.groupId}" />
三、零配置
3.1 Struts2的零配置。通过Annotation和Restful2ActionMapper和CodeBehind。
3.1.1 需要修改Struts2的源码(ClasspathConfigurationProvider),支持wizard功能。(无奈的办法)
3.1.2 增加类似Restful2ActionMapper,CodeBehind功能的RuleActionMapper和RuleCodeBehind支持动态路由规则。
3.2 Spring的零配置. 基于sannotations(http://sannotations.sourceforge.net/)。
需要修改源码来支持parent和abstract属性。(无奈的办法)
3.3 JPA的零配置.比较容易做到。
四、DAO
4.1 dao采用CRUD GenericDAO模式.
4.1.1 参考文章
http://forum.springframework.org/showthread.php?p=120962
http://www-128.ibm.com/developerworks/java/library/j-genericdao.html
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
4.2 增加 JPA 的DSL Criteria Style api。Hibernate的Criteria不太易用。
这方面BBA 96 这个开源项目做的很不错。不过可以再优化。基本思路如下:
4.2.1 简单的
List users = GenericDAO.find(User.class,"groups:g.name","开发部")
4.2.2 复杂的
Criterion criterion = Criterions.select(distinct(),count(),"g.name")
.and(
in("groups:g.name", "开发部","测试部","人事部","行政部门").eq("roles::r.name", "admin")
).or(
eq("disable", true).gt("menus.m",1)
)
.group("g.name")
.having(gt(count(),1))
.order(asc("createtime"));
//这个只是例子,
List users = GenericDAO.find(User.class,criterion)
介绍以下:
4.2.2.1、"groups:g.name"是用户和部门内连接,g是部门的别名,g.name是部门的name属性
4.2.2.2、"roles::r.name"是用户和角色左连接,r是角色的别名,r.name是角色的name属性
4.2.2.3、目前只支持内连接和左外连接,其他连接在实际应用中一般极少用到.如果碰到这种情况,你可以试试去买彩票了。^_^
4.2.2.4、如果没有select方法,那么就是select *。and、in、or 、eq、gt、group、having、order都可以没有,根据情况而定。
4.2.2.5、支持eq、ne、le、ge、gt、lt、between、in、like、ilike等操作。
4.2.3 支持QBE
User user = new User();
List<User> Users = UserDao.find(like(User).excludeProperty("name"));
4.2.4 支持智能行数计算
count(criterion),具体做法就是去掉group和order,
然后在select count(o) from (去掉group和order的JPA QL) o。
4.2.5 支持常用MODEL
4.2.5.1 主键统一名称为id,类型为Long的EntityImpl implement IEntity
public Long getId();
public void setId(Long id);
4.2.5.2 具有名称属性的NameEntityImpl extends EntityImpl implement IName
public String getName();
public void setName(String name);
4.2.5.3 名称唯一的UniqueNameEntityImpl extends NameEntityImpl implement IUniqueName
4.2.5.4 有创建和更新时间,RecordableEntityImpl extends EntityImpl implement IRecordable
4.2.5.5 当然都是各种接口。比如说,RecordableUniqueEntity extends UniqueNameEntityImpl implement IRecordable
五、Service
5.1 增加BaseEntityManager,其他Entity Service来继承这个BaseEntityManager
5.2 组件,比如说compass、jbossrules、jbpm等应该在这个层次上定义
SearchManager,RuleManager,WorkFlowManager,CacheManager,SecurityManager
5.3 不能光看到ROR开发效率高,但同时也要看到ROR复用程度并不是很高。当然只是我个人意见,ROR fans别用砖头砸我。^_^
5.4 增加异类关联。有点像@hibernate.any,不是一般的1:n或者m:n关联。实际情况很常见。
而且就是hibernate.any也不能做到双向关联。
比如说表单和工作流实例的关系、表单和附件的关系,日志和被记录实体的关系
六、增强测试
6.1 基于Testng。junit无法实现测试方法的依赖关系。
6.2 做各种测试基类。比如AbstractBaseManagerTests、BaseSearchManagerTests、BaseRuleManagerTests。
6.3 坚持Pragmatic风格的测试。减少mock测试。毕竟我们是给他人提供框架的人。
框架本身可以给二次开发人员提供mock测试。
七、项目管理
7.1 做持续继承。可以通过CiruseControl,建议continuum更好。
7.2 做单元测试覆盖率.
7.3 彻底maven2,不要看到任何ant target。开发maven2 Mojo相当easy.
我的E-Mail: yangxionghui@263.net
发表评论
-
淘宝技术嘉年华ADC2013主题论坛视频
2013-08-01 13:29 1278业务架构&后端技术 CRM平台架构 http:/ ... -
2012年开春计划-系统调优之路
2012-03-01 10:16 512012年开春计划,今年打算边学边写一点系统优化方法的东西。年 ... -
浅谈企业应用架构
2009-05-06 12:27 680http://www.blogjava.net/AndersL ... -
大型网站架构技术方案集锦
2008-12-26 11:01 4430http://www.cnblogs.com/net205/a ... -
大型网站架构演变和知识体系
2008-09-04 12:14 972这是一篇简单的,用来入门的。 http://www.blogj ... -
从LiveJournal后台发展看大规模网站性能优化方法
2008-09-04 12:10 839http://blog.zhangjianfeng.com/a ... -
舍得网数据库缓存策略
2008-08-16 22:07 0请把该文贴到自己的博 ... -
好事要做到底,我们需要full stack的设计
2008-07-16 09:19 1027http://www.blogjava.net/OneEyeW ... -
一个Java的Restful服务框架,支持JPA、JAAS、分布式资源对象
2008-06-18 09:48 1554http://www.iteye.com/news/2582 ... -
快速Web开发环境&模板jws-jpt1.0发布
2008-06-18 09:47 1045http://www.iteye.com/news/2589 ... -
大量小文件的实时同步方案
2008-06-18 09:38 2327http://blog.daviesliu.net/2008/ ... -
反模式[中英文版]
2008-06-17 17:47 1484来自Wikipedia, 自由百科 ... -
LinkedIn架构图:99%都是用Java写的
2008-06-14 10:24 5187著名社交网站LinkedIn的Java架构技术,在Java ... -
一种一站式的Java Web框架的设计和实现
2008-05-07 17:16 1661http://zwchen.iteye.com/blog/47 ... -
软件架构
2008-05-04 09:42 856软件架构(software archite ... -
web架构设计经验分享
2008-04-28 13:00 961本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次 ... -
1人30天44587行代码,分享舍得网开发经验【修订版】
2008-04-07 12:48 1417http://www2.matrix.org.cn/threa ...
相关推荐
10、本项目有详细的注解、代码重构、可扩展、易读性高。 ---------本人就是用这个框架开发系统或网站的!在这里发布不求别的 就是想赚点下载积分和帮助大家----------- 有需要的可以到我这里下载,祝大家使用愉快...
toxy是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问题,比如pdf, doc, docx, xls, xlsx等,尽管听上去支持了很多格式,但它的使用却是极其方便的,因为Toxy把复杂的抽取流程透明化,Toxy的用户根本不用...
现在主题由editXY可以随意去掉本主题包含了SSPANEL的完整代码,需要删除原来的面板,然后全新安装(数据库通用),操作前请备份面板贡献 ||由于原开发团队已经放弃了Malio主题,因此此项目欢迎各种贡献,包括但不...
点斜杠 一个可扩展的,友好的项目框架。特征在现有项目中轻松安装使用新命令轻松扩展自动生成的使用说明安装在您的项目根目录中: bash -c " $( curl -sS ...
java版ss源码 VW-Crawler 背景 自己一直对爬虫比较感兴趣,大学的毕业论文也是一个爬虫项目(爬教务处信息,然后做了个Android版教务管理系统,还获得了优秀毕业设计的称号),自那以后遇到自己感兴趣的网站就会去抓...
如果理解了,就可以把这个框架玩活了,项目开发肯定会更加顺利,而且还可以开发很多额外的功能,甚至中间件扩展开发。 但是就这么一个东西,是很多学习node.js的小萌新们就算写出一个博客项目,都不知道它到底有啥...
支持插件扩展 支持 webjars 资源 基于任务的cron表达式 内置多种常用中间件 内置 JSON 输出 JDK8+ 概述 » 简单:设计简单,易于理解,并且不会在您和标准库之间引入很多层。 这个项目的目标是用户应该能够在一天内...
搭建基于express框架运行环境 开发后端的node服务 1.安装express ① 安装全局变量 npm install express-generator -g (全局变量会在C盘node文件下) ②查看安装成功:express -version 2.通过生成器自动创建项目...
这篇文章中我们来继续学习Picasso中还提供了哪些扩展功能,一个好的框架一定是扩展性强的,你需要的我刚好有。 下面看一下都提供了哪些扩展功能呢? Picasso内部采用了建造者模式,所以我们只看Builder内部类都提供...
在test-ss-11 的基础上进一步扩展 增加了对session的管理 可使用redis或者mongodb进行session缓存 对session失效或者过期的处理 增加RBAC模型的实体类 user role permission(用户-角色-权限)再加上两个关系实体,...
bottle是一个小型web框架,很小只有一个文件,但功能确很强大,学起来也简单,简单和小巧的同时也有很多不足,某些功能支持还不是很完善,比如session.但是也有它自身的好处,我们可以自己或使用别的模块来扩展它,不像...
上实现的编排器自动扩展 Google Compute Engine 虚拟机。 它旨在与状态发布工具一起运行,该工具将发布有关 Compute Engine 虚拟机的信息。 有关更多信息,请参阅下面的状态发布者部分。 支持的组件 语言: Java 谷...
NFT(NetSuite快速通道工具包) 适用于SuiteScript 2.x 这是一个很小但功能强大的框架,可用于编写可扩展的SuitScript。 一个主要目标是使创作脚本易于编写和维护。 包括类似于nsdal(Netsuite数据访问层) ...
通俗的来讲,Less 是一个Css 预编译器,意思指的是它可以扩展Css语言,添加功能如允许变量(variables),混合(mixins),函数(functions) 和许多其他的技术,从而可以让Css更具维护性,主题性,扩展性。 本文为Less入门与...
最近由于项目开发需要,手机客户端和网页端统一使用一套接口,为保证 会话(Session) 能够正常且在各类情况下兼容,我希望能够改变 SessionID 的获取方式。...在 Laravel 框架中,实现 Session 初始化、读取和启动,都
该代码最初是将国际海洋探索理事会(ICES)输入文件转换为年龄结构评估计划(ASAP)文件的一种方式,后来被扩展为包括其他其他框架,如(SS)。 要做出贡献,请发出拉取请求或向发送电子邮件。 如果发现软件包有...
由于常在代码开始部分引入占位符扩展,所以就应该将其置于代码顶部而不受其他因素所影响;优先使用 @include 还是 @extend?这里给出的答案是 @include。自意识混合宏的核心是通过创建或扩展占位符选择器,动态地...
我们要使用的技术包括:可扩展的样式表语言转换(Extensible Stylesheet Language Transformations,XSLT)、XML 路径语言(XML Path Language,XPath)和资源描述框架(Resource Description Framework,RDF)。...
赤城保天使日常信息的分析工具服务器要求Laravel框架有一些系统要求: PHP> = 5.4 MCrypt PHP扩展GD PHP扩展作曲家数据库要求MySQL> = 5.x权限您可能需要授予Web服务器对app / storage目录的写入权限安装作曲家curl ...
世界上最成熟、最稳定、最强大的专业级CSS扩展语言! 兼容CSS Sass完全兼容所有版本的CSS。我们对此严格把控,所以你可以无缝地使用任何可用的CSS库。 特性丰富 Sass拥有比其他任何CSS扩展语言更多的功能和特性。...