`

页面模板的重构

阅读更多

最近在工作中重构一个老系统,烂的地方有很多,但是对于后台的页面模板(我指的是JSP、FreeMarker、Velocity这样的后台模板,JavaScript前端模板不在此讨论范围内),却是我要说的部分,这似乎是一个被人遗忘的小角落。你可以很轻易地找到怎样重构Java类和方法的材料,你的Java代码可以写得很优雅;去搜搜“重构”,到处是怎样重构你的Java代码、C++代码,我们也能找到许多前端设计师对于页面结构的重构,但是重构的范围远非至此。

后台业务逻辑写得再好,一个jsp、ftl模板页面还是可能写上几千行,业务逻辑耦合在呈现代码里面,看起来一团糟,对这部分的重构,既不属于传统的Java代码的重构,也不属于前端工程师的范畴,就这样姥姥不疼、舅舅不爱地被忽略了。但是对一个网站来说,模板数量大得惊人,这是一个不可避开的话题。微博上@zhh-2009说道:

阿里集团有成千上万的系统,一大堆的Java码农,有个更好笑的说法是: 阿里Java码农其实就是velocity模板码农。

把业务逻辑从模板中剥离出去

模板是用来做什么的?就是用来做页面生成和展现的,以分离业务逻辑代码和用户界面代码。理想情况下,模板代码中不应该包含任何业务逻辑的代码在里面。我见过通过向模板传递service对象的方式,再在模板里面通过service获取数据,这是糟糕的做法。模板要做的事情需要保持清晰,不要耦合那些模型层的业务逻辑。

剥离数据处理的重复劳动

Model的数据,距离展现需要的数据,表现形式上会有诸多差异,所以往往在模板拿到以后,还需要经过加工处理才能展示。比如日期型数据,一个java.util.Date对象被送到了模板上,有时需要转换成“2012-11-18”这样的形式,有时需要转换成“09:47:10”这样的形式,于是我见到了大块的页面模板上数据处理的逻辑代码。

当然,这也是可以优化的:

1、使用标签。标签可以封装好一些通用的展示逻辑,这里指的标签就是纯粹为了展示的需要而封装的标签,并非封装了业务逻辑的功能标签。每一个标签都可以变成一个小的MVC组件,一样可以使用模板的方式来输出(而不是再标签实现类里面生写HTML代码)。

2、使用模板宏。比如FreeMarker的模板宏:

1
2
3
4
5
6
<#macro repeat count>
    <#local name = "default">
    <#list 1..count as iter>
        ${name} ${count}/${iter}: <#nested>
    </#list>
</#macro>

然后就可以使用了:

1
<@repeat count=3>abc</@repeat>

3、使用数据处理的工具方法。可以写辅助类,在模板中引入,也可以利用模板的“静态引入”能力,后文会提到。

4、在数据传递到模板前,增加一层数据预处理的逻辑。这个实现方式有很多,比较常见的是利用Interceptor,将一种数据处理成多种展现形式,在模板中就可以直接拿来使用,后文也会提到。

管理好模板数据的上下文

说到模板数据的上下文,就要提到模板变成页面的方式,最基本的方式其实就是占位符(表达式)的替换,也就是将指定模板内容(字符串)中的特定标记(子字符串)替换一下便生成了最终需要的业务数据。在此基础上,才有编译型或者解释型的其它方式。

在占位符替换的过程中,需要根据表达式字符串,去特定的上下文中寻找相应的数据,以JSTL为例,所有通过request.setAttribute(“key”, value)方法放置的数据全部都能直接获取:

1
<div><c:out value="key" /></div>

或者也可以利用JSP对EL表达式原生的支持:

1
<div>${key}</div>

如果你使用的是OGNL表达式语言,为了更好用,它在Struts 2中做了进一步扩展,这时这个上下文就是总接触到的“value stack”。

展示数据预处理层

这一层就是为了填补Model和模板展示需要的数据或者数据形式之沟壑而增加的,可以使用Interceptor实现,比如我在所有页面展示里面都需要用到当前用户user这个对象,那我就可以在Interceptor中,把user对象准备好,放置到模板数据的上下文中,这样在模板里面就可以拿来即用了。这是数据的沟壑,还有数据形式的沟壑,前面那个时间格式的例子已经提到过了。

静态引入也是一种常用的准备数据的方式,在JSP里就是:

1
<%@import page="userData.jsp" %>

用这种方式引入的页面在编译时就会引入进来,里面的数据、包、类拿来即用。

子页面划分

在页面模板重构上,这大概是我们最常用和最基础的办法。我们经常根据最终呈现页面的特点,把页面划分成展示功能独立的几个子页面,然后在需要的位置引入进来,比如JSP的动态引入:

1
<jsp:import page="detail.jsp" />

还有一种方式对页面模板开发的程序员更加透明,开发人员在自己关心的页面模板中可以看不到这些import的代码,转而把这个引入的规则配置放到页面模板之外去,有的根据URL规则来聚合子页面,有的根据自定义的页面特点来聚合那些子页面,比如Tiles 2的聚合规则配置:

1
2
3
4
5
<definition name="index" template="/siteLayout.jsp"
    <put-attribute name="header" value="/header.jsp"></put-attribute
    <put-attribute name="content" value="/content.jsp"/>  
    <put-attribute name="footer" value="/footer.jsp"/> 
</definition>

更多的例子,在这个我曾经已经谈到过的这个页面聚合的话题。

文章系本人原创,转载请注明作者和出处( http://www.raychase.net 

注:本博客已经迁移到个人站点  http://www.raychase.net/  ,欢迎大家访问收藏,本ITEye博客在数日后将不再更新。

1
0
分享到:
评论

相关推荐

    网站重构,公用模板重构

    网站重构和公用模板重构是提升Web应用质量和效率的重要方法,主要目标是提高代码的可维护性和用户体验。在本文中,我们将深入探讨这两个概念,并重点分析公用模板重构的关键要素。 首先,重构是软件开发中的一个...

    OBLOG ipod模板重构版

    【标题】"OBLOG iPod模板重构版"是一个针对OBLOG平台设计的专业化模板,它专为iPod用户或音乐爱好者提供了独特的视觉体验和交互设计。重构版意味着在原有基础上进行了优化和改进,以适应现代网页设计的趋势和技术...

    红色风格网站登录注册页面html模板

    标题中的“红色风格网站登录注册页面html模板”指的是一个网页设计资源,它是为创建具有红色主题的登录和注册页面而设计的HTML模板。...通过分析和重构这个模板,初学者可以逐步掌握网页开发的基本原理和最佳实践。

    基于vue3和ts的移动端H5项目模板,开箱即用.zip

    - **Ref & Reactive**:对响应式系统的重构,使数据绑定更加底层化,提升了性能。 2. **TypeScript**:静态类型语言,提供强类型检查和丰富的工具支持,增强了JavaScript的开发体验。在Vue3中使用TypeScript的好处...

    杰奇PTCMS4.2.8 二开优化模板黑色款模板 定制开发版模板免费送

    在设计上,开发人员重构了CSS,使得模板的样式更加简洁、高效,提高了网页加载速度,这对于用户体验至关重要。在如今的互联网环境中,快速的页面加载时间不仅可以提升用户的满意度,还有助于搜索引擎排名的提升。 ...

    单页模板扒手-下载单页面利器

    单页模板扒手是一款强大的工具,专为网页设计师和开发者设计,用于快速、高效地下载并保存单页面网站的模板。这款工具可以帮助用户方便地获取网页的HTML结构、CSS样式和JavaScript代码,以便于后期的二次开发或者...

    Axure WEB端交互原型通用组件模板库 v3.2 (Axure RP9作品).zip

    在新版本中我们对作品的内容体系进行了一次重要的重构,新版本由组件列表、交互手册、模块组合、页面交互、界面模板、相关分享等6大部分组成,为了更符合新版本的内容定位,作品名称更名为:Axure WEB端交互原型通用...

    vuejs社区手机端重构

    在手机端重构时,需合理设计路由结构,实现平滑的页面切换。 5. **Vuex**:Vuex是Vue的状态管理模式,用于集中管理应用中的共享状态。在大型项目中,使用Vuex可以解决组件间通信问题,保持状态一致性。 6. **响应...

    GR-223_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    《PSD网页模板在前端页面设计中的应用与实践》 在网页设计领域,PSD(Photoshop Document)格式的文件是设计师们广泛使用的工具,它能够提供丰富的图层管理和编辑功能,使得网页的设计过程更为直观和高效。"GR-223_...

    GR-277_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    在将PSD模板转化为前端页面的过程中,设计师或前端开发者会利用切片后的图像,结合HTML结构和CSS样式来重构页面。例如,他们会把PSD中的按钮、导航栏、背景图等元素转换为HTML元素,并应用CSS来控制它们的样式和布局...

    shop-076_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    本文将围绕"shop-076_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip"这一主题,深入探讨PSD模板的使用方法、其在网页设计中的价值以及如何通过切片技术实现前端页面的构建。 PSD模板是一种预先设计好...

    如何进行重构 pdf

    - **利用模板**:对于经常需要进行类似重构任务的情况,可以考虑创建一套标准模板,以提高工作效率。 - **分阶段进行**:如果文档非常庞大复杂,建议将其分解为几个小项目分别处理,避免一次性面对大量工作。 - **...

    网页模板小偷 8.0

    5. **优化与重构**:提取出的模板可以进一步进行优化和重构,去除不必要的代码,提高网页性能,同时适应不同的设备和浏览器。 6. **节省时间**:对于频繁需要创建类似页面的设计师而言,这款工具能显著减少重复劳动...

    GR-229_psd网页模板_网站psd效果图切片_PSD欧美日韩风格_前端页面.zip

    《PSD网页模板及其在前端页面设计中的应用》 网页设计是互联网行业中至关重要的一环,它不仅决定了网站的视觉效果,还影响着用户体验。而PSD(Photoshop Document)文件格式,作为Adobe Photoshop的默认保存格式,...

    GR-170_psd网页模板_网站psd效果图切片_PSD欧美日韩风格_前端页面.zip

    例如,压缩包内的temp006_main.psd可能是整个网站的主要页面模板,它包含了网页的主体结构和设计元素,如头部导航、主体内容区、页脚等;而temp006_sub4.psd至temp006_sub5.psd等子文件,则可能代表了不同的页面模块...

    BL-208_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    描述中的“网站psd效果图切片”是指在完成PSD模板设计后,通过软件(如Photoshop)的“切片工具”将模板分割成多个部分,以便于HTML和CSS进行精确的页面重构。切片是将复杂的设计分解为可独立处理的简单元素,有助于...

    BL-280_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    该压缩包文件“BL-280_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip”包含了一系列与网页设计相关的素材,特别是PSD(Photoshop Document)格式的文件,用于创建和编辑网页的前端页面。PSD是Adobe ...

    蓝色简约风可格 vue+elementui 后台模板面局.zip

    通过使用这个模板,开发者可以省去大量的基础页面设计工作,更专注于业务逻辑的实现,从而提高开发效率。 【标签】所包含的关键词进一步细化了这个模板的特性: - `vue`:Vue.js是模板的基础,它支持声明式编程,...

    BL-317_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    在实际使用过程中,设计师会将PSD模板切片后,使用HTML和CSS重构页面,结合JavaScript实现交互效果。对于前端开发者来说,理解PSD文件的结构和组织方式,以及如何将其转化为响应式的前端页面,是必要的技能。同时,...

    BL-157_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    《PSD网页模板在前端页面设计中的应用与实践》 在网页设计领域,PSD(Photoshop Document)格式的文件是设计师们广泛使用的工具,它能够提供丰富的图层管理和编辑功能,使得设计师能够精确地控制网页的设计细节。...

Global site tag (gtag.js) - Google Analytics