`
flash59
  • 浏览: 97752 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

讨论:框架这样用?

阅读更多

         现在接手的项目是个别人已经搭好了架子的东东,在后来一段时间的开发过程中,我发现这个系统有一些缺点,总结了一下:

一、表示层

1、第一次看到,把同名的jsp放在不同的目录下,用目录名来区分。

2、同名的jsp往往主要内容相同,只是form要提交到的action不同。

二、控制层(逻辑处理层)

1、本项目大约有20个jsp页面,只用了5个ACTION,每个页面指向某个ACTION的某个处理方法:

      比方说:jsp1的form这样写:

  1. <html:form action="/netinfo.dox"  method="post" focus="domain" styleClass="form" >  
  2. <input type="hidden" name="method" value="save"/>  

有一个隐藏变量method来标示要由netinfo的save方法来处理,那看一下struts-config.xml里是怎么写的:

struts-config.xml 代码
  1. <form-beans>  
  2.       <form-bean name="NetinfoForm"  
  3.                  type="org.apache.struts.validator.LazyValidatorForm" />
  4. .....  
  5. form-beans>  
  6.   
  7. <action-mappings>  
  8.       <action path="/netinfo" name="NetinfoForm" parameter="method"  
  9.               scope="request" validate="false">  
  10.             <forward name="list" path="/pages/netinfoManager.jsp" />  
  11.             <forward name="view" path="/pages/netinfoView.jsp" />  
  12.             <forward name="regester" path="/pages/registerNetinfo.jsp" />  
  13.             <forward name="edit" path="/pages/Manager/registerNetinfo.jsp" />  
  14.             <forward name="password" path="/pages/getBackPwd.jsp" />  
  15.             <forward name="success" path="/netinfo.dox?method=manager" />  
  16.       action>
  17. .......
  18. <action-mappings> 
  19.   

这就会出现一个潜在的问题:netinfoAction类中不同的处理函数会随着业务的不断细化而迅速增加,不说代码量大,无法迅速定位到要修改的函数处(那时用搜索都慢),单说各个函数之间相互跳转并最终返回到指定页面:函数之间怎么能跳转?看上面的代码:Action返回success时,就会定位到manager方法继续执行,manager 方法还有可能再定位到这个类的其他方法继续执行,最后,很难控制我最初的方法返回的页面究竟是哪个,并且要考虑到另一个页面调用同类的manager方法时,是立即返回一个页面还是要推给另一个方法来定位最终页面。当业务多了,这个问题相当突出,而大量的精力将用在如何正确定位返回页面了。

2、使用了LazyValidatorForm,所有的form都使用这一个东东,直接将数据映射到hibernate持久化对象去了, 但这样的映射不能变通,只能在将要映射前把数据的格式转化一下,再做映射,无疑又增加了几百行代码。

3、由于页面中有URL或连接,每个连接要调用一个ACTION的处理函数,就得写成这样.../neitinfo.dox?method=方法名,这种连接返回的页面往往和form提交到的ACTION方法有不一样的返回页面,甚至还要返回到本页面,前面说过,本页面和另一个页面同名并且也有相同的连接,这就出现问题了,当这些页面的连接都要调用一个处理类的同一个方法时,就不得不使用flag之类的东西来标示是哪个页面来的请求,要回到哪个页面去。。地狱。。

虽然可以在函数中写上下面的文字来解决返回的问题,但还是感觉乱乱的,不舒服:

jsp代码
  1. <html:hidden property="source" value="<!---->"   
java 代码
  1. //返回本页   
  2. return new ActionForward(request.getParameter("sourcepage"));    

对于这些问题,不知道应不应该换一种组织形式,重新架构。

仔细考虑了一下,结合朋友们的意见,我最终决定把ACTION的数目加上来,这样每个ACTION的函数就可以少一点,不至于那么乱,还有,关于JSP的名称,我决定要改,两个文件同名,在IDE中同时打开这两个文件,将不知道正在修改的页面是哪个,容易产生错误。

好像,增加ACTION的个数就可以解决以上大部分问题了。

希望大家说说自己的意见。

 

分享到:
评论
19 楼 flash 2007-12-26  
楼上的苦衷我深有感触,开发的时候还好说,无非多实现几个接口,维护的时候可真够郁闷的了,一层一层的扒拉着找,烦都烦透了。我们追求的不是高效简洁的开发方式么?这就是这些框架给我们带来的效率?
18 楼 flashroom 2007-08-22  
ibatis 的 petstore 整个项目只用了一个ACTION,还不是自己写的~

一个CURD需要 4个ACTION,1个FORM,1个DAO接口,1个DAO实现,1个SERVICE接口,1个SERVICE实现 。。。 这样的设计就是好的设计吗?翻翻我们项目里面上千个ACTION,十几个ACTION CONFIG 你就知道我们有多痛苦。。。。
17 楼 flashroom 2007-08-22  
这样做的好处是可以减少很多类,减少很多配制文件。
其实有点STRUTS2的味道啦,建议改改  ACTION 的基类,利用反射去动态调用参数method标明的方法
小项目用这个开发速度超快的~
16 楼 ss19811029 2007-08-10  
解决方法多了,不过,我个人觉得,反正都是要改,不如多花点时间好好重构一下,这样以后维护和扩展起来也不较容易。
再者,实在不想重构,就在进入每个页面是加一个标记参数,这样比较容易定位页面,也有些工作量的。
15 楼 realdah 2007-08-10  
就算是配置文件,也比zero configuration强。。

全部都按照约定来匹配, 大点团队加上良莠不齐的队员,根本没法做
14 楼 wang20051 2007-08-09  
下定决心重构吧,
60个JSP的项目不算大,现在重构花的代价还比较小
13 楼 local 2007-08-09  
个人感觉 Spring,struts,hibernate
都是些复杂的东西,原本很简单的事,为什么要做的如此复杂?

难道用了一个xml配置文件就mvc,就面向对象?

即便是一个简单的功能,用了这些框架,文件数爆涨。
如果要进行一个改动,需要同时涉及好几个文件,
这样的代码难道好维护?
12 楼 yimlin 2007-07-31  
看了下,问题多在流转上,因为structs的控制和流程在一起,这个问题没有办法解决,即便解决了就像Spring Web Flow那样处理。或者你采用spring web flow来处理,唯一的缺点吧,就是要写一堆的webflow.xml了,但目前的页面或者代码就不用动太多!
11 楼 flash59 2007-07-31  
楼上的兄弟,能不能提供一些更优的解决方案?
我不怕重构,就想多学习一些框架的使用技巧和设计思想。
你做过这方面的项目,能细讲一下
struts+hibernate+spring的work flow 吗?
万分感谢。。

10 楼 Garriot 2007-07-30  
问题太多了,简直就是Bad Practice的集合啊......

通过楼主的描述我感到很迷惑:“同名的jsp往往主要内容相同,只是form要提交到的action不同”,用目录来管理jsp页面还是很常见的,但是这第二条就很奇怪,如果只是简单的action不同,完全可以在页面里用parameter标示,或者用Javascript控制提交。相同的内容保存在不同的地方本身就是大忌,这样很容易造成内容不同步……
关于你们action的写法,刚才查了一下,一个action后面有6个forward。如果将一个action作为一组业务的前期处理和分发使用(其实我们也不推荐这样做),这样做是可以理解的。但所有的forward都指向了页面,这就说明这个action还要处理逻辑。设想一下,一个有六个forward的action正常来讲需要6个if 语句来判断,这就是12行代码,你这个方法得多大啊,一片一片的代码……。

这样其实就说明了一个问题,系统对业务实现的规划实在是太差了,而且恐怕没有完整、强有力的标准。在使用框架时,我感觉内部统一的使用标准是最关键因素。不过注意的是,这个使用标准并不是使用习惯。

“使用了LazyValidatorForm,所有的form都使用这一个东东,直接将数据映射到hibernate持久化对象去了”。
这是个恐怖的做法,我们曾经也是深受其害。第一个问题:你这样做直接将表示出拉到了Hibernate所在的持久层。LazyValidatorForm里面携带的东西是危险的!还有个问题是你这样抹杀了业务层,充分说明你分层是有问题的。你说的那个几百行代码的问题其实多写个工具库或者直接用BeanUtil的拷贝就能解决问题。还有一些更优的解决方案。。。

就事论事,就先说到这里。

这个回复好长啊,都有“Bad Smell”了,
9 楼 huangpengxiao 2007-07-30  
netinfo 很熟的名字……

持续封装 持续集成
8 楼 guoliang0571 2007-07-28  
wl95421 写道
个人观点,仅供参考:
配置文件过多,不是好事
如果配置文件没有好的UI工具进行管理
还不如用IDE写代码

一个大系统中,如果采用Spring-Struts-Hibernate架构
就会发现,一个功能往往涉及多个配置文件,查找起来
一个字,烦!

很支持你啊,我还是喜欢EJB3,
 用spring 配置文件真是多啊,而且一个不行,影响整个运行.
 PS:
    spring 里一个service没set好项目就起不来了,(我不想用懒加载,就想启动加载不可以吗)
 找起来也麻烦,还要找响应的开发人员哦,感觉EJB3这方便好多了. 
 好希望EJB3流行起来啊.......
 
7 楼 guyuanwuxin 2007-07-27  
一用DispathAction没有问题,目前是Action的粒度有些大,根据你的业务重新组织Action的粒度
二仿照ROR RHTML的方式把共同表示逻辑的JSP变成类似于模板的方式,至于关于JSP目录方式个人认为没有什么问题。
6 楼 flash59 2007-07-27  
呵呵,20个页面是个虚数,回去查了一下,60多个jsp!

如果20个,我也就将就了,60个,就很难忍受了。。。
5 楼 dennis_zane 2007-07-27  
20个JSP的项目?那应该是规模很小的项目了
表示层通过目录来划分模块,同名JSP很正常的,通常都是list,edit,add等,有的人喜欢添加个后缀名(模块名),有的人就不添加,通过目录名来区分不会带来什么问题的。

5个action少了点,很容易出现magic action,action变的庞大,最好是根据功能项划分action为妙,这个要重构了。

LazyValidatorForm的使用,那就是仁者见仁,智者见智了。


4 楼 galaxystar 2007-07-27  
web层确实应该做到 zero configuration
3 楼 wl95421 2007-07-26  
个人观点,仅供参考:
配置文件过多,不是好事
如果配置文件没有好的UI工具进行管理
还不如用IDE写代码

一个大系统中,如果采用Spring-Struts-Hibernate架构
就会发现,一个功能往往涉及多个配置文件,查找起来
一个字,烦!
2 楼 bluepopopo 2007-07-26  
应该是DispatchAction过度使用了吧 可能前期没有预计aciton逻辑
  不用flag来标识同名页面调用的话 action还是费点事增加方法虽然还是调用原先的方法
1 楼 liusong1220 2007-07-26  
下个决心,重新架构吧

相关推荐

    基于java的-17-[计算机毕业设计]基于SSM的线上教学平台-源码.zip

    该资源是一个基于Java技术的计算机毕业设计项目,具体是一个采用SSM(Spring、SpringMVC、MyBatis)框架构建的在线教学平台的源代码。SSM是Java Web开发中常用的三大框架集成,用于实现高效的业务逻辑处理和数据访问...

    PHP高级程序设计:模式框架与测试

    - **框架介绍**:涵盖了常见的PHP框架,如Laravel、Symfony、CodeIgniter等,它们提供了开箱即用的功能,简化开发流程。 - **框架原理**:解析框架的核心组件和工作原理,如路由、依赖注入、模板引擎等。 - **...

    做web前端的同志们,想用coffeescript吗?苦于自己的web框架不支持?没关系!

    标题中的“做Web前端的同志们,想用Coffeescript吗?”揭示了本文将讨论的话题——Coffeescript在Web前端开发中的应用。Coffeescript是一种简洁、易读的JavaScript预处理器,它旨在简化JavaScript的语法,提高代码的...

    “结构主义”宏观框架讨论之九:转型无“牛市”?复盘日韩当年表现-1231-长江证券-25页.pdf

    “结构主义”宏观框架讨论之九:转型无“牛市”?复盘日韩当年表现-1231-长江证券-25页.pdf

    2021年分组讨论发言的几种框架思路.pdf

    2021年分组讨论发言的几种框架思路.pdf

    安卓开发框架源码demo

    2. **React Native**:Facebook推出的跨平台框架,允许用JavaScript编写原生应用,具有良好的性能和开发体验。 3. **Kotlin Coroutines**:用于解决安卓多线程问题,提供轻量级的协程实现,简化异步编程。 4. **...

    华为营销体系|营销管理:MTL流程框架解析.pdf

    本文将讨论华为营销体系中的MTL流程框架解析,旨在帮助企业深刻理解客户需求,持续为其创造价值,并合理运用资源。MTL流程框架是企业营销管理的重要工具,能够帮助企业从思维上进行转变,实现营销管理的变革。 一、...

    Python测试框架: 用Python测试框架简化测试

    本文将介绍三种流行的测试框架,讨论新一代工具鼓励的简单测试风格。 Python 测试框架的重要性 Python 测试领域的蛮荒时代终于结束了。仅仅在几年前,几乎每个用 Python构建的项目在编写和运行测试方面都采用自己...

    t3:T3框架-(核心插件和空白模板)

    T3v3-使用Bootstrap和LESS构建的Joomla响应模板框架 T3框架的第三代-从头开始重写以支持Bootstrap&LESS。 访问Google网上论坛以获取最新更新: ://groups.google.com/forum/#!forum/t3fw 访问我们的讨论香奈儿: ...

    来自人家公司的JS框架

    【标签】"js Css JS框架 CSS框架"进一步明确了讨论的主题。JS框架通常包括对DOM操作、事件处理、动画、路由、数据绑定等功能的支持,如React、Angular和Vue.js等。CSS框架则提供预定义的样式、布局网格系统、响应式...

    Web前端框架技术综述.pdf

    本文将对Web前端框架技术进行综述,讨论Web前端框架技术的发展历史、框架技术的分类、框架技术的优缺点、框架技术在实际项目中的应用等方面内容。希望通过本文,读者可以更好地了解Web前端框架技术,并更好地选择...

    适用于LLM应用的数据框架

    下面将详细讨论这个数据框架的关键特性和应用场景。 1. **数据存储**: - 分布式存储:LLM通常需要处理海量数据,因此数据框架应支持分布式存储,允许数据分布在多台服务器上,提高读写速度和系统可扩展性。 - ...

    一个不错的页面框架,html框架,oa能用到

    5. **学习资源**:对于初学者,这样的框架是极好的学习工具,因为它提供了一个结构化的开发环境,可以让新手通过实践理解前端开发的最佳实践。同时,社区支持和丰富的文档也是衡量框架是否适合学习的重要标准。 6. ...

    智慧高速公路 第2部分:车路协同总体 框架和要求.pdf

    "智慧高速公路车路协同总体框架和要求" 本文档详细介绍了智慧高速公路的车路协同总体框架和要求,涵盖了项目背景、主要内容目录、工作计划和推进情况等方面。 项目背景 本项目旨在推进智慧高速公路的建设和发展,...

    Web前端基础:HTML5浮动框架.pptx

    在这个“Web前端基础:HTML5浮动框架”的主题中,我们将重点讨论HTML5中的`&lt;iframe&gt;`元素,这是一种创建浮动框架或内联框架的方法。 `&lt;iframe&gt;`标签允许我们在一个页面中嵌入另一个页面,这样就可以在一个网页上...

    框架无后门,淘宝购买

    【标签】:“框架”:标签明确了讨论的主题是软件开发中的框架,这通常是指一组预先编写的代码和工具,用于帮助开发者更高效地构建应用程序,提供结构和基础功能。 【详细知识点】: 1. **框架的定义**:框架是一...

    税务人工智能的中国进程:基于税法理论的框架性讨论.pdf

    税务人工智能的中国进程:基于税法理论的框架性讨论.pdf

    独一无二的框架框架框架

    "独一无二的框架框架框架",这个标题暗示我们讨论的是一种独特的、专有的软件开发框架,可能命名为"DWZ"或"DWZ通用框架"。框架在IT行业中扮演着至关重要的角色,它们为开发者提供了一个结构化的平台,可以快速、高效...

    macadmin页面框架

    7. **文档支持**:为了帮助开发者更好地理解和使用框架,通常会提供详尽的API文档和示例代码,指导如何初始化项目、添加组件以及处理各种交互事件。 8. **版本控制**:作为一个成熟的产品,MacAdmin会有版本控制...

Global site tag (gtag.js) - Google Analytics