|
|
|
J2EE网站经验共享!
作者:aill
发表时间:2006年06月02日 11:19
回复
原贴网址:
http://www.jdon.com/jivejdon/thread/27016.html
网站包括 商家博客,个人博客,论坛,新闻等
设计采用了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放到我们论坛的下面了,算是做点贡献吧
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月06日 11:08
|
回复
|
|
|
|
|
不错,先Mark一下,等会儿好好看一下。多谢aill的对jdon支持。
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月06日 16:18
|
回复
|
|
|
|
|
bang大哥客气了,学java几年了,真正提高还是来jdon以后,还有您的书,真心感谢!
|
|
|
|
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,这是一些所谓高人经常范的毛病。
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月08日 12:18
|
回复
|
|
|
|
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月18日 11:57
|
回复
|
|
|
|
当你的VIEW(JSP或actionForm)需要对应两个以上的实体bean并且要进行操作你是直接传两个DTO,还是把两个实体转成一个DTO(hashMap)再传到VIEW。 然后,你的DAO又是怎么处理的呢! 我比较疑惑这个问题!
|
|
|
|
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的理解,如果让我做的话,我会这么写,不知道合不合理?
|
|
|
|
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的理解,如果让我做的话,我会这么写,不知道合不合理?
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月20日 20:02
|
回复
|
|
|
|
|
呵呵,不好意思,CommandXX里的params不对,不能是一个ArrayList应该让它是一个Object里面有像Struts的Action Formbean, request, response,等这样的东西.
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月23日 10:49
|
回复
|
|
|
|
呵,原来是厦门的啊,我也是啊,楼主,有空聊聊啊 我的**58061178
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年06月28日 10:14
|
回复
|
|
|
|
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年07月27日 17:29
|
回复
|
|
|
|
|
大牛啊!那个登记注册码图片怎么生成的呀,是不是只是一个随机码+一张背景图片,呵呵,我的msn:hpj2001@hotmail.com
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年07月30日 15:26
|
回复
|
|
|
|
|
哈哈,没想到厦门的道友这么多,有空聊聊啊。另外工作很忙,基本不上**或msn,有问题可以到秀城论坛的java板块留言!
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年08月16日 11:59
|
回复
|
|
|
|
|
|
|
|
Re: J2EE网站经验共享!
|
发表: 2006年09月05日 16:19
|
回复
|
|
|
|
|
请问Banq大哥,Service类中方法是静态的好还是非静态的好?
|
|
|
|
这个主题共有 21 回复 / 2 页 [
1 2
下一页
]
| |
|
|
|
|