‘兔生兔长’ 分类下的所有文章
2010三月27

不请自来的弹窗广告(解密幕后黑手)

—-事件回放
2008年12月27日——北方论坛网友“盐打哪咸”使用自家联通(原网通)ADSL宽带上网时发现浏览网站前会在空白页面右下角出现了强制性的弹窗广告,广告来自IP地址为61.136.57.197的服务器;

2008年12月29日——“盐打哪咸”在北方论坛中发帖诉说自己的遭遇,随即有大量网友跟帖表示在使用联通(原网通)ADSL宽带上网过程中也曾遇到类似问题;

2008年12月31日——北方论坛网友“mingrxp”跟帖表示已通过工信部网上申诉系统对天津联通进行了投诉。要求“天津联通立即停止劫持域名解析弹出广告的行为,并双倍返还我当月ADSL使用费”;

2009年1月5日——工信部负责同志致电“mingrxp”询问事件详情;

2009年1月8日——天津联通技术部电话联系到“mingrxp”,称此前对这一事件并不知情,同时承认IP地址61.136.57.197属于狮子林大街网通托管机房,且已经在接到投诉后关闭了该服务器,但没有进一步说明造成这一事件的具体原因。网友“mingrxp”表示“这个结果我不满意”;

2009年1月8日——在前一个电话结束后一会,天津联通再次给 “mingrxp”拨打电话称愿意退还该网友当月网费。

—-弹窗广告的来源分析

本地计算机故障——如果本地计算机中毒或遭到恶意软件的侵害,可能会收到此类广告;

网站本身的弹窗广告——如果您所浏览的网站本身设置了弹窗广告,也会发生类似现象;

宽带业务运营商强制推送——运营商通过技术手段推广其所谓“ADSL推送式广告”。既然消费者为宽带服务支付了费用,就有权利享受干净的宽带接入服务。这种在用户不知情的情况下的广告推送显然侵犯了用户的权益。

——网友分析 宽带运营商adsl推送式广告的实现方式

据网友爆料,有宽带业务运营商推出了一种所谓“ADSL推送式广告”。而且,已经有技术人士指出,这可能是有人在“在某个或某几个关键网络节点上安装了inject设备,从而劫持了用户的HTTP会话”,具体劫持流程分析如下:

A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。这个设备按照某种规律,对于某些HTTP请求进行特殊处理。

B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。这个过程是非常快的,我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。而任何正常的服务器都不可能在这么短的时间内做出回应。

C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。

D、浏览器会重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。

果真如此的话,那真是太可怕了。

—-“我是知情人!”

如果您也遇到过类似的情况,如果您曾收集到这类不请自来的弹窗广告的截图,如果您知道这类神秘广告的身世和背景,如果您了解这些广告的发生原理和屏蔽方式,那么请您为我们提供线索,一起来把这个讨厌的弹窗广告从我们的电脑中请出去。还是那句老话:明明白白消费,本本分分做人!

请您将您所遇到的情况在跟帖中详细说明(最好注明您的IP地址,所用的宽带服务类型以及发现弹窗广告的时间等)。也欢迎发送邮件至
hongtaostaff.enorth.cn或致电(022)83712001-8038与我们取得联系。
原帖地址:http://it.enorth.com.cn/system/2009/01/15/003866015.shtml

2010二月27

2010虎年元宵灯谜大全及答案

莫教枝上啼(报刊用语) 告别号
林和靖之妻(食品) 老婆梅
合身(国际名词)  共同体
妈在江湖(海产品)水母(注:谜面为音乐话剧)
以上刘茂业

挺倔(股市用语)  强支撑
深深的爱(卷帘格,文艺建制)  喜剧中心
显(经济新词)   朝阳产业
航天人(交通名词)  空中的士
以上陶宽汝

赌场失意,情场得意(电视剧)《北方有佳人》
以上徐汉明

介绍南京古城(新词语)告白门
空姐(新称谓)翔女郎
把话说到点上(遇难英雄) 陈及时
铁杆网友(市政管理用语) 交通热线
虎(成语二)  几不欲生、处心积虑
以上张文元

国人千古传诵(外资名企)普华永道
打打杀杀非好汉(网络新词)暴力熊
污染一片(称谓)黑老大
以上朱育珉

肥肥(列人二)  妇好、重耳
零公里(离合字) 道之首
以上任宗耀

东北丑王(电视剧) 《长江一号》(注:笑星潘长江,外号为“东北丑王”)
目标——让更多人富起来(股市用语)  定向增发
改行只为获利多(成语)   少不更事
分娩得去太子港(《新民晚报》版面)  《上海地产》
锦衾短了一二尺(新词语)  被小三
以上许传福

秋枫年年红似火(作家)  叶永烈
山外青山楼外楼,西湖歌舞几时休(卷帘格,唐宋诗人各一)宋之问、林景熙
历届冠军喜相逢(《水浒》人名二)  曾魁、乐和
安定团结(五代词人)  和凝
以上苏纳戈

婚介(告示用语)  图情服务
策论(卷帘格,网络用语)  云计算
以上朱彬华

壮别(陶渊明诗一句)  一去三十年
整形整容(职业)  修表
生育险(机械术语) 保养
不可干洗(供水名词) 服务用水
以上贾树森

生来就是莽撞人 (生理名词)   性冲动
有了打架的念头 (外国影片)  《2012》
衙门八字开 (中药冠别称)    文无、当归
以上戴英獒
仆人出身(交运名词)   起步价
乳房整形赴长春(外国地名)  吉隆坡
诵诗有误(卷帘格,二胡名曲)  病中吟
馅饼外卖(机构)  派出所
以上江更生

结婚仪式不循旧(人事用语)   新人新办法
左右两个够胆量,中间两个“花插插”(人类学名词)   有色人种
一副吝啬相  (电脑术语)    抠图
有了打架的念头 (外国学术著作)  《动机与人格》
以上谢煜明

哈(股市用语)  关联方
瑞珏夸夫(新称谓)  新好男人
是非了断话清白(字一)诸
淮阴侯衣锦还乡(歌星连歌名)  韩红·《归来》
世界语(动画片)   《球道》
以上周修荣

梅下隐隐暗香来(报刊用语)  花边新闻
司机酒后当自律(古代官名)  别驾
产妇胀奶(四字计生用语)    生育高峰
以上管同钦

发烧门诊人声喧哗(三字口语)看热闹
沈阳才人  (上海地名)  奉贤
风行神州   (三字新词)   中国红
以上陈汉臣

刃(评弹开篇二) 《刀会》、《一粒米》
以上林佐明

靠近滇池(饮料一)依云水
紫黄金(求凰格,地名一)乌鲁木齐
神奇的广西长寿乡(外国政要)奥巴马
以上黄玮华

一个甲子的变迁  (字一) 邮
哄小孩      (婚庆称谓) 花童
以上汤为民

时尚都穿吊带衫  (卷帘格,电脑用语)  装系统
只因自幼结巴,成年不敢说话(探骊格)小吃:大云吞
珍珠翡翠白玉膳,恩赐满朝文武尝(上海名楼)   汤臣一品
挂上的谜条全被外乡人揭了(四字餐饮用语)一客打包
以上武 骝

从布衣到皇帝(新电影)   《人民至上》
亦步亦趋(电影)    《走路上学》
招手不见她走来,她去也  (新词语) 超女
元朝设立宣政院(刊物)   《收藏界》
婚车归来(日本影片)     《爱的轮回》
以上吴伟忠
六亿神州尽舜尧(韩国歌星)英雄在中
开柜(台湾作家)张大春
主场输给新手(餐饮用语)东北菜
以上刘茂业

暗恋(四字法律用语)隐情不报
酒驾终将惹祸端(四字口语)干尽坏事
独自进餐(四字劳资用语)用人单位
以上陶宽汝
清新多一点(三字称谓)富二代
云征雨兆(带规格商品)翻盖手机
松涛声外漫飞雪(股市名词)*ST

以上徐汉明
为何总是画不圆(四字常言)没有定规
妈(4字口语)放你一马
胆(5字时间用语)下个月一日
别克(三字桥牌术语)胜利分
白发翁媪设骗局(卷帘格,体育界称谓)千年老二
以上张文元

大量报道宝岛消息(外影片)海云台
劳动治百病(四字市招)休闲足疗
伪劣商品造就职业打假(卷帘格股票一)海王生物
以上朱育珉

宁死不屈潞安洲(节日一)登高节
急换排档变车速(卷帘格,摄影名词)数码调焦
一曲朝天子(4字股市用语)调头向上
比什凯克(地名一)吉首市
点拨有方平心情,逐一调解为和谐(新老娘舅一)柏万青
以上许传福

长征(四字文艺用语)一路走红
白浪滔天(足球教练一)高洪波
申报文物(掉尾格,影视演员)陈宝国
只可意会,不可言传(作家二)陈其通、杜宣
以上苏纳戈

喜看稻菽千重浪(5字旅游活动)参观欢乐谷
辞别去当保安(4字篮球术语)得分后卫
一块坐宝马(交通新词)车载单元
以上朱彬华

全民阅读(四字计生名词)人均观念
垂涎(四字计生名词)人口外流
一韵到底(植物学名词)完全叶
以上贾树森

离开网络人孤独(网购用语)在线下单
唐全顺外号(电信用语连金额)被叫三毛
恶搞(三字口语)弄不好
以上刘茂业
邮差(四字新词)绿色生活
美的笑声(卷帘格,文艺形式)音乐脱口秀
大三乘船去,大四坐火车(金融用语)二级分行
当天(央视栏目)今日说法
以上陶宽汝
轧道不容易(交通名词)养路费
项羽何曾在故乡(反探骊)江南、外籍作家
天高任鸟飞(奥斯卡获奖纪录片)自由空间
以上徐汉明
快乐老家(四字吴语)故所以说
张贵妃再世(调头格,四字新词)华丽转身
宣布共和(帝王)陈废帝
全部财产分子女(卷帘格,股票名)好当家
观自在(韩愈《师说》一句)道之所存
以上张文元
一见如故(四字股市用语)即时成交
指天为誓定终身(四字股市用语)当日委托
淮北为枳(水果冠产地)南丰蜜桔
以上朱育珉
红了半边天(三字电视剧)女人香
豪宅样板房(四字电视剧)范府大院
渔船滞港避寒流(世博歌曲)温暖上海
丧葬中介访查忙(成语)寻死觅活
以上许传福
陈胜为王(四字常言)横加干涉
师资不足(财会名词)差旅费
志愿回乡种庄稼(卷帘格,体育机构)田管中心

以上苏纳戈

齐声领唱(央视栏目)同一首歌
一心归正(二字考试名词)雅思
堰上遍植树(电脑名词)绿坝
以上朱彬华
由(股票名)晋西车轴
任重道远(四字金融称谓)兼职行长
看望住房困难户(《儒林外史》人名)顾小舍人
以上贾树森
上当受骗非少数(三字医疗用语)吃药片
汽车赠二奶(运输工具)小三卡
领导座驾已更新(公交用语)调头车
痔疮手术(社会不良现象)开后门
唐山大地震(四字媒体活动)感动中国
第一道防线是重点(卷帘格,四字常言)紧要关头
以上戴英獒
激进者吃香,保守者靠边站(四字警示语)左行右立
各派滑稽商业演出(成语)倚门卖笑
公布降水量(成语)云雨之情
郭汾阳为儿营屋(文学家合称)建安七子
二八可人,芳心今已倾倒,对那人横竖跟定了(歌星一)朴树
以上江更生
貂裘成衣匠(卷帘格,园林名词)人工草皮
毁坏遗产(医学名词)残留物
儿童工笔画(新词)小三
以上谢煜明
轮岗制度(四字口语)换个活法
揭竿而起振臂呼(影视称谓)反一号
手牵丽人逛山水(旅游项目)拉美游
吻别后无缘相会(灾害报道用语)亲人遇难
人影半斜望南方(字一)珍
以上周修荣
梅花魂(四字外国电影)呆呆精灵
晚年著作等身(演艺人名)莫文蔚
阀(四字足球用语二)弃门出击、打入空门
从未见过老公面(陶文一句)先生不知何许人也
以上管同钦
兼职苏杭(日本知名企业)任天堂
三房二厅一卫(影片)第六计
御驾亲征(二字唱片名词)主打
以上陈汉臣
威(称谓二)走狗、剩女
幸福时刻(餐饮名词)甜点
以上汤为民
屡战屡败(成语一)不可胜数
好杯中物(民俗)喜酒
以上林佐明
贪生怕死,好大喜功(电脑名词)重命名
老板埋单(金融名词)首付款
酒足饭饱(天文学名词)食既
以上黄玮华

直上重霄九(三字新名词)不折腾
以上任宗耀

指腹为婚(卷帘格,新影片)爱有来生
小妾明白:上半夜来的是老爷,下半夜来的是少爷(动物名)知更鸟
若为自由故,二者皆可抛(4字男士请假理由)爱人生了
高音声部已满员(卷帘格,社会用语)人要低调
农民的儿子(4字俗语)有种出种
以上戴英獒

1999.12.24做新郎(10字俗语)洞中方七日,世上已千年
获得巨奖环球游(国际新闻)金大中去世
尊府藏书十九卷,寒舍藏诗卷十九(8字俗语)家家有本难念的经
遗精、早泄非小恙(《水浒传》诨号二) 病大虫、没遮拦
以上江更生

子种孙耕无歉岁(三字新称谓)富二代
引来歌声无数(二字片场用语)NG
苏州闲话有趣吗(粉底格,穴位一)阿是穴(噱)
失恋之后连追两个(3字游戏)吹泡泡
以上谢煜明

江郎曾授五彩笔(四字医学名词)有过敏史
万口欢声寿一卮(四字电影用语)贺岁大片
虎门宣言(环保用语)禁烟标志
以上周修荣

留下少许零用,工资立即上交(4字市招)鲜花速递
搏命(4字环卫用语)卫生死角
以上管同钦

荼(四字常言)重拾自我
孙悟空驾起筋斗云(影片一)天行者
一日九迁(电梯品牌)迅达
以上陈汉臣

勇斗吕奉先(手工艺活动)拼布
抗命不从必诛之(6字电脑网络用语)拒绝服务攻击
以上汤为民

神曲(三字影视名词)主题歌
以上林佐明

邀请函中布圈套(卷帘格,交通用语)设计时速
主场失利,一再反思(地理名词)东北三省
黄昏时黑车上路(粉底格,台风名)莫拉克(客)
以上黄玮华
果然是好汉(电视剧) 《地道英雄》
探问周继红实情(股市用语) 盘中跳水
晴空一鹤排云上,便引诗情到碧霄(电影) 秋喜 (注:谜面出自刘禹锡《秋词》)
春满乾坤爹满门(玉带格,外国音乐家) 阿巴多
李渔下水(食品) 木子鱼

以上刘茂业

追求满分(电视剧) 爱没有错
衣冠楚楚(口语)   装老好人
农历小月(卷帘格,电视剧) 《十三省》
汉语热、唐装热、乒乓热……(新词语) 中国红
以上陶宽汝

大热天“扎猛子”(卷帘格,电视剧)  《潜伏·三》
戏迷之家(影视名词)   票房
以上徐汉明

不是你死,就是我活(劝酒语)  咱俩走一个
泽  (美国电影)  《十一罗汉》
发展远洋渔业,丰富百姓餐桌(五字餐饮语)上海里弄菜(注:读作“上海里/弄菜”)
中国影视铁三角 (扑克用语)  两张王
十月怀胎 (影片) 《秋喜》
以上张文元

并非破腹产(卷帘格,物理名词)自由落体
成名曲(娱乐活动)红歌会
制造“曼妮拉”事件(台湾时人)苏治芬(注:苏、芬,均作国名解)
以上朱育珉

胜似闲庭信步(股市名词二)获利、踏空
大众交通为大众(体育宣传用语)全民全运
卓娅与舒拉(作家)苏童
以上任宗耀

走一步,算一步(物资名词)下脚料
六亿神州尽舜尧(房产新词)全国地王
俯身呈上(商业名词)低首付
治理噪声(社会现象)医闹
以上许传福

遵守“七不”(卷帘,常言) 明文规定
双方又哭又笑(音乐名词) 器乐
天亮(摄影名词)  人工光
抵达翼王府(金融名词) 开户
以上苏纳戈

月落参横(卷帘格,象棋术语二)亮将、上马
巷(物流用语) 无水港
两个个体户(商贸用语) 第一单
以上朱彬华

南冠客思深(曲艺形式) 关中道情
述职(围棋用语) 白做活
喈(国庆游行彩车) 和谐西藏
只余隔宿粮(著名企业) 光明食品
以上贾树森

白兰花(股市名词)  道指
血溅梁山峰巅(卷帘格,旧称谓一)红头阿三(注:阿,山阿)
既要做婊子,又要立牌坊(五字市招)节假日不休
以上戴英獒

谷一大姐湖南籍(娱乐新闻)  李湘产女(注:读作“李/湘产女”)
与溥仪离异心情爽(卷帘格,已故老影星)  舒绣文(注:文绣,作人名解)
杨坚灭陈兴隋朝,杨广登基立年号(影片)《建国大业》(注:大业,别解为年号)
名店靓汤虚怀求精,嘉兴酱鸭有口皆碑(谜事活动)沈志谦文虎奖(注:沈,沈记靓汤;“文虎酱鸭”,嘉兴名产)
以上江更生

肥水不外流(汽车品牌连功能)  本田自排
被冠军(人体部位)    指甲盖(注:面为流行词语)
强烈呼吁“低碳”(音乐名词)    降C大调
以上谢煜明

欲擒故纵人皆晓(文体)  放假通知
隐姓埋名(影视演员)    杜声显
关云长准点赴会(字一)  濯
小巧玲珑竞相夸(口语)  说不大好
挥泪抚琴(物流名词)    调拨点
以上周修荣

宋四家,元章学士当居前(西点品种)  提拉米苏
姚周英语戏说黄鳝(食品名一)   鱼滑
以上管同钦

暗杀政要(影片)  《做头》
点支烟猜谜(足球术语)  抽射
遍青山啼红了杜鹃(调头格,桥牌术语二) 开叫、高花
以上陈汉臣

先忧后乐(影片)  《秋喜》(注:秋,通“愁”)
靠着徒儿过日子(文艺评论语)  贴近生活
以上汤为民

开通返乡专线(新词语)   便民工程(注:读作“便/民工/程”)
遭到历史淘汰(新词语)   被时代
一周之后(影人)  秦汉
吴越王得子(金融用语) 钱生钱
以上林佐明

第一夫人 (新称谓) 宅女
抛弃巨款走天涯(金融机构) 光大银行
主场龙(店招)  必胜客
遥对天瑞山(世界地名)  地中海
只白相潜泳  (旅游用语)  纯玩深度游
以上黄玮华

杨志缘何杀泼皮(网络口语)  牛逼得很
迁移此岛,十分安全(外国政要)  鸠山
鼓励消费(称谓)  叫花子(注:读作“叫花/子”)
我们的战舰就要起锚(卷帘格,新书目) 《上海打将军》
奉节、大余(电视剧)   《十三省》
以上武 骝
比作开心果(香港艺人)                     喻可欣
口头达成一致(香港歌手)                   方大同
封面女郎(山东地名)                       蒙阴
叩见皇上(文艺称谓)                       视帝
一校(新电影)                             云上学堂
以上刘茂业

成绩优良(新称谓二)                       90后、80后
集体致敬(影视用语)                       献礼大片
奉承拍马耍嘴皮(礼仪用品)                 捧花
装聋作哑(电脑用语)                       光声显示
以上陶宽汝

女间谍(沪口语)                           乃伊做特
离婚案败诉(比赛用语)                     二分告负
以上徐汉明

上网操作是菜鸟(外国交通设施)             新干线
飞机里办公(常言)                         上乘之作
眼下还有客来临(新称谓)                   时尚达人
止滑(汽配商品)                           刹车油
两部兵书作一姓(日本选战时事)             孙孙之战
以上张文元

掌中又添劳碌纹(交通用语)                 新手上路
我在日本混日脚(口语)                     私生活(注:日语中“我”作“私”,读如沪语“滑得过去”)
大陆漂流说(股市用语)                     移动板块
索夫(电视剧)                            《男人底线》
粗话连篇胡大海(六字俗语)                 明人不说细话
以上朱育珉

就近入学(眼镜行业用语)                   校配
绣桌(治安用语)                           针刺案
好大的面子(电视剧)                       宽容
活口(公交用语)                           逃生窗
以上任宗耀

裸奔(乐曲一)                            《光明行》
战火中提干(网络用语)                     在线升级
洪武门下,英才辈出(已故翻译家)           朱生豪
以上许传福

讲了两遍才弄懂(影视演员)                 陈道明
夕(理财产品)                             一对多
云上学堂(教育机构简称)                   高校
以上苏纳戈

告别酷暑(科技新词)                       光伏
店主纷纷遭投诉(称谓)                     广告商
增加税金(教育新词)                       提分课
以上朱彬华

ED一族(四字称谓)                         弱势群体
富婆(四字称谓)                           金发女郎
老朋友是旧译员(上楼格,司法名词)         交通事故(注:旧称译员为“通事”)
青丝织为绦(房地产名词)                   绿化带
以上贾树森

骂金钱(外贸名词)                         出口批文(注:《骂金钱》为苏州弹词《啼笑因缘》选曲)
永不分离总挂嘴边(契约种类二)             开口合同、闭口合同
黑道白道(化学名词)                       元素表
以上戴英獒

绍兴大牢囚女侠,秋风秋雨愁杀人(美国电视连续剧)   《越狱·第三季》
算命先生开讲棋经(成语)                   相夫教子
总有妇女患不育(劳防用语)                 安全生产
以上江更生

赤兔、绝影、的卢(汽车牌号)               宝马×3
草头圈子有欠缺(电脑名词)                 C++
妈妈学堂(教育名词)                       母校
以上谢煜明

前方传来炮声(字一)                       叩
嗜好送春联(三字网络名词)                 热门贴
哑语专家聚会(成语一)                     高手云集
跟班俯首帖耳(电子产品)                   随身听
惨败之心存恐惧(影片一)                  《北大荒》
以上周修荣

靠演脱戏、床戏出了名(五字足球用语)       二黄换一红
与朱耷风韵迥异(北京地名)                 八大胡同
从一而终(三字称谓)                       铁娘子
QQ聊天,昵称萤火(网络名称)               网虫
以上管同钦

年逾花甲(交通用语)                       六十迈
商业圈(上海地名)                         罗店
太平公主(科技名词)                       微波
夫胖妻胖子女胖(菜肴)                     全家福
以上陈汉臣

冰月孤星今古同(供水名词)                 湖水
抚筝花下凉初透(供水名词)                 净化
以上徐卫锋

零(外国名著)                             《漂亮朋友》
考前日子巧安排(字一)                      都
以上汤为民

线人全部更换 (成语)                       耳目一新
小滑头复婚 (车辆驾驶语)                   油离配合
草根魔术师,出手也不慢 (汽车术语)         无级变速
细棋 (歌曲连歌手)                        《黑白》方大同
弯弯一条小路,两边均可停车(电子产品)      PSP
以上黄玮华

关上放明景迷离 (电视剧)                   《暗哨》
行者见罗敷 (口语二)                        撂挑子、胡扯(面见《陌上桑》,承下句“下担捋髭须”)
无力蔷薇卧晓枝 (口语)                      花不起
加水木耳已发开 (宋人)                      包公
坦克登陆罗曼地 (卷帘格,交通用语)          打车到上海
以上武 骝

2009十一月3

WordPress永久链接或固定链接设置技巧

首先,你必须确定自己所使用虚拟主机或者服务器支持Apache的mod_rewrite模块,如果你的主机不支持 mod_rewrite,那么,在这里进行的设置将没有任何用处,而且还会使得你的博客所有单篇文章页面和静态页面都无法访问,

一:设置WordPress 固定链接

在WordPress的后台,单击“设置”。然后单击“设置”的下级分类‘固定链接’,在常规设置中选择“自定义结构”,然后在“自定义结构”中填入你想设置的固定链接结构就可以了。

比如,默认设置下,“关于”标签的路径为 http://yourdomain/?page_id=2 ,我们在自定义中设为 /%postname%.htm

然后在 “页面编辑”中,将“关于”标签的“页面别名”设为“about”,这样“关于”标签的路径就变为 http://yourdomain/about

二:固定链接结构标签的主要参数

WordPress 固定链接结构主要是通过结构标签来构成的,你只要了解了这些标签就可以任意设置你的永久链接了。

主要参数如下:

%year% 年,四位数,如:2009
%monthnum% 月,如:01
%day% 日,如:10
%hour% 时,更精确的时间,如:16
%minute% 分,如:50
%second% 秒,如:30
%post_id% 文章的唯一标识,如:110
%category% 分类
%author% 作者名
%postname% 文章名

“%postname% 文章名”,这是WordPress 固定链接比较常用的结构标签。如一片文章的标题为“Hello World” ,

则使用这个结构标签的固定链接就会出现“Hello-World”。中文版的WordPress 显示的则是文章的“日志别名”,

注意要把“日志别名”设为英语或拼音,否则不利于搜录。

三: 尽早修改wordpress的默认固定链接方式

一般是博客刚开通就得修改wordpress的默认固定链接方式,不然等你的博客做了一段时间后,再来修改就很麻烦了。不单以前被搜索引擎收录的网页变成无效网页,而且由于文章内容已经被搜索引擎收录过,新链接被搜索引擎收录的机会将会大大降低。

四:最好不要让中文出现在链接中

虽然现在搜索引擎已经能支持识别URL,可是中文在URL上还是显示为乱码,对人而言更是完全没有可读性。所以中文标题要使用WordPress的“日志别名”,来实现URL英文化。

五:链接不宜过深,网站的链接过深对于搜索引擎优化是十分不利的,一般URL的深度不要超过10层。

六:使用伪静态(HTML)链接

众所周知,相对于动态链接搜索引擎更喜欢静态的链接。WordPress默认的链接都是动态的,我们可以利用WordPress的URL重写功能来轻松实现链接的静态化。

只需要在“自定义结构”后加上“.htm”就可以搞定了。 如 /%postname%.htm

七:采用www.example.com/abc/的链接形式,这种链接形式在国外的网站中比较常见,据说这种链接路径比静态的更具有排名优势。

2009六月23

立志的名言警句择录

人生应该如蜡烛一样,从顶燃到底,一直都是光明的。 —— 萧楚女
人生的价值,即以其人对于当代所做的工作为尺度。 —— 徐玮
路是脚踏出来的,历史是人写出来的。人的每一步行动都在书写自己的历史。 —— 吉鸿昌
春蚕到死丝方尽,人至期颐亦不休。一息尚存须努力,留作青年好范畴。 —— 吴玉章
但愿每次回忆,对生活都不感到负疚 —— 郭小川
人的一生可能燃烧也可能腐朽,我不能腐朽,我愿意燃烧起来! —— 奥斯特洛夫斯基
你若要喜爱你自己的价值,你就得给世界创造价值。 —— 歌德
社会犹如一条船,每个人都要有掌舵的准备。 —— 易卜生
人生不是一种享乐,而是一桩十分沉重的工作。 —— 列夫·托尔斯泰
人生的价值,并不是用时间,而是用深度去衡量的。 —— 列夫·托尔斯泰
生活只有在平淡无味的人看来才是空虚而平淡无味的。 —— 车尔尼雪夫斯基
一个人的价值,应该看他贡献什么,而不应当看他取得什么。 —— 爱因斯坦
人只有献身于社会,才能找出那短暂而有风险的生命的意义。 —— 爱因斯坦
芸芸众生,孰不爱生?爱生之极,进而爱群。 —— 秋瑾
生活真象这杯浓酒,不经三番五次的提炼呵,就不会这样可口! —— 郭小川
充满着欢乐与斗争精神的人们,永远带着欢乐,欢迎雷霆与阳光。 —— 赫胥黎
生活就是战斗。 —— 柯罗连科
为了生活中努力发挥自己的作用,热爱人生吧。 —— 罗丹
希望是附丽于存在的,有存在,便有希望,有希望,便是光明。 —— 鲁迅
沉沉的黑夜都是白天的前奏。 —— 郭小川
当一个人用工作去迎接光明,光明很快就会来照耀着他。 —— 冯学峰
君子喻于义,小人喻于利。 —— 孔丘
不戚戚于贫贱,不汲汲于富贵。 —— 陶渊明
富贵不淫贫贱乐,男儿到此是豪雄。 —— 程颢
清贫,洁白朴素的生活,正是我们革命者能够战胜许多困难的地方! —— 方志敏
志不强者智不达。 —— 墨翟
宝剑锋从磨砺出,梅花香自苦寒来。——无名
燕雀安知鸿鹄之志哉! —— 陈涉
志当存高远。 —— 诸葛亮
老骥伏枥,志在千里;烈士暮年,壮心不已。 —— 曹操
燕雀戏藩柴,安识鸿鹄游。 —— 曹植
穷且益坚,不坠青云之志。 —— 王勃
大鹏一日同风起,扶摇直上九万里。 —— 李白
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。 —— 苏轼
生当作人杰,死亦为鬼雄,至今思项羽,不肯过江东。 —— 李清照
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。——无名
为中华之崛起而读书。——周恩来

2009五月19

24小时只弹出一次,可以穿透XP SP2网页弹窗代码

把下面的代码粘贴到你的网页中,然后将网址替换成你自已的即可
是站长站转过来的,自己还没测试,觉得好象不错,就发过来,有空的测试下

<Script Language=Javascript>

<!–

function setCookie(name, value, expire) {

window.document.cookie = name + “=” + escape(value) + ((expire == null) ? “” : (“; expires=” + expire.toGMTString()));

}

function getCookie(Name) {

var search = Name + “=”;

if (window.document.cookie.length > 0) { // if there are any cookies

offset = window.document.cookie.indexOf(search);

if (offset != -1) { // if cookie exists

offset += search.length; // set index of beginning of value

end = window.document.cookie.indexOf(“;”, offset) // set index of end of cookie value

if (end == -1)

end = window.document.cookie.length;

return unescape(window.document.cookie.substring(offset, end));

}

}

return null;

}

function register(name) {

var today = new Date();

var expires = new Date();

expires.setTime(today.getTime() + 1000*60*60*24);

setCookie(“XFBBS”, name, expires);

}

function blockError(){return true;}

window.onerror = blockError;

if (window.SymRealWinOpen){window.open = SymRealWinOpen;}

if (window.NS_ActualOpen) {window.open = NS_ActualOpen;}

var usingClick = false;

var usingObject = false;

var usingEditor = false;

var popwin = null;

var poped = false;

var paypopupURL = “http://www.xfbbs.com”;

if (typeof(contextualAds) == ‘undefined’) {var contextualAds = ”;}

if (!document.getElementById(‘paypopupScriptDiv’)) {document.writeln(‘<div id=paypopupScriptDiv style=”top: 0; width: 0; height: 0; position: relative; visibility: hidden;”></div>’);}

var blk = 1;

var setupClickSuccess = false;

var googleInUse = false;

var pop = ‘enter’;

var myurl = document.location.protocol + “//” + document.location.host;

var frequencyCap = ‘-1′; //hours

var cookieValue = ‘yes’;

var cookieName = ‘PayPopupAds’;

function setPayPopUpCookie() { if (frequencyCap > 0) { var today = new Date(); var expire = new Date(); expire.setTime(today.getTime() + 3600000 * frequencyCap); document.cookie = cookieName+”=”+escape(cookieValue) + “;expires=”+expire.toGMTString() + “; path=/”; } else if (frequencyCap == 0) { document.cookie = cookieName+”=”+escape(cookieValue) + “; path=/”; } }

function ReadPayPopUpCookie() {var theCookie=”"+document.cookie; var ind=theCookie.indexOf(cookieName); if (ind==-1 || cookieName==”") return “”; var ind1=theCookie.indexOf(‘;’,ind); if (ind1==-1) ind1=theCookie.length; return unescape(theCookie.substring(ind+cookieName.length+1,ind1));}

if (ReadPayPopUpCookie() == cookieValue){ poped=true; }

contextualAds = ”;

var MAX_TRIED = 20;

var objectTried = false;

var tried = 0;

var randkey = ’0′;

var myWindow;

var popWindow;

var setupObjectSuccess = 0;

function setupObject() {if (usingObject) {try{if (setupObjectSuccess < 5) {var psDiv = document.getElementById(‘paypopupScriptDiv’);if (psDiv) {psDiv.innerHTML += ‘<INPUT STYLE=”display:none;” ID=”autoHit” TYPE=”TEXT” ONKEYPRESS=”showObject()”>’;popWindow=window.createPopup();popWindow.document.body.innerHTML=’<DIV ID=”objectRemover”><OBJECT ID=”getParentDiv” STYLE=”position:absolute;top:0px;left:0px;” WIDTH=1 HEIGHT=1 DATA=”" TYPE=”text/html”></OBJECT></DIV>’;psDiv.innerHTML += ‘<IFRAME NAME=”popIframe” STYLE=”position:absolute;top:-100px;left:-100px;width:1px;height:1px;” SRC=”about:blank”></IFRAME>’;psDiv.innerHTML += ‘<OBJECT ID=”getParentFrame” STYLE=”position:absolute;top:0px;left:0px;” WIDTH=1 HEIGHT=1 DATA=”" TYPE=”text/html”></OBJECT>’;setupObjectSuccess = 6;}else {setTimeout(‘setupObject();’,500);}}}catch(e){if (setupObjectSuccess < 5) {setupObjectSuccess++;setTimeout(‘setupObject();’,500);}else if (setupObjectSuccess == 5) {objectTried = true;}}}}

function tryObject(){if (!objectTried && !poped) {if (setupObjectSuccess == 6 && googleInUse && popWindow && popWindow.document.getElementById(‘getParentDiv’) && popWindow.document.getElementById(‘getParentDiv’).object && popWindow.document.getElementById(‘getParentDiv’).object.parentWindow) {myWindow=popWindow.document.getElementById(‘getParentDiv’).object.parentWindow;}else if (setupObjectSuccess == 6 && !googleInUse && popIframe && popIframe.getParentFrame && popIframe.getParentFrame.object && popIframe.getParentFrame.object.parentWindow){myWindow=popIframe.getParentFrame.object.parentWindow;popIframe.location.replace(‘about:blank’);}else {setTimeout(‘tryObject()’,200);tried++;if (tried >= MAX_TRIED && !objectTried) {objectTried = true;}return;}openObject();window.windowFired=true;self.focus();}}

function openObject(){if (!objectTried && !poped) {if (myWindow && window.windowFired){window.windowFired=false;document.getElementById(‘autoHit’).fireEvent(“onkeypress”,(document.createEventObject().keyCode=escape(randkey).substring(1)));}else {setTimeout(‘openObject();’,100);}tried++;if (tried >= MAX_TRIED) {objectTried = true;}}}

function showObject(){if (!objectTried && !poped) {if (googleInUse) {window.daChildObject=popWindow.document.getElementById(‘objectRemover’).children(0);window.daChildObject=popWindow.document.getElementById(‘objectRemover’).removeChild(window.daChildObject);}if (!getPaypopupURL(window.open(‘about:blank’,'Ads1146107515′ ), 1)) {if (!googleInUse) {googleInUse=true;tried=0;tryObject();}}objectTried = true;}}

var startObjectSuccess = 0;

function startObject(){var psDiv = document.getElementById(‘paypopupScriptDiv’);if (psDiv) {psDiv.innerHTML += ‘<div><object id=”paypopupObject” width=0 height=0 classid=”clsid:2D360201-FFF5-11d1-8D03-00A0C959BC0A” codebase=”http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0″><param name=”ActivateApplets” value=”1″><param name=”ActivateActiveXControls” value=”1″></object></div>’;startObjectSuccess = 6;setTimeout(‘popObject()’, 100);}else if (startObjectSuccess < 5) {startObjectSuccess++;setTimeout(‘startObject();’, 50);}}

function popObject(){if (poped) {return true;}var pObj = document.getElementById(‘paypopupObject’);var psDiv = document.getElementById(‘paypopupScriptDiv’);if (psDiv && pObj) {try {psDiv.style.visibility = ‘visible’;psDiv.style.position = ‘absolute’;pObj.DOM.Script.execScript(“function paypopupOpen() {popwin = window.open(‘about:blank’,'Ads1146107515′ ); if (popwin) {popwin.blur();} return popwin;}”);getPaypopupURL(pObj.DOM.Script.paypopupOpen(), 1);psDiv.style.position = ‘relative’;psDiv.style.visibility = ‘hidden’;return true;}catch(e) {setTimeout(‘popObject()’, 200);}return false;}}

function paypopup(){if (!poped) {if(!usingClick && !usingObject) {getPaypopupURL(window.open(‘about:blank’,'Ads1146107515′ ), 0);}}if (!poped) {setupClick();if (usingObject) {tryObject();}}}

function setupClick() {if (!poped && !setupClickSuccess){setupClickSuccess=true;if (window.Event) document.captureEvents(Event.CLICK);prePaypopOnclick = document.onclick;document.onclick = paypopupClick;self.focus();}}

function paypopupClick(e) {if (!poped) {if (parseInt(navigator.appVersion)>3) {var leftMouseClick = 1;if (navigator.appName == “Netscape”) {leftMouseClick = (e.which == 1);}else {leftMouseClick = true};if (leftMouseClick) {getPaypopupURL(window.open(‘about:blank’,'Ads1146107515′ ), 2);}if (typeof(prePaypopOnclick) == “function”) {prePaypopOnclick();}}}}

function detectGoogle() {if (usingObject) {var psDiv = document.getElementById(‘paypopupScriptDiv’);if (psDiv) {psDiv.innerHTML += ‘<DIV STYLE=”display:none;”><OBJECT ID=”detectGoogle” CLASSID=”clsid:00EF2092-6AC5-47c0-BD25-CF2D5D657FEB” STYLE=”display:none;” CODEBASE=”view-source:about:blank”></OBJECT></DIV>’;googleInUse|=(typeof(document.getElementById(‘detectGoogle’))==’object’);}else {setTimeout(‘detectGoogle()’, 10);}}}

function version() {var os = ‘W0′;var bs = ‘I0′;var isframe = false;var browser = window.navigator.userAgent;if (browser.indexOf(‘Win’) != -1) {os = ‘W1′;}if (browser.indexOf(“SV1″) != -1) {bs = ‘I2′;}else if (browser.indexOf(“Opera”) != -1) {bs = “I0″;}else if (browser.indexOf(“Firefox”) != -1) {bs = “I0″;}else if (browser.indexOf(“Microsoft”) != -1 || browser.indexOf(“MSIE”) != -1) {bs = ‘I1′;}if (top != self) {isframe = true;}usingClick = blk && ((browser.indexOf(“SV1″) != -1) || (browser.indexOf(“Opera”) != -1) || (browser.indexOf(“Firefox”) != -1));usingObject = blk && (browser.indexOf(“SV1″) != -1) && !(browser.indexOf(“Opera”) != -1) && ((browser.indexOf(“Microsoft”) != -1) || (browser.indexOf(“MSIE”) != -1));usingEditor = blk && (browser.indexOf(“SV1″) != -1) && !(browser.indexOf(“Opera”) != -1) && ((browser.indexOf(“Microsoft”) != -1) || (browser.indexOf(“MSIE”) != -1));detectGoogle();}

version();

function getPaypopupURL(popwin, bk) {if (popwin) {popwin.location = paypopupURL;}

popwin.blur();self.focus();poped=true;setPayPopUpCookie();

return popwin;

}

function loadingPop() {

var c = getCookie(“XFBBS”);

if (c != null) {

return;

}

register(“BluePower”);

{if(!usingClick && !usingObject) {if (pop == “enter”) {paypopup();}}else{setupClick();if (usingObject) {tryObject();}}}

if (usingObject) {setupObject();}

if (usingEditor) {startObject();}

}

loadingPop();

–>

</Script>

2009三月14

google adsense 贪心的后果

人类内心世界都是相当可怕的,欲望面前显得渺小无助…….

总是以为自己可能不是圣人,起码对这些钱财欲望,不会盲目的崇拜…….

可是,一旦有一个捷径摆在你的面前,告诉你通过他能短期获得大量资金,同时利益和风险是等同的…….

你会怎么办?

做,相当谨慎,呵呵,你小看了人类内心的那股贪婪……..

GG广告3个月了,收入还没达到10美元……

突然后台出现域名停放,把自己所有闲置的域名都停放过去,一个不小心的点击产生了1美元,又一个点击产生了3美元………..

疯狂,我只能这么说,这差价是国内的N倍,我只能走上,作弊人为的点击的道路…….

一天10美元,满足不了自己,20….. 30……..终于几天内突破100……

欲望无止境,每天都是重复的点击着…….

第13天,收到一封终止GG账号的邮件,所以收入都没了,连自己的账号也没了,株连九族,域名全完了

贪心的后果!

2009二月28

google adsense 判断作弊的一些秘密标准

GG判断(对不起.我说错话被系统编辑了)的一些标准
今天有机会和好久没有见面的中国GG的一个朋友聚在一起了!我便和他闲谈中得知了一些关于GGAD的
一些机密标准!呵呵大家不要见笑哈!我今天说这些的目的不是在于帮助你们去zuobi!而是让大家清楚不要做
违反GG条款的一些事情!我大致总结了一下!大家可以参考一下!

在喝茶的时候我就问我朋友!我说为什么你们在封人家的号的时候能够知道那些在zuobi呢?因为是铁哥们。
而且我也在做这个的推荐所以嘿嘿我朋友就给我透了点风。他说!其实我们主要是通过IP来判断的。
因为做点击广告判断的主要就是IP地址。把这些IP纳入一个数据库加以分析。一旦发现有相同或者有关联的就
可以发警报了!然后人工查一下!人工只要深入分析观察一旦认定zuobi就立即自动封号!

然后我又问了!我说这就这样简单呀!我说我在网上不是看见很多人说你们能够分析电脑的硬件地址吗?

我朋友笑了笑说:呵呵 !我实话告诉你吧!如果只是通过WEB是更本无法知道的!这一点你如果学过网页知识
应该就知道。能够得到电脑硬件地址只要靠软件产品也就是我们的一些产品安装在用户的地址里面这样才能知道
!说白了就是在这些软件中加了个善意的木马。 我朋友说到这里我才明白了!如果不安装这些产品的话
那么GG就不可能知道你的硬件地址!呵呵。我也笑了笑!(因为我不太懂这些哈)

接着我有点好奇了!不管我有什么样的目的吧!嘿嘿!其实我也想zuobi撒!我也是人呀想钱呀!呵呵

我接着把我在网上看到的一切拿来问他!我说我看见网上很多人都在说被K的很多呀!这是什么原因呀!

我朋友也不保守什么!他对我说:这些人有很多都是由于zuobi!而且很贪心!而且他们的zuobi大多数没有
点击的来源。还有一个在广告的浏览时间上过短那么就是有问题的!通常这样的无效的浏览!这样的人我们很容易判断的!不过有一些的确是被我们冤枉了的!不过这也没有办法。毕竟我们的
人员也有限!也有出错的时候包括我们的机器软件!而且还有一个他们很多人的网站都很差质量很差!这
对于我们没有任何价值!因为我们在封一个用户的号的时候会根据他的网站质量来判断的!这对于我们和
广告主都很重要。

我接着问他那什么样的站才有质量呢? 他说:首先网站内容一定要丰富。有针对性。这样才可以和我们的广告
匹配从而获得更高的收入。那我又问那博客呢? 他说 :对于博客也是一样的。内容是个重要的因素。如果你的内容充实
关键词匹配这样的博客其实是很有价值的!我们会采取不同的对待方式的!

哦!听到这里我算是明白了一些东西了!看来做GG这个广告的确有很多学问!

我接着又问了我朋友最后一个问题吧!虽然关系不错但是老问怕他看出什么!嘿嘿!其实他看出了他也办法!

我说!你参与封号吗?他说:我们没有这个权利!只有美国人才有!封号付钱都是他们办!我们不参与!我们只是处理一些日常
事物! 哦!原来是这样!如果我朋友参与的话!嘿嘿!把我不是就发了吗?哎别做梦了!

今天收获还是有的!不过只问了几个问题还没有深入要害!不过同志们呀!我也没有办法呀!要知道在是朋友他也有他的难处呀!呵呵
不过以后如果有机会我还是可以套一下的!毕竟我是一个中国人嘛!我也想赚美圆呀!我
太晚了由于今天很心奋所以连夜写点这个东西!主要是由于很多朋友都想知道机密!呵呵所以我很有成就感!哈哈!不说了!以后还有
什么我还会写的!一句话!大家各行其事!做好自己的事情!万事大吉! 以后见

2009二月25

教大家怎么隐藏统计代码小技巧

通用方法:<div style=”display:none”>统计代码</div>

其他:
51.la和站长统计,访问都能看见统计图标 。影响网页美观,这里收藏了两个隐藏该统计代码图标的HTML代码:
使用后不影响统计效果

代码1      <span style=”display:none”>免费统计代码</span>

代码2      <div style=”display:none”>免费统计代码</div>

代码3:通杀任何统计系统
用iframe调用一个专门放统计代码的页面
比如本站把统计代码专门放在一个tongji.html文件中,然后在需要放统计代码的页面中iframe调用,设置iframe的框架大小为0,这样统计代码的图标就隐藏了
代码格式如:
<Iframe src=”http://yutaoblog.cn/tongji.html” width=”0″ height=”0″ scrolling=”no” frameborder=”0″></iframe>

推荐第三种方法,因为这个方法可以在使统计代码对网站打开速度影响降到最低.但是这个方法也有弊端就是没办法统计访问入口

2009二月23

择录:Java学习从入门到精通

Java Learning Path (一)工具篇

一、 JDK (Java Development Kit)

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html

下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。

2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。

二、 JDK Documentation

Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。

三、 应用服务器(App Server)

App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:
1、 Tomcat
Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:

Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:

http://jakarta.apache.org/tomcat/

Tomcat软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/

下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:

JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)

这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。

Tomcat提供了两个Web界面的管理工具,URL分别是:
http://localhost:8080/admin/index.jsp
http://localhost:8080/manager/html
在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:

<role rolename=”manager”/>
<role rolename=”admin”/>
<user username=”robbin” password=”12345678″ roles=”admin,manager,tomcat”/>

这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

2、 BEA Weblogic
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp…/edocs.bea.com/

3、 IBM Webshpere
Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/…WASsupport.html

4、 Jboss
Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然…n.com/idea.html

四、 Java应用的运行环境

Java的应用可以简单分为以下几个方面:
1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。

2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务

3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务

4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。

Java Learning Path(二)书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

在所有的Java书籍当中,其实最最有用的,并不是O’reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了Documentation,什么其他的书籍都不需要了。

对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O’reilly的《Java Server Pages 》这本书来学习Web 编程。

EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

Java Learning Path(三)过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习Java的第一步是安装好JDK,写一个Hello World, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;

这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O’reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That’all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。

第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

第六步,Java Web 编程
Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。

在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。

此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。

第七步,J2EE编程
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。

首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。

然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),….,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。

在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。

在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。

J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。

另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

Java Learning Path(四) 方法篇

Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。

举个例子,我们都编过Hello World

public class HelloWorld {
public static void main(String[] args) {
System.out.println(“Hello World”);
}
}

很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。

我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。

此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose,javac –verbose 以及其它很多JDK工具都有这个选项,-verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。

另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。

所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。

Java Learning Path(五)资源篇

http://java.sun.com/ (英文)
Sun的Java网站,是一个应该经常去看的地方。不用多说。

http://www-900.ibm.com/developerWorks/cn/
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!

http://www.javaworld.com/ (英文)
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。

http://dev2dev.bea.com.cn/index.jsp
BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。

http://www.theserverside.com/home/ (英文)
TheServerSide是一个著名的专门面向Java Server端应用的网站。

http://www.cnjsp.org/
JSP技术网站,有相当多的Java方面的文章和资源。

http://sourceforge.net/
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。

附:java入门与加深FAQ

一、准备篇

1 什么是Java、Java2、JDK?JDK后面的1.3、1.4.2版本号又是怎么回事?
答:Java是一种通用的,并发的,强类型的,面向对象的编程语言(摘自Java规范第二版) JDK是Sun公司分发的免费Java开发工具,正式名称为J2SDK(Java2 Software Develop Kit)。
2 什么是JRE/J2RE?
答:J2RE是Java2 Runtime Environment,即Java运行环境,有时简称JRE。如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发Java软件,请下载JDK。在JDK中附带有J2RE。
注意:由于Microsoft对Java的支持不完全,请不要使用IE自带的虚拟机来运行Applet,务必安装一个J2RE或JDK。

3 学习Java用什么工具比较好?
答:作者建议首先使用JDK+文本编辑器,这有助你理解下列几个基础概念:path,classpath,package并熟悉基本命令:javac和java。并且下载和你的JDK版本一致的API帮助。

如果你不确定类或函数的用法,请先查阅API而不是发贴求助。当你熟悉Java之后,你可以考虑换一个IDE。很多人推荐JCreator,实际上JCreator的功能还 是很弱的。作者推荐eclipse,下载网http://www.eclipse.org因eclispe是免费的.

4 学习Java有哪些好的参考书?
答:作者首先推荐Thinking in Java,中文名《Java编程思想》,有中文版。该书第一章介绍了很多面向对象的编程思想,作为新手应当认真阅读。除此以外,O´relly出版社和Wrox出版社的书也不错。作者本人不喜欢大陆作者的书。也许你觉得英文太难,但是网上大多数资料都是英文的。另外,你需要经常查阅API,而那也是英文的。

5 Java和C++哪个更好?
答:这个问题是一个很不恰当的问题。你应该问:Java和C++哪个更适用于我的项目?如果你不需要跨平台,不需要分布式,要强调程序的运行速度,C++更为适用。反之?你应当考虑Java。

6 什么是J2SE/J2EE/J2ME?
答:J2SE就是一般的Java。
J2ME是针对嵌入式设备的,比如Java手机,它有自己的SDK。而J2EE使用J2SE的SDK。
J2EE规范更多的是对J2EE服务器的要求和开发人员的约束。详情见后继”J2EE FAQ”。

二、命令篇

7 我写了第一个Java程序,应该如何编译/运行?
答:首先请将程序保存为xxx.java文件,然后在dos窗口下使用javac xxx.java命令,你会发现该目录下多了一个xxx.class文件,再使用java xxx命令,你的java程序就开始运行了。

8 我照你说的做了,但是出现什么”´javac´ 不是内部或外部命令,也不是可运行的程序或批处理文件。”。
答:你遇到了path问题。操作系统在一定的范围(path)内搜索javac.exe,但是没能找到。请编辑你的操作系统环境变量,新增一个JAVA_HOME变量,设为你JDK的安装目录,再编辑Path变量,加上一项 %JAVA_HOME%\bin。然后关掉并新开一个dos窗口,你就可以使用javac和java命令了。

9 环境变量怎么设置?
答:请向身边会设的人咨询。

10 javac xxx.java顺利通过了,但是java xxx的时候显示什么“NoClassDefFoundError”。
答:你遇到了classpath问题。java命令在一定的范围(classpath)内搜索你要用的class文件,但是未能找到。首先请确认你没有错敲成java xxx.class,其实你并不需要设置该变量,但如果你设置了该变量又没有包含.(代表当前目录)的项,你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一项. 或干脆删掉这个变量。如果你使用了并非JDK自带的标准包,比如javax.servlet.*包,也会遇到这个问题,请将相应的jar文件加入classpath。如果你在java源文件中定义了package,请参见15。

11 我在java xxx的时候显示”Exception in thread “main” java.lang.NoSuchMethodError: main”。
答:首先,在你的程序中每个java文件有且只能有一个public类,这个类的类名必须和文件名的大小写完全一样。其次,在你要运行的类中有且只能有一个public static void main(String[] args)方法,这个方法就是你的主程序。

12 package是什么意思?怎么用?
答:为了唯一标识每个类并分组,java使用了package的概念。每个类都有一个全名,例如String的全名是java.lang.String,其中java.lang是包名,String是短名。这样,如果你也定义了String,你可以把它放在mypackage中,通过使用全名mypackage.String和java.lang.String来区分这两个类。同时,将逻辑上相关的类放在同一个包中,可以使程序结构更为清楚。

你要做的就是在java文件开头加一行”package mypackage;”。注意包没有嵌套或包含关系,A包和A.B包对java命令来说是并列的两个包。
13 我没有声明任何package会怎么样?
答:你的类被认为放在默认包中。这时全名和短名是一致的。

14 在一个类中怎么使用其他类?
答:如果你使用java.lang包中的类,不用做任何事。如果你使用其他包中的类,使用import package1.class1; 或 import package2.*;这里.*表示引入这个包中的所有类。然后在程序中你可以使用其他类的短名。如果短名有冲突,使用全名来区分。

15 我用了package的时候显示”NoClassDefFoundError”,但是我把所有package去掉的时候能正常运行。
答:将你的java文件按包名存放。
比如你的工作目录是/work,你的类是package1.class1,那么将它存放为/work/package1/class1.java。如果没有声明包,那么直接放在/work下。在/work下执行javac package1/class1.java,再执行java package1.class1,你会发现一切正常。另外,你可以考虑开始使用IDE。

16 我想把java编译成exe文件,该怎么做?
答:JDK只能将java源文件编译为class文件。class文件是一种跨平台的字节码,必须依赖平台相关的JRE来运行。Java以此来实现跨平台,有些开发工具可以将java文件编译为exe文件。作者反对这种做法,因为这样就取消了跨平台性。如果你确信你的软件只在Windows平台上运行,你可以考虑使用C++/C#来编程。

17 我在编译的时候遇到什么”deprecated API”,是什么意思?
答:所谓deprecated是指已经?时,但是为了向前兼容起见仍然保留的方法,这些方法可能会在以后取消支持。你应当改用较新的方法。一般在API里面会说明你应当用什么方法来代替之。

三、I/O篇

18 我怎么给java程序加启动参数,就像dir /p/w那样?
答:还记得public static void main(String[] args)吗?这里的args就是你的启动参数。
在运行时你输入java package1.class1 -arg1 -arg2,args中就会有两个String,一个是arg1,另一个是arg2。

19 我怎么从键盘输入一个int/double/字符串?
答:java的I/O操作比C++要复杂一点。如果要从键盘输入,样例代码如下:

BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) )
;
String s = cin.readLine();

这样你就获得了一个字符串,如果你需要数字的话再加上:

int n = Integer.parseInt( s );

或者

double d = Double.parseDouble( s );

20 我怎么输出一个int/double/字符串?
答:在程序开始写:

PrintWriter cout = new PrintWriter( System.out );

需要时写:

cout.print(n);

或者

cout.println(“hello”)

等等。

21 我发现有些书上直接用System.in和System.out输入输出,比你要简单得多。
答:java使用unicode,是双字节。而System.in和System.out是单字节的stream。如果你要输入输出双字节文字比如中文,请使用作者的做法。
22 我怎么从文件输入一个int/double/字符串?
答:类似于从键盘输入,只不过换成

BufferedReader fin = new BufferedReader( new FileReader(” myFileName ” ) );
PrintWriter fout = new PrintWriter( new FileWriter(” myFileName ” ) );

另外如果你还没下载API,请开始下载并阅读java.io包中的内容。

23 我想读写文件的指定位置,该怎么办?
答:你肯定没有认真看API。java.io.RandomAccessFile可以满足你的需要。

24 怎么判断要读的文件已经到了尽头?
答:你肯定没有认真看API。在Reaer的read方法中明确说明返回-1表示流的结尾。

四、 关键字篇

25 java里面怎么定义宏?
答:java不支持宏,因为宏代换不能保证类型安全。如果你需要定义常量,可以将它定义为某个类的static final成员。参见26和30。

26 java里面没法用const。
答:你可以用final关键字。例如 final int m = 9。被声明为final的变量不能被再次赋值。也可以用于声明方法或类,被声明为final的方法或类不能被继承。注意const是java的保留字以备扩充。

27 java里面也不能用goto。
答:甚至在面向过程的语言中你也可以完全不用goto。请检查你的程序流程是否合理。如果你需要从多层循环中迅速跳出,java增强了(和C++相比)break和continue的功能。
例如:

outer :
while( … )
{
inner :
for( … )
{
… break inner; …
… continue outer; …
}
}

和const一样,goto也是java的保留字以备扩充。

28 java里面能不能重载操作符?
答:不能。String的+号是唯一一个内置的重载操作符。你可以通过定义接口和方法来实现类似功能。

29 我new了一个对象,但是没法delete掉它。
答:java有自动内存回收机制,即所谓Garbarge Collector。你再也不用担心指针错误。

30 我想知道为什么main方法必须被声明为public static?
答:声明为public是为了这个方法可以被外部调用,详情见面向对象篇37。
static是为了将某个成员变量/方法关联到类(class)而非实例(instance)。你不需要创建一个对象就可以直接使用这个类的static成员,在A类中调用B类的static成员可以使用B.staticMember的写法。注意一个类的static成员变量是唯一的,被所有该类对象所共享的。

31 throw和throws有什么不同?
答:throws用于声明一个方法会抛出哪些异常。而throw是在方法体中实际执行抛出异常的动作。如果你在方法中throw一个异常,却没有在方法声明中声明之,编译器会报错。注意Error和RuntimeException的子类是例外,无需特别声明。

32 什么是异常?
答:异常最早在Ada语言中引入,用于在程序中动态处理错误并恢复。你可以在方法中拦截底层异常并处理之,也可以抛给更高层的模块去处理。你也可以抛出自己的异常指示发生了某些不正常情况。常见的拦截处理代码如下:

try
{
…… //以下是可能发生异常的代码
…… //异常被抛出,执行流程中断并转向拦截代码。
……
}

catch(Exception1 e) //如果Exception1是Exception2的子类并要做特别处理,应排在前面
{
//发生Exception1时被该段拦截
}
catch(Exception2 e)
{
//发生Exception2时被该段拦截
}
finally //这是可选的
{
//无论异常是否发生,均执行此段代码
}

33 final和finally有什么不同?
答:final请见26。finally用于异常机制,参见32。

五、 面向对象篇

34 extends和implements有什么不同?
答:extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)。interface的引入是为了部分地提供多继承的功能。
在interface中只需声明方法头,而将方法体留给实现的class来做。这些实现的class的实例完全可以当作interface的实例来对待。有趣的是在interface之间也可以声明为extends(单继承)的关系。

35 java怎么实现多继承?
答:java不支持显式的多继承。因为在显式多继承的语言例如c++中,会出现子类被迫声明祖先虚基类构造函数的问题,而这是违反面向对象的封装性原则的。java提供了interface和implements关键字来部分地实现多继承。参见34。

36 abstract是什么?
答:被声明为abstract的方法无需给出方法体,留给子类来实现。而如果一个类中有abstract方法,那么这个类也必须声明为abstract。被声明为abstract的类无法实例化,尽管它可以定义构造方法供子类使用。

37 public,protected,private有什么不同?
答:这些关键字用于声明类和成员的可见性。
public成员可以被任何类访问,
protected成员限于自己和子类访问,
private成员限于自己访问。
Java还提供了第四种的默认可见性,一般称为package private,当没有任何public,protected,private修饰符时,成员是同一包内可见。类可以用public或默认来修饰。

38 Override和Overload有什么不同?
答:Override是指父类和子类之间方法的继承关系,这些方法有着相同的名称和参数类型。Overload是指同一个类中不同方法(可以在子类也可以在父类中定义)间的关系,这些方法有着相同的名称和不同的参数类型。

39 我继承了一个方法,但现在我想调用在父类中定义的方法。
答:用super.xxx()可以在子类中调用父类方法。

40 我想在子类的构造方法中调用父类的构造方法,该怎么办?
答:在子类构造方法的第一行调用super(…)即可。

41 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。
答:在构造方法第一行调用this(…)。

42 我没有定义构造方法会怎么样?
答:自动获得一个无参数的构造方法。

43 我调用无参数的构造方法失败了。
答:如果你至少定义了一个构造方法,就不再有自动提供的无参数的构造方法了。你需要显式定义一个无参数的构造方法。

44 我该怎么定义类似于C++中的析构方法(destructor)?
答:提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方法。注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要提供该方法。

45 我想将一个父类对象转换成一个子类对象该怎么做?
答:强制类型转换。如

public void meth(A a)
{
B b = (B)a;
}

如果a实际上并不是B的实例,会抛出ClassCastException。所以请确保a确实是B的实例。

46 其实我不确定a是不是B的实例,能不能分情况处理?
答:可以使用instanceof操作符。例如

if( a instanceof B )
{
B b = (B)a;
}
else
{

}

47 我在方法里修改了一个对象的值,但是退出方法后我发现这个对象的值没变!
答:很可能你把传入参数重赋了一个新对象,例如下列代码就会造成这种错误:

public void fun1(A a) //a是局部参数,指向了一个外在对象。
{
a = new A(); //a指向了一个新对象,和外在对象脱钩了。如果你要让a作为传出变量,不要写这一句。
a.setAttr(attr);//修改了新对象的值,外在对象没有被修改。
}

基本类型也会出现这种情况。例如:

public void fun2(int a)
{
a = 10;//只作用于本方法,外面的变量不会变化。
}

六、java.util篇

48 java能动态分配数组吗?
答:可以。例如int n = 3; Language[] myLanguages = new Language[n];

49 我怎么知道数组的长度?
答:用length属性。如上例中的 myLanguages.length 就为 3。

50 我还想让数组的长度能自动改变,能够增加/删除元素。
答:用顺序表–java.util.List接口。你可以选择用ArrayList或是LinkedList,前者是数组实现,后者是链表实现。例如:

List list = new ArrayList();

或是

List list = new LinkedList();

51 什么是链表?为什么要有两种实现?
答:请补习数据结构。

52 我想用队列/栈。
答:用java.util.LinkedList。

53 我希望不要有重复的元素。
答:用集合–java.util.Set接口。例如:Set set = new HashSet()。

54 我想遍历集合/Map。
答:用java.util.Iterator。参见API。

55 我还要能够排序。
答:用java.util.TreeSet。例如:Set set = new TreeSet()。放进去的元素会自动排序。你需要为元素实现Comparable接口,还可能需要提供equals()方法,compareTo()方法,hashCode()方法。

56 但是我想给数组排序。
答:java.util.Arrays类包含了sort等实用方法。

57 我想按不同方法排序。
答:为每种方法定义一个实现了接口Comparator的类并和Arrays综合运用。

58 Map有什么用?
答:存储key-value的关键字-值对,你可以通过关键字来快速存取相应的值。

59 set方法没问题,但是get方法返回的是Object。
答:强制类型转换成你需要的类型。参见45。

60 我要获得一个随机数。
答:使用java.util.Random类。

61 我比较两个String总是false,但是它们明明都是”abc” !
答:比较String一定要使用equals或equalsIgnoreCase方法,不要使用 == !
==比较的是两个引用(变量)是否指向了同一个对象,而不是比较其内容。

62 我想修改一个String但是在String类中没找到编辑方法。
答:使用StringBuffer类。

String str = “…….”; //待处理的字符串
StringBuffer buffer = new StringBuffer(str); //使用该字符串初始化一个
StringBuf
fer
buffer.append(“…”); //调用StringBuffer的相关API来编辑字符串
String str2 = buffer.toString(); //获得编辑后的字符串

另外,如果你需要将多个字符串连接起来,请尽量避免使用+号直接连接,而是使用StringBuffer.append()方法。

63 我想处理日期/时间。
答:使用java.util.Date类。你可以使用java.text.SimpleDateFormat类来在String和Date间互相转换。

SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); //规定日期格式
Date date = formatter.parse(“2003-07-26 18:30:35″); //将符合格式的String转换为Date
String s = formatter.format(date); //将Date转换为符合格式的String

关于定义日期格式的详细信息请参见API。

2009二月23

择录:jsp入门学习教程

一、 什么是JSP

JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种 动态网页技术标准,其网址为http://www.javasoft.com/products/jsp。 在传统的网页HTML文件(*htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。 本文将介绍利用JSP技术开发动态网页的方法,还将简要分析JSP技术和 Microsoft 公司的 ASP 技术的不同之处。

二、 如何安装和启动

为了实验JSP技术,首先需要建立运行环境,这个过程相当简单:

1、在 http://java.sun.com/jdk/处下载JDK(Java 2 SDK、Standard Edition、v 1.2.2)。

2、在http://java.sun.com/products/jsp/处下载JSWDK(JavaServer Web Development Kit 1.0.1)。Linux用户可以在ttp://jakarta.apache.org/处下载Tomcat 3.0。

3、安装 以Windows NT环境为例,JDK的安装是首先运行下载得到的jdk1_2_2-win.exe,然后修改系统环境参数,在PATH参数中加入[x:]\jdk1.2.2\bin以及增加新的环境参数 CLASSPATH=[x:]\jdk1.2.2\lib\tools.jar,其中[x:]是安装JDK的硬盘符(c:、d: 等)。 JSWDK的安装仅需将jswdk1_0_1-win.zip带目录释放到硬盘根目录下(c:\、d:\ 等),然后就可以在硬盘上找到\jswdk-1.0.1\目录。将来如果不想保留JSWDK,删除这个目录就可以了,没有任何系统文件和注册表遗留问题。更详细的安装过程以及Solaris/Unix和Linux下JDK、Tomcat的安装可以参考下载得到的文件包中的安装说明。

4、启动 以Windows NT环境为例,在\jswdk-1.0.1\目录下执行startserver.bat,就可启动JSWDK中一个支持JSP网页技术的Web服务器。为了不与现有的Web服务器(例如IIS、PWS等)冲突,JSWDK的Web服务器使用了8080端口。 在浏览器的地址栏中键入http://localhost:8080或者http://127.0.0.1:8080后,如果能看到 JSWDK 的欢迎页就说明JSP实验环境已经建成,可进入下一步实验。 要关闭Web服务器则运行stopserver.bat。

三、 JSP简单示例

JSWDK中包含的Web服务器的文档目录在缺省状态下为\jswdk-1.0.1\webpages,主文档在缺省状态下为index.html和index.jsp。也就是说访问http://localhost:8080等于访问\jswdk-1.0.1\webpages\index.html。 用文本编辑器,如Windows中的记事本(Notepad),创建一个文本文件hi.jsp,保存在\jswdk-1.0.1\webpages\目录下,其内容如下:

<html>
<head>
<title>Hi-JSP实验</title>
</head>
<body>
<%
String Msg = "This JSP test.";
out.print("Hello World!");
%>
<h2><%=Msg%></h2>
</body>
</html>

在浏览器的地址栏中键入http://localhost:8080/hi.jsp,JSWDK中的Web服务器会执行JSP 文件中用<%以及%>括起来的Java程序语句,其中out.print是将文字输出到网页,语句<%= 变量 | 表达式 %>的作用是将Java Scriptlet中变量或表达式的值输出到网页,执行结果如图1。 图1 将变量Msg赋值为中文字符串,用<%= %>输出,或者用out.print输出中文字符串,则在英文版NT4及Redhat 6.1下实验运行结果正常,而在中文NT 4.0和中文98下,则反而会出现乱码。

四、 统一的网站界面

JSP支持服务器端的文件包含,即可以在一个JSP文件中插入多个其他文件,用来实现统一的网站界面。修改上述hi.jsp并另存为mypage.jsp:

<%@ include file="top.htm" %>
<%
String Msg = "This JSP test.";
out.print("Hello World!");
%>
<h2><%=Msg%></h2>
<%@ include file="bot.htm" %>

用可视化HTML编辑器,例如FrontPage、Dreamweave等设计网站的框架结构,将设计好的框架结构文件分割成两个部分,上面一半保存为top.htm, 下面一半保存为bot.htm,代码如下面所示:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>我的主页</title>
</head>
<body>
<table border="0" width="100%" cellpadding="4" cellspacing="0" align="center">
<tr>
<td width="100%" colspan="2" bgcolor="#837ED1" align="center"><font face="隶书"
color="#FFFF00" size=5>主页标题</font>
</td>
</tr>
<tr>
<td bgcolor="#837ED1" width="15%" valign="top" align="center"><br>
<font color="#FFFFFF">选项</font><p><font color="#FFFFFF">选项</font></p>
<p><font color="#FFFFFF">选项</font></p>
<p><font color="#FFFFFF">......</font></p>
<p></p>
</td>
<td width="85%" valign="top">
----------------------------------------------------------------------------------------------------------------
</td>
</tr>
</table>
</body>
</html>

在浏览器的地址栏中键入http://localhost:8080/mypage.jsp,得到结果如图2。 图2 这样网站的界面就能统一起来,而设计者可以集中精力在功能模块上处理用户登录、连接数据库、发送email等等。每个

JSP文件都有如下结构:

<%@ include file="top.htm" %>
<%
// 实现某些功能
%>
<%@ include file="bot.htm" %>

维护网站的界面也相对比较容易,只要修改top.htm和bot.htm,就能影响到所有网页。

五、 服务器参数设置

JSWDK的Web服务器参数保存在\jswdk-1.0.1\webserver.xml中,用Windows写字板打开并编辑这个文件就可以修改缺省设置值。本节内容主要针对JSWDK,Linux下Tomcat的设置方法略有不同。 JSWDK缺省的文档目录是\jswdk-1.0.1\webpages,在此目录下可以建立子目录,例如\jswdk-1.0.1\webpages\test,就能在浏览器中用http://localhost/test访问这个目录,为了使得这个子目录能执行JSP程序,还必须在webserver.xml中的<Service></Service>节加入:
<WebApplication id=”test” mapping=”/test” docBase=”webpages/test” />
并且,还必须建立\jswdk-1.0.1\webpages\test\WEB-INF目录,并从\jswdk-1.0.1\webpages\WEB-INF目录中复制过来以下四个文件:mappings.properties、mime.properties、servlets.properties以及webapp.properties。完成这些过程,才能通知JSWDK的Web服务器执行http://localhost/test 中的JSP程序。

六、 JavaBean

JSP网页吸引人的地方之一就是能结合JavaBean技术来扩充网页中程序的功能。 JavaBean是一种Java类 (class),通过封装属性和方法成为具有某种功能或者处理某个业务的对象。JavaBean被组织成为package(数据包)以便进行管理,实际上就是把一组JavaBean一起放在某某目录中,每个类的定义前加上package某某,本例中为test。目录test必须放在系统环境CLASSPATH包含的目录下,系统才能找到其中的JavaBean。JSWDK在缺省状态下将\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\ 加入CLASSPATH。建立自己的JavaBean和package时,就放在这个目录中也不失为一种简易的方法。 下面介绍一个简单的JavaBean框架。用文本编辑器创建一个文本文件helloWorld.java,并保存在\jswd

k-1.0.1\webpages\WEB-INF\jsp\beans\test目录下,其内容如下:

package test;
public class helloWorld {
public String name = "My first bean";
public String getHi()
{
return "Hello from " + name;
}
}

helloWorld.java编辑好后,在DOS状态下,进入目录\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\,用JDK的javac命令编译helloWorld.java如下:

javac helloWorld.java

注意,Java是区分大小写的,在程序中,编译命令行中字母的大小写都不能写错。 编译成功就表示建立了一个JavaBean。下面看如何在JSP中使用这个JavaBean。用文本编辑器创建一个文本文件hi-bean.jsp,并保存在\jswdk-1.0.1\webpages\test目录下,其内容如下:

<html>
<head>
<title>JavaBean 试验</title>
</head>
<body>
<jsp:useBean id="helloBean" scope="session" class="test.helloWorld" />
<%= helloBean.getHi() %>
<hr>
<%
helloBean.name = "JSP";
out.print(helloBean.getHi());
%>
</body>
</html>

在JSP网页中,使用 <jsp:useBean … />语法来创建JavaBean对象,并命名为helloBean。读者可从这个简单的例子中看出设置、获取JavaBean属性,以及调用JavaBean方法的做法。在浏览器的地址栏中键入http://localhost:8080/test/hi-bean.jsp,得到结果如图3所示。 注意,如果修改和重新编译了JavaBean程序,则需要关闭和重新启动JSWDK的Web服务器以后修改的结果才会有效。如果仅仅修改JSP文件,则不用重新启动JSWDK的Web服务器. 虽然,这仅仅完成了一个非常简单的JavaBean框架,但是遵循这个框架可以设计出多种多样的JavaBean。例如,从JSP中访问数据通常就是通过JavaBean来实现的。

七、 数据库连接

数据库连接对动态网站来说是最为重要的部分,Java中连接数据库的技术是JDBC(Java Database Connectivity)。很多数据库系统带有JDBC驱动程序,Java程序就通过JDBC驱动程序与数据库相连,执行查询、提取数据等等操作。Sun公司还开发了JDBC-ODBC bridge,用此技术Java程序就可以访问带有ODBC驱动程序的数据库,目前大多数数据库系统都带有ODBC驱动程序,所以Java程序能访问诸如Oracle、Sybase、MS SQL Server和MS Access等数据库。下面介绍如何用Access实现一个动态FAQ(常见问题及答案)网站。

首先建立一个Access数据库faq.mdb,其中的表faqs有字段id(自动增量型,并设为主关键字)、subject(文字型,长度200)、answers(备注型)。这个表中可以存放一些编程知识的常见问题及答案,

如图4。

图 4

然后,在Control Panel(控制面板)的ODBC Datasource模块中加入System DSN,取名faq,并指向faq.mdb。

创建一个JavaBean,名为faq.java,并保存在\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\test目录下。faq.java 的内容如下:

package test;
import java.sql.*;
public class faq {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:faq";
Connection conn = null;
ResultSet rs = null;
public faq() {
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println("faq(): " + e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
rs = null;
try {
conn = DriverManager.getConnection(sConnStr);
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("aq.executeQuery: " + ex.getMessage());
}
return rs;
}
}

用上一节介绍的方法编译faq.java以后,在\jswdk-1.0.1\webpages\test目录下创建JSP文件faq.jsp,其内容如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>我的FAQ !</title>
</head>
<body>
<p><b>这是我的FAQ!</b></p>
<%@ page language="java" import="java.sql.*" %>
<jsp:useBean id="workM" scope="page" class="test.faq" />
<%
ResultSet RS = workM.executeQuery("SELECT * FROM faqs");
String tt;
while (RS.next()) {
tt = RS.getString("Answer");
out.print("<LI>" + RS.getString("Subject") + "</LI>");
out.print("<pre>" + tt + "</pre>");
}
RS.close();
%>

在浏览器的地址栏中键入http://localhost:8080/test/faq.jsp,faq.jsp调用JavaBean,从数据库中读出内容并输出,得到结果如图5所示. 限于篇幅,本文不能列举JSP-JavaBean-JDBC/ODBC-数据库的复杂例子,读者可以从本文最后所推荐的网址中找到并下载到数据库连接范例。

八、 技术分析

Microsoft 公司的 ASP 技术也是动态网页开发技术。JSP和ASP从形式上非常相似,ASP程序员一眼就能认出<% %>以及<%= %>。但是深入探究下去会发现它们很多的差别,其中最主要的有以下三点:

1、 JSP的效率和安全性更高

ASP以源码形式存放,以解释方式运行,每次ASP网页调用都需要对源码进行解释,运行效率不高。另外,IIS的漏洞曾使得许多网站源程序大曝光,包括笔者以前用ASP开发的网站,ASP程序全部被人下载了去。 JSP在执行以前先被编译成字节码 (bytecode),字节码由Java虚拟机(Java Virtual Machine)解释执行,比源码解释的效率高;服务器上还有字节码的Cache机制,能提高字节码的访问效率。第一次调用JSP网页可能稍慢,因为它被编译成Cache,以后就快得多了。同时,JSP源程序不大可能被下载,特别是

JavaBean程序完全可以放到不对外的目录中。

2、 JSP的组件 (Component) 方式更方便 ASP通过COM来扩充复杂的功能,如文件上载、发送email以及将业务处理或者复杂计算分离出来成为独立可重复利用的模块。JSP通过JavaBean实现了同样的功能扩充。 在开发方面,COM的开发远比JavaBean复杂和繁琐,学会ASP不难,但学会开发COM可不简单。而JavaBean就简单多了,从本文上述示例中可以看出开发JavaBean很方便。 在维护方面,COM必须在服务器上注册,如果修改了COM程序,就必须重新注册,甚至必须关机和重新启动。JavaBean则不需要注册,放在CLASSPATH包含的目录中就行了。如果JavaBean进行了修改,则JSWDK和Tomcat现在还需要关闭和重新运行(但不是关机),但开发者已经许诺将在以后的版本中做到不需要关闭服务器。 另外JavaBean是完全的OOP,可以针对不同的业务处理功能方便地建立一整套可重复利用的对象库,例如用户权限控制、email自动回复等等。

3、 JSP的适应平台更广

ASP目前仅适用于NT和IIS。虽然Unix下有ChiliSoft的插件来支持ASP,但是ASP本身的功能有限,必须通过ASP+COM的组合来扩充,Unix下的COM实现起来非常困难。 JSP则不同,几乎所有平台都支持Java,JSP+JavaBean可以在所有平台下通行无阻。NT下IIS通过一个插件,例如JRUN(http://www3.allaire.com/products/jrun/)或者ServletExec(http://www.newatlanta.

com/),就能支持JSP。著名的Web服务器Apache已经能够支持JSP。由于Apache广泛应用在NT、Unix和Linux上,因此JSP有更广泛的运行平台。虽然现在NT操作系统占了很大的市场份额,但是在服务器方面Unix的优势仍然很大,而新崛起的Linux更是来势不小。 从一个平台移植到另外一个平台,JSP和JavaBean甚至不用重新编译,因为Java字节码都是标准的与平台无关的。笔者将在NT下实验的JSP网页原封不动地拿到Linux下就运行起来了,感觉非常满意。

九、 结论

综上所述,JSP可谓是构建动态网站的一个利器,故推荐给读者,祝愿你们掌握JSP,开发出优秀的网站。ASP程序员也请试一下,JSP里也有session、request、response/out等对象,亲自试试看如何。

附文

这里是关于JSP的重要参考资料,有兴趣的读者可以进一步阅读。

http://java.sun.com/products/jsp/faq.html

http://www.esperanto.org.nz/jsp/jspfaq.html

http://www.zdnet.com/pcweek/stories/news/0,4153,410709,00.html

http://developer.netscape.com/viewsource/kuslich_jsp

/kuslich_jsp.html

http://web2.java.sun.com/products/jsp/jsp-asp.html

http://www.asptoday.com/articles/19991022.htm

欢迎光临www.dukejava.com!

JavaServer Pages (JSP)是基于Java的技术,用于创建可支持跨平台及跨Web服务器的动态网页。 JSP可与微软的Active Server Pages (ASP)相媲美,但JSP使用的是类似于HTML的标记和Java 代码片段而不是用VBScript。当你使用不提供ASP本地支持的Web服务器(例如 Apache或Netscape服务器)时,你就可以考虑使用JSP了。你虽然也可以为这些服务器弄一个ASP附加软件模块,但是太昂贵了。现在Sun公司并不会因你使用JSP向你收费(虽然将来可能要收),况且用于Solaris、 Linux以及Windows系统的组件都很容易获得。 不要把JSP与服务器端的JavaScript语言搞混了。Web服务器自动将通过JSP生成的Java代码片段转换成Java 片段(servlets)。 JSP也可自动控制许多功能,如过去用Perl脚本编写功能程序或像ASP这样的服务器专用API(应用编程接口).我们马上就要开始帮助你建立一个使用JSP 技术的网站范例了。

准备好计算机以使用JSP 你需要Java2软件开发工具箱(J2SDK),过去称之为Java开发工具箱(JDK)、JavaServer 网络开发工具箱(JSWDK)、Tomcat,或者其它能支持JSP的Web服务器。升阳公司为Windows、Solaris以及 Linux平台提供免费的J2SDK和JSWDK。 如果你想在现有的Web服务器上使用JSP,而此服务器本身不支持JSP和Java 代码片段,可以试用Allaire公司的Jrun。它可以为Netscape的Enterprise Server和Fasttrack Server、微软的Internet Information Server(IIS)和Personal WebServer(PWS)、Apache以及其他服务器充当Web服务器附件。你也可以使用Apache服务器的Java版,其中包含最新的JSWDK。 下载并安装所需的软件 目前,版本号为1.2.2-001的J2SDK可下载版以可安装的归档文件形式出现。这个大约20MB的下载量软件可提供一个彻底的Java开发环境,让你创造任何基于Java并且利用了而标准核心API的解决方案。其实,你的Web服务器使用JSP的唯一条件是要有Java编辑器。要让Web服务器知道编辑器的位置,需要JAVA_HOME 环境变量设置为J2SDK安装目录。如果你已经在Windows系统中进行了安装并且接受了默认目录, 请将“set JAVA_HOME=C:\1.2.2”添加到你的“autoexec.bat”文件中,然后重新启动。 安装J2SDK后,下载并安装JSWDK或者是Tomcat β版,即基于Java的Apache Web服务器的β版。你把JSWDK放在什么地方是无关紧要的,只要你以后能找到它就行。通常,将其放在顶层目录中,这样你在替换JSWDK或JSDK时无需删除另一个软件。安装好这个文件后,准备工作已经就绪,你可以开始JSP开发工作了。 正确地安装JSWDK后,请运行“startserver”脚本程序,以启动Web服务器,使其按照默认情况监听8080端口。你要在启动服务器之后查看您是否已正确地安装了此工具,请加载一个JSP样本文件(http://locahost:8080/examples/jsp/)。如果你能成功地运行这些样本文件,说明你已经正确地安装了这个软件。如果你在用来启动服务器的控制台窗口中看到报错信息,你就需要做些修改。最经常发生的问题是没有设置或不正确地设置了JAVA_HOME环境变量。要看到当前环境变量设置情况,要请在DOS提示符下键入“set”设置。 开始 在解释 JSP语法前,创建一个快捷网页,显示目当前的日期和时间,并然后将之其保存为sample.jsp:

<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is:
<%= new java.util.Date() %>
</H3>
</body>
</html>.

把这个文件以及你所有的HTML 和 JSP 页面放在JSWDK安装目录下的网页目录里。你可以从http://localhost:8080/sample.jsp加载此网页。该网页首次被访问时,Web服务器会把JSP编译成Java代码片段,这样你就能够看到当前的日期和时间了。 你已经下载、安装并配置好了开发环境,你可以开始学习JSP语法并创建自己的基于JSP的解决方案了。

JSP基本语法

讲完安装问题后,现在进入来讨论JSP语法。一个投机取巧的办法是下载语法卡片。如果你不熟悉Java编程,也许你想看一下Sun的指南 。然而网页创建者并不需要进行太多的Java开发。除了一些方法调用,在你的JSP网页里应尽可能少用Java代码。 记住以上提示,我们首先来看一看JSP指令和脚本元素,之后我们会解释JavaBeans和隐含对象。共有五种JSP指令和脚本元素。在JSP 1.0版中,大部分JSP被一个以“<%” 开头和以“%>”结尾的的标记括在其中。在更新的JSP 1.1规范出台后,就有了与XML兼容的版本。 JSP指令和脚本元素

Directives <%@ directive %>
Declarations <%! declaration %>
Expressions <%= expression %>
Code Fragment/Scriptlet <% code fragment %>
Comments <%-- comment --%>

指令

JSP指令是为JSP引擎而设计的。他们并不直接产生任何可见输出,而只是告诉引擎如何处理其余JSP页面。这些指令始终被括在 “<%@ ?%>”标记中。两个最重要的指令是“pagePage”和“Include”。“Taglib”指令不在讨论之列,但是在用JSP1.1创建自定义标记可以使用它。 几乎在所有JSP页面顶部都会看到“Page”指令。尽管不是必须的,但它可以让你指定: 到何处查找起支持作用的Java类别:

<%@ page import="java.util.Date" %>,

出现Java运行问题时,将网上冲浪者引向何处:

<%@ page errorPage="errorPage.jsp" %>,

还有你是否需要管理用户的会话级信息,这些信息可能来自多个网页(在下面的JavaBeans一节将对此做进一步讲)述:

<%@ page session="true" %>.

“Include”指令可以把你的内容分成更多可管理的元素,比如包括一个普通页面页眉或页脚的元素。包含的网页可以是一个固定的HTML 页面或更多的JSP内容:

<%@ include file="filename.jsp" %>

声明

JSP声明用来让你定义页面级变量,以保存信息或定义JSP页面的其余部分可能需要的支持方法。如果你发现代码太多,通常最好把它们写成一个独立的Java类别。声明一般都在“<%! ?%>”标记中。一定要以分号(;)结束变量声明,因为任何内容都必须是有效的Java语句:

<%! int i=0; %>。

表达式

有了JSP表达式,表达式评估结果会被转换成一个字符串,并且被直接包括在输出页面之内。JSP 表达式包含在“<%= ?%>” 标记中,没有分号,除非在加引号的字符串部分使用分号。

<%= i %>
<%= "Hello" %> .

代码片段/脚本片段

代码片段/脚本片段(Scriptlets) JSP代码片段或脚本片段是嵌在“<% ?%>”标记中的。这种Java代码在Web服务器响应请求时就会运行。在脚本片段周围可能是原始的HTML或XML语句,在这些地方,代码片段可以使你创建条件执行代码,或要用到另外一段代码的代码。例如,以下的代码组合使用表达式和代码片段,显示H1、H2、H3和H4标记中的字符串“Hello”。代码片段并不局限于一行源代码:

<% for (int i=1; i<=4; i++) { %>
<H<%=i%>>Hello</H<%=i%>>
<% } %>.

注释

最后一个主要的JSP元素是嵌入式注释。尽管你始终可以在文件中加入HTML注释,但用户在查看页面源代码时会看到这些注释。如果你不想让用户看到它,你就应该将其嵌入“<%– ?–%>” 标记中: <%-- comment for server side only --%>. 带JavaBean 的JSP 虽然你可以把大段的代码放在脚本片段(scriptlet)内,但是绝大多数的Java代码属于可重复使用的名为JavaBea的组件。JavaBean类似于ActiveX控件:他们都能提供常用功能并且可以重复使用。 JavaBean的值是通过一些属性获得的,你可通过这些属性访问JavaBean设置。以一个人来打比方,这个人就是一个JavaBean,这个人的名字、身份证号码以及住址就是其属性。在JSP网站,你基本上就是通过玩“Connect the beans)”来使你的网站动态化。 假设JavaBean先于网站被创建出来,你需要做的第一件事就是告诉JSP页面它将要用到一个“Bean”。你可以用“<jsp:useBean>”标记来做到这一点:

<jsp:useBean id="localName" class="com.jguru.Person" scope="application" />。 “<jsp:useBean>”标记要求你用“id”属性来识鉴别Bean。这里你提供一个名字来JSP页面其余部分的Bean。除了“id”属性,你还须告诉网页面从何处查找Bean,或者它的Java类别名是什么。这种类别属性提供确认Bean的功能,其他一些方法也可以做到这一点。最后一个必需的元素是“scope”属性。有了“scope”属性的帮助,你就能告诉Bean为单一页面(默认情况)[scope="page"]、为[scope="request"]请求为会话[scope="session"],或者为整个应用程序[scope="application"]保持留信息。有了会话范围,你就能非常容易地在JSP网页面上维护购物车等项目。 一旦你声名了一个JavaBean,你就可以访问它的属性来定制它。要获得属性值,请用“<jsp:getProperty>”标记。有了这个标记,你就能指定将要用到的Bean名称(从useBean的”id”字段得到)以及你想得到其值的属性。实际的值被放在输出中:

<jsp:getProperty id="localName" property="name" />。

要改变JavaBean属性,你必须使用“<jsp:setProperty>”标记。对这个标记,你需要再次识别Bean和属性,以修改并额外提供新值。如果命名正确,这些值可以从一个已提交的表中直接获得:参数获得:

<jsp:setProperty id="localName" property="*" />;

可以从一个参数获得,但你必须直接命名属性和参数:

<jsp:setProperty id="localName" property="serialNumber" value="string" />

或者直接用一个名字称和值来设置:
<jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> .

关于JavaBean 的最后一件事: 为了Web服务器能找到JavaBean,你需要将其类别文件放在一个特殊位置。用JSWDK,最 方便的位置是安装目录下的类别目录,如\jswdk-1.0.1\classes。

JSP隐含对象

与JSP语法相关的最后的元素是一些叫做“隐含对象”的东西。在JSP代码片段中,你可以利用这些隐含对象与JSP页面的代码片段执行环境产生互动。应尽量少访问这些内置隐含对象。但是,在一某些情况下,访问隐含对象是可被接受的。若要充分利用隐含对象,就需了解最新的Java Servlet API。 下表列出可用的隐含对象集合。

隐含对象说明

request 客户端请求,包括从GET/POST请求传递过来的参数

response 网页传回客户端的反应

pageContext 在此管理网页属性

session 与请求关联的会话

application 代码片段的运行环境

out 传送响应的输出流

config 代码片段配置对象

page JSP网页本身

exception 有错的网页中未被捕获的例外

这些都是用来做什么的,你又如何来使用它们呢?基本上说,在你的脚本片段里,你可以用它们进入执行JSP代码的代码片段。用不着深入了解太多的Servlet API细节,我们来看看能用它们来做到的某些事情: 你可以不用表达式,直接进入“Out”隐含对象,将某些内容输出到响应中:

<% out.println("Hello"); %>。

用不着把一个参数直接送到JavaBean,你可以从请求对象获取参数值:

<% String name=request.getParameter("name"); out.println(name); %>.

在你用JSP进行开发的过程中,进行更多的开发的过程中,如果创建了JavaBeans或发现JSP文件中加入了太多的Java源代码,你就需要创建起支持作用的Java分类(class)了,它可以协助你重复利用源代码并减少JSP网页编译时间。当你需要创建Java分类文件时,你必须: 将JDSWK installation\bin目录添加到PATH中。在autoexec.bat文件PATH行的末尾,加入“C:1.2.2/bin”。

用这个命令将JAR文件复制到“\jre\lib\ext:”目录中: copy c:\jswdk-1.0.1\lib\servlet.jar

c:\jdk1.2.2\jre\lib\ext.

创建一个JSP网站

现在该是把所有这些JSP语法派上用场的时候了。我们将创建一个网页,它有一个输入表单,可以使用户输入一个股票代号以获得出当前股价(有20分钟)。如果输入有误,则显示报错网页。

quote.jsp

首先,用 这个代码 创建一个quote.jsp网页并将其保存在JSWDK安装目录下的网页目录中。大多数的网页是标准的HTML,其间散布着JSP代码。第六行是一个网页指示,表示将把所有错误发送到“errorPage.jsp”文中。第13到15行是一个脚本片段,主要说明只有提供“符号”参数才会显示表格。“If”代码段在

32到34行结束。第17行定义了要用的JavaBean,第18行从参数加载JavaBean的符号属性。第27行到29行显示Bean的属性。除了”if “代码段,实际上并不涉及其它Java代码。

errorPage.jsp

下一步,将下列JSP源代码保存到网页目录中的“errorPage.jsp”文件中。“这是一个错误网页”的提示为第一行,它将isErrorPage网页提示属性设置为真。上一页说了明错误网页的位置,本页则说明这就是错误网页。其它JSP文件中的JSP专用代码只有访问隐含例外对象才用到。网页只显示其值:

<%@ page isErrorPage="true" %>
<html>
<head>
<title>Error Page</title>
</head>
<body>
<h1>Our Error Page</h1></font>
<!-- Print Exception -->
We got ourselves an exception:
<%= exception %>
<a href="quote.jsp">Restart</a>
</body>
</html>。
Quotes.java
Quotes JavaBean
利用Yahoo资源来获得股票价格。需要将此 资源保存到JSWDK安装目录下“classes\com\jguru”目录中的“quotes.java”文件中。请在此用JSDK中的Javac编辑器来编辑它。

你的第一个JSP网页。

创建了这两个JSP文件,建立了JavaBean资源文件并编辑了它后,你就可以从http://localhost:8080/quote.jsp加载“quote.jsp”文件以查看结果,假设你没有更改JSWDK安装设置,转而使用别的端口。这个网页当然能做得更漂亮,但是它已实现了需要实现的功能,并且很好地展示了JSP的功能。