分享
 
 
 

大中型网络公司的一条发展之路

王朝asp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

这里不探讨客户关系、需求分析方面的内容,只探讨一下公司向网站及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://www.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=# onclick=""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='' onclick=\"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='' onclick=\"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='' onclick=\"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='' onclick=\"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>

我的E-mail:crazyasp@etang.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有