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

原创 2003年03月12日 09:19:00

鉴于国内网络公司的人数都不是很多,中型的定义就是指有一个以上的专职程序员,能够制作大多数功能的动态网站的网络公司。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这里不探讨客户关系、需求分析方面的内容,只探讨一下公司向网站及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

关于程序员的发展之路,5年了,以后的路该如何走?!

从事it行业将近5年,这五年,在工作上平平淡淡,简简单单的。最近成家了,然后为了生活吧,内心深处想真正的去改变一次,想去多学技术,多学知识,多接触人,多总结。 从刚毕业到实习,是一个阶段。从大学到实...
  • chiasing
  • chiasing
  • 2017年02月23日 13:03
  • 277

Java工程师发展之路

java高级程序员需要具备的知识如下: 1、语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任何修正。 2、 命令:必...
  • mo_fan_qing_wa
  • mo_fan_qing_wa
  • 2016年07月18日 19:11
  • 707

IOS架构师之路:我对IOS架构的点点认识(大纲)

1、今天我鼓起了勇气,想纪录自己对IOS架构学习成长的点点滴滴。 从事IOS开发也有几年的时间,从刚开始最基本的语言、界面、逻辑,再到后面复杂点的线程、数据处理、网络请求、动画,最后到最复杂的底层音视...
  • u014011807
  • u014011807
  • 2015年07月10日 14:39
  • 2280

PHPer 发展之路

1.基本语法   很无聊的东西 2.PHP+MYSQL 初步做出自己的作品,很高兴了 3.面向对象   怎么这么难,不过当你会了之后你很乐意OOP 4.设计模式   这部分很多人都觉得很...
  • u014339376
  • u014339376
  • 2014年08月22日 20:40
  • 316

java职业发展之路

有时候会特别迷茫学习一门编程语言,在每个阶段每个时候该去如何成长,此文希望与大家共勉. java程序员 高级特性   反射、泛型、注释符、自动装箱和拆箱、枚举类、可变   参数、可变...
  • qq_26431469
  • qq_26431469
  • 2016年04月01日 11:00
  • 31378

C++程序员的学习之路

C++,一个响当当的名字,自从贝尔实验室走出来之后,便成为了事实上的工业标准。即使在今天各种新技术不断涌现的年代里,作为一名专业程序员,掌握C++举足轻重。那么,我们该怎么深入的学习这一门语言呢? ...
  • zw514159799
  • zw514159799
  • 2012年10月01日 21:15
  • 974

一个JAVA程序员成长之路分享

我搞JAVA也有些日子了, 因为我比较贪玩,上进心不那么强, 总是逼不得已为了高薪跳槽才去学习, 所以也没混成什么大牛, 但好在现在也已经成家立业, 小日子过的还算滋润, 起码顶得住一月近万元的吃喝拉...
  • u013659231
  • u013659231
  • 2017年05月26日 16:18
  • 4857

编译器研究之路_未来50年

编译器研究之路_未来50年 今天,复杂而泛在的软件架构支撑着全球经济,编译器和高级语言正是这些软件的基石。强大而优雅的编译技术在硬件综合等领域同样有着“连城”的价值。毫不夸张地说,与半导...
  • junecauzhang
  • junecauzhang
  • 2013年07月23日 22:44
  • 1487

一名C++程序员的成长之路

1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。   2.初学者请不要看太多太多的书那会误人子弟的,先找本系统...
  • wo17fang
  • wo17fang
  • 2015年06月06日 10:58
  • 1046

我的旅途-嵌入式软件工程师成长之路(一)

不知不觉,从拿到毕业证到现在,已经一个多月过去了。 目前的状况,搞IT的生活真是苦逼,工作几个月来,我都光荣的成为了月光一族,尤其是像我这种刚入门的菜鸟来说,要在深圳这个地方有模有样的活着,每天除了...
  • wenshifang
  • wenshifang
  • 2015年08月06日 14:19
  • 1492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大中型网络公司的一条发展之路
举报原因:
原因补充:

(最多只允许输入30个字)