`
icheng
  • 浏览: 881995 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

浅谈MVC框架中View层的优雅设计及实例

 
阅读更多

在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑。在N年前的脚本语言时代,无论是asp、php还是jsp,我们基本是都是把这两者柔和在一起的。尽管我们想方设法做好很多函数或者包含文件来努力达到软件的复用,但仍然无法满足多变的用户需求,这主要是因为以前的纯脚本编码方式无法很好支持及应用面向对象(OO)领域中的强大功能。

  在常见的B/S软件项目中,界面的设计包括html界面、Wap界面及其它由文本字符协议为基本表示的界面等。以我们接触最多的html页面为例子,在做这些界面的时候往往需要美工先使用photoshop或fireworks等图形界面设计工具进行全局设计,然后再使用进行Dreamweaver等html页面制作工具进行加工制作。而强大的程序逻辑及后台处理都是由服务器端程序完成,这些程序具有较高的稳定性,其开发工具如JBuilder、Eclipse等对View层的界面无法很好的支持(当然那些用记事本写界面的应用除外),这就使得很多MVC框架的设计都无法两全齐美。

  作位一个比较友好的MVC的框架,在简化服务器应用开发的同时,还需要在View这一层设计上不要过多的影响到界面人员的工作,最基本的要求就是不要过多的加入一些设计软件不支持的标签等元素(如Struts的很多标签在Dreamweaver中都不支持)。这里我们以EasyJWeb为例,探讨在View层如何实现比较合理的设计。

  EasyJWeb作为一个快速Java Web MVC框架,其设计目标不尽是要简化软件开发人员的代码书写工作,更是要能方便界面设计人员的工作。

  当然,要使界面能跟后台程序逻辑能融合,显示界面及程序逻辑之间需要一定的对话协议在所难免。EasyJWeb作为一个MVC框架,同样也存在着这样的对话协议,这就是EasyJWeb中的界面模板标识语言。

  在当前发布的版本中,EasyJWeb界面模板标识语言使用的是Apache开源的Velocity模板引擎(template engine),当然以后会根据际需要加入更多的模板引擎以供框架应用者选择。

  Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。

  理论上你可以在EasyjWeb模板使用所有Velocity的脚本及功能,但我们不推荐你在界面模板中使用过多过复杂的脚本表达方式,在万不得已的情况下,不要在界面模板中加入任何复杂的逻辑,更不要在界面模板中加入变量声明、逻辑运算符等等。

  在EasyJWeb中,我们提供了四条基本的模板脚本语句,基本上就能满足所有应用模板的要求。这四条模板语句很简单,可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中,我们看到,所有界面模板中归纳起来只有下面四种简单模板脚本语句即可实现:

  1、$!obj  直接返回对象结果。
  
  如:在html标签中显示java对象msg的值。<p>$!msg</p>
    在html标签中显示经过HtmlUtil对象处理过后的msg对象的值.<p>$!HtmlUtil.doSomething($!msg)</p>

  2、#if($!obj) #else #end 判断语句

  如:在EasyJWeb各种开源应用中,我们经常看到的用于弹出提示信息msg的例子。
  #if($msg)
  <script>
  alert('$!msg');
  </script>
  #end
上面的脚本表示当对象msg对象存在时,输出<script>等后面的内容。

  3、#foreach( $info in $list) $info.something #end  循环读取集合list中的对象,并作相应的处理。
  
  如:EasyJF开源论坛系统中论坛首页显示热门主题的html界面模板脚本

  #foreach( $info in $hotList1)
<a href="/bbsdoc.ejf?easyJWebCommand=show&&cid=$!info.cid" target="_blank">$!info.title</a><br>
   #end
  上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。
  
  4、#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。

  如:在EasyJF简易订销管等系统中经常看到的一个排序状态显示的模板内容。
  函数(宏)定义,一般放在最前面
  #macro(orderPic $type)
  #if ($orderField.equals($type))
  <img src="/images/ico/${orderType}.gif">
  #end
  #end

具体的调用如:<font color="#FFFFFF">头衔#orderPic("title")</font>
  
    
  总结: 
  当然,在实际应用项目中,为了实现界面的更加友好、人性化,会出现很多复、易变的需求。如根据对象的不同状态,显示不同的提示颜色、提示语音等功能。在这种时候,仍然要慎用太多的模板脚本功能,大多数需求都可以通过变通的方式解决,有些信息可以直接在对象中增加逻辑转化信息,有些界面要求可以通过在界面中使用与特定界面有关的表达方式来实现,如html页面中使用javascript、css,Wap页面中使用WMLScript等等。只有,这样才能确保证你的系统核心不受界面的的影响及控制,才能更好的扩展及维护。

  我们希望你能成为真正的程序高手,而不只是精通某个处于表层的脚本语言,因此也不希望广大Java开发人员在View层消耗太多的时间。

  由于水平有限,本文所谈的内容有N多不合理或者需要改进的地方,恳请大家指正!

分享到:
评论

相关推荐

    浅谈框架与MVC

    ### 浅谈框架与MVC #### 架构的重要性及概念 在软件开发领域,架构设计扮演着至关重要的角色。良好的架构设计不仅能够确保软件系统的稳定性、可维护性和可扩展性,还能提升团队协作效率。正如文章所述,“好的产品...

    MVC.rar_mvc_mvc CSharp_restaurant_三层 CSHARP_餐馆

    首先,MVC(Model-View-Controller)是软件设计模式的一种,主要应用于Web应用开发,如C#中的ASP.NET MVC框架。模型(Model)负责处理业务逻辑和数据管理,视图(View)负责展示用户界面,控制器(Controller)则...

    浅谈Asp.net Mvc之Action如何传多个参数的方法

    *** MVC框架是微软推出的一种用于构建Web应用程序的模型-视图-控制器(Model-View-Controller)框架,它允许开发者以一种更加灵活的方式来组织和管理Web应用程序的代码。在*** MVC中,Action方法是控制器中处理请求并...

    浅谈基于Struts和Hibernate的J2EE应用

    Struts 是一款开源的Web应用程序框架,最初在2002年由Apache Jakarta项目发布,旨在简化基于MVC(Model-View-Controller)设计模式的Web应用开发。Struts 1.1是当时最新的稳定版本。Struts提供了一种组织应用程序...

    Struts2 技术内幕读书笔记(1)

    - **Struts2**:一个MVC框架,主要用于构建Web应用的表示层。 - **Spring**:一个轻量级的框架,用于管理业务层组件。 - **Hibernate**:一个ORM框架,用于实现持久层逻辑。 ##### MVC模式 MVC(Model-View-...

    ASP.NET3.5从入门到精通

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    浅谈ASP.NET Core 2.0 部分视图(译)

    *** Core 2.0是微软推出的轻量级、模块化、高性能的Web开发框架。它继承了*** MVC和Web API的功能,并对它们进行了整合。在Web开发过程中,我们经常会遇到需要在多个页面中重用代码或展示公共部分的情况,部分视图...

    ASP.NET 3.5 开发大全11-15

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET 3.5 开发大全

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET 3.5 开发大全1-5

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET 3.5 开发大全word课件

    这是整部学习资料 由于太大第一章免费供应给大家 在我的上传资源中 如果觉得还不过希望大家给个好评 当然具体本书的作者就不深究了把! 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP...

    ASPNET35开发大全第一章

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    浅谈struts1 & jquery form 文件异步上传

    尽管Struts1已经较为陈旧,但理解这个过程有助于我们更好地理解和应用现代的MVC框架,如Spring MVC或前后端分离架构中的RESTful API。同时,jQuery Form插件的概念也可以迁移到其他前端库,如React或Vue,它们同样...

Global site tag (gtag.js) - Google Analytics