我想谈谈我对CMS 内容管理系统开发的一些想法和经验。
目前市面上成熟的CMS产品有很多,无外乎两种解决方案:第一种就是用XSL+XML的方式来实现客户端具体数据;第二种是生成HTML或者SHTML来实现。
设计阶段的想法是,用XSL来实现文章和内容的模版,用XML来存储数据,生成静态的HTML或SHTML。到实际应用中发现了HTML转换的问题,用XSL+XML生成HTML时,XML内容中不需要进行转化的内容,使用CDATA,在XSL文件中引用部分使用disable-output-escaping="yes",生成HTML时照样将html代码进行了解析,例如<变成了<等等,我们还要对此再进行一边转码,但是还要考虑到文章内容中如果存在<的问题,岂不乱套了。当然解决方法有,例如加上自己定制的特殊标识,然后再转码,这样生成HTML就不会有问题了。
CMS的目的就是减轻服务器的负担,自然我们可以把负载加到客户端上面,如客户端浏览器解析XSL+ XML,但是考虑到有的浏览器不支持这种形式,绝大多数都是可以解析的,如Internet Explorer、Netscape、Firefox、Mozilla、Opera等。
举个例子:
XSL文件:test.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/article">
<table cellspacing="1" cellpadding="1" width="200" border="1">
<tbody>
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="click" /></td>
</tr>
<tr>
<td><xsl:value-of select="date" /></td>
<td><xsl:value-of select="author" /></td>
</tr>
<tr>
<td><xsl:value-of select="content" disable-output-escaping="yes" /></td>
<td>测试By GlandJacky</td>
</tr>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
XML文件:view.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<article>
<id>47</id>
<title>测试XML</title>
<icategoryId>11</icategoryId>
<key>测试XML</key>
<content>
<![CDATA[
<table cellspacing="1" cellpadding="1" width="200" border="1">
<tbody>
<tr>
<td>测试XML</td>
<td> </td>
</tr>
<tr>
<td>测试XML</td>
<td> </td>
</tr>
<tr>
<td>测试XML</td>
<td> </td>
</tr>
</tbody>
</table>
]]>
</content>
<author>GlandJacky</author>
<date>2006-06-20 11:38:50.823</date>
<updateBy>have not update user</updateBy>
<updateTime>have not update time</updateTime>
<click>0</click>
<fileUrl>/star/boke/1150774719245/1150774719245.htm</fileUrl>
<imageUrl>/star/boke/1150774719245/images/测试2</imageUrl>
</article>
如果浏览器支持的话,可以直接在浏览器输入xml文件的地址,看到浏览器解析过的html文件了~
上篇讲到了XSL和XML如何在客户端浏览。也是CMS内容管理系统内容发布的一种形式,即XSL(模版)+XML(内容)。
但是现实情况是由客户端浏览器不支持,这样做还会给服务器造成一定的负载,能够减轻服务器服务负载的最好方法就是完全实现静态页面的内容访问机制,当然这样就需要再次将XSL和XML生成HTML或者SHTML。
呵呵,这就是所说的CMS内容管理系统内容发布的第二种形式HTML或者SHTML。
在Java中有很多方式来实现,首先是先产生XSL文件,即模版文件。
当然我们首先要统一编码,所有的文件编码都为“UTF-8”,符合全球化标准。即产生的文件编码格式为“UTF-8”,数据库编码格式为“UTF-8”,自动生成的XSL文件、XML文件、HTML文件、SHTML文件的格式都必须为“UTF-8”,当然还包括文件内部的声明也都必须为“UTF-8”,当然请不要搞混了文件编码格式和文件内部声明,我觉得初学者最容易搞混。文件编码格式就是文件的属性,文件本身是用什么编码格式生成的,而文件内部声明指的是文件内容中也需要制定编码。
目的当然很简单且明确,防止出现大家头疼的乱码~
下面接着谈谈CMS内容管理系统的两种方案:XSL+XML和HTML (一)的例子,说明XSL模版文件的Java实现。
XSL文件:test.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/article">
<table cellspacing="1" cellpadding="1" width="200" border="1">
<tbody>
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="click" /></td>
</tr>
<tr>
<td><xsl:value-of select="date" /></td>
<td><xsl:value-of select="author" /></td>
</tr>
<tr>
<td><xsl:value-of select="content" disable-output-escaping="yes" /></td>
<td>测试By GlandJacky</td>
</tr>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
首先必须先取得要转化为XSL代码的字符串String xslContent
使用dom4j来实现XSL
//XSL代码的头
String XSL_HEAD = "<?xml version=/"1.0/" encoding=/"UTF-8/"?><!DOCTYPE root [<!ENTITY nbsp /" /">]><xsl:stylesheet xmlns:xsl=/"http://www.w3.org/1999/XSL/Transform/" version=/"1.0/"><xsl:output method=/"html/" /><xsl:template match=/"/root/">";
//XSL代码的尾
String XSL_END = "</xsl:template></xsl:stylesheet>";
//添加模版文件的中HTML代码
if (xslContent.substring(0,6).toUpperCase().equals("<HTML>")){
xslContent = XSL_HEAD + xslContent + XSL_END;
}else{
xslContent = XSL_HEAD +"<HTML><meta content=/"text/html;charset=utf-8/" http-equiv=/"content-type/" />"+ xslContent+ "</HTML>" + XSL_END;
}
// 创建document import org.dom4j.DocumentHelper; import org.dom4j.Document;
Document document = DocumentHelper.parseText(xslContent);
补充创建完document之后
需要三个参数
创建好的Document document
要创建XSL文件的地址String path
创建文件的编码格式String charsetName
document.setXMLEncoding(charsetName);
FileOutputStream fos = new FileOutputStream(path);
OutputStreamWriter osw = new OutputStreamWriter(fos, charsetName);
document.write(osw);
osw.close();
fos.close();
这样XSL文件就创建好了。