问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简要说明超文本系统的体系结构

发布网友 发布时间:2022-04-22 06:36

我来回答

2个回答

懂视网 时间:2022-05-06 17:35

DB系统预警联系人API 在我们维护系统时,需要把系统的报警信息即时传递给相应同学,如果把联系方式直接写到脚本里,对以后的维护变更将埋下祸根,尤其是成百上千的系统。 为此这里写了个获取联系人信息的API 数据库配置中心表: CREATE TABLE `db_alertconta

DB系统预警联系人API

在我们维护系统时,需要把系统的报警信息即时传递给相应同学,如果把联系方式直接写到脚本里,对以后的维护变更将埋下祸根,尤其是成百上千的系统。
为此这里写了个获取联系人信息的API

数据库配置中心表:

CREATE TABLE `db_alertcontact` (
`id` INT(11) NULL DEFAULT NULL,
`levelid` INT(11) NULL DEFAULT NULL COMMENT 'contact level',
`contact` VARCHAR(50) NULL DEFAULT NULL COMMENT 'email or phone information',
`type` VARCHAR(50) NULL DEFAULT NULL COMMENT 'phone/email',
`username` VARCHAR(100) NULL DEFAULT NULL,
`group` VARCHAR(80) NULL DEFAULT NULL COMMENT 'contact group'
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

CREATE TABLE `db_alertlevel` (
`id` INT(11) NULL DEFAULT NULL,
`levelname` VARCHAR(50) NULL DEFAULT NULL COMMENT 'info/warn/err'
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;


用法帮助:

[root@skatedb55 pytest]# python contactlist.py --help
usage: Contanct API v0.1 ,(C) Copyright Skate 2014 [-h] --group GROUP --type
TYPE --level LEVEL
[--interval INTERVAL]
[--load LOAD]

optional arguments:
-h, --help show this help message and exit
--group GROUP = The contact group
--type TYPE = The mode of contact
--level LEVEL = alarm level,info/warn/err
--interval INTERVAL = Database query interval(s)
--load LOAD = The configure center database,eg:
load=user/pass@ip:port:dbname
[root@skatedb55 pytest]#

例子:

INSERT INTO `db_alertcontact` (`id`, `levelid`, `contact`, `type`, `username`, `group`) VALUES
(1, 1, 'skate1@163.com', 'email', 'skate1', 'p1'),
(2, 2, 'skate2@163.com', 'email', 'skate2', 'p2'),
(3, 1, '1300000000', 'phone', 'skate3', 'p2'),
(4, 1, '1311111111', 'phone', 'skate4', 'p2'),
(5, 1, '1322222222', 'phone', 'skate5', 'p2'),
(6, 2, 'skate6@163.com', 'email', 'skate6', 'p2');


INSERT INTO `db_alertlevel` (`id`, `levelname`) VALUES
(1, 'info'),
(2, 'warn'),
(3, 'error');


[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=phone --level=info --interval=10--load=root/root@10.20.0.55:3306:test6
1300000000,1311111111,1322222222,
[root@skatedb55 pytest]#

[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=email --level=warn --interval=10--load=root/root@10.20.0.55:3306:test6
skate2@163.com,skate6@163.com,
[root@skatedb55 pytest]#

优点:
1.在变更联系人或联系方式不需要修改代码
2.联系人的相关信息存储在配置中心数据库,为了减少对数据库的查询,默认每天查一次数据库(自己可以指定),把联系信息放在本地,既提高了速度,也减少了对配置中心的依赖
3.如果想在变更联系信息及时生效,只需把本地的临时文件"/tmp/contact_dbinfo"删除即可

contactlist.py:

# -*- coding: utf-8 -*-
#!/usr/bin/python
#
# Author:Skate
# Time:2014/12/10
# Function: Contact API

import MySQLdb,sys
import argparse
import os
import datetime

class database:
 def __int__(self,host,user,passwd,port,dbname):
  self.conn = None
  pass
 def conn(self,host,user,passwd,port,dbname):
  self.host=host
  self.user=user
  self.passwd=passwd
  self.port=port
  self.dbname=dbname
  try: 
  self.conn = MySQLdb.connect(host=self.host, user=self.user, passwd=self.passwd, db=self.dbname,port=self.port) 
 
  except MySQLdb.Error, e: 
  print "MySQL Connect Error: %s" % (e.args[1]) 
  return self.conn 
 def closeConn(self):
  self.conn.close()
 def execute(self,sql,param):
  if self.conn==None or self.conn.open==False :
  return -1
  sys.exit
  cur = self.conn.cursor()
  cur.execute(sql,param)
  self.closeConn()
  return cur

def contactlist(group,type,level,host,user,passwd,port,dbname,interval=86400):
 tfile='/tmp/contact_dbinfo'
 list=''
 if os.path.isfile(tfile):
 a1=datetime.datetime.fromtimestamp(os.path.getctime(tfile))
 a2=datetime.datetime.now()
 diffsec = (a2 - a1).seconds
 if diffsec > interval:
  os.remove(tfile) 
  f=open(tfile,'a') 
  db=database()
  db.conn(host,user,passwd,port,dbname)
  sql="select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s"
  param=(level,group,type)
  cur=db.execute(sql,param)
  results=cur.fetchall()
  for row in results:
  if row[3] =='phone':
   #for r in row:
   list = list + row[0] + ','
  elif row[3] == 'email':
   #for r in row:
   list = list + row[0] + ','
  if type =='phone':
  f.write('phonelist='+ group + ':' + list + '
')
  f.close()
  elif type == 'email':
  f.write('emaillist='+ group + ':' +list + '
')
  f.close()
 else:
  strsearch = type + 'list='+ group
  istype = os.popen('cat '+ tfile +' | grep ' + strsearch + ' | wc -l').readline().strip()
  if int(istype) > 0: 
   line = os.popen('cat '+ tfile +' | grep ' + strsearch).readline().strip()
   b=line.split('=')
   a=b[1].split(":")
   if b[0]=='phonelist':
   list=a[1]
   elif b[0]=='emaillist':
   list=a[1]
  elif int(istype) < 1:
   f=open(tfile,'a')
   db=database()
   db.conn(host,user,passwd,port,dbname)
   sql="select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s"
   param=(level,group,type)
   cur=db.execute(sql,param)
   results=cur.fetchall()
   #list=''
   for row in results:
   if row[3] =='phone':
    list = list + row[0] + ','
   elif row[3] == 'email':
    list = list + row[0] + ','
   if type =='phone':
   f.write('phonelist='+ group + ':' + list + '
')
   f.close()
   elif type == 'email':
   f.write('emaillist='+ group + ':' + list + '
')
   f.close()

 else:
  f=open(tfile,'a')
  db=database()
  db.conn(host,user,passwd,port,dbname)
  sql="select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s"
  param=(level,group,type)
  cur=db.execute(sql,param)
  results=cur.fetchall()

  for row in results:
  if row[3] =='phone':
   #for r in row:
   list = list + row[0] + ','
  elif row[3] == 'email':
   #for r in row:
   list = list + row[0] + ','

  if type =='phone':

  f.write('phonelist='+ group + ':' + list + '
')
  f.close()
  elif type == 'email':
  f.write('emaillist='+ group + ':' + list + '
')
  f.close()

 return list

if __name__ == "__main__":
 parser = argparse.ArgumentParser("Contanct API v0.1 ,(C) Copyright Skate 2014")
 parser.add_argument('--group', action='store', dest='group',required=True,
 help=" = The contact group")

 parser.add_argument('--type', action='store', dest='type',required=True,
 help=" = The mode of contact")

 parser.add_argument('--level', action='store', dest='level',required=True,
 help=" = alarm level,info/warn/err")

 parser.add_argument('--interval', action='store', dest='interval',type=int,default=86400,
 help=" = Database query interval")

 parser.add_argument('--load', action='store', dest='load',default='',
 help=" = The configure center database,eg: 
 load=user/pass@ip:port:dbname")

 results = parser.parse_args()

 load = results.load
 group = results.group
 type = results.type
 level = results.level
 interval = results.interval 

 if (load !=''):
 user_info,url = load.split("@")
 host,port,db = url.split(":")
 port=int(port)
 user,passwd = user_info.split("/",1)

 str = contactlist(group,type,level,host,user,passwd,port,db,interval)
 print str


大家有好的意见,欢迎提出


------end-------

热心网友 时间:2022-05-06 14:43

 一、超文本(hypertext)
  
  一种全局性的信息结构,它将文档中的不同部分通过关键字建立链接,使信息得以用交互方式搜索。它是超级文本的简称。
  二、超媒体(hypermedia)
  超媒体是超文本(hypertext)和多媒体在信息浏览环境下的结合。它是超级媒体的简称。用户不仅能从一个文本跳到另一个文本,而且可以激活一段声音,显示一个图形,甚至可以播放一段动画。
  Internet采用超文本和超媒体的信息组织方式,将信息的链接扩展到整个Internet上。Web就是一种超文本信息系统,Web的一个主要的概念就是超文本连接,它使得文本不再象一本书一样是固定的线性的。而是可以从一个位置跳到另外的位置。可以从中获取更多的信息。可以转到别的主题上。想要了解某一个主题的内容只要在这个主题上点一下,就可以跳转到包含这一主题的文档上。正是这种多连接性把它称为Web。
  三、超文本传输协议(HTTP)
  Hypertext Transfer Protocol超文本在互联网上的传输协议。
当你想进入万维网上一个网页, 或者其他网络资源的时候,通常你要首先在你的浏览器上键入你想访问网页的统一资源定位符(UniformResourceLocator),或者通过超链接方式链接到那个网页或网络资源。这之后的工作首先是URL的服务器名部分,被名为域名系统的分布于全球的因特网数据库解析,并根据解析结果决定进入哪一个IP地址(IP address)。
  接下来的步骤是为所要访问的网页,向在那个IP地址工作的服务器发送一个HTTP请求。在通常情况下,HTML文本、图片和构成该网页的一切其他文件很快会被逐一请求并发送回用户。
  网络浏览器接下来的工作是把HTML、CSS和其他接受到的文件所描述的内容,加上图像、链接和其他必须的资源,显示给用户。这些就构成了你所看到的“网页”。
  大多数的网页自身包含有超链接指向其他相关网页,可能还有下载、源文献、定义和其他网络资源。像这样通过超链接,把有用的相关资源组织在一起的集合,就形成了一个所谓的信息的“网”。这个网在因特网上被方便使用,就构成了最早在1990年代初蒂姆·伯纳斯-李所说的万维网。
传统的Web数据库系统体系结构  传统的Web数据库系统一般实现Web数据库系统的连接和应用可采取两种方法,一种是在Web服务器端提供中间件来连接Web服务器和数据库服务器,另一种是把应用程序下载到客户端并在客户端直接访问数据库。中间件负责管理Web服务器和数据库服务器之间的通信并提供应用程序服务,它能够直接调用外部程序或脚本代码来访问数据库,因此可以提供与数据库相关的动态HTML页面,或执行用户查询,并将查询结果格式化成HTML页面。通过Web服务器返回给Web浏览器。最基本的中间件技术有通过网关接口CGI和应用程序接口API两种。
  (一)、基于通用网关接口CGI
  CGI是WWW服务器运行时外部程序的规范,按照CGI编写的程序可以扩展服务器的功能,完成服务器本身不能完成的工作,外部程序执行时间可以生成HTML文档,并将文档返回WWW服务器。CGI应用程序能够与浏览器进行交互作用,还可以通过数据库的API与数据库服务器等外部数据源进行通信,如一个CGI程序可以从数据库服务器中获取数据,然后格式化为HTML文档后发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎使用的服务器软件都支持CGI,开发人员可以使用任何一种WWW服务器内置语言编写CGI,其中包括流行的C、C、VB和Delphi等。
  从体系结构上来看,用户通过Web浏览器输入查询信息,浏览器通过HTTP协议向Web服务器发出带有查询信息的请求,Web服务器按照CGI协议激活外部CGI程序,由该程序向DBMS发出SQL请求并将结果转化为HTML后返回给Web服务器。再由Web服务器返回给Web浏览器。这种结构体现了客户/服务器方式的三层模型,其中Web服务器和CGI程序实际起到了HTML和SQL转换的网关的作用。CGI的典型操作过程是:分析CGI数据;打开与DBMS的连接;发送SQL请求并得到结果;将结果转化为HTML;关闭DBMS的连接;将HTML结果返回给Web服务器。
  基于Web的数据库访问利用已有的信息资源和服务器。其访问频率大,尤其是热点数据。但其主要的缺点是:①客户端与后端数据库服务器通信必须通过Web服务器,且Web服务器要进行数据与HTML文档的互相转换,当多个用户同时发出请求时,必然在Web服务器形成信息和发布瓶颈。②CGI应用程序每次运行都需打开和关闭数据库连接,效率低,操作费时;③CGI应用程序不能由多个客户机请求共享,即使新请求到来时CGI程序正在运行,也会启动另一个CGI应用程序,随着并行请求的数量增加,服务器上将生成越来越多的进程。为每个请求都生成进程既费时又需要大量内存,影响了资源的使用效率,导致性能降低并增加等待时间;④由于SQL与HTML差异很大,CGI程序中的转换代码编写繁琐,维护困难;⑤安全性差,缺少用户访问控制,对数据库难以设置安全访问权限;⑥HTTP协议是无状态且没有常连接的协议,DBMS事务的提交与否无法得到验证,不能构造Web上的OLTP应用。
  (二)、基于服务器扩展的API
  为了克服CGI的局限性,出现的另一种中间件解决方案是基于服务器扩展API的结构。与CGI相比,API应用程序与Web服务器结合得更加紧密,占用的系统资源也少得多,而运行效率却大大提高,同时还提供更好的保护和安全性。
  服务器API一般作为一个DLL提供,是驻留在WWW服务器中的程序代码,其扩展WWW服务器的功能与CGI相同。WWW开发人员不仅可以API解决CGI可以解决的一切问题,而且能够进一步解决基于不同WWW应用程序的特殊请求。各种API与其相应的WWW服务器紧密结合,其初始开发目标服务器的运行性能进一步发掘、提高。用API开发的程序比用CGI开发的程序在性能上提高了很多,但开发API程序比开发CGI程序要复杂得多。API应用程序需要一些编程方面的专门知识,如多线程、进程同步、直接协议编程以及错误处理等。目前主要的WWWAPI有Microsoft公司的ISAPI、Netscape公司的NSAPI和OReily公司的WSAPI等。使用ISPAI开发的程序性能要优于用CGI开发的程序,这主要是因为ISAPI应用程序是一些与WWW服务器软件处于同一地址空间的DLL,因此所有的HTTP服务器进程能够直接利用各种资源这显然比调用不在同一地址空间的CGI程序语句要占用更少的系统时间。而NSAPI同ISAPI一样,给WWW开发人员定制了NetscapeWWW服务器基本服务的功能。开发人员利用NSAPI可以开发与WWW服务器的接口,以及与数据库服务器等外部资源的接口。
  虽然基于服务器扩展API的结构可以方便、灵活地实现各种功能,连接所有支持32位ODBC的数据库系统,但这种结构的缺陷也是明显的:①各种API之间兼容性很差,缺乏统一的标准来管理这些接口;②开发API应用程序也要比开发CGI应用复杂得多; ③这些API只能工作在专用Web服务器和操作系统上。
  (三)、基于JDBC的Web数据库技术
  Java的推出,使WWW页面有了活力和动感。Internet用户可以从WWW服务器上下载Java小程序到本地浏览器运行。这些下载的小程序就像本地程序一样,可独立地访问本地和其他服务器资源。而最初的Java语言并没有数据库访问的功能,随着应用的深入,要求Java提供数据库访问功能的呼声越来越高。为了防止出现对Java在数据库访问方面各不相同的扩展,JavaSoft公司指定了JDBC,作为Java语言的数据库访问API。
  采用JDBC技术,在JavaApplet中访问数据库的优点在于:直接访问数据库,不再需要Web数据库的介入,从而避开了CGI方法的一些局限性;用户访问控制可以由数据库服务器本地的安全机制来解决,提高了安全性;JDBC是支持基本SQL功能的一个通用低层的应用程序接口,在不同的数据库功能的层次上提供了一个统一的用户界面,为跨平台跨数据库系统进行直接的Web访问提供了方案。从而克服了API方法一些缺陷;同时,可以方便地实现与用户地交互,提供丰富的图形功能和声音、视频等多媒体信息功能。
  JDBC是用于执行SQL语句的Java应用程序接口API,由Java语言编写的类和接口组成。Java是一种面向对象、多线程与平台无关的编程语言,具有极强的可移植性、安全性和强健性。JDBC是一种规范,能为开发者提供标准的数据库访问类和接口,能够方便地向任何关系数据库发送SQL语句,同时JDBC是一个支持基本SQL功能的低层应用程序接口,但实际上也支持高层的数据库访问工具及API。所有这些工作都建立在X/Open SQL CLI基础上。JDBC的主要任务是定义一个自然的Java接口来与X/OpenCLI中定义的抽象层和概念连接。JDBC的两种主要接口分别面向应用程序的开发人员的JDBC API和面向驱动程序低层的JDBC DriverAPI。JDBC完成的工作是:建立与数据库的连接;发送SQL语句;返回数据结果给Web浏览器。
  基于JDBC的Web数据库结构其缺陷在于:只能进行简单的数据库查询等操作,还不能进行OLTP;安全性、缓冲机制和连接管理仍不完善;SUN承诺的完全跨平台跨数据库系统的功能和标准远未实现。
HTML文档制作不是很复杂,且功能强大,支持不同数据格式的文件镶入,这也是WWW盛行的原因之一,其主要特点如下:   
1 简易性,HTML版本升级采用超集方式,从而更加灵活方便。

2 可扩展性,HTML语言的广泛应用带来了加强功能,增加标识符等要求,HTML采取子类元素的方式,为系统扩展带来保证。   

3 平台无关性。虽然PC机大行其道,但使用MAC等其他机器的大有人在,HTML可以使用在广泛的平台上,这也是WWW盛行的另一个原因。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我爱我校征文800字 建行聚财宝少一万时5小时内补上会怎样 咪哩乡文化教育 咪哩乡基础设施 咪哩村云南省玉溪市元江县咪哩乡咪哩村 咪哩乡历史文化 元江咪哩中心小学怎么样? 原神 原神胡桃进阶材料是什么? 原神 原神呢胡桃材料有哪些? 原神 原神胡桃的突破材料是什么? 在南京哪里买手机好? 超文本有哪些特性 南京哪里买手机好 请问:什么是“超文本”啊?? 超文本数据的Web数据挖掘-超文本数据的知识发现 南京哪里买手机比较好? 超文本实现与研究 南京市在哪里买手机比较便宜? 在南京去哪里买手机好些啊? 什么是超文本,超媒体 南京哪里买手机最好?请提供详细地址 超文本系统的特点 超文本数据的超文本数据是怎样的一种结构 什么是超媒体,超文本和超媒体的共同点和不同点 超文本数据的超文本定义 金陵十二钗是那十二位? 超文本是一种什么结构? &quot;金陵十二钗&quot;是谁? 超文本和超媒体系统中的数据库与传统的数据库有什... 文本文档里的字删除了 还能恢复吗 南京买手机的地方 c#web输出超文本格式的数据 在南京买手机哪里好? 南京哪里买手机比较好 南京在哪里买手机比较好 超文本传送协议是什么? 在南京买手机到哪好呢? 超文本系统三个特性是什么 在南京专门卖手机的商店有哪些 超文本传输协议是什么层上的协议? 买手二手电脑在南京市 在买手店买鞋和在毒上买鞋哪个贵?买手店都是正品吗? 金华市婺城区升降车租赁公司电话? 南京中央商场有LOOWO这个牌子吗? 金华大欣机械设备租赁有限公司怎么样? 我想到南京珠江路买手机,哪些店信誉比较好 浙江省义乌市哪里有租升降机? 浙江金华出租车起步价是多少?兰溪呢? 在南京买手机 金华六和机械有限公司怎么样?