D盘

workspace
posts - 165, comments - 53, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理


http://www.bitscn.com/oracle/exploiture/200604/19727.html

一般来说,Oracle Database与Oracle Instance一一对应,一个Oracle Database对应一个Oracle Instance。
但在Oracle的并行环境(OPS , RAC)中,一个Oracle Database可对应多个Oracle Instance。
  
我们通常所说的一个可以访问的数据库实际上有三部分组成:
1.Oracle Software:一般存在本机硬盘上。由oracle的软件程序构成。
2.Oracle Instance:启动数据库后存在,关闭数据库后消失。是oracle使用的内存结构与后台进程的集合。
3.Oracle Database:存在本机硬盘上,或存储设备上。由oracle数据文件构成。


OPS(Oracle Parallel Server)可以让位于不同系统的多个实例同时访问同一个数据库。
 

一:什么是OPS

OPS(Oracle Parallel Server)可以让位于不同系统的多个实例同时访问同一个数据库。并行服务器可以有效地提高系统的可用性和对多系统的访问性能,但是,如果你的数据没有做很好的分割,性能可能还会下降。

安装OPS时,多个实例mount同一数据库文件,实例间的通讯由分布式锁管理器(DLM)来管理。需要注意的是分布式锁管理器与你所使用的硬件和操作系统有着密切的关系。为了确定多个企图同时修改同一数据的实例,Oracle使用了十个后台进程:LCK0-LCK9,来锁定某一实例所使用的资源。

OPS主要用于UNIX/LINUX集群环境中。

二:OPS的优点

1:高可用性

2:加快事务响应时间 - 可用于决策支持系统

3:增大交易连接数 - 可用于联机事务处理系统

三:所有的应用都是适合OPS吗?

可以根据功能或数据进行分割的应用最适合OPS。那些有"热数据"(经常被多实例同时访问的数据)的应用并不适合使用OPS。

四:OPS需要特殊的硬件吗?

OPS要求服务器之间互连并共享磁盘子系统。所有可以做成集群的系统都可以,常用的有UNIX/LINUX和NT等。

五:如何设置OPS?

1.关闭数据库

2.启用OPS选项,在UNIX中通过重新连接Oracle软件的方式来完成。

3.使Oracle软件在所有节点上都有效,可以通过复制软件到其他节点或共享磁盘的方式来完成。

4.个实例要有自己的Redo log file,所以要增加必要的log文件:

ALTER DATABASE ADD LOGFILE THREAD 2
            GROUP G4 ('RAW_FILE1') SIZE 500k,
            GROUP G5 ('RAW_FILE2') SIZE 500k,
            GROUP G6 ('RAW_FILE3') SIZE 500k;

ALTER DATABASE ENABLE PUBLIC THREAD 2;

5.每个实例要有自己的回滚段,所以要增加必要的回滚段:

CREATE ROLLBACK SEGMENT RB2 TABLESPACE RBS;

6.辑初始化参数文件initSID.ora文件,添加如下几项:

PARALLEL_SERVER = TRUE
            INSTANCE_NUMBER = 1
            THREAD = 1
            ROLLBACK_SEGMENTS = (r01, r02, r03, r04)

7.创建OPS所需的数据字典,即运行CATPARR.SQL。

8.在所有的节点上启动实例。  

六:如何确定一个数据库是运行在并行状态?

show parameter parallel_server

七:如何跟踪活动的实例?

SELECT * FROM SYS.V_ $ACTIVE_INSTANCES;
            SELECT * FROM SYS.V_ $THREAD;


RAC (real application clusters 真正应用集群) 是Oracle9i数据库中采用的一项新技术,也是Oracle数据库支持网格计算环境的核心技术。


 RAC (real application clusters 真正应用集群) 是Oracle9i数据库中采用的一项新技术,也是Oracle数据库支持网格计算环境的核心技术。它的出现解决了传统数据库应用中面临的一个重要问题:高性能、高可伸缩性与低价格之间的矛盾!
  Oracle Real Application Clusters (RAC)可以支持24 x 7 有效的数据库应用 系统,您可以在由低成本的服务器构成的高可用性系统上自由部署您的应用,而无需修改您的应用程序。已经有超过4200个用户从中受益。现在Oracle在10g RAC中更提供免费的集群软件和存储管理软件,为您降低应用成本。拥有RAC您无需再为成本而牺牲性能和 可靠性。
  关键特性
  高可用性
  Oracle Real Application Clusters 提供一个高性能低成本的应用平台,支持所有类型的应用系统,无论是事务处理型应用还是分析型应用。所有应用共享同样的服务器和存储资源。出现任何的服务器或磁盘故障,系统会自动重新接管发生故障的功能。这些对前端用户的完全透明的。同样,如果您需要增加服务器或改变其他组件的配置也不会影响到应用系统。
  高性能
  Oracle Real Application Clusters保持着TPC-C的记录,达到每分钟 118万个事务的处理能力,和仅仅 $5.52 每tpmC的成本。在3,000 GB的 TPC-H数据仓库Benchmark 测试中, Oracle RAC同样保持性价比的领先地位,保证我们的用户能够达到更好更快的 ROI。这仅仅是Oracle 保持的多项Benchmark 记录中的最 近的一些指标。
  按需扩充
  您现有的系统可能是基于当前的工作负载而构建的,当 应用规模需要扩充时(支持更多的数据、用户或应用),您就需要扩展您的系统以保证系统的性能。当您的应用是构建于大型的SMP主机时,您可能需要购买另一 台昂贵的主机,但可能只能使用到其处理能力的很小一部分。但是如果您使用Oracle RAC的话,您可以通过增加一台或多台低成本的服务器来扩充您的应用系统的处理能力,满足应用需 求。
  第三方应用支持
  Oracle RAC数据库服务器象一个单一镜像的数据库服务 器,所有的应用无需任何改动都可以直接部署 (例如Oracle EBS, SAP, Siebel, 您自己的应用), 同时可以提高应用性能和可靠性。 Oracle和SAP的应用在RAC上完成了一系列的benchmarks性能测试,获 得了非常优异的测试结果, 象ABB 和Colgate一些大客户都是在Oracle RAC上运行他们的 SAP 应用软件。
  技术应答
  我听说RAC无法证明其在超过4个处理器的集群上的伸缩性 – 您有什么证据来证明RAC 的高可用性、高伸缩性和高可靠性?
  标准的benchmark 性能测试表 明 SAP 运 行于RAC上可以达到80%的伸缩性。一个明显的例证是最近在HP上所作的标准 TPC-C测试。第一个测试是Oracle运行于有64个Intel Itanium2® CPU 的HP SuperDome SMP巨型服务器。第二个测试是16个节点的集群系统,每个节点是4个CPU的SMP服务器。测试结果表明RAC环境性能超过SuperDome 18% ,这两个测试使用了完全同样的 Itanium2® CPU,处理器总数都是64。所以在同样的CPU处理能力下,RAC具有更好的伸缩性。
  当您再进一步考察这两种方案的成本时,您会发现RAC的成本更低。HP SuperDome 将近800万美元,而同样的集群系统的成本仅仅不到300万美元, 其成本只是大型机的1/3。
  为什么说Oracle Real Application Clusters 10g 要远远超过它的竞争对手?
  最基本的不同是,Oracle Real Application Clusters 10g 中所有服务器都可以直接访问数据库中的所有数据,其他的数据库在开放系统中都做不到这点, 正是由于这个原因,您可以非常方便地根据需求随时增加服务器来扩充您的系统,无需重新分布数据和应用。Real Application Clusters象一个单一的系统一样工作,任何节点的故障都不会影响其他节点对数据的访问。所以说增加服 务器就增加了系统的可靠性。另外一点,对用户来说RAC是一个数据库系统,对它的维护管理如同单机一样简单方便。
  Microsoft SQL Server和IBM DB2都有active-active 的故障切换方式,为什么我要采用Oracle Real Application Cluster 10g ?
  其他的数据库系统都无法 真正的支持 active-active方式的集群系统,即集群的两个节点可以支持同样的应用。实际上,他们只能支持双向的active-passive 架 构,即节点 A 运行应用A,同时节点B 运行应用B,每个节点作为另一个节点的备份节点。但是同样的应用无法同时运行在两个不同的节点。在Oracle Real Application Cluster 10g 中,同样的应用可以运行在两个或更多的节点,每一个节点都可作为所有其它节点的备份机。当 出现单点故障时,整个Real Application Clusters数据库系统的效率只会有很小的降低。
  我的分布式应用 系统运行非常好,为什么我要把我的数据库进行集中?
  如果您的应用系统正运行 于Oracle上,他们当然可以支持您的业务需求。但是集群的数据库可以让您管理更少的数据库,意味着更 少的管理成本。同时如果您把数据集中到Oracle Real Application Cluster 10g 上,您可以提高整个系 统的可用性,达到99.99%甚至更高。
  我们已经有了集 群硬件环境,并且可以进行应用的切换,为什么我还需要Oracle Real Application Clusters 10g?
  当您在集群环境下运行您 的应用,如果不采用Oracle Real Application Clusters 10g 的话,您的应用是运行于单例程状态下。虽然您的服务 器是集群的一部分,但实际上相当于只运行在一台单机上。在硬件集群环境下,如HP ServiceGuard、 Sun Cluster 和 Microsoft Cluster Services, 您可以在集群的任何一个 节点重新启动 Oracle数据库 (因为硬盘可以共享). 这就是我们所说的 ‘cold failover’。’Cold failover’ 切 换速度依赖于相关硬件资源的切换速度,这可能需要5到 25 分钟的时间恢复。如果使用Oracle Real Application Clusters 10g, 在服务器发生故障时,其他存活的服务器可以自动快速的恢复故障服务器的例程。Oracle Real Application Clusters 10g 可以提供业界最快的系统恢复,在60秒内可以对系统故障进行恢复,这至少比硬件的 ‘cold failover’方 案快5倍。
  我们使用Data Guard来实现故障切 换,为什么我还需要Oracle Real Application Clusters 10g?
  使用Data Guard来保护您的数 据是一个正确的选择 - Data Guard可以在各种故障情况(无论是数据坏块还是人为失误)下保护您的数据,Data Guard 也确实提供故障切换的功能,但是切换时间可能会需 要10分 钟,RAC可 以提供低于60秒的切换。同时RAC还可以提供无限的伸缩性,Data Guard 只能提供有限的伸缩性。RAC和Data Guard提供100% 技术来最大程度地保护 您的数据库应用。
  为什么选择Linux? 为什么选择Linux 环境下的Oracle Real Application Clusters 10g?
  采用SMP UNIX服务器的原因是他 们在过去可以为您的业务系统提供高可用性和伸缩性。在今天对成本非常敏感的环境下,我们需要一种低成本的可以提供高可用性和高质量的系统。通过把您的应用 系统迁移到Linux环境下的Oracle Real Application Clusters 10g ,您可以得到比SMP服务器更好的可用性,同时可以方便地扩充您的系统,最关键的是总体拥有成本可以控制的很 低。使用小型 Intel 服务器构建集群成本远远低于大型的SMP 服务器,同时可以拥有无限的伸缩性。
  Oracle Real Application Clusters只是Oracle Parallel Server的新的版本, 是吗?
  Real Application Clusters是一个全新的产品,10g 是它的第二个版本。在RAC中,我们有多项新的专利技术,专注于如何为应用系统创建一个高可用性、高伸缩性和高效的集 群系统,而无需修改现有的应用系统。同时,我们在RAC的易管理性上作了大量工作。 RAC系统架构把所有复杂的内部结构都封装起来,对开发人员和用 户完全透明。
  您认为Oracle RAC的典型硬件配 置是什么样的?
  首先我们知道 RAC选件支持所有的Oracle数据库支持的平台,如: Windows, Linux, Solaris, HP-UX等等。所以无论您选择什么样的系统,RAC都可以非常好的运行。如果是 系统选型,那要取决于您的应用需求。我们可以看到Windows 和Linux平台都是常用的基于Intel架构的平台,RAC 在这些平台都有很好的表现,这意味着您可以以低成本得到更高的可用性、可靠性和伸缩性。同 时,RAC可 以在任何价位上获得良好的性能,您可以在HP SuperDomes、Sun boxes或Linux/Windows Intel 服务器上非常方便地配置RAC。

posted @ 2008-10-08 13:48 巴西木 阅读(385) | 评论 (0)编辑 收藏

sp_addlogin
 创建新的 Microsoft? SQL Server? 登录,

 语法:
 sp_addlogin [ @loginame = ] 'login'
     [ , [ @passwd = ] 'password' ]
     [ , [ @defdb = ] 'database' ]
     [ , [ @deflanguage = ] 'language' ]
     [ , [ @sid = ] sid ]
     [ , [ @encryptopt = ] 'encryption_option' ]


sp_adduser
 为当前数据库中的新用户添加安全帐户。包括此过程是为了向后兼容。请使用 sp_grantdbaccess。

 语法:
 sp_adduser [ @loginame = ] 'login'
     [ , [ @name_in_db = ] 'user' ]
     [ , [ @grpname = ] 'group' ]


sp_addrolemember
 将安全帐户作为当前数据库中现有 Microsoft? SQL Server? 数据库角色的成员进行添加。

 语法:
 sp_addrolemember [ @rolename = ] 'role' ,
     [ @membername = ] 'security_account'


sp_droprolemember
 从当前数据库中的 Microsoft? SQL Server? 角色中删除安全帐户。
 语法:
  sp_droprolemember [ @rolename = ] 'role' ,
      [ @membername = ] 'security_account'


sp_dropuser
 从当前数据库中删除 Microsoft? SQL Server? 用户或 Microsoft Windows NT? 用户。提供 sp_dropuser 是为了向后兼容。使用 sp_revokedbaccess 删除用户。

 语法:
  sp_dropuser [ @name_in_db = ] 'user'


sp_droplogin
 删除 Microsoft? SQL Server? 登录,以阻止使用该登录名访问 SQL Server。

 语法:
  sp_droplogin [ @loginame = ] 'login'


sp_password
 添加或更改 Microsoft? SQL Server? 登录的密码。

 语法:
  sp_password [ [ @old = ] 'old_password' , ]
      { [ @new =] 'new_password' }
      [ , [ @loginame = ] 'login' ]


sp_defaultdb
 更改登录的默认数据库。

 语法:
  sp_defaultdb [ @loginame = ] 'login' ,
      [ @defdb = ] 'database'


sp_grantdbaccess
 为 Microsoft? SQL Server? 登录或 Microsoft Windows NT? 用户或组在当前数据库中添加一个安全帐户,并使其能够被授予在数据库中执行活动的权限:。

 语法:
  sp_grantdbaccess [@loginame =] 'login'
      [,[@name_in_db =] 'name_in_db' [OUTPUT]]


sp_revokedbaccess
 从当前数据库中删除安全帐户。

 语法:
  sp_revokedbaccess [ @name_in_db = ] 'name'

 

 


*******************************************************************************
sp_addlogin
 创建新的 Microsoft? SQL Server? 登录,使用户得以连接使用 SQL Server 身份验证的 SQL Server 实例。

 语法:
  sp_addlogin [ @loginame = ] 'login'
      [ , [ @passwd = ] 'password' ]
      [ , [ @defdb = ] 'database' ]
      [ , [ @deflanguage = ] 'language' ]
      [ , [ @sid = ] sid ]
      [ , [ @encryptopt = ] 'encryption_option' ]

 参数:
  [@loginame =] 'login'
   登录的名称。login 的数据类型为 sysname,没有默认设置。

  [@passwd =] 'password'
   登录密码。password 的数据类型为 sysname,默认设置为 NULL。sp_addlogin 执行后,password 被加密并存储在系统表中。

  [@defdb =] 'database'
   登录的默认数据库(登录后登录所连接到的数据库)。database 的数据类型为 sysname,默认设置为 master。

  [@deflanguage =] 'language'
   用户登录到 SQL Server 时系统指派的默认语言。language 的数据类型为 sysname,默认设置为 NULL。如果没有指定 language,那么 language 被设置为服务器当前的默认语言(由 sp_configure 配置变量 default language 定义)。更改服务器的默认语言不会更改现有登录的默认语言。language 保持与添加登录时所使用的默认语言相同。

  [@sid =] sid
   安全标识号 (SID)。sid 的数据类型为 varbinary(16),默认设置为 NULL。如果 sid 为 NULL,则系统为新登录生成 SID。尽管使用 varbinary 数据类型,非 NULL 的值也必须正好为 16 个字节长度,且不能事先存在。SID 很有用,例如,如果要编写 SQL Server 登录脚本,或要将 SQL Server 登录从一台服务器移动到另一台,并且希望登录在服务器间具有相同的 SID 时。

  [@encryptopt =] 'encryption_option'
   指定当密码存储在系统表中时,密码是否要加密。encryption_option 的数据类型为 varchar(20),可以是下列值之一。

   值 描述
   NULL 加密密码。这是默认设置。
   skip_encryption 密码已加密。SQL Server 应该存储值而且不用重新对其加密。
   skip_encryption_old 已提供的密码由 SQL Server 较早版本加密。SQL Server 应该存储值而且不用重新对其加密。此选项只供升级使用。


 返回代码值:
  0(成功)或 1(失败)

 注释:
  SQL Server 登录和密码可包含 1 到 128 个字符,包括任何字母、符号和数字。但是,登录不能:
   1. 含有反斜线 (\)。
   2. 是保留的登录名称,例如 sa 或 public,或者已经存在。
   3. 为 NULL,或为空字符串 ('')。
  如果提供默认数据库的名称,则不用执行 USE 语句就可以连接到指定的数据库。但是,不能使用默认的数据库,直到数据库所有者(使用 sp_adduser 或 sp_addrolemember)或 sp_addrole 授予对该数据库的访问权限:为止。

  SID 号是唯一的 Microsoft Windows NT? 用户标识号。必须保证每个用户的 SID 号在 Windows NT 域中的唯一性。SQL Server 自动使用 Windows NT SID 标识 Windows NT 用户和组,并为 SQL Server 登录生成一个 SID。

  将登录添加到 SQL Server 时,如果密码已经是加密的形式,则使用 skip_encryption 取消密码加密是有用的。如果此密码由以前的 SQL Server 版本加密,则使用 skip_encryption_old。

  不能从用户定义的事务中执行 sp_addlogin。

  下表显示了几个与 sp_addlogin 一起使用的存储过程。

   存储过程     描述
   sp_grantlogin   添加 Windows NT 用户或组。
   sp_password   更改用户密码。
   sp_defaultdb   更改用户的默认数据库。
   sp_defaultlanguage  更改用户的默认语言。


 权限:
  只有 sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_addlogin。

 示例:
  A. 创建没有密码和主默认数据库的登录 ID
   下面的示例:为用户 Victoria 创建一个 SQL Server 登录名,没有指定密码或默认数据库。

   EXEC sp_addlogin 'Victoria'

  B. 创建登录 ID 和默认数据库
   此示例:为用户 Albert 创建一个 SQL Server 登录,并指定密码 food 以及名为 corporate 的默认数据库。

   EXEC sp_addlogin 'Albert', 'food', 'corporate'

  C.创建使用其它默认语言的登录 ID
   下面的示例:为用户 Claire Picard 创建一个 SQL Server 登录名,密码为"caniche",默认数据库为 public_db,默认语言为 French。

   EXEC sp_addlogin 'Claire Picard', 'caniche', 'public_db', 'french'

  D. 创建带有特定 SID 的登录 ID
   下面的示例:为用户 Michael 创建一个 SQL Server 登录名,密码为"chocolate",默认数据库为 pubs,默认语言为 us_english,SID 为 0x0123456789ABCDEF0123456789ABCDEF。

   EXEC sp_addlogin 'Michael', 'chocolate', 'pubs', 'us_english', 0x0123456789ABCDEF0123456789ABCDEF

  E. 创建登录 ID 并且不加密密码
   下例在 Server1 上为用户 Margaret 创建了一个密码为"Rose"的 SQL Server 登录,再析取此加密密码,然后使用前面加密的密码将用户登录 Margaret 添加到 Server2,但不对此密码进一步加密。之后,用户 Margaret 即可使用密码"Rose"登录到 Server2。

   -- Server1
   EXEC sp_addlogin Margaret, Rose

   --Results
   New login created.

   -- Extract encrypted password for Margaret
   SELECT CONVERT(VARBINARY(32), password)
      FROM syslogins
      WHERE name = 'Margaret'

   --Results
   ------------------------------------------------------------------
   0x2131214A212B57304F5A552A3D513453

   (1 row(s) affected)

   -- Server2
   EXEC sp_addlogin 'Margaret', 0x2131214A212B57304F5A552A3D513453,
      @encryptopt = 'skip_encryption'

 

 

*******************************************************************
sp_adduser
 为当前数据库中的新用户添加安全帐户。包括此过程是为了向后兼容。请使用 sp_grantdbaccess。

 语法:
  sp_adduser [ @loginame = ] 'login'
      [ , [ @name_in_db = ] 'user' ]
      [ , [ @grpname = ] 'group' ]

 参数:
  [@loginame =] 'login'
   用户的登录名称。login 的数据类型是 sysname,没有默认值。login 必须是现有 Microsoft? SQL Server? 登录或 Microsoft Windows NT? 用户。

  [@name_in_db =] 'user'
   新用户的名称。user 的数据类型为 sysname,其默认值为 NULL。如果没有指定 user,则用户的名称默认为 login 名称。指定 user 即为新用户在数据库中给予一个不同于 SQL Server 上的登录 ID 的名称。

  [@grpname =] 'group'
   组或角色,新用户自动地成为其成员。group 的数据类型为 sysname,默认值为 NULL。group 必须是当前数据库中有效的组或角色。Microsoft SQL Server 7.0 使用角色而不是组。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  SQL Server 用户名可以包含 1 到 128 个字符,包括字母、符号和数字。但是,用户名不能:

   1. 含有反斜线符号 (\)。
   2. 为 NULL,或为空字符串 ('')。

  在添加完用户之后,可以使用 GRANT、DENY 和 REVOKE 语句来定义权限:,这些权限:控制着用户进行的活动。

  使用 sp_helplogin 可显示有效登录名的列表。

  使用 sp_helprole 可显示有效角色名的列表。当指定一个角色时,用户会自动地获得为该角色定义的那些权限:。如果没有指定角色,则用户获得的权限:将是授予默认 public 角色的权限:。若要将用户添加到角色,必须提供 username 的值(username 可与 login_id 相同)。

  为了访问数据库,必须使用 sp_adduser 或 sp_grantdbaccess 对登录授予访问权,或者数据库中必须存在 guest 安全帐户。

  不能在用户定义的事务内执行 sp_adduser。

 权限:
  只有 sysadmin 固定服务器角色的 dbo 和成员才能执行 sp_adduser。

 示例:
  A. 添加用户
   下面的示例:使用现有的登录 Victoria,将用户 Victoria 添加到当前数据库中现有的 fort_mudge 角色中。

   EXEC sp_adduser 'Victoria', 'Victoria', 'fort_mudge'

  B. 添加用户名(使用相同的登录 ID)
   下面的示例:为登录 Margaret 将默认用户名 Margaret 添加到当前数据库,该用户名属于默认的 public 角色。

   EXEC sp_adduser 'Margaret'

  C. 添加用户(使用不同的用户名)
   下面的示例:将 Haroldq 登录添加到当前的数据库中并使用 Harold 用户名,该用户名属于 fort_mudge 角色。

   EXEC sp_adduser 'Haroldq', 'Harold', 'fort_mudge'

 


*******************************************************************************
sp_addrolemember
 将安全帐户作为当前数据库中现有 Microsoft? SQL Server? 数据库角色的成员进行添加。
 语法:
  sp_addrolemember [ @rolename = ] 'role' ,
      [ @membername = ] 'security_account'

 参数:
  [@rolename =] 'role'
   当前数据库中 SQL Server 角色的名称。role 的数据类型为 sysname,没有默认值。

  [@membername =] 'security_account'
   添加到角色的安全帐户。security_account 的数据类型为 sysname,没有默认值。security_account 可以是所有有效的 SQL Server 用户、SQL Server 角色或是所有已授权访问当前数据库的 Microsoft Windows NT? 用户或组。当添加 Windows NT 用户或组时,请指定在数据库中用来识别该 Windows NT 用户或组的名称(使用 sp_grantdbaccess 添加)。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  当使用 sp_addrolemember 将安全帐户添加到角色时,新成员将继承所有应用到角色的权限:。

  在添加 SQL Server 角色,使其成为另一个 SQL Server 角色的成员时,不能创建循环角色。例如,如果 YourRole 已经是 MyRole 的成员,就不能将 MyRole 添加成为 YourRole 的成员。此外,也不能将固定数据库或固定服务器角色,或者 dbo 添加到其他角色。例如,不能将 db_owner 固定数据库角色添加成为用户定义的角色 YourRole 的成员。

  只能使用 sp_addrolemember 将成员添加到 SQL Server 角色。使用 sp_addsrvrolemember 将成员添加到固定服务器角色。在 SQL Server 中,将成员添加到 Windows NT? 组是不可能的。

  在用户定义的事务中不能使用 sp_addrolemember。

 权限:
  只有 sysadmin 固定服务器角色和 db_owner 固定数据库角色中的成员可以执行 sp_addrolemember,以将成员添加到固定数据库角色。角色所有者可以执行 sp_addrolemember,将成员添加到自己所拥有的任何 SQL Server 角色。db_securityadmin 固定数据库角色的成员可以将用户添加到任何用户定义的角色。

 示例:
  A. 添加 Windows NT 用户
  下面的示例:将 Windows NT 用户 Corporate\JeffL 添加到 Sales 数据库,使其成为用户 Jeff。然后,再将 Jeff 添加到 Sales 数据库的 Sales_Managers 角色中。

 

  说明  由于 Corporate\JeffL 在 Sales 数据库中被当作是用户 Jeff,所以必须使用 sp_addrolemember 来指定用户名 Jeff。


  USE Sales
  GO
  EXEC sp_grantdbaccess 'Corporate\JeffL', 'Jeff'
  GO
  EXEC sp_addrolemember 'Sales_Managers', 'Jeff'

  B. 添加 SQL Server 用户
  下面的示例:将 SQL Server 用户 Michael 添加到当前数据库中的 Engineering 角色。

  EXEC sp_addrolemember 'Engineering', 'Michael'

 

 


*****************************************************************************
sp_droprolemember
 从当前数据库中的 Microsoft? SQL Server? 角色中删除安全帐户。

 语法:
  sp_droprolemember [ @rolename = ] 'role' ,
      [ @membername = ] 'security_account'

 参数:
  'role'
   某个角色的名称,将要从该角色删除成员。role 的数据类型为 sysname,没有默认值。role 必须已经存在于当前的数据库中。

  'security_account'
   正在从角色中删除的安全帐户的名称。security_account 的数据类型为 sysname,没有默认值。security_account 可以是 SQL Server 用户或另一个 SQL Server 角色,或 Microsoft Windows NT? 用户或组。当前数据库中必须存在 security_account。当指定 Windows NT 用户或组时,请指定该 Windows NT 用户或组在数据库中可被识别的名称(用 sp_grantdbaccess 添加)。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  通过从 sysmembers 表删除行,sp_droprolemember 删除角色成员。当从角色删除某个成员时,应用于该角色的权限:不再适用于角色从前的那个成员。

  不能使用 sp_droprolemember 从 Windows NT 组删除 Windows NT 用户;而只能在 Windows NT 安全系统中完成这个任务。若要从固定服务器角色删除用户,请使用 sp_dropsrvrolemember。不能从 public 角色删除用户,并且不能从任何角色删除 dbo。

  可以使用 sp_helpuser 查看 SQL Server 角色的成员,并且可以使用 sp_addrolemember 将成员添加到角色。

  不能从用户定义的事务内执行 sp_droprolemember。

 权限:
  只有 sysadmin 固定服务器角色、db_owner 和 db_securityadmin 固定数据库角色的成员才能执行 sp_droprolemember。只有 db_owner 固定数据库角色的成员才可以从固定数据库角色中删除用户。

 示例:
  下面的示例:从角色 Sales 中删除用户 JonB。

  EXEC sp_droprolemember 'Sales', 'Jonb'

 

 

 


*******************************************************************************
sp_dropuser
 从当前数据库中删除 Microsoft? SQL Server? 用户或 Microsoft Windows NT? 用户。提供 sp_dropuser 是为了向后兼容。使用 sp_revokedbaccess 删除用户。

 语法:
  sp_dropuser [ @name_in_db = ] 'user'

 参数:
  [@name_in_db =] 'user'
   将要被删除的用户的名称。user 的数据类型为 sysname,没有默认值。user 必须已经存在于当前的数据库中。当指定 Windows NT 用户时,请指定该 Windows NT 用户在数据库中可被识别的名称(用 sp_grantdbaccess 添加)。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  sp_dropuser 执行 sp_revokedbaccess 以从当前数据库中删除用户。

  使用 sp_helpuser 可以显示一个用户名的列表,可以将这些用户名从当前数据库中删除。

  当删除某个用户的安全帐户时,也就删除了该用户的所有别名。如果某个用户在数据库中拥有任意对象,那么就不能删除该用户。必须使用 sp_changeobjectowner 将对象的所有关系更改到另一用户。删除用户时,也就自动地删除与该用户相关的权限:,并且将这些相关的权限:从该用户所在的任何角色中删除。

  不能使用 sp_dropuser 删除 dbo 或 INFORMATION_SCHEMA 用户,也不能从 master 或 tempdb 数据库中删除 guest 用户。

  不能从用户定义的事务内执行 sp_dropuser。

 权限:
  只有 sysadmin 固定服务器角色、db_owner 或 db_accessadmin 固定数据库角色的成员才能执行 sp_dropuser。

 示例:
  下面的示例:从当前数据库删除用户 Albert。

  EXEC sp_dropuser 'Albert'

 

 


*******************************************************************************
sp_droplogin
 删除 Microsoft? SQL Server? 登录,以阻止使用该登录名访问 SQL Server。

 语法:
  sp_droplogin [ @loginame = ] 'login'

 参数:
  [@loginame =] 'login'
   将被删除的登录。login 的数据类型为 sysname,没有默认值。login 必须已经存在于 SQL Server 中。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  不能删除映射到任何数据库中现有用户的登录。必须首先使用 sp_dropuser 删除该用户。此外,不能删除下面这些登录:

   系统管理员 (sa) 登录。
   拥有现有数据库的登录。
   在 msdb 数据库中拥有作业的登录。
   当前正在使用并且被连接到 SQL Server 的登录。

  可以使用 sp_changedbowner 更改数据库的所有者。
  删除某个登录同时也就删除了所有映射到该登录的远程及链接服务器登录。
  不能在用户定义的事务内执行 sp_droplogin。

 权限:
  只有 sysadmin 和 securityadmin 固定服务器角色的成员才能执行 sp_droplogin。

  sp_droplogin 必须检查服务器上的所有数据库,以便确定在这些数据库中是否有与正被删除的登录相关的用户帐户。因此,服务器上的每个数据库都必须满足下列条件之一:

  正在执行 sp_droplogin 的用户必须有访问该数据库的权限:。


  guest 用户帐户必须存在于数据库中。
  即使不能访问数据库,登录仍然可以被删除。但是会产生错误信息 15622,并且在那个不能访问的数据库中,所有与被删除的登录相关的用户都会变成孤立的。若要确定孤立用户,请在 sp_droplogin 不能访问的每个数据库中执行 sp_change_users_login REPORT。

 示例:
  下面的示例:从 SQL Server 中删除登录 Victoria。

  EXEC sp_droplogin 'Victoria'

 


*******************************************************************************
sp_password
 添加或更改 Microsoft? SQL Server? 登录的密码。

 语法:
  sp_password [ [ @old = ] 'old_password' , ]
      { [ @new =] 'new_password' }
      [ , [ @loginame = ] 'login' ]

 参数:
  [@old =] 'old_password'
   是旧密码。old_password 为 sysname 类型,其默认值为 NULL。

  [@new =] 'new_password'
   是新密码。new_password 为 sysname 类型,无默认值。如果没有使用命名参数:,就必须指定 old_password。

  [@loginame =] 'login'
   是受密码更改影响的登录名。login 为 sysname 类型,其默认值为 NULL。login 必须已经存在,并且只能由 sysadmin 固定服务器角色的成员指定。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  SQL Server 密码可包含 1 到 128 个字符,其中可包括任何字母、符号和数字。

  新密码以加密的形式更新和存储,因此,任何用户(甚至系统管理员)都不能查看密码。

  当 sysadmin 或 securityadmin 固定服务器角色的成员使用带全部三个参数:的 sp_password 重新设置他们自己的密码时,审核记录反映的却是他们正在更改别人的密码。

  sp_password 不能用于 Microsoft Windows NT? 安全帐户。通过 Windows NT 网络帐户连接到 SQL Server 的用户是由 Windows NT 授权的,因此其密码只能在 Windows NT 中更改。

  sp_password 不能在用户定义的事务中执行。

 权限:
  执行权限:默认地授予 public 角色,以供用户更改自己的登录密码。只有 sysadmin 角色的成员可更改其他用户的登录密码。

 示例:
  A.无原密码的情况下更改登录密码
  下面的示例:将登录 Victoria 的密码更改为 ok。

  EXEC sp_password NULL, 'ok', 'Victoria'

  B.更改密码
  下面的示例:将登录 Victoria 的密码由 ok 改为 coffee。

  EXEC sp_password 'ok', 'coffee'

 


*******************************************************************************
sp_defaultdb
 更改登录的默认数据库。

 语法:
  sp_defaultdb [ @loginame = ] 'login' ,
      [ @defdb = ] 'database'

 参数:
  [@loginame =] 'login'
   是登录名。login 的数据类型为 sysname,没有默认值。login 可以是现有 Microsoft? SQL Server? 登录或者是 Microsoft Windows NT? 用户或组。如果 SQL Server 上没有 Windows NT 用户或组,系统会自动添加。

  [@defdb =] 'database'
   新的默认数据库的名称。database 的数据类型为sysname,没有默认值。database 必须已经存在。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  当客户端连接 SQL Server 时,如果没有显式使用 USE 语句,则为其登录定义的默认数据库将成为当前数据库。可以在 sp_addlogin 添加登录时定义默认数据库。当执行 sp_addlogin 时,如果没有指定数据库,则 master 数据库将成为默认数据库。

  执行 sp_defaultdb 后,当用户下次登录时登录将连接到新数据库。但 sp_defaultdb 不能自动将数据库访问权授予登录。数据库所有者 (dbo) 必须通过 sp_grantdbaccess 将数据库访问权授予登录,或者该登录必须是一个在数据库中指定的 guest 用户。

  推荐使用 sp_defaultdb 更改所有登录(而不是 sysadmin 固定数据库角色成员)的默认数据库。这将防止用户不经意间使用或创建 master 数据库中的对象。

  在用户定义的事务中不能执行 sp_defaultdb。

 权限:
  执行权限:默认授予 public 角色,以便用户更改他们自己登录的默认数据库。只有 syadmin 或 securityadmin 固定服务器角色的成员可以为其它登录执行 sp_defaultdb。

 示例:
  下面的示例:将 pubs 设置为用户 Victoria 的默认数据库。

  EXEC sp_defaultdb 'Victoria', 'pubs'

 

 

 

*******************************************************************************
sp_grantdbaccess
 为 Microsoft? SQL Server? 登录或 Microsoft Windows NT? 用户或组在当前数据库中添加一个安全帐户,并使其能够被授予在数据库中执行活动的权限:。

 语法:
  sp_grantdbaccess [@loginame =] 'login'
      [,[@name_in_db =] 'name_in_db' [OUTPUT]]

 参数:
  [@loginame =] 'login'
   当前数据库中新安全帐户的登录名称。Windows NT 组和用户必须用 Windows NT 域名限定,格式为"域\用户",例如 LONDON\Joeb。登录不能使用数据库中已有的帐户作为别名。login 的数据类型为 sysname,没有默认值。

  [@name_in_db =] 'name_in_db' [OUTPUT]
   数据库中帐户的名称。name_in_db 是 sysname 类型的 OUTPUT 变量,默认值为 NULL。如果没有指定,则使用 login。如果将其指定为 NULL 值的 OUTPUT 变量,则设置 @name_in_db 为 login。当前数据库不必存在 name_in_db。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  SQL Server 用户名可以包含 1 到 128 个字符,包括字母、符号和数字。但是,用户名不能:

   含有反斜线符号 (\)。
   为 NULL,或为空字符串 ('')。

  在使用安全帐户访问数据库之前,必须授予它对当前数据库的访问权。使用 sp_grantdbaccess 仅可以管理当前数据库中的帐户。若要从数据库中删除帐户,请使用 sp_revokedbaccess。

  如果当前数据库中没有 guest 安全帐户,而且 login 为 guest,则可以添加 guest 的安全帐户。

  sa 登录不能添加到数据库中。

  不能从用户定义的事务中执行 sp_grantdbaccess。

 权限:
  只有 sysadmin 固定服务器角色、db_accessadmin 和 db_owner 固定数据库角色的成员才能执行 sp_grantdbaccess。

 示例:
  下面的示例:在当前数据库中为 Windows NT 用户 Corporate\GeorgeW 添加帐户,并取名为 Georgie。

  EXEC sp_grantdbaccess 'Corporate\GeorgeW', 'Georgie'

 


*******************************************************************************
sp_revokedbaccess
 从当前数据库中删除安全帐户。

 语法:
  sp_revokedbaccess [ @name_in_db = ] 'name'

 参数:
  [@name_in_db =] 'name'
   是要删除的帐户名。name 的数据类型为 sysname,无默认值。name 可以是 Microsoft? SQL Server? 用户名或 Microsoft Windows NT? 用户名或组名,而且必须存在于当前数据库中。当指定 Windows NT 用户或组时,请指定该 Windows NT 用户或组在数据库中可被识别的名称(即用 sp_grantdbaccess 添加的名称)。

 返回代码值:
  0(成功)或 1(失败)

 注释:
  删除帐户时,依赖于该帐户的权限:和别名将自动删除。

  只能用 sp_revokedbaccess 删除当前数据库中的帐户。若要向数据库中添加帐户,请使用 sp_grantdbaccess。若要删除 SQL Server 角色,请使用 sp_droprole。从当前数据库中删除拥有对象的帐户时,必须先删除对象或用 sp_changeobjectowner 更改对象所有者后,再执行 sp_revokedbaccess。

  sp_revokedbaccess 存储过程不能删除:
   public 角色、dbo 或 INFORMATION_SCHEMA 用户。
   数据库中的固定角色。
   master 和 tempdb 数据库中的 guest 用户帐户。
   Windows NT 组中的 Windows NT 用户。

  在用户定义事务内部不能执行 sp_revokedbaccess。

 权限:
  只有 sysadmin 固定服务器角色成员及 db_accessadmin 和 db_owner 固定数据库角色成员才能执行 sp_revokedbaccess。

 示例:
  下例从当前数据库中删除帐户 Corporate\GeorgeW。

  EXEC sp_revokedbaccess 'Corporate\GeorgeW'

posted @ 2008-10-06 16:04 巴西木 阅读(134) | 评论 (0)编辑 收藏

InstallShield 之String Table /property /path变量

仔细了解了下,InstallShield这几种定义的变量的用法:
1.String Tables里的变量:
Installation Information->General Information->String Tables 在设置的语言中:如Chinese(Simplified)  添加变量TestStr 并设置值。在Script中使用方法:
eg.

STRING tempStr;
BEGIN
     tempStr=@TestStr;
MessageBox(tempStr,INFORMATION);
END;
2.Property:
Behavior and Logic->Property Manager 添加变量如SoloProperty.在Script中使用语法:
eg.
function OnBegin()     
STRING tempStr,tempStr2;  
   
STRING svUsername[256];
    NUMBER nBuffer;
begin
    nBuffer 
= 256;
    MsiGetProperty(ISMSI_HANDLE, 
"SoloProperty", svUsername, nBuffer);
    MessageBox(
"SoloProperty Value is = " + svUsername, INFORMATION); 
    
Exit;
end;
A useful function like this,:-):
Code:
prototype STRING GetValue(STRING);
prototype VOID SetValue(
STRINGSTRING);

function STRING GetValue(szName)
    
STRING szResult;
    NUMBER nLength;
    NUMBER nRetVal;
begin
    nLength 
= 1024;
    nRetVal 
= MsiGetProperty(ISMSI_HANDLE, szName, szResult, nLength);
    
if(nRetVal != ERROR_SUCCESS) then
        MessageBox(
"Error retrieving value for: " + szName, WARNING);
    endif;
    return szResult;
end;             

function VOID SetValue(szName, szValue)
    NUMBER nRetVal;
begin
    nRetVal 
= MsiSetProperty(ISMSI_HANDLE, szName, szValue);
    
if(nRetVal != ERROR_SUCCESS) then
        MessageBox(
"Error setting value for: " + szName, WARNING);
    endif;
end;

useage Code:
svMyValue = GetValue("SOME_PROPERTY");
SetValue(
"SOME_OTHER_PROPERTY", svMyValue);
3. Path variables:
Media->Path Variables
找到这句话:
Path variables used to represent source paths are not available at run time, only at build time.

posted on 2007-10-11 16:17 Solog 阅读(370) 评论(3)  编辑 收藏 所属分类: InstallShield

posted @ 2008-10-04 09:17 巴西木 阅读(1650) | 评论 (1)编辑 收藏

什么是标签库?

JSP标签库(也被称作定制标签)是一种通过JavaBean生成基于XML的脚本的方法   
。从概念上将,标签就是很简单而且可重用的代码结构。比方说,在我们最新发布的JSPKit(在JSP Insider内)中,我们就使用XML标签实现了对XML文档的轻松访问。请看以下的清单A。

清单A:执行XML/XSL 转换的示例标签及其所在的HTML页面\r

<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>
  <JAXP:TransformerTag>
  <JAXP:XMLFile>c:/xml/example.xml</JAXP:XMLFile>
  <JAXP:XSLFile>c:/xml/example.xsl</JAXP:XSLFile>
</JAXP:TransformerTag>  

以上的示例使用了简单的标签来访问处在幕后的更强大代码。在以上的事例中首先装载了一个XML文件,然后应用了一个XSL文件来创建一个将被发送到客户端的结果——这一切不过仅仅只是用了一个很简单的标签。

定制标签使得JSP项目中很容易创建重用的开放源代码模块。而你的全部需要不过就是标签库及其文档。标签库的重要特性如下所示:

易于安装在多个项目上
标签很容易从一个JSP项目迁移到其他项目。一旦建立了一个标签库,你只需要把这个个标签库包装成一个JAR文件就可以在其他JSP项目中重新使用了。不能重用的是你作为程序员在建立标签时所加进标签的内容。因为标签可以重新使用,所以标签库可以轻松地用于你自己的项目。目前,最好的标签资源可以在JSPTags.com这个站点找到。. 
扩展JSP
标签库可以具备JSP规范(JSP 1.2)中的任何特性和功能。这也意味着你拥有了无限的能力可以扩展和增加JSP的强大功能却无需等待新版本JSP的发布。所以说,你完全可以取消页面上的JSP include调用了——只需用include标签建立自己的规范就可以了。 
易于维护
标签库使得JSP Web应用程序变得很容易维护。主要有以下几个原因: 


标签对任何人而言都很容易使用、易于理解。 
你的所有逻辑都驻留在处于中心的标签处理器和JavaBean内。这样一来,如果你不得不更新你的代码,你只需要处理这些中心文件而无需修正使用这些代码的其他页面。 
如果你需要增加新的功能,你不必改变任何已经存在的页面。你可以把额外的属性包含到你的标签内从而引进新的行为同时保留以前的属性,实现旧页面的正常运行。

比方说,你可能有如下的一个标签,它让你的文本都显示蓝色:

<BlueText>My Text</BlueText> 

但是随着项目的进行,你又想让蓝色变暗。于是你保留自己的标签但是为其增加了一个新的属性:shade 

<BlueText shade="teal">My Text</BlueText> 

所有的老标签继续显示蓝色,但现在你可以使用同一标签来产生变暗的蓝色文本了。


标签提升了代码的重用性。那些经过多次测试和使用的代码肯定具有更少的bug。所以,使用定制标签的JSP页面也同样具有更少的缺陷,维护起来自然方便多了。 
更快的开发速度
标签库是一种重用代码的好办法。我们知道,服务器端语言标准的重用代码方式是使用模版。标签库和模版库这种方式相比则好得多。采用模版库,你就需要针对每个项目修改模版或者建立生硬的接口。标签库则没有这些限制,而其所具有的面向对象特性则让标签库不仅用法灵活而且扩展能力极为强大。还有,因为你重用代码,结果在项目开发上花费的时间就大大降低了,而更多的时间则可以用来设计自己的Web应用程序。标签库的简单接口使得这些代码用法简单、易于调试。 
虽然标签库用起来特别简单,但是,建立其内部支持层次可比建立简单的JavaBean复杂多了。这种复杂性的主要原因在于标签库包含了好几个部分。而你所需要掌握的技能不过是理解、熟悉Java和JSP。


定制标签内幕
一个简单的定制标签包括了以下几个要素:


1、JavaBean:为了充分利用Java的面向对象特性,重用代码应当放置在独立的代码容器内   
。这些JavaBean可不是标签库的一部分。他们是标签库用来执行所分配任务的基础代码模块。 

2、标签处理器:这是标签库的真正核心。标签处理器(tag handler)引用它所需要的任何外部材料(JavaBean)并且负责访问JSP页面的信息(PageContext对象)。而JSP页面则把页面上设置的标签属性都传递给标签处理器,JSP页面上的标签标示的内容也是这样处理的。当标签处理器完成其处理过程,它就会把处理后的输出结果回送给JSP页面做进一步处理。 

3、标签库描述符(TLD文件):这是一种很简单的XML文件,TLD文件描述和说明了属性、信息和标签处理器文件位置等信息。JSP 容器使用这一文件来映射被调用标签库的位置和用法。 

4、Web站点的web.xml文件:其实这就是你的Web站点上的初始化文件。在这个文件内你可以定义Web应用程序中使用的定制标签,还可以定义用来描述每个定制标签的TLD文件。 

5、发布文件(WAR或JAR文件):如果你打算重用定制标签,那么你肯定需要想个简便的办法把标签从一个项目迁移到其他项目中去。把标签库打包成一个JAR文件就是这种既方便又高效的标签库发布方式。我们在以上的事例中没有建立JAR文件,但是如果你打算更进一步地了解JAR文件的细节,你不妨阅读“JSP WAR文件简介”。 

6、JSP页面上的标签库声明:仅需使用标签库标示符即可方便地声明页面上存在的标签。标签库在页面上声明之后,你就可以随意使用它们了。 

看起来会让你忙乎一阵子,实际上没那么糟糕。刚开始用的时候当然会有点棘手。其实真正关键的并不是编码而是把以上各个部分正确地组织起来。这种层次性的结构是很重要的,也正是如此才可以说标签库及灵活又易于使用。更重要的事,这些层次可以让整个建立标签库的过程都能通过JSP IDE自动完成。今后的JSP IDE更可以自动完成创建定制标签的大部分工作,而你自己则只需要负责建立代码和标签处理器。

(注意:一个标签处理器只定义一个定制标签;而一个标签库则是很多个标签处理器的集合,它们执行同一任务。)

建立你的第一个标签
以下的进阶指南将介绍如何把JSP扩展为具有自己的HTML编码功能   
。这种编码方法用<和 >符号代替HTML代码,而且很容易经过扩展以执行其他编码操作。整个示例虽然简单,但它确实向你说明了定制标签的最基础要素。

创建JavaBean
代码中的任何可重用部分都应该包含在JavaBean内。这一点是很重要的。这样你就可以在其他项目中重用这些代码了。由于任何放置在标签处理器内的代码都不会在标签以外被重用,所以代码的重用部分要与之分离。在我们的示例中,HTML编码逻辑很一般,所以我们直接把他们放在了JavaBean内,请参看清单B。

创建标签处理器\r
标签处理器使用了清单C的代码。

这些代码很简单,其中包括:

读取包含在打开和关闭标签内的文本。 
调用HTML编码函数。 
将结果返回给JSP页面。 
创建标签描述符\r
我们需要描述自己的标签以便系统知道他们到底具有什么含义。TLD文件通常就以标签处理器命名并被存放在"/WEB-INF/"目录之下。该文件的文件扩展名是.tld。请参看清单D。

更新Web XML文件
现在你就可以告诉JSP容器使用标签库了。为此你需要修改web.xml文件:增加一个taglib项以注册标签库并为标签分配一个URI。URI是Web站点上唯一应用于这一特定标签的索引。由于标签今后还可能用在不同的Web站点上,所以你最好采用完整的URL和/或者包名字(package name)来保证这一唯一性。示例代码请参看清单E。

使用新标签
定制标签现在就可以用在你的JSP页面上了   
。你只需要在页面上使用taglib指示符声明所要采用的标签即可。标签通过其唯一的URI被索引,然后被分配给一个前缀(prefix)。这一前缀并没有什么特别的意义,只要它不和指示符内的其他名称不冲突就可以了。请参看以下的清单F和G。

清单F:在JSP页面上使用HTML编码标签

<%@ taglib uri="HTMLEncode" prefix="Examples" %>
<html>
<head></head>
<body>
 <pre>
 <Examples:HTMLEncode>
  < Hello , Simple sample >
 </Examples:HTMLEncode>
 </pre>
 </body>
</html>
 

清单G:代码示例输出\r

< Hello , Simple sample >
which displays as:
< Hello , Simple sample >
 

实际上,我就用这个标签对页面上的所有代码示例进行了编码。你可以注意到定制标签是在服务器上进行处理的。这就是说,你不会在输出页面上看到定制标签。

正如你所看到的那样,建立标签并非难事。最麻烦的是学习标签处理器的整个细节。我们不过是触及了皮毛。由于这一过程需要采取的步骤很多,所以刚入门的JSP程序员可能在建立标签的时候会觉得很困惑。

小结\r
标签库是JSP尚未得到广泛应用的重要特性之一   
。它所提供的自己定制新标签等功能和以往的Web设计方式还是很不同的,适应起来自然有一段时间。不过,越来越多的开发人员已经在逐渐使用标签库完成自己的Web设计任务。到2001年末,估计标签库就会成为许多JSP项目中最常见的特性之一。

标签库的优点非本文所能全面阐述。标签库还具有其他很多优点。标签库促使JSP开发进入了前所未有的新天地。对JSP开发人员来说这确实是一种很令人振奋的新技术,从此我们就获得了建立任何类型Web应用程序的自由。标签库让JSP变成了最丰富、最具动态开发能力的Web编程环境。

 

作者简介:

Casey Kochmer 是Amberjack Software公司的总裁,该公司是JSP Insider的母公司。作为一位高级web应用程序设计师,Casey利用自己12年专业编程经验为JSP Kit做出了重要贡献。他还是JSP Buzz和其他许多站点文章的作者。闲暇之时,Casey喜欢徒步漫游华盛顿州的奥林匹克山。

posted @ 2008-09-27 15:52 巴西木 阅读(251) | 评论 (0)编辑 收藏

1. JSP标签库
JSP标签库(也称自定义库)可看成是一套产生基于XML脚本的方法,它经由JavaBeans来支持。在概念上说,标签库是非常简单和可以重用的代码构造。

2. JSP2.0标签使用方法
JSP2.0中标签的使用由多个部分组成:

(1) WEB_INF/web.xml中添加标签引用

(2) 标签的实现,可能是class也可能是web templet

(3) 在jsp文件中添加引用

在实际使用中,分析jsp2.0标签可以先从jsp文件入手,然后再分析web.xml及相应的标签库文件。

2.2 基本标签的使用方法
2.2.1 jsp文件中的标签引用及使用方法
以下是一个简单的jsp文件:

<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>

<html> <body> <mytag:helloWorld/> </body></html>

说明:

(1) 首先以<%@ taglib prefix="mytag" uri="…" %>说明标签前缀及该前缀引用的标签所在路径,在这个例子中uri值是一个相对路径(本地路径),即当前项目根目录下WEB-INF/ jsp2/ jsp2-example-taglib.tld。如果使用的是本地路径就不需要在web.xml中配置路径映射了;

(2) 指定了标签前缀后,在jsp页面的body内就可以使用这个前缀来引用标签库中的指定标签了,如<mytag:helloWorld/>,就是引用mytag所指定的标签库中的helloWorld标签。

2.2.2 web.xml中的配置
如果在上述例子中使用的不是本地路径,那么就需要在web.xml中配置路径转换,如使用:<%@ taglib prefix="mytag" uri=" http://mytaglib/myTestTags1 " %>来引用标签库,那么就需要在web.xml文件的jsp-config节点中添加如下配置:

<taglib>

<taglib-uri>http://mytaglib/myTestTags1</taglib-uri>

<taglib-location>/WEB-INF/jsp2/jsp2-example-taglib.tld </taglib-location>

</taglib>

JSP解释器会将http://mytaglib/myTestTags1根据web.xml中的配置转化为本地路径。当然<taglib- uri>中文本可以是任何值,但不能和其它的配置冲突,所以在规划时最好加上前缀,如:http://mytaglib等。

2.2.3 标签库中的配置
在标签库中的配置实际上就是配置对实现类的引用,JSP解释器会根据jsp文件中对标签的引用,在标签库中找到相应的标签,然后再根据标签中的定 义调用具体的实现类,本例中在jsp文件中对标签的引用:<mytag:helloWorld/>,即引用了helloWorld这个标签, 这个标签在标签库中的定义如下:

<tag>
<description>Outputs Hello, World</description>
<name>helloWorld</name>
<tag-class>jsp2.examples.simpletag.HelloWorldSimpleTag</tag-class>
<body-content>empty</body-content>
</tag>
该标签由四个部分组成:

(1) description:描述该标签的作用

(2) name:标签的名字,该名字在jsp文件使用,相当由类名;

(3) tag-class:标签的实现索引,相当于类的实现;本例索引指定 jsp2.examples.simpletag.HelloWorldSimpleTag,是一个java的类文件,应放在 WEB_INF/classes/jsp2/examples/simpletag目录下的HelloWorldSimpleTag.class文件;

(4) body-content:在jsp文件中使用标签时,标签中的内容类别,本例的值是empty,表示helloWorld这个标签中没有内容。如果在 jsp页面中在该标签中加入了内容,如<mytag:helloWorld>hell</mytag:helloWorld>, 页面会报错,当然<mytag:helloWorld></mytag:helloWorld>是不会错的(注意不能有空格 式)。

2.2.4 类的实现
类HelloWorldSimpleTag实现如下:

package jsp2.examples.simpletag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

public class HelloWorldSimpleTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().getOut().write( "Hello, world!" );
}}
说明:

(1) jsp标签调用的类一般继承于SimpleTagSupport

(2) SimpleTagSupport中实现了getJspContext()这个方法,这个方法可以获取指向jsp页面的输出流。

(3) getJspContext().getOut().write( "Hello, world!" ):输出Hellow,World!

2.3含有变量的tag配置
2.3.1 jsp文件中的标签引用及使用方法
以下是引用了带有变量标签的jsp页面:

<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/my_taglib.tld" %>
<html><body>
<mytag:repeat num1="15">
Invocation ${count} of 5<br>
</mytag:repeat>
</body>
</html>
说明:

(1) <mytag:repeat num="15">,输入参数的传入方法:即在标签中将要传入的参数做为标签的一个属性,并指定其属性值,本例中传入参数num1,它的值为15;

(2) ${count},在页面中显示输出参数的值,count是输出参数的名字

2.3.2 标签库中的配置
标签库中的相应配置如下:

<tag>
<description>Repeats the body of the tag 'num' times</description>
<name>repeat</name>
<tag-class>jsp2.examples.simpletag.RepeatSimpleTag</tag-class>
<body-content>scriptless</body-content>--标签内容是脚本
<variable>
<description>Current invocation count (1 to num)</description>
<name-given>count</name-given> --输出参数说明
</variable>
<attribute>
<name>num</name> --输入参数说明
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
该标签由六个部分组成:

(1) description:见上文

(2) name:见上文

(3) tag-class:见上文

(4) body-content:这个例子的值是scriptless,表示标签中的内容是脚本

(5) variable:输出参数,在jsp中使用${count}来引用这个输出变量的值,输出参数名并不是强制性的,这里只是一个约定,即要求repeat实现类最后有count这个输出参数,以便在jsp页中方便引用,如果没有也不会报错;

(6) attribute:输入参数,在jsp中使用< mytag:repeat num="5">来设置这个输入参数num,这个参数名是强制性的,即要在repeat实现类中有setNum这个方法,如果没有相应的方法jsp页面会报错;

2.3.3 类的实现
package jsp2.examples.simpletag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.util.HashMap;
import java.io.IOException;

public class RepeatSimpleTag1 extends SimpleTagSupport {
private int num;

public void doTag() throws JspException, IOException {
for (int i=0; i<num; i++) {
getJspContext().setAttribute("count", String.valueOf( i + 1 ) );
getJspBody().invoke(null);
} }

public void setNum(int num) {
this.num = num; }}
说明:

(1) getJspContext().setAttribute定义了输出到jsp页面的输出参数count,这里的count是一个字符串,它的值可以不与 标签库中variable定义相同,如,它可以是len,当然在jsp引用时应以这里为准,即使用${len}引用;

(2) setNum(int num)方法:接收输入参数,这个方法命名规则为set+输入参数名,该方法带一个参数,用于接收输入参数的值。

2.4 函数标签的定义方法
2.4.1 jsp文件中函数标签引用及使用方法
<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<html>
<body><span>${my:caps(“HELLO WORLD”)}</span></body>

</html>

说明:

(1) 函数标签的引用比其它标签的引用都要简单,它的引用与高级语言中的函数调用方法类似,直接在函数名后的括号后面输入相应的参数值即可,不需要另加用标签的其它属性来说明输入参数。

2.4.2 函数标签在标签库中配置
<function>
<description>Converts the string to all caps</description>
<name>caps</name>
<function-class>jsp2.examples.el.Functions</function-class>
<function-signature>java.lang.String caps( java.lang.String )</function-signature>
</function>
说明如下:

(1) 这种方法的定义包含在function元素中;

(2) name:函数名

(3) function-class:该函数真正的实现class,本例中,caps函数是由WEB_INF/classes/ jsp2/examples/el路径中的Functions类来实现的;

(4) function-signature:说明函数的输入及输出参数类型,不用指明参数名。

2.4.3 类的实现
package jsp2.examples.el;
import java.util.*;

public class Functions {
public static String caps( String text ) {
return text.toUpperCase();
}}
说明:

(1) 函数标签实现类就是普通的类,它不需要从某个父类继承;

(2) 函数标签实现类中必须有相应的方法与标签库中相应的函数字义相同(包括函数名,输入参数个数及输入参数类型,函数的返回值);

2.5 标签模板
标签模板的特点:

(1) 没有tld文件在jsp中通过<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>引用,即使用tagdir代替了uri,这里的tags是一个文件夹,不是文件,在该文件夹中包含了所需的标签模板;

(2) 通过以下方式传入参数值:

<tags:displayProducts>
<jsp:attribute name="normalPrice">....</jsp:attribute>
<jsp:attribute name="onSale">....</jsp:attribute>
.....
</tags:displayProducts>
(3) displayProducts是与/WEB-INF/tags目录中的某个文件名;

(4) 通过<jsp:attribute name="…. ">来赋值

(5) 标签模板是一个纯文本文件,类似于html文件,而不需要通过java的类来实现标签的定义;

(6) 个人认为标签模板的主要作用重在排版,而其它标签的作用重在功能的实现;本人不打算在以后的开发使用标签模板,因此本文不再进一步分析标签模板。

posted @ 2008-09-27 15:45 巴西木 阅读(2300) | 评论 (1)编辑 收藏

仅列出标题
共33页: First 10 11 12 13 14 15 16 17 18 Last