??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV综合色一区二区三区,亚洲欧洲精品久久,无码欧精品亚洲日韩一区夜夜嗨 http://www.tkk7.com/yrj11320/category/4075.html天生我才必有用,千金散尽q复来! zh-cnWed, 28 Feb 2007 08:18:23 GMTWed, 28 Feb 2007 08:18:23 GMT60SQL语法大全http://www.tkk7.com/yrj11320/articles/27820.html不胖用砖?/dc:creator>不胖用砖?/author>Thu, 12 Jan 2006 12:59:00 GMThttp://www.tkk7.com/yrj11320/articles/27820.htmlhttp://www.tkk7.com/yrj11320/comments/27820.htmlhttp://www.tkk7.com/yrj11320/articles/27820.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/27820.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/27820.html--????BR>--数据操作
SELECT --从数据库表中索数据行和列
INSERT --向数据库表添加新数据?BR>DELETE --从数据库表中删除数据?BR>UPDATE --更新数据库表中的数据
--数据定义
CREATE TABLE --创徏一个数据库?BR>DROP TABLE --从数据库中删除表
ALTER TABLE --修改数据库表l构
CREATE VIEW --创徏一个视?BR>DROP VIEW --从数据库中删除视?BR>CREATE INDEX --为数据库表创Z个烦?BR>DROP INDEX --从数据库中删除烦?BR>CREATE PROCEDURE --创徏一个存储过E?BR>DROP PROCEDURE --从数据库中删除存储过E?BR>CREATE TRIGGER --创徏一个触发器
DROP TRIGGER --从数据库中删除触发器
CREATE SCHEMA --向数据库d一个新模式
DROP SCHEMA --从数据库中删除一个模?BR>CREATE DOMAIN --创徏一个数据值域
ALTER DOMAIN --改变域定?BR>DROP DOMAIN --从数据库中删除一个域
--数据控制
GRANT --授予用户讉K权限
DENY --拒绝用户讉K
REVOKE --解除用户讉K权限
--事务控制
COMMIT --l束当前事务
ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据讉K特征
--E序化SQL
DECLARE --为查询设定游?BR>EXPLAN --为查询描q数据访问计?BR>OPEN --索查询结果打开一个游?BR>FETCH --索一行查询结?BR>CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句
EXECUTE --动态地执行SQL 语句
DESCRIBE --描述准备好的查询
---局部变?BR>declare @id char(10)
--set @id = '10010001'
select @id = '10010001'

---全局变量
---必须以@@开?/P>

--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符?x > y'
else if @y > @z
print 'y > z'
else print 'z > y'

--CASE
use pangu
update employee
set e_wage =
case
when job_level = ??then e_wage*1.08
when job_level = ??then e_wage*1.07
when job_level = ??then e_wage*1.06
else e_wage*1.05
end

--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的?BR>while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的?BR>select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end

--WAITFOR
--?{待1 时2 分零3 U后才执行SELECT 语句
waitfor delay ?1:02:03?BR>select * from employee
--?{到晚上11 炚w8 分后才执行SELECT 语句
waitfor time ?3:08:00?BR>select * from employee

***SELECT***

select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
stockname like '[^F-M]%' --------- (^排除指定范围)
--------- 只能在用like关键字的where子句中用通配W?
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stock*** = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序Qdesc-降序Qasc-升序
order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查?BR>--------- 除非能确保内层select只返回一个行的|
--------- 否则应在外层where子句中用一个in限定W?BR>select distinct column_name form table_name --------- distinct指定索独有的列|不重?BR>select stocknumber ,stocknumber + 10 = stocknumber + 10 from table_name
select stockname , stocknumber = count(*) from table_name group by stockname
--------- group by 表按行分组,指定列中有相同的?BR>having count(*) = 2 --------- having选定指定的组

select *
from table1, table2
where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
table1.id =* table2.id -------- 叛_部连?

select stockname from table1
union [all] ----- union合ƈ查询l果集,all-保留重复?BR>select stockname from table2

***insert***

insert into table_name (Stock_name,Stock_number) value (xxx,xxxx)
value (select Stockname , Stocknumber from Stock_table2)---value为select语句

***update***

update table_name set Stockname = xxx [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4

***delete***

delete from table_name where Stockid = 3
truncate table_name ----------- 删除表中所有行Q仍保持表的完整?BR>drop table table_name --------------- 完全删除?/P>

***alter table*** --- 修改数据库表l构

alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 昄表已有特?BR>create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 实现删除列的ҎQ创建新表)
alter table table_name drop constraint Stockname_default ---- 删除Stockname的defaultU束

***function(/*常用函数*/)***

----l计函数----
***G --求^均?BR>COUNT --l计数目
MAX --求最大?BR>MIN --求最?BR>SUM --求和

--***G
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)

--STDEV()
--STDEV()函数q回表达式中所有数据的标准?/P>

--STDEVP()
--STDEVP()函数q回M标准?/P>

--VAR()
--VAR()函数q回表达式中所有值的l计变异?/P>

--VARP()
--VARP()函数q回M变异?/P>

----术函数----

/***三角函数***/
SIN(float_expression) --q回以弧度表C的角的正u
COS(float_expression) --q回以弧度表C的角的余u
TAN(float_expression) --q回以弧度表C的角的正切
COT(float_expression) --q回以弧度表C的角的余切
/***反三角函?**/
ASIN(float_expression) --q回正u是FLOAT 值的以弧度表C的?BR>ACOS(float_expression) --q回余u是FLOAT 值的以弧度表C的?BR>ATAN(float_expression) --q回正切是FLOAT 值的以弧度表C的?BR>ATAN2(float_expression1,float_expression2)
--q回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度{换ؓ角度q回与表辑ּ相同的数据类型可?BR>--INTEGER/MONEY/REAL/FLOAT cd
RADIANS(numeric_expression) --把角度{换ؓ弧度q回与表辑ּ相同的数据类型可?BR>--INTEGER/MONEY/REAL/FLOAT cd
EXP(float_expression) --q回表达式的指数?BR>LOG(float_expression) --q回表达式的自然Ҏ?BR>LOG10(float_expression)--q回表达式的?0 为底的对数?BR>SQRT(float_expression) --q回表达式的qx?BR>/***取近似值函?**/
CEILING(numeric_expression) --q回>=表达式的最整数返回的数据cd与表辑ּ相同可ؓ
--INTEGER/MONEY/REAL/FLOAT cd
FLOOR(numeric_expression) --q回<=表达式的最整数返回的数据cd与表辑ּ相同可ؓ
--INTEGER/MONEY/REAL/FLOAT cd
ROUND(numeric_expression) --q回以integer_expression 为精度的四舍五入D回的数据
--cd与表辑ּ相同可ؓINTEGER/MONEY/REAL/FLOAT cd
ABS(numeric_expression) --q回表达式的l对D回的数据cd与表辑ּ相同可ؓ
--INTEGER/MONEY/REAL/FLOAT cd
SIGN(numeric_expression) --试参数的正负号q回0 零? 正数?1 负数q回的数据类?BR>--与表辑ּ相同可ؓINTEGER/MONEY/REAL/FLOAT cd
PI() --q回gؓπ ?.1415926535897936
RAND([integer_expression]) --用Q选的[integer_expression]做种子值得?-1 间的随机点?/P>

----字符串函?---
ASCII() --函数q回字符表达式最左端字符的ASCII 码?BR>CHAR() --函数用于ASCII 码{换ؓ字符
--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL ?BR>LOWER() --函数把字W串全部转换为小?BR>UPPER() --函数把字W串全部转换为大?BR>STR() --函数把数值型数据转换为字W型数据
LTRIM() --函数把字W串头部的空格去?BR>RTRIM() --函数把字W串N的空格去?BR>LEFT(),RIGHT(),SUBSTRING() --函数q回部分字符?BR>CHARINDEX(),PATINDEX() --函数q回字符串中某个指定的子串出现的开始位|?BR>SOUNDEX() --函数q回一个四位字W码
--SOUNDEX函数可用来查扑֣音相似的字符串但SOUNDEX函数Ҏ字和汉字均只q回0 ?
DIFFERENCE() --函数q回由SOUNDEX 函数q回的两个字W表辑ּ的值的差异
--0 两个SOUNDEX 函数q回值的W一个字W不?BR>--1 两个SOUNDEX 函数q回值的W一个字W相?BR>--2 两个SOUNDEX 函数q回值的W一二个字符相同
--3 两个SOUNDEX 函数q回值的W一二三个字W相?BR>--4 两个SOUNDEX 函数q回值完全相?/P>

QUOTENAME() --函数q回被特定字W括h的字W串
/*select quotename('abc', '{') quotename('abc')
q行l果如下
----------------------------------{
{abc} [abc]*/

REPLICATE() --函数q回一个重复character_expression 指定ơ数的字W串
/*select replicate('abc', 3) replicate( 'abc', -2)
q行l果如下
----------- -----------
abcabcabc NULL*/

REVERSE() --函数指定的字符串的字符排列序颠?BR>REPLACE() --函数q回被替换了指定子串的字W串
/*select replace('abc123g', '123', 'def')
q行l果如下
----------- -----------
abcdefg*/

SPACE() --函数q回一个有指定长度的空白字W串
STUFF() --函数用另一子串替换字符串指定位|长度的子串

----数据cd转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])

select cast(100+99 as char) convert(varchar(12), getdate())
q行l果如下
------------------------------ ------------
199 Jan 15 2000

----日期函数----
DAY() --函数q回date_expression 中的日期?BR>MONTH() --函数q回date_expression 中的月䆾?BR>YEAR() --函数q回date_expression 中的q䆾?BR>DATEADD(<datepart> ,<number> ,<date>)
--函数q回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函数q回两个指定日期在datepart 斚w的不同之?BR>DATENAME(<datepart> , <date>) --函数以字W串的Ş式返回日期的指定部分
DATEPART(<datepart> , <date>) --函数以整数值的形式q回日期的指定部?BR>GETDATE() --函数以DATETIME 的缺省格式返回系l当前的日期和时?/P>

----pȝ函数----
APP_NAME() --函数q回当前执行的应用程序的名称
COALESCE() --函数q回众多表达式中W一个非NULL 表达式的?BR>COL_LENGTH(<'table_name'>, <'column_name'>) --函数q回表中指定字段的长度?BR>COL_NAME(<table_id>, <column_id>) --函数q回表中指定字段的名U即列名
DATALENGTH() --函数q回数据表达式的数据的实际长?BR>DB_ID(['database_name']) --函数q回数据库的~号
DB_NAME(database_id) --函数q回数据库的名称
HOST_ID() --函数q回服务器端计算机的名称
HOST_NAME() --函数q回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中用用于插入一个identity column列到新表?BR>/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函数判断所l定的表辑ּ是否为合理日?BR>ISNULL(<check_expression>, <replacement_value>) --函数表辑ּ中的NULL 值用指定值替?BR>ISNUMERIC() --函数判断所l定的表辑ּ是否为合理的数?BR>NEWID() --函数q回一个UNIQUEIDENTIFIER cd的数?BR>NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL D不相{时则返回expression1 的?/P>

]]>
HTML语言剖析-frameset http://www.tkk7.com/yrj11320/articles/17996.html不胖用砖?/dc:creator>不胖用砖?/author>Thu, 03 Nov 2005 10:55:00 GMThttp://www.tkk7.com/yrj11320/articles/17996.htmlhttp://www.tkk7.com/yrj11320/comments/17996.htmlhttp://www.tkk7.com/yrj11320/articles/17996.html#Feedback1http://www.tkk7.com/yrj11320/comments/commentRss/17996.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17996.html
<FRAMESET> <FRAME>
<NOFRAMES>
<IFRAME>
?框架概念 Q?/FONT>
所谓框架便是网는面分成几个框H,同时取得多个 URL。只 ?<FRAMESET> <FRAME> 卛_Q而所有框架标记 要放在一个总v?html ,q个档案只记录了该框?如何划分Q不会显CZQ何资料,所以不必放?<BODY> 标记Q浏览这框架必须dq 案而不是其它框H的档案?lt;FRAMESET> 是用以划分框H,每一框窗׃?<FRAME> ?记所标示Q?lt;FRAME>必须?<FRAMESET> 范围中用。如下例Q?

<frameset cols="50%,*">

<frame name="hello" src="up2u.html">
<frame name="hi" src="me2.html">
</frameset>

此例?<FRAMESET> 把画面分成左右两相等部分Q左便是昄 up2u.htmlQ右边则会显C?me2.html q档案,<FRAME> 标记所标示的框H永q是按由上而下、由左至右的ơ序?

本节?Composer 教室的【运用框架】大部分相同Q只是本节增加了内容及较l,?如其它篇章一样ƈ不会提及|页制作工具Q若馈下学会?HTML 怿你亦不会选用 Composer Q?FrontPage 一cȝ工具了?

?<FRAMESET> <FRAME> Q?/FONT>
▲Top
<FRAMESET> U框架标讎ͼ用以宣告HTML文g为框架模式,q设定视H如何分剌Ӏ?
<FRAME> 则只是设定某一个框H内的参数属性?

<FRAMESET> 参数讑֮Q?
例子Q?lt;frameset rows="90,*" frameborder="0" border=0 framespacing="2" bordercolor="#008000">

  • COLS="90,*"
    垂直切割画面(如分左右两个画面)Q接?FONT color=#ff0080>整数?/FONT>?FONT color=#ff0080>癑ֈ?/FONT>Q?* 则代表占用馀下空 间。数值的个数代表分成的视H数目且以逗号分隔。例?COLS="30,*,50%" 可以 切成三个视窗Q第一个视H是 30 pixels 的宽度,Zl对分割Q第二个视窗是当 分配完第一及第三个视窗後剩下的I间Q第三个视窗则占整个画面?50% 宽度 ?一相对分割?FONT color=#fbb339>您可自己调整数字?
  • ROWS="120,*"
    是横向切割Q将画面上下分开Q数D定同上。唯 COLS ?ROWS 两参数尽?不要同在一?<FRAMESET> 标记中,?Netacape 偶然不能昄q类形的框架Q尽 采用多重分割?
  • frameborder="0"
    讑֮框架的边框,其值只?0 ?1 Q?0 表示不要ҎQ?1 表示要显C框。(?免?yes ?no Q?
  • border="0"
    讑֮框架的边框厚度,?pixels 为单位?
  • bordercolor="#008000"
    讑֮框架的边框颜艌Ӏ?/SPAN>
  • framespacing="5"
    表示框架与框枉的保留空白的距离?

<FRAME> 参数讑֮Q?
例子Q?lt;frame name="top" src="a.html" marginwidth="5" marginheight="5" scrolling="Auto" frameborder="0" noresize framespacing="6" bordercolor="#0000FF">

  • SRC="a.html"
    讑֮此框H中要显C的|页案名称Q每个框H一定要对应著一个网|案。你?使用l对路径或相对\径,有关此两者详见於【连l进阶】?
  • NAME="top"
    讑֮q个框窗的名Uͼq样才能指定框架来作q结Q必ML命名?
  • frameborder=0
    讑֮框架的边框,其值只?0 ?1 Q?0 表示不要ҎQ?1 表示要显C框。(?免?yes ?no Q?
  • framespacing="6"
    表示框架与框枉的保留空白的距离?
  • bordercolor="#008000"
    讑֮框架的边框颜艌Ӏ颜色D参考【HTML 剖析】?
  • scrolling="Auto"
    讑֮是否要显C卷_YES 表示要显C卷_NO 表示无论如何都不要显C, AUTO是视情况昄?
  • noresize
    讑֮不让使用者可以改变这个框框的大小Q亦没有讑֮此参敎ͼ使用者可以很?意地拉动框架Q改变其大小?
  • marginhight=5
    表示框架高度部䆾边缘所保留的空间?
  • marginwidth=5
    表示框架宽度部䆾边缘所保留的空间?
以下是一些例子:Q与 Composer 教室的【运用框架】相同)

例子 HTML Code
 
 
<frameset rows="80,*">
<frame name="top" src="a.html">
<frame name="bottom" src="b.html">
</frameset>
例子 HTML Code
 
 
 
<frameset rows="80,*,80">
<frame name="top" src="a.html">
<frame name="middle" src="b.html">
<frame name="bottom" src="c.html">
</frameset>
例子 HTML Code
   
 
<frameset cols="150,*">
<frameset rows="80,*">
<frame name="upper_left" src="a.html">
<frame name="lower_left" src="b.html">
</frameset>
<frame name="right" src="c.html">
</frameset>
例子 HTML Code
 
   
<frameset rows="80,*">
<frame name="top" src="a.html">
<frameset cols="150,*">
<frame name="lower_left" src="b.html">
<frame name="lower_right" src="c.html">
</frameset>
</frameset>
例子 HTML Code
   
 
<frameset cols="150,*">
<frame name="left" src="a.html">
<frameset rows="80,*">
<frame name="upper_right" src="b.html">
<frame name="lower_right" src="c.html">
</frameset>
</frameset>

?<NOFRAMES> Q?/FONT>
▲Top
当别Z用的览器太旧,不支援框架这个功能时Q他看到的将会是一片空白。ؓ了避?q种情况Q可使用 <NOFRAMES> q个标记Q当使用者的览器看不到框架Ӟ他就会看 ?<NOFRAMES> ?</NOFRAMES> 之间的内容,而不是一片空白。这些内容可以是提醒 览转用新的览器的字句Q甚x一个没有框架的|页或能自动切换x有框架的版本 亦可?

应用ҎQ?
?lt;frameset> 标记范围加入 </NOFRAMES> 标记Q以下是一个例子:

<frameset rows="80,*">
<noframes>
<body>
很抱歉,馈下使用的浏览器不支援框架功能,误{用新的浏览器?
</body>
</noframes>
<frame name="top" src="a.html">
<frame name="bottom" src="b.html">
</frameset>

若浏览器支援框架Q那堋它不会理会 <noframes> 中的东西Q但若浏览器不支援框Ӟ?g认识所有框架标讎ͼ不明的标C被略q,标记包围的东西便被解d来,所以放?<noframes>范围内的文字会被昄?

?<IFRAME> Q?/FONT>
▲Top
q标记只适用?IE?/FONT> 它的作用是在一늽中间插入一个框H以昄另一个文件。它?一个围堉|讎ͼ但围著的字句只有在浏览器不支?iframe 标记时才会显C,?lt;noframes> 一P可以放些提醒字句之类。通常 iframe 配合一个L认浏览器?Java Script 会较好,?javascript 认出该浏览器q Internet Explorer 便会切换臛_一版本?

<iframe> 的参数设定如下:
例子Q?<iframe src="iframe.html" name="test" align="MIDDLE" width="300" height="100" marginwidth="1" marginheight="1" frameborder="1" scrolling="Yes">

  • src="iframe.html"
    Ʋ显C於此框H的文g来源除档案名Uͼ必要加上相对或绝对\径?
  • name="test"
    此框H名Uͼq是q结标记?target 参数所 要的Q?
  • align="MIDDLE"
    可选gؓ left, right, top, middle, bottomQ作用不?
  • width="300" height="100"
    框窗的宽及长Q以 pixels 为单位?
  • marginwidth="1" marginheight="1"
    该插入的文g与框Ҏ保留的空间?
  • frameborder="1"
    使用 1 表示昄ҎQ?0 则不昄。(可以?yes ?noQ?
  • scrolling="Yes"
    使用 Yes 表示容许卷动Q内定)Q?No 则不容许卷动?



]]>
详细为您解析JSP的环境引?-Webspherehttp://www.tkk7.com/yrj11320/articles/17584.html不胖用砖?/dc:creator>不胖用砖?/author>Mon, 31 Oct 2005 12:34:00 GMThttp://www.tkk7.com/yrj11320/articles/17584.htmlhttp://www.tkk7.com/yrj11320/comments/17584.htmlhttp://www.tkk7.com/yrj11320/articles/17584.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/17584.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17584.html应用服务?/FONT>使您能够?A target=_blank>Servlet的开发实现“一ơ写成,各处使用”的目的。该产品包括一个基?A target=_blank>Java的Servlet引擎Q独立于Web服务?/FONT>和它所Z?A target=_blank>操作pȝ。WebSphere应用服务器提供了服务器插件的选项Q与大多数流行的应用E序设计接口QAPIQ兼宏V所支持?Web 服务器有:

IBM HTTP 服务?BR>Apache Server
Domino
Lotus Domino Go Webserver
Netscape EntERPrise Server
Netscape FastTrack Server
Microsoft Internet Information Server

除了 Servlet 引擎及插件外QWebSphere应用服务器还提供Q?BR>
1. JavaSoft Java Servlet API 实现Q以及这?API 的扩展和附加?BR>
2. CZ和文,CZ Servlet ?Web 站点应用E序演示了简单和高技术。联机和可打印文供您快速入门,q帮助掌握服务器高功能的用演C基本类及其扩展的示例应用程序?BR>
3. WebSphere应用服务器的理器,使用囑Ş界面Q易?

(1) 入本地和q程?Servlet 讄选项
(2) 讄初始化参?BR>(3) 理 Servlet
(4) 指定 Servlet 别名
(5) 创徏 Servlet 铑֒qo
(6) 启用轻量U目录访问协议(LDAPQ目录支?BR>(7) 记录 Servlet 消息
(8) 启用 JVM 调试
(9) 监控 WebSphere应用服务?使用的资?BR>(10) 监控已装?Servlet、活?Servlet 会话?JDBC q接
(11) 控错误、事件、异常情况和日志输出
(12) 创徏转储和数据快?BR>(13) 动态地启用和禁用跟t?BR>4. ~存和再使用?JDBC-从属数据?/FONT>q接的连接管理功能。当一?Servlet 需要数据库q接Ӟ它可从可用连接的~冲池获得,从而消除了为每个请求打开一个新q接的所需p的系l开销?BR>
5. 附加?Java c,遵@ JavaBeans 规范Q允许程序员讉K JDBC-从属数据库。当隐藏使用关系数据库的复杂度时Q这些数据访?Bean 可提供增强功能。它们可用于可视集成开发环境中?BR>
6. JSP的动态页面内Ҏ持。JSP 技术您能够通过服务器端脚本生成动?Web 面。其l果是将呈示逻辑Q例如,定义 Web 站点l构和外观的 HTML 代码Q从业务逻辑Q例如,讉K数据库以获得要显C在 Web 站点上的信息?Java ~码信息Q中分隔出来。灵zL方面,JSP 文g可包括Q何直接插入的 Java 的组合: 标记、NCSA 标记?JavaBean?BR>
7. 启用 LDAPQ轻量目录讉K协议Q支持的目录服务?BR>
8. 用于集成WebSphere应用服务器和Web服务器(如Apache ServerQ?到Tivoli 理环境QTivoli Management EnvironmentQ以获得分布式监控和操作的模块和命o行界面。Tivoli 模块q不与WebSphere应用服务器一起发行,误问Web 站点Qhttp://www.software.ibm.com/webservers/appserv/Q以获得更多信息?BR>
9. 包含了eNetworkDispatcher、WebTrafficeExpress代理服务器和AFS分布式文件系l,可以提供可׾~的Web服务器环境?WebSphere Applecation Server的Ml构如下图所C:



其基本工作过E:

客户发出h后,由HttpServerServlet调用h交给Application ServerQ由Application Server 和Java Servlet Engine ??????的Servlet q?行数据库q接Q将Sqlh发送给数据库进行处理?BR>
数据库将l果q回Appliction Server。Servlet生成动态页面后Q将处理l果交给HttpServer。HttpServer页面返回给用户?BR>
WebSphere应用服务器对JSP的支持是通过JSP处理器来实现的。在 Web 服务器上安装 WebSphere应用服务器时QWeb 服务器的配置被设|成对 JSP 文gQ即文g扩展名ؓ .jspQ的 HTTP h传递至 WebSphere应用服务器?BR>
WebSphere应用服务器配|则被设|成?JSP 文g传递至?JSP 处理器(pageCompileQ。JSP 处理器对每一?JSP 文g创徏q编?Servlet。该处理器还为每?JSP 文g产生两个文gQ?BR>
(1) java 文gQ包含可用于 Servlet ?Java 语言代码Q?BR>
(2) class 文gQ编译过?Servlet?BR>
JSP 处理器把 .java ?.class 文g攑֜目录 servletspagecompileJSP_file_path 下,其中 JSP_file_path ?JSP 源文件所在的目录路径。例如,若JSP 文g在WebSphereAppServersamplesWebBank 目录下,?java ?class 文g在WebSphereAppServerservletspagecompileWebSphereApp ServersamplesWebBank 目录下?BR>
.java ?.class 文g的文件名相同。处理器使用了命名约定,该命名约定包括将下划U字W和后缀d?JSP 文g名中。例如,如果 JSP 文g名是 login.jspQ则生成的文件ؓ _login_xjsp.java ?_login_xjsp.class?BR>
如同所有的 ServletQ由 JSP 文g生成?Servlet ?javax.servlet.http.HttpServlet的子cL子孙cR如?Servlet cL软g包的一部分Q则 Servlet Java 代码包含了用于一些必需cd软g包语句的导入语句?BR>
如果 JSP 文g包含 JSP 语法Q例如指令和 scriptletsQ,?JSP 处理器会?JSP 语法转换成等L Java 代码。如?JSP 文g包含 HTML 标记Q则处理器添?Java 代码Q以?Servlet 能一个接一个字W地输出 HTML?BR>
Websphere׃面向专业人员Q要完全掌握有一定的隑ֺ。另外,Websphere本n?G多的定wQ需?56M以上内存支持Q系l要求很高?BR>
Websphere的安?BR>
Websphere?A target=_blank>Linux下的安装

1Q以用户root dLinuxpȝQ在控制収ͼConsoleQ或 囑ŞXwindow Xl端q行以下所有步骤的操作Q推荐用Xl端?BR>
2Q装载本ơ大赛IBM我爱Linux Web应用开发盘Q在命o行敲入:mount /mnt/cdrom

3Q进入光盘根目录Q在命o行敲入:cd /mnt/cdrom

4Q运行光盘安装程序,在命令行敲入Q?/install.sh.安装画面自动q入如图所C,因ؓ您要q入高l进行应用程序开发大赛,所以按照安装画面提C,我们选择敲入QA, q入高l安装?BR>


5Q进入高U组安装画面如图所C。此ơIBM我爱Linux Web应用大赛使用了众多的IBM 应用软gQؓ了减大赛参与者众多的产品安装使用问题Q本光盘针对TurboLinux DataServer 中文?.1q行了大量的定制工作Q您能更简便地安装应用大赛软g?BR>
Z您能成功地参加此ơ大奖赛Q希望您采用我们捆绑的TurboLinux作ؓLinuxpȝq_。按照画面提C敲入:Y, q行下一步自动安装?BR>


6Q安装程序自动安装进行中的画面,此画面显C动安装了IBM JDK, IBM HTTP Server, IBM SSL Modules …等{众多的应用软gQ具体请参考您安装的实际情c?BR>


7QIBM HTTP Server 是以 Apache HTTP Server ?A target=_blank>基础q行开发的WWW服务?/FONT>Qƈ在Apache原来的基上加入了SSL和在U网HTTP Server配置的功能?BR>
Z使您能安全地q行q程WEB 方式的配|、管理HTTP ServerQ您必须为您的HTTP理服务器设|访问用户和讉K用户密码。安装过E中E序会自动提C您输入理用户名称Q缺省用户名为:admin, 直接按回车即为缺省用PQ和理用户密码Q密码需输入两次Q且两次密码相同Q。具体如画面所C?



8Q接下来Q安装程序就会自动安装IBM DB2 UDB 工作l版数据?/FONT> V7.1Q此q程无需M人工q预Q系l会自动完成。如图所C?


9Q显CIBM DB2 安装成功的状态?


10Q系l自动安装完IBM DB2数据库后Q自动进入IBM WebSphere 应用服务?/FONT>和相兛_用Y件的安装阶段Q自动装入Websphere Application Server、相x、IBM VisualAge for Java for Linux 3.0、WebSphere 应用开发实例模板EasyPortal ?其中有些软g包比较大Q如VisualAge for Java, 安装旉可能比较长,误心{待pȝ自动安装l束。如图所C?


11Q显C整个高U组应用软g安装成功Qƈ可进入实用阶Dc?


12Q安装成功后Q后台IBM DB2 ?IBM HTTP 应该是已正常启动Q您应可以在览器中览到本机的主页。在Xwindow 中启?NetscapeQURL 栏中敲入Qhttp://localhost or http://your_host_ip or http://your_host_name , 若后台IBM HTTP Server正常启动Q应该看到画?


注意Q如果您没有看到首页画面QIBM HTTP Server 可能没有正常启动Q主要原因是׃您在安装Linuxpȝq程中‘主机名’命名的问题。您可以使用以下Ҏ解决问题Q?BR>
A. 查询您当前Linuxpȝ的主机名Q敲入命令:hostname

B. 假设pȝq回应答为:linux.cn.ibm.com

C. 紧接着Q敲入命令:ping linux.cn.ibm.com,察看是否能通过此主机名q通主机,若能q通,误qD. q入 E. ?BR>
D. 如果不能正常ping ?linux.cn.ibm.comQ敲入命令:vi /etc/hosts ~辑文g.

在文件最后加入此?

xxx.xxx.xxx.xxx yourhostname.com yourhost


此处 xxx.xxx.xxx.xxx 是您安装Linuxpȝ实际使用的数字IP地址Q譬如:192.168.1.100, 此IP地址必须能直接ping ?Qping 192.168.1.100Q?

E. ~辑IBM HTTP 配置文gQ敲入命? vi /opt/IBMHTTPServer/conf/httpd.conf

LC #ServerName your.machine.com开头的q一行,在其后另加入一行:

ServerName yourhostname


F. 重新启动IBM HTTP Server 服务?/FONT>Q敲入命令:

/opt/IBMHTTPServer/bin/apachectl restart


卛_正常启动HTTP 服务器?

Websphere在NT下的安装

?A target=_blank>Windows下安装WebSphere必须要求?28兆内存以上,要是256兆就更好了?A target=_blank>操作pȝ要求Windows NTQPack 3Q。安装之前,必须要有Web服务器,可以是如下之一Q?

IBM HTTP 服务器版?Windows NT 版(WebSphere应用服务?/FONT>安装光盘包括IBM HTTP 服务器)

Apache Server 版本 Windows NT ?

Domino 版本 5.0 Windows NT ?

Lotus Domino Go Webserver 版本 4 Windows NT ?

Microsoft Internet Information Server 版本 3.x以上 Windows NT ?

Netscape EntERPrise Server 版本 3.01 ?版本 3.51 Windows NT 版(使用版本 3.5.1Q?

Netscape FastTrack Server 版本 3.01 Windows NT ?

q需?A target=_blank>Java 开发组ӞJDKQ,q里Q我们徏议用与 WebSphere应用服务器一h供的 JDK。还需要Java Servlet APIQWebSphere应用服务器包?JSDK 版本 2.0 或更高版本?

当然Q还需要Web览器和Appletviewer或者支持JDK1.1 的浏览器。例如: Netscape Navigator 4.06 ?4.0.7、或者带有修正包?Microsoft Internet Explorer 4.01 或更高版本、或者Sun HotJava 1.1 或更高版本?

有一些旧的浏览器不能够正地处理启用本机语言支持的文本。如果在用户界面上看到外来字W,例如“sEnable”,而不是“Enable”,可以通过升񔋹览器校正?

W一步:安装Web服务器:

如果打算安装 IBM HTTP 服务器,必d安装 WebSphere应用服务器之前安装它。WebSphere应用服务器安装光盘有IBM HTTP Server。安装WebSphere应用服务器会更改 Web 服务?httpd.conf 文g?

但是Q如果Web 服务器是在安?WebSphere应用服务器之后安装的Q就不会q行更改Qƈ?WebSphere应用服务器也不能够正运行。安?IBM HTTP 服务器之后,需要一些配|以启用 SSL 支持。具体如何配|,参阅 IBM HTTP 服务器文档以获得指示信息?

对于计划安装其它的Web 服务器(如Apache ServerQ,也请在安?WebSphere应用服务器之前安装它?

W二步:安装之前Q?

在安装之前,如果pȝ中有旧版本的WebSphereQ要先把旧的版本卸蝲了。然后再安装新的版本。卸装之前,最好先备䆾 WebSphere应用服务器版?1.x 文g?

(1) 文g备䆾

从Windows NT 卸装以前版本?WebSphere应用服务器之前,保要移植的文g已经或者将要保存。安?WebSphere应用服务器版?2.0 时显C出的图形用L面备?WebSphere应用服务器目录中的文Ӟ包括cR领域、Servlet、属性文Ӟ其中Q属性文件包括servlet.properties、admin_port.properties、rules.properties、jvm.properties、aliases.properties、connmgr.properties、userprofile.properties。如果有文gȝ在这四个目录之外Q例如,如果?WebSphere应用服务?安装中创q目录Q,在安?WebSphere应用服务?版本 2.0. 之前Q在 WebSphere应用服务?安装之外的位|备份文件?

(2) 卸蝲前一版本

对于 Windows NTQ用开?--> 控制面板中的d/删除选项Q或从开?--> E序 --> IBM WebSphere --> WebSphere应用服务器版?.x 卸装?

注意Q当已安装了某版本的 WebSphere应用服务器,它将复制Web 站点配置文g作ؓ备䆾文gQ然后修改原始配|文件。当使用 Web 服务器时q个已被修改q的文g成为活动的配置文g。当卸装 WebSphere应用服务器时Q不会恢复以前的配置文gQ它仍然是备份文件。ؓ了ɘq些讄再次zdQ必d它们从备份文件{换ؓzd?Web 服务器配|文件?

另外Q需要清?CLASSPATH。安装版?.0之前要删除这些信息。对于在 Windows NT 上用Go Webserver 的Web服务器来_当安?WebSphere应用服务器时能自动卸装Go Webserver 上的 Java 支持。其它的h阅有x?

W三步:安装WebSphere服务器:

在即安?WebSphere应用服务器之前,L保已l:

(1)备䆾所有未通过安装E序自动备䆾的文?

(2) 安装您计划用的 Web 服务器。Web 服务器必d安装 WebSphere应用服务器之前安装?

(3) 安装之前要确保Web 服务器已l停止运行?

注意Q在WebSphere应用服务器的安装期间Q如果指定?IBM HTTP 服务器或 Apache ServerQ将提示您确?Web 服务?httpd.conf 文g的位|?

?Windows NT 上,插入 WebSphere应用服务器安装光盘,转至?Windows NT 操作pȝ命名的子目录Q运行可执行安装E序Qsetup.exeQ。一pd面板指导您完成安装?

配置 WebSphere应用服务?

下面介绍如何配置WebSphere应用服务器,以它和它的lg以能够协同工作。完成这些Q务之后,WebSphere应用服务器通过~省的配|就能够q行几乎所有的功能?

(1) 配置 Apache Server

如果使用Apache Server作ؓWeb服务器,在httpd.conf文g中加入此行:

AddModule mod_app_server.c?

(2) 使用数据?/FONT>?

要保证WebSphere应用服务器与关系数据库(?Oracle ?DB2Q的q接Q将.zip 文g加到文g /properties/bootstrap.properties 中的 java.classpath 属性。也可以使用 WebSphere应用服务器的理器界面的 Java 引擎面来指定文件。同P保 java.classpath 包含用于数据库连接的有效?A target=_blank>驱动E序?

(3) q行模式

ose.mode 属性是用来控制WebSphere应用服务器是作ؓWeb 服务器的一部分Q进E内Q,q是在独立模式下q行Q进E外Q。该属性在 /properties/bootstrap.properties 文g中。ose.mode ~省值是 out。Apache Server ?IBM HTTP 服务器要求设|?ose.mode 属性必Mؓ outQ就是说WebSphere应用服务器必运行在独立模式下?

对于其它 Web 服务器,可以ose.mode ?in q且作ؓ Web 服务器的一部分q行 WebSphere应用服务器?但是通常都不q么做。如有必要需要复?ose.mode是说将ose.mode的D为out?

例如Q如果从作ؓ Webserver 一部分q行?Netscape Enterprise Server Qose.mode=inQ{换ؓ IBM HTTP 服务器(要求 ose.mode=outQ,别忘了在运?IBM HTTP 服务器之前,要将ose.mode 属性更改ؓ out?

除了可以手工~辑 bootstrap.properties 文g之外Q管理器界面?Java 引擎面提供了一个简单的Ҏ来锁住该ose.mode属性倹{?

Java 引擎面提供了一个可用来指示是以 Web 服务器的一部分Qose.mode=inQ或以独立模式(ose.mode=outQ运?WebSphere应用服务器的单选按钮?

作ؓ Web 服务器一部分q行 WebSphere应用服务器ؓServlet 和其它应用程序提供较高的性能Q但安全性较差。作?Web 服务器的一部分q行 WebSphere应用服务器,允许当关?Web 服务器时 WebSphere应用服务器自动停止。在独立模式下运?WebSphere应用服务器需要其它步骤?

启动和停?WebSphere应用服务?

在启?Web 服务器的时候,WebSphere应用服务器会自动启动?

如果?WebSphere应用服务器作为Web 服务器的一部分q行Q当关闭 Web 服务器时 WebSphere应用服务?自动停止。如果以独立模式q行QWebSphere应用服务器不会自动停止?

当在Windows NT 上进E外q行 WebSphere应用服务?Ӟ停止 Web 服务器之后,需要手动停?WebSphere Servlet 服务以停?WebSphere应用服务器。方法是Q从开?--> 讄 --> 控制面板 --> 中选择 WebSphere Servlet 服务Qƈ按“停止”按钮?

安装的检查和故障L

要验?WebSphere应用服务器是否已安装好ƈ正确配置Q可调用 WebSphere应用服务器提供的 snoop servlet。用Web 览器在地址栏中输入Q?http://your.server.name/servlet/snoop。Snoop Servlet 应该回送客h发送的 HTTP h?servlet 的初始化参数。SnoopServlet 和其?servlet 的代码位?servlets 目录。如果Servletp|Q?

(1) 如果你原来通过手工~辑更改q?.properties 文g或更改了WebSphere应用服务器的配置Q先看看q些文g以是否引入非法的或不正确的倹{特别要?/properties/bootstrap.properties 文g?

(2) 为Web 服务器打开本地日志和跟t。先扑ֈ WebSphere应用服务?bootstrap.properties 文g。然后把ose.trace.enabled 和ose.trace.to.webserver 属性都设ؓtrue。停?Web 服务器ƈ重启动。如?WebSphere应用服务器运行在独立模式Q当停止 Web 服务器时它不会相应停止。检?Web 服务器出错日志及 WebSphere应用服务?/logs 目录下的日志。看看错误原因?

(3) 启用调试控制台ƈ重新启动 Web 服务器。WebSphere应用服务器的调试控制台是用来攉和查看跟t及监控数据的。例如,从调试控制台Q可以作Zl启动和停止列在攉和监控服务器数据中的监控E序?

在调试控制台的服务器控制CQ允许查?servlet ?stdout ?stderr 。缺省情况下Qƈ没有启动控制台。在WebSphere应用服务?debug.properties 文g中设|将debug.server.console.enabled 属性设|ؓ为trueQ然后重新启动Web 服务器得改动生效?

或者,也可以在Web中运?http://your.server.name/servlet/DebugConsoleServlet来启用调试控制台。在 Windows NT 上,要成功地查看调试控制収ͼ必须配置 Windows NT 以允怸个或多个服务?Windows 桌面交互?

如果使用作ؓ Windows NT 服务q行?Web 服务器:

选择开?--> 讄 --> 控制面板 --> 服务?

选择 Web 服务器相应的服务?

单击启动按钮?

在结果对话框中,选择允许服务与桌面交互的复选框?

重新启动 Web 服务器以使更改生效?

对于微Y的IIS服务器,对与 Web 服务器相关的每个服务Q如 Web 发布?FTP服务Q,执行以上q程。这些服务必d怸 Windows NT 桌面交互?

如果 WebSphere应用服务器运行时未启动Q?Web 服务器相关的q程Q则需要ؓWebSphere Servlet 服务执行以上q程Q从而允许服务与桌面交互?


]]>
JBuilder2005实战JSP之日志和部vhttp://www.tkk7.com/yrj11320/articles/17583.html不胖用砖?/dc:creator>不胖用砖?/author>Mon, 31 Oct 2005 12:28:00 GMThttp://www.tkk7.com/yrj11320/articles/17583.htmlhttp://www.tkk7.com/yrj11320/comments/17583.htmlhttp://www.tkk7.com/yrj11320/articles/17583.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/17583.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17583.html用户d和退出日?BR>
  当用L录系l时Q在日志表中插入一条记录,记录用户d的时_在用户退出系l时记录用户退出系l的旉?BR>
  我们利用HttpSessionBindingListener接口来完成记录登录和退出日志的功能Q该接口中定义了两个ҎQ?

  ·valueBound(HttpSessionBindingEvent event)

  ·valueUnbound(HttpSessionBindingEvent event)

  如果一个类实现了HttpSessionBindingListener接口Q当对象通过session.setAttribute()被绑定到Session中时Q则对象的接口方法valueBound()被自动调用,当对象从session中移出时(通过调用session.invalidate()、session.removeAttribute()或session自动q期?QvalueUnbound()Ҏ被自动调用?BR>
  下面我们使User.Javacd现HttpSessionBindingListener接口Q调整后的代码如下所C:

  代码清单 18 实现了HttpSessionBindingListener的User.java

1. package bookstore;
2. import javax.Servlet.http.HttpSessionBindingListener;
3. import javax.servlet.http.HttpSessionBindingEvent;
4. import java.sql.*;
5. import java.text.SimpleDate表单at;
6. import java.util.Date;
7.
8. public class User implements HttpSessionBindingListener
9. {
10.  ?BR>11.  private String loginDatetime;//用户d旉
12.  ?BR>13.  public void valueBound(HttpSessionBindingEvent event)
14.  {
15.   Connection conn = null;
16.   String sqlStr = "insert into T_LOGIN_LOG(ID, USER_ID, DT_LOGIN) " +
17.       " values(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )";
18.   try
19.   {
20.    conn = DBConnection.getConnection();
21.    PreparedStatement pStat = conn.prepareStatement(sqlStr);
22.    loginDatetime = getCurrDatetimeStr(); //当前旉?BR>23.    pStat.setString(1, userId);
24.    pStat.setString(2, loginDatetime);
25.    pStat.executeUpdate();
26.
27.   } catch (SQLException e)
28.   {
29.    throw new RuntimeException(
30.     "用户登陆日志写入出错");
31.   } finally
32.  {
33.  try
34.  {
35.   if (conn != null)
36.   {
37.    conn.close();
38.   }
39.  } catch (SQLException ex)
40.  {
41.   ex.printStackTrace();
42.  }
43.  }
44. }
45.
46. public void valueUnbound(HttpSessionBindingEvent event)
47. {
48.  Connection conn = null;
49.  String sqlStr = " update T_LOGIN_LOG set DT_LONOUT = ? " +
50.      " where USER_ID=? and DT_LOGIN = ?";
51.  try
52.  {
53.   conn = DBConnection.getConnection();
54.   PreparedStatement pStat = conn.prepareStatement(sqlStr);
55.   pStat.setString(1, getCurrDatetimeStr());
56.   pStat.setString(2, userId);
57.   pStat.setString(3, loginDatetime);
58.   pStat.executeUpdate();
59.
60.  } catch (SQLException e)
61.  {
62.   throw new RuntimeException(
63.    "用户退出日志写入出?);
64.  } finally
65.  {
66.   try
67.   {
68.    if (conn != null)
69.    {
70.     conn.close();
71.    }
72.   } catch (SQLException ex)
73.   {
74.    ex.printStackTrace();
75.   }
76.  }
77. }
78.
79. //获取当前旉字串Q以yyyyMMddHHmmss格式q回Q如20050505010101
80. private static String getCurrDatetimeStr()
81. {
82.  SimpleDate表单at sdf = new SimpleDate表单at("yyyyMMddHHmmss");
83.  return sdf.表单at(new Date());
84. }

85. }

  valueBound()Ҏ向T_LOGIN_LOG表插入一条登录日志,在valueUnbound()Ҏ中更新日志表的退出时_此外W?0~84行提供了一个获取当前时间串的方法getCurrDatetimeStr()Q通过该方法获取登录和退出时间点的时间字W串?BR>
  下面通过描述用户dpȝ直到退出时所l历的步骤说明程序如何记录用Ld和退出时间的Q?BR>
  1Q用户通过login.JSP输入密码d后,E序转向switch.jsp控制面?BR>
  2Q在switch.jsp中,我们通过session.setAttribute("ses_userBean", userBean)ҎUser.javacȝ对象userBeanl定到session中?BR>
  3Q此时userBean对象的HttpSessionBindingListener接口ҎvalueBound()被调用,向T_LOGIN_LOG表插入一条登录日志?BR>
  4Qswitch.jsp转向welcome.jsp面?BR>
  5Q用L击welcome.jsp面中的链接退出系l时Q{向quit.jsp面?BR>
  6Qquit.jsp调用session.invalidate()ҎQuserBean对象从session中清除?BR>
  7Q此时userBean对象的HttpSessionBindingListener接口ҎvalueUnbound()Ҏ被调用,更新日志的退出时_关闭览器窗口?BR>
  HttpSessionBindingListener接口?A target=_blank>Web容器的事件接口,实现接口的类在某个事件发生时自动被调用,Web容器有多个这L事g接口Q它们分别是Q?BR>
  ·ServletContextListener 接口QWeb容器启动和销毁的事g处理接口Q接口中定义了两个方法?BR>
  ·ServletContextAttributeListener接口QWeb上下文属性发生更Ҏ的事件处理接口?BR>
  ·HttpSessionListener接口QSession创徏和销毁事件的事g处理接口?BR>
  ·HttpSessionAttributeListener接口QSession会话中属性对象更改的事g处理接口Q该接口和我们在前面使用的HttpSessionBindingListener接口怼?BR>
  此外?A target=_blank>J2EE1.4中还提供了另外两个事件处理接口,它们是:

  ·ServletRequestListener接口QRequesth对象创徏和销毁事件处理接口?BR>
  ·ServletRequestAttributeListener接口Q更改Request中属性对象时的事件处理接口?BR>E序部v

  ?A target=_blank>WebE序开发完成后Q我们开始着手程序部|的工作Q我们希望将q个Web应用E序部v到Tomcat5.0的Web应用服务?/FONT>中?BR>
  首先我们讄Web应用E序的默认首,然后再将整个WebE序打成一个WAR案文g包?BR>
  1Q设|默认访问的面Q双dE窗g的webModule节点Q?A target=_blank>JBuilder在内容窗格显C如下的面Q?BR>

?26 讄WebE序默认讉K的页?/DIV>

  点击Welcome files列表双的Add…按钮,在弹出的对话框中录入login.JSPq按定按钮Q将login.jsp面作ؓ默认面Q这样web.XML部v描述文g中将新增以下_体的部|信息:

  代码清单 19 Web应用E序默认面

1. ?BR>2. Qweb-appQ?BR>3. Qdisplay-nameQwebModuleQ?display-nameQ?BR>4. Qwelcome-file-listQ?BR>5. Qwelcome-fileQlogin.jspQ?welcome-fileQ?BR>6. Q?welcome-file-listQ?/B>
7. ?BR>8. Q?web-appQ?/TD>

  当用户在URL中没有指定具体的讉K文g名时QWeb容器自动查看URI下是否有login.jsp文gQ如果直接调个文件?BR>
  2Q在工程H格中的资源树中叛_webModule节点QProperties?QBuild-Q在Build讄面中Q将Build Web archive讄为When building project or module选项Q如下图所C:


?27 讄在Rebuild工程或Web模块时创建WAR案文g

  3Q在工程H格中右击chapter13.jpxQ在弹出的菜单中选择Rebuild~译整个工程?BR>
  4Q编译完成后Q在工程根目录下生一个webModule.war文g?BR>
  5Q拷贝webModule.war文g臻IJBuilder2005安装目录Q?thirdparty/jakarta-tomcat-5.0.27/webapps目录下?BR>
  q样完成Web应用E序的部|了Q下面我们启动Tomcat 5.0 Web应用E序服务?/FONT>Qƈ讉K刚才部v的webModule.war应用E序?BR>
  1Q双击<JBuilder2005安装目录Q?thirdparty/jakarta-tomcat-5.0.27/bin下的startup.bat启动Tomcat 5.0 Web应用服务器(请保证这时JBuilder中没有运行Web应用E序Q以免冲H)?BR>
  2Q打开IEQ键入http://localhost:8080/webModuleQ将正确讉K到刚才部|的Web应用E序Q如下图所C:


?28 部v后login.jsp的访问效?/DIV>

  Tomcat 服务器默认工作于8080端口Q所以在机器名后需要添加端口号Q可以通过更改Tomca位于conf目录下的server.xml配置文g可以更改q个端口受?BR>
  ׃我们的web应用E序的WAR文g名ؓwebModule.warQweb服务器启动后Q会自动WAR文g解压到webModule目录下,所以必通过http://localhost:8080/webModule讉K。此外,׃默认讉K面为login.jspQ所以没有指定具体的面Ӟlogin.jsp面被调用访问?img src ="http://www.tkk7.com/yrj11320/aggbug/17583.html" width = "1" height = "1" />

]]>
Oracle培训教材http://www.tkk7.com/yrj11320/articles/17446.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 30 Oct 2005 09:30:00 GMThttp://www.tkk7.com/yrj11320/articles/17446.htmlhttp://www.tkk7.com/yrj11320/comments/17446.htmlhttp://www.tkk7.com/yrj11320/articles/17446.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/17446.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17446.htmlSQL是一U面向数据库的通用数据处理语言规范Q能完成以下几类功能Q提取查询数据,插入修改删除数据Q生成修改和删除数据库对象,数据库安全控Ӟ数据库完整性及数据保护控制?BR>
数据库对象包括表、视图、烦引、同义词、簇、触发器、函数、过E、包、数据库链、快照等Q表I间、回滚段、角艌Ӏ用P。数据库通过对表的操作来理存储在其中的数据?BR>2. 数据库查?BR>1)    用SELECT语句从表中提取查询数据。语法ؓ

SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC];

说明QSELECT子句用于指定索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中索数据?BR>
2)    SELECT中的操作W及多表查询WHERE子句?LIKE,IS,?

  WHERE子句中的条g可以是一个包含等h不等L条g表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL{比较运符的条件式Q还可以是由单一的条件表N过逻辑q算W组合成复合条g?BR>
比较操作W?=  >  <  >=  <=  !=  <>

SQL操作W?BETWEEN ?AND?nbsp;         IN   LIKE            IS NULL     

              NOT BETWEEN ?AND?NOT IN NOT LIKE   IS NOT NULL

逻辑操作W?AND      OR  NOT

3)    ORDER BY   子句

ORDER BY 子句使得SQL在显C查询结果时各q回行按序排列Q返回行的排列顺序由ORDER BY 子句指定的表辑ּ的值确定?BR>
4)    q接查询

利用SELECT语句q行数据库查询时Q可以把多个表、视囄数据l合hQ得查询结果的每一行中包含来自多个表达式或视图的数据,q种操作被称接查询?BR>
q接查询的方法是在SELECT命o的FROM子句中指定两个或多个被q接查询的表或视图,q且在WHERE子句告诉ORACLE如何把多个表的数据进行合q。根据WHERE子句中的条g表达式是{还是不{式Q可以把q接查询分ؓ{式q接和不{式q接?BR>
5)    子查?BR>
如果某一个SELECT命oQ查?Q出现在另一个SQL命oQ查?Q的一个子句中Q则U查?是查?的子查询?BR>
 
3.     基本数据cdQNUMBER,VARCHAR2,DATEQ?nbsp;
 ORACEL支持下列内部数据cdQ?BR>
l       VARCHAR2 变长字符Ԍ最长ؓ2000字符?BR>
l       NUMBER   数值型?BR>
l       LONG      变长字符数据Q最长ؓ2G字节?BR>
l       DATE       日期型?BR>
l       RAW       二进制数据,最长ؓ255字节?BR>
l       LONG RAW  变长二进制数据,最长ؓ2G字节?BR>
l       ROWID      二六q制Ԍ表示表的行的唯一地址?BR>
l       CHAR       定长字符数据Q最长ؓ255?BR>
 
4.     常用函数用法Q?BR>     一个函数类g一个算W,它操作数据项Q返回一个结果。函数在格式上不同于符Q它个具有变元,可操?个、一个、二个或多个变元QŞ式ؓQ?BR>
函数名(变元Q变元,…)

函数h下列一般类形:

l         单行函数

l         分组函数

1Q单行函数对查询的表或视囄每一行返回一个结果行。它有数值函敎ͼ字符函数Q日期函敎ͼ转换函数{?BR>
2Q分l函数返回的l果是基于行l而不是单行,所以分l函C同于单行函数。在许多分组函数中可有下列选项Q?BR>
l         DISTRNCT 该选项使分l函数只考虑变元表达式中的不同倹{?BR>
l         ALL该选项使分l函数考虑全部|包含全部重复?BR>
全部分组函数Q除COUNTQ?Q外Q忽略空倹{如果具有分l函数的查询Q没有返回行或只有空|分组函数的变元取值的行)Q则分组函数q回I倹{?BR>
l       单行函数

1)        数字函数

ABS  取绝对?nbsp; POWER 乘方   LN   10为底数取?BR>
SQRT qx?nbsp;    EXP       e的nơ乘?nbsp; LOG(m,n)   m为底数n取冪        

数学q算函数:ACOS ATAN ATAN2 COS COSH  SIGN SIN SINH TAN TANH

CEIL   大于或等于取整数  

FLOOR        于或等于取整数

MOD          取余?nbsp;              

ROUND(n,m)   按m的位数取四舍五入值如果round(日期): 中午12以后是明天的日? round(sysdate,'Y')是年的第一?BR>
TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 省的是L旉

 

2)        字符函数

CHR                   按数据库的字W集由数字返回字W?nbsp;

CONCAT(c1,c2)              把两个字Wc1,c2l合成一个字W? ?|| 相同

REPLACE(c,s,r)        把字Wc里出现s的字W替换成r, q回新字W?

SUBSTR(c,m,n)           m大于0,字符c从前面m处开始取n位字W?m{于0?一?

               m与0,字符c从后面m处开始取n位字W?BR>
TRANSLATE(c,f1,t1)       字符c按f1到t1的规则{换成新的字符?BR>
INITCAP             字符首字母大?其它字符写

LOWER                     字符全部写

UPPER                 字符全部大写

LTRIM(c1,c2)              L字符c1左边出现的字Wc2

RTRIM(c1,c2)

TRIM(c1,c2)               L字符c1左右两边的字Wc2

LPAD(c1,n,c2)            字符c1按制定的位数n昄不的位数用c2字符串替换左边的IZ

RPAD(c1,n,c2)

 

3)        日期函数

ADD_MONTHS(d,n)                日期值加n?BR>
LAST_DAY(d)                  q回当月的最后一天的日期

MONTHS_BETWEEN(d1,d2)               两个日期值间的月?d1<d2 q回负数

NEXT_DAY(d)                 q回日期g一天的日期

SYSDATE                  当前的系l时?BR>
                      DUAL是SYS用户下一个空表,它只有一个字Ddummy

4)        转换函数(1)

TO_CHAR(date,'日期昄格式')         

TO_CHAR(number)                 用于昄或报表的格式寚w

TO_DATE(char,'日期昄格式')          

TO_LOB                                 把long字段转换成lob字段

TO_NUMBER(char)                        用于计算或者比较大?

 

5)        转换函数(2)

to_date里日期显C格?BR>
YYYY          q?nbsp;  YEAR    YYY      YY  Y

Q           季度     

MM              ?nbsp;  MONTH       MON    

W          星期 (week of month)       WW, IW (week of year)   

(说明Q周计是按ISO标准,??日的星期数到后面七天Z?不一定是从周一到周?

DD         ?nbsp;  DAY             DY 

HH24            时      HH12            HH 

MI         分钟     

SS          U?BR>
如果惛_定日期的昄格式可以在数据库的参数文件initorasid.ora里新写一行参?NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的讄 NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss

 

6)        转换函数(3)

如果惛_定日期的昄格式可以用alter session命o改变

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

它的作用序如下:

initialization parameter

Environment variable

ALTER SESSION command

 

7)        转换函数 (4)

to_char(number)里数字显C格?BR>
9     数字?BR>
0     数字前面?                  to_char(-1200,'00000.00')

.      数点的位置   

,      标记位置的逗号       用在数字昄格式的左?nbsp;          

L     Ҏ数据库字W集加货币符?nbsp;   to_char(-1200,'L9999.99')       

B     把数?昄为空?用在数字昄格式的右?BR>
       

MI  双的负数标?                      to_char(-1200,'9999.99MI')

PR    括v来的负数                     to_char(-1200,'9999.99PR')

EEEE     用指数方式表C?nbsp;                       to_char(-1200,'9999.99EEEE')

 

8)        输入字符,q回数字的函?BR>
instr(c1,c2)     字符c2出现在c1的位|? 不出? q回0, 常用于模p查?BR>
length(c)  按数据库的字W集,出字符c的长?跟数据库的字W集有关, 一个汉字长度ؓ1

 

9)        有逻辑比较的函数NVL(EXPR1, EXPR2)函数

解释:      IF EXPR1=NULL      RETURN EXPR2

        ELSE    RETURN EXPR1

10)    DECODE(AAHV1HR1HV2HR2....)函数

解释: IF AA=V1 THEN RETURN R1

          IF AA=V2 THEN RETURN R2

        ..?BR>
  ELSE

  RETURN NULL           

举例: decode(id,1,'dept sale',2,'dept tech')

l        集合函数      l常和group by一起?

1)      集合函数列表

AVG             (DISTINCT | ALL | N)                     取^均?BR>
COUNT        (DISTINCT | ALL | N | expr | * )     l计数量

MAX             (DISTINCT | ALL | N)                     取最大?BR>
MIN             (DISTINCT | ALL | N)                     取最?BR>
SUM             (DISTINCT | ALL | N)                     取合计?BR>
STDDEV             (DISTINCT | ALL | N)                     取偏差?如果l里选择的内定w相同,l果?

VARIANCE (DISTINCT | ALL | N)                        取^方偏差?BR>
 

2)      使用集合函数的语?BR>
SELECT column, group_function FROM table

WHERE condition       GROUP BY group_by_expression

HAVING group_condition  ORDER BY column;



3)      使用count时的注意事项

SELECT COUNT(*) FROM table;

SELECT COUNT(帔R) FROM table;

 

都是l计表中记录数量,如果没有PK后者要好一?BR>
SELECT COUNT(all 字段? FROM table;

SELECT COUNT(字段? FROM table;

 

不会l计为NULL的字D늚数量

SUM,AVG旉会忽略ؓNULL的字D?BR>
 

4)    用group by时的限制条g

SELECT字段名不能随? 要包含在GROUP BY的字D里

 GROUP BY后ORDER BY时不能用位置W号和别?BR>
 限制GROUP BY的显C结? 用HAVING条g

 

5)      例子

SQL> select title,sum(salary) payroll from s_emp

where title like 'VP%'   group by title

having sum(salary)>5000    order by sum(salary) desc;



扑և某表里字D重复的记录? q显C?BR>
SQL> select (duplicate field names) from table_name

     group by (list out fields) having count(*)>1;
5. 数据操纵语言命oQ?BR>数据库操U语aQDMLQ命令用于查询和操纵模式对象中的数据Q它不隐式地提交当前事务。它包含UPDATE、INSERT、DELETE、EXPLAIN PLAN、SELECT和LOCK TABLE {命令。下面简单介l一下:

1)        UPDATE tablename SET {column1=expression1,column2=expression2,…} WHERE {conditions};

例如QS     QL>UPDATE EMP

            SET JOB =’MANAGER?BR>
             WHERE ENAME=’MAPTIN?

              SQL >SELECT * FROM EMP;

UPDATE子句指明了要修改的数据库是EMP,q用WHERE子句限制了只对名?ENAME)为’MARTIN’的职工的数据进行修?SET子句则说明修改的方式,x’MARTION’的工作名称(JOB)改ؓ’MARAGER?

 

2)        INSERT INTO tablename {column1,column2,…} VALUES {expression1,expression2,…};

例如QSQL>SELECT INTO DEPTQDNAMEQ?DEPTNOQ?BR>
                     VALUES Q‘ACCOUNTING’,10Q?BR>
 

3)        DELETE FROM tablename WHERE {conditions};

例如QSQL>DELETE FROM EMP

                     WHERE EMPNO = 7654;

DELETE命o删除一条记?而且DELETE命o只能删除整行,而不能删除某行中的部分数?

 

 

4)        事务控制命o

提交命o(COMMIT):可以使数据库的修Ҏ久化.讄AUTOCOMMIT为允许状?SQL >SET AUTOCOMMIT ON;

回滚命o(ROLLBACK):消除上一个COMMIT命o后的所做的全部修改,使得数据库的内容恢复C一个COMMIT执行后的状?使用Ҏ?

SQL>ROLLBACK;

 
?Oracle扩展PL/SQL?. PL/SQL概述?BR>PL/SQL是Oracle对SQL规范的扩展,是一U块l构语言Q即构成一个PL/SQLE序的基本单位(q程、函数和无名块)是逻辑块,可包含Q何数目的嵌套了快。这U程序结构支持逐步求精Ҏ解决问题。一个块Q或子块Q将逻辑上相关的说明和语句组合在一P其Ş式ؓQ?BR>
DECLARE

---说明

BEGIN

---语句序列

EXCEPTION

---例外处理E序

ENDQ?BR>
它有以下优点:

l        支持SQL;

l        生率高;

l        性能?

l        可称植?

l        与ORACLE集成.

 
2. PL/SQL体系l构
PL/SQLq行pȝ是种技术,不是一U独立品,可认U技术是PL/SQL块和子程序的一U机Q它可接收Q何有效的PL/SQL块或子程序。如图所C:

 

 


PL/SQL?BR>
              PL/SQL?BR>
 

                     

PL/SQL?BR>
q程性语?BR>
执行?BR>
SQL语句
 

 

 

 

 

 

 

 

 

 

 

PL/SQL机可执行q程性语句,而将SQL语句发送到ORACLE服务器上的SQL语句执行器。在ORACLE预编译程序或OCIE序中可嵌入无名的PL/SQL块。如果ORACLEhPROCEDURAL选gQ有名的PL/SQL块(子程序)可单独编译,怹地存储在数据库中Q准备执行?BR>
 

 
3. PL/SQL基础Q?BR>PL/SQL有一字符集、保留字、标炏V数据类型、严密语法等Q它与SQL有相同表C,现重点介l?BR>
1)        数据cdQ如下表所C?BR>
 

 

数据cd

子类?BR>
U量cd

数?BR>
BINARY_INTEGER

NATURAL,POSITIVE

NUMBER

DEC,DECIMAL,DOUBLE PRECISION,PLOAT,INTEGER,INT,NUMERIC,REAL,SMALLINT

字符

CHAR

CHARACTER,STRING

VARCHAR2

VARCHAR

LONG

 

LONG RAW

 

RAW

 

RAWID

 

逻辑

BOOLEAN

 

日期

DATE

 

l合

cd

记录

RECORD

 

?BR>
TABLE

 

 

2)        变量和常?BR>
在PL/SQLE序中可值存储在变量和常量中Q当E序执行Ӟ变量的值可以改变,而常量的g能改变?BR>
 

3)        E序块式l构Q?BR>
DECLARE

        变量说明部分Q?BR>
BEGIN

        执行语句部分Q?BR>
[EXCEPTION

        例外处理部分Q]

END;

 
4. 控制语句Q?BR>分支语句Q?BR>
IF condition THEN

        Sequence_of_statements;

END IF;

 

IF condition THEN

        Sequence_of_statement1;

ELSE

        Sequence_of_statement2;

END IF;

 

IF condition1 THEN

        Sequence_of_statement1;

ELSIF condition2 THEN

        Sequence_of_statement2;

ELSIF condition3 THEN

        Sequence_of_statement3;

END IF;

 

 
5. 循环语句Q?BR>LOOP

              Sequence_of_statements;

              IF condition THEN

                     EXIT;

              END IF;

END LOOP;

      WHILE condition LOOP

              Sequence_of_statements;

END LOOP;

 

FOR counter IN lower_bound..higher_bound LOOP

              Sequence_of_statements;

END LOOP;

 
6. 子程序:
存储q程Q?BR>
              CREATE PROCEDURE q程?(参数说明1Q参数说?Q?。。? IS

                     [局部说明]

              BEGIN

                     执行语句Q?BR>
              END q程名;

 

存储函数Q?BR>
              CREATE FUNCTION 函数?(参数说明1Q参数说?Q?。。?

RETURN cd IS

                     [局部说明]

              BEGIN

                     执行语句Q?BR>
                     END 函数名;
?Decode()函数使用技?. 含义解释Q?BR>  DECODE(条g,?,译?,?,译?,...值n,译值n,~省?

该函数的含义如下Q?BR>IF 条g=? THEN
    RETURN(译?)
ELSIF 条g=? THEN
    RETURN(译?)
    ......
ELSIF 条g=值n THEN
    RETURN(译值n)

ELSE
    RETURN(~省?
END IF
2. 使用ҎQ?
1)            比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较?BR>sign()函数Ҏ某个值是0、正数还是负敎ͼ分别q回0??1

例如Q?BR>变量1=10Q变?=20
则sign(变量1-变量2)q回-1Qdecode解码l果为“变?”,辑ֈ了取较小值的目的?BR>
表、视囄构{?BR>现有一个商品销售表saleQ表l构为:
month    char(6)      --月䆾
sell    number(10,2)   --月销售金?BR>
现有数据为:
200001  1000
200002  1100
200003  1200
200004  1300
200005  1400
200006  1500
200007  1600
200101  1100
200202  1200
200301  1300

惌转化Z下结构的数据Q?BR>year   char(4)      --q䆾
month1  number(10,2)   --1月销售金?BR>month2  number(10,2)   --2月销售金?BR>month3  number(10,2)   --3月销售金?BR>month4  number(10,2)   --4月销售金?BR>month5  number(10,2)   --5月销售金?BR>month6  number(10,2)   --6月销售金?BR>month7  number(10,2)   --7月销售金?BR>month8  number(10,2)   --8月销售金?BR>month9  number(10,2)   --9月销售金?BR>month10  number(10,2)   --10月销售金?BR>month11  number(10,2)   --11月销售金?BR>month12  number(10,2)   --12月销售金?BR>
l构转化的SQL语句为:
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
as
    select
    substrb(month,1,4),
    sum(decode(substrb(month,5,2),'01',sell,0)),
    sum(decode(substrb(month,5,2),'02',sell,0)),
    sum(decode(substrb(month,5,2),'03',sell,0)),
    sum(decode(substrb(month,5,2),'04',sell,0)),
    sum(decode(substrb(month,5,2),'05',sell,0)),
    sum(decode(substrb(month,5,2),'06',sell,0)),
    sum(decode(substrb(month,5,2),'07',sell,0)),
    sum(decode(substrb(month,5,2),'08',sell,0)),
    sum(decode(substrb(month,5,2),'09',sell,0)),
    sum(decode(substrb(month,5,2),'10',sell,0)),
    sum(decode(substrb(month,5,2),'11',sell,0)),
    sum(decode(substrb(month,5,2),'12',sell,0))
    from sale
    group by substrb(month,1,4);
?NULL 使用详解1. 含义解释Q?
问:什么是NULLQ?BR>{:在我们不知道具体有什么数据的时候,也即未知Q可以用NULLQ我们称它ؓI,ORACLE中,含有I值的表列长度为零?BR>ORACLE允许M一U数据类型的字段为空Q除了以下两U情况:
1、主键字D(primary keyQ,
2、定义时已经加了NOT NULL限制条g的字D?BR>
说明Q?BR>1、等价于没有M倹{是未知数?BR>2、NULL?、空字符丌Ӏ空格都不同?BR>3、对I值做加、减、乘、除{运操作,l果仍ؓI?BR>4、NULL的处理用NVL函数?BR>5、比较时使用关键字用“is null”和“is not null”?BR>6、空g能被索引Q所以查询时有些W合条g的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查?BR>7、排序时比其他数据都大(索引默认是降序排列,→大)Q所以NULL值L排在最后?BR>2. 使用ҎQ?
SQL> select 1 from dual where null=null;

 

没有查到记录

 

SQL> select 1 from dual where null='';

 

没有查到记录

 

SQL> select 1 from dual where ''='';

 

没有查到记录

 

SQL> select 1 from dual where null is null;

 

        1

---------

        1

 

SQL> select 1 from dual where nvl(null,0)=nvl(null,0);

 

        1

---------

        1

 

对空值做加、减、乘、除{运操作,l果仍ؓI?BR>
SQL> select 1+null from dual;

SQL> select 1-null from dual;

SQL> select 1*null from dual;

SQL> select 1/null from dual;

 

 

查询C个记?

 

注:q个记录是SQL语句中的那个null

 

讄某些列ؓI?BR>
update table1 set ?=NULL where ? is not null;

 

 

现有一个商品销售表saleQ表l构为:

month    char(6)      --月䆾

sell    number(10,2)   --月销售金?BR>
 

create table sale (month char(6),sell number);

insert into sale values('200001',1000);

insert into sale values('200002',1100);

insert into sale values('200003',1200);

insert into sale values('200004',1300);

insert into sale values('200005',1400);

insert into sale values('200006',1500);

insert into sale values('200007',1600);

insert into sale values('200101',1100);

insert into sale values('200202',1200);

insert into sale values('200301',1300);

insert into sale values('200008',1000);

insert into sale(month) values('200009');Q注意:q条记录的sellgؓI)

commit;

p?2条记?BR>
 

SQL> select * from sale where sell like '%';

 

MONTH       SELL

------ ---------

200001      1000

200002      1100

200003      1200

200004      1300

200005      1400

200006      1500

200007      1600

200101      1100

200202      1200

200301      1300

200008      1000

 

查询?1记录.

 

l果说明Q?BR>
查询l果说明此SQL语句查询不出列gؓNULL的字D?BR>
此时需对字DؓNULL的情况另外处理?BR>
SQL> select * from sale where sell like '%' or sell is null;

SQL> select * from sale where nvl(sell,0) like '%';

 

MONTH       SELL

------ ---------

200001      1000

200002      1100

200003      1200

200004      1300

200005      1400

200006      1500

200007      1600

200101      1100

200202      1200

200301      1300

200008      1000

200009

 

查询?2记录.

 

Oracle的空值就是这么的用法Q我们最好熟悉它的约定,以防查出的结果不正确?BR>?如何查找、删除表中重复的记录1. 问题提出Q?
当我们想要ؓ一个表创徏唯一索引Ӟ如果该表有重复的记录Q则无法创徏成功?
2. Ҏ原理Q?
1)       Oracle中,每一条记录都有一个rowidQrowid在整个数据库中是唯一的,
  rowid定了每条记录是在ORACLE中的哪一个数据文件、块、行上?BR>
2)       在重复的记录中,可能所有列的内定w相同Q但rowid不会相同Q所以只要确定出重复记录?BR>  那些h最大rowid的就可以了,其余全部删除?BR>
3)       以下语句用到?Ҏ巧:rowid、子查询、别名?BR>3. 实现ҎQ?
SQL> create table a (

  2  bm char(4),            --~码

  3  mc varchar2(20)               --名称

  4  )

  5  /

 

表已建立.

 

SQL> insert into a values('1111','1111');

SQL> insert into a values('1112','1111');

SQL> insert into a values('1113','1111');

SQL> insert into a values('1114','1111');

 

SQL> insert into a select * from a;

 

插入4个记?

 

SQL> commit;

 

完全提交.

 

SQL> select rowid,bm,mc from a;

 

ROWID              BM   MC

------------------ ---- -------

000000D5.0000.0002 1111 1111

000000D5.0001.0002 1112 1111

000000D5.0002.0002 1113 1111

000000D5.0003.0002 1114 1111

000000D5.0004.0002 1111 1111

000000D5.0005.0002 1112 1111

000000D5.0006.0002 1113 1111

000000D5.0007.0002 1114 1111

 

查询?记录.

 

 

查出重复记录

SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

 

ROWID              BM   MC

------------------ ---- --------------------

000000D5.0000.0002 1111 1111

000000D5.0001.0002 1112 1111

000000D5.0002.0002 1113 1111

000000D5.0003.0002 1114 1111

 

删除重复记录

SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

 

删除4个记?

 

SQL> select rowid,bm,mc from a;

 

ROWID              BM   MC

------------------ ---- --------------------

000000D5.0004.0002 1111 1111

000000D5.0005.0002 1112 1111

000000D5.0006.0002 1113 1111

000000D5.0007.0002 1114 1111
?如何正确利用Rownum来限制查询所q回的行?. 含义解释Q?
1)       rownum是oraclepȝ序分配Z查询q回的行的编Pq回的第一行分配的?Q第二行?Q依此类推,q个伪字D可以用于限制查询返回的总行数?BR>
2)       rownum不能以Q何基表的名称作ؓ前缀?
2. 使用ҎQ?
现有一个商品销售表saleQ表l构为:

month    char(6)      --月䆾

sell    number(10,2)   --月销售金?BR>
 

create table sale (month char(6),sell number);

insert into sale values('200001',1000);

insert into sale values('200002',1100);

insert into sale values('200003',1200);

insert into sale values('200004',1300);

insert into sale values('200005',1400);

insert into sale values('200006',1500);

insert into sale values('200007',1600);

insert into sale values('200101',1100);

insert into sale values('200202',1200);

insert into sale values('200301',1300);

insert into sale values('200008',1000);

commit;

 

SQL> select rownum,month,sell from sale where rownum=1;Q可以用在限制返回记录条数的地方Q保证不出错Q如Q隐式游标)

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        1 200001      1000

 

SQL> select rownum,month,sell from sale where rownum=2;Q?以上都查不到记录Q?BR>
 

没有查到记录

 

SQL> select rownum,month,sell from sale where rownum>5;

Q由于rownum是一个L?开始的伪列QOracle 认ؓq种条g不成立,查不到记录)

 

 

没有查到记录

 

只返回前3条纪?BR>
SQL> select rownum,month,sell from sale where rownum<4;

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        1 200001      1000

        2 200002      1100

        3 200003      1200

 

 

如何用rownum实现大于、小于逻辑Q(q回rownum??0之间的数据)Qminus操作Q速度会受影响Q?BR>
SQL> select rownum,month,sell from sale where rownum<10

  2  minus

  3  select rownum,month,sell from sale where rownum<5;

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        5 200005      1400

        6 200006      1500

        7 200007      1600

        8 200101      1100

        9 200202      1200

 

x日期排序Qƈ且用rownum标出正确序号Q有到大)

SQL> select rownum,month,sell from sale order by month;

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        1 200001      1000

        2 200002      1100

        3 200003      1200

        4 200004      1300

        5 200005      1400

        6 200006      1500

        7 200007      1600

       11 200008      1000

        8 200101      1100

        9 200202      1200

       10 200301      1300

 

查询?1记录.

 

可以发现Qrownumq没有实现我们的意图Q系l是按照记录入库时的序l记录排的号Qrowid也是序分配?BR>
 

SQL> select rowid,rownum,month,sell from sale order by rowid;

 

ROWID                 ROWNUM MONTH       SELL

------------------ --------- ------ ---------

000000E4.0000.0002         1 200001      1000

000000E4.0001.0002         2 200002      1100

000000E4.0002.0002         3 200003      1200

000000E4.0003.0002         4 200004      1300

000000E4.0004.0002         5 200005      1400

000000E4.0005.0002         6 200006      1500

000000E4.0006.0002         7 200007      1600

000000E4.0007.0002         8 200101      1100

000000E4.0008.0002         9 200202      1200

000000E4.0009.0002        10 200301      1300

000000E4.000A.0002        11 200008      1000

 

查询?1记录.

 

正确用法Q用子查询

SQL> select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        1 200001      1000

        2 200002      1100

        3 200003      1200

        4 200004      1300

        5 200005      1400

        6 200006      1500

        7 200007      1600

        8 200008      1000

        9 200101      1100

       10 200202      1200

       11 200301      1300

 

按销售金额排序,q且用rownum标出正确序号Q有到大)

SQL> select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;

 

   ROWNUM MONTH       SELL

--------- ------ ---------

        1 200001      1000

        2 200008      1000

        3 200002      1100

        4 200101      1100

        5 200003      1200

        6 200202      1200

        7 200004      1300

        8 200301      1300

        9 200005      1400

       10 200006      1500

       11 200007      1600

 

查询?1记录.

 

利用以上ҎQ如在打印报表时Q想在查出的数据中自动加上行P可以利用rownum?BR>
 

q回W??条纪录,按月份排?BR>
SQL> select * from (select rownum row_id ,month,sell

  2  from (select month,sell from sale group by month,sell))

  3  where row_id between 5 and 9;

 

    ROW_ID MONTH        SELL

---------- ------ ----------

         5 200005       1400

         6 200006       1500

         7 200007       1600

         8 200008       1000

         9 200101       1100

]]>
[代码人生][分n]SQl语句学习专题 http://www.tkk7.com/yrj11320/articles/17445.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 30 Oct 2005 09:24:00 GMThttp://www.tkk7.com/yrj11320/articles/17445.htmlhttp://www.tkk7.com/yrj11320/comments/17445.htmlhttp://www.tkk7.com/yrj11320/articles/17445.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/17445.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17445.htmlSQL语句集锦

--??nbsp;                               ??
--数据操作
SELECT      --从数据库表中索数据行和列
INSERT      --向数据库表添加新数据?
DELETE      --从数据库表中删除数据?
UPDATE      --更新数据库表中的数据
--数据定义
CREATE TABLE    --创徏一个数据库?
DROP TABLE     --从数据库中删除表
ALTER TABLE     --修改数据库表l构
CREATE VIEW     --创徏一个视?
DROP VIEW     --从数据库中删除视?
CREATE INDEX    --为数据库表创Z个烦?
DROP INDEX     --从数据库中删除烦?
CREATE PROCEDURE   --创徏一个存储过E?
DROP PROCEDURE    --从数据库中删除存储过E?
CREATE TRIGGER    --创徏一个触发器
DROP TRIGGER    --从数据库中删除触发器
CREATE SCHEMA    --向数据库d一个新模式
DROP SCHEMA     --从数据库中删除一个模?
CREATE DOMAIN    --创徏一个数据值域
ALTER DOMAIN    --改变域定?
DROP DOMAIN     --从数据库中删除一个域
--数据控制
GRANT      --授予用户讉K权限
DENY      --拒绝用户讉K
REVOKE      --解除用户讉K权限
--事务控制
COMMIT      --l束当前事务
ROLLBACK     --中止当前事务
SET TRANSACTION    --定义当前事务数据讉K特征
--E序化SQL
DECLARE      --为查询设定游?
EXPLAN      --为查询描q数据访问计?
OPEN      --索查询结果打开一个游?
FETCH      --索一行查询结?
CLOSE      --关闭游标
PREPARE      --为动态执行准备SQL 语句
EXECUTE      --动态地执行SQL 语句
DESCRIBE     --描述准备好的查询


 

---局部变?
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'


 

---全局变量
---必须以@@开?


 

--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符?x > y'
else if @y > @z
print 'y > z'
else print 'z > y'


 

--CASE
use pangu
update employee
set e_wage =
case
  when job_level = ??then e_wage*1.08
  when job_level = ??then e_wage*1.07
  when job_level = ??then e_wage*1.06
  else e_wage*1.05
end


 

--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
  print @x --打印变量x 的?
  while @y < 3
   begin
    select @c = 100*@x + @y
    print @c --打印变量c 的?
    select @y = @y + 1
   end
  select @x = @x + 1
  select @y = 1
end


 

--WAITFOR
--?{待1 时2 分零3 U后才执行SELECT 语句
waitfor delay ?1:02:03?
select * from employee
--?{到晚上11 炚w8 分后才执行SELECT 语句
waitfor time ?3:08:00?
select * from employee



 

***SELECT***


 

   select *(列名) from table_name(表名) where column_name operator value
   ex:(宿主)
  select * from stock_information where stockid   = str(nid)
     stockname = 'str_name'
     stockname like '% find this %'
     stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
     stockname like '[^F-M]%'   --------- (^排除指定范围)
     --------- 只能在用like关键字的where子句中用通配W?
     or stockpath = 'stock_path'
     or stocknumber < 1000
     and stockindex = 24
     not stock*** = 'man'
     stocknumber between 20 and 100
     stocknumber in(10,20,30)
     order by stockid desc(asc) --------- 排序Qdesc-降序Qasc-升序
     order by 1,2 --------- by列号
     stockname = (select stockname from stock_information  where stockid  = 4)
     --------- 子查?
     --------- 除非能确保内层select只返回一个行的|
     --------- 否则应在外层where子句中用一个in限定W?
  select distinct column_name form table_name --------- distinct指定索独有的列|不重?
  select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
  select stockname , "stocknumber" = count(*) from table_name group by stockname
                                      --------- group by 表按行分组,指定列中有相同的?
          having count(*) = 2  ---------  having选定指定的组
        
  select *
  from table1, table2                  
  where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
     table1.id =* table2.id -------- 叛_部连?


 

  select stockname from table1
  union [all]  -----  union合ƈ查询l果集,all-保留重复?
  select stockname from table2


 

***insert***


 

  insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
              value (select Stockname , Stocknumber from Stock_table2)---value为select语句


 

***update***


 

  update table_name set Stockname = "xxx" [where Stockid = 3]
         Stockname = default
         Stockname = null
         Stocknumber = Stockname + 4


 

***delete***


 

  delete from table_name where Stockid = 3
  truncate table_name ----------- 删除表中所有行Q仍保持表的完整?
  drop table table_name --------------- 完全删除?


 

***alter table*** --- 修改数据库表l构


 

  alter table database.owner.table_name add column_name char(2) null .....
  sp_help table_name ---- 昄表已有特?
  create table table_name (name char(20), age smallint, lname varchar(30))
  insert into table_name select ......... ----- 实现删除列的ҎQ创建新表)
  alter table table_name drop constraint Stockname_default ---- 删除Stockname的defaultU束
    
***function(/*常用函数*/)***


 

----l计函数----
AVG    --求^均?
COUNT   --l计数目
MAX    --求最大?
MIN    --求最?
SUM    --求和


 

--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id


 

--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
  from employee)


 

--STDEV()
--STDEV()函数q回表达式中所有数据的标准?


 

--STDEVP()
--STDEVP()函数q回M标准?


 

--VAR()
--VAR()函数q回表达式中所有值的l计变异?


 

--VARP()
--VARP()函数q回M变异?


 

----术函数----


 

/***三角函数***/
SIN(float_expression) --q回以弧度表C的角的正u
COS(float_expression) --q回以弧度表C的角的余u
TAN(float_expression) --q回以弧度表C的角的正切
COT(float_expression) --q回以弧度表C的角的余切
/***反三角函?**/
ASIN(float_expression) --q回正u是FLOAT 值的以弧度表C的?
ACOS(float_expression) --q回余u是FLOAT 值的以弧度表C的?
ATAN(float_expression) --q回正切是FLOAT 值的以弧度表C的?
ATAN2(float_expression1,float_expression2)
        --q回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
                       --把弧度{换ؓ角度q回与表辑ּ相同的数据类型可?
        --INTEGER/MONEY/REAL/FLOAT cd
RADIANS(numeric_expression) --把角度{换ؓ弧度q回与表辑ּ相同的数据类型可?
        --INTEGER/MONEY/REAL/FLOAT cd
EXP(float_expression)  --q回表达式的指数?
LOG(float_expression)  --q回表达式的自然Ҏ?
LOG10(float_expression)--q回表达式的?0 为底的对数?
SQRT(float_expression) --q回表达式的qx?
/***取近似值函?**/
CEILING(numeric_expression)  --q回>=表达式的最整数返回的数据cd与表辑ּ相同可ؓ
        --INTEGER/MONEY/REAL/FLOAT cd
FLOOR(numeric_expression)    --q回<=表达式的最整数返回的数据cd与表辑ּ相同可ؓ
        --INTEGER/MONEY/REAL/FLOAT cd
ROUND(numeric_expression)    --q回以integer_expression 为精度的四舍五入D回的数据
        --cd与表辑ּ相同可ؓINTEGER/MONEY/REAL/FLOAT cd
ABS(numeric_expression)      --q回表达式的l对D回的数据cd与表辑ּ相同可ؓ
        --INTEGER/MONEY/REAL/FLOAT cd
SIGN(numeric_expression)     --试参数的正负号q回0 零? 正数?1 负数q回的数据类?
        --与表辑ּ相同可ؓINTEGER/MONEY/REAL/FLOAT cd
PI()       --q回gؓπ ?.1415926535897936
RAND([integer_expression])   --用Q选的[integer_expression]做种子值得?-1 间的随机点?


 


----字符串函?---
ASCII()         --函数q回字符表达式最左端字符的ASCII 码?
CHAR()   --函数用于ASCII 码{换ؓ字符
    --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL ?
LOWER()   --函数把字W串全部转换为小?
UPPER()   --函数把字W串全部转换为大?
STR()   --函数把数值型数据转换为字W型数据
LTRIM()   --函数把字W串头部的空格去?
RTRIM()   --函数把字W串N的空格去?
LEFT(),RIGHT(),SUBSTRING()  --函数q回部分字符?
CHARINDEX(),PATINDEX()  --函数q回字符串中某个指定的子串出现的开始位|?
SOUNDEX()  --函数q回一个四位字W码
    --SOUNDEX函数可用来查扑֣音相似的字符串但SOUNDEX函数Ҏ字和汉字均只q回0 ?nbsp;   
DIFFERENCE()    --函数q回由SOUNDEX 函数q回的两个字W表辑ּ的值的差异
    --0 两个SOUNDEX 函数q回值的W一个字W不?
    --1 两个SOUNDEX 函数q回值的W一个字W相?
    --2 两个SOUNDEX 函数q回值的W一二个字符相同
    --3 两个SOUNDEX 函数q回值的W一二三个字W相?
    --4 两个SOUNDEX 函数q回值完全相?
                                      


 

QUOTENAME()  --函数q回被特定字W括h的字W串
/*select quotename('abc', '{') quotename('abc')
q行l果如下
----------------------------------{
{abc} [abc]*/


 

REPLICATE()     --函数q回一个重复character_expression 指定ơ数的字W串
/*select replicate('abc', 3) replicate( 'abc', -2)
q行l果如下
----------- -----------
abcabcabc NULL*/


 

REVERSE()       --函数指定的字符串的字符排列序颠?
REPLACE()       --函数q回被替换了指定子串的字W串
/*select replace('abc123g', '123', 'def')
q行l果如下
----------- -----------
abcdefg*/


 

SPACE()   --函数q回一个有指定长度的空白字W串
STUFF()   --函数用另一子串替换字符串指定位|长度的子串


 


----数据cd转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])


 

select cast(100+99 as char) convert(varchar(12), getdate())
q行l果如下
------------------------------ ------------
199   Jan 15 2000


 

----日期函数----
DAY()   --函数q回date_expression 中的日期?
MONTH()   --函数q回date_expression 中的月䆾?
YEAR()   --函数q回date_expression 中的q䆾?
DATEADD(<datepart> ,<number> ,<date>)
    --函数q回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
    --函数q回两个指定日期在datepart 斚w的不同之?
DATENAME(<datepart> , <date>)  --函数以字W串的Ş式返回日期的指定部分
DATEPART(<datepart> , <date>)  --函数以整数值的形式q回日期的指定部?
GETDATE()  --函数以DATETIME 的缺省格式返回系l当前的日期和时?


 

----pȝ函数----
APP_NAME()      --函数q回当前执行的应用程序的名称
COALESCE()  --函数q回众多表达式中W一个非NULL 表达式的?
COL_LENGTH(<'table_name'>, <'column_name'>) --函数q回表中指定字段的长度?
COL_NAME(<table_id>, <column_id>)   --函数q回表中指定字段的名U即列名
DATALENGTH() --函数q回数据表达式的数据的实际长?
DB_ID(['database_name']) --函数q回数据库的~号
DB_NAME(database_id)  --函数q回数据库的名称
HOST_ID()     --函数q回服务器端计算机的名称
HOST_NAME()     --函数q回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中用用于插入一个identity column列到新表?
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE()  --函数判断所l定的表辑ּ是否为合理日?
ISNULL(<check_expression>, <replacement_value>) --函数表辑ּ中的NULL 值用指定值替?
ISNUMERIC()  --函数判断所l定的表辑ּ是否为合理的数?
NEWID()   --函数q回一个UNIQUEIDENTIFIER cd的数?
NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL D不相{时则返回expression1 的?


_֦SQL语句

_֦SQL语句
说明Q复制表(只复制结?源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
说明Q拷贝表(拯数据,源表名:a 目标表名Qb)
SQL: insert into b(a, b, c) select d,e,f from b;
说明Q显C文章、提交h和最后回复时?
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明Q外q接查询(表名1Qa 表名2Qb)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
说明Q日E安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时?getdate())>5

说明Q两张关联表Q删除主表中已经在副表中没有的信?
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
说明Q?-
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,
WHERE X.NUM = Y.NUM Q?Q?
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM
说明Q?-
SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and pdU?'"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源?高考Ll?
说明Q?
从数据库中去一q的各单位电话费l计(电话费定额贺电化肥清单两个表来源Q?
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
说明Q四表联查问题:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
说明Q得到表中最的未用的ID?
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)



]]>
Oracle常用函数列表速查http://www.tkk7.com/yrj11320/articles/17442.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 30 Oct 2005 09:12:00 GMThttp://www.tkk7.com/yrj11320/articles/17442.htmlhttp://www.tkk7.com/yrj11320/comments/17442.htmlhttp://www.tkk7.com/yrj11320/articles/17442.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/17442.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/17442.html
  函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓSQL或PL/SQL语句Q函C要分Z大类Q?
   单行函数

   l函?

  本文讨论如何利用单行函C及用规则?BR>
  SQL中的单行函数

  SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?BR>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)

  单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?BR>
  NULL和单行函?BR>
  在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ他能直接处理NULL|NVL有两个参敎ͼNVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?BR>
  下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2

  不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?BR>update empset salary=(salary+bonus)*1.1

  q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃得出错误的结论,q个时候就要用nvl函数来排除null值的影响?BR>所以正的语句是:
update empset salary=(salary+nvl(bonus,0)*1.1
单行字符串函?BR>
  单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串

  ASCII()
   c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122

  CHR(QiQ?[NCHAR_CS]
   i是一个数字,函数q回十进制表C的字符
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B

  CONCAT(,)
   c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?BR>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda

  INITCAP()
   c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?BR>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici

  INSTR(,[,QiQ[,]])
   c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2

  INSTRB(,[,i[,j])
   与INSTRQ)函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()

  LENGTH()
   c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?BR>select LENGTH('Ipso Facto') ergo from dualergo10

  LENGTHb()
   与LENGTH()一Pq回字节?BR>
  lower()
   q回c的小写字W,l常出现在where子串?BR>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite

  LPAD(,QiQ[,])
   c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见RPAD?BR>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe

  LTRIM(,)
   把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?BR>select LTRIM('Mississippi','Mis') from dualLTRppi

  RPAD(,QiQ[,])
   在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与LPAD怼
RTRIM(,)
   把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?BR>
  REPLACE(,[,])
   c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?BR>select REPLACE('uptown','up','down') from dualREPLACEdowntown

 STBSTR(,QiQ[,])
   c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?BR>select SUBSTR('Message',1,4) from dualSUBSMess


  SUBSTRB(,QiQ[,])
   与SUBSTR大致相同Q只是I,J是以字节计算?BR>
  SOUNDEX()
   q回与c1发音怼的词
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250

  TRANSLATE(,,)
   c1中与c2相同的字W以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble

  TRIM([[]] from c3)
   c3串中的第一个,最后一个,或者都删除?BR>select TRIM(' space padded ') trim from dual TRIMspace padded

  UPPER()
   q回c1的大写,常出现where子串?BR>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
单行数字函数

  单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?BR>
  ABS()
   q回n的绝对?BR>
  ACOS()
   反余玄函敎ͼq回-1?之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0

  ASIN()
   反正玄函敎ͼq回-1?Qn表示弧度

  ATAN()
   反正切函敎ͼq回n的反正切|n表示弧度?BR>
  CEIL()
   q回大于或等于n的最整数?BR>
  COS()
   q回n的余玄|n为弧?BR>
  COSH()
   q回n的双曲余玄|n 为数字?BR>select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847

  EXP()
   q回e的nơ幂Qe=2.71828183.

  FLOOR()
   q回于{于N的最大整数?BR>
  LN()
   q回N的自然对敎ͼN必须大于0

  LOG(,)
   q回以n1为底n2的对?BR>
  MOD()
   q回n1除以n2的余敎ͼ

  POWER(,)
   q回n1的n2ơ方

  ROUND(,)
   q回舍入数点右边n2位的n1的|n2的缺省gؓ0Q这回将数Ҏ接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?BR>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54

  SIGN()
   如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0.

  SINQ?
   q回n的正玄?n为弧度?BR>

  SINH()
   q回n的双曲正玄?n为弧度?BR>
  SQRT()
   q回n的^Ҏ,n为弧?BR>
  TANQ?
   q回n的正切?n为弧?BR>
  TANH()
   q回n的双曲正切?n为弧?BR>
  TRUNC(,)
   q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时会将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?BR>
 单行日期函数


  单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?BR>
  ADD_MONTHS(,QiQ?
   q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会截去数点后面的部分?BR>
  LAST_DAY()
   函数q回包含日期d的月份的最后一?

  MONTHS_BETWEEN(,)
   q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则会返回的l果包含一个分数?BR>
  NEW_TIME(,,)
   d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?BR>NEXT_DAY(,)
   q回日期d后由dowl出的条件的W一天,dow使用当前会话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?BR>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004

  ROUND([,])
   日期d按照fmt指定的格式舍入,fmt为字W串?BR>
  SYADATE
   函数没有参数Q返回当前日期和旉?BR>
  TRUNC([,])
   q回由fmt指定的单位的日期d.
单行转换函数

  单行转换函数用于操作多数据类型,在数据类型之间进行{换?BR>
  CHARTORWID()
   c 使一个字W串Q函数将c转换为RWID数据cd?BR>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')

  CONVERT(,[,])
   c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓdset字符集,sset的缺省设|ؓ数据库的字符集?BR>
  HEXTORAW()
   x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?BR>
  RAWTOHEX()
   x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ16q制的数据类型?BR>
  ROWIDTOCHAR()
   函数ROWID数据cd转换为CHAR数据cd?BR>

  TO_CHAR([[,)
   x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及货币W号?BR>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"

  TO_DATE([,[,Q?BR>   c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?BR>
  TO_MULTI_BYTE()
   c表示一个字W串Q函数将c的担子截字符转换成多字节字符?BR>
  TO_NUMBER([,[,)
   c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?BR>
  TO_SINGLE_BYTE()
   字W串c中得多字节字W{化成{h的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?BR>
  其它单行函数

  BFILENAME(
,)
   dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?BR>
  DECODE(,,[,,,[])
   x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?BR>
  DUMP(,[,[,[,]]])
   x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?BR>

  EMPTY_BLOB()
   该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?BR>
  EMPTY_CLOB()
   该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?BR>
  GREATEST()
   exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?BR>
 LEAST()
   exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?


  UID
   该函数没有参敎ͼq回唯一标示当前数据库用L整数?BR>
  USER
   q回当前用户的用户名

  USERENV()
   Zoptq回包含当前会话信息。opt的可选gؓQ?BR>
  ISDBA    会话中SYSDBA脚色响应Q返回TRUE
   SESSIONID  q回审计会话标示W?BR>   ENTRYID   q回可用的审计项标示W?
   INSTANCE  在会话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?BR>   LANGUAGE  q回语言、地域、数据库讄的字W集?BR>   LANG    q回语言名称的ISO~写?BR>   TERMINAL  为当前会话用的l端或计机q回操作pȝ的标C符?BR>
  VSIZE()
   x是一个表辑ּ。返回x内部表示的字节数?BR>SQL中的l函?BR>
  l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.

  l(多行Q函?BR>
  与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?BR>
  AVG([{DISYINCT|ALL}])
   q回数值的q_倹{缺省设|ؓALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413

  COUNT({*|DISTINCT|ALL} )
   q回查询中行的数目,~省讄是ALL,*表示q回所有的行?BR>
  MAX([{DISTINCT|ALL}])
   q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?BR>
  MIN([{DISTINCT|ALL}])
   q回选择列表目的最倹{?BR>
  STDDEV([{DISTINCT|ALL}])
   q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?BR>
  SUM([{DISTINCT|ALL}])
   q回选择列表目的数值的d?BR>
  VARIANCE([{DISTINCT|ALL}])
   q回选择列表目的统计方差?BR>
  用GROUP BYl数据分l?BR>
  正如题目暗示的那L函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ一cR?BR>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982

  在这个例子中Q我们用state字段分类Q如果我们要结果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?BR>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982

 用HAVING子句限制分组数据

  现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

  q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ是用HAVING语句Q?BR>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;

  嵌套函数

  函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?BR>
  嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?BR>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2



]]>
解决MVC下分|C的问题http://www.tkk7.com/yrj11320/articles/16909.html不胖用砖?/dc:creator>不胖用砖?/author>Wed, 26 Oct 2005 10:40:00 GMThttp://www.tkk7.com/yrj11320/articles/16909.htmlhttp://www.tkk7.com/yrj11320/comments/16909.htmlhttp://www.tkk7.com/yrj11320/articles/16909.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/16909.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/16909.html阅读全文

]]>
JSP分页技术实?/title><link>http://www.tkk7.com/yrj11320/articles/16908.html</link><dc:creator>不胖用砖?/dc:creator><author>不胖用砖?/author><pubDate>Wed, 26 Oct 2005 10:35:00 GMT</pubDate><guid>http://www.tkk7.com/yrj11320/articles/16908.html</guid><wfw:comment>http://www.tkk7.com/yrj11320/comments/16908.html</wfw:comment><comments>http://www.tkk7.com/yrj11320/articles/16908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrj11320/comments/commentRss/16908.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrj11320/services/trackbacks/16908.html</trackback:ping><description><![CDATA[     摘要: 目前比较q泛使用的分|式是查询结果缓存在HttpSession或有状态bean中,页的时候从~存中取Z|据显C。这U方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一ơ查询遍历结果集会耗费很长旉Qƈ且缓存的数据也会占用大量内存Q效率明显下降。  其它常见的方法还有每ơ翻都查询一ơ数据库Q从ResultSet中只取出一|据(使用rs.last();rs.g...  <a href='http://www.tkk7.com/yrj11320/articles/16908.html'>阅读全文</a><img src ="http://www.tkk7.com/yrj11320/aggbug/16908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrj11320/" target="_blank">不胖用砖?/a> 2005-10-26 18:35 <a href="http://www.tkk7.com/yrj11320/articles/16908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE应用中与Oracle数据库的q接(OCI方式、thin方式和JdbcOdbc桥方?http://www.tkk7.com/yrj11320/articles/16587.html不胖用砖?/dc:creator>不胖用砖?/author>Mon, 24 Oct 2005 07:04:00 GMThttp://www.tkk7.com/yrj11320/articles/16587.htmlhttp://www.tkk7.com/yrj11320/comments/16587.htmlhttp://www.tkk7.com/yrj11320/articles/16587.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/16587.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/16587.html
一、本地通过JDBC获得Oracle数据库连?

通过JDBC获得Oracle数据库连接,有三U方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库Q如果在本地安装了Oracle数据库客L可以采用该方式;而thin方式为纯java的数据库q接方式QJdbcOdbc桥方式依赖于本地ODBC数据库源的配|,q种方式一般不太被采用?

1、OCI方式

先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到?jdbc/lib/classes12.zip文gQ我们在环境变量classpath中设|classes12.zip所在的路径?

然后通过以下的数据库q接c,在本地通过OCI方式获得Oracle数据库连?

/**
* 在本地获得数据库q接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过OCI方式获得Oracle数据库连?
*/
public class DbConnection
{
final static String sDBDriver = "oracle.jdbc.driver.OracleDriver";
final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199";

/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连?
*/
public java.sql.Connection connectDbByOci()
{
java.sql.Connection conn=null;
try
{
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr);
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}
在连接字W串 "jdbc:oracle:oci8:sr/sr@ora199" 中,"sr/sr"为Oracle用户的用户名和口令,"ora199"为数据库服务名?

2、thin方式

先到Oracle技术网Qhttp://otn.oracle.com/global/cn/software/tech/java/sqlj_jdbc/index.htmlQ下载Oracle JDBC DriversQ同样地下载后的zip文g的\径设|在环境变量classpath?

然后通过以下的数据库q接c,在本地通过thin方式获得Oracle数据库连接?

/**
* 在本地获得数据库q接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过thin方式获得Oracle数据库连?
*/
public class DbConnection
{
private String sConnStr = "";

/**
* ~省构造器
*/
public DbConnection()
{
sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199";
}

/**
* @param ip,serviceName
*/
public DbConnection(String ip,String serviceName)
{
sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName;
}

/**
* 通过thin方式获得Oracle数据库的q接.
*/
public java.sql.Connection connectDbByThin()
{
java.sql.Connection conn=null;
try
{
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr,"sr","sr");
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}

/**

* 通过thin方式获得Oracle数据库的q接.
* @param userId,password
*/
public java.sql.Connection connectByJdbc(String userId,String password)
{
java.sql.Connection conn=null;
try
{
Class.forName(sDBDriver);
conn = DriverManager.getConnection(sConnStr,userId,password);
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}
q种方式q用h比较灉|Q简单,h较强的移植性和适用性。只要注意连接字W串"jdbc:oracle:thin:@10.1.4.199:1521:ora199"中具体参数的讄卛_

3、JdbcOdbc桥方?

先通过理工具中的数据源来d本地对Oracle数据库的q接Q然后通过以下的数据库q接c,在本地通过JdbcOdbc桥方式获得Oracle数据库连接?

/**
* 在本地获得数据库q接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过JdbcOdbc桥方式获得Oracle数据库连?
*/
public class DbConnection
{
/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连?
*/
public java.sql.Connection connectDbByJdbcOdbcBridge()
{
java.sql.Connection conn=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:odbc:ora199","sr","sr");
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}
在getConnectionҎ中第一个参?jdbc:odbc:ora199" 中的"ora199"为本地ODBC数据源的数据源名UͼW二个参数和W三个参数分别ؓOracle的用户名和口令?

二、通过q接池获得Oracle数据库连?

q部分主要讲q在iPlanet Application Server 6.5和Sun Java System Application Server 7中Oracle数据库连接池的配|,以及在应用中如何通过q接池获得数据库的连接?

1、iPlanet Application Server 6.5q接池的配置

先打开iPlanet Application Server 6.5的管理控制台Q选中"database"面板Q再选择"External JDBC Drivers"选项后,点击"Add?按钮Q在弹出的对话框中,d一个名?ora-type4"的JDBC Driver?


Driver ClasspathQ该参数填写classes12.zip文g的物理\径?

然后?External JDBC DataSources"中选择"Add?Q在弹出的对话框中添加一个JNDI名称?credit2"的数据源?


DriverTypeQ选择刚添加好?ora-type4"Q?

DatasourceQora199QؓOracle数据库服务名Q?

DatasourceQora199QؓOracle数据库服务名Q?

Connection Pool ParametersQ图中显C的是缺省设|,可以Ҏ自己环境情况来更改这些设|?

保存完设|后Q在"DataSource Selection Box"中,选择刚添加的"credit2"数据源,再选择"Vendor Specific Properties"按钮。在对话中添加一个URL属性?


xQiPlanet Application Server 6.5中的数据库连接池配置完毕Q重h务之生效?

2、Sun Java System Application Server 7q接池的配置

在配|之前将classes12.zip文g|于?server1/lib目录下。通过览器的4848端口打开Sun Java System Application Server 7的管理界面,选择"server1"->"JDBC"-> "Connection Pools"下的"New?


d一个名UCؓ"MyConnectionPool"的Oracle数据库连接池?Next"下一步?


?General"中填?Datasource Classname"?


?Properties"中将不需要的属性删除,同时d"URL"属性?

"dataSourceName"中填写Oracle数据库服务名?

以下q接池的~省讄Q可以根据自q境的情况作相应的调整?BR>
选择"Finish"完成q接池的讄?

下一步ؓ"MyConnectionPool"q接池创Z个JNDIQ以便应用程序能够通过该名U获得连接池中的q接?"server1"->"JDBC"-> "JDBC Resources"下的"New?


xQSun Java System Application Server7中的数据库连接池配置完毕Q重h务之生效?

3、通过q接池获得连?

以上在iPlanet Application Server 6.5和Sun Java System Application Server7中配|的q接池都可以通过以下的数据库q接c,从连接池中获得Oracle数据库连接?

/**
* 从连接池中获得数据库q接
*/

package com.j2ee.db;

import java.util.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;

/**
* 通过q接池方式获得Oracle数据库连?
*/
public class DbConnection
{
/**
*
*/
public DbConnection()
{
}

/**
* 获得Oracle数据库连?
*/
public java.sql.Connection connectDbByConnectionPool()
{
java.sql.Connection conn=null;
try
{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/credit2");
conn=ds.getConnection();
}
catch (Exception e)
{
System.out.println("ERROR:"+e.getMessage());
}
return conn;
}
}
4、用连接池的优点用连接池的优点主要体现在两个斚wQ对数据库的q接l一q行配置、管理、监控,以及Ҏ据库q接池的参数q行优化调整Q?br>同时对应用中没有关闭或其他原因造成没有关闭的数据库q接p接池l一q行理。便于应用的UL和后端数据库的切换,
因ؓ在应用中通过l一的JNDI获得数据库的q接Q而具体连接的是哪一台机器上的数据库与应用无?img src ="http://www.tkk7.com/yrj11320/aggbug/16587.html" width = "1" height = "1" />

]]>
Struts框架 http://www.tkk7.com/yrj11320/articles/16491.html不胖用砖?/dc:creator>不胖用砖?/author>Sun, 23 Oct 2005 12:49:00 GMThttp://www.tkk7.com/yrj11320/articles/16491.htmlhttp://www.tkk7.com/yrj11320/comments/16491.htmlhttp://www.tkk7.com/yrj11320/articles/16491.html#Feedback0http://www.tkk7.com/yrj11320/comments/commentRss/16491.htmlhttp://www.tkk7.com/yrj11320/services/trackbacks/16491.html阅读全文

]]>
EJB的核心技术应?/title><link>http://www.tkk7.com/yrj11320/articles/16474.html</link><dc:creator>不胖用砖?/dc:creator><author>不胖用砖?/author><pubDate>Sun, 23 Oct 2005 06:50:00 GMT</pubDate><guid>http://www.tkk7.com/yrj11320/articles/16474.html</guid><wfw:comment>http://www.tkk7.com/yrj11320/comments/16474.html</wfw:comment><comments>http://www.tkk7.com/yrj11320/articles/16474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrj11320/comments/commentRss/16474.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrj11320/services/trackbacks/16474.html</trackback:ping><description><![CDATA[一、EJB技术简?nbsp;<BR>  EJB的全U是Enterprise java bean。是JAVA中的商业应用lg技术。EJBl构中的角色 EJB lgl构是基于组件的分布式计结构,是分布式应用pȝ中的lg?BR>  一个完整的ZEJB的分布式计算l构由六个角色组成,q六个角色可以由不同的开发商提供Q每个角色所作的工作必须遵@Sun公司提供的EJB规范Q以保证彼此之间的兼Ҏ。这六个角色分别是EJBlg开发?Enterprise Bean Provider) 、应用组合?Application Assembler)、部|?Deployer)、EJB 服务器提供?EJB Server Provider)、EJB 容器提供?EJB Container Provider)、系l管理员(System Administrator)Q?BR>  二、EJB中各角色的分?BR>  1、EJBlg开发?Enterprise Bean Provider)<BR>  EJBlg开发者负责开发执行商业逻辑规则的EJBlgQ开发出的EJBlg打包成ejb-jar文g。EJBlg开发者负责定义EJB的remote和home接口Q编写执行商业逻辑的EJB class,提供部vEJB的部|文?deployment descriptor)。部|文件包含EJB的名字,EJB用到的资源配|,如JDBC{。EJBlg开发者是典型的商业应用开发领域专家?BR>  EJBlg开发者不需要精通系l的编E,因此Q不需要知道一些系l的处理细节,如事务、同步、安全、分布式计算{?BR>  2、应用组合?Application Assembler)<BR>  应用l合者负责利用各UEJBl合一个完整的应用pȝ。应用组合者有旉要提供一些相关的E序Q如在一个电子商务系l里Q应用组合者需要提供JSP(Java Server Page)E序?BR>  应用l合者必L握所用的EJB的home和remote接口Q但不需要知道这些接口的实现?BR>  3、部|?Deployer)<BR>  部v者负责将ejb-jar文g部v到用Lpȝ环境中。系l环境包含某UEJB Server和EJB Container。部|者必M证所有由EJBlg开发者在部v文g中声明的资源可用Q例如,部v者必配|好EJB所需的数据库资源?BR>  部vq程分两步:部v者首先利用EJB Container提供的工L成一些类和接口,使EJB Container能够利用q些cd接口在运行状态管理EJB?nbsp;部v者安装EJBlg和其他在上一步生成的cdEJB Container中?nbsp;部v者是某个EJBq行环境的专家?BR>  某些情况下,部v者在部v时还需要了解EJB包含的业务方法,以便在部|完成后Q写一些简单的E序试?BR>  4、EJB 服务器提供?EJB Server Provider)<BR>  EJB 服务器提供者是pȝ领域的专Ӟ_N分布式交易理Q分布式对象理及其它系l的服务。EJB 服务器提供者一般由操作pȝ开发商、中间g开发商或数据库开发商提供?BR>  在目前的EJB规范中,假定EJB 服务器提供者和EJB 容器提供者来自同一个开发商Q所以,没有定义EJB 服务器提供者和EJB容器提供者之间的接口标准?BR>  5、EJB 容器提供?EJB Container Provider)<BR>  EJB 容器提供者提供以下功能:<BR>  提供EJB部v工具为部|好的EJBlg提供q行环境 。EJB容器负责为EJB提供交易理Q安全管理等服务?BR>  EJB 容器提供者必LpȝU的~程专家Q还要具备一些应用领域的l验。EJB 容器提供者的工作主要集中在开发一个可伸羃的,h交易理功能的集成在EJB 服务器中的容器。EJB 容器提供者ؓEJBlg开发者提供了一l标准的、易用的API讉KEJB 容器QEJBlg开发者不需要了解EJB服务器中的各U技术细节?BR>  EJB容器提供者负责提供系l监工L来实时监EJB容器和运行在容器中的EJBlg状态?BR>  6、系l管理员(System Administrator)<BR>  pȝ理员负责ؓEJB服务器和容器提供一个企业的计和|络环境?BR>  pȝ理员负责利用EJB 服务器和容器提供的监管理工LEJBlg的运行情c?BR>  三、EJB的体pȝ构:<BR>  EJB分布式应用程序是Z对象lg模型的,低层的事务服务用了API技术。EJB技术简化了用JAVA语言~写的企业应用系l的开发,配置。EJB技术定义了一l可重用的组ӞEnterprise Beans。你可以利用q些lgQ象搭积木一L建立你的分布式应用程序。当你把代码写好之后Q这些组件就被组合到特定的文件中厅R每个文件有一个或多个Enterprise BeansQ在加上一些配|参数。最后,q些Enterprise Beans被配|到一个装了EJB容器的^C。客戯够通过q些Beans的home接口Q定位到某个beansQƈ产生q个beans的一个实例。这P客户p够调用Beans的应用方法和q程接口?BR>  EJB服务器作为容器和低层q_的桥梁管理着EJB容器和函数。它向EJB容器提供了访问系l服务的能力。例如:数据库的理和事务的理Q或者对于其它的Enterprise的应用服务器。所有的EJB 实例都运行在EJB容器中。容器提供了pȝU的服务Q控制了EJB的生命周期。EJB中的有一些易于用的理工具如:Security--配置描述器(The Deployment descriptorQ定义了客户能够讉K的不同的应用函数。容器通过只允许授权的客户讉Kq些函数来达到这个效果。Remote Connectivity--容器E链接管理着低层的通信issuesQ而且对Enterprise Beas的开发者和客户都隐藏了通信l节。EJB的开发者在~写应用Ҏ的时候,p是在条用本地的^CL。客户也不清楚他们调用的Ҏ可能是在q程被处理的。Life Cycle managment--客户单的创徏一个Enterprise beans的实例,q常取消一个实例。而容器管理着Enterprise Beans的实例,使Enterprise Beans实现最大的效能和内存利用率。容器能够这hȀzd使Enterprise Beans失效Q保持众多客户共享的实例池。等{。  Trasction management-配置描述器定义了Enterprise beans 的事务处理的需求。容器管理着那些理分布式事务处理的复杂的issues。这些事务可能要在不同的q_之间更新数据库。容器ɘq些事务之间互相独立Q互不干扰。保证所有的更新数据库都是成功发生的Q否者,回滚到事务处理之前的状态?BR>  EJB lg是基于分布式事务处理的企业应用E序的组件。所有的EJB都有如下的特点:EJB包含了处理企业数据的应用逻辑。定义了EJB的客L面。这L界面不受容器和服务器的媄响。于是,当一个EJB被集合到一个应用程序中LQ不用更改代码和重新~译。EJB能够被定?nbsp;各种pȝU的服务Q例如安全和事务处理的特性,都不是属于EJBcȝ。而是由配|和l装应用E序的工h实现?nbsp;有两U类型的EJB: Session beans ?nbsp;entity beans.Session beans是一U作为单用户执行的对象。作为对q程的Q务请求的相应Q容器生一个Session beans 的实例。一个Session beans有一个用?从某U程度上来说Q一个Session bean 对于服务器来说就代表了它的那个用?Session beans 也能用于事务Q它能够更新׃n的数据,但它不直接描l这些共享的数据。Session beans 的生命周期是相对较短的。典型的是,只有当用户保持会话的时候,Session beans 才是zȝ的。一旦用户退ZQSession beans ׃再与用户相联pM。Session beans被看成是瞬时的,因ؓ如果容器崩溃了,那么用户必须重新建立一个新的Session对象来l会话?BR>  Session bean典型的声明了与用L互操作或者会话。也是_Session bean了在客户会话期间Q通过Ҏ的调用,掌握用户的信息。一个具有状态的Session beanUCؓ有状态的Session bean.当用L止与Session beans互操作的时?会话l止了,而且Qbean 也不再拥有状态倹{Session bean也可能是一个无状态的 session bean.无状态的Session beansq不掌握它的客户的信息或者状态。用戯够调用beans的方法来完成一些操作。但是,beans只是在方法调用的时候才知道用户的参数变量。当Ҏ调用完成以后Qbeansq不l箋保持q些参数变量。这P所有的无状态的session beans的实例都是相同的Q除非它正在Ҏ调用期间。这P无状态的Session beansp够支持多个用?容器能够声明一个无状态的Session beans.能够Q何Session beans指定lQ何用?<BR>  Entity BeansҎ据库中的数据提供了一U对象的视图。例如:一个Entity bean能够模拟数据库表中一行相关的数据。多个client能够׃n讉K同一个Entity bean.多个client也能够同时的讉K同一个Entity bean.Entity beans通过事务的上下文来访问或更新下层的数据。这P数据的完整性就能够被保证。Entity Beans能存zȝҎ长的旉Qƈ且状态是持箋的。只要数据库中的数据存在QEntity beans׃直存zR而不是按照应用程序或者服务进E来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或?nbsp;Beans自己理。如果由容器控制着保证 Entity beans持箋的issus。如果由Beans自己理Q就必须写Entity beans的代码,包括讉K数据库的调用?BR>  Entity Beans是由主键Qprimary key 一U唯一的对象标识符Q标识的。通常Q主键与标识数据库中的一块数据,例如一个表中的一行,的主键是相同的。主键是client能够定位特定的数据块?BR>  四、开发EJB<BR>  1、类介绍Q?BR>  开发EJB的主要步骤一般来_整个的开发步骤(开发,配置Q组装)包括如下几个斚w。开发:首先要定义三个类QBeancLw,Bean的本地和q程接口cR?nbsp;配置Q配|包括生配|描q器--q是一个XML文g、声明了Enterprise Bean的属性、绑定了bean的class文gQ包括stub文g和skeleton文gQ。最后将q些配置都放C个jar文g中。还需要在配置器中定义环境属性。组装应用程序:包括Enterprise beans安装到Server服务器中Q测试各层的q接情况。程序组装器若q个Enterprise Beans与其它的lgl合h。组合成一个完整的应用E序。或者将若干个Enterprise beansl合成一个复杂的Enterprise Bean。管理Enterprise Bean?nbsp;<BR>  我们必须定义和编写一些EJB中的基本cR如Enterprise beanc:q是Enterprise bean内部应用逻辑的实现。编写Enterprise bean的远E接口类。编写Enterprise bean的本地接口类。说明主键类Q主键类只是对于Entity bean才需要的。在Enterprise bean的配|描q器中指定主键的名字。Enterprise beans提供者定义了q程接口和本地接口,实现了EJBcLw。Remote接口中提供了客户调用EJB实现的应用逻辑函数的接口。而home接口提供了生和定位remote接口实例的方法?nbsp;<BR>  在Enterprise bean本ncȝ实现Q本地home接口Q远Eremote接口之间q没有正式的联系Q例如承关p)。但是,在三个类里声明的Ҏ却必遵守EJB里面定义的规范。例如: 你在Enterprise bean里面声明了一个应用程序的Ҏ或者说应用逻辑。也在beans的remote接口中声明了q个ҎQ那么,q两个地方必要同样的名字。Bean的实现里面必至有一个Create()ҎQejbCreate()。但是可以有多个带有不同参数的create()Ҏ。  在home接口中,也必L相同的方法定义(参数的个数相同)。EjbCreate()Ҏq回的一个容器管理的持久对象。它们都q回一个容器管理持久性的主键倹{但是,在home的相应的Create()Ҏ中返回值的cd是remote接口?BR>  注意Q实体bean的实现的ejbCreateҎ有点不同。实体bean可以不定义ejbCreateҎ。如果实体只是通过应用E序或通过数据库管理程序的途径被加到数据库中,实体beanq略了ejbCreateҎ。EjbCreateq回的值是主键cd。如果ejbCreateҎ是容器管理持久性的实体bean的方法,它的q回值就是NULLcd。如果实体bean实现了Bean理的持久性,ejbCreateҎp回值类型就是主键类型。容器的d是把各接口和Enterprise bean的实现类l合h。保证在~译时和q行Ӟ各接口和实现cL相对应的?nbsp;<BR>  EJB的实现类Q各接口要从不同的基cMl承下来。一个会话bean必须实现基类javax.ejb.SessionBean。而实体bean必须实现基类javax.ejb.EntiyBean。这些EJB的基c都是从javax.ejb.EnterpriseBeanl承而来。而javax.ejb.EnterpriseBean又是从java.io.Serializablel承而来。每一个Enterprise Bean都必L一个remote接口。Remote接口定义了应用程序规定客户可以调用的逻辑操作。这些是一些可以由客户调用的公qҎQ通常由Enterprise beanscL实现。注意,Enterprise bean的客户ƈ不直接访问Bean。而是通过remote接口来访问。Enterprise beancȝremote接口扩展了javax.ejb.EJBObjectcȝ公共java接口。而Javax.ejb.EJBObject是所有remote接口的基cR其代码如下Q?nbsp;<BR>  package javax.ejb; <BR>  public interface EJBObject extends java.rmi.Remote{ <BR>  public EJBHome getEJBHome() throws java.rmi.RemoteException; <BR>  public Object getPrimaryKey() throws java.rmi.RemoteException; <BR>  public void Remove() throws java.rmi.RemtoeException, java.rmi.RemoveException <BR>  public Handle getHandle() throws java.rmi.RemoteException;<BR>  boolean isIdentical (EJBObject p0) throws java.rmi.RemoteException; <BR>  } <BR>  getEJBHome()Ҏ允许你取得一个相关的Home接口。对?nbsp;实体BeanQ用getPrimaryKeyQ)Ҏ获得实体Bean的主键倹{RemoveQ)可以删除一个Enterprise bean。具体的语义在各U不同类型的enterprise beans的生命周期中Q由上下文中解释的。方法getHandleQ)q回了一个Enterprise bean实例的持久的句柄。IsIndentical()Ҏ允许你去比较Enterprise beans是否相同?BR>  2、方法: <BR>  所有的remote接口中的Ҏ必须声明为公共(publicQ的Qƈ必须抛出java.rmi.RemotException异常。另外,所有的remote接口中的Ҏ定义的参数和都必L在RMI-IIOP中有效的。对每一个在remote接口中定义的ҎQ在Enterprise bean c里面都要有相应的方法。相应的Ҏ必须要有同样的名字,同样cd和数量的参数Q同Lq回|而且q要抛出同样的例外?nbsp;如下代码昄了一个ATM例子的会话bean的remote接口AtmQ。里面声明了一个应用方法transferQ)。黑体部分表CEJB规范中必要有的内容。Remote接口必须扩展javax.ejb.EJBObjectcR从客户端调用的Enterprise bean的每一个方法都必须在remote接口中声明。TransferQ)Ҏ抛出了两个意外。其中InSufficientFundsException例外是应用程序定义的意外?nbsp;<BR>  Public interface Atm extends javax.ejb.EJBObject{ <BR>  Public void transfer(String Source, String Target, float amount)<BR>  Throws java.rmi.RemoteException, InSufficientFundsException; <BR>  } <BR>  Home接口必须定义一个或多个的Create()Ҏ。每一个这LCreate()Ҏ都必d名ؓCreate。ƈ且,它的参数Q不是cdq是数量都必Mbeanc里面的ejbCreate()Ҏ对应。注意,home接口中的Create()Ҏ和beancMejbCreate()Ҏ的返回值类型是不同的。实体bean的home接口q包含findQ)Ҏ?nbsp;每一个Home接口都扩展了javax.ejb.EJBHome接口。如下代码显CZjavax.ejb.EJBHome接口的定义: <BR>  package javax.ejb; <BR>  public interface EJBHome extends java.rmi.Remote() { <BR>  void remove(Handle handle) throws java.rmi.RemoteException,RemoveException; <BR>  void remove(Object primarykey) throws java.rmi.RemoteException,RemoveException; <BR>  EJBMetaData getEJBMetaData() throws RemoteException; <BR>  Homehandle getHomeHandle() throws RemoteException; <BR>  }<BR>  q里提供了两个removeQ)Ҏ来删除Enterprise bean的实例。第一个removeҎ是通过句柄来删除一个Enterprise bean的实例。第二个removeҎ通过主键来删除一个Enterprise bean的实例?nbsp;在众多的Enterprise bean实例中,句柄唯一的标识一个实例。一个句柄与它引用的Enterprise bean有相同的生命期。考虑一个实体对象,客户可以通过一个句柄来重新获得相应的Enterprise bean的实例。一个句柄能够对应一个Enterprise bean对象的多个实例。例如,即当Enterprise bean对象所在的L崩溃了,或者Enterprise bean对象在不同的机器之间UdQ句柄仍是有效的。这里的句柄是Serialized句柄Q与CORBA中的字符串化的CORBA对象的引用是怼的概c在EJBHome接口中的W二个remove操作通过其主键来军_要删除的Enterprise bean。主键可以是扩展了Java ObjectcȝMcdQ但是,必须要实现Java的Serializable接口。主键是标识实体bean的主要的Ҏ。通常Q主键是数据库中的一个关键字Q唯一的定义了由实体bean代表的数据?nbsp;<BR>  ҎgetEJBMetaDataQ)q回了Enterprise bean对象的metadata接口。这个接口允许客戯得Enterprise bean的metadata信息。当开发工h~译链接应用E序的时候,或者配|工h配置的时候,可能会用到metadata信息。Javax.ejb.EJBMetadata接口提供了获得javax.ejb.EJBHome接口Qhomec,remote接口Q还有获得主键的Ҏ。也提供了一个isSesson()的方法来定在放q个home接口的对象是会话beanq是实体bean。IsStatelessSession()Ҏ指示q个会话bean是有状态还是无状态的。如下代码显CZjavax.ejb.EJBMetadata接口的定义部分的代码?BR>  Public javax.ejb; Public interface EJBMetaData{ <BR>  EJBHome getEJBHome();<BR>  Class getHomeInterfaceClass(); <BR>  Class getRemoteInterfaceClasss();<BR>  Class getPrimaryKeyClass(); <BR>  Boolean isSession();<BR>  Boolean isStatelesssSession(); <BR>  } <BR>  Ҏ一个CreateQ)ҎQEJB规范定义了如下的命名U定。它的返回值是会话bean的remote接口的类型。方法的名字只能是Create()。对会话beancM的每一个ejbCreate()Ҏ都必L一个Create()与之对应?nbsp;对于每一个Create()Ҏ的参数的cd和数量都必须与会话beancM的ejbCreate()Ҏ相对应。方法必L出java.rmi.RemoteException例外?nbsp;Ҏ必须抛出javax.rmi.CreateExeption例外?nbsp;CreateQ)Ҏ的参数是用来初始化新的会话bean对象的?nbsp;如下代码昄了一个会话bean对象的不同的Create()ҎQ其中必ȝ部分用粗体显C: <BR>  public interface AtmHome extends javax.ejb.EJBHome{ <BR>  Atm create() throws java.rmi.RemoteException,javax.ejb.CreateException; <BR>  Atm create(Profile preferredProfile) <BR>  Throws java.rmi.RemoteExeption,javax.ehrows java.rmi.RemoteException,RemoveException; <BR>  EJBMetaData getEJBMetaData() throws RemoteException; <BR>  Homehandle getHomeHandle() throws RemoteException; <BR>  }<BR>  q里提供了两个removeQ)Ҏ来删除Enterprise bean的实例。第一个removeҎ是通过句柄来删除一个Enterprise bean的实例。第二个removeҎ通过主键来删除一个Enterprise bean的实例。在众多的Enterprise bean实例中,句柄唯一的标识一个实例。一个句柄与它引用的Enterprise bean有相同的生命期。考虑一个实体对象,客户可以通过一个句柄来重新获得相应的Enterprise bean的实例。一个句柄能够对应一个Enterprise bean对象的多个实例。例如,即当Enterprise bean对象所在的L崩溃了,或者Enterprise bean对象在不同的机器之间UdQ句柄仍是有效的。这里的句柄是Serialized句柄Q与CORBA中的字符串化的CORBA对象的引用是怼的概c?nbsp;<BR>  在EJBHome接口中的W二个remove操作通过其主键来军_要删除的Enterprise bean。主键可以是扩展了Java ObjectcȝMcdQ但是,必须要实现Java的Serializable接口。主键是标识实体bean的主要的Ҏ。通常Q主键是数据库中的一个关键字Q唯一的定义了由实体bean代表的数据。方法getEJBMetaDataQ)q回了Enterprise bean对象的metadata接口。这个接口允许客戯得Enterprise bean的metadata信息。当开发工h~译链接应用E序的时候,或者配|工h配置的时候,可能会用到metadata信息。Javax.ejb.EJBMetadata接口提供了获得javax.ejb.EJBHome接口Qhomec,remote接口Q还有获得主键的Ҏ。也提供了一个isSesson()的方法来定在放q个home接口的对象是会话beanq是实体bean。IsStatelessSession()Ҏ指示q个会话bean是有状态还是无状态的。如下代码显CZjavax.ejb.EJBMetadata接口的定义部分的代码?BR>  Public javax.ejb; <BR>  Public interface EJBMetaData{ <BR>  EJBHome getEJBHome(); <BR>  Class getHomeInterfaceClass();<BR>  Class getRemoteInterfaceClasss(); <BR>  Class getPrimaryKeyClass(); <BR>  Boolean isSession(); <BR>  Boolean isStatelesssSession(); <BR>  } <BR>  五、EJB的编E环境:<BR>  1?nbsp;使用Jbuilder<BR>  Jbuilder与EJB Container能够q行无缝q接。Jbuilder和Inprise的应用服务器包括了所有的开发和配置Enterprise Beans的工具以及所需要的库:q行和管理Enterprise Bean的容器、命名服务?nbsp;事务服务、Java数据库、开发Enterprise Beans所需要的API、一个增强的java-to-iiop~译器,支持值类型和RMI信号{等?nbsp;<BR>  Jbuilderq提供了一个快速开发应用程序Enterprise Beans的工具和向导。通过单而且直观的步骤,向导帮助你徏立一个Enterprise Bean。自p定某些缺省|产生了bean的模板,在上面,我们可以增加我们自己的应用逻辑。Jbuilder也提供了一个EJB的接口生成向对{向导在Enterprise Bean的公共方法基上生成了Remote接口和Home接口。Jbuilderq提供一个配|器的向导帮助我们逐步的徏立XML描述器文件。ƈ生成的Stubs集中C个jar文g中?BR>  2、用Jbuilder之外的集成环境: <BR>  如果你用其它的除了别的集成环境QIDEQ。要定使用了集成环境IDE所带的容器工具。也要验证IDE是否支持EJB规范的相应的版本Q还要确定它是否正确的支持EJB的API?nbsp;<BR>  要确定JD到所支持的EJB容器的版本。可以通过查Inprise的安装说明来定EJB容器所支持的支持JDK的版本?nbsp;<BR>  在配|Enterprise Bean的时候,你必M用Inprise的应用服务器所提供的工兗这些工兯够编辑和修改W三方的代理商提供的Inprise配置描述器。还能够验证配置描述器,能够验证bean的源代码?nbsp;<BR>  六、一个简单的HELLO例子 <BR>  1、安装Apusic Application Server <BR>  Note:以下以LinuxZQ来说明Apusic Application Server的安装过E。其他^台的安装Q可参考Apusic Application Server安装手册?nbsp;<BR>  下蝲JDK1.2QApusic Application Server必须q行在JDK1.2以上环境中。可从以下站点下载最新JDK?nbsp;<BR>  <A >http://java.sun.com</A> <BR>  下蝲Apusic Application Server<BR>  Apusic Application Server 试用版可从以下网址得到Q?nbsp;<BR>  <A ); <BR>  Hello hello = hellohome.create();<BR>  String s = hello.getHello();<BR>  System.out.println(s); <BR>  }catch(Exception e){<BR>  System.out.println(e.getMessage());<BR>  System.exit(1);<BR>  } <BR>  }<BR>  }<BR>  q行HelloClientQ可得到以下输出Q?nbsp;<BR>  Hello World  <BR><img src ="http://www.tkk7.com/yrj11320/aggbug/16474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrj11320/" target="_blank">不胖用砖?/a> 2005-10-23 14:50 <a href="http://www.tkk7.com/yrj11320/articles/16474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBuilder7+WebLogic7.0的配|和EJB开?/title><link>http://www.tkk7.com/yrj11320/articles/16458.html</link><dc:creator>不胖用砖?/dc:creator><author>不胖用砖?/author><pubDate>Sat, 22 Oct 2005 16:11:00 GMT</pubDate><guid>http://www.tkk7.com/yrj11320/articles/16458.html</guid><wfw:comment>http://www.tkk7.com/yrj11320/comments/16458.html</wfw:comment><comments>http://www.tkk7.com/yrj11320/articles/16458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrj11320/comments/commentRss/16458.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrj11320/services/trackbacks/16458.html</trackback:ping><description><![CDATA[Borland公司推出Jbuilder 7后,引v了很多JAVA爱好者的xQ本文是Ҏ在Borland公司的网站上的一有关Jbuilder 7l合Weblogic Server 7.0的文章ؓ主要内容来写的。综合自ql验Q目的希望大家能利的搭Z个比较普遍流行的J2EE环境Qƈ学会开发基本的EJBE序?BR><BR><B>Q、创Z个Weblogic Server?/B><BR><BR>本文假设你已l正安装了q两个Y件。值得注意的是在Weblogic Server 7.0安装的时候,最后要你设|一个ServerQ你可以在安装的时候设|也可以在安装完了后从开始菜?BR>—?E序—?Bea Weblogic Platform7.0—?Configuration Wizard来设|。在讄的时候不要选择W一个WLS ExamplesQ选最后一个WLS DomainQ如图1Q。第一个是讄了一个范例域Q有一些范例程序和q接池设|、数据源Q在你运行的时候会出现q接池设|不对的问题。第三个是创Z个空的域Q默认域名是mydomainQ接下来选择默认的Single ServerQ接下来的一步默认域目录是H:\bea\user_projects\Q接下来的一步默认按nextQ填写了用户名和密码后nextQ最后创Z个域?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/bea Configuration.jpg"><BR>                                 Q图1Q?BR><BR><B>  2、在Jbuilder 7下设|Weblogic Server 7</B><BR> Q?Q运行Jbuilder 7后,选择Tools—?Configure ServersQ弹出的H口如图Q所C?BR> 在左辚w择Weblogic Server 6.x+Q选择双面板上的Enable Server选项后,在Home directory里写上你的Weblogic Home目录H:/bea/weblogic700/serverQ我q里安装在H盘上Q如果你的机器上是别的盘误行更改)。在Class标签下新增四个在Jbuilder根目录下的lib目录下的.jar文gQ分别ؓjaxrpc.jar、jds.jar、jdsremote.jar、jdsserver.jar。ƈ按照如图的顺序按move up按钮jaxrpc.jarUdW一个。这?jar文g在你开发Entity Bean的时候如果用了JdataStore数据库的时候会起作用?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/Configure server.jpg"><BR>                                 Q图Q)<BR><BR>选择上面的Custom 标签Q如?Q将JDK Installation Directory讄你的JDK安装目录如:<BR>H:/bea/jdk131_02、BEA Home Directory讄你的BEA的安装目录如QH:/bea、DomainDirectory讄你的域目录如QH:/bea/user_projects/mydomain。接下来填写用户名和密码Q用户名和密码就是你在设|Weblogic Server域的时候你讄的用户名和密码。填写Domain Name、Server Name如 :mydomain、myserver后,单击OK退出?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/custom.jpg"><BR>                                Q图3Q?BR><BR>Q?Q选择Tools->Enterprise SetupQ单击CORBA面板上的NewQ弹出如?所C的H口Q在Name<BR> for this configuration里填写 WelLogic 7.0Q在Path for ORB Tools里填写 h:/bea/weblogic700/serverQ在Library for projects 里选择 WebLogic 6.x+ DeployQ在IDL compiler command里填写idlj.exeQ 在Commnad option for output directory 里填写Q意一个目录比如:h:\temp单击OK退出?BR>Q3Q选择Project->Default Project properties选择Server标签Q在Single services for all service in project在下拉列表中选择WebLogic Application Server 6.x+Q单击OK退出,配置完毕。这里的两个选项Single services for all service in project和Modular Services provided by different serversQ第一个是在项目里用一个服务,后面q个是在目里用不同的服务的意思,比如Qjsp和servlet可以用Tomcat的,而ejb是用Weblogic的。这里选择在项目里用一个服务?BR> <IMG src="http://www.javaresearch.org/members/wengchiyuan/images/edit Configuration.jpg"><BR>                                 (图4)<BR>Q、在配置好的环境下开发一个session beans<BR><BR>Q1Q   创Z个项?BR><BR>选择File—?New选择Project面板下的 ProjectV在Name中填入TestSesQDirectory里填写你的项目要攄位置Q其他的默认Q单击Finish?BR><BR>Q2Q   创Z个Session Bean模块<BR><BR>选择File—?New选择Enterprise面板下的EJB ModuleQ选择OK。在出现的窗口后Q在Name里填写TestSesModQ在Version里选择EJB 2.0 compliant?BR><BR><B><BR>Q3Q   创Z个Session Bean</B><BR>在Jbuilder里,EJB可以可视化的创徏Q在双的空面板里点击鼠标右键,选择Create EJB在子菜单里选择Session BeanQ如图5所C。现在已l创Z一个可视化的Session BeanQ在Bean的设|面板中你可以改变Bean的名字,在这里在Bean Name里输入TestSes。现在开始创Z个方法,在TestSes上点击鼠标右键,选择Add后选择MethodQ如图6Q在Name里填getNameQReturn type填StringQInterfaces里选Remote。在左边的点testses旁边?P在下面拉下来的但个JAVA文g里双击TestSesBean.javaQ在getNameҎ里加入如下代码:<BR>Public String getName(){<BR>      return "Testing Successful";<BR>}<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/session bean.jpg"><BR>                                  Q图Q)<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/addmethod.jpg"><BR>                                  Q图Q)<BR>Q4Q   创建配|JAR文g<BR><BR> 要运行Session BeanQ首先要~译q个目。选择Project下的Make Project TestSes.jpxQ编译完了后q时你也可以看到TestSesBean.java旁边多了?P点击q个+号你可以看到几个由容器生的文g。你可以在左边的面板里看到TestSesMod.jar文g。双击TestSesMod.jar可以在左边看到部|描qͼ如图Q)?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/description.jpg"><BR>                                  (图7)<BR>Q5Q   创行期的设|?BR><BR> Jbuilder允许用户Z同的应用E序创徏q行期设|?BR>  选择Run —?Configuration NameQ在出来的Project PropertiesH口里Run面板是默认选择上了的,点击New来创Z个新的运行期讄。在弹出来的Runtime Properties点击Server标签在Configuration name里输入一个设|名Q这里输入ServerQ如图8Q后按OK后再点OK退出?BR>Q6Q   在Jbuilder里运行Weblogic<BR>选择菜单Run下的Run Projectq行Weblogic Server<BR>Q7Q   部|EJB到Webloigc Server上去<BR>  叛_TestSesMod.jarQ在弹出的面杉K选择Deploy option of TestSesMod.jarQ再选择DeployQ如图9Q?BR>Q8Q   远E部|?BR>  q里单的介绍一下怎么在远E的Weblogic Server上部|应用。即使是在远E部|的话,在本Z也需要装有应用服务器Q如果你在Weblogic Server7.0上部|的话,在Jbuilder里选择Tools —?Enterprise DeploymentQ在弹出的窗口里修改Admin urlQؓq程的服务器的主机名和端口号。ƈ讄正确的用户名和密码?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/server.jpg"><BR>                                    Q图Q)<BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/deploy.jpg"><BR>                                     Q图Q)<BR>Q9Q   创Z个客L试E序来测试你的Session Bean<BR>   在Jbuilder里选择File—?New选择Enterprise标签里的EJB Test ClientQ点击OK。在弹出来的H口里的Name里输入TestSesTestClientQ单击OKl束?BR>在文件的main()Ҏ里加入如下代码:<BR>  public static void main(String[] args) {<BR>    TestSesTestClient client = new TestSesTestClient();<BR>    try{<BR>     client.create();<BR>     String name=client.getName();<BR>     System.out.println ("Name form the Test client="+name);<BR>    }<BR>    catch (Exception ex){}<BR>}<BR> Q1Q)q行客户端测试程?BR>  要运行测试程序的话,先要为它加一个运行期讄。在Run—?Configuration里选择New在弹出的H口里选择Run下的Application。在上面的Configuration name里输入ClientQ在Main里点选旁边的按钮Q在弹出的窗口里选择Browse标签下的testses下的TestSesTestClient。一路OK完成。右击TestSesTestClient.javaQ单击Run Using Client后,q行ClientE序。运行成功后如图Q0所C。Client得到了调用了Session Bean的方法,q回了Testing Successful?BR><IMG src="http://www.javaresearch.org/members/wengchiyuan/images/success.jpg"><BR>                                Q图Q0Q?BR>Q、常见错误解{?BR>错误Q:WebLogic Server cannot start: config.xml not found<BR>错误代码描述Q?BR><Info> <Management> <140013> <C:\bea\user_projects\.\config.xml not found> <BR>C:\bea\user_projects\.\config.xml not found <BR>Since no config.xml was found, the fileRealm.properties file will not be used. <BR>Would you like the server to create a default configuration and boot? (y/n):<BR>问题发生时机Q?BR>在Jbuilder上运行Weblogic ServerӞ在Weblogic 6.x+ http:7001上?BR>产生原因Q?BR>Weblogic域目录没有正设|?BR>解决ҎQ?BR>选择Tools—?Configure ServersQ左辚w择Weblogic Server 6.x+Q选择双的Custom标签Q <BR>查你的域目录是否正确。如Qh:\bea\user_projects\mydomain?BR><BR>错误Q:Authentication for user <username> denied<BR>错误代码描述Q?BR><Critical> <WebLogicServer> <000364> <Server failed during initialization. <BR>Exception:java.lang.SecurityException: Authentication for user username denied <BR>java.lang.SecurityException: Authentication for user username denied.<BR>问题发生时机Q?BR>在Jbuilder上运行Weblogic ServerӞ在Weblogic 6.x+ http:7001上?BR>产生原因Q?BR>在Jbuilder里用户名、密码填写错?BR>解决ҎQ?BR>选择Tools—?Configure ServersQ左辚w择Weblogic Server 6.x+Q选择双的Custom标签Q <BR>查你的用户名和密码是否正?BR><BR>错误Q:Deployment of Web application failed<BR>错误代码描述Q?BR>Exception:weblogic.management.ApplicationException: Prepare failed. Task Id = 0 <BR>Module: TestWebApp Error: weblogic.j2ee.DeploymentException: Cannot deploy <BR>ServletContext(id=2545674,name=TestWebApp,context-path=/TestWebApp) from <BR>C:\bea\user_projects\mydomain\myserver\upload\TestWebApp\TestWebApp.war on myserver <BR>because there is already a webapp named <BR>ServletContext(id=5684736,name=TestWebApp,contextpath=/<BR>TestWebApp) loaded from C:\Documents and <BR>Settings\spati\jbproject\TestWebApp\TestWebApp, which is using the context path <BR>/TestWebApp.<BR>问题发生时机Q?BR>部vWAR文g的时?BR>产生原因Q?BR>可能是你已经在Weblogic上部|了一个相同名U的应用了?BR>解决ҎQ?BR>选择Project—?Project PropertiesQ选择Server标签Q在Services列表里先选上jsp/servletQ把双的Map project webapps at runtime的勾LQ就可以安全的部|了。如果问题还是存在的话,你就只有重新新徏一个WEB应用E序Q把你做的程序都拯到新的应用上再部|了?BR><BR> 错误Q:NameNotFoundException from test client<BR> 错误代码描述Q?BR>  javax.naming.NameNotFoundException: Unable to resolve 'TestSes' Resolved: <BR>''Unresolved:'TestSes'; remaining name 'TestSes'<BR> 问题发生时机Q?BR>  部v完EJB JAR文g后,q行TestClient的时?BR> 产生原因Q?BR>  TestClient不能扑ֈEJB的JNDI名?BR> 解决ҎQ?BR>打开Weblogic Server console查部|是否有错,在Deployments—?EJB里找到EJB的模块名。检查名U后Q点d边窗口的DeployQ如果JAR部v正确的话Q你在双的窗口的Deployment状态是true?BR><BR> 错误5Qtest client run failed<BR> 错误代码描述Q?BR>  javax.naming.CommunicationException. Root exception is java.net.ConnectException: <BR>t3://localhost:7001: Destination unreachable; nested exception is: <BR>java.net.ConnectException: Connection refused: connect; No available router to destination<BR> 问题发生时机Q?BR>  部v完EJB JAR文g后,q行TestClient的时?BR>  产生原因Q?BR>  test Client和Weblogic通信出现问题<BR> 解决ҎQ?BR>  如果你的Weblogic是在别的L上或者端口号改变了的话,请你在TestSesTestClient.java里修改原来的有关L名和端口的代码?BR><BR>  好了Q到现在为止Q你已经可以搭徏一个流行的J2EE环境q基本上了解了EJB在Jbuilder上的实现。希望大家多提意见,如果有问题请与作者联pREmailQflyingwcy@163.com?BR><img src ="http://www.tkk7.com/yrj11320/aggbug/16458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrj11320/" target="_blank">不胖用砖?/a> 2005-10-23 00:11 <a href="http://www.tkk7.com/yrj11320/articles/16458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://j8j8x.com" target="_blank">С˵ͼƬഺɫ</a>| <a href="http://jmdehong.com" target="_blank">av鶹aӰ</a>| <a href="http://fdhkauto.com" target="_blank">ޱavӲʵ</a>| <a href="http://www-xg5777.com" target="_blank">Ļк޴Ƭ</a>| <a href="http://jjwgzx.com" target="_blank">ŷÿѵӰ߹ۿ</a>| <a href="http://225ck.com" target="_blank">߻ɫӰ</a>| <a href="http://hztkw.com" target="_blank">ůһ </a>| <a href="http://6609929.com" target="_blank">91Ƶѹۿۿ</a>| <a href="http://shyangpuks.com" target="_blank">mate20pro鶹</a>| <a href="http://nuosheying.com" target="_blank">պޱ̬</a>| <a href="http://nit8.com" target="_blank">վ߹ۿ</a>| <a href="http://m8va.com" target="_blank">Ƭ߹ۿѹۿȫ </a>| <a href="http://sczxzt.com" target="_blank">պƵѲ</a>| <a href="http://w6626.com" target="_blank">avרߵӰ</a>| <a href="http://1111xxxx.com" target="_blank">޾Ʒ鶹ר</a>| <a href="http://assbjg.com" target="_blank">պƷAƬ</a>| <a href="http://33dh2.com" target="_blank">ŮþþŮ</a>| <a href="http://directzx.com" target="_blank">޳AVƬ߹ۻ</a>| <a href="http://ikybh.com" target="_blank">ѹԺ߹ۿ</a>| <a href="http://wwwee2.com" target="_blank">ѹ˸߹ۿվ</a>| <a href="http://vvv75.com" target="_blank">ϼ˳߹ۿƵ</a>| <a href="http://714747.com" target="_blank">ƷѦvƵ</a>| <a href="http://chuadang.com" target="_blank">AëƬֻ</a>| <a href="http://172pk.com" target="_blank">ijվ</a>| <a href="http://zzo8.com" target="_blank">vaһ</a>| <a href="http://565636.com" target="_blank">޻ɫ߹ۿ</a>| <a href="http://sewuji.com" target="_blank">޳ɫWWWþվ</a>| <a href="http://vcnxa.com" target="_blank">avĻ</a>| <a href="http://ksyanhui.com" target="_blank">þ޾ƷƷ</a>| <a href="http://455zx.com" target="_blank">޹ƷƬþ</a>| <a href="http://k8h9.com" target="_blank">ҹߵӰ</a>| <a href="http://catalna.com" target="_blank">˳վ߲ӰԺ</a>| <a href="http://323799.com" target="_blank">޳˸߹ۿ</a>| <a href="http://dazhe777.com" target="_blank">ŷպߵӰ</a>| <a href="http://cao9999.com" target="_blank">պĻ</a>| <a href="http://sdnuoyuan.com" target="_blank">ŷպһ</a>| <a href="http://guakao88.com" target="_blank">ձĻ</a>| <a href="http://xabcjzx.com" target="_blank">AVרһ</a>| <a href="http://senimei9.com" target="_blank">97޸ѹƵ</a>| <a href="http://shbailongma.com" target="_blank">߹ۿѸ</a>| <a href="http://www79909c.com" target="_blank">ѿƬִֻ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>