鉴于国内网络公司的人数都不是很多,中型的定义就是指有一个以上的专职程序员,能够制作大多数功能的动态网站的网络公司。

这里不探讨客户关系、需求分析方面的内容,只探讨一下公司向网站及B/S应用软件方向发展的战略构架及简单的技术实现。

现在制作动态网站的技术已经很成熟了,很多小公司甚至个人都可以完成很多功能强大的动态网站。但大多数的网站构架还是沿用以前静态网站的构架,制作一个新的网站基本上是从头做起,而且都是孤立的,和其他网站的联系少之又少,基本上是友情联接的方式,没有数据共享,也没有交互式操作。所以,我构思了如下的网站构架,这样可以达到最大的数据共享,而且可以模块化开发,降低开发成本,提高开发效率。同时也提高了网站作为信息平台的功能。这就是:以主数据库为基础,以主站为核心,基于Web Service思想的网络构架。总体来说,公司技术构架的发展方向是,所有公用数据(如地区信息、行业分类)都存放在基础数据库,对外提供xml格式的数据调用,其他网站调用数据后可以用xslt转换后使用。由此保证了数据的统一性,又可以提供多样化的表现形式。一举多得。

进一步来说,BBS、信息发布系统都可以使用多用户版的,这样网站的各项功能基本都可以通过后台管理系统实现,制作一个网站只要设计它的页面风格就可以了。而且,制作公司可以把客户的一些需求统一起来,提供更好的服务,比如说各个公司都有招聘的内容,制作公司如果有自己的招聘网站或者于招聘网站有良好的合作关系,就可以在客户的网站后台管理里面集成招聘系统,这样客户方便了,发招聘信息的积极性也提高了,双方都得益。

下面就进一步从技术角度来阐述一下实现方法:

一、        xml数据的发布  这个构架的基础就是发布xml数据,以SQL server2000来说,可以有两种发布方式,一是数据库自己的xml发布,可以把数据库内的内容直接发布成xml文档,这样生成的数据更新比较及时,一般不会出错,但对数据的控制不是很自由,不方便查询;二是用asp等服务器端编程语言生成xml文档,这样比较自由,但要保证数据库更新的时候能够及时更新。下面详细介绍一下用asp来生成xml文档:例如生成下面的文档

<?xml version="1.0" encoding="gb2312" ?> 
  <catalogs> 
  
  <fatherid id="100" name="整机"> 
  
    <catalog id="102" name="笔记本" /> 
  
  </fatherid> 
  
  <fatherid id="300" name="外设"> 
  
    <catalog id="302" name="数码相机" /> 
  
    <catalog id="304" name="激光打印机" /> 
  
    <catalog id="305" name="喷墨打印机" /> 
  
    <catalog id="306" name="针式打印机" /> 
  
    <catalog id="309" name="投影设备" /> 
  
    <catalog id="311" name="扫描仪" /> 
  
  </fatherid> 
  
  <fatherid id="600" name="办公设备"> 
  
    <catalog id="601" name="传真机" /> 
  
    <catalog id="602" name="复印机" /> 
  
  </fatherid> 
  
</catalogs>
    首先要建立数据库连接,按指定的sql语句生成一个recordset,这里就可以通过传递的参数定制生成的内容。
    Dim xmlstr
    xmlstr = "<?xml version=""1.0"" encoding=""gb2312" "?>"
    xmlstr = xmlstr & "<catalogs>"
    调用遍历recordset的循环……
    xmlstr = xmlstr & "<fathered id="" & rs("id") & """ name="" & rs("name") &""/>"
         ……
    xmlstr = xmlstr & "</catalogs>"


注意在输出xml之前最好加上:
Response.ContentType = “text/xml”
Response.Encoding = “gb2312”  ‘这里按要求改,最常用的是UTF-8
最后可以储存成文件,也可以直接用连接提供:
Response.write(xmlstr)

二、        客户端的xslt转换  这里没什么可说的,如果不用xslt也可以用脚本直接解析xml文档来实现,但就没办法随意的定义样式了,所以还是按照内容和样式分类的布局,使用xml来实现,详细资料请参考xslt的教程,下面提供一个例子:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://ww

w.w3.org/1999/XSL/Format"> 
  
<xsl:output encoding="gb2312" method="html"/> 
  
      <xsl:template match="/catalogs" > 
  
           <xsl:element name="table"> 
  
                 <xsl:element name="tr"> 
  
                      <xsl:element name="td"> 
  
                        <xsl:apply-templates select="fatherid"/> 
  
                      </xsl:element> 
  
                 </xsl:element> 
  
           </xsl:element> 
  
      </xsl:template> 
  
      <xsl:template match="fatherid"> 
  
          <table> 
  
            <tr> 
  
              <td> 
  
                  <div style="cursor:hand"> 
  
                    <xsl:value-of select="@name"/> 
  
                  </div> 
  
                  <div style="cursor:hand;display:yes;"> 
  
                    <xsl:attribute name="id"> 
  
                      <xsl:text>layerlist</xsl:text> 
  
                      <xsl:value-of select="@id"></xsl:value-of> 
  
                    </xsl:attribute> 
  
                    <xsl:apply-templates select="catalog"></xsl:apply-templates> 
  
                  </div> 
  
              </td> 
  
            </tr> 
  
          </table> 
  
      </xsl:template> 
  
      <xsl:template match="catalog"> 
  
          <a> 
  
          <xsl:attribute name="href"> 
  
          list.asp?catalogid=<xsl:value-of select="@id"> 
  
          </xsl:value-of> 
  
          </xsl:attribute> 
  
             <xsl:value-of select="@name"></xsl:value-of> 
  
          </a> 
  
        <br></br> 
  
      </xsl:template> 
  
</xsl:stylesheet>

三、        客户端的调用  这一步是比较麻烦的,也是难点。总体来说,用户调用的时候一般会有三种方式:一是使用服务器端的脚本,如asp;一是使用客户端脚本,如Javascript;另一种是使用Flash等技术。这里我们只介绍前面的两种,说是两种,其实都是调用xml解析器来工作,原理是一样的,代码如下:
ASP:<%

Function classList(userid) 
  
'显示公司所有的产品类别 
  
Set xmldoc = Server.CreateObject("msxml2.DOMDocument") 
  
xmldoc.async = false 
  
xmldoc.resolveExternals = false 
  
  If xmldoc.load("http://www.***.com/webservice/catalog.asp?userid="&userid) 
  
 Then 
  
    Set xSldoc = Server.CreateObject("msxml2.DOMDocument") 
  
    xSldoc.async = false 
  
    xSldoc.resolveExternals = false 
  
    xsldoc.load(Server.mappath("catalog.xsl")) 
  
    response.write(xmldoc.transformNode(xsldoc)) 
  
  Else 
  
    response.write("网络服务调用失败,请<a href=# οnclick=""javascript:location.reload();"">重试</a>") 
  
  End If 
  
End Function 
  
Function productList(userid,catalogid) 
  
'显示当前公司当前类下面的产品列表 
  
Set xmldoc = Server.CreateObject("msxml2.DOMDocument") 
  
xmldoc.async = false 
  
xmldoc.resolveExternals = false 
  
xmldoc.load("http://www.***.com/webservice/productlist.asp?userid="&userid&"&catalogid="&catalogid) 
  
Set xSldoc=Server.CreateObject("msxml2.DOMDocument") 
  
xSldoc.async = false 
  
xSldoc.resolveExternals = false 
  
xSldoc.load(Server.mappath("productlist.xsl")) 
  
response.write(xmldoc.transformNode(xsldoc.documentElement)) 
  
End Function 
  
function productSearch(userid,search_key) 
  
'显示当前公司当前类下面的产品列表 
  
Set xmldoc=Server.CreateObject("msxml2.DOMDocument") 
  
xmldoc.async = false 
  
xmldoc.resolveExternals = false 
  
xmldoc.load("http://www.***.com/webservice/productlist.asp?userid="&userid&"&search_key="&search_key) 
  
Set xSldoc=Server.CreateObject("msxml2.DOMDocument") 
  
xSldoc.async = false 
  
xSldoc.resolveExternals = false 
  
xSldoc.load(Server.mappath("productlist.xsl")) 
  
response.write(xmldoc.transformNode(xsldoc.documentElement)) 
  
End Function 
  
Function productDetail(userid,productid,priceid) 
  
'显示当前公司当前产品的详细信息 
  
Set xmldoc = Server.CreateObject("msxml2.DOMDocument") 
  
xmldoc.async = false 
  
xmldoc.resolveExternals = false 
  
xmldoc.load("http://www.***.com/webservice/productdetail.asp?userid="&usreid&"&catalogid="&catalogid&"&productid="&productid&"&priceid="&priceid) 
  
Set xSldoc = Server.CreateObject("msxml2.DOMDocument") 
  
xSldoc.async = false 
  
xSldoc.resolveExternals = false 
  
xSldoc.load(Server.mappath("productdetail.xsl")) 
  
response.write(xmldoc.transformNode(xsldoc.documentElement)) 
  
End Function 
  
%>
调用方式如下:
<!--#include file="func.asp"-->
<%=classList("userid")%> 
  <hr> 
  
<%=productList("userid",304)%> 
  
<hr> 
  
<%=productDetail("userid",13494,20121)%>



Javascript版本:function QueryString(sName) 
  { 
  
      var sSource = String(window.document.location); 
  
      var sReturn = ""; 
  
      var sQUS = "?"; 
  
      var sAMP = "&"; 
  
      var sEQ = "="; 
  
      var iPos; 
  
 
  
      
  
      iPos = sSource.indexOf(sQUS); 
  
 
  
      
  
      var strQuery = sSource.substr(iPos, sSource.length - iPos); 
  
      var strLCQuery = strQuery.toLowerCase(); 
  
      var strLCName = sName.toLowerCase(); 
  
 
  
      
  
      iPos = strLCQuery.indexOf(sQUS + strLCName + sEQ); 
  
      if (iPos == -1) 
  
      { 
  
           iPos = strLCQuery.indexOf(sAMP + strLCName + sEQ); 
  
           if (iPos == -1) 
  
           return ""; 
  
      } 
  
 
  
      
  
      sReturn = strQuery.substr(iPos + sName.length + 2,strQuery.length-(iPos + sName.length + 2)); 
  
      var iPosAMP = sReturn.indexOf(sAMP); 
  
 
  
      
  
      if (iPosAMP == -1) 
  
           return sReturn; 
  
      else 
  
      { 
  
           sReturn = sReturn.substr(0, iPosAMP); 
  
      } 
  
 
  
      
  
      return sReturn; 
  
} 
  
 
  
      
  
//调用显示的函数 
  
function classList(userid){ 
  
//显示公司所有的产品类别 
  
var err_str="网络服务调用失败,请<a href='' οnclick=/"javascript:location.reload();/">重试</a>。"; 
  
var xmldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xmldoc.async = false; 
  
xmldoc.resolveExternals = false; 
  
xmlfilename="http://www.***.com/webservice/catalog.asp?userid="+userid; 
  
xmldoc.load(xmlfilename); 
  
if (xmldoc.load(xmlfilename)) 
  
{ 
  
if (xmldoc.documentElement.childNodes.length>0) 
  
{ 
  
var xsldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xsldoc.async = false; 
  
xsldoc.resolveExternals = false; 
  
xsldoc.load("catalog.xsl"); 
  
  document.write(xmldoc.transformNode(xsldoc.documentElement)); 
  
 }else{ 
  
   return err_str&"子节点数为零。"; 
  
 } 
  
}else{ 
  
  return err_str; 
  
} 
  
} 
  
function productList(userid,catalogid){ 
  
var err_str="网络服务调用失败,请<a href='' οnclick=/"javascript:location.reload();/">重试</a>。"; 
  
//显示当前公司当前类下面的产品列表 
  
var xmldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xmldoc.async = false; 
  
xmldoc.resolveExternals = false; 
  
xmlfilename="http://www.***.com/webservice/productlist.asp?userid="+userid+"&catalogid="+catalogid; 
  
xmldoc.load(); 
  
if (xmldoc.load(xmlfilename)) 
  
{ 
  
if (xmldoc.documentElement.childNodes.length>0) 
  
{ 
  
var xsldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xSldoc.async = false; 
  
xSldoc.resolveExternals = false; 
  
xSldoc.load("productlist.xsl"); 
  
  return xmldoc.transformNode(xsldoc.documentElement); 
  
 }else{ 
  
   return err_str&"子节点数为零。"; 
  
 } 
  
}else{ 
  
  return err_str; 
  
} 
  
} 
  
function productSearch(userid,search_key){ 
  
var err_str="网络服务调用失败,请<a href='' οnclick=/"javascript:location.reload();/">重试</a>。"; 
  
//显示当前公司当前类下面的产品列表 
  
var xmldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xmldoc.async = false; 
  
xmldoc.resolveExternals = false; 
  
xmlfilename="http://www.***.com/webservice/productlist.asp?userid="+userid+"&search_key="+search_key 
  
xmldoc.load(xmlfilename); 
  
if (xmldoc.load(xmlfilename)) 
  
{ 
  
if (xmldoc.documentElement.childNodes.length>0) 
  
{ 
  
var xsldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xSldoc.async = false; 
  
xSldoc.resolveExternals = false; 
  
xSldoc.load("productlist.xsl"); 
  
  return xmldoc.transformNode(xsldoc.documentElement); 
  
 }else{ 
  
   return err_str&"子节点数为零。"; 
  
 } 
  
}else{ 
  
  return err_str; 
  
} 
  
} 
  
function productDetail(userid,productid,priceid){ 
  
var err_str="网络服务调用失败,请<a href='' οnclick=/"javascript:location.reload();/">重试</a>。"; 
  
//显示当前公司当前产品的详细信息 
  
var xmldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xmldoc.async = false; 
  
xmldoc.resolveExternals = false; 
  
xmlfilename="http://www.***.com/webservice/productdetail.asp?userid="+usreid+"&catalogid="+catalogid+"&productid="+productid+"&priceid="+priceid 
  
xmldoc.load(xmlfilename); 
  
if (xmldoc.load(xmlfilename)) 
  
{ 
  
if (xmldoc.documentElement.childNodes.length>0) 
  
{ 
  
var xsldoc=new ActiveXObject("msxml2.DOMDocument"); 
  
xSldoc.async = false; 
  
xSldoc.resolveExternals = false; 
  
xSldoc.load("productdetail.xsl"); 
  
  return xmldoc.transformNode(xsldoc.documentElement); 
  
 }else{ 
  
   return err_str&"子节点数为零。"; 
  
 } 
  
}else{ 
  
  return err_str; 
  
} 
  
}


调用方式:
<script language="Javascript" src="func.js"></script>
<script language="Javascript"> 
  var userid; 
  
userid=QueryString("userid"); 
  
//alert(userid); 
  
if(userid != null){ 
  
classList(userid); 
  
}</script>