SELECT --從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列
INSERT --向數(shù)據(jù)庫表添加新數(shù)據(jù)行
DELETE --從數(shù)據(jù)庫表中刪除數(shù)據(jù)行
UPDATE --更新數(shù)據(jù)庫表中的數(shù)據(jù)
--數(shù)據(jù)定義
CREATE TABLE --創(chuàng)建一個(gè)數(shù)據(jù)庫表
DROP TABLE --從數(shù)據(jù)庫中刪除表
ALTER TABLE --修改數(shù)據(jù)庫表結(jié)構(gòu)
CREATE VIEW --創(chuàng)建一個(gè)視圖
DROP VIEW --從數(shù)據(jù)庫中刪除視圖
CREATE INDEX --為數(shù)據(jù)庫表創(chuàng)建一個(gè)索引
DROP INDEX --從數(shù)據(jù)庫中刪除索引
CREATE PROCEDURE --創(chuàng)建一個(gè)存儲過程
DROP PROCEDURE --從數(shù)據(jù)庫中刪除存儲過程
CREATE TRIGGER --創(chuàng)建一個(gè)觸發(fā)器
DROP TRIGGER --從數(shù)據(jù)庫中刪除觸發(fā)器
CREATE SCHEMA --向數(shù)據(jù)庫添加一個(gè)新模式
DROP SCHEMA --從數(shù)據(jù)庫中刪除一個(gè)模式
CREATE DOMAIN --創(chuàng)建一個(gè)數(shù)據(jù)值域
ALTER DOMAIN --改變域定義
DROP DOMAIN --從數(shù)據(jù)庫中刪除一個(gè)域
--數(shù)據(jù)控制
GRANT --授予用戶訪問權(quán)限
DENY --拒絕用戶訪問
REVOKE --解除用戶訪問權(quán)限
--事務(wù)控制
COMMIT --結(jié)束當(dāng)前事務(wù)
ROLLBACK --中止當(dāng)前事務(wù)
SET TRANSACTION --定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征
--程序化SQL
DECLARE --為查詢設(shè)定游標(biāo)
EXPLAN --為查詢描述數(shù)據(jù)訪問計(jì)劃
OPEN --檢索查詢結(jié)果打開一個(gè)游標(biāo)
FETCH --檢索一行查詢結(jié)果
CLOSE --關(guān)閉游標(biāo)
PREPARE --為動(dòng)態(tài)執(zhí)行準(zhǔn)備SQL 語句
EXECUTE --動(dòng)態(tài)地執(zhí)行SQL 語句
DESCRIBE --描述準(zhǔn)備好的查詢
---局部變量
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 = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ 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 小時(shí)2 分零3 秒后才執(zhí)行SELECT 語句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 點(diǎn)零8 分后才執(zhí)行SELECT 語句
waitfor time ’23: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關(guān)鍵字的where子句中使用通配符)
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) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列號
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查詢
--------- 除非能確保內(nèi)層select只返回一個(gè)行的值,
--------- 否則應(yīng)在外層where子句中用一個(gè)in限定符
select distinct column_name form table_name --------- distinct指定檢索獨(dú)有的列值,不重復(fù)
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合并查詢結(jié)果集,all-保留重復(fù)行
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 ----------- 刪除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全刪除表
***alter table*** --- 修改數(shù)據(jù)庫表結(jié)構(gòu)
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 ......... ----- 實(shí)現(xiàn)刪除列的方法(創(chuàng)建新表)
alter table table_name drop constraint Stockname_default ---- 刪除Stockname的default約束
***function(/*常用函數(shù)*/)***
----統(tǒng)計(jì)函數(shù)----
AVG --求平均值
COUNT --統(tǒng)計(jì)數(shù)目
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()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差
--STDEVP()
--STDEVP()函數(shù)返回總體標(biāo)準(zhǔn)差
--VAR()
--VAR()函數(shù)返回表達(dá)式中所有值的統(tǒng)計(jì)變異數(shù)
--VARP()
--VARP()函數(shù)返回總體變異數(shù)
----算術(shù)函數(shù)----
/***三角函數(shù)***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函數(shù)***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression) --把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression) --返回表達(dá)式的指數(shù)值
LOG(float_expression) --返回表達(dá)式的自然對數(shù)值
LOG10(float_expression)--返回表達(dá)式的以10 為底的對數(shù)值
SQRT(float_expression) --返回表達(dá)式的平方根
/***取近似值函數(shù)***/
CEILING(numeric_expression) --返回>=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
FLOOR(numeric_expression) --返回<=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
ROUND(numeric_expression) --返回以integer_expression 為精度的四舍五入值返回的數(shù)據(jù)
--類型與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT 類型
ABS(numeric_expression) --返回表達(dá)式的絕對值返回的數(shù)據(jù)類型與表達(dá)式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
SIGN(numeric_expression) --測試參數(shù)的正負(fù)號返回0 零值1 正數(shù)或-1 負(fù)數(shù)返回的數(shù)據(jù)類型
--與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI() --返回值為π 即3.1415926535897936
RAND([integer_expression]) --用任選的[integer_expression]做種子值得出0-1 間的隨機(jī)浮點(diǎn)數(shù)
----字符串函數(shù)----
ASCII() --函數(shù)返回字符表達(dá)式最左端字符的ASCII 碼值
CHAR() --函數(shù)用于將ASCII 碼轉(zhuǎn)換為字符
--如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數(shù)會返回一個(gè)NULL 值
LOWER() --函數(shù)把字符串全部轉(zhuǎn)換為小寫
UPPER() --函數(shù)把字符串全部轉(zhuǎn)換為大寫
STR() --函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)
LTRIM() --函數(shù)把字符串頭部的空格去掉
RTRIM() --函數(shù)把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函數(shù)返回部分字符串
CHARINDEX(),PATINDEX() --函數(shù)返回字符串中某個(gè)指定的子串出現(xiàn)的開始位置
SOUNDEX() --函數(shù)返回一個(gè)四位字符碼
--SOUNDEX函數(shù)可用來查找聲音相似的字符串但SOUNDEX函數(shù)對數(shù)字和漢字均只返回0 值
DIFFERENCE() --函數(shù)返回由SOUNDEX 函數(shù)返回的兩個(gè)字符表達(dá)式的值的差異
--0 兩個(gè)SOUNDEX 函數(shù)返回值的第一個(gè)字符不同
--1 兩個(gè)SOUNDEX 函數(shù)返回值的第一個(gè)字符相同
--2 兩個(gè)SOUNDEX 函數(shù)返回值的第一二個(gè)字符相同
--3 兩個(gè)SOUNDEX 函數(shù)返回值的第一二三個(gè)字符相同
--4 兩個(gè)SOUNDEX 函數(shù)返回值完全相同
QUOTENAME() --函數(shù)返回被特定字符括起來的字符串
/*select quotename('abc', '{') quotename('abc')
運(yùn)行結(jié)果如下
----------------------------------{
{abc} [abc]*/
REPLICATE() --函數(shù)返回一個(gè)重復(fù)character_expression 指定次數(shù)的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
運(yùn)行結(jié)果如下
----------- -----------
abcabcabc NULL*/
REVERSE() --函數(shù)將指定的字符串的字符排列順序顛倒
REPLACE() --函數(shù)返回被替換了指定子串的字符串
/*select replace('abc123g', '123', 'def')
運(yùn)行結(jié)果如下
----------- -----------
abcdefg*/
SPACE() --函數(shù)返回一個(gè)有指定長度的空白字符串
STUFF() --函數(shù)用另一子串替換字符串指定位置長度的子串
----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----
CAST() 函數(shù)語法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函數(shù)語法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
運(yùn)行結(jié)果如下
------------------------------ ------------
199 Jan 15 2000
----日期函數(shù)----
DAY() --函數(shù)返回date_expression 中的日期值
MONTH() --函數(shù)返回date_expression 中的月份值
YEAR() --函數(shù)返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函數(shù)返回指定日期date 加上指定的額外日期間隔number 產(chǎn)生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函數(shù)返回兩個(gè)指定日期在datepart 方面的不同之處
DATENAME(<datepart> , <date>) --函數(shù)以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函數(shù)以整數(shù)值的形式返回日期的指定部分
GETDATE() --函數(shù)以DATETIME 的缺省格式返回系統(tǒng)當(dāng)前的日期和時(shí)間
----系統(tǒng)函數(shù)----
APP_NAME() --函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱
COALESCE() --函數(shù)返回眾多表達(dá)式中第一個(gè)非NULL 表達(dá)式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函數(shù)返回表中指定字段的長度值
COL_NAME(<table_id>, <column_id>) --函數(shù)返回表中指定字段的名稱即列名
DATALENGTH() --函數(shù)返回?cái)?shù)據(jù)表達(dá)式的數(shù)據(jù)的實(shí)際長度
DB_ID(['database_name']) --函數(shù)返回?cái)?shù)據(jù)庫的編號
DB_NAME(database_id) --函數(shù)返回?cái)?shù)據(jù)庫的名稱
HOST_ID() --函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
HOST_NAME() --函數(shù)返回服務(wù)器端計(jì)算機(jī)的名稱
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函數(shù)只在SELECT INTO 語句中使用用于插入一個(gè)identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函數(shù)判斷所給定的表達(dá)式是否為合理日期
ISNULL(<check_expression>, <replacement_value>) --函數(shù)將表達(dá)式中的NULL 值用指定值替換
ISNUMERIC() --函數(shù)判斷所給定的表達(dá)式是否為合理的數(shù)值
NEWID() --函數(shù)返回一個(gè)UNIQUEIDENTIFIER 類型的數(shù)值
NULLIF(<expression1>, <expression2>)
--NULLIF 函數(shù)在expression1 與expression2 相等時(shí)返回NULL 值若不相等時(shí)則返回expression1 的值
sql中的保留字
action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
>distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procedure process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill
posted @
2008-04-28 22:38 caihaibo 閱讀(165) |
評論 (0) |
編輯 收藏
myeclipse6.0注冊碼大放送
Subscriber: yeming
Subscription Code: lLR7ZL-655444-54516456213945437
找了半天才找了個(gè)網(wǎng)上不太那么顯眼的,我用過可是使用,不過注意注冊時(shí)千萬別上網(wǎng)否則你就重裝吧!
正常:
Subscriber:Administrator
Subscription Code:NLR8ZC-855550-6552685393219112
可以用,我試過了.
6.0的:
Subscriber: www.1cn.biz
Subscriber Code: jLR8ZC-655355-5450765457039125
或者
Subscriber: www.1cn.biz
Subscriber Code: jLR7ZL-655355-5450755330522962
MyEclipse 6.0.1 注冊碼
Subscriber: administrator
Subscription Code: nLR7ZL-655342-54657656405281154注冊后:
Subscriber: administrator
Product ID: E2MY (MyEclipse Standard Subscription)
License version: 1.0
Full Maintenance Included
Subscription expiration date (YYYYMMDD): 20091021
Number of licenses: 897
posted @
2008-04-28 21:54 caihaibo 閱讀(227) |
評論 (0) |
編輯 收藏
DynaBean是BeanUtils里的寶貝之一。有了動(dòng)態(tài)Bean,就不用寫那么多VO出來了,特別那些只是為了和View交互而存在的bean,i hate Form Bean。
DynaBean的用法很簡單,特別是有了LazyBynaBean之后.
DynaBean car = new LazyDynaBean();
car.set("carNo",1);
car.set("owner","張三");
out.print(car.get("carNo"));
看著像一個(gè)map,只不過多了反射的功能,所以支持那些使用反射來獲取屬性的場合。
但是因?yàn)樗麤]有car.getCarNo()這樣的函數(shù),只能用car.get("carNo"),所以也就不支持JSTL里面<c: out value="{car.carNo}">這樣的語法,因?yàn)镴STL是默認(rèn)轉(zhuǎn)回car.getCarNo()的。
而且?guī)捉?jīng)討論,JSTL不支持 car.userFunction(),理由是不希望代碼里有java代碼:(
因此,還是寫<%=car.get("carNo")>好了,如果是陷在JSTL的一個(gè)循環(huán)結(jié)構(gòu)里,就要用從pageContext里面把bean拿出來,
又或者自己寫的tag,幸虧也很簡單,用BeanUtils.getProperty(bean,property)函數(shù)就可以了,
又或者,用Velocity和Freemarker。
最后,如果car.set("carNo",null),會得到一個(gè)莫名其妙的Object對象,如果要使它為Null,需要先定義他的類型。
因此,對于可能為Null的列,需要用LazyClass定義類型,幸虧也很Lazy, 不可能為Null的值可以不管。
LazyDynaClass lc = new LazyDynaClass();
lc.add("owner",String.class); // 指定null converter String
DynaBean car = new LazyDynaBean(lc);
car.set("carNo",1);
car.set("owner",null);
posted @
2008-04-24 13:15 caihaibo 閱讀(177) |
評論 (0) |
編輯 收藏
PO是持久化對象,它只是將物理數(shù)據(jù)實(shí)體的一種對象表示,為什么需要它?因?yàn)樗梢院喕覀儗τ谖锢韺?shí)體的了解和耦合,簡單地講,可以簡化對象的數(shù)據(jù)轉(zhuǎn)換為物理數(shù)據(jù)的編程。VO是什么?它是值對象,準(zhǔn)確地講,它是業(yè)務(wù)對象,是生活在業(yè)務(wù)層的,是業(yè)務(wù)邏輯需要了解,需要使用的,再簡單地講,它是概念模型轉(zhuǎn)換得到的。FormBean又是什么?它只是HTML表單的封裝,是為了在控制層弱化request中存儲數(shù)據(jù)的作用,將request的get方法轉(zhuǎn)變?yōu)閷ο蟮拇嫒≈怠?
理清了上述概念,好,我們就開始討論,為什么需要它們,為什么不需要它們。首先說PO和VO吧,它們的關(guān)系應(yīng)該是相互獨(dú)立的,一個(gè)VO可以只是PO的部分,也可以是多個(gè)PO構(gòu)成,同樣也可以等同于一個(gè)PO(當(dāng)然我是指他們的屬性)。正因?yàn)檫@樣,PO獨(dú)立出來,數(shù)據(jù)持久層也就獨(dú)立出來了,它不會受到任何業(yè)務(wù)的干涉。又正因?yàn)檫@樣,業(yè)務(wù)邏輯層也獨(dú)立開來,它不會受到數(shù)據(jù)持久層的影響,業(yè)務(wù)層關(guān)心的只是業(yè)務(wù)邏輯的處理,至于怎么存怎么讀交給別人吧!不過,另外一點(diǎn),如果我們沒有使用數(shù)據(jù)持久層,或者說沒有使用hibernate,那么PO和VO也可以是同一個(gè)東西,雖然這并不好。其次,讓我們看看FormBean和VO,如果簡單地講,我們是可以不需要FormBean的,它只是struts帶來的一部分,而VO是無論如何不能舍棄的。如果讓FormBean直接到業(yè)務(wù)層(它本來應(yīng)該生活在控制層),那么會帶來什么?View和Model就出現(xiàn)了強(qiáng)耦合,如果想改一下view的表示,整個(gè)業(yè)務(wù)邏輯都得改,恐怖的事情?。?
這些對象概念的出現(xiàn)其實(shí)就是體現(xiàn)了一種層的思維,也是體現(xiàn)了一種框架的思維,在層與層之間我們需要什么?我們應(yīng)該怎么通信,其實(shí)大家認(rèn)真地用筆畫上幾個(gè)圖就可以知道了。做web應(yīng)用尤其是企業(yè)應(yīng)用,切忌像樓上某些朋友說的,一個(gè)東東從頭到尾,那是非常低劣和錯(cuò)誤的設(shè)計(jì)。我們不要單純地就為了某些對象去爭論什么,它們更多的只是思維。這樣的思維給我們帶來了哪些好處,不言自明,當(dāng)然,我們也不得不否認(rèn),我們因此失去了某些東西,比如局部的性能或者繁瑣的代碼和調(diào)用過程,只是自己衡量一下,它是否值得。
posted @
2008-04-24 12:50 caihaibo 閱讀(145) |
評論 (0) |
編輯 收藏
我在action中使用PropertyUtils.copyProperties方法將一個(gè)formbean復(fù)制給一個(gè)vo,但是formbean中的value值的類型是String,所以我的vo的value的類型也必須是String,但是我的po和數(shù)據(jù)庫對應(yīng)的字段不一定的String,我怎么從一個(gè)formbean將值復(fù)制給一個(gè)vo(po),并和相應(yīng)的hbm.xml配合和數(shù)據(jù)庫建立映射關(guān)系。比如我的數(shù)據(jù)庫的某各字段weight是float類型,我如何寫我的formbean,vo,po,hbm.htm,謝謝!
聲明:JavaEye文章版權(quán)屬于作者,受法律保護(hù)。沒有作者書面許可不得轉(zhuǎn)載。
|
返回頂樓 |
|
|
- iceboy2189
- 等級:
- 文章: 8
- 積分: 225
|
不好意思,我用的是hibernet.
|
返回頂樓 |
請登錄后投票
|
|
|
PropertyUtils.copyProperties并不要求屬性的類型必須一致,它會自動(dòng)進(jìn)行轉(zhuǎn)換,當(dāng)然轉(zhuǎn)換不了的情況下會拋錯(cuò)。
|
返回頂樓 |
請登錄后投票
|
|
- iceboy2189
- 等級:
- 文章: 8
- 積分: 225
|
|
posted @
2008-04-24 12:07 caihaibo 閱讀(199) |
評論 (0) |
編輯 收藏
摘要: PO即 Persistence Object
VO即 Value Object
VO和PO的主要區(qū)別在于:
VO是獨(dú)立的Java Object。
PO是由Hibernate納入其實(shí)體容器(Entity Map)的對象,它代表了與數(shù)據(jù)庫中某條記錄對應(yīng)的Hibernate實(shí)體,PO的變化在事務(wù)提交時(shí)將反應(yīng)到實(shí)際數(shù)據(jù)庫中。
實(shí)際上,這個(gè)VO被用作Data Transfer Ob...
閱讀全文
posted @
2008-04-24 12:04 caihaibo 閱讀(3065) |
評論 (0) |
編輯 收藏
摘要: ajax巨好用,4級級聯(lián)菜單的解決
為解決省、市、區(qū)、區(qū)域4級級聯(lián)菜單,在網(wǎng)上搜索了大量的級聯(lián)菜單解決方案,也請教過不少朋友,要么過于復(fù)雜,要么過于占內(nèi)存,未果。
在建議下,悉心讀《ajax基礎(chǔ)教程》4余遍,方有與ajax相識恨晚之感,唯一的感慨就是好用好用絕對好用。
現(xiàn)在把已經(jīng)可以正常運(yùn)行的例子的核心代碼分享:
客戶端ajax代碼如下:
Code highlighting ...
閱讀全文
posted @
2008-04-23 20:25 caihaibo 閱讀(228) |
評論 (0) |
編輯 收藏
Javascript & DHTML 實(shí)例編程(教程),基礎(chǔ)篇(二)DOM基礎(chǔ)和基本API
一、什么是DOM?
什么叫DOM,DOM是文檔對象模型(Document Object Model,是基于瀏覽器編程(在本教程中,可以說就是DHTML編程)的一套API接口,W3C出臺的推薦標(biāo)準(zhǔn),每個(gè)瀏覽器都有一些細(xì)微的差別,其中以Mozilla的瀏覽器最與標(biāo)準(zhǔn)接近。單純的Javascript要結(jié)合DOM才能做DHTML編程,才能做出漂亮的效果、應(yīng)用于WEB。這點(diǎn)幾乎與其它的語言無異,正如C/C++需要庫支持是一樣的道理。否則就是單純的在語法上做研究了。因此,必須要對DOM有一定的認(rèn)識,才能把Javascript應(yīng)用于WEB,或你的RIA應(yīng)用當(dāng)中,因?yàn)镈HTML本質(zhì)上就是操作DOM樹。
以后的編程當(dāng)中,希望你能夠把DHTML.chm這本手冊也拿上,如果你需要兼容gecko,把gecko的DOM手冊也帶上。因?yàn)锳PI太多,想不起來的接口還可以查這本手冊。
如果你要測試瀏覽器是否是支持DOM的,簡單的一句就可以判斷
<script>
var isSupportDOM = !!document.getElementById; //兩個(gè)取反,這已經(jīng)在上節(jié)中說過了,意思是強(qiáng)制轉(zhuǎn)型
alert("你的瀏覽器 " +(isSupportDOM?"":"不")+ "支持 DOM!");
</script>
二、DOM樹
要注意:DOM樹的根統(tǒng)一為文檔根—document,DOM既然是樹狀結(jié)構(gòu),那么他們自然有如下的幾種關(guān)系:
根結(jié)點(diǎn)(document)
|
父結(jié)點(diǎn)(parentNode)
|
子結(jié)點(diǎn)(childNodes)
| |
兄弟結(jié)點(diǎn) 兄弟結(jié)點(diǎn)
(sibling) (sibling)
例子:
假設(shè)網(wǎng)頁的HTML如下
<html>
<head>
<title>never-online's website</title>
</head>
<body>
<div>tutorial of DHTML and javascript programming</div>
</body>
</html>
我們參照樹的概念,畫出該HTML文檔結(jié)構(gòu)的DOM樹:
html
| |
body head
| |
div title
| |
文本 文本
從上面的圖示可以看出
html有兩個(gè)子結(jié)點(diǎn),而html就是這兩個(gè)子節(jié)點(diǎn)的父結(jié)點(diǎn)
head有節(jié)點(diǎn)title,title下有一個(gè)文本節(jié)點(diǎn)
doby下有節(jié)點(diǎn)div,div下有一個(gè)文本節(jié)點(diǎn)
三、操作DOM樹
開篇已經(jīng)說過,DHTML本質(zhì)就是操作DOM樹。如何操作它呢?
假設(shè)我要改變上面HTML文檔中div結(jié)點(diǎn)的文本,如何做?[code]<html>
<head>
<title>never-online's website</title>
<script>
function changedivText (strText) {
var nodeRoot = document; //這個(gè)是根結(jié)點(diǎn)
var nodeHTML = nodeRoot.childNodes[0]; //這個(gè)是html結(jié)點(diǎn)
var nodeBody = nodeHTML.childNodes[1]; //body結(jié)點(diǎn)
var nodeDiv = nodeBody.childNodes[0]; //DIV結(jié)點(diǎn)
var nodeText = nodeDiv.childNodes[0];//文本結(jié)點(diǎn)'
nodeText.data = strText; //文本節(jié)點(diǎn)有data這個(gè)屬性,因此我們可以改變這個(gè)屬性,也就成功的操作了DOM樹中的一個(gè)結(jié)點(diǎn)了
}
</script>
</head>
<body>
<div>tutorial of DHTML and javascript programming</div>
<input onclick="changedivText('change?')" type="button" value="change"/>
</body>
</html>
從上面的示例可以看出,我們可以用上面的這種方法操作DOM樹上的任一節(jié)點(diǎn)。(注:1. 跨域除外,跨域通常是在操作frame上,簡單的說,就是兩個(gè)frame不屬于同一域名。2.上面的操作為了演示,采用的方法是從根結(jié)點(diǎn)一直到文本結(jié)點(diǎn)的遍歷,在DOM方法上,有更簡潔的方法,這些以后會有更多示例加以說明,下文中也會有介紹)
三、DOM節(jié)點(diǎn)。
細(xì)心些的朋友也許發(fā)現(xiàn)了,在上面寫的HTML代碼時(shí)用<>與</>包函起來的就是一個(gè)結(jié)點(diǎn),事實(shí)上是這樣的嗎?答案是否定的。下面就是說說節(jié)點(diǎn)類型,否則在有的時(shí)候是會犯錯(cuò)誤的。比如,你把上面的代碼放到Mozilla firefox的瀏覽器里運(yùn)行一下,就會知道了。
DOM中的結(jié)點(diǎn)類型比較多,這里寫一些在HTML文檔中(注:XML也是DOM樹結(jié)構(gòu))常見的幾種結(jié)點(diǎn)類型。
1、DOCUMENT_NODE
(document)文檔根結(jié)點(diǎn)類型,該枚舉型的值是9.
2、ELEMENT_NODE
(element)元素結(jié)點(diǎn)類型,該枚舉型的值是1。上文中的html, body, div這些結(jié)點(diǎn)都是屬于該類型。
3、TEXT_NODE
(text)文本結(jié)點(diǎn)類型,該枚舉型的值是3。上文中的文本,如:tutorial of DHTML and javascript programming就是屬于該類型。
(注:一個(gè)空格也就可能是一個(gè)文本結(jié)點(diǎn))
通常更需要注意的是文本結(jié)點(diǎn),有可能一個(gè)回車,一個(gè)空格都是文本結(jié)點(diǎn)。這一點(diǎn)以后會碰到,當(dāng)然,我們也有辦法處理,這里先不要急,以后也會說到的。
四、DOM常用的API
這些常用的API是要記下來的,當(dāng)然在非IE的瀏覽器里也會有效,是符合w3c的。這些API在以后的編程中會常常用到。正如每個(gè)編程平臺所提供的API一樣,常用必須記下來,節(jié)省時(shí)間從而提高編程效率。只寫幾個(gè)最常用的,其它的API會在以后的示例中寫出。由淺而深,從易到難嘛。
1、獲取ELEMENT_NODE,元素節(jié)點(diǎn)
1)、方法:document.getElementById(元素的Id),返回值為元素的節(jié)點(diǎn)引用。可以假想一下這個(gè)API的原理:象我們上面所做的是遍歷每個(gè)節(jié)點(diǎn)(從根到我們所需結(jié)點(diǎn)),這個(gè)API,也可以想成是從根遍歷,查詢每個(gè)結(jié)點(diǎn)(空白結(jié)點(diǎn)和空結(jié)點(diǎn)除外),并獲取該結(jié)點(diǎn)的id是否為指定的ID,如果是的話,就返回這個(gè)結(jié)點(diǎn)(注:在JS中,數(shù)組和對象是引用類型),如果沒有就返回空。我們可以寫寫這個(gè)代碼,幫助我們理解document.getElementById。下面是一個(gè)簡單遍歷BODY中元素的示例。
<html>
<head>
<title>never-online's website</title>
<script>
function myGetElementById (id) {
var nodeRoot = document; //這個(gè)是根結(jié)點(diǎn)
var nodeHTML = nodeRoot.childNodes[0]; //這個(gè)是html結(jié)點(diǎn)
var nodeBody = nodeHTML.childNodes[1]; //body結(jié)點(diǎn)
var bodyChild = nodeBody.childNodes; //body的孩子
for (var i=0; i<bodyChild.length; i++) { //簡單的遍歷(指body的孩子下的深度為1)
if (bodyChild[i].id==id) return bodyChild[i];
};
return null;
}
function TestGetElementById (id) {
var node = myGetElementById(id);
if (node!=null) {
alert("找到結(jié)點(diǎn) "+id+"!");
alert(node.childNodes[0].data);
} else {
alert("沒有找到結(jié)點(diǎn) "+id+".");
}
}
</script>
</head>
<body>
<div id="aTestNode"></div>
<div id="textNode">tutorial of DHTML and javascript programming</div>
<input onclick="TestGetElementById('textNode')" type="button" value="change"/>
</body>
</html>
2)、屬性:object.innerHTML,返回值:一個(gè)節(jié)點(diǎn)內(nèi)的HTML值。該屬性為可寫屬性。它雖然不是獲取結(jié)點(diǎn),但經(jīng)常與獲取結(jié)點(diǎn)相結(jié)合,所以我把它放在獲取結(jié)點(diǎn)這一類,它的屬性就類似于是純文本節(jié)點(diǎn)屬性中的data。以document.getElementById和object.innerHTML這兩個(gè)API為例,我們就可以把上面所寫的代碼簡化一下了,示例如下:
<html>
<head>
<title>never-online's website</title>
<script>
function changedivText (strText) {
var node = document.getElementById("textNode");
node.innerHTML = strText;
}
</script>
</head>
<body>
<div id="textNode">tutorial of DHTML and javascript programming</div>
<input onclick="changedivText('change?')" type="button" value="change"/>
</body>
</html>
3)、方法:object.getElementsByTagName(標(biāo)簽的名字),返回一個(gè)集合,該集合的把有元素都是有指定標(biāo)簽的元素。訪問集合里的元素,可以用下標(biāo)來訪問。語法里的object,是指document(根)或者是一個(gè)ELEMENT_NODE。這個(gè)的原理示例我就不寫了,可以作為一個(gè)作業(yè),大家可以寫寫。這里寫一些具體應(yīng)用。如上例,我們還可以這樣寫。
<html>
<head>
<title>never-online's website</title>
<script>
function changedivText (strText) {
var node = document.getElementsByTagName("DIV");
node[0].innerHTML = strText;
}
</script>
</head>
<body>
<div>tutorial of DHTML and javascript programming</div>
<input onclick="changedivText('change?')" type="button" value="change"/>
</body>
</html>
再取一個(gè)例子,注意,BODY下的結(jié)點(diǎn)深度為2。
<html>
<head>
<title>never-online's website</title>
<script>
function changedivText (strText) {
var node = document.getElementById("nodeTest");
var myNode = node.getElementsByTagName("DIV");
myNode[0].innerHTML = strText;
}
</script>
</head>
<body>
<div id="nodeTest">
<div>tutorial of DHTML and javascript programming</div>
<input onclick="changedivText('change?')" type="button" value="change"/>
</div>
</body>
</html>
二、動(dòng)態(tài)創(chuàng)建與插入結(jié)點(diǎn)
1)、創(chuàng)建結(jié)點(diǎn)對象。document.createElement(tagname),tagname指的是一個(gè)標(biāo)簽,比如一個(gè)DIV,就是document.createElement("DIV"),它返回的是這個(gè)結(jié)點(diǎn)的引用。
2)、在body的尾部插入結(jié)點(diǎn)用document.body.appendChild(object),為了容易理解,下面這個(gè)示例,我用了IE專有的屬性object.outerHTML,得到一個(gè)該元素的HTML標(biāo)簽內(nèi)容(包括自身),這樣會更容易看到效果。
<html>
<head>
<title>never-online's website</title>
<script>
function insertNode (strText) {
alert("插入元素前的body HTML:\n" +document.body.outerHTML);
var node = document.createElement("DIV");
node.innerHTML = strText;
document.body.appendChild(node);
alert("插入元素后的body HTML:\n" +document.body.outerHTML);
}
</script>
</head>
<body>
<div>tutorial of DHTML and javascript programming</div>
<input onclick="insertNode('change?')" type="button" value="change"/>
</body>
</html>
3)、在元素處插入結(jié)點(diǎn)。object.insertBefore(oNewNode [, oChildNode]),oNewNode為一個(gè)我們創(chuàng)建的結(jié)點(diǎn),oChildNode是可選的,為object下的一個(gè)子節(jié)點(diǎn)。同樣的,為了看到效果,我也用了outerHTML。示例
<html>
<head>
<title>never-online's website</title>
<script>
function insertNode (strText) {
alert("插入元素前的body HTML:\n" +document.body.outerHTML);
var node = document.createElement("DIV");
var myNode = document.getElementById("textNode");
node.innerHTML = strText;
document.body.insertBefore(node,myNode);
alert("插入元素后的body HTML:\n" +document.body.outerHTML);
}
</script>
</head>
<body>
<div id="textNode">tutorial of DHTML and javascript programming</div>
<input onclick="insertNode('change?')" type="button" value="change"/>
</body>
</html>
三、移除結(jié)點(diǎn)。
1) object.parentNode.removeChild(oChildNode),這個(gè)就是語法,下面看示例。
<html>
<head>
<title>never-online's website</title>
<script>
function insertNode (strText) {
alert("插入元素前的body HTML:\n" +document.body.outerHTML);
var node = document.createElement("DIV");
var myNode = document.getElementById("textNode");
node.innerHTML = strText;
document.body.insertBefore(node,myNode);
alert("插入元素后的body HTML:\n" +document.body.outerHTML);
}
function removeCreateNode() {
alert("移除元素前的body HTML:\n" +document.body.outerHTML);
var node = document.getElementById("textNode");
node.parentNode.removeChild(node);
alert("移除元素前的body HTML:\n" +document.body.outerHTML);
}
</script>
</head>
<body>
<div id="textNode">tutorial of DHTML and javascript programming</div>
<input onclick="insertNode('change?')" type="button" value="insert"/>
<input onclick="removeCreateNode()" type="button" value="remove"/>
</body>
</html>
這一節(jié)就先寫到這里,下一節(jié)我們就可以用這幾個(gè)簡單的API做許多事情了,幾個(gè)API就可以寫出很多效果。:D
posted @
2008-04-23 20:18 caihaibo 閱讀(297) |
評論 (1) |
編輯 收藏
文件名和路徑約定
在unix及其上運(yùn)行時(shí),ant將路徑dir;dir\\subdir(注意轉(zhuǎn)義符"\")正確的解釋為dir:dir/subdir
在同一個(gè)值類型中,分隔符的使用必須保持一致 ;屬于windows路徑分隔符, \\屬于unix的目錄分隔符。
ant并不關(guān)心你所使用的平臺。
ant不處理跨平臺的驅(qū)動(dòng)器盤符,在ant路徑元素中使用驅(qū)動(dòng)器盤符將限制構(gòu)建文件在windows環(huán)境下的使用。
xml注意事項(xiàng)
第一行為xml聲明。如果有,必須出現(xiàn)在xml文件的第一行;在其之前不允許出現(xiàn)空行。實(shí)際上,即便在<?xml之前只有一個(gè)空格
也會導(dǎo)致xml解析程序失敗。
xml對于大小寫、引號以及正確的標(biāo)簽語法很挑剔。如果其中任何一項(xiàng)不正確,ant就會失敗,這是因?yàn)槠涞讓拥膞ml解析程序會失敗。
構(gòu)建文件描述
<project>元素為這個(gè)工程建立工作目錄“.”。這就是包含此構(gòu)建文件的目錄。
特性定義允許我們避免在構(gòu)建文件中將目錄名硬編碼。這些路徑是相對于<project>元素所指定的基目錄。
在目標(biāo)中存在任務(wù),這些任務(wù)完成構(gòu)建中的具體工作。ant1.4.1內(nèi)置有100多個(gè)核心的和可選的任務(wù)。
包含有discription屬性的為主目標(biāo),不包含的為子目標(biāo)。
軟件下載
.tar.gz文件(面向Unix用戶) .zip文件(面向windows用戶)
posted @
2008-04-22 16:18 caihaibo 閱讀(386) |
評論 (0) |
編輯 收藏