叶 钰,李太宁
(1. 泰州职业技术学院 信息工程学院;
2. 新生网络科技有限公司,江苏 泰州 225300)
传统意义上,WEB开发中服务器端与客户端是密不可分的。无论是基本的ASP、JSP、PHP技术,还是稍上层一点的Struts、Spring、JSF、Seam等技术,都将生成WEB页面的代码编写包含在服务器端开发过程中。从解耦与分层方面分析,需要服务器端代码完全不考虑页面显示,但在实际开发过程中,由于移动WEB应用的火爆,移动终端的普及,目前终端种类的数量已经无法让项目在设计阶段就考虑周全,所以在编写服务器端代码的时候完全隔离WEB界面有关代码将成为所有WEB开发人员必备的素质之一[1]。
下文将从技术选型与最佳实践上探讨解决服务器端WEB开发的一些重点、难点和需要使用到的技术。
本文选择Java这一最普遍的WEB开发语言,对比种种新兴的脚本语言,Java的功能并不强大,也因为种种限制(例如缺少闭包、不完全面向对象、语法不够灵活等),使代码量相对较大。但也正是因为这种限制,让Java成为了团队开发与大型项目的首选语言,长期占据着开发语言的前三名。Java语言即使没有注释,团队成员也能分辨基本的功能实现。同时,使用Java语言开发的人员较多,其学习成本与二次开发成本相对为所有语言中最低的。这样可提高项目的可持续性,大大降低项目的成本。其他开发语言,如Ruby等新兴语言由于太过灵活,同样的功能,每个开发人员写出来的代码都会有根本的变化,这虽然让个人的开发效率得到了提高,但却大大降低了团队的开发效率。所以Java语言可作为WEB服务器端开发的最佳实践语言。
在软件开发过程中,调优、调试、测试的时间占据了开发流程的大部分时间,在这过程中,如果没有对代码进行版本控制,那么一旦出现错误,则很难对错误进行追溯。同时需求的变更、团队开发、版本测试等许多情况都让版本控制成为开发过程中必不可少的工具之一。版本控制软件的选择很多,其中GIT版本控制系统[2],其稳定性与适用性经历了大量的考验,排名第一的市场占有率使其成为了当之无愧首选版本控制工具。
Git的主要优势在于其分布式的管理方式。由于采用了去中心化的版本管理思想,Git不用安装服务器端,不同的客户端都可以作为完整的服务器端进行部署,各客户端之间的传输方式没有任何限制。同时Git的快速分支功能使得快速迭代开发的成本可以忽略不计,任何一个标点的修改都可以作为新的分支或版本保存,并随时回溯,大大增加了开发效率。
部署与测试的效率是Java等编译型语言的弱项。每次修改Java代码后,想要看到运行效果都必须经历重新编译、部署、重启web server等繁琐的过程。即使这些过程完全自动化运行,最快也需要5~10秒的时间,这几秒的时间常常会中断开发思路,造成开发人员精力分散。如何实现快速开发部署,以至于如何实现瞬时热部署(hot deploy)就成为WEB开发非常重要的一环。近两年,随着相关技术的成熟,已经有四五种实现快速开发部署的工具,不过技术原理都无非是修改Java的编译过程,让Java代码的修改直接作用到Java字节码生成阶段。例如JBoss的Application Server 7.0以后版本使用的hot deploy方式。对于这方面,不同的工具适用性都有种种的限制,需要开发人员在项目初期根据自己的需要来选择。
本文主要探讨的是服务器端的WEB开发,保持用户状态的细节问题就全部交由客户端去操作。大致的方向有cookie加密、Local Storage等。篇幅原因,这里不详细阐述。
实体关系映射(ORM)是软件开发中重要的思想与手段,充分使用ORM后,软件的结构与开发效率都会得到巨大的提升。得益于Hibernate,Java成为了ORM发挥优势的最佳环境。
自1970年MVC模式被提出,如今已经成为服务器端WEB开发的标准模型[3]。但MVC模型(如图1所示)并不能很好的适应本文提出的思想。由于完全屏蔽了用户界面的生成,所以与客户端的交互需要全部使用对象来实现。
如图2所示,客户端与服务器端交互的数据需要全部组织并处理成对象,而这些对象与Java程序中的Model是对应的,从而实现了Controller在处理的时候只需要根据对象的属性与状态来进行有关的业务处理,并由ORM持久化到数据库中。服务器端与客户端交互的对象全部由JSON Object来实现。
所有接受客户端请求的地址全部以web service的方式实现。每个web service请求均会产生两条请求,一个请求返回具体的HTML页面文件,另一个请求返回JSON Object。所有HTML页面均使用静态地址获得,由web server来自动处理,不再需要controller参与HTML页面的处理过程,不同的controller只需要根据请求返回JSON Object,下面以考试系统的项目中用来处理Question对象的controller为例。具体代码如下:
public interface Controller{
……
public Map
……
protected void returnJSON(){}
……
}
其中objectsMap存储所有需要返回的对象,returnJSON则将对象组织成需要的格式写入HTTP Response中。在具体的实现中,需要有一个Class来实现这个接口,并处理通用的处理代码,例如对objectsMap的存取,HTTP Response的生成等,同时加入一些通用的业务逻辑,例如异常的如理,数据的验证。然后由具体的controller来集成这个Class,实现具体的业务逻辑。例如以下代码:
public class QuestionAction extends Ctrl{
……
public static void save(Question question){
if(Common.isEmpty(question.id)){question.create();
}else question.save();
objectsMap.put("o",question);
returnJSON();
}
……
}
其中Ctrl为处理一些通用操作的Class。save方法为将客户端传来的question对象保存到数据库中。在save方法接收到question对象以后,先做一些基本的验证,例如判断是新建还是保存,如果是新建的请求,则传来的question的id是空。保存到数据库后,将保存完成的question对象返回到客户端。
从上面的例子可以看出,采用本文提到的各种技术后,服务器端的代码变得异常清晰明了。无论是拥有多年经验的资深开发人员,还是刚接触项目的新手都能轻松读懂代码,同时由于版本控制的充分使用,使得维护成本大大降低。服务器端WEB开发效率因此得到巨大提升。本文提及的最佳实践系笔者多年开发经验的总结和长期观察目前国外各大公司的WEB APP开发趋势所得,越来越多的新兴应用也已经采用类似思想,例如Sony's PlayStation 3的YouTube应用(http://us.playstation.com/youtube/)和在开发人员中非常流行的Plunker(http://plnkr.co/)等。笔者在几个实际项目中使用了该思想,各项目稳定上线运行,反响良好,达到了预期效果。
[1]吴权,赖斌.浅谈新网络技术标准带来的改变[J].电脑知识与技术,2010,6(15):3937-3938.
[2] 刘悦之.基于Git的分布式版本控制系统的设计与实现[J].科技传播,2012,(22):197-198.
[3] Liu, Chamond.SmallTalk, Objects, and Design[K].iUniverse, 2000.