<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 8, comments - 7, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2006年11月9日

    轉(zhuǎn):javathink.org

    說(shuō)明:復(fù)制表(只復(fù)制結(jié)構(gòu),源表名:a 新表名:b)
    select * into b from a where 1<>1


    說(shuō)明:拷貝表(拷貝數(shù)據(jù),源表名:a 目標(biāo)表名:b)
    insert into b(a, b, c) select d,e,f from b;


    說(shuō)明:顯示文章、提交人和最后回復(fù)時(shí)間
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b


    說(shuō)明:外連接查詢(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c


    說(shuō)明:日程安排提前五分鐘提醒
    select * from 日程安排 where datediff('minute',f開(kāi)始時(shí)間,getdate())>5


    說(shuō)明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒(méi)有的信息
    delete from info where not exists ( select * from infobz where info.infid=infobz.infid )


    說(shuō)明:--

    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 (+)

    AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B

    WHERE A.NUM = B.NUM


    說(shuō)明:--
    select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專(zhuān)業(yè)名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績(jī)


    從數(shù)據(jù)庫(kù)中去一年的各單位電話費(fèi)統(tǒng)計(jì)(電話費(fèi)定額賀電化肥清單兩個(gè)表來(lái)源)

    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')


    說(shuō)明:四表聯(lián)查問(wèn)題
    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 .....


    說(shuō)明:得到表中最小的未使用的ID號(hào)


    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)


    一個(gè)SQL語(yǔ)句的問(wèn)題:行列轉(zhuǎn)換
    select * from v_temp
    上面的視圖結(jié)果如下:
    user_name role_name
    -------------------------
    系統(tǒng)管理員 管理員
    feng 管理員
    feng 一般用戶
    test 一般用戶
    想把結(jié)果變成這樣:
    user_name role_name
    ---------------------------
    系統(tǒng)管理員 管理員
    feng 管理員,一般用戶
    test 一般用戶
    ===================
    create table a_test(name varchar(20),role2 varchar(20))
    insert into a_test values('李','管理員')
    insert into a_test values('張','管理員')
    insert into a_test values('張','一般用戶')
    insert into a_test values('常','一般用戶')

    create function join_str(@content varchar(100))
    returns varchar(2000)
    as
    begin
    declare @str varchar(2000)
    set @str=''
    select @str=@str+','+rtrim(role2) from a_test where [name]=@content
    select @str=right(@str,len(@str)-1)
    return @str
    end
    go

    --調(diào)用:
    select [name],dbo.join_str([name]) role2 from a_test group by [name]

    --select distinct name,dbo.uf_test(name) from a_test


    快速比較結(jié)構(gòu)相同的兩表
    結(jié)構(gòu)相同的兩表,一表有記錄3萬(wàn)條左右,一表有記錄2萬(wàn)條左右,我怎樣快速查找兩表的不同記錄?
    ============================
    給你一個(gè)測(cè)試方法,從northwind中的orders表取數(shù)據(jù)。
    select * into n1 from orders
    select * into n2 from orders

    select * from n1
    select * from n2

    --添加主鍵,然后修改n1中若干字段的若干條
    alter table n1 add constraint pk_n1_id primary key (OrderID)
    alter table n2 add constraint pk_n2_id primary key (OrderID)

    select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1

    應(yīng)該可以,而且將不同的記錄的ID顯示出來(lái)。
    下面的適用于雙方記錄一樣的情況,

    select * from n1 where orderid in (select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1)
    至于雙方互不存在的記錄是比較好處理的
    --刪除n1,n2中若干條記錄
    delete from n1 where orderID in ('10728','10730')
    delete from n2 where orderID in ('11000','11001')

    --*************************************************************
    -- 雙方都有該記錄卻不完全相同
    select * from n1 where orderid in(select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1)
    union
    --n2中存在但在n1中不存的在10728,10730
    select * from n1 where OrderID not in (select OrderID from n2)
    union
    --n1中存在但在n2中不存的在11000,11001
    select * from n2 where OrderID not in (select OrderID from n1)


    四種方法取表里n到m條紀(jì)錄:

    1.
    select top m * into 臨時(shí)表(或表變量) from tablename order by columnname -- 將top m筆插入
    set rowcount n
    select * from 表變量 order by columnname desc


    2.
    select top n * from (select top m * from tablename order by columnname) a order by columnname desc


    3.如果tablename里沒(méi)有其他identity列,那么:
    select identity(int) id0,* into #temp from tablename

    取n到m條的語(yǔ)句為:
    select * from #temp where id0 >=n and id0 <= m

    如果你在執(zhí)行select identity(int) id0,* into #temp from tablename這條語(yǔ)句的時(shí)候報(bào)錯(cuò),那是因?yàn)槟愕腄B中間的select into/bulkcopy屬性沒(méi)有打開(kāi)要先執(zhí)行:
    exec sp_dboption 你的DB名字,'select into/bulkcopy',true


    4.如果表里有identity屬性,那么簡(jiǎn)單:
    select * from tablename where identitycol between n and m


    如何刪除一個(gè)表中重復(fù)的記錄?
    create table a_dist(id int,name varchar(20))

    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')

    exec up_distinct 'a_dist','id'

    select * from a_dist

    create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))
    --f_key表示是分組字段﹐即主鍵字段
    as
    begin
    declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer
    select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1'
    exec(@sql)
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key
    if @type=56
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id
    if @type=167
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +''''
    exec(@sql)
    fetch cur_rows into @id,@max
    end
    close cur_rows
    deallocate cur_rows
    set rowcount 0
    end

    select * from systypes
    select * from syscolumns where id = object_id('a_dist')


    查詢數(shù)據(jù)的最大排序問(wèn)題(只能用一條語(yǔ)句寫(xiě))
    CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))

    insert into hard values ('A','1',3)
    insert into hard values ('A','2',4)
    insert into hard values ('A','4',2)
    insert into hard values ('A','6',9)
    insert into hard values ('B','1',4)
    insert into hard values ('B','2',5)
    insert into hard values ('B','3',6)
    insert into hard values ('C','3',4)
    insert into hard values ('C','6',7)
    insert into hard values ('C','2',3)


    要求查詢出來(lái)的結(jié)果如下:

    qu co je
    ----------- ----------- -----
    A 6 9
    A 2 4
    B 3 6
    B 2 5
    C 6 7
    C 3 4


    就是要按qu分組,每組中取je最大的前2位?。?br />而且只能用一句sql語(yǔ)句?。。?br />select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)


    求刪除重復(fù)記錄的sql語(yǔ)句?
    怎樣把具有相同字段的紀(jì)錄刪除,只留下一條。
    例如,表test里有id,name字段
    如果有name相同的記錄 只留下一條,其余的刪除。
    name的內(nèi)容不定,相同的記錄數(shù)不定。
    有沒(méi)有這樣的sql語(yǔ)句?
    ==============================
    A:一個(gè)完整的解決方案:

    將重復(fù)的記錄記入temp1表:
    select [標(biāo)志字段id],count(*) into temp1 from [表名]
    group by [標(biāo)志字段id]
    having count(*)>1

    2、將不重復(fù)的記錄記入temp1表:
    insert temp1 select [標(biāo)志字段id],count(*) from [表名] group by [標(biāo)志字段id] having count(*)=1

    3、作一個(gè)包含所有不重復(fù)記錄的表:
    select * into temp2 from [表名] where 標(biāo)志字段id in(select 標(biāo)志字段id from temp1)

    4、刪除重復(fù)表:
    delete [表名]

    5、恢復(fù)表:
    insert [表名] select * from temp2

    6、刪除臨時(shí)表:
    drop table temp1
    drop table temp2
    ================================
    B:
    create table a_dist(id int,name varchar(20))

    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')

    exec up_distinct 'a_dist','id'

    select * from a_dist

    create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))
    --f_key表示是分組字段﹐即主鍵字段
    as
    begin
    declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer
    select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1'
    exec(@sql)
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key
    if @type=56
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id
    if @type=167
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +''''
    exec(@sql)
    fetch cur_rows into @id,@max
    end
    close cur_rows
    deallocate cur_rows
    set rowcount 0
    end

    select * from systypes
    select * from syscolumns where id = object_id('a_dist')


    行列轉(zhuǎn)換--普通

    假設(shè)有張學(xué)生成績(jī)表(CJ)如下
    Name Subject Result
    張三 語(yǔ)文 80
    張三 數(shù)學(xué) 90
    張三 物理 85
    李四 語(yǔ)文 85
    李四 數(shù)學(xué) 92
    李四 物理 82

    想變成
    姓名 語(yǔ)文 數(shù)學(xué) 物理
    張三 80 90 85
    李四 85 92 82

    declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from CJ) as a
    select @sql = @sql+' from test group by name'
    exec(@sql)

    行列轉(zhuǎn)換--合并

    有表A,
    id pid
    1 1
    1 2
    1 3
    2 1
    2 2
    3 1
    如何化成表B:
    id pid
    1 1,2,3
    2 1,2
    3 1

    創(chuàng)建一個(gè)合并的函數(shù)
    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    select @str=@str+','+cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    return(@str)
    End
    go

    --調(diào)用自定義函數(shù)得到結(jié)果
    select distinct id,dbo.fmerg(id) from 表A


    如何取得一個(gè)數(shù)據(jù)表的所有列名

    方法如下:先從SYSTEMOBJECT系統(tǒng)表中取得數(shù)據(jù)表的SYSTEMID,然后再SYSCOLUMN表中取得該數(shù)據(jù)表的所有列名。
    SQL語(yǔ)句如下:
    declare @objid int,@objname char(40)
    set @objname = 'tablename'
    select @objid = id from sysobjects where id = object_id(@objname)
    select 'Column_name' = name from syscolumns where id = @objid order by colid



    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'


    通過(guò)SQL語(yǔ)句來(lái)更改用戶的密碼

    修改別人的,需要sysadmin role
    EXEC sp_password NULL, 'newpassword', 'User'

    如果帳號(hào)為SA執(zhí)行EXEC sp_password NULL, 'newpassword', sa


    怎么判斷出一個(gè)表的哪些字段不允許為空?

    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename


    如何在數(shù)據(jù)庫(kù)里找到含有相同字段的表?
    a. 查已知列名的情況
    SELECT b.name as TableName,a.name as columnname
    From syscolumns a INNER JOIN sysobjects b
    ON a.id=b.id
    AND b.type='U'
    AND a.name='你的字段名字'


    未知列名查所有在不同表出現(xiàn)過(guò)的列名
    Select o.name As tablename,s1.name As columnname
    From syscolumns s1, sysobjects o
    Where s1.id = o.id
    And o.type = 'U'
    And Exists (
    Select 1 From syscolumns s2
    Where s1.name = s2.name
    And s1.id <> s2.id
    )


    查詢第xxx行數(shù)據(jù)

    假設(shè)id是主鍵:
    select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)

    如果使用游標(biāo)也是可以的
    fetch absolute [number] from [cursor_name]
    行數(shù)為絕對(duì)行數(shù)


    SQL Server日期計(jì)算
    a. 一個(gè)月的第一天
    SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
    b. 本周的星期一
    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
    c. 一年的第一天
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
    d. 季度的第一天
    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
    e. 上個(gè)月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
    f. 去年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
    g. 本月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
    h. 本月的第一個(gè)星期一
    select DATEADD(wk, DATEDIFF(wk,0,
    dateadd(dd,6-datepart(day,getdate()),getdate())
    ), 0)
    i. 本年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。


    獲取表結(jié)構(gòu)[把 'sysobjects' 替換 成 'tablename' 即可]

    SELECT CASE IsNull(I.name, '')
    When '' Then ''
    Else '*'
    End as IsPK,
    Object_Name(A.id) as t_name,
    A.name as c_name,
    IsNull(SubString(M.text, 1, 254), '') as pbc_init,
    T.name as F_DataType,
    CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')
    WHEN '' Then Cast(A.prec as varchar)
    ELSE Cast(A.prec as varchar) + ',' + Cast(A.scale as varchar)
    END as F_Scale,
    A.isnullable as F_isNullAble
    FROM Syscolumns as A
    JOIN Systypes as T
    ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') )
    LEFT JOIN ( SysIndexes as I
    JOIN Syscolumns as A1
    ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )
    ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) )
    LEFT JOIN SysComments as M
    ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 )
    ORDER BY A.Colid ASC


    提取數(shù)據(jù)庫(kù)內(nèi)所有表的字段詳細(xì)說(shuō)明的SQL語(yǔ)句

    SELECT
    (case when a.colorder=1 then d.name else '' end) N'表名',
    a.colorder N'字段序號(hào)',
    a.name N'字段名',
    (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else ''
    end) N'標(biāo)識(shí)',
    (case when (SELECT count(*)
    FROM sysobjects
    WHERE (name in
    (SELECT name
    FROM sysindexes
    WHERE (id = a.id) AND (indid in
    (SELECT indid
    FROM sysindexkeys
    WHERE (id = a.id) AND (colid in
    (SELECT colid
    FROM syscolumns
    WHERE (id = a.id) AND (name = a.name))))))) AND
    (xtype = 'PK'))>0 then '√' else '' end) N'主鍵',
    b.name N'類(lèi)型',
    a.length N'占用字節(jié)數(shù)',
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'長(zhǎng)度',
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小數(shù)位數(shù)',
    (case when a.isnullable=1 then '√'else '' end) N'允許空',
    isnull(e.text,'') N'默認(rèn)值',
    isnull(g.[value],'') AS N'字段說(shuō)明'
    FROM syscolumns a
    left join systypes b
    on a.xtype=b.xusertype
    inner join sysobjects d
    on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
    left join syscomments e
    on a.cdefault=e.id
    left join sysproperties g
    on a.id=g.id AND a.colid = g.smallid
    order by object_name(a.id),a.colorder


    快速獲取表test的記錄總數(shù)[對(duì)大容量表非常有效]

    快速獲取表test的記錄總數(shù):
    select rows from sysindexes where id = object_id('test') and indid in (0,1)

    update 2 set KHXH=(ID+1)\2 2行遞增編號(hào)
    update [23] set id1 = 'No.'+right('00000000'+id,6) where id not like 'No%' //遞增
    update [23] set id1= 'No.'+right('00000000'+replace(id1,'No.',''),6) //補(bǔ)位遞增
    delete from [1] where (id%2)=1
    奇數(shù)


    替換表名字段
    update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'


    截位
    SELECT LEFT(表名, 5)

    posted @ 2007-01-27 12:18 大熊貓 閱讀(345) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn):javathink.org

    對(duì)于 Java? 語(yǔ)言開(kāi)發(fā)人員來(lái)說(shuō),信息過(guò)量是一個(gè)真正的問(wèn)題。每個(gè)新入行的程序員都要面臨一個(gè)令人畏縮的挑戰(zhàn):要進(jìn)入的行業(yè)是一個(gè)具有海量知識(shí)的行業(yè)。要了解的東西簡(jiǎn)直太多了。對(duì)于有經(jīng)驗(yàn)的老手來(lái)說(shuō),情況只有些微好轉(zhuǎn)。知識(shí)量總在增大,僅僅跟上進(jìn)度就是一個(gè)挑戰(zhàn)。如果有一份專(zhuān)業(yè)人士必備的書(shū)籍和網(wǎng)站列表該有多好!本文就是這個(gè)列表。它包含了每個(gè)專(zhuān)業(yè)的 Java 語(yǔ)言程序員在書(shū)架或?yàn)g覽器書(shū)簽中必備的最重要的書(shū)籍和網(wǎng)站。
    這些都是您書(shū)架上必備的書(shū)和應(yīng)該經(jīng)常使用的 Web 鏈接。時(shí)間是一項(xiàng)重要的資源,本文幫您回避那些分心的事情,把時(shí)間專(zhuān)注于最有益于您作為Java 語(yǔ)言程序員職業(yè)生涯的信息源。盡管有多少程序員就有多少他們最喜歡的參考資料,但本文收集的這些都是優(yōu)中選優(yōu),來(lái)源于我書(shū)架上的私家珍藏和許多 Java 專(zhuān)家的推薦。

    我考慮了兩種組織這份參考資料列表的方法。我本可以通過(guò)主題領(lǐng)域來(lái)組織,這也許很有幫助,但主題列表很快就會(huì)變得不實(shí)用。相反,我選擇了另一種方法:通過(guò)類(lèi)型來(lái)組織,即書(shū)籍和 Web 站點(diǎn)。

    總的來(lái)講,有經(jīng)驗(yàn)的老手們用 Web 站點(diǎn)來(lái)跟蹤行業(yè)的走勢(shì)。書(shū)籍、文章和論文有助于跟上潮流,但它們總體上更適合于基礎(chǔ)學(xué)習(xí)。極富創(chuàng)造性的書(shū)籍偶爾會(huì)撼動(dòng)一兩個(gè)基礎(chǔ)性的東西。這樣的書(shū)也在本列表之列。

    需要提出的一點(diǎn)警告是,專(zhuān)注于 Java 語(yǔ)言的書(shū)籍和 Web 站點(diǎn)數(shù)量巨大。您鐘愛(ài)的未必在這份列表里。那并不意味著它們不好。它們只是不在這份列表里而已??赡苁且?yàn)槲疫€不知道它們。也可能是因?yàn)槲也徽J(rèn)為它們能夠算得上是重要資源。不包含一些參考資料是一個(gè)評(píng)判問(wèn)題,但如果不這樣的話,您也許就要花幾小時(shí)來(lái)拖動(dòng)滾動(dòng)條,還要花上成千上萬(wàn)美元來(lái)買(mǎi)書(shū)。如果您作為一個(gè)專(zhuān)業(yè)的 Java 程序員,有一些常用的優(yōu)秀參考資料,一定要讓我知道這些資料。這份列表一直都在更新中,您提出的那些也許就會(huì)被收錄進(jìn)去。

    書(shū)籍

    每個(gè)程序員都會(huì)有一些由于經(jīng)常被當(dāng)作專(zhuān)業(yè)資料參閱而磨壞的書(shū)。下列書(shū)籍應(yīng)該是 Java 語(yǔ)言程序員的書(shū)架上必備的。書(shū)很貴,所以我有意將這份列表弄得很短,僅限于重要書(shū)籍。

    Thinking in Java (Bruce Eckel)

    Thinking in Java, 3rd edition (Bruce Eckel; Prentice Hall PTR,2002 年)
    Java 編程思想:第3版 (陳昊鵬 等譯; 機(jī)械工業(yè)出版社,2005 年)
    Eckel 的書(shū)對(duì)于學(xué)習(xí)如何在 Java 語(yǔ)言環(huán)境中使用好面向?qū)ο蠹夹g(shù)極其實(shí)用。書(shū)中大量的代碼樣例解釋了他所介紹的概念。文字出自一個(gè)并不認(rèn)為 Java 技術(shù)總是正確答案的人,所以相當(dāng)?shù)貙?shí)用。Eckel 具有多種語(yǔ)言的大量經(jīng)驗(yàn),還有用面向?qū)ο蠓绞竭M(jìn)行思考的扎實(shí)技能。本書(shū)將這些技能放到實(shí)用的 Java 語(yǔ)言環(huán)境中。他還在寫(xiě)一本新書(shū),名為 Thinking in Enterprise Java。

    Effective Java (Joshua Bloch)

    Effective Java: Programming Language Guide (Joshua Bloch; Addison-Wesley,2001 年)
    Effective Java 中文版 (潘愛(ài)民 譯; 機(jī)械工業(yè)出版社,2003 年)
    本書(shū)是理解優(yōu)秀 Java 程序設(shè)計(jì)原則的最佳書(shū)籍。大多數(shù)材料從其他的 “學(xué)習(xí) Java ” 的書(shū)中根本找不到。例如,Bloch 書(shū)中關(guān)于覆蓋 equals() 這一章是我讀過(guò)的最好的參考資料之一。他也在書(shū)中包括了很實(shí)用的建議:用接口替代抽象類(lèi)和靈活使用異常。Bloch 是 Sun 公司 Java 平臺(tái)庫(kù)的架構(gòu)師,所以他透徹地了解這門(mén)語(yǔ)言。事實(shí)上,他編寫(xiě)了該語(yǔ)言中大量有用的庫(kù)。本書(shū)必讀!

    The Java Programming Language (Ken Arnold, James Gosling, David Holmes)

    The Java Programming Language (Ken Arnold,James Gosling,David Holmes; Addison-Wesley,2000 年)
    Java 編程語(yǔ)言(第 3 版) (虞萬(wàn)榮 等譯,中國(guó)電力出版社,2003 年)
    這也許是能弄到的最好的 Java 入門(mén)讀物。它并不是一個(gè)標(biāo)準(zhǔn)規(guī)范,而是一本介紹每門(mén)語(yǔ)言特性的可讀書(shū)籍。這本書(shū)在嚴(yán)謹(jǐn)性和教育性方面權(quán)衡得很好,能夠讓懂編程的人迅速被 Java 語(yǔ)言(和其豐富的類(lèi)庫(kù))所吸引。

    Concurrent Programming in Java: Design Principles and Patterns (Doug Lea)

    Concurrent Programming in Java: Design Principles and Patterns, 2nd edition (Doug Lea; Addison-Wesley,1999 年)
    Java 并發(fā)編程—設(shè)計(jì)原則與模式(第二版) (趙涌 等譯,中國(guó)電力出版社,2004 年)
    不是每個(gè)開(kāi)發(fā)人員都需要如此細(xì)致地了解并發(fā)性,也不是每個(gè)工程師都能達(dá)到本書(shū)的水準(zhǔn),但卻沒(méi)有比本書(shū)更好的關(guān)于并發(fā)性編程的概述了。如果您對(duì)此感興趣,請(qǐng)從這里開(kāi)始。Lea 是 SUNY 的一名專(zhuān)業(yè)程序員,他的和并發(fā)性有關(guān)的作品和想法都包含在了 JDK 5.0 規(guī)范(引自 JSR166)中,所以您大可放心,他所說(shuō)的關(guān)于有效使用 Java 語(yǔ)言的建議是值得一聽(tīng)的。他是一個(gè)很善于溝通的人。

    Expert One-On-One J2EE Design and Development (Rod Johnson)

    Expert One-On-One J2EE Design and Development (Rod Johnson)
    WROX: J2EE 設(shè)計(jì)開(kāi)發(fā)編程指南 (魏海萍 譯,電子工業(yè)出版社,2003 年)
    對(duì)于剛接觸 J2EE 的人來(lái)說(shuō),這是唯一的一本如實(shí)反映這項(xiàng)技術(shù)的書(shū)。本書(shū)收錄了多年的成功經(jīng)驗(yàn)和失敗經(jīng)驗(yàn),不同于其他許多作者,Johnson 樂(lè)于將失敗的經(jīng)驗(yàn)公諸于眾。J2EE 常常都被過(guò)度使用。Johnson 的書(shū)能幫您避免這一點(diǎn)。

    Refactoring (Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts)

    Refactoring: Improving the Design of Existing Code (Martin Fowler,Kent Beck,John Brant,William Opdyke,Don Roberts; Addison-Wesley,1999 年)
    重構(gòu):改善既有代碼的設(shè)計(jì)(中文版) (侯捷 等譯,中國(guó)電力出版社 ,2003 年)
    Fowler 寫(xiě)了幾本現(xiàn)已出版的最流行的編程書(shū),包括 Analysis Patterns。他的關(guān)于重構(gòu) 的書(shū)是這一主題的基本書(shū)籍。重構(gòu)代碼是被程序員忽略的訓(xùn)練,但卻是程序員最直觀的想法。重構(gòu)是在不改變代碼結(jié)果的前提下改進(jìn)現(xiàn)有代碼的設(shè)計(jì)。這是保持代碼整潔的最佳方式,用這種方法設(shè)計(jì)的代碼總是很容易修改。什么時(shí)候進(jìn)行重構(gòu)呢?當(dāng)代碼“散發(fā)出味道”時(shí)。Fowler 的書(shū)里滿是 Java 語(yǔ)言代碼的例子。許多 Java 語(yǔ)言集成開(kāi)發(fā)環(huán)境(IDE)(包括了 IBM 的 Eclipse)都將 Fowler 的重構(gòu)包含了進(jìn)去,每一個(gè)都使用他的重構(gòu)名命名,所以熟悉如extract method 等重構(gòu)方法還是很值得的。

    Design Patterns (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)

    Design Patterns: Elements of Reusable Object Oriented Software (Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides; Addison-Wesley,1997 年)
    設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ) (李英軍 等譯,機(jī)械工業(yè)出版社 ,2005 年)
    這是一本在專(zhuān)業(yè)程序員圈子里更為有名的書(shū),基于作者共同的綽號(hào),這本書(shū)被認(rèn)為是 “四人幫(GOF)之書(shū)”。模式是思考和解決普通編程問(wèn)題時(shí)可以重用的方式。學(xué)習(xí)模式是一門(mén)學(xué)科。使用好模式(或知道什么時(shí)候不 使用模式)是一項(xiàng)技能。忽略模式則是錯(cuò)誤的。書(shū)中所有的例子都以 C++ 表示,但 Java 語(yǔ)言是從那里誕生的,讓 Java 語(yǔ)言程序員由此聯(lián)系到如何在 Java 語(yǔ)言中實(shí)現(xiàn)這些模式相對(duì)簡(jiǎn)單一些。熟悉模式并了解如何使用好模式使編程更加簡(jiǎn)單。這使得和其他程序員交流也更簡(jiǎn)單,因?yàn)樵卺槍?duì)通用問(wèn)題的通用解決方案中,模式是描述解決方案中彼此協(xié)作的大量相關(guān)編程概念的快捷方式。一些更為通用的方式,如工廠方法 則是普便存在的,甚至存在于 Java 語(yǔ)言本身。關(guān)于明智使用模式的這個(gè)主題,也可以閱讀 Joshua Kerievsky 的 Refactoring to Patterns,該書(shū)稱可以讓代碼來(lái)告訴您何時(shí)實(shí)現(xiàn)模式。

    Patterns of Enterprise Application Architecture (Martin Fowler)

    Patterns of Enterprise Application Architecture (Martin Fowler; Addison-Wesley,2002 年)
    企業(yè)應(yīng)用架構(gòu)模式 (王懷民 等譯,機(jī)械工業(yè)出版社 ,2004 年)
    比起小型、一次性項(xiàng)目來(lái)說(shuō),企業(yè)開(kāi)發(fā)當(dāng)然代表了更大的挑戰(zhàn)。那并不意味著企業(yè)開(kāi)發(fā)帶來(lái)的所有挑戰(zhàn)都是新挑戰(zhàn)。事實(shí)上有些時(shí)候,這項(xiàng)開(kāi)發(fā)已經(jīng) 是以前完成過(guò)的了。Fowler 做了很多個(gè)這樣的項(xiàng)目。他的書(shū)提到了一些通用解決方案,并提供了關(guān)于使用、折中和可選方案的指導(dǎo)。Fowler 在書(shū)中包含了一些熟悉的模式,如模型視圖控制器(MVC),他也提供了一些您也許不了解的模式,如處理 Web 站點(diǎn)上特定頁(yè)面請(qǐng)求或行為請(qǐng)求的 Page Controller 模式。正如您對(duì)待大多數(shù)模式一樣,一旦您讀過(guò)許多模式,您就會(huì)認(rèn)為 “我已經(jīng)知道那個(gè)模式了” 。也許是這樣,但有一個(gè)用來(lái)引用模式的通用表達(dá)方式還是很有幫助的。在有多個(gè)組件(由不同人開(kāi)發(fā))的大型項(xiàng)目中,該類(lèi)引用是一項(xiàng)很好的幫助。

    UML Distilled (Martin Fowler)

    UML Distilled: A Brief Guide to the Standard Object Modeling Language (Martin Fowler; Addison-Wesley 2003 年)
    UML精粹:標(biāo)準(zhǔn)對(duì)象語(yǔ)言簡(jiǎn)明指南(第3版) (徐家福 譯,清華大學(xué)出版社 ,2005 年)
    對(duì)于專(zhuān)業(yè)的程序員來(lái)說(shuō),UML 是一門(mén)很重要的通用可視化溝通語(yǔ)言,但是它被過(guò)度使用和草率地濫用了。您無(wú)需對(duì)使用 UML 溝通了解太多。Martin 對(duì) UML 的提煉為您提供了最核心的東西。事實(shí)上,前后的封頁(yè)提供了常規(guī)基礎(chǔ)上可能使用到的所有東西。該書(shū)中 UML 例子的代碼都是 Java 代碼。

    Test-Driven Development: By Example (Kent Beck)

    Test-Driven Development: By Example (Kent Beck; Addison-Wesley 2002 年)
    測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(中文版) (崔凱 譯,中國(guó)電力出版社 ,2004 年)
    測(cè)試優(yōu)先編程將使編程發(fā)生革命性變化,能助您成為更好的程序員。在寫(xiě)代碼之前編寫(xiě)測(cè)試開(kāi)始很難,但卻是一項(xiàng)威力強(qiáng)大的技能。通過(guò)優(yōu)先編寫(xiě)測(cè)試,可使代碼更加簡(jiǎn)單,并確保從一開(kāi)始它就能工作(Beck 實(shí)踐著他提倡的測(cè)試優(yōu)先,與人合寫(xiě)了 JUnit,這是 Java 語(yǔ)言最流行的測(cè)試框架)。Beck 的書(shū)是權(quán)威的參考資料,擴(kuò)展了的 Money 例子也用 Java 語(yǔ)言寫(xiě)成。Beck 詳述了如何用測(cè)試優(yōu)先進(jìn)行 思考(這也許是許多程序員首先遇到的障礙)。

    The Pragmatic Programmer: From Journeyman to Master (Andy Hunt and Dave Thomas)

    The Pragmatic Programmer: From Journeyman to Master (Andrew Hunt 和 David Thomas; Addison-Wesley 1999 年)
    程序員修煉之道——從小工到專(zhuān)家 (馬維達(dá) 譯,電子工業(yè)出版社 ,2004 年)
    做一個(gè)純粹的面向?qū)ο箝_(kāi)發(fā)人員有其優(yōu)勢(shì)所在。在當(dāng)今復(fù)雜的社會(huì)中,作為 Java 語(yǔ)言開(kāi)發(fā)人員,為完成任務(wù)常要妥協(xié)。Hunt 和 Thomas 探討了如何不將真正重要的東西妥協(xié)掉而完成任務(wù)。這不是一本關(guān)于 Java 語(yǔ)言的書(shū),而是 Java 語(yǔ)言開(kāi)發(fā)人員重要的思想讀物。例如,我認(rèn)為沒(méi)從“要解決問(wèn)題,而不是推卸責(zé)任”這句忠言中受益的程序員,不能像個(gè)自豪的藝術(shù)家一樣在他的杰作上簽上大名。

    Peopleware: Productive Projects and Teams (Tom DeMarco and Timothy Lister)

    Peopleware: Productive Projects and Teams (Tom DeMarco,Timothy Lister; Dorset House,1999 年)
    人件(第2版) (UMLChina 翻譯組 譯,清華大學(xué)出版社 ,2003 年)
    這份列表中的其他所有書(shū)籍都至少和技術(shù)有些相關(guān)。這本書(shū)卻不是。在所有技術(shù)行話和首字母縮略詞的海洋中,有時(shí)軟件開(kāi)發(fā)人員和經(jīng)理們會(huì)忘記:是人 制造了軟件。DeMarco 和 Lister 向我們提醒了這一事實(shí),也向我們提醒了形成這一區(qū)別的原因。這不是一本關(guān)于一門(mén)特定編程語(yǔ)言的書(shū)籍,但卻是每個(gè) Java 語(yǔ)言程序員都應(yīng)該讀的書(shū)。關(guān)于 “累死程序員如何讓經(jīng)理們適得其反” 還有許多其他的好書(shū),但這是最好的一本。



    Web 站點(diǎn)

    Web 站點(diǎn)的數(shù)目浩如煙海,如果您想要消化其中的內(nèi)容,窮畢生之力也難以全部訪問(wèn)。包含 Java 語(yǔ)言某方面內(nèi)容的詳盡的網(wǎng)站列表會(huì)大得離譜。下列站點(diǎn)都是可靠、真實(shí)的。

    Sun 的 Java 技術(shù)站點(diǎn)

    Sun 的 Java 語(yǔ)言站點(diǎn)
    這是 Sun 的 Java 語(yǔ)言主站。作為 Java 語(yǔ)言開(kāi)發(fā)人員,您會(huì)發(fā)現(xiàn)自己頻繁地訪問(wèn)此站點(diǎn)。下列鏈接特別重要,特別是對(duì)新入行的 Java 語(yǔ)言開(kāi)發(fā)人員:

    New to Java Center
    New to Java Center
    New to Java Center 存放了許多循序漸進(jìn)的 Java 技術(shù)資源鏈接。如果您剛接觸這門(mén)語(yǔ)言,這是一個(gè)好的起點(diǎn)。
    教程和代碼庫(kù)
    Java Tutorial
    這里有大名鼎鼎的 Java Tutorial,以及關(guān)于 Java 語(yǔ)言各個(gè)方面(例如 Collection)的其他教程。

    IBM developerWorks

    IBM 的 developerWorks
    推銷(xiāo)自己也許有些厚臉皮,但 developerWorks 是一項(xiàng)巨大的資源,收錄了大量 Java 語(yǔ)言工具和技術(shù)的教程和文章。其內(nèi)容從初學(xué)者指南到學(xué)習(xí)這門(mén)語(yǔ)言到高級(jí)并發(fā)性技術(shù)??梢愿鶕?jù)主題搜索內(nèi)容,然后根據(jù)類(lèi)型瀏覽。

    Apache Software Foundation

    Apache Software Foundation
    Apache 站點(diǎn)是許多可重用庫(kù)(通用領(lǐng)域)和工具的主頁(yè),這些庫(kù)和工具幫助 Java 開(kāi)發(fā)人員進(jìn)行開(kāi)發(fā)。這里的內(nèi)容全都是開(kāi)放源碼,所以盡管下載想要的吧!許多極其流行的 Java 語(yǔ)言庫(kù)和工具(如 Struts、Ant 和 Tomcat)都始于 Apache 項(xiàng)目。Jakarta 專(zhuān)區(qū)匯聚了大多數(shù)新興的 Java 語(yǔ)言材料。

    Eclipse.org

    Eclipse
    有幾個(gè)好的 Java 語(yǔ)言集成開(kāi)發(fā)環(huán)境(IDE)。Eclipse(來(lái)自 IBM)是最新的 IDE 之一,它很快成為 Java 語(yǔ)言開(kāi)發(fā)的首要 IDE。它完全是開(kāi)源的,這意味著它是免費(fèi)的。該站包含了學(xué)習(xí)如何有效使用 Eclipse 的各種參考資料。這里還有關(guān)于 Standard Widget Toolkit(SWT)的信息,SWT 是相對(duì)于 Swing 來(lái)說(shuō)更加輕量級(jí)的選擇。

    Eclipse 插件中心和 Eclipse 插件

    Eclipse 插件中心 和 Eclipse 插件
    Eclipse 基于插件架構(gòu)。事實(shí)上,插件是 Eclipse 的 Java 語(yǔ)言開(kāi)發(fā)組件。但有差不多上千個(gè)插件,從 Web 開(kāi)發(fā)的插件到在 Eclipse 環(huán)境中玩游戲的插件。這兩個(gè)站點(diǎn)分類(lèi)列出了大多數(shù)插件,可以進(jìn)行搜索。它們是很棒的資源。如果您想在 Eclipse 開(kāi)發(fā)環(huán)境中弄點(diǎn)新東西,幸運(yùn)的話有某個(gè)插件可能已經(jīng)實(shí)現(xiàn),從這兩個(gè)站點(diǎn)能找到想要的插件。這兩個(gè)站點(diǎn)都允許評(píng)論插件,這樣您就可以知道哪些插件好,哪些值得一試。

    JUnit.org

    JUnit.org
    Junit 是 Java 語(yǔ)言中一個(gè)基本的單元測(cè)試框架。該站點(diǎn)包含了 Junit 最新最棒的版本,外加大量有關(guān)測(cè)試(Java 語(yǔ)言或者其他語(yǔ)言的)各個(gè)層面上(針對(duì)桌面應(yīng)用程序、Web 應(yīng)用程序、J2EE 應(yīng)用程序等)的其他資源。如果您想找測(cè)試資源,這里就是最佳起點(diǎn)。

    TheServerSide.com

    TheServerSide.com
    如果您要(或?qū)⒁?從事服務(wù)器端 Java 語(yǔ)言的開(kāi)發(fā),此站點(diǎn)是一處舉足輕重的資源。您可以到這里找到有關(guān) JBoss、J2EE、LDAP、Struts 和大量其他主題的文章,并且都是完全可檢索的。這些文章不僅僅是簡(jiǎn)單描述 Java 語(yǔ)言的特征或者支持的庫(kù)。它們更進(jìn)一步地描述了庫(kù)的新奇用法(如使用 Jakarta Velocity 作為規(guī)則引擎,而不是模板引擎)。它們也提供了有關(guān) Java 語(yǔ)言現(xiàn)狀的連續(xù)評(píng)論(當(dāng)前的一篇文章是由 Tim Bray 所寫(xiě)的 Java is boring )。該站點(diǎn)更好的通用功能之一是對(duì) Java 語(yǔ)言工具和產(chǎn)品(應(yīng)用服務(wù)器等)的矩陣式比較。

    Bruce Eckel's MindView, Inc.

    Bruce Eckel's MindView, Inc.
    Eckel 寫(xiě)了幾本 “用 …… 進(jìn)行思考” 的書(shū),內(nèi)容關(guān)于 Java 語(yǔ)言、Python 和 C++ ,當(dāng)我學(xué)習(xí) Java 語(yǔ)言時(shí),他的 Thinking in Java 對(duì)我尤其有幫助。它很實(shí)用并切中要害,在“在 Java 語(yǔ)言環(huán)境中如何面向?qū)ο笏伎肌狈矫婢哂凶孔R(shí)。您可以從此站點(diǎn)免費(fèi)下載他所有書(shū)籍的電子版。他也寫(xiě)了許多好文章,并且他把這些文章的鏈接都放到了這里(包括關(guān)于 Jython、Java 和 .NET 比較等內(nèi)容的文章)。

    ONJava.com

    ONJava.com
    O'Reilley 歷年來(lái)出版了一些有關(guān)編程語(yǔ)言和工具的優(yōu)秀書(shū)籍。他們的專(zhuān)注于 Java 語(yǔ)言的網(wǎng)站也不錯(cuò)。它有些有關(guān)各種 Java 語(yǔ)言工具(如 JDOM 和 Hibernate)、Java 平臺(tái)(如 J2SE 和 J2EE)不同領(lǐng)域不同部分的文章。全部都可以被檢索到。他們有優(yōu)秀的文章和教程。該站點(diǎn)按主題排列。例如有 Java 和 XML、Java Security、Wireless Java 和 Java SysAdmin。該站點(diǎn)也有到 O'Reilley Learning Lab 的鏈接,在那里您能獲得在線參考資料(Java 語(yǔ)言相關(guān)和其他的)。那些不是免費(fèi)的,但是許多都面向大學(xué)認(rèn)證。因此您可以以一種很方便的方式來(lái)學(xué)習(xí)技能,并得到一些認(rèn)證。

    java.net

    java.net 社區(qū)
    java.net 社區(qū)有多個(gè)“社區(qū)”,有特定于主題的論壇和文章。例如 Java Desktop 社區(qū)有各類(lèi)與 Java 語(yǔ)言桌面開(kāi)發(fā)相關(guān)的資料。Java Patterns 社區(qū)作為一個(gè)門(mén)戶,也許對(duì)提供 Java 語(yǔ)言的模式資源相當(dāng)感興趣。還有一個(gè) Java User Groups (JUG) 社區(qū),在那里能找到有關(guān)創(chuàng)建、加入和管理一個(gè) JUG 的信息。




    結(jié)束語(yǔ)

    任何 “好的”、“關(guān)鍵性的” 或者 “重要的” 參考資料列表都注定是不完整的,本文的列表也未能例外。 Java 語(yǔ)言的書(shū)籍?dāng)?shù)目眾多,當(dāng)然,萬(wàn)維網(wǎng)也很龐大。除本文所列的參考資料之外,還有很多用于學(xué)習(xí) Java 語(yǔ)言的參考資料。但如果您擁有了這里所提到的所有書(shū)籍、網(wǎng)站、文章或者教程,您應(yīng)當(dāng)已經(jīng)擁有了一個(gè)使您良好開(kāi)端并助您登堂入室的實(shí)用寶庫(kù)。

    最后,要成為一個(gè)能力日增和高效的 Java 語(yǔ)言開(kāi)發(fā)人員,方法就是用它工作,動(dòng)手來(lái)嘗試。如果有一個(gè)教程詳細(xì)介紹了所需創(chuàng)建的軟件的每一部分,您很可能并沒(méi)得到多少好處。有時(shí),您可能得走自己的路。在成功地嘗試了一些新的東西之后,您可能想要寫(xiě)一篇文章、教程或者一本書(shū)來(lái)分享您所學(xué)到的。

    posted @ 2007-01-27 12:12 大熊貓 閱讀(303) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn):

    引子:
    我們以兩個(gè)大型網(wǎng)站為例作比較:
    51job和智聯(lián)招聘(先聲明我不是為他們作廣告,僅以他們?yōu)槔骷夹g(shù)上的比較)
    51job采用的是比較“先進(jìn)”的php技術(shù),而智聯(lián)用的是比較落后的asp.但我們可能會(huì)明顯的感覺(jué)到51job的反應(yīng)速度相比智聯(lián)招聘實(shí)在是太慢了,為什么會(huì)這樣?細(xì)心的人可能會(huì)察覺(jué)到了。智聯(lián)雖然用的是asp,但他采用了另一種更巧妙的技術(shù)--asp生成靜態(tài)頁(yè)技術(shù)。所有的動(dòng)態(tài)頁(yè)基本上都轉(zhuǎn)換成了html靜態(tài)頁(yè),不用訪問(wèn)數(shù)據(jù)庫(kù),當(dāng)然反應(yīng)快了。
    下面我們討論一下jsp怎么轉(zhuǎn)換成html??
    首先要做一個(gè)模板。后綴不限,但一般都用*.template例子
    <html>
    <head>
    <title>#title#</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <LINK href="../css.css" rel=stylesheet type=text/css>
    </head>

    <body>
    <P align="center">
    #title#<BR><BR><BR>
    作者:#author#<BR><BR>
    <BR>
    #content#<BR><BR><BR><BR>
    </P>
    </body>
    </html>
    做一個(gè)處理模板的類(lèi)或者jsp文件、(為說(shuō)明問(wèn)題我們從簡(jiǎn)單入手以一個(gè)jsp文件為例)
    ?filePath = request.getRealPath("/")+"WEB-INF/templates/template.htm";
    ?out.print(filePath);
    ?String templateContent="";
    ?FileInputStream fileinputstream = new FileInputStream(filePath);//讀取模塊文件
    ?int lenght = fileinputstream.available();
    ?byte bytes[] = new byte[lenght];
    ?fileinputstream.read(bytes);
    ?fileinputstream.close();
    ?templateContent = new String(bytes);
    ?out.print("以下是模板內(nèi)容:<br>"+templateContent+"<br> 以下是置換以后的html內(nèi)容<br><hr>");
    ?templateContent=templateContent.replaceAll("#title#",title);
    ?templateContent=templateContent.replaceAll("#author#",editer);//替換掉模塊中相應(yīng)的地方
    ?templateContent=templateContent.replaceAll("#content#",content);
    ?// 根據(jù)時(shí)間得文件名
    ?Calendar calendar = Calendar.getInstance();
    ?String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";
    ?fileame = request.getRealPath("/")+fileame;//生成的html文件保存路徑

    ?out.print(templateContent);
    ?FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件輸出流
    ?byte tag_bytes[] = templateContent.getBytes();
    ?fileoutputstream.write(tag_bytes);
    ?fileoutputstream.close();
    嗯,核心技術(shù)就是這樣了,如果大家要求的性能更高,可以改用freemarker做模板。freemarker的使用方法可以參閱我的另一篇文章《Freemarker 模板工具的作用及使用》

    轉(zhuǎn)自JavaThink

    posted @ 2007-01-10 11:38 大熊貓 閱讀(447) | 評(píng)論 (1)編輯 收藏

    轉(zhuǎn):

    1 前言
     為了使軟件開(kāi)發(fā)過(guò)程有章可循,保證軟件質(zhì)量,加強(qiáng)開(kāi)發(fā)管理。

    2 開(kāi)發(fā)管理
     項(xiàng)目進(jìn)度周報(bào)表格如下:
     項(xiàng)目編號(hào):
     匯報(bào)人:
     匯報(bào)日期:
     項(xiàng)目進(jìn)度詳細(xì)描述:
     其他問(wèn)題:

    3 項(xiàng)目周期
     司項(xiàng)目開(kāi)發(fā)周期分為以下幾個(gè)步驟:
     步驟 說(shuō)明 參與角色 生成文檔或程序(打*號(hào)為可選)
     可行性分析 對(duì)項(xiàng)目的技術(shù),功能需求和市場(chǎng)進(jìn)行調(diào)研和初步分析,確定是否需要立項(xiàng)開(kāi)發(fā)。 部門(mén)主管核心技術(shù)員 可行性分析報(bào)告*技術(shù)調(diào)研報(bào)告* 立項(xiàng) 正式立項(xiàng),由部門(mén)主管指定項(xiàng)目經(jīng)理,項(xiàng)目經(jīng)理制定初步計(jì)劃。初步計(jì)劃包括設(shè)計(jì)和開(kāi)發(fā)時(shí)間的初步估算。 部門(mén)主管核心技術(shù)員 項(xiàng)目初步計(jì)劃 需求分析 對(duì)項(xiàng)目進(jìn)行詳細(xì)的需求分析,編寫(xiě)需求分析文檔。對(duì)于B/S結(jié)構(gòu)軟件系統(tǒng)需要制作靜態(tài)演示頁(yè)面。需求分析文檔和靜態(tài)演示頁(yè)面需要通過(guò)部門(mén)主管審批才能夠進(jìn)行到下一個(gè)步驟 項(xiàng)目經(jīng)理項(xiàng)目核心小組 需求分析文檔靜態(tài)演示頁(yè)面項(xiàng)目計(jì)劃修訂版本詳細(xì)設(shè)計(jì) 根據(jù)需求分析對(duì)項(xiàng)目進(jìn)行詳細(xì)設(shè)計(jì)。詳細(xì)設(shè)計(jì)以后,項(xiàng)目經(jīng)理同部門(mén)主管一起指定項(xiàng)目小組開(kāi)發(fā)成員。 項(xiàng)目經(jīng)理項(xiàng)目核心小組 詳細(xì)設(shè)計(jì)文檔項(xiàng)目計(jì)劃確定版本開(kāi)發(fā) 根據(jù)設(shè)計(jì)開(kāi)發(fā)項(xiàng)目,由美工對(duì)操作界面進(jìn)行美化。 項(xiàng)目經(jīng)理項(xiàng)目開(kāi)發(fā)員美工 項(xiàng)目計(jì)劃修訂版本*測(cè)試 項(xiàng)目經(jīng)理提交測(cè)試申請(qǐng),由測(cè)試部門(mén)對(duì)項(xiàng)目進(jìn)行測(cè)試。項(xiàng)目小組配合測(cè)試部門(mén)修改軟件中的錯(cuò)誤。 項(xiàng)目經(jīng)理項(xiàng)目開(kāi)發(fā)員測(cè)試部 測(cè)試申請(qǐng)測(cè)試計(jì)劃測(cè)試報(bào)告 項(xiàng)目驗(yàn)收 項(xiàng)目驗(yàn)收歸檔 部門(mén)主管項(xiàng)目經(jīng)理 項(xiàng)目所有文檔和程序

    4 命名規(guī)范
     4.1 項(xiàng)目編號(hào)命名規(guī)范
     待完善

    4.2 文檔命名規(guī)范
     待完善

    4.3 jsp/html命名規(guī)范
     jsp與html文件名全部小寫(xiě),并遵循如下的規(guī)范:

    數(shù)據(jù)/內(nèi)容顯示頁(yè)
     名詞,多個(gè)單詞用下劃線分隔,要求能說(shuō)明顯示內(nèi)容的信息,為避免沖突,可加上 “_list”。例如:
    new_message.html 或 my_file_list.jsp

    操作處理頁(yè)
     命名格式:名詞_下劃線_動(dòng)詞,例如:file_delete.jsp。

    含frame頁(yè)面
     <frameset>中<frame>的name屬性命名的格式是①xxx._②xxx_③xxx
     ①xxx部分用來(lái)標(biāo)識(shí)當(dāng)前頁(yè)面隸屬于整個(gè)系統(tǒng)中的哪一功能模塊。
     如:屬于ebwebmail則被表示為ebwebmail,其它情況依次類(lèi)推。
     ②xxx部分標(biāo)識(shí)當(dāng)前頁(yè)面所要完成的功能。
     如:完成用戶登錄的功能則被標(biāo)識(shí)為login,其它情況依次類(lèi)推。
    ?、踴xx部分用來(lái)用來(lái)表示頁(yè)面在瀏覽器窗口所處的位置。
     處于瀏覽器窗口的頂部則標(biāo)識(shí)為top,其它情況依次類(lèi)推。
     例如:ebwebmail_inbox_top.jsp

    <frame> src屬性相應(yīng)的文件名根據(jù)情況建議在原命名規(guī)范上用下劃線加上所處窗口的位置。

    javascript腳本方法
     腳本函數(shù)都以①xxx_②xxx的方式命名。
     ①xxx對(duì)應(yīng)頁(yè)面隸屬的模塊。
    ?、趚xx表示函數(shù)所要實(shí)現(xiàn)的功能(動(dòng)賓結(jié)構(gòu)),多個(gè)單詞用下劃線連接。
     例如:ebwebmail_send_mail()

    模塊通用的腳本函數(shù)必須集合于一個(gè)js文件中,在頁(yè)面上通過(guò)<script language=”javascript” src=”url”></script>形式導(dǎo)入。js文件名命名使用模塊名,例如:ebwebmail.js。

    如果項(xiàng)目已經(jīng)提供了公共js腳本,則優(yōu)先使用公共js腳本中提供的函數(shù)。

    所有定義方法的<script>元素定義在<head></head>中或</body>后。

    javascript腳本內(nèi)部變量與參數(shù)
     單詞之間用下劃線分隔且全部小寫(xiě),例如: var file_size。

    <form>表單name屬性
     統(tǒng)一以“form_”開(kāi)頭,其后加該表單所需收集的信息的作用或動(dòng)作,例如:form_file_upload 或 form_send_mail。

    表單elements
     表單element的名稱以element需收集的信息標(biāo)示命名,單詞之間使用下劃線分隔且全部小寫(xiě),例如:

     <input type=”text” name=”username”>
     <input type=”radio” name=”file_type”>
     <textarea name=”content” rows=”5” cols=”40”>

    cookie命名
     命名格式:模塊名_存儲(chǔ)信息名詞(多個(gè)單詞用下劃線分隔) ,全部大寫(xiě),例如:EBWEBMAIL_SORT_TYPE。

    window.open中name參數(shù)的命名
     javascript的window.open方法中有一個(gè)name的參數(shù),瀏覽器約定同樣的名字的窗口只能打開(kāi)一個(gè),如果程序間名字重復(fù)將相互沖突。如果不限制打開(kāi)窗口數(shù),可以指定‘’或“”(不是null),否則需要加上模塊名,例如ebwebmail_viewmail。

    4.4 數(shù)據(jù)庫(kù)命名規(guī)范
     數(shù)據(jù)庫(kù)表命名均遵循以下規(guī)范:
     模塊名_存儲(chǔ)信息名詞(多個(gè)單詞用下劃線分隔),全部小寫(xiě),例如:ebwebmail_message。

    數(shù)據(jù)庫(kù)字段命名遵循以下規(guī)范:
     存儲(chǔ)信息名詞(多個(gè)單詞用下劃線分隔),全部小寫(xiě),例如:message_id。

    5 文檔規(guī)范

     1. 編寫(xiě)文檔目前主要使用的工具是Word(項(xiàng)目計(jì)劃文檔例外,需要使用Project制作),輔助使用的工具有Visio,PowerPoint,ERWin等。

    2. 文檔務(wù)必保持段落格式整齊,文字字體,顏色,大小統(tǒng)一。

    3. 如果需要摘引html頁(yè)面中的內(nèi)容,不能直接從html中粘貼過(guò)來(lái)(會(huì)在word文檔中留下html格式),而必須先去除格式,例如:先粘貼到notepad中。

    4. 務(wù)必注意中英文標(biāo)點(diǎn)符號(hào),文檔正文一概使用中文標(biāo)點(diǎn)符號(hào)。

    5. 如果需要在文檔中插圖,不要使用word自帶的繪圖工具??梢赃x擇使用PowerPoint或visio。使用PowerPoint,選擇“插入”->“對(duì)象”->“Microsoft PowerPoint 幻燈片”。使用visio,需要另外建立visio文檔,繪制完以后粘貼到word中。

    6. 數(shù)據(jù)建模使用ERwin工具,文檔中僅需要粘貼數(shù)據(jù)模型的邏輯視圖(logical view),另外還要附上表結(jié)構(gòu)描述。

    7. 修改他人文檔務(wù)必使用修訂模式,以便保留備修改的內(nèi)容。使用修訂模式,選擇“工具”->“修訂”->“突出顯示修訂”,勾上“編輯時(shí)標(biāo)記修訂”。

    附:一些模版
     ü Java類(lèi)設(shè)計(jì)(class documentation)
     聲明:

    描述:

    屬性:1. property_name
     聲明
     說(shuō)明

    方法: 1. method_name
     聲明
     說(shuō)明
     參數(shù)
     返回值
     異常

    注:
     方法聲明中,如果遇到重載的方法,可以使用“|”表示可以接受不同類(lèi)型的參數(shù),例如:“String value | int value”;可以使用“[]”表示可選的參數(shù),例如:“Object message[,Throwable t]”

    Servlet設(shè)計(jì)(servlet document)
     類(lèi)名 接受參數(shù)列表 描述

    數(shù)據(jù)表設(shè)計(jì)(data modeling)
     表名:some_table

    說(shuō)明:description

    表結(jié)構(gòu):
     字段名 類(lèi)型 說(shuō)明

    6 代碼規(guī)范
     6.1 Java源代碼規(guī)范
     6.1.1 命名
     u Package 的命名
     Package 的名字應(yīng)該都是由一個(gè)小寫(xiě)單詞組成,例如:net.ebseries.modules。
     此外,對(duì)于包名我們做如下約定:
     1. 工具函數(shù)類(lèi)包名前綴為.util
     2. Servlet類(lèi)包名前綴為.servlet
     3. test case類(lèi)包名前綴為.test

    Class 的命名
     Class 的名字必須由大寫(xiě)字母開(kāi)頭而其他字母都小寫(xiě)的單詞組成,例如:DataFile或InfoParser。

    Class 變量的命名
     變量的名字必須用一個(gè)小寫(xiě)字母開(kāi)頭。后面的單詞用大寫(xiě)字母開(kāi)頭,例如:debug 或 inputFileSize。

    Static Final 變量的命名
     Static Final 變量的名字應(yīng)該都大寫(xiě),并且指出完整含義,例如:MAX_UPLOAD_FILE_SIZE=1024。

    參數(shù)的命名
     參數(shù)的名字必須和變量的命名規(guī)范一致。

    數(shù)組的命名
     數(shù)組應(yīng)該總是用下面的方式來(lái)命名:
     byte[] buffer;
     而不是:
     byte buffer[];

    方法的參數(shù)
     使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字:

     SetCounter(int size)
     {
     this.size = size;
     }

    6.1.2 代碼格式
     文件頭聲明
     源文件的頭部需要一個(gè)history段,對(duì)于每次對(duì)源文件的重大改動(dòng),都需要在history段中注明。該段定義在package和  import之間,例如:

     /*****************************************************
     * HISTORY
     *
     * 2002/01/29 Biz 創(chuàng)建文件
     *
     * 2002/02/19 kevin 增加新功能
     *
     *******************************************************/

    import順序
     import包按一下順序:
     1. jdk標(biāo)準(zhǔn)包
     2. java擴(kuò)展包(例如servlet,javamail,jce等)
     3. 使用的外部庫(kù)的包(例如xml parser)
     4. 使用的項(xiàng)目的公共包
     5. 使用的模塊的其他包
     每一類(lèi)import后面加一個(gè)換行。

    例如:
     import java.io.*;
     import java.util.*;

    import javax.servlet.*;
     import javax.mail.*;

    import org.apache.xml.*;

    import net.ebseries.*;
     import net.ebseries.util.*;

    import net.ebseries.ebwebmail.*;


    代碼塊書(shū)寫(xiě)格式
     可以選擇以下任意一種代碼塊的書(shū)寫(xiě)方式:

     if (true){
     //body
     }

    if (true)
     {
     //body
     }


    建議使用第二種書(shū)寫(xiě)方式。如果是修改他人的代碼,必須使用代碼原來(lái)的書(shū)寫(xiě)方式。

    對(duì)于代碼塊過(guò)長(zhǎng),超過(guò)1屏以上,}后面要說(shuō)明屬于那個(gè)代碼塊,例如:

    if (i > 100)
     {
     //too many lines more than one screen
     }// if (i > 100)

    關(guān)于縮進(jìn)
     縮進(jìn)使用4個(gè)連續(xù)空格,不要在源文件中保存tab字符, 請(qǐng)注意調(diào)整所用的IDE工具,打開(kāi)將tab轉(zhuǎn)換為空格功能。

    頁(yè)寬
     頁(yè)寬應(yīng)該設(shè)置為80字符. 源代碼一般不會(huì)超過(guò)這個(gè)寬度, 并導(dǎo)致無(wú)法完整顯示, 但這一設(shè)置也可以靈活調(diào)整. 在任何情況下, 超長(zhǎng)的語(yǔ)句應(yīng)該在一個(gè)逗號(hào)或者一個(gè)操作符后折行. 一條語(yǔ)句折行后, 應(yīng)該比原來(lái)的語(yǔ)句再縮進(jìn)4個(gè)空格。

    操作符
     操作符左右各用一個(gè)空格分隔。
     例如:
     int a = b;
     if (a > 0);

    SQL語(yǔ)句
     代碼中書(shū)寫(xiě)的sql語(yǔ)句要求sql關(guān)鍵字全部大寫(xiě),表名和字段名小寫(xiě)。例如:
     SELECT user_id, name FROM account WHERE user_id > ? AND depart = ? ORDER BY name

    類(lèi)和方法定義
     類(lèi)定義或方法定義過(guò)長(zhǎng)需要換行書(shū)寫(xiě),例如:

    public class CounterSet
     extends Observable
     implements Cloneable

    private PortletSet getPortlets( Portlets portlets,
     RunData rundata,
     boolean application,
     boolean applicationsOnly )
     {
     }


    6.1.3 注釋
     public 和 protected的成員變量和方法必須寫(xiě)javadoc注釋。超過(guò)1句以上的注釋使用中文書(shū)寫(xiě)。對(duì)于代碼多于10行的private方法也要寫(xiě)javadoc注釋。

    對(duì)于代碼中的邏輯分支或循環(huán)條件需要書(shū)寫(xiě)注釋?zhuān)纾?br />
    if (some condition)
     {
     //符合某個(gè)條件,應(yīng)該這樣處理
     }
     else
     {
     //否則應(yīng)該那樣處理
     }

    6.1.4 其他
     關(guān)于屬性
     類(lèi)中的屬性不能定義為public變量直接存取,而是定義成protect變量并編寫(xiě)get/set方法,例如:

     protect String myName;

    public String getMyName()
     {
     return myName;
     }

    public void setMyName(String myName)
     {
     this.myName=myName;
     }


    6.2 jsp/html代碼規(guī)范
     jsp/html描述注釋
     jsp/html頁(yè)面頂部必須存在一個(gè)基本描述注釋?zhuān)δ苊枋?、參?shù)列表和歷史修改信息,例如:

    <%--
     /**************************************************
     *
     * NAME : file_download.jsp
     *
     * PURPOSE : 下載文件提示
     *
     * PARAMETERS :
     * file_id - 文件ID號(hào)
     * force ?C 是否強(qiáng)制下載
     *
     * HISTORY
     *
     * 2002/04/05 Hafele 創(chuàng)建文件
     *
     * 2002/06/07 tmp 增加強(qiáng)制下在功能
     *
     *************************************************/
     --%>

    jsp頭格式
     jsp頭部一般需要遵循以下格式:

     <%@ page contentType="text/html;charset=gb2312" %>
     <%@ page import="java.io.*" %> // jdk標(biāo)準(zhǔn)包
     <%@ page import="javax.mail.*" %> // java擴(kuò)展包
     <%@ page import="org.apache.xml.*" %> //使用的外部庫(kù)的包
     <%@ page import="com.sunrise..*" %> //使用的項(xiàng)目的公共包
     <%@ page import=" com.sunrise.applications.*" %> //使用的模塊的其他包
     <%@ include file="some.jsp" %> //include其他的jsp
     <%
     response.setHeader("Pragma","No-cache");
     response.setHeader("Cache-Control","no-cache");
     response.setHeader("Expires","0");
     %> //一般jsp都需要防止緩存

    html格式
     1. html頭一般需要遵循以下格式:

     <head>
     <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
     <title>some title</title>
     <link rel="stylesheet" href="some.css" type="text/css">
     <script language="javascript">
     //some javascript
     </script>
     </head>

    注意:必須指定一個(gè)有意義的<title>,嚴(yán)禁出現(xiàn)“Untitled”或“未命名”之類(lèi)的<title>。

    2. 所有html標(biāo)簽使用小寫(xiě)

    3. html頁(yè)面一般需要設(shè)置一個(gè)背景色(一般是#FFFFFF)。

    html語(yǔ)法校驗(yàn)
     所有的jsp/html頁(yè)面需要能夠使用DreamWeaver正確打開(kāi)(即html語(yǔ)法正確,沒(méi)有錯(cuò)誤的標(biāo)記)。

    注釋
     一般不使用html注釋?zhuān)鞘怯斜匾屪罱K用戶看到的內(nèi)容。對(duì)于包含JSP代碼的html塊,必須使用JSP注釋。對(duì)于沒(méi)有必要的注釋?zhuān)诎l(fā)行版本中必須移除。

    form屬于域的maxlength
     對(duì)于text類(lèi)型的輸入域,必須根據(jù)數(shù)據(jù)庫(kù)字段的長(zhǎng)度設(shè)置相應(yīng)的maxlength,例如數(shù)據(jù)庫(kù)類(lèi)型是VARCHAR(64),那么maxlength是32(因?yàn)橹形臑g覽器對(duì)于中文也認(rèn)為是一個(gè)字符)。

    6.3 其他規(guī)范
     對(duì)于IDE的使用
     目前暫不限制開(kāi)發(fā)工具的使用,但是最后提交的代碼必須不依賴任何IDE,而需要可以使用ant完成所有的編譯工作。一般提交的代碼目錄格式如下:

    |_dist(存放輸出的文件class文件)
     |_lib(使用的庫(kù))
     |_src(源代碼)
     |_docs(文檔)
     |_wwwroot(頁(yè)面文件)
     |_build.xml(ant的build文件)
     |_changes.log(代碼版本和修改的日志)

    限制session的使用
     在代碼中使用session需要聽(tīng)取項(xiàng)目經(jīng)理的意見(jiàn),項(xiàng)目經(jīng)理需要在設(shè)計(jì)文檔中登記項(xiàng)目中所有使用到的session的名字和作用。

    限制外部包的使用
     開(kāi)發(fā)員如果需要使用一個(gè)外部包需要聽(tīng)取項(xiàng)目經(jīng)理的意見(jiàn)。在項(xiàng)目經(jīng)理批準(zhǔn)以前,嚴(yán)禁擅自使用一個(gè)外部的包。

    posted @ 2007-01-10 11:30 大熊貓 閱讀(1526) | 評(píng)論 (0)編輯 收藏

    1、如何混合使用Jsp和SSI?#include??
    ?在JSP中可以使用如下方式包含純HTML:?
    ?<!--#include?file="data.inc"-->?
    ?但是如果data.inc中包含JSP?CODE?,我們可以使用:?
    ?<%@include?file="data.inc"%>?


    ?2、如何執(zhí)行一個(gè)線程安全的JSP??
    ?只需增加如下指令?
    ?<%@?page?isThreadSafe="false"?%>?


    ?3、JSP如何處理HTML?FORM中的數(shù)據(jù)??
    ?通過(guò)內(nèi)置的request對(duì)象即可,如下:?
    ?<%?
    ?String?item?=?request.getParameter("item");?
    ?int?howMany?=?new?Integer(request.getParameter("units")).intValue();?
    ?%>?


    ?4、在JSP如何包含一個(gè)靜態(tài)文件??
    ?靜態(tài)包含如下:<%@?include?file="copyright.html"?%>?
    ?動(dòng)態(tài)包含如下:<jsp:include?page="copyright.html"?flush="true"/>?


    ?5、在JSP中如何使用注釋??
    ?主要有四中方法:?
    ?1。<%--?與?--%>?
    ?2。//?
    ?3。/**與**/?
    ?4。<!--與-->?


    ?6、在JSP中如何執(zhí)行瀏覽重定向??
    ?使用如下方式即可:response.sendRedirect("http://ybwen.home.chinaren.com/index.html");?
    ?也能物理地改變HTTP?HEADER屬性,如下:?
    ?<%?
    ?response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);?
    ?String?newLocn="/newpath/index.html";?
    ?response.setHeader("Location",newLocn);?
    ?%>?


    ?7、如何防止在JSP或SERVLET中的輸出不被BROWSER保存在CACHE中??
    ?把如下腳本加入到JSP文件的開(kāi)始即可:?
    ?<%?
    ?response.setHeader("Cache-Control","no-store");?//HTTP?1.1?
    ?response.setHeader("Pragma","no-cache");?//HTTP?1.0?
    ?response.setDateHeader?("Expires",?0);?//prevents?caching?at?the?proxy?server?
    ?%>?


    ?8、在JSP中如何設(shè)置COOKIE??
    ?COOKIE是作為HTTP?HEADER的一部分被發(fā)送的,如下方法即可設(shè)置:?
    ?<%?
    ?Cookie?mycookie?=?new?Cookie("aName","aValue");?
    ?response.addCookie(mycookie);?
    ?%>?


    ?9、在JSP中如何刪除一個(gè)COOKIE??
    ?<%?
    ?Cookie?killMyCookie?=?new?Cookie("mycookie",?null);?
    ?killMyCookie.setMaxAge(0);?
    ?killMyCookie.setPath("/");?
    ?response.addCookie(killMyCookie);?
    ?%>?


    ?10、在一個(gè)JSP的請(qǐng)求處理中如何停止JSP的執(zhí)行?
    ?如下例:?
    ?<%?
    ?if?(request.getParameter("wen")?!=?null)?{?
    ?//?do?something?
    ?}?else?{?
    ?return;?
    ?}?
    ?%>?


    ?11、在JSP中如何定義方法?
    ?你可以定義方法,但是你不能直接訪問(wèn)JSP的內(nèi)置對(duì)象,而是通過(guò)參數(shù)的方法傳遞。如下:?
    ?<%!?
    ?public?String?howBadFrom(HttpServletRequest?req)?{?
    ?HttpSession?ses?=?req.getSession();?
    ?...?
    ?return?req.getRemoteHost();?
    ?}?
    ?%>?
    ?<%?
    ?out.print("in?general,lao?lee?is?not?baddie?");?
    ?%>?
    ?<%=?howBadFrom(request)?%>?


    ?12、如果BROWSER已關(guān)閉了COOKIES,在JSP中我如何打開(kāi)SESSION來(lái)跟蹤?
    ?使用URL重寫(xiě)即可,如下:?
    ?hello1.jsp?
    ?<%@?page?session="true"?%>?
    ?<%?
    ?Integer?num?=?new?Integer(100);?
    ?session.putValue("num",num);?
    ?String?url?=response.encodeURL("hello2.jsp");?
    ?%>?
    ?<a?href=<%=url%>>hello2.jsp</a>?

    ?hello2.jsp?
    ?<%@?page?session="true"?%>?
    ?<%?
    ?Integer?i=?(Integer?)session.getValue("num");?
    ?out.println("Num?value?in?session?is?"+i.intValue());?
    ?%>?


    ?13、在JSP中能發(fā)送EMAIL嗎?
    ?可以使用SUN的專(zhuān)用包:sun.net.smtp包。如下腳本使用SmtpClient類(lèi)發(fā)送EMAIL。?
    ?<%@?page?import="sun.net.smtp.SmtpClient,?java.io.*"?%>?
    ?<%?
    ?String?from="ybwen@sina.com";?
    ?String?to="hewenjun@yeah.net,?lei@who.com.cn";?
    ?try{?
    ?SmtpClient?client?=?new?SmtpClient("mail.xxxxx.xxx");?
    ?client.from(from);?
    ?client.to(to);?
    ?PrintStream?message?=?client.startMessage();?
    ?message.println("To:?"?+?to);?
    ?message.println("Subject:?Sending?email?from?JSP!");?
    ?message.println("This?was?sent?from?a?JSP?page!");?
    ?message.println();?
    ?message.println("Cool!?:-)");?
    ?message.println();?
    ?message.println("Good?Boy");?
    ?message.println("Im?in?genius.com");?
    ?message.println();?
    ?client.closeServer();?
    ?}?
    ?catch?(IOException?e){?
    ?System.out.println("ERROR?SENDING?EMAIL:"+e);?
    ?}?
    ?%>?


    ?14、在SERVLET中我能調(diào)用一個(gè)JSP錯(cuò)誤頁(yè)嗎?
    ?當(dāng)然沒(méi)問(wèn)題,如下展示了如何在一個(gè)SERVLET控制邏輯單元內(nèi)調(diào)用一個(gè)JSP錯(cuò)誤頁(yè)面。?
    ?protected?void?sendErrorRedirect(HttpServletRequest?request,?
    ?HttpServletResponse?response,?String?errorPageURL,?
    ?Throwable?e)?
    ?throws?ServletException,?IOException?{?
    ?request.setAttribute?("javax.servlet.jsp.jspException",?e);?
    ?getServletConfig().getServletContext().?
    ?getRequestDispatcher(errorPageURL).forward(request,?
    ?response);?
    ?}?

    ?public?void?doPost(HttpServletRequest?request,HttpServletResponse?response)?{?
    ?try?{?
    ?//?do?something?
    ?}?catch?(Exception?ex)?{?
    ?try?{?
    ?sendErrorRedirect(request,response,"/jsp/MyErrorPage.jsp",ex);?
    ?}?catch?(Exception?e)?{?
    ?e.printStackTrace();?
    ?}?
    ?}?
    ?}?


    ?15、JSP和APPLET如何通訊?
    ?JSP如何與EJB?SessionBean通訊?
    ?下面的代碼段作了很好的示范?
    ?<%@?page?import="javax.naming.*,?javax.rmi.PortableRemoteObject,?
    ?foo.AccountHome,?foo.Account"?%>?
    ?<%!?
    ?//定義一個(gè)對(duì)SessionBeanHome接口實(shí)例的全局引用?
    ?AccountHome?accHome=null;?

    ?public?void?jspInit()?{?
    ?//獲得Home接口實(shí)例?
    ?InitialContext?cntxt?=?new?InitialContext(?);?
    ?Object?ref=?cntxt.lookup("java:comp/env/ejb/AccountEJB");?
    ?accHome?=?(AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);?
    ?}?
    ?%>?
    ?<%?
    ?//實(shí)例化SessionBean?
    ?Account?acct?=?accHome.create();?
    ?//調(diào)用遠(yuǎn)程方法?
    ?acct.doWhatever(...);?
    ?//?如此等等?
    ?%>?


    ?16、當(dāng)我使用一個(gè)結(jié)果集時(shí),如何防止字段為"null"的字域顯示在我的HTML輸入文本域中??
    ?可以定義一個(gè)簡(jiǎn)單的函數(shù)來(lái)達(dá)到目的,如下:?
    ?<%!?
    ?String?blanknull(String?s)?{?
    ?return?(s?==?null)???""?:?s;?
    ?}?
    ?%>?

    ?然后在JSP的FORM中,可以這樣使用?
    ?<input?type="text"?name="shoesize"?value="<%=blanknull(shoesize)%>">?


    ?17、如何中SERVLET或JSP下載一個(gè)文件(如:binary,text,executable)??
    ?現(xiàn)提供兩個(gè)解決方案:?
    ?A:使用HTTP,?
    ?B:在Servlet中,通過(guò)設(shè)置ContentType和使用java.io包的Stream等類(lèi)可作到.例如:?
    ?response.setContentType("application/x-msword");?
    ?然后想輸出緩沖中寫(xiě)一些東東即可。?

    ?18、使用useBean標(biāo)志初始化BEAN時(shí)如何接受初始化參數(shù)?
    ?使用如下兩標(biāo)簽即可:?
    ?<jsp:getProperty?name="wenBean"?property="someProperty"/>?
    ?<jsp:setProperty?name="wenBean"?property="someProperty"?value="someValue"/>?

    ?19、使用JSP如何獲得客戶瀏覽器的信息??
    ?使用request.getHeader(String)即可?


    ?20、能象調(diào)用子程序一樣調(diào)用JSP嗎??
    ?當(dāng)然可以,用<jsp:include?page="relativeURL"?flush="true"/>?


    ?21、當(dāng)我重編譯我的JSP使用的一個(gè)類(lèi)后,為什么JVM繼續(xù)使用我的老CLASS??


    ?<%@include?file="abc.jsp"%>與<jsp:include?page="abc.jsp"/>之間的差別??
    ?前一個(gè)為靜態(tài)包含,而后一個(gè)為動(dòng)態(tài)包含?


    ?22、JSP的缺點(diǎn)??
    ?1。對(duì)JAVA程序進(jìn)行調(diào)試沒(méi)有好東東?
    ?2。因大多數(shù)的servlet引擎不支持connection?pooling?
    ?3。Servlet引擎沒(méi)有標(biāo)準(zhǔn)?
    ?4。JSP與其它腳本語(yǔ)言的交互?


    ?23、JSP能進(jìn)行遞歸調(diào)用嗎??
    ?當(dāng)然可以,如對(duì)form的提交給本頁(yè)?


    ?34、如何實(shí)現(xiàn)JSP的國(guó)際化??
    ?為各種版本提供resource?bundles屬性文件即可?

    ?25、在JSP中如何寫(xiě)文本文件??
    ?使用PrintWriter對(duì)象,如:?
    ?<%@?page?import="java.io.*"?%>?
    ?<%?
    ?String?str?=?"print?me";?
    ?String?nameOfTextFile?=?"/usr/anil/imp.txt";?
    ?try?{?
    ?PrintWriter?pw?=?new?PrintWriter(new?FileOutputStream(nameOfTextFile));?
    ?pw.println(str);?
    ?pw.close();?
    ?}?catch(IOException?e)?{?
    ?out.println(e.getMessage());?
    ?}?
    ?%>?


    ?26、如何在JSP中包括絕對(duì)路徑文件??
    ?使用URLConnection即可。?


    ?27、在servlets和JSP之間能共享session對(duì)象嗎??
    ?當(dāng)然可以,?
    ?HttpSession?session?=?request.getSession(true);?
    ?session.putValue("variable","value");?


    ?28、JavaScript的變量能復(fù)制到JSP的SESSION中嗎??


    ?29、如何設(shè)置cookie在某一時(shí)間后過(guò)期??
    ?用Cookie.setMaxAge(int)?


    ?30、如何獲得當(dāng)前的sessions數(shù)??
    ?可以使用HttpSessionBindingListeners來(lái)跟蹤?


    ?31、能設(shè)置一些代碼在我所有的JSP文件之上運(yùn)行?如果可以,能共享嗎??
    ?當(dāng)然可以,可以為你的JSP文件定義一個(gè)別名:/jsp/=ybwen.genius.myPreprocessingServlet,而以/jsp/為前綴的文件可以使用?


    ?32、對(duì)一個(gè)JSP頁(yè),如果多個(gè)客戶端同時(shí)請(qǐng)求它,同步可能嗎??
    ?在jsp:useBean語(yǔ)法中使用beanName有何好處??
    ?beanName使用Beans.instantiate()初始化Bean?


    ?33、當(dāng)我使用<jsp:forward>時(shí),在瀏覽器的地址欄沒(méi)有改變??
    ?使用response.sendRedirect("newURL")?


    ?34、如何轉(zhuǎn)換JSP?0.9版本的文件到JSP1.1??
    ?可使用sed/awk即可?


    ?35、使用JSP能設(shè)置HTML?FORM中輸入域的焦點(diǎn),不用JavaScript??
    ?沒(méi)辦法?


    ?36、使用JSP連接到數(shù)據(jù)庫(kù)連接緩沖池的最好方法是什么??
    ?1.使用JDBC2。0中帶有此服務(wù)的Driver?
    ?2.使用提供有此服務(wù)的Application?server?
    ?3.自己寫(xiě)

    posted @ 2006-11-13 10:47 大熊貓 閱讀(346) | 評(píng)論 (0)編輯 收藏

    安裝了多國(guó)語(yǔ)言包后,發(fā)現(xiàn)還有一些英文單詞沒(méi)有翻譯成中文,這是因?yàn)橹皢?dòng)了英文版的eclipse,eclipse在啟動(dòng)后,記錄了一些英文版的信息,形成了干擾,解決方法有以下兩種:
    1、將eclipse安裝路徑下的configuration目錄刪除,再重啟eclipse。
    2、右擊eclipse快捷方式,在目標(biāo)欄的最后加入eclipse的啟動(dòng)參數(shù)-clean?;蛘咴贒OS下用“eclipse-clean”來(lái)啟動(dòng)。

    posted @ 2006-11-09 21:22 大熊貓 閱讀(909) | 評(píng)論 (3)編輯 收藏

    本例安裝環(huán)境:WIN XP中文版+JDK1.4.2_12+ECLIPSE 3.0.1(加多國(guó)語(yǔ)言包)
    1.安裝JDK
    下載地址:http://Java.sun.com/j2se/
    注意:在WIN XP下安裝ECLIPSE不需要設(shè)置JDK環(huán)境變量。(實(shí)踐經(jīng)驗(yàn))
    2.安裝ECLIPSE
    下載地址:http://download.eclipse.org/downloads/。
    (1)eclipse的安裝非常簡(jiǎn)單,它屬于綠色軟件的安裝方法:不需要運(yùn)行安裝程序,只需要將下載的eclipse壓縮包解壓就可以運(yùn)行eclipse了(路徑自己喜歡)。
    (2)檢查eclipse是否安裝成功。雙擊目錄下:eclipse.exe文件來(lái)啟動(dòng)eclipse。第一次啟動(dòng)會(huì)彈出對(duì)話框(用來(lái)設(shè)置工作空間,位置自己喜歡),單擊OK按鈕,開(kāi)始運(yùn)行eclipse程序。運(yùn)行完畢后,出現(xiàn)一個(gè)Welcome to Eclipse 3.0 的歡迎界面,表示已經(jīng)安裝成功了。
    3.安裝多國(guó)語(yǔ)言包
    下載地址:http://download.eclipse.org/downloads/。
    注意:要與eclipse 3.0.1版本相對(duì)應(yīng)(網(wǎng)名:Language Pack)。
    (1)先關(guān)掉Eclipse。
    (2)將下載的語(yǔ)言包解壓縮,并給這個(gè)目錄取個(gè)名(本例:language)。
    (3) 將此目錄復(fù)制到eclipse安裝目錄下(最后路徑為:eclipse安裝目錄/language/eclipse/..)。
    (4)建立語(yǔ)言包的link文件。在eclipse安裝目錄下建一個(gè)目錄并取名為links,在該目錄中新建一個(gè)文本并取名為language.link(可任意取名),然后在language.link文件中加入一行文字:path=language(用相對(duì)路徑)。
    經(jīng)過(guò)四步后,現(xiàn)在就可以重啟eclipse了??纯?!是不是eclipse界面都漢化成中文了呢!未成功安裝的朋友,快點(diǎn)試下啦!
    以上為本人近期的學(xué)習(xí)成果,謹(jǐn)供各位朋友參考!若有不對(duì)的地方請(qǐng)見(jiàn)諒!

    posted @ 2006-11-09 21:19 大熊貓 閱讀(3747) | 評(píng)論 (3)編輯 收藏

    當(dāng)?shù)谝粋€(gè)用戶請(qǐng)求JSP文件的時(shí)候,JSP容器(如TOMCAT)把JSP文件轉(zhuǎn)換成JAVA文件(SERVLET類(lèi)文件),然后編譯成CLASS文件,常駐內(nèi)存;當(dāng)有客戶請(qǐng)求的時(shí)候,直接再打開(kāi)一個(gè)線程,而不是一個(gè)進(jìn)程,無(wú)須重新編譯,直接執(zhí)行第一次已經(jīng)編譯好的CLASS文件,速度比每次都要重新編譯JSP文件要快得多。當(dāng)然如果JSP文件發(fā)生變化,則需要重新編譯一次。 遇見(jiàn)!

    posted @ 2006-11-09 16:51 大熊貓 閱讀(321) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲国产精品综合久久久| 亚洲av片一区二区三区| 亚洲成a人片77777老司机| 一级免费黄色毛片| 亚洲国产成人久久一区WWW| 综合偷自拍亚洲乱中文字幕| 女人张开腿给人桶免费视频| 国产成人亚洲综合一区| 午夜爱爱免费视频| 小说区亚洲自拍另类| 亚洲国产成人爱av在线播放| fc2成年免费共享视频网站| 久久激情亚洲精品无码?V| 少妇性饥渴无码A区免费| 亚洲乱码无码永久不卡在线| 国产一区二区三区免费| 2022年亚洲午夜一区二区福利 | 亚洲爆乳无码专区www| 成年人免费观看视频网站| 亚洲变态另类一区二区三区| 亚洲精品视频免费| 美女被cao网站免费看在线看| 亚洲精品视频在线| 精品久久久久久久久免费影院| 亚洲GV天堂GV无码男同| 亚洲一区二区精品视频| 久久国产乱子伦精品免费不卡 | 亚洲av无码一区二区三区在线播放 | 亚洲人成网站999久久久综合| 国产三级免费观看| 成全视频在线观看免费| 亚洲午夜国产精品无卡| 波多野结衣免费视频观看| 国产情侣久久久久aⅴ免费| 亚洲综合丁香婷婷六月香| 国产美女无遮挡免费网站| 拍拍拍无挡免费视频网站| 色偷偷女男人的天堂亚洲网| 亚洲精品NV久久久久久久久久| 免费国产黄网站在线观看可以下载| 亚洲AV无码一区二区三区在线|