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

Nice Struts~鸡肋问题解决之道

阅读更多

前面提出了关于SSH架构中struts的鸡肋问题,大家也给出了热情洋溢的意见,表达了各自的观点:

 

原帖链接: http://www.iteye.com/post/1027849?page=1

 

大家对于实战中存在的这样一种现状还是有共识的,确实存在开发效率的问题。如何解决?右派认为忍气吞声吧,不就是多写点代码而已,没什么大不了;左派很激烈nostruts吧struts2吧.....当然还有理性的声音,改革吧....

 

当然说struts鸡肋也有点夸张只是为了让大家兴奋起来才如此称呼而已。客观的讲struts本身的架构设计是符合<J2EE核心模式>的,作为展现层的基础架构,struts很好的完成了自己的使命,在j2ee混沌刚开劈疆拓土的时代这面大旗的咧咧风声功勋卓著。

--------------------------

言归正传:

 

我的意见是:既然他们贫血,而且应该贫血,那么就让他们彻底贫血彻底消失,起码在某些场景下消失,省得这样的代码影响市容影响和谐,提高各位键盘的寿命。

做法就是对这些贫血对象作封装,不要在开发中频繁写这样的对象,而且封装其实很简单的。同时封装时只针对我们说的简单场景,不阉割struts功能,对于复杂点的例如依赖servlet接口的一些操作依然可以按照传统的action处理。

--------------------------

  1. Nice Struts 效果,Struts配置:

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

        "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

	<form-beans>
		<form-bean name="niceForm"	type="com.*****.nstruts.NiceForm" />
	</form-beans>

	<action-mappings>

		<action path="/addBook" parameter="bookManage.addBook(book)"----------------- 1
			scope="request"
			type="com.****.nstruts.NiceAction"---------------------------------------------- ------ 2
			name="niceForm">--------------------------------------------------------------- -------3
			<forward name="success" path="/getAllBooks.do"></forward>
			<forward name="fail" path="/***.jsp"></forward>
		</action>

		<action path="/delBook" parameter="bookManage.delBook(bookid)"

			scope="request"

			type="com.****.nstruts.NiceAction"

			name="niceForm">

			<forward name="success" path="/getAllBooks.do"></forward>

		</action>

		<action path="/modifyBook"

			parameter="bookManage.modifyBook(book,oldId)" scope="request"

			type="com.***.nstruts.NiceAction"

			name="niceForm">

			<forward name="fail" path="/book_modify.jsp"></forward>

			<forward name="success" path="/infoBook.do"></forward>

		</action>

		<action path="/getAllBooks" parameter="bookManage.getAllBooks():books"

			scope="request"

			type="com.***.nstruts.NiceAction"

			name="niceForm">

			<forward name="success" path="/book_all.jsp"></forward>

		</action>

	</action-mappings>

</struts-config>

 

   不同指出就是上面的1/2/3:

          首先通过parameter指明需要执行的业务层方法,可以是多个业务方法;

          其次指定使用基础的NiceForm(开发时不需要自己实现)

          最后是指定基础的NiceAction(开发时不需要自己实现)

          (需要说明的是在这个配置文件里完全可以混用传统的自定义的action/form)

 

2。Nstruts效果之jsp页面

<html:form action="addBook.do" method="post">

    <br>

    <table border=0 cellpadding=1 cellspacing=1 class="query_table"

           style="width: 60%" align="center">

        <tr>

            <th colspan="10">

                <div align='left'>

                    <b>图书登记</b>

                </div>

            </th>

        </tr>

        <tr>

            <th>

                书名

            </th>

            <td>

                <html:text property="$(book.name)" size="70"/>

            </td>

        </tr>

        <tr>

            <th>

                出版社

            </th>

            <td>

                <html:text property="$(book.publisher)" size="70"/>

            </td>

        </tr>

        <tr>

            <th>

                作者

            </th>

            <td>

                <html:text property="$(book.author)" size="70"/>

            </td>

        </tr>

        <tr>

            <th>

                单价(分)

            </th>

            <td>

                <html:text property="$(book.price)" size="70"/>

            </td>

        </tr>

        <tr>

            <th>

                备注

            </th>

            <td>

                <html:textarea property="$(book.memo)"/>

            </td>

        </tr>

        <tr>

            <th>

                发行日期

            </th>

            <td>

                <html:text property="$(book.born)" size="70" value="2008-04-23"/>

            </td>

        </tr>

    </table>

    <table width="60%" align="center">

        <tr>

            <td align="center">

                <br>

                <input type="button" class="btn4" value="提  交" onclick="subform()">

                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                <input type="button" class="btn4" value="返  回" onclick="goBack();">

            </td>

        </tr>

    </table>

    <br>

</html:form>

 唯一的不同在于属性引用需要$()一下,因为目前使用的MapForm的形式扩展actionform了,高手一定会想到NiceForm中一定定义了一个get$()/set$(),呵呵。这个$其实可以省略,方法就是上帖中大家提到的lazyValidateForm。

 

3.service层一如既往,目前的限制是特殊的多态方法支持有问题。明眼人一看就知,反射了嘛,呵呵。。。。

 

 

END--------------------------

 

这样以来大家看,Struts在SSH中的角色依然,作数据的提取/展现/页面流的配置。同时没有了所说的两个鸡肋问题,struts的结构没有打乱功能没有阉割,符合一贯的开发习惯,而且足够灵活,呵呵,有点自买自夸的嫌疑。

 

总之罗嗦了这么多并非仅针对struts,而是为了抛砖引玉,为了说明一种技术领域的现象和个人的体会,j2ee领域的基础组件之所以灵活甚至累赘就是为了给上层的应用架构提供扩展点,struts并非鸡肋,鸡肋是我们自己的问题。在应用架构中对基础的j2ee组件/架构进行一定的扩展定制是必要的,是架构师的职责所在,只会将S/S/H一会NBCD等等堆砌在一起抑或动辄就高喊struts2吧,这样的架构师尚需要努力。

 

期望与各位分享在开发面向最终应用的技术框架过程中的一些创新和灵感。

 

Over!!!!

 

 

分享到:
评论
33 楼 jieyuan_cg 2009-05-31  
呵呵,公司用ofbiz,一样解决上述问题。
传值用Map封装,控制逻辑用control.xml配置文件来解决。
32 楼 icewubin 2009-05-31  
betafox 写道
pipilu 写道
真要零配置,那就从命名上给规范了,使用反射来动态加载(根据一定的名称规则和包结构)。
使用注解那哪叫零配置??


使用注解只是配置转移了,呵呵,把矛盾转嫁了,如果不分场景的使用注解,可预见的未来会有针对注解的另一场口诛笔伐。个人认为技术都是又实用场景的....

我不是想引起这个讨论,因为很早以前就讨论了不知道多少次了。再说一次好了,配置文件分两种,一种是一直以来就有的例如“数据库连接属性”、“Log4j”的配置文件,而另一大类就是Struts2的页面转向逻辑和Hibernate的映射配置文件,后一大类情况还不一样,Struts2的页面转向逻辑基本属于“幻影需求”,而Hibernate的映射文件更多的是出于无奈,后来采用注解并兼容JPA规范后就很好用了,对与这一类的配置文件我不认为是真正的“配置文件”,用途不同而已。

所谓的“幻影需求”再重复一下,期望在需求变化时,系统不修改代码,而仅仅修改配置文件就能够轻松搞定,可能么?实际多做几个项目就知道了,这种幻影需求的可笑了。

这方面仅仅表述struts2的默认的配置文件过于重载而已,xml配置文件本身也是可以做出改变的,Spring的配置文件就是不断在演进的。
31 楼 betafox 2009-05-31  
pipilu 写道
真要零配置,那就从命名上给规范了,使用反射来动态加载(根据一定的名称规则和包结构)。
使用注解那哪叫零配置??


使用注解只是配置转移了,呵呵,把矛盾转嫁了,如果不分场景的使用注解,可预见的未来会有针对注解的另一场口诛笔伐。个人认为技术都是又实用场景的....
30 楼 icewubin 2009-05-31  
pipilu 写道
真要零配置,那就从命名上给规范了,使用反射来动态加载(根据一定的名称规则和包结构)。
使用注解那哪叫零配置??

一般说的零配置就是指零XML配置文件。

注解当然是另一种配置方式,但是IDE对注解的支持远好于XML配置文件,注解本身是强类型,具有编译期检查、继承等特性,重构支持也非常好,大多数情况下配置效率也比XML方式高。
29 楼 pipilu 2009-05-31  
真要零配置,那就从命名上给规范了,使用反射来动态加载(根据一定的名称规则和包结构)。
使用注解那哪叫零配置??
28 楼 xzj127 2009-05-30  
还是喜欢 Spring 的 MVC 。。
27 楼 betafox 2009-05-29  
aws 写道
零配置个人感觉没啥意义或者说是倒退
配置文件的出现本身上为了保持代码不变的情况下将设置集中管理,注解式配置实际上上走回分散设置的老路,简直类似于JSP中不写<% %>之后有人觉得用起来不够爽又重新拿出<% %>

以ssh的架构,dao+(biz+service)+action+view这样的结构,struts的action层完全可以虚化掉,页面转向控制交给配置文件,业务逻辑集中到service层,用一个base action类来充当中央控制引擎,根据IOC的配置调用与组装service内的业务逻辑,对数据的校验,等等,用自定的map取代request,一方面简化掉了action,另一方面也可以通过替换base action来达到不同的效果,比如输出的数据格式,可以无缝的把struts的form变成json数据,或者xml数据,或者其他什么

听起来是不是有些部分像webwork

不谋而合,这种思路适合很大一部分需求,屏蔽了诸多技术细节,拯救将劳苦大众与技术纠缠的水深火热,对于大规模快速应用层开发大有裨益。楼上一席话总结了一开始例子中对struts的封装思路,赞一个!!!

至于零配置我倒是觉得并非全无意义,零配置针对的是目下java领域配置泛滥的弊端,还是那句话:要配置还是要0配置需要根据具体的应用场景,要因地制宜”识别配置的必要性“,相互结合取长补短,灵活机动的选择。
26 楼 icewubin 2009-05-29  
aws 写道
听起来是不是有些部分像webwork

Struts2就是webwork2。
25 楼 aws 2009-05-29  
零配置个人感觉没啥意义或者说是倒退
配置文件的出现本身上为了保持代码不变的情况下将设置集中管理,注解式配置实际上上走回分散设置的老路,简直类似于JSP中不写<% %>之后有人觉得用起来不够爽又重新拿出<% %>

以ssh的架构,dao+(biz+service)+action+view这样的结构,struts的action层完全可以虚化掉,页面转向控制交给配置文件,业务逻辑集中到service层,用一个base action类来充当中央控制引擎,根据IOC的配置调用与组装service内的业务逻辑,对数据的校验,等等,用自定的map取代request,一方面简化掉了action,另一方面也可以通过替换base action来达到不同的效果,比如输出的数据格式,可以无缝的把struts的form变成json数据,或者xml数据,或者其他什么

听起来是不是有些部分像webwork
24 楼 betafox 2009-05-29  
呵呵,o配置,也仅仅是另一场忽悠的风波罢了吧,注解+配置+根据场景选择....唉
23 楼 holan 2009-05-29  
spring mvc很劲爆,加上注解,差不多0配置了
22 楼 betafox 2009-05-28  
楼上所谈的确实是我们选择技术架构时必须考虑的问题,相信对大家都有启发性的意义,感觉咱们的讨论太发散了,呵呵。如有必要建议另立贴与大家展开讨论这方面的话题,否则java阿姨的管理员要说这个贴没有主题、不知所云、太发散、可能要被评隐藏贴了,呵呵,觉得java阿姨太严厉了点!!
21 楼 icewubin 2009-05-28  
还有就是IDE的问题,如果IDE对XML的生成和重构能够达到Java的程度,也不会有那么多人抱怨重载的XML配置文件了。

如果IDE没有良好支持get和set代码的生成,一样会有很多人骂娘直到质疑标准JavaBean规范的低开发效率。

华山论剑总是要有规则的,除非楼主你事先定好前提,例如:只讨论开发效率,不考虑其他相关成本。这样就可以了。
20 楼 icewubin 2009-05-28  
还有就是历史遗留问题,刚才有网友说了利用注解解决零配置的问题,在我们公司暂时不可能采用的。

因为客户那里有不少环境就是不支持JDK1.5的,我们也没有办法。
19 楼 icewubin 2009-05-28  
betafox 写道
to:楼上
-------------
我这里说的评审不是公司里的人,往往是客户那里的人,我们作为乙方如何去评判客户是否有资格做评审。
客户那里总有些自以为是的IT部的人,这是没办法的事。
----------------------------------------------------------
我们只讨论技术层面的问题,你提的这些问题提当然确实存在,但是我们是无能为力的,所以不要把这种因素纳入我们的话题,那样就大了,呵呵,华山论剑只谈剑术。

这个不可能的,就好比单考虑技术层面普元EOS的东西没什么特别不好的地方,但是公司里就是绝大部分的人不愿意做EOS相关的东西,想留住人必须高薪,这个成本必须要考虑的。再或者我认为JavaFX技术体系也不错嘛,但是想想这东西能成功么?(历史上优秀的技术最终没有成功的多了去了)

一个技术相关的成本有很多,学习成本之类的难道不考虑么?

回过头来说,客户也不会很无理的说,“我没听说过,不能用这个方案”,例如我们现在用的SpringMVC也算是不太普及的MVC框架,客户知道我们一直在用这个框架,所以不会有太多意见,有分歧早就沟通过了。但是如果我们公司突然要换框架,他们当然有询问为什么要换,理由风险等等等。

假设我说要换“Tapestry”,好,你想想他们会怎么做,首先就是google,然后旁敲侧击的问同行等各种手段来了解,而国内Tapestry的好评和成功案例并不是太多,无形中增加我们乙方的成本。

还有,比如现在有一个系统,不考虑甲方、不考虑技术学习成本、不考虑维护成本、不考虑交接成本,需要招人,马上就要开工,而这个系统既可以用存储过程、也可以J2EE(Struts2)、也可以ROR,光是一个招人成本就决定了,我一定是招J2EE(Struts2)的。

当然有了这么多假设好像没有意义,有点先有鸡还是先有蛋的问题,那就回头来说为什么国内招Struts2的好招又便宜呢?表面上看是因为很多培训学校教这个,很多公司确实也是用这个。再深究为什么会产生“表面上看到”的原因呢?间接证明Struts2确实是一个优秀的框架(即使曾经是),能够(相对的)提高生产效率、减少维护成本等,所以慢慢在国内普及(当然还有Struts1大大的功劳)。
18 楼 betafox 2009-05-28  
to:楼上
-------------
我这里说的评审不是公司里的人,往往是客户那里的人,我们作为乙方如何去评判客户是否有资格做评审。
客户那里总有些自以为是的IT部的人,这是没办法的事。
----------------------------------------------------------
我们只讨论技术层面的问题,你提的这些问题提当然确实存在,但是我们是无能为力的,所以不要把这种因素纳入我们的话题,那样就大了,呵呵,华山论剑只谈剑术。
17 楼 icewubin 2009-05-28  
黑暗浪子 写道
icewubin 写道
黑暗浪子 写道
用SpringMVC的很少啊。
呵呵,有JROR嘛?比较支持这个。

要考虑新人的学习成本和学习积极性,Struts2的资料还是很多的,新人们也认为这玩意儿学了不愁找不到工作。

还有就是做方案的时候,评审方案的人都认识Struts2,其他的框架有些人就不认识。


个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。


我这里说的评审不是公司里的人(在我们公司这部分是我说了算的),往往是客户那里的人,我们作为乙方如何去评判甲方是否有资格做评审。

客户那里总有些自以为是的IT部(或者信息公司)的人,这是没办法的事。

至于Seam么,只要他们公司有个大牛能够搞定相关的一些攻坚问题,订好规范,没什么问题,完全可以采用。
16 楼 betafox 2009-05-28  
黑暗浪子 写道
个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。


严重关切严重同意
15 楼 黑暗浪子 2009-05-28  
icewubin 写道
黑暗浪子 写道
用SpringMVC的很少啊。
呵呵,有JROR嘛?比较支持这个。

要考虑新人的学习成本和学习积极性,Struts2的资料还是很多的,新人们也认为这玩意儿学了不愁找不到工作。

还有就是做方案的时候,评审方案的人都认识Struts2,其他的框架有些人就不认识。


个人觉得如果评审的人只知道struts2,其他不是很明了的话,那是没资格做评审的。
连各个框架优缺点都不清楚,怎么能去评审?
还有seam,不知道有人有什么好见地。
我最近听说银联的人开始大量采用seam框架。

14 楼 icewubin 2009-05-28  
kjj 写道
struts2 已经有一个插件支持类似rest的风格,不需要再在xml里一个个配置action了,可以说约定》配置的插件!你对这个还不满意!

啊?没有不满意,我就是建议楼主这么做啊。我是想引出后续的话,这些零配置的东西其实是变相的“配”在action中,所以action这一层并不是鸡肋。

相关推荐

    Nice Troubleshooting

    在"Nice Troubleshooting"的主题下,我们主要探讨如何利用NICE Engage的录音功能来排查和解决可能出现的技术问题。NICE Engage Recording是系统的核心组件,它允许用户记录、存储和分析所有的交互渠道,包括电话、...

    Nice Vibrations v3.6

    《Nice Vibrations v3.6》是一款针对游戏开发的振动反馈解决方案,专为Unity引擎设计,支持Android和iOS平台。这个版本的更新旨在提供更加逼真、细腻的触觉体验,提升玩家的游戏沉浸感。 在Unity游戏开发中,触觉...

    条件下拉筛选 NiceSpinner

    NiceSpinner的核心功能之一是条件筛选。通过设置特定的条件,用户点击列表中的某个项目后,可以触发对其他项目的筛选,展示与所选项目相关的条目。这种功能在处理大量数据或者需要分步骤选择的情况下非常有用,例如...

    Struts2 学习 2

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、易于维护的MVC(Model-View-Controller)架构的Web应用。...同时,掌握这些知识点将有助于你解决实际开发中遇到的问题,并提升你的Java web开发技能。

    nice-spinnermaterialdesign风格的选择框.rar

    由于Nice Spinner是第三方库,可能存在兼容性问题,部分功能可能需要根据实际环境进行调试。在使用过程中,如遇到程序无法运行的情况,应检查代码逻辑、依赖版本及设备兼容性,必要时参考官方文档或社区中的解决方案...

    实现跨平台同步数据库,nice~.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,...

    nice service

    【标题】:“nice service” 在IT行业中,“服务”一词通常指的是网络服务或者软件服务,它涵盖了各种形式的在线功能,如Web服务、API接口、数据库服务等。一个“nice service”可能指的是一个设计良好、运行稳定、...

    Struts2实战总结

    ### Struts2实战总结知识点详解 #### 一、在Action中定义的变量,在JSP页面中的显示方式 在Struts2框架中,我们通常会在Action类中定义一些变量,然后在JSP页面中显示这些变量的值。Struts2提供了一个简单的标签 `...

    集智达NICE-3100 VGA DRIVER.rar

    4. 更新驱动:如果你的系统已经存在旧版驱动,更新到新版本可能带来性能提升或者解决现有问题。但是,未经测试的驱动升级也可能导致新的问题,因此在更新前最好备份当前驱动和系统数据。 5. 驱动管理:操作系统中...

    苏州默纳克NICE1000

    为了帮助维护人员快速准确地识别并解决可能出现的问题,本说明书详细列举了各种故障代码及其可能的原因与解决方法。 #### 故障代码详解 ##### Err01 (E01) **故障描述:** 电源电压异常。 - **可能原因:** - 1. ...

    Android代码-nice-spinner

    Nice Spinner NiceSpinner is a re-implementation of the default Android's spinner, with a nice arrow animation and a different way to display its content. It follows the material design guidelines, ...

    前端项目-nice-validator.zip

    今天我们要探讨的是一个名为"nice-validator"的前端验证解决方案,它以其简单、智能和美观的特点,深受开发者喜爱。通过对这个开源项目的深入研究,我们可以了解其工作原理,学习如何在自己的项目中有效地应用它。 ...

    【最新版】nice-dcv-viewer-2020.0.1716.dmg【亲测可用】最好的本地远程可视化

    NICE DCV软件包经过数字签名。安全签名确保软件包是由NICE生产的,并且没有被更改。NICE DCV 2020.0客户端

    struts2实战总结

    ### Struts2实战总结 #### 一、Struts2框架概览与应用场景 Struts2是基于MVC设计模式的一款开源Web应用框架,它继承了Struts1的优点,并且进行了大量的改进,支持拦截器、OGNL表达式语言、类型转换等特性。在实际...

    struts2 doubleselect 实例

    Struts2 Doubleselect标签是用于创建二级联动下拉列表的,这种控件在网页表单中常见于需要显示层次关系数据的场景,例如省份-城市的选择。Doubleselect标签结合了两个下拉列表,其中一个的选择会影响到另一个下拉...

    markdown nice插件

    Markdown Nice是一款专为提升Markdown写作体验而设计的插件,尤其适合那些经常使用Markdown语法进行文档编辑、笔记记录或者博客撰写的人。这款插件的主要目标是让Markdown格式的文本更加美观,易于阅读,并且在预览...

    默纳克NICE7000一体化控制器使用手册(电梯产品信息 故障代码故障描述原因和处理方法汇编).pdf

    4. 典型调试说明:默纳克NICE7000一体化控制器的典型调试说明是指用户在实际应用中可能遇到的问题和解决方法。 三、参数说明 默纳克NICE7000一体化控制器的参数包括控制器的基本参数、工作参数和状态参数等,用户...

    Markdown Nice 资源包

    Markdown 必备神器,Markdown 转公众号、知乎排版神器

    Unity安卓iOS震动插件Nice Vibrations Haptic

    《Unity安卓iOS震动插件Nice Vibrations Haptic详解》 Unity引擎在游戏开发领域具有广泛的应用,它提供了跨平台的功能,让开发者能够轻易地将游戏移植到不同的操作系统上,包括Android和iOS。在这个过程中,为了...

    美国NICE涡街流量计.rar

    5. 使用与维护:包含操作步骤、日常维护建议以及可能出现的问题及解决方案。 6. 应用案例:分享实际应用中的成功案例,展示流量计在不同行业的应用效果。 7. 校准与标定:介绍如何对流量计进行定期校准,以保持测量...

Global site tag (gtag.js) - Google Analytics