view对象
1.何为view对象
首先,view对象不是view层。
关于这个问题,先来看一个常用的模式
service 层
dao 层
view 层
entity 实体
也许在基于领域模型的设计中,还会有一个专门的model实体,领域实体,来对领域对象进行抽离。
该结构忽略了一个细节,也就是,view层,视图层,它的规则,不受领域,更不受数据实体的关注。以java语言为例,一般情况下,model对象或者entity对象时可以直接被视图模板直接使用并输出的。但视图层有个特点就是随时变化的,或者视图层的展示,极其复杂的,entity和model的数据本身就无法在未进过一些处理直接使用。这个特殊处理在哪里进行?entity或者领域内部?这不可能,这根本就不是他们的职责,view层或者service,dao层就更别说了。到了模板引擎来处理?是的,经常这么做。
那么来看一个例子
这是两种收费凭证,第一种是普通的,第二种是课外活动的(实际上有很多种凭证,这里只截取了系统的两种)。
对于打印界面
都类似,于是采用同一张freemarker模板文件,printInvoice.html。
随后,有个要求,对于课外活动的凭证打印的时候,要求按照时间,也就是周一到周日,顺序显示。并且取出来的时候是没有按照这个顺序排列好的,也许有人说,order by一下不行吗?行,但是我变一下,我要求周三显示到第一列,周五显示到第二列,其他按照顺序显示呢?你还想告诉我order by一下嘛?视图层变化随时可能发生的。它的变化度要远远高于业务变化吧。
为了满足这个要求,根据上面说的,在freemarker中完成吧?但模板这东西,它如果加上复杂的逻辑,这模板的可读性,不言而喻。
上代码
<td valign="top" align="left" style="padding-left:0px">
<table border="0" cellspacing="0" cellpadding="0" style="border-collapse: collapse">
<#--课外活动-->
<#if periodNoAttr?exists && periodNoAttr.attrValue?exists>
<#list 0..6 as i>
<#assign w = daysPerWeekE[i] + "."/>
<#--查找星期信息-->
<#list invoiceItems as it>
<#if it.description?? && it.description ==w>
<#assign curInvoiceItemTypeId=it.getRelatedOne("InvoiceItemType")>
<#assign itW = it>
<#break />
</#if>
</#list>
<#if itW?? && itW != "">
<tr>
<td>
${(itW.description)?if_exists}
</td>
<td>${(curInvoiceItemTypeId.description)?if_exists}</td>
</tr>
</#if>
<#assign itW = "" />
<#assign curInvoiceItemTypeId = "" />
</#list>
<#--非课外活动-->
<#else>
<#list 0..6 as i>
<#if invoiceItems?has_content>
<#if (invoiceItems[i])?has_content>
<#assign curInvoiceItemTypeId=invoiceItems[i].getRelatedOne("InvoiceItemType")>
<tr>
<td>${(invoiceItems[i].description)?if_exists}</td>
<td>${(curInvoiceItemTypeId.description)?if_exists}</td>
</tr>
</#if>
<#else>
<#assign curInvoiceItemTypeId="">
</#if>
</#list>
</#if>
</table>
</td>
<td valign="top" align="right" style="width: 200px;">
<table border="0" cellspacing="0" cellpadding="0" style="border-collapse: collapse">
<#--课外活动-->
<#if periodNoAttr?exists && periodNoAttr.attrValue?exists>
<#list 0..6 as i>
<#assign w = daysPerWeekE[i] + "."/>
<#list invoiceItems as it>
<#if it.description?? && it.description ==w>
<#assign itW = it>
</#if>
</#list>
<#if itW?? && itW != "">
<#assign curInvoiceAmount=itW.amount>
<tr>
<td style="padding-right:25px"> <#if curInvoiceAmount?? && curInvoiceAmount?string != '0'>${(curInvoiceAmount?if_exists)?string("currency")}</#if></td>
</tr>
</#if>
<#assign itW= ""/>
</#list>
<#else>
<#--非课外活动-->
<#list 0..6 as i>
<#if invoiceItems?has_content>
<#if (invoiceItems[i])?has_content>
<#assign curInvoiceAmount=invoiceItems[i].amount>
<tr>
<td style="padding-right:25px"> <#if curInvoiceAmount?? && curInvoiceAmount?string != '0'>${(curInvoiceAmount?if_exists)?string("currency")}</#if></td>
</tr>
<#else>
<#assign curInvoiceAmount="">
</#if>
</#if>
</#list>
</#if>
</table>
</td>
这代码似乎不难,但别忘了我这里的例子也不复杂。
通过view实体来完成这些也许会越来越复杂的东西,
public class InvoiceView {
///其他代码省略
/** * * 描述:按照星期排序收费子项 * * @return * @author liyixing 2012-4-1 下午10:36:13 */ public List<GenericValue> getInvoiceItemsOrderByWeek() { List<GenericValue> invoiceItemsOrderByWeek = FastList.newInstance(); for (int start = 1; start <= 7; start++) { String currentInvoiceItemSeqId = "0000" + start; for (GenericValue invoiceItem : invoiceItems) { // 找到当前星期 if (currentInvoiceItemSeqId.equals(invoiceItem .getString("invoiceItemSeqId"))) { invoiceItemsOrderByWeek.add(invoiceItem); break; } } } return invoiceItemsOrderByWeek; }
//正常部分
public List<GenericValue> getInvoiceItems() { return invoiceItems; }
}
这个时候再模板中,要做的事情就清晰的多了
<#--项目-->
<div style="position: absolute; left:105px; top: 150px; width: 590px;">
<#if invoiceView.invoice.invoiceTypeId == "AFTSCH_ACT_INV">
<#--课外活动,按照收费时间,周一到周日排序-->
<#list invoiceView.invoiceItemsOrderByWeek as invoiceItem>
${invoiceView.daysEnPerWeek.get(invoiceItem.invoiceItemSeqId)}
${invoiceView.getInvoiceItemType(invoiceItem).description}:
${invoiceItem.amount}
</#list>
<#else>
<#--其他凭证,按照正常逻辑-->
<#list invoiceView.invoiceItems as invoiceItem>
${invoiceView.getInvoiceItemType(invoiceItem).description}:
${invoiceItem.amount}
</#list>
</#if>
<#--校车,校车和参加周在view对象中的代码我省略掉了-->
<#list invoiceView.schoolBusTerms as invoiceTerm>
schoolbus: ${invoiceView.daysEnPerWeekBySchoolBus.get(invoiceTerm.textValue)}
</#list>
<#list invoiceView.weekTerms as invoiceTerm>
Week: ${invoiceTerm.textValue}.
</#list>
</div>
这就是对比了。
2.好处
好处,很简单,java代码的可读性本身就比嵌套了其他诸如html,xml之类的模板要清晰的多的多,这个每个人都明白的吧。
view能适应各种变化,只是加一个get或者其他方法而已,或者更改原有的方法的值。
3.注意项
view对象应该经过抽离,一般情况下和领域对象直接对应即可。
如Invoice凭证领域对象
和InvoiceView。
view无需考虑它所处的位置,如对于admin平台有对student的展示有特殊要求,bbs部分对student也有要求,那么只需要一个view,而不要分离出两个。从我想到view实体对象,到用到现在,发现view的方法会逐步增加,而且这些方法很少有能重用的,但没关系view是一个很简单,也很没有必要过分抽象的对象,甚至你的view里面的一个方法只会被一个模板页面用到,那也没关系。
view会引用model或者entity对象。建议引用model。实际上继承是更好的方式。然后再利用BeanUtils直接拷贝两个对象值。
相关推荐
基于MVC模式的网上购物系统的设计与实现 摘要:本文介绍了基于MVC模式的网上购物系统的设计与实现,系统主要实现用户信息管理、订单管理、商品管理等功能,并描述系统功能模块的实现、开发过程中所用到的关键技术。...
* E-R 模型设计是指基于实体-关系模型(E-R 模型)的数据库设计,能够描述实体之间的关系和约束。 本文档详细介绍了基于 JavaEE 的图书管理系统的设计和实现,包括系统开发背景、开发环境及相关技术简介、MVC 模型...
最终设计方案是基于机构设计和运动学分析的雨刮器机构设计,使用ADAMS/VIEW软件来进行机构设计和运动学分析。 三、刮水器机构相关数据的计算及分析 在汽车雨刮器设计中,需要对雨刮器机构的相关数据进行计算和分析...
基于Pro/E三维实体造型软件建立了履带式移动机器人模型,通过Pro/E与ADAMS/View间的数据交换,实现了模型的传递,对比了2种交换方式的特点,解决了利用Pro/E与ADAMS进行联合仿真时的数据交换问题,在此基础上,进行了履带...
基于基于JavaWeb实现的网上留言管理系统的毕业设计简介,字数550字,采用B/S(Browser/Server)应用架构以及MVC(Jsp+Servlet+Model)编程架构设计开发,体现具体代码 本系统采用B/S架构,由前台JSP技术和后台Servlet技术...
本文档是基于JSP的学生成绩管理系统的设计与实现论文,主要讨论了学生成绩管理系统的设计和实现,使用Java语言和JSP技术开发了一个基于Web的学生成绩管理系统。 系统概述 学生成绩管理系统是基于Web的应用系统,...
【作品名称】:基于python的深度知识追踪(GIKT)模型的习题推荐系统的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 ...
信号代表对象状态变化或事件发生,槽则是响应这些信号的可调用实体。这种松耦合的通信方式简化了异步编程和事件处理。 QML与Qt Quick: QML是一种声明性语言,结合JavaScript,用于快速创建流畅、动态的用户界面...
基于Python的数据库课程设计-数据库系统.zip 完成度: [x] 设计特定的数据结构,用于存储数据表、视图、索引三种数据库对象的元数据信息,建立数据库系统的数据字典;{表占0.5分,视图和索引占0.5分,要有存储文件...
Mybatis是基于jdbc的框架,主要用来操作数据库,并将业务实体和数据表联系起来。 知识点二:系统设计 系统设计是指根据系统的需求和功能,来设计和实现系统的结构和组件。系统设计主要包括数据库E-R图、创建病例...
1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...
Spring 框架提供了依赖注入和面向切面的编程机制,Spring MVC 框架提供了基于 Model-View-Controller 的 Web 应用程序开发机制,MyBatis 框架提供了基于 ORM 的持久层机制。 在本系统中,我们使用 Spring 框架来...
Model层封装了题目和试卷的实体类,Controller层封装了管理员端和学生端的控制类,View层通过Swing框架构建了用户界面。 该系统具有较强的扩展性,可以根据需要添加更多的功能模块。通过实际应用,可以有效提高管理员的...
有什么疑问可联系QQ:865728838 第一部分 案例描述 案例目的 ...2、在com.handson.stumanager.view包中 设计一个界面类,可起名为StuManagerCUI,用于创建登录界面、主界面、添加界面、显示所有界面。
采用的技术 Struts框架诞生于2001年,Struts 2是Struts的下一代产品,Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的...
基于UML的系统需求分析——E_motor客户关系管理系统设计 本文档讨论了基于UML的系统需求分析方法在E_motor客户关系管理系统设计中的应用。该方法通过使用UML的Use Case从用户和业务两种模式对系统进行需求分析,...
采用Solidworks软件建立了机构的三维实体模型,导入ADAMS并添加相应的约束,然后进行仿真、后处理,得到滑枕...Solidworks和ADAMS的结合使用将解决复杂模型在ADAMS/View环境下直接建模的困难,为机构的优化设计提供了参考。
项目基于MVVM的前后端分离开发模式进行开发.MVVM即模型(Model)-视图(View)-视图模型(View Model),实现了数据视图的双向绑定.相对于MVC模式和MVP来说,MVVM是一个比较新的开发架构,它是一种将MVP模式与WPF相结合应用...
借鉴于著名的RBAC,即基于角色的访问控制(Role-Based Access Control),并结合我们的需求,屏弃了RBAC中的Group实体对象,对其进行一定的简化和改善后,并结合DWR技术,设计出一个相对比较完善的权限管理功能。...