STRUTS的不足
在基于MVC模式的架构里,随着B/S开发的流行,近来尘嚣其上的就是STRUTS。“STRUTS本身只是一个开发框架,它本身并不能保证程序开发的模块结构是否清晰, 也不能保证程序开发的进程 ”。笔者根据一些朋友利用此架构开发项目的经验,总结出STRUTS的不足:
1 入门不易,特别是TAGLIB
2 大量的TAGLIB让美工设计人员无所适从
3 比较适合于大的项目
鉴于此,笔者总结出另一符合MVC模式的替代架构。先谈MVC模式
“MVC模式不仅实现了功能模块和显示模块的分离,同时它还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性。。。。。。”准确地说,MVC更象是一个框架。
我们的方案分三个步骤:
1 在视图层利用MS的浏览器带的数据绑定技术,实现数据与界面显示。
2 在控制层我们实现取数引擎,利用COMMAND模式来控制流程转向。
3 在模型层使用JAVABEAN实现数据模型。
方案最大的优点在于数据绑定的应用。因此下面的例子都是为了配合演示视图层。没有实现流程控制和JAVABEAN模型。
视图层应用数据绑定
数据绑定是Internet Explore的专长之一。使用数据绑定,可以将文档中的数据和ActiveX数据对象数据库相连,并且使用一种简单易用的方式处理数据。这项技术很有用,因为数据库的数据可以作为XML文档在因特网上发送,并可在浏览器上立即转换过来,这意味着熟悉数据库编程的程序员可以集中精力在使用数据库方法上而不是DOM方法上。
数据绑定分为两个步骤:1 使用数据源对象 2 把数据和HTML元素绑定
在IE浏览器中有四种数据员对象:MSHTML控件,TDC表格数据控件,XML DSO和XML数据岛。我们这里用到的是XML数据岛。因为我们的数据交换格式是XML数据包。
我们可以通过<xml ID=”DATASOURCEID” SRC=”http://localhost:7001/XmlData”>设置数据源。
在这里ID是绑定HTML的数据源的代码,SRC是取得XML数据包的引擎,其可以是一个得到数据包的URL,也可以是个XML文件。
接着我们开始对HTML对象进行数据绑定。我们要用到这些HTML元素的DATASRC属性指定数据源ID,DATAFLD指定数据值。例如:
将下列XML存为文件custom.xml
<?xml version="1.0" ?>
<CUSTOMERS>
<CUSTOMER>
<NAME>Charles</NAME>
<CUSTOMER_ID>58704</CUSTOMER_ID>
</CUSTOMER>
<CUSTOMER>
<NAME>Tom</NAME>
<CUSTOMER_ID>58703</CUSTOMER_ID>
</CUSTOMER>
<CUSTOMER>
<NAME>John</NAME>
<CUSTOMER_ID>58702</CUSTOMER_ID>
</CUSTOMER>
</CUSTOMERS>
将下列HTML代码存为test.html,和custom.xml在同一目录下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>数据绑定</title>
<xml ID="cust" src="custom.xml"></xml>
</head>
<body>
<table datasrc="#cust" width=100% border="1">
<tr>
<td><span datafld="NAME"></span></td>
<td><span datafld="CUSTOMER_ID"></span>
</td>
</tr>
</table>
</body>
</html>
下面是数据绑定的结果:
看看怎么样,是否很简单我们就得到一个表格。而且不用做任何显示计算,只要让美工人员为HTML元素加个属性即可。而且我们还可以使用pageSize设置页的记录数,pageCount记录集包含的页数,moveFirst,moveLast,moveNext,movePrevious轻松实现分页。怎么样,和STRUTS相比是否我们做得更简单,结构更清晰。而且大量计算集中在客户端,可以减轻服务器端的计算负荷。
在控制层传递XML数据包
我们之所以用XML作为数据交换是因为JAVASCIRPT和JAVA都有DOM对象来解析XML。
我们将通过一个SERVLET来得到一个XML包;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class XMLData extends HttpServlet {
static final private String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException {
}
//Clean up resources
public void destroy() {
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<?xml version=\"1.0\" ?>");
out.println("<CUSTOMERS>");
out.println(" <CUSTOMER>");
out.println(" <NAME>Charles</NAME>");
out.println(" <CUSTOMER_ID>58704</CUSTOMER_ID> ");
out.println(" </CUSTOMER>");
out.println(" <CUSTOMER>");
out.println(" <NAME>Tom</NAME>");
out.println(" <CUSTOMER_ID>58703</CUSTOMER_ID> ");
out.println(" </CUSTOMER>");
out.println(" <CUSTOMER>");
out.println(" <NAME>John</NAME>");
out.println(" <CUSTOMER_ID>58702</CUSTOMER_ID> ");
out.println(" </CUSTOMER>");
out.println(" </CUSTOMERS> ");
}
}
下面为web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>xmldata</servlet-name>
<servlet-class> XMLData</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xmldata</servlet-name>
<url-pattern>/xmldata</url-pattern>
</servlet-mapping>
</web-app>
结论
由此我们可以看出,此替代方案与STRUTS相比有以下优点:
1 实现数据与表现相分离,设计人员和程序人员分工更明确
2 大量计算分布在客户端,减轻服务器端负荷
但注意:NETSCAPE浏览器不支持数据绑定
参考文档:
《实用J2EE设计模式》
《XML探索》
《MVC设计模式介绍》