|
2006年11月9日
转:javathink.org
说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1
说明:拷贝表(拷贝数据,源表名:a 目标表名:b) insert into b(a, b, c) select d,e,f from b;
说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明:外连接查询(表名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
说明:日程安排提前五分钟提醒 select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息 delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
说明:--
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
说明:-- select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
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')
说明:四表联查问题 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 .....
说明:得到表中最小的未使用的ID号
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)
一个SQL语句的问题:行列转换 select * from v_temp 上面的视图结果如下: user_name role_name ------------------------- 系统管理员 管理员 feng 管理员 feng 一般用户 test 一般用户 想把结果变成这样: user_name role_name --------------------------- 系统管理员 管理员 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
--调用: select [name],dbo.join_str([name]) role2 from a_test group by [name]
--select distinct name,dbo.uf_test(name) from a_test
快速比较结构相同的两表 结构相同的两表,一表有记录3万条左右,一表有记录2万条左右,我怎样快速查找两表的不同记录? ============================ 给你一个测试方法,从northwind中的orders表取数据。 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
应该可以,而且将不同的记录的ID显示出来。 下面的适用于双方记录一样的情况,
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条纪录:
1. select top m * into 临时表(或表变量) 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里没有其他identity列,那么: select identity(int) id0,* into #temp from tablename
取n到m条的语句为: select * from #temp where id0 >=n and id0 <= m
如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行: exec sp_dboption 你的DB名字,'select into/bulkcopy',true
4.如果表里有identity属性,那么简单: select * from tablename where identitycol between n and m
如何删除一个表中重复的记录? 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')
查询数据的最大排序问题(只能用一条语句写) 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)
要求查询出来的结果如下:
qu co je ----------- ----------- ----- A 6 9 A 2 4 B 3 6 B 2 5 C 6 7 C 3 4
就是要按qu分组,每组中取je最大的前2位!! 而且只能用一句sql语句!!! select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
求删除重复记录的sql语句? 怎样把具有相同字段的纪录删除,只留下一条。 例如,表test里有id,name字段 如果有name相同的记录 只留下一条,其余的删除。 name的内容不定,相同的记录数不定。 有没有这样的sql语句? ============================== A:一个完整的解决方案:
将重复的记录记入temp1表: select [标志字段id],count(*) into temp1 from [表名] group by [标志字段id] having count(*)>1
2、将不重复的记录记入temp1表: insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1
3、作一个包含所有不重复记录的表: select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)
4、删除重复表: delete [表名]
5、恢复表: insert [表名] select * from temp2
6、删除临时表: 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')
行列转换--普通
假设有张学生成绩表(CJ)如下 Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 82
想变成 姓名 语文 数学 物理 张三 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)
行列转换--合并
有表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
创建一个合并的函数 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
--调用自定义函数得到结果 select distinct id,dbo.fmerg(id) from 表A
如何取得一个数据表的所有列名
方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。 SQL语句如下: 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'
通过SQL语句来更改用户的密码
修改别人的,需要sysadmin role EXEC sp_password NULL, 'newpassword', 'User'
如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa
怎么判断出一个表的哪些字段不允许为空?
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
如何在数据库里找到含有相同字段的表? 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='你的字段名字'
未知列名查所有在不同表出现过的列名 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行数据
假设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)
如果使用游标也是可以的 fetch absolute [number] from [cursor_name] 行数为绝对行数
SQL Server日期计算 a. 一个月的第一天 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. 上个月的最后一天 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. 本月的第一个星期一 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))。
获取表结构[把 '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
提取数据库内所有表的字段详细说明的SQL语句
SELECT (case when a.colorder=1 then d.name else '' end) N'表名', a.colorder N'字段序号', a.name N'字段名', (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'标识', (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'类型', a.length N'占用字节数', COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度', isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数', (case when a.isnullable=1 then '√'else '' end) N'允许空', isnull(e.text,'') N'默认值', isnull(g.[value],'') AS N'字段说明' 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的记录总数[对大容量表非常有效]
快速获取表test的记录总数: select rows from sysindexes where id = object_id('test') and indid in (0,1)
update 2 set KHXH=(ID+1)\2 2行递增编号 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) //补位递增 delete from [1] where (id%2)=1 奇数
替换表名字段 update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'
截位 SELECT LEFT(表名, 5)
转:javathink.org
对于 Java™ 语言开发人员来说,信息过量是一个真正的问题。每个新入行的程序员都要面临一个令人畏缩的挑战:要进入的行业是一个具有海量知识的行业。要了解的东西简直太多了。对于有经验的老手来说,情况只有些微好转。知识量总在增大,仅仅跟上进度就是一个挑战。如果有一份专业人士必备的书籍和网站列表该有多好!本文就是这个列表。它包含了每个专业的 Java 语言程序员在书架或浏览器书签中必备的最重要的书籍和网站。 这些都是您书架上必备的书和应该经常使用的 Web 链接。时间是一项重要的资源,本文帮您回避那些分心的事情,把时间专注于最有益于您作为Java 语言程序员职业生涯的信息源。尽管有多少程序员就有多少他们最喜欢的参考资料,但本文收集的这些都是优中选优,来源于我书架上的私家珍藏和许多 Java 专家的推荐。
我考虑了两种组织这份参考资料列表的方法。我本可以通过主题领域来组织,这也许很有帮助,但主题列表很快就会变得不实用。相反,我选择了另一种方法:通过类型来组织,即书籍和 Web 站点。
总的来讲,有经验的老手们用 Web 站点来跟踪行业的走势。书籍、文章和论文有助于跟上潮流,但它们总体上更适合于基础学习。极富创造性的书籍偶尔会撼动一两个基础性的东西。这样的书也在本列表之列。
需要提出的一点警告是,专注于 Java 语言的书籍和 Web 站点数量巨大。您钟爱的未必在这份列表里。那并不意味着它们不好。它们只是不在这份列表里而已。可能是因为我还不知道它们。也可能是因为我不认为它们能够算得上是重要资源。不包含一些参考资料是一个评判问题,但如果不这样的话,您也许就要花几小时来拖动滚动条,还要花上成千上万美元来买书。如果您作为一个专业的 Java 程序员,有一些常用的优秀参考资料,一定要让我知道这些资料。这份列表一直都在更新中,您提出的那些也许就会被收录进去。
书籍
每个程序员都会有一些由于经常被当作专业资料参阅而磨坏的书。下列书籍应该是 Java 语言程序员的书架上必备的。书很贵,所以我有意将这份列表弄得很短,仅限于重要书籍。
Thinking in Java (Bruce Eckel)
Thinking in Java, 3rd edition (Bruce Eckel; Prentice Hall PTR,2002 年) Java 编程思想:第3版 (陈昊鹏 等译; 机械工业出版社,2005 年) Eckel 的书对于学习如何在 Java 语言环境中使用好面向对象技术极其实用。书中大量的代码样例解释了他所介绍的概念。文字出自一个并不认为 Java 技术总是正确答案的人,所以相当地实用。Eckel 具有多种语言的大量经验,还有用面向对象方式进行思考的扎实技能。本书将这些技能放到实用的 Java 语言环境中。他还在写一本新书,名为 Thinking in Enterprise Java。
Effective Java (Joshua Bloch)
Effective Java: Programming Language Guide (Joshua Bloch; Addison-Wesley,2001 年) Effective Java 中文版 (潘爱民 译; 机械工业出版社,2003 年) 本书是理解优秀 Java 程序设计原则的最佳书籍。大多数材料从其他的 “学习 Java ” 的书中根本找不到。例如,Bloch 书中关于覆盖 equals() 这一章是我读过的最好的参考资料之一。他也在书中包括了很实用的建议:用接口替代抽象类和灵活使用异常。Bloch 是 Sun 公司 Java 平台库的架构师,所以他透彻地了解这门语言。事实上,他编写了该语言中大量有用的库。本书必读!
The Java Programming Language (Ken Arnold, James Gosling, David Holmes)
The Java Programming Language (Ken Arnold,James Gosling,David Holmes; Addison-Wesley,2000 年) Java 编程语言(第 3 版) (虞万荣 等译,中国电力出版社,2003 年) 这也许是能弄到的最好的 Java 入门读物。它并不是一个标准规范,而是一本介绍每门语言特性的可读书籍。这本书在严谨性和教育性方面权衡得很好,能够让懂编程的人迅速被 Java 语言(和其丰富的类库)所吸引。
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 并发编程—设计原则与模式(第二版) (赵涌 等译,中国电力出版社,2004 年) 不是每个开发人员都需要如此细致地了解并发性,也不是每个工程师都能达到本书的水准,但却没有比本书更好的关于并发性编程的概述了。如果您对此感兴趣,请从这里开始。Lea 是 SUNY 的一名专业程序员,他的和并发性有关的作品和想法都包含在了 JDK 5.0 规范(引自 JSR166)中,所以您大可放心,他所说的关于有效使用 Java 语言的建议是值得一听的。他是一个很善于沟通的人。
Expert One-On-One J2EE Design and Development (Rod Johnson)
Expert One-On-One J2EE Design and Development (Rod Johnson) WROX: J2EE 设计开发编程指南 (魏海萍 译,电子工业出版社,2003 年) 对于刚接触 J2EE 的人来说,这是唯一的一本如实反映这项技术的书。本书收录了多年的成功经验和失败经验,不同于其他许多作者,Johnson 乐于将失败的经验公诸于众。J2EE 常常都被过度使用。Johnson 的书能帮您避免这一点。
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 年) 重构:改善既有代码的设计(中文版) (侯捷 等译,中国电力出版社 ,2003 年) Fowler 写了几本现已出版的最流行的编程书,包括 Analysis Patterns。他的关于重构 的书是这一主题的基本书籍。重构代码是被程序员忽略的训练,但却是程序员最直观的想法。重构是在不改变代码结果的前提下改进现有代码的设计。这是保持代码整洁的最佳方式,用这种方法设计的代码总是很容易修改。什么时候进行重构呢?当代码“散发出味道”时。Fowler 的书里满是 Java 语言代码的例子。许多 Java 语言集成开发环境(IDE)(包括了 IBM 的 Eclipse)都将 Fowler 的重构包含了进去,每一个都使用他的重构名命名,所以熟悉如extract method 等重构方法还是很值得的。
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 年) 设计模式:可复用面向对象软件的基础 (李英军 等译,机械工业出版社 ,2005 年) 这是一本在专业程序员圈子里更为有名的书,基于作者共同的绰号,这本书被认为是 “四人帮(GOF)之书”。模式是思考和解决普通编程问题时可以重用的方式。学习模式是一门学科。使用好模式(或知道什么时候不 使用模式)是一项技能。忽略模式则是错误的。书中所有的例子都以 C++ 表示,但 Java 语言是从那里诞生的,让 Java 语言程序员由此联系到如何在 Java 语言中实现这些模式相对简单一些。熟悉模式并了解如何使用好模式使编程更加简单。这使得和其他程序员交流也更简单,因为在针对通用问题的通用解决方案中,模式是描述解决方案中彼此协作的大量相关编程概念的快捷方式。一些更为通用的方式,如工厂方法 则是普便存在的,甚至存在于 Java 语言本身。关于明智使用模式的这个主题,也可以阅读 Joshua Kerievsky 的 Refactoring to Patterns,该书称可以让代码来告诉您何时实现模式。
Patterns of Enterprise Application Architecture (Martin Fowler)
Patterns of Enterprise Application Architecture (Martin Fowler; Addison-Wesley,2002 年) 企业应用架构模式 (王怀民 等译,机械工业出版社 ,2004 年) 比起小型、一次性项目来说,企业开发当然代表了更大的挑战。那并不意味着企业开发带来的所有挑战都是新挑战。事实上有些时候,这项开发已经 是以前完成过的了。Fowler 做了很多个这样的项目。他的书提到了一些通用解决方案,并提供了关于使用、折中和可选方案的指导。Fowler 在书中包含了一些熟悉的模式,如模型视图控制器(MVC),他也提供了一些您也许不了解的模式,如处理 Web 站点上特定页面请求或行为请求的 Page Controller 模式。正如您对待大多数模式一样,一旦您读过许多模式,您就会认为 “我已经知道那个模式了” 。也许是这样,但有一个用来引用模式的通用表达方式还是很有帮助的。在有多个组件(由不同人开发)的大型项目中,该类引用是一项很好的帮助。
UML Distilled (Martin Fowler)
UML Distilled: A Brief Guide to the Standard Object Modeling Language (Martin Fowler; Addison-Wesley 2003 年) UML精粹:标准对象语言简明指南(第3版) (徐家福 译,清华大学出版社 ,2005 年) 对于专业的程序员来说,UML 是一门很重要的通用可视化沟通语言,但是它被过度使用和草率地滥用了。您无需对使用 UML 沟通了解太多。Martin 对 UML 的提炼为您提供了最核心的东西。事实上,前后的封页提供了常规基础上可能使用到的所有东西。该书中 UML 例子的代码都是 Java 代码。
Test-Driven Development: By Example (Kent Beck)
Test-Driven Development: By Example (Kent Beck; Addison-Wesley 2002 年) 测试驱动开发(中文版) (崔凯 译,中国电力出版社 ,2004 年) 测试优先编程将使编程发生革命性变化,能助您成为更好的程序员。在写代码之前编写测试开始很难,但却是一项威力强大的技能。通过优先编写测试,可使代码更加简单,并确保从一开始它就能工作(Beck 实践着他提倡的测试优先,与人合写了 JUnit,这是 Java 语言最流行的测试框架)。Beck 的书是权威的参考资料,扩展了的 Money 例子也用 Java 语言写成。Beck 详述了如何用测试优先进行 思考(这也许是许多程序员首先遇到的障碍)。
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 年) 程序员修炼之道——从小工到专家 (马维达 译,电子工业出版社 ,2004 年) 做一个纯粹的面向对象开发人员有其优势所在。在当今复杂的社会中,作为 Java 语言开发人员,为完成任务常要妥协。Hunt 和 Thomas 探讨了如何不将真正重要的东西妥协掉而完成任务。这不是一本关于 Java 语言的书,而是 Java 语言开发人员重要的思想读物。例如,我认为没从“要解决问题,而不是推卸责任”这句忠言中受益的程序员,不能像个自豪的艺术家一样在他的杰作上签上大名。
Peopleware: Productive Projects and Teams (Tom DeMarco and Timothy Lister)
Peopleware: Productive Projects and Teams (Tom DeMarco,Timothy Lister; Dorset House,1999 年) 人件(第2版) (UMLChina 翻译组 译,清华大学出版社 ,2003 年) 这份列表中的其他所有书籍都至少和技术有些相关。这本书却不是。在所有技术行话和首字母缩略词的海洋中,有时软件开发人员和经理们会忘记:是人 制造了软件。DeMarco 和 Lister 向我们提醒了这一事实,也向我们提醒了形成这一区别的原因。这不是一本关于一门特定编程语言的书籍,但却是每个 Java 语言程序员都应该读的书。关于 “累死程序员如何让经理们适得其反” 还有许多其他的好书,但这是最好的一本。
Web 站点
Web 站点的数目浩如烟海,如果您想要消化其中的内容,穷毕生之力也难以全部访问。包含 Java 语言某方面内容的详尽的网站列表会大得离谱。下列站点都是可靠、真实的。
Sun 的 Java 技术站点
Sun 的 Java 语言站点 这是 Sun 的 Java 语言主站。作为 Java 语言开发人员,您会发现自己频繁地访问此站点。下列链接特别重要,特别是对新入行的 Java 语言开发人员:
New to Java Center New to Java Center New to Java Center 存放了许多循序渐进的 Java 技术资源链接。如果您刚接触这门语言,这是一个好的起点。 教程和代码库 Java Tutorial 这里有大名鼎鼎的 Java Tutorial,以及关于 Java 语言各个方面(例如 Collection)的其他教程。
IBM developerWorks
IBM 的 developerWorks 推销自己也许有些厚脸皮,但 developerWorks 是一项巨大的资源,收录了大量 Java 语言工具和技术的教程和文章。其内容从初学者指南到学习这门语言到高级并发性技术。可以根据主题搜索内容,然后根据类型浏览。
Apache Software Foundation
Apache Software Foundation Apache 站点是许多可重用库(通用领域)和工具的主页,这些库和工具帮助 Java 开发人员进行开发。这里的内容全都是开放源码,所以尽管下载想要的吧!许多极其流行的 Java 语言库和工具(如 Struts、Ant 和 Tomcat)都始于 Apache 项目。Jakarta 专区汇聚了大多数新兴的 Java 语言材料。
Eclipse.org
Eclipse 有几个好的 Java 语言集成开发环境(IDE)。Eclipse(来自 IBM)是最新的 IDE 之一,它很快成为 Java 语言开发的首要 IDE。它完全是开源的,这意味着它是免费的。该站包含了学习如何有效使用 Eclipse 的各种参考资料。这里还有关于 Standard Widget Toolkit(SWT)的信息,SWT 是相对于 Swing 来说更加轻量级的选择。
Eclipse 插件中心和 Eclipse 插件
Eclipse 插件中心 和 Eclipse 插件 Eclipse 基于插件架构。事实上,插件是 Eclipse 的 Java 语言开发组件。但有差不多上千个插件,从 Web 开发的插件到在 Eclipse 环境中玩游戏的插件。这两个站点分类列出了大多数插件,可以进行搜索。它们是很棒的资源。如果您想在 Eclipse 开发环境中弄点新东西,幸运的话有某个插件可能已经实现,从这两个站点能找到想要的插件。这两个站点都允许评论插件,这样您就可以知道哪些插件好,哪些值得一试。
JUnit.org
JUnit.org Junit 是 Java 语言中一个基本的单元测试框架。该站点包含了 Junit 最新最棒的版本,外加大量有关测试(Java 语言或者其他语言的)各个层面上(针对桌面应用程序、Web 应用程序、J2EE 应用程序等)的其他资源。如果您想找测试资源,这里就是最佳起点。
TheServerSide.com
TheServerSide.com 如果您要(或将要)从事服务器端 Java 语言的开发,此站点是一处举足轻重的资源。您可以到这里找到有关 JBoss、J2EE、LDAP、Struts 和大量其他主题的文章,并且都是完全可检索的。这些文章不仅仅是简单描述 Java 语言的特征或者支持的库。它们更进一步地描述了库的新奇用法(如使用 Jakarta Velocity 作为规则引擎,而不是模板引擎)。它们也提供了有关 Java 语言现状的连续评论(当前的一篇文章是由 Tim Bray 所写的 Java is boring )。该站点更好的通用功能之一是对 Java 语言工具和产品(应用服务器等)的矩阵式比较。
Bruce Eckel's MindView, Inc.
Bruce Eckel's MindView, Inc. Eckel 写了几本 “用 …… 进行思考” 的书,内容关于 Java 语言、Python 和 C++ ,当我学习 Java 语言时,他的 Thinking in Java 对我尤其有帮助。它很实用并切中要害,在“在 Java 语言环境中如何面向对象思考”方面具有卓识。您可以从此站点免费下载他所有书籍的电子版。他也写了许多好文章,并且他把这些文章的链接都放到了这里(包括关于 Jython、Java 和 .NET 比较等内容的文章)。
ONJava.com
ONJava.com O'Reilley 历年来出版了一些有关编程语言和工具的优秀书籍。他们的专注于 Java 语言的网站也不错。它有些有关各种 Java 语言工具(如 JDOM 和 Hibernate)、Java 平台(如 J2SE 和 J2EE)不同领域不同部分的文章。全部都可以被检索到。他们有优秀的文章和教程。该站点按主题排列。例如有 Java 和 XML、Java Security、Wireless Java 和 Java SysAdmin。该站点也有到 O'Reilley Learning Lab 的链接,在那里您能获得在线参考资料(Java 语言相关和其他的)。那些不是免费的,但是许多都面向大学认证。因此您可以以一种很方便的方式来学习技能,并得到一些认证。
java.net
java.net 社区 java.net 社区有多个“社区”,有特定于主题的论坛和文章。例如 Java Desktop 社区有各类与 Java 语言桌面开发相关的资料。Java Patterns 社区作为一个门户,也许对提供 Java 语言的模式资源相当感兴趣。还有一个 Java User Groups (JUG) 社区,在那里能找到有关创建、加入和管理一个 JUG 的信息。
结束语
任何 “好的”、“关键性的” 或者 “重要的” 参考资料列表都注定是不完整的,本文的列表也未能例外。 Java 语言的书籍数目众多,当然,万维网也很庞大。除本文所列的参考资料之外,还有很多用于学习 Java 语言的参考资料。但如果您拥有了这里所提到的所有书籍、网站、文章或者教程,您应当已经拥有了一个使您良好开端并助您登堂入室的实用宝库。
最后,要成为一个能力日增和高效的 Java 语言开发人员,方法就是用它工作,动手来尝试。如果有一个教程详细介绍了所需创建的软件的每一部分,您很可能并没得到多少好处。有时,您可能得走自己的路。在成功地尝试了一些新的东西之后,您可能想要写一篇文章、教程或者一本书来分享您所学到的。
转:
引子: 我们以两个大型网站为例作比较: 51job和智联招聘(先声明我不是为他们作广告,仅以他们为例作技术上的比较) 51job采用的是比较“先进”的php技术,而智联用的是比较落后的asp.但我们可能会明显的感觉到51job的反应速度相比智联招聘实在是太慢了,为什么会这样?细心的人可能会察觉到了。智联虽然用的是asp,但他采用了另一种更巧妙的技术--asp生成静态页技术。所有的动态页基本上都转换成了html静态页,不用访问数据库,当然反应快了。 下面我们讨论一下jsp怎么转换成html?? 首先要做一个模板。后缀不限,但一般都用*.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> 做一个处理模板的类或者jsp文件、(为说明问题我们从简单入手以一个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("以下是模板内容:<br>"+templateContent+"<br> 以下是置换以后的html内容<br><hr>"); ?templateContent=templateContent.replaceAll("#title#",title); ?templateContent=templateContent.replaceAll("#author#",editer);//替换掉模块中相应的地方 ?templateContent=templateContent.replaceAll("#content#",content); ?// 根据时间得文件名 ?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(); 嗯,核心技术就是这样了,如果大家要求的性能更高,可以改用freemarker做模板。freemarker的使用方法可以参阅我的另一篇文章《Freemarker 模板工具的作用及使用》
转自JavaThink
转:
1 前言 为了使软件开发过程有章可循,保证软件质量,加强开发管理。
2 开发管理 项目进度周报表格如下: 项目编号: 汇报人: 汇报日期: 项目进度详细描述: 其他问题:
3 项目周期 司项目开发周期分为以下几个步骤: 步骤 说明 参与角色 生成文档或程序(打*号为可选) 可行性分析 对项目的技术,功能需求和市场进行调研和初步分析,确定是否需要立项开发。 部门主管核心技术员 可行性分析报告*技术调研报告* 立项 正式立项,由部门主管指定项目经理,项目经理制定初步计划。初步计划包括设计和开发时间的初步估算。 部门主管核心技术员 项目初步计划 需求分析 对项目进行详细的需求分析,编写需求分析文档。对于B/S结构软件系统需要制作静态演示页面。需求分析文档和静态演示页面需要通过部门主管审批才能够进行到下一个步骤 项目经理项目核心小组 需求分析文档静态演示页面项目计划修订版本详细设计 根据需求分析对项目进行详细设计。详细设计以后,项目经理同部门主管一起指定项目小组开发成员。 项目经理项目核心小组 详细设计文档项目计划确定版本开发 根据设计开发项目,由美工对操作界面进行美化。 项目经理项目开发员美工 项目计划修订版本*测试 项目经理提交测试申请,由测试部门对项目进行测试。项目小组配合测试部门修改软件中的错误。 项目经理项目开发员测试部 测试申请测试计划测试报告 项目验收 项目验收归档 部门主管项目经理 项目所有文档和程序
4 命名规范 4.1 项目编号命名规范 待完善
4.2 文档命名规范 待完善
4.3 jsp/html命名规范 jsp与html文件名全部小写,并遵循如下的规范:
数据/内容显示页 名词,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上 “_list”。例如: new_message.html 或 my_file_list.jsp
操作处理页 命名格式:名词_下划线_动词,例如:file_delete.jsp。
含frame页面 <frameset>中<frame>的name属性命名的格式是①xxx._②xxx_③xxx ①xxx部分用来标识当前页面隶属于整个系统中的哪一功能模块。 如:属于ebwebmail则被表示为ebwebmail,其它情况依次类推。 ②xxx部分标识当前页面所要完成的功能。 如:完成用户登录的功能则被标识为login,其它情况依次类推。 ③xxx部分用来用来表示页面在浏览器窗口所处的位置。 处于浏览器窗口的顶部则标识为top,其它情况依次类推。 例如:ebwebmail_inbox_top.jsp
<frame> src属性相应的文件名根据情况建议在原命名规范上用下划线加上所处窗口的位置。
javascript脚本方法 脚本函数都以①xxx_②xxx的方式命名。 ①xxx对应页面隶属的模块。 ②xxx表示函数所要实现的功能(动宾结构),多个单词用下划线连接。 例如:ebwebmail_send_mail()
模块通用的脚本函数必须集合于一个js文件中,在页面上通过<script language=”javascript” src=”url”></script>形式导入。js文件名命名使用模块名,例如:ebwebmail.js。
如果项目已经提供了公共js脚本,则优先使用公共js脚本中提供的函数。
所有定义方法的<script>元素定义在<head></head>中或</body>后。
javascript脚本内部变量与参数 单词之间用下划线分隔且全部小写,例如: var file_size。
<form>表单name属性 统一以“form_”开头,其后加该表单所需收集的信息的作用或动作,例如:form_file_upload 或 form_send_mail。
表单elements 表单element的名称以element需收集的信息标示命名,单词之间使用下划线分隔且全部小写,例如:
<input type=”text” name=”username”> <input type=”radio” name=”file_type”> <textarea name=”content” rows=”5” cols=”40”>
cookie命名 命名格式:模块名_存储信息名词(多个单词用下划线分隔) ,全部大写,例如:EBWEBMAIL_SORT_TYPE。
window.open中name参数的命名 javascript的window.open方法中有一个name的参数,浏览器约定同样的名字的窗口只能打开一个,如果程序间名字重复将相互冲突。如果不限制打开窗口数,可以指定‘’或“”(不是null),否则需要加上模块名,例如ebwebmail_viewmail。
4.4 数据库命名规范 数据库表命名均遵循以下规范: 模块名_存储信息名词(多个单词用下划线分隔),全部小写,例如:ebwebmail_message。
数据库字段命名遵循以下规范: 存储信息名词(多个单词用下划线分隔),全部小写,例如:message_id。
5 文档规范
1. 编写文档目前主要使用的工具是Word(项目计划文档例外,需要使用Project制作),辅助使用的工具有Visio,PowerPoint,ERWin等。
2. 文档务必保持段落格式整齐,文字字体,颜色,大小统一。
3. 如果需要摘引html页面中的内容,不能直接从html中粘贴过来(会在word文档中留下html格式),而必须先去除格式,例如:先粘贴到notepad中。
4. 务必注意中英文标点符号,文档正文一概使用中文标点符号。
5. 如果需要在文档中插图,不要使用word自带的绘图工具。可以选择使用PowerPoint或visio。使用PowerPoint,选择“插入”->“对象”->“Microsoft PowerPoint 幻灯片”。使用visio,需要另外建立visio文档,绘制完以后粘贴到word中。
6. 数据建模使用ERwin工具,文档中仅需要粘贴数据模型的逻辑视图(logical view),另外还要附上表结构描述。
7. 修改他人文档务必使用修订模式,以便保留备修改的内容。使用修订模式,选择“工具”->“修订”->“突出显示修订”,勾上“编辑时标记修订”。
附:一些模版 ü Java类设计(class documentation) 声明:
描述:
属性:1. property_name 声明 说明
方法: 1. method_name 声明 说明 参数 返回值 异常
注: 方法声明中,如果遇到重载的方法,可以使用“|”表示可以接受不同类型的参数,例如:“String value | int value”;可以使用“[]”表示可选的参数,例如:“Object message[,Throwable t]”
Servlet设计(servlet document) 类名 接受参数列表 描述
数据表设计(data modeling) 表名:some_table
说明:description
表结构: 字段名 类型 说明
6 代码规范 6.1 Java源代码规范 6.1.1 命名 u Package 的命名 Package 的名字应该都是由一个小写单词组成,例如:net.ebseries.modules。 此外,对于包名我们做如下约定: 1. 工具函数类包名前缀为.util 2. Servlet类包名前缀为.servlet 3. test case类包名前缀为.test
Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成,例如:DataFile或InfoParser。
Class 变量的命名 变量的名字必须用一个小写字母开头。后面的单词用大写字母开头,例如:debug 或 inputFileSize。
Static Final 变量的命名 Static Final 变量的名字应该都大写,并且指出完整含义,例如:MAX_UPLOAD_FILE_SIZE=1024。
参数的命名 参数的名字必须和变量的命名规范一致。
数组的命名 数组应该总是用下面的方式来命名: byte[] buffer; 而不是: byte buffer[];
方法的参数 使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size) { this.size = size; }
6.1.2 代码格式 文件头声明 源文件的头部需要一个history段,对于每次对源文件的重大改动,都需要在history段中注明。该段定义在package和 import之间,例如:
/***************************************************** * HISTORY * * 2002/01/29 Biz 创建文件 * * 2002/02/19 kevin 增加新功能 * *******************************************************/
import顺序 import包按一下顺序: 1. jdk标准包 2. java扩展包(例如servlet,javamail,jce等) 3. 使用的外部库的包(例如xml parser) 4. 使用的项目的公共包 5. 使用的模块的其他包 每一类import后面加一个换行。
例如: 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.*;
代码块书写格式 可以选择以下任意一种代码块的书写方式:
if (true){ //body }
if (true) { //body }
建议使用第二种书写方式。如果是修改他人的代码,必须使用代码原来的书写方式。
对于代码块过长,超过1屏以上,}后面要说明属于那个代码块,例如:
if (i > 100) { //too many lines more than one screen }// if (i > 100)
关于缩进 缩进使用4个连续空格,不要在源文件中保存tab字符, 请注意调整所用的IDE工具,打开将tab转换为空格功能。
页宽 页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进4个空格。
操作符 操作符左右各用一个空格分隔。 例如: int a = b; if (a > 0);
SQL语句 代码中书写的sql语句要求sql关键字全部大写,表名和字段名小写。例如: SELECT user_id, name FROM account WHERE user_id > ? AND depart = ? ORDER BY name
类和方法定义 类定义或方法定义过长需要换行书写,例如:
public class CounterSet extends Observable implements Cloneable
private PortletSet getPortlets( Portlets portlets, RunData rundata, boolean application, boolean applicationsOnly ) { }
6.1.3 注释 public 和 protected的成员变量和方法必须写javadoc注释。超过1句以上的注释使用中文书写。对于代码多于10行的private方法也要写javadoc注释。
对于代码中的逻辑分支或循环条件需要书写注释,例如:
if (some condition) { //符合某个条件,应该这样处理 } else { //否则应该那样处理 }
6.1.4 其他 关于属性 类中的属性不能定义为public变量直接存取,而是定义成protect变量并编写get/set方法,例如:
protect String myName;
public String getMyName() { return myName; }
public void setMyName(String myName) { this.myName=myName; }
6.2 jsp/html代码规范 jsp/html描述注释 jsp/html页面顶部必须存在一个基本描述注释,包含功能描述、参数列表和历史修改信息,例如:
<%-- /************************************************** * * NAME : file_download.jsp * * PURPOSE : 下载文件提示 * * PARAMETERS : * file_id - 文件ID号 * force ?C 是否强制下载 * * HISTORY * * 2002/04/05 Hafele 创建文件 * * 2002/06/07 tmp 增加强制下在功能 * *************************************************/ --%>
jsp头格式 jsp头部一般需要遵循以下格式:
<%@ page contentType="text/html;charset=gb2312" %> <%@ page import="java.io.*" %> // jdk标准包 <%@ page import="javax.mail.*" %> // java扩展包 <%@ page import="org.apache.xml.*" %> //使用的外部库的包 <%@ page import="com.sunrise..*" %> //使用的项目的公共包 <%@ 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>
注意:必须指定一个有意义的<title>,严禁出现“Untitled”或“未命名”之类的<title>。
2. 所有html标签使用小写
3. html页面一般需要设置一个背景色(一般是#FFFFFF)。
html语法校验 所有的jsp/html页面需要能够使用DreamWeaver正确打开(即html语法正确,没有错误的标记)。
注释 一般不使用html注释,除非是有必要让最终用户看到的内容。对于包含JSP代码的html块,必须使用JSP注释。对于没有必要的注释,在发行版本中必须移除。
form属于域的maxlength 对于text类型的输入域,必须根据数据库字段的长度设置相应的maxlength,例如数据库类型是VARCHAR(64),那么maxlength是32(因为中文浏览器对于中文也认为是一个字符)。
6.3 其他规范 对于IDE的使用 目前暂不限制开发工具的使用,但是最后提交的代码必须不依赖任何IDE,而需要可以使用ant完成所有的编译工作。一般提交的代码目录格式如下:
|_dist(存放输出的文件class文件) |_lib(使用的库) |_src(源代码) |_docs(文档) |_wwwroot(页面文件) |_build.xml(ant的build文件) |_changes.log(代码版本和修改的日志)
限制session的使用 在代码中使用session需要听取项目经理的意见,项目经理需要在设计文档中登记项目中所有使用到的session的名字和作用。
限制外部包的使用 开发员如果需要使用一个外部包需要听取项目经理的意见。在项目经理批准以前,严禁擅自使用一个外部的包。
1、如何混合使用Jsp和SSI #include? 在JSP中可以使用如下方式包含纯HTML: <!--#include file="data.inc"--> 但是如果data.inc中包含JSP CODE ,我们可以使用: <%@include file="data.inc"%>
2、如何执行一个线程安全的JSP? 只需增加如下指令 <%@ page isThreadSafe="false" %>
3、JSP如何处理HTML FORM中的数据? 通过内置的request对象即可,如下: <% String item = request.getParameter("item"); int howMany = new Integer(request.getParameter("units")).intValue(); %>
4、在JSP如何包含一个静态文件? 静态包含如下:<%@ include file="copyright.html" %> 动态包含如下:<jsp:include page="copyright.html" flush="true"/>
5、在JSP中如何使用注释? 主要有四中方法: 1。<%-- 与 --%> 2。// 3。/**与**/ 4。<!--与-->
6、在JSP中如何执行浏览重定向? 使用如下方式即可: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文件的开始即可: <% 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中如何设置COOKIE? COOKIE是作为HTTP HEADER的一部分被发送的,如下方法即可设置: <% Cookie mycookie = new Cookie("aName","aValue"); response.addCookie(mycookie); %>
9、在JSP中如何删除一个COOKIE? <% Cookie killMyCookie = new Cookie("mycookie", null); killMyCookie.setMaxAge(0); killMyCookie.setPath("/"); response.addCookie(killMyCookie); %>
10、在一个JSP的请求处理中如何停止JSP的执行 如下例: <% if (request.getParameter("wen") != null) { // do something } else { return; } %>
11、在JSP中如何定义方法 你可以定义方法,但是你不能直接访问JSP的内置对象,而是通过参数的方法传递。如下: <%! 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已关闭了COOKIES,在JSP中我如何打开SESSION来跟踪 使用URL重写即可,如下: 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中能发送EMAIL吗 可以使用SUN的专用包:sun.net.smtp包。如下脚本使用SmtpClient类发送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中我能调用一个JSP错误页吗 当然没问题,如下展示了如何在一个SERVLET控制逻辑单元内调用一个JSP错误页面。 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" %> <%! //定义一个对SessionBeanHome接口实例的全局引用 AccountHome accHome=null;
public void jspInit() { //获得Home接口实例 InitialContext cntxt = new InitialContext( ); Object ref= cntxt.lookup("java:comp/env/ejb/AccountEJB"); accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class); } %> <% //实例化SessionBean Account acct = accHome.create(); //调用远程方法 acct.doWhatever(...); // 如此等等 %> 16、当我使用一个结果集时,如何防止字段为"null"的字域显示在我的HTML输入文本域中? 可以定义一个简单的函数来达到目的,如下: <%! String blanknull(String s) { return (s == null) ? "" : s; } %>
然后在JSP的FORM中,可以这样使用 <input type="text" name="shoesize" value="<%=blanknull(shoesize)%>"> 17、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 现提供两个解决方案: A:使用HTTP, B:在Servlet中,通过设置ContentType和使用java.io包的Stream等类可作到.例如: response.setContentType("application/x-msword"); 然后想输出缓冲中写一些东东即可。
18、使用useBean标志初始化BEAN时如何接受初始化参数 使用如下两标签即可: <jsp:getProperty name="wenBean" property="someProperty"/> <jsp:setProperty name="wenBean" property="someProperty" value="someValue"/> 19、使用JSP如何获得客户浏览器的信息? 使用request.getHeader(String)即可 20、能象调用子程序一样调用JSP吗? 当然可以,用<jsp:include page="relativeURL" flush="true"/>
21、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS?
<%@include file="abc.jsp"%>与<jsp:include page="abc.jsp"/>之间的差别? 前一个为静态包含,而后一个为动态包含
22、JSP的缺点? 1。对JAVA程序进行调试没有好东东 2。因大多数的servlet引擎不支持connection pooling 3。Servlet引擎没有标准 4。JSP与其它脚本语言的交互
23、JSP能进行递归调用吗? 当然可以,如对form的提交给本页
34、如何实现JSP的国际化? 为各种版本提供resource bundles属性文件即可
25、在JSP中如何写文本文件? 使用PrintWriter对象,如: <%@ 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中包括绝对路径文件? 使用URLConnection即可。
27、在servlets和JSP之间能共享session对象吗? 当然可以, HttpSession session = request.getSession(true); session.putValue("variable","value");
28、JavaScript的变量能复制到JSP的SESSION中吗?
29、如何设置cookie在某一时间后过期? 用Cookie.setMaxAge(int)
30、如何获得当前的sessions数? 可以使用HttpSessionBindingListeners来跟踪
31、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 当然可以,可以为你的JSP文件定义一个别名:/jsp/=ybwen.genius.myPreprocessingServlet,而以/jsp/为前缀的文件可以使用
32、对一个JSP页,如果多个客户端同时请求它,同步可能吗? 在jsp:useBean语法中使用beanName有何好处? beanName使用Beans.instantiate()初始化Bean
33、当我使用<jsp:forward>时,在浏览器的地址栏没有改变? 使用response.sendRedirect("newURL")
34、如何转换JSP 0.9版本的文件到JSP1.1? 可使用sed/awk即可
35、使用JSP能设置HTML FORM中输入域的焦点,不用JavaScript? 没办法
36、使用JSP连接到数据库连接缓冲池的最好方法是什么? 1.使用JDBC2。0中带有此服务的Driver 2.使用提供有此服务的Application server 3.自己写
安装了多国语言包后,发现还有一些英文单词没有翻译成中文,这是因为之前启动了英文版的eclipse,eclipse在启动后,记录了一些英文版的信息,形成了干扰,解决方法有以下两种: 1、将eclipse安装路径下的configuration目录删除,再重启eclipse。 2、右击eclipse快捷方式,在目标栏的最后加入eclipse的启动参数-clean。或者在DOS下用“eclipse-clean”来启动。
本例安装环境:WIN XP中文版+JDK1.4.2_12+ECLIPSE 3.0.1(加多国语言包) 1.安装JDK 下载地址:http://Java.sun.com/j2se/ 注意:在WIN XP下安装ECLIPSE不需要设置JDK环境变量。(实践经验) 2.安装ECLIPSE 下载地址:http://download.eclipse.org/downloads/。 (1)eclipse的安装非常简单,它属于绿色软件的安装方法:不需要运行安装程序,只需要将下载的eclipse压缩包解压就可以运行eclipse了(路径自己喜欢)。 (2)检查eclipse是否安装成功。双击目录下:eclipse.exe文件来启动eclipse。第一次启动会弹出对话框(用来设置工作空间,位置自己喜欢),单击OK按钮,开始运行eclipse程序。运行完毕后,出现一个Welcome to Eclipse 3.0 的欢迎界面,表示已经安装成功了。 3.安装多国语言包 下载地址:http://download.eclipse.org/downloads/。 注意:要与eclipse 3.0.1版本相对应(网名:Language Pack)。 (1)先关掉Eclipse。 (2)将下载的语言包解压缩,并给这个目录取个名(本例:language)。 (3) 将此目录复制到eclipse安装目录下(最后路径为:eclipse安装目录/language/eclipse/..)。 (4)建立语言包的link文件。在eclipse安装目录下建一个目录并取名为links,在该目录中新建一个文本并取名为language.link(可任意取名),然后在language.link文件中加入一行文字:path=language(用相对路径)。 经过四步后,现在就可以重启eclipse了。看看!是不是eclipse界面都汉化成中文了呢!未成功安装的朋友,快点试下啦! 以上为本人近期的学习成果,谨供各位朋友参考!若有不对的地方请见谅!
当第一个用户请求JSP文件的时候,JSP容器(如TOMCAT)把JSP文件转换成JAVA文件(SERVLET类文件),然后编译成CLASS文件,常驻内存;当有客户请求的时候,直接再打开一个线程,而不是一个进程,无须重新编译,直接执行第一次已经编译好的CLASS文件,速度比每次都要重新编译JSP文件要快得多。当然如果JSP文件发生变化,则需要重新编译一次。 遇见!
|