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直接拷贝两个对象值。
相关推荐
信号代表对象状态变化或事件发生,槽则是响应这些信号的可调用实体。这种松耦合的通信方式简化了异步编程和事件处理。 QML与Qt Quick: QML是一种声明性语言,结合JavaScript,用于快速创建流畅、动态的用户界面...
3. **UI设计**:使用XML布局文件定义用户界面,例如使用RecyclerView展示记事列表,每个条目是自定义的View,包含记事标题和部分内容。添加和编辑记事的界面则可能使用EditText控件获取用户输入。 4. **Adapters和...
以上就是基于SSH框架的系统设计中涉及的主要技术点,这些知识对于理解和开发企业级Java Web应用至关重要。通过这样的毕业设计,学生不仅能够掌握Java编程和Web开发的基础,还能深入理解软件工程的实践过程,为未来的...
本篇将深入探讨一个基于MVC(Model-View-Controller)架构的本科毕业设计——图书管理系统。这个系统不仅实现了图书的分类管理、显示管理、用户管理、图书管理等功能,还包含了图片上传的实用特性,为本科毕业生提供...
在IT领域,尤其是Web开发中,基于Model-View-Controller(MVC)架构的项目设计是常见且重要的一种方式。本项目是针对毕业生的一个优秀模板,它涵盖了从开题报告到源代码的完整流程,适合于学习和实践。下面将详细...
2. MVC模式的代码自动生成:系统根据用户设计的实体模型,自动生成MVC(Model-View-Controller)架构中的各层代码,包括视图层(View)、控制器层(Controller)以及持久层(Persistence)。这极大地简化了开发流程...
数据库设计是系统的关键部分,涉及用户表、商品表、订单表、评论表等多个实体。合理的数据库设计能够确保数据的一致性和完整性,例如使用外键约束来维护表间的关系。 五、安全策略 1. **加密技术**:密码存储采用...
在实现过程中,首先搭建SSH框架,配置相应的环境,然后根据需求分析设计数据库模型,编写实体类和DAO接口。接着,用Struts2编写Action类,实现业务逻辑,通过Hibernate操作数据库。最后,使用Spring进行依赖注入,...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,负责处理HTTP请求并调用相应的业务逻辑。在本系统中,Struts2负责接收用户请求,转发到对应的Action类处理,然后返回视图给用户展示。 **3. ...
采用MVC(Model-View-Controller)设计模式,将业务逻辑、数据表示和用户交互分离,有利于系统的维护和扩展。 四、数据库的设计 数据库设计是系统的关键部分。作者选择了适合图书管理的数据库模型,如ER图(实体...
- **实体关系模型**:在旅游网站中,可能会包含用户、景点、旅游路线、订单等多种实体,需要设计合理的数据库表结构来存储这些信息。 - **SQL查询**:Java代码将通过JDBC(Java Database Connectivity)接口与...
SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中常见的技术栈,本项目"基于SSM的物流管理系统的设计与实现"利用这三个框架构建了一个完整的物流管理平台。下面将详细介绍SSM框架的核心概念及其在物流系统中...
- E-R模型:实体-关系(Entity-Relationship)模型用于数据库的设计,有助于清晰地表达数据的结构和关系。 3. 数据库的搭建: - MySQL数据库的安装和配置:介绍了如何在Windows操作系统上安装MySQL数据库服务器,...
系统架构基于B/S(Browser/Server,浏览器/服务器)模型,采用MVC(Model-View-Controller)设计模式,分为表示层、控制层和实体层。SSH2框架(Struts2、Spring和Hibernate)是实现这一架构的常用选择,它整合了上述...
源代码是设计的实体表现,包含了整个系统的实现细节。通过阅读和研究源代码,开发者可以更深入地理解ASP.NET的应用方式,以及VLP2P通信库的内部工作原理。这不仅对于学习ASP.NET和P2P通信技术有极大的帮助,也是提升...
### 基于WEB的航班查询和订票系统概要设计说明书 #### 1. 引言 ##### 1.1 编写目的 本文档旨在详细阐述基于WEB的航班查询和订票系统的概要设计思路,明确系统的设计目标、架构、主要功能模块及其相互关系。通过本...
【标题】"毕业设计:基于Java的加油站信息管理系统"是一个以Java为核心技术的软件开发项目,旨在构建一个用于管理加油站日常运营的系统。这个系统利用了Model-View-Controller(MVC)架构模式,这是一种常见的软件...
数据库设计是系统核心,需要合理规划实体关系,如学生、课程、成绩之间的关联。通常使用关系型数据库,如MySQL或Oracle,通过ORM框架如Hibernate或MyBatis进行操作。 4. **MVC设计模式** 为了提高代码的可维护性...