论坛首页 Java企业应用论坛

一种快速开发的Java Web架构设计和实现(代码篇)

浏览 16180 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-12  
这篇文章写得太粗糙,不想浪费大家时间(原帖删),还是看我后来的改进版吧:
http://www.iteye.com/topic/47085
虽然它有很大的局限性,但还是值得参考,批判去看它吧。
本文的评论还是值得一读。
  • cottonBusiness.rar (91 KB)
  • 描述: 整个demo的所有代码,除了没有jar外
  • 下载次数: 528
  • 大小: 14.6 KB
  • 大小: 6.9 KB
   发表时间:2006-12-12  
欢迎大家提出批评,小弟不才!



0 请登录后投票
   发表时间:2006-12-13  
我看了超过5分钟,没看出来是什么逻辑。
解释一下,比如新加入一个简单的表,如客户类型,只有两三个字段的,需要配置哪些东西,写那些代码?
0 请登录后投票
   发表时间:2006-12-13  
嗯,怎么说呢,有这种精神不错。很多人缺乏的就是探索和思考的精神。
在hibernate出现以前,很多人也是自己实现了类似作者所说的一套自有ORM组件的。一般也都是要用map和list。

随便看了一下楼主的二个util类,其它的没细看,挑点刺:
DateTimeUtils里定义ONE_YEAR = ONE_DAY * 365;润年366天呢?日期的操作,还是应该使用GregorianCalendar来操作的。

RequestParamUtils里:这个方法
String[] getStrings(HttpServletRequest request, String key)
如果传过来的不是一个数组,而只是一项数据,你就会取不到了。比如在用户列表中,可以选择多项用户进行处理。在列表中记录大于1的时候,使用getParameterValues是可以取到数据的。但如果列表中记录正好只有一条,使用这个方法就取不到数据,但数据确实给你传递过来了,怎么办?所以需要再判断处理一下才对。
0 请登录后投票
   发表时间:2006-12-13  
Lucas Lee 写道
我看了超过5分钟,没看出来是什么逻辑。
解释一下,比如新加入一个简单的表,如客户类型,只有两三个字段的,需要配置哪些东西,写那些代码?

如果你新加一个简单表,需要的简单流程:
1、在db里面创建该表
2、在sql1.properties里面定义一条sql语句,如client_type_insert=insert into.....,并且在db的sql编辑器下测试通过
3、写ClientTypeService类的CRUD操作,继承于BaseService,请对照UserService。对于一般的操作调用,之用调用pm(PersistenceManager)和qm(QueryManager)进行操作就ok了,不过其它的,如存储过程,需要扩充那两个类,因为现在它们还不完整。
4、写ClientTypeService的单元测试代码,如ClientTypeServiceTypeTest。
5、写ClientTypeAction类,继承于BaseAction,参考UserAction
6、用dreamweaver写jsp页面,不过建议,95%的情况只需要将jsp当作模块语言,如freemaker。

整个过程熟练后,写代码很快,不知道大家是否以前有asp和php的开发经历?有就更好了。因为只有对比才理解深刻。

本应用的缺点:
1、当操作的table字段太多时候,在service层里给参数赋值确实有些烦琐,虽然很简单,hibernate为我们自动做了,但对于新手,配置那些1:1,n:1,n:n的关联,lazy loading,以及cascade和inverse很花时间,当然高手就另当别论了。
2、从jsp页面字段、到db操作字段的对照关系,这些都必须清楚,也就是说数据的key是层间约束的。其实用asp和php时这些都是默认规则。

另外,系统肯定有一些不完善的地方,因为那个demo应用的整个开发,包括基础类,我只花了两天左右的时间。






0 请登录后投票
   发表时间:2006-12-13  
together 写道
嗯,怎么说呢,有这种精神不错。很多人缺乏的就是探索和思考的精神。
在hibernate出现以前,很多人也是自己实现了类似作者所说的一套自有ORM组件的。一般也都是要用map和list。

随便看了一下楼主的二个util类,其它的没细看,挑点刺:
DateTimeUtils里定义ONE_YEAR = ONE_DAY * 365;润年366天呢?日期的操作,还是应该使用GregorianCalendar来操作的。

RequestParamUtils里:这个方法
String[] getStrings(HttpServletRequest request, String key)
如果传过来的不是一个数组,而只是一项数据,你就会取不到了。比如在用户列表中,可以选择多项用户进行处理。在列表中记录大于1的时候,使用getParameterValues是可以取到数据的。但如果列表中记录正好只有一条,使用这个方法就取不到数据,但数据确实给你传递过来了,怎么办?所以需要再判断处理一下才对。


呵呵,这些你就别较真了,而且写这些基础工具类很简单,你说的那个应该调用getString方法就ok了吧?需要时间,我那个应用架子整个才用了两天时间。我现在不是做产品啊。
请一定理解我发帖子的本意:我只是想演示用Map、List这些容器,而不用JavaBean(POJO)或是Java的OO怎么解决问题,而是Data Oriented,所以最好有PowerDesigner或ERwin来建模。 
0 请登录后投票
   发表时间:2006-12-13  
认真看了一些代码。要实现当前功能代码还是比较干净。但是如果要在这个基础上实现更负责的功能,就不好处理了,或者处理好,但代码结构很别扭。在实际应用中,都会有以下几点功能:
1,事务处理。在对多表操作时中没有看到事务处理的代码。我没有认真看过spring,如果要加上事务,怎么办。
2,条件查询,排序。就是在查询出来的列表中,添加条件查询。按照这种结构思路,如果要增加条件查询,只能有两种选择:
   第一,在sql1.properties增加固定条件,在页面获得查询值,把这些查询参数作为参数设置。这种做法只能固定一些字典查询,不能实现动态条件查询。
  第二,组织条件sql,比如:where field1=** and field2 = **。编写这个过程的代码是很复杂很费时间的。
3,排序。和第二差不多。
4,页面转跳。这是最麻烦的事情。前面一些问题可以在你代码结构的基础上找技巧可以解决,但这个问题在你代码中没有看到任何解决方案。比如你根据条件(field1=v1 and field2 = v2)获得一个列表,点击其中一个记录的修改按钮,然后在修改页面点击保存按钮,然后回到列表页面,怎样保证那些条件的设置值还保存?在实际系统中,到处是这样的转跳,不复杂,但很麻烦。如果在实现过程中,没有快速开发的解决方案,算不上是快速开发架构。顺便说一下,AJAX的最初出现的原因就是为了解决这种问题。如果不使用AJAX解决,又不解决这个问题,实际是用2年前的思路在开发

另外在代码中,我第一眼发现的是使用Map来代替了VO来保存对象。虽然Map在存取上的时间都达到常量,但总觉得不雅观。即使性能上不考虑,在开发中,获取一个对象的时候,肯定经常要copy字段放入get()中。如果是100多个字段表,开发过程中,其中一个字段对不上,要找出来,够受的。用Map的其它弊端,看看其它人怎么说。
0 请登录后投票
   发表时间:2006-12-13  
想知道楼主在那家公司.
0 请登录后投票
   发表时间:2006-12-13  
从数据库开始也不是不可以。但如何把数据库之间的复杂关系完整的映射到系统中去,就是一件很困难的事情了。到时候你的这种方法就不是简单,而是复杂。

所以到最后,你可能会发现,你自己需要写出一个类似hibernate的东西来用的。所以才会出现了hibernate。

从习惯于从数据库开始,到习惯于从java po开始,是非常漫长的一个过程。但这是必须要走的一段路。
0 请登录后投票
   发表时间:2006-12-13  
zzname 写道
认真看了一些代码。要实现当前功能代码还是比较干净。但是如果要在这个基础上实现更负责的功能,就不好处理了,或者处理好,但代码结构很别扭。在实际应用中,都会有以下几点功能:
1,事务处理。在对多表操作时中没有看到事务处理的代码。我没有认真看过spring,如果要加上事务,怎么办。
2,条件查询,排序。就是在查询出来的列表中,添加条件查询。按照这种结构思路,如果要增加条件查询,只能有两种选择:
   第一,在sql1.properties增加固定条件,在页面获得查询值,把这些查询参数作为参数设置。这种做法只能固定一些字典查询,不能实现动态条件查询。
  第二,组织条件sql,比如:where field1=** and field2 = **。编写这个过程的代码是很复杂很费时间的。
3,排序。和第二差不多。
4,页面转跳。这是最麻烦的事情。前面一些问题可以在你代码结构的基础上找技巧可以解决,但这个问题在你代码中没有看到任何解决方案。比如你根据条件(field1=v1 and field2 = v2)获得一个列表,点击其中一个记录的修改按钮,然后在修改页面点击保存按钮,然后回到列表页面,怎样保证那些条件的设置值还保存?在实际系统中,到处是这样的转跳,不复杂,但很麻烦。如果在实现过程中,没有快速开发的解决方案,算不上是快速开发架构。顺便说一下,AJAX的最初出现的原因就是为了解决这种问题。如果不使用AJAX解决,又不解决这个问题,实际是用2年前的思路在开发

另外在代码中,我第一眼发现的是使用Map来代替了VO来保存对象。虽然Map在存取上的时间都达到常量,但总觉得不雅观。即使性能上不考虑,在开发中,获取一个对象的时候,肯定经常要copy字段放入get()中。如果是100多个字段表,开发过程中,其中一个字段对不上,要找出来,够受的。用Map的其它弊端,看看其它人怎么说。


对于你提出的问题,我发表点看法:
1、事务处理:由于我的持久层工具类是基于Spring的,它自动管理数据库连接池,事务可以在Spring配置文件里面declare,这个很简单,不过我的demo代码中并没有配置,以前我处理JTA时候,还用到过JTOM,那个可以嵌入式跑,Spring也提供了简单的集成(JotmFactoryBean),我当时比较典型地应用是在osworkflow集成上。

2、3:这两个看来就没有hibernate灵活了,确实在我这个应用里面处理起来都很机械,不过效率应该更好控制

4、这个可以在Web框架里面解决,这不是我的关注点,而且,我认为基本的Web框架,特别是基于request的,如Struts和webwork,都无法简单解决这个问题,而且解决很复杂,一年前,这个问题我就觉得是web框架的无奈,因为我的action里面这些代码占据了很大一部分。

5、关于VO: 你说的100个字段的table,确实用jdbc直接做很费劲,如果真的有这样的需求,就不用考虑我这个了。不过对于Map这种东西,你看Servlet规范里面的HttpServletRequest,HttpSession,和ServletContext,其实最重要的功能,我认为就是提供了一个Map,特别是HttpSession,简直就是一个Map实例,tomcat的实现中大概确实这样吧,大概是有一个map实例对象处理setAttribute的存值,

我觉得什么应用框架,都有其实用范围,就像很多人看不起EJB,但是,我们仔细看看EJB规范,EJB的目标有三个关键字:分布式、事务、组件模型,这是官方对EJB描述时说的第一句话。而不是JavaBean,OO。当然这些在EJB3.0很有改观。

大家可以把他当作一种解决问题的方式,就行了,特别是一般的非复杂业务系统,中小型应用,譬如电子政务网站。






0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics