关于项目框架设计的一点学习

<o:p> </o:p>

关于项目框架设计的一点学习<o:p></o:p>

<o:p> </o:p>

这两天又在接触一个新项目,对于如何设计一个项目的框架有了点概念,关于web项目(对于oa系统来说)的主体感觉比较需要设计的几部分为:<o:p></o:p>

1.  页面模板定义:关于view层展示,无论对于top(顶层菜单)+left(左边树状菜单)+right(主体内容)结构还是left+right结构,都需要首先定制一些模板,如struts中可使用tiles定义。<o:p></o:p>

2.  分页标签:自定义一个比较通用的分页标签或者使用一些框架中自带的(如struts-menu或者JSF中的t:dataScroller),不过比较好的做法是基于其源码编写自己的分页标签。<o:p></o:p>

3.  DB 设计:可使用Power Deisign等设计数据库表结构,产生相关的表。<o:p></o:p>

4.  代码自动生成:编写代码生成脚本如build.xml文件的编写(根据DB生成代码,也可以忽略3,先建model,再从model生成代码和数据库schema),生成StrutsSpringHibernate相关文件。<o:p></o:p>

<o:p> </o:p>

关于代码的整体架构如下:<o:p></o:p>

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" filled="f" stroked="f" path="m@4@5l@4@11@9@11@9@5xe"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p>

<o:p>关于项目框架设计的一点学习.JPG </o:p>

action 层:处理从view层传递过来的数据。<o:p></o:p>

service 层:封装业务逻辑,一般同时在spring中声明事务代理。<o:p></o:p>

dao 层:进行事务中的原子操作,同时在spring中注入相应的sessionFactory<o:p></o:p>

<o:p> </o:p>

Spring + Struts 取得springbean的两种常用方法:<o:p></o:p>

1.     DelegatingActionProxy :将所有action标签中type属性设为org.springframework.web.struts.DelegatingActionProxy 也就是将action委托给了spring,同时在 action-servlets.xml 中配置一个于action标签path属性对应的bean(也就是beanname值等于actionpath),如:<o:p></o:p>

struts-config.xml 中,以strutsplugin的方式,spring接管strutsaction<o:p></o:p>

< action name = "portalForm" parameter = "method" path = "/portalAction" type = "org.springframework.web.struts.DelegatingActionProxy" scope = "request" > <o:p></o:p>

    < forward name = "portalEdit" path = " pages/portalEdit.jsp" /> <o:p></o:p>

    < forward name = "portalList" path = " pages/portalList.jsp " /> <o:p></o:p>

</ action > <o:p></o:p>

< plug-in className = "org.springframework.web.struts.ContextLoaderPlugIn" > <o:p></o:p>

    < set-property property = "contextConfigLocation" <o:p></o:p>

          value = "/WEB-INF/action-servlets.xml" /> <o:p></o:p>

</ plug-in > <o:p></o:p>

<o:p> </o:p>

action-servlets.xml (配置文件格式和spring配置一样)中:<o:p></o:p>

< beans > <o:p></o:p>

    < bean name = "/portalAction" <o:p></o:p>

          class = "com.cn.lively.action.PortalMainAction" > <o:p></o:p>

        < property name = "portalService" > <o:p></o:p>

            < ref bean = "portalService" /> <o:p></o:p>

        </ property > <o:p></o:p>

    </ bean > <o:p></o:p>

</ beans > <o:p></o:p>

<o:p> </o:p>

2.     WebApplicationContextUtils.getRequiredWebApplicationContext :在action中获得springbean<o:p></o:p>

public Object getService (String name) {   <o:p></o:p>

    ApplicationContext wac =     WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());   <o:p></o:p>

    return wac .getBean(name);   <o:p></o:p>

}   <o:p></o:p>

这种方式没有在struts里边加入springplugin,实际上是使用了依赖查找来获得对象,并且在servlet代码中硬编码了应用对象的bean名字。<o:p></o:p>

<o:p> </o:p>

附:<o:p></o:p>

感觉一个国内小型项目(周期半年左右)的开发,完美的团队大概四个人左右就够了,<o:p></o:p>

A :前期框架设计 + 开发过程中不断改进完美整个框架,角色——架构师<o:p></o:p>

B :前期需求调研 + 开发过程中负责技术难度比较大的模块开发,角色——程序员<o:p></o:p>

C :前期需求调研负责人 + 开发过程中负责业务逻辑复杂的模块开发,角色——项目负责人<o:p></o:p>

D :前期需求调研 + 开发过程中负责模块开发,角色——程序员<o:p></o:p>

同时BC负责共同解决开发中出现的技术和业务问题,C负责控制项目进度,<o:p></o:p>

项目后期,BCD进行交叉测试,A负责review代码。<o:p></o:p>

<o:p> </o:p>

如果公司已经比较成熟的框架(即基本系统管理模块 + 代码自动生成),那么角色A可以省略,只需要BCD三个人即可进行项目开发,其中角色B在开发中担当一部分A的角色。<o:p></o:p>

甚至可以只由BC两个人进行开发,把角色D的工作分担到BC身上,B侧重技术,C侧重业务逻辑。<o:p></o:p>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值