JiveJdon Community Forums
在线97人 J道首页 | 论坛首页 | 培训咨询 | 开源框架 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 项目工程开发经验谈
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 21 回复 / 2 页 [ 1 2 下一页 ]  发表新帖子  回复该主题贴
aill

发表文章: 134
注册时间: 2004年06月02日 15:20
J2EE网站经验共享! 发表: 2006年06月02日 11:19 回复
网站包括 商家博客,个人博客,论坛,新闻等

设计采用了MVC模式,具体调用的时候采用了命令模式
数据操作层Model中,例如;BlockDAO,TopicDAO,ResponseDAO,UserDAO等。
里面封装了一个对象所有的数据操作

视图/传输层 View 例如BlockDTO,TopicDTO等,主要是对象的属性
jsp用它来显示,dao用它作为DTO


最后就是控制层 Controll 控制层的类都继承了Service接口
里面有一个方法
execute(ServletContext context, HttpServletRequest request,
HttpServletResponse response) {
}
,因为使用命令模式,后面会说明
例如 ManageBlock, ManageTopic等
主要是接收请求然后调用DAO,把结果返回给jsp


调用的时候,我采用的是命令模式
一个所有请求的总入口Servlet被影射到controll.do;他获取Service的类名,然后
实例化这个类,调用对应的方法
例如 ../controll.do?Service=ManageBlock&action=save


String Name = request.getParameter("Service");
if (Name == null||Name.equals(
"")){
ErrorView error=new ErrorView(
"系统获取Service错误。");
request.setAttribute(
"error",error);
request.getRequestDispatcher(Constant.ErrorPage).forward(request,response);
}
String serviceName =
"aill.bbs.controll." + Name;
try {
Class serviceClass = Class.forName(serviceName);
Service service = (Service) serviceClass.newInstance();
boolean isSuc = service.execute(this.getServletContext(), request,
response);
}catch(Exception e){}


下面说说安全架构:
网站采用J2EE的身份认证系统,通过对不同路径的权限限制来做到不用角色具有不同操作捐献
例如:bbs/user/* 下主要是普通用户的操作权限
想新建帖子的时候,请求地址是 bbs/user/insertTopic.jsp

bbs/blockAdmin/*主要是板块管理员的权限
bbs/bbsAdmin/* 下是论坛管理员的权限
bbs/sysAdmin/* 下主要是系统管理员的权限

最后再说说缓存,
缓存的内容主要是数据源,所有板块分类,所有板块的信息[因为这些内容不多,而且使用
比较频繁];还缓存了最新的N个帖子,和点击率最高的N个帖子;
另外还缓存了N[差不多是每个板块前5页的]个帖子点击数

因为缓存主要有两类,一个是只读,一种是读写。数据源就属于只读的,点击数就属于读写的

我设计了两个缓存接口,一个cacheRObject,一个cacheRWObject
cacheRObject里有个init()和 get(key)方法,
init()当然是初始化或者更新缓存的时候用 get方法就是获取被缓存的对象
cacheRWObject里有init(),save()和get(key)方法
这里多出来的save()就是把缓存里的内容更新到sql数据库中

具体要缓存什么东西,只要写一个类继承cacheRObject,或者cacheRWObject

例如

public class BlockKindCache implements cacheRWObject{
HashMap cache=new HashMap();
int size;
//还有其他一些属性,
init(){调用dao获取初始化的内容}
save(){
//保存}
get(key){
//获取}
}

缓存的属性设置都是些在cache.xml配置文件中,包括缓存大小,要更新那些缓存对象
更新的间隔等等
服务器启动的时候,获取这些设置,初始化缓存;
同时服务器关闭的时候把所有cacheRWObject类型缓存中的内容保存到数据库

---其实做这个网站前我从来没做过什么大的java项目,在jdon中也只是一个潜水者,通过这个网站真的学了很多东西,在这里要特别感谢bang大哥和其他各位jdon的兄弟,

说实在的这个网站还有很多自己不满意的地方,希望大家一起交流一起进步

哦,网站地址:www.cityxiu.com 大家可以去看看

还有bang大哥,我把咱们jdon的logo放到我们论坛的下面了,算是做点贡献吧
banq

发表文章: 8929
注册时间: 2002年08月03日 17:08
Re: J2EE网站经验共享! 发表: 2006年06月06日 11:08 回复
不错,先Mark一下,等会儿好好看一下。多谢aill的对jdon支持。
aill

发表文章: 134
注册时间: 2004年06月02日 15:20
Re: J2EE网站经验共享! 发表: 2006年06月06日 16:18 回复
bang大哥客气了,学java几年了,真正提高还是来jdon以后,还有您的书,真心感谢!
banq

发表文章: 8929
注册时间: 2002年08月03日 17:08
Re: J2EE网站经验共享! 发表: 2006年06月08日 11:52 回复
客气。整体设计把握了良好架构和优异性能两个点,作为经验不多的初学者实属难能可贵。

如果你希望在现在架构上有所提高,下面提供几点建议:

1.表现层的controller是通过class.forName来加载业务Service的,一般业务Service都比较大,在并发很大情况下,new Service尚且觉得耗时,所以这里是否需要优化一下?使用资源池pool来预先生成这些大的Service。当然,小型的代码少的service现在这样就可以了。

2.安全架构使用了J2EE的容器验证,但是ACL除了URL资源、还有组件方法的ACL,提供了组件方法的ACL,基本杜绝了安全漏洞,否则,多个Jsp调用同一个组件方法,不同级别权限设置的Jsp资源必然导致这个组件方法访问权限的漏洞。


3.对你缓存分成读和写比较感兴趣,特别是缓存写专门做了一个接口,说明你充分认识到缓存重要性,缓存作为数据库一种临时替代,起到减少数据库连接池的占用等,象这个帖子中询问数据库连接池设置问题,当我们觉得数据库连接池设置再大都不能解决问题时,我们是需要象你这样考虑缓存了,原帖:
http://www.jdon.com/jive/thread.jsp?forum=46&thread=27083

但是使用缓存写需要考虑因素很多,比如两个用户同时写,如何解决资源争夺,如何解决死锁等问题,这些都要求写缓存质量相当高,所以一般在访问大情况下发生这样问题,我们还是依赖数据库强大的ACID事务机制来解决冲突;或者使用支持事务的缓存如JBossTreeCache等。

一般应用下,读缓存就可以了,关键要做好读缓存的更新问题,特别是模型类的嵌套情况下,一个AModel嵌套BModel,那么如何保证AModel中的BModel就是读缓存中的那个BModel,也就是两者同一,这样,万一BModel更新时,只要更新缓存中BModel即可,否则就麻烦了,这些都是非常复杂的域模型缓存问题,这些在JiveJdon3中有些解决,当然还有待提高。

我一直认为:缓存属于业务逻辑编写,因为数据库操作也属于业务逻辑部分,为什么不把等同于数据库的缓存也作为业务逻辑对待呢?正是缓存属于业务逻辑组件,所以,处理缓存是不能完全使用框架替代的,除非使用EJB,但是使用EJB不了解其缓存机制,也会走上使用误区,最后唾弃EJB,这是一些所谓高人经常范的毛病。
aill

发表文章: 134
注册时间: 2004年06月02日 15:20
Re: J2EE网站经验共享! 发表: 2006年06月08日 12:18 回复
谢谢老大的点评!
mythmoon

发表文章: 207
注册时间: 2005年03月21日 01:09
Re: J2EE网站经验共享! 发表: 2006年06月18日 11:57 回复
当你的VIEW(JSP或actionForm)需要对应两个以上的实体bean并且要进行操作你是直接传两个DTO,还是把两个实体转成一个DTO(hashMap)再传到VIEW。
然后,你的DAO又是怎么处理的呢!
我比较疑惑这个问题!
jgtang

发表文章: 3
注册时间: 2006年06月20日 17:13
Re: J2EE网站经验共享! 发表: 2006年06月20日 19:46 回复
IService receiver = (IService)Class.forName(serviceName).newInstance();
ICommand cmd = new CommandXX();
cmd.setReceiver(receiver);
cmd.getParams.add(request);
cmd.getParams.add(response);
cmd.execute();

class CommandXX extends ICommand{
private List params = new ArrayList();
private <T> receiver;
public void execute(){
receiver.method();//method的内容和你的service.execute相同
}
public getter/setter;
}
按我对command的理解,如果让我做的话,我会这么写,不知道合不合理?
jgtang

发表文章: 3
注册时间: 2006年06月20日 17:13
Re: J2EE网站经验共享! 发表: 2006年06月20日 19:46 回复
ICommand cmd = new CommandXX();
cmd.setReceiver(receiver);
cmd.getParams.add(request);
cmd.getParams.add(response);
cmd.execute();

class CommandXX extends ICommand{
private List params = new ArrayList();
private <T> receiver;
public void execute(){
receiver.method();//method的内容和你的service.execute相同
}
public getter/setter;
}
按我对command的理解,如果让我做的话,我会这么写,不知道合不合理?
jgtang

发表文章: 3
注册时间: 2006年06月20日 17:13
Re: J2EE网站经验共享! 发表: 2006年06月20日 20:02 回复
呵呵,不好意思,CommandXX里的params不对,不能是一个ArrayList应该让它是一个Object里面有像Struts的Action Formbean, request, response,等这样的东西.
charrot

发表文章: 1
注册时间: 2006年06月23日 10:48
Re: J2EE网站经验共享! 发表: 2006年06月23日 10:49 回复
呵,原来是厦门的啊,我也是啊,楼主,有空聊聊啊
我的**58061178
limb

发表文章: 19
注册时间: 2006年06月14日 18:01
Re: J2EE网站经验共享! 发表: 2006年06月28日 10:14 回复
不错!
做个标记先!
tocow

发表文章: 4
注册时间: 2006年07月27日 17:26
Re: J2EE网站经验共享! 发表: 2006年07月27日 17:29 回复
大牛啊!那个登记注册码图片怎么生成的呀,是不是只是一个随机码+一张背景图片,呵呵,我的msn:hpj2001@hotmail.com
aill

发表文章: 134
注册时间: 2004年06月02日 15:20
Re: J2EE网站经验共享! 发表: 2006年07月30日 15:26 回复
哈哈,没想到厦门的道友这么多,有空聊聊啊。另外工作很忙,基本不上**或msn,有问题可以到秀城论坛的java板块留言!
feiren2004

发表文章: 1
注册时间: 2006年08月16日 11:52
Re: J2EE网站经验共享! 发表: 2006年08月16日 11:59 回复
终于找到组织了!赞一个
junglesong

发表文章: 36
注册时间: 2006年06月07日 14:05
Re: J2EE网站经验共享! 发表: 2006年09月05日 16:19 回复
请问Banq大哥,Service类中方法是静态的好还是非静态的好?
这个主题有 21 回复 / 2 页 [ 1 2 下一页 ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-07 jdon.com

anti spam