2006年6月28日

          動作映射

          這個時候,你可能會問自己:“當控制器接受到一個請求的時候,它如何知道調(diào)用哪個Action實例?”控制器要通過查看請求消息并使用一組動作
          映射(action mapping)來做出決定。動作映射是Struts配置信息(配置一個特殊的XML文件中)的一部分。這個配置信息會在啟動時加載到內(nèi)存中
          ,讓Struts框架得以在運行時加以利用。每個action元素在內(nèi)存中都被表示為org.apache.struts.action.ActionMapping類的實例。
          ActionMapping對象包含一個path屬性,用來與外部請求的URI部分匹配。如下:
          <action
          ??? path="/login"
          ??? type="com.oreilly.struts.banking.action.LoginAction"
          ??? scope="request"
          ??? name="loginForm"
          ??? validate="true"
          ??? input="/login.jsp"
          ??? <forward name="Success" path="/action/getaccountinformation" redirect="true"/>
          ??? <forward name="Failure" path="/login.jsp" redirect="true"/>
          </action>
          這里的登錄動作映射把路徑"/login"映射到了com.oreilly.struts.banking.LoginAction這個Action類。無論何時,當控制器接受到一個URI
          路徑中包含"/login"字符串的請求時,就會調(diào)用LoginAction實例的execute()方法。Struts框架還會使用映射來指出“動作"完成后要讓用戶
          轉(zhuǎn)向哪個資源。

          ?

          使用Struts ActionForm

          Struts框架的ActionForm對象可用來在用戶和業(yè)務(wù)層之間傳輸客戶的輸入數(shù)據(jù)。Struts框架會自動從請求中收集輸入數(shù)據(jù),再將這些數(shù)據(jù)交給
          一個使用表單bean(form bean)的Action對象,接著表單再交給業(yè)務(wù)層。為了把表示層和業(yè)務(wù)層分離開來,你不應(yīng)該直接把ActionForm對象交
          給業(yè)務(wù)層,而是應(yīng)該使用由ActionForm對象得到的數(shù)據(jù)創(chuàng)建適當?shù)腄TO。下面的步驟說明了Struts框架如何處理每個請求相應(yīng)的ActionForm對
          象:
          ?
          ? 1.檢查該項動作的相應(yīng)設(shè)置,查看是否已經(jīng)有某個ActionForm得到配置。
          ? 2.如果對應(yīng)這個動作配置了某個ActionForm,則使用action元素中的name屬性來查找表單bean的配置信息。
          ? 3.查看是否已經(jīng)創(chuàng)建了一個ActionForm的一個實例。
          ? 4.如果在適當?shù)淖饔糜騼?nèi)已經(jīng)存在一個ActionForm實例,而且這個實例的類型正是這個請求所需要的類型,則重用這個實例。
          ? 5.否則,創(chuàng)建所需ActionForm的一個新實例,并存儲在適當?shù)淖饔糜蛑校ㄓ蒩ction元素的scope屬性設(shè)置)。
          ? 6.調(diào)用ActionForm實例的reset()方法。
          ? 7.反復(fù)處理請求參數(shù),如果參數(shù)名在ActionForm實例中具有對應(yīng)的設(shè)置方法(setter method),就為它填上該請求參數(shù)的值。
          ? 8.最后,如果validate屬性的值設(shè)置為true,則調(diào)用ActionForm實例的validate()方法,并返回所出現(xiàn)的任何錯誤。
          對任何HTML頁面而言,如果表單數(shù)據(jù)是以POST方法傳輸?shù)模蛻?yīng)該使用ActionForm。必要時,相同的ActionForm可以同時給多個頁面使用,只
          要HTML字段能和ActionForm對象的屬性(property)匹配就可以了。
          Struts框架所提供的ActionForm類實現(xiàn)了多個方法,但到目前為止,最重要的兩個方法就是reset()和validate():
          ? public void reset(ActionMapping mapping,HttpServletRequest request);
          ? public ActionErrors validate(ActionMapping mapping,HttpServletRequest request);
          在Struts ActionForm類中,這兩個方法的默認實現(xiàn)是不完成任何的邏輯。你必須在自己的ActionForm類中覆蓋這兩個方法。控制器以請求中的
          值來填寫ActionForm實例之前,會先調(diào)用reset()方法。reset()方法給了ActionForm一個機會,可將其屬性設(shè)置為原來默認的狀態(tài)。這一點非
          常重要,因為表單bean實例可能會由多個請求共享或者由好幾個不同的線程所存取。不過,如果你是讓好幾頁共享一個ActionForm實例,可能
          不會去想去實現(xiàn)reset()方法,這樣一來只要這個實例還在,屬性的值就不會被重新設(shè)置。另一種做法就是實現(xiàn)你自己的resetFields()方法,
          在成功更新業(yè)務(wù)之后,就從這個Action類來調(diào)用此方法。
          當請求中所攜帶的值已經(jīng)插入到ActionFrom實例之后,控制器就回調(diào)用validate()方法。ActionForm應(yīng)該對輸入數(shù)據(jù)完成必要的驗證工作,然
          后向控制器返回所檢測到的任何錯誤。業(yè)務(wù)邏輯驗證應(yīng)該在業(yè)務(wù)對象中而不是在ActionForm中來完成。在ActionForm中所進行的驗證工作,只
          是表示的驗證而已。
          一旦寫好ActionForm類后,你必須通知Struts應(yīng)用程序有這些ActionForm存在,告訴Struts應(yīng)用程序哪個動作映射應(yīng)該使用哪個ActionForm。
          這是在配置文件中設(shè)置的。第一步是為你的應(yīng)用程序在配置文件中的form-beans段里配置所有的ActionForm。看下面的一個例子:
          ?<form-beans>
          ??? <form-bean
          ?????? name="loginForm"
          ?????? type="com.oreilly.struts.banking.form.LoginForm"/>
          ??? <form-bean
          ?????? name="accountInformationForm"
          ?????? type="org.apache.struts.action.DynaActionForm">
          ?????? <form-property name="accounts" type="java.util.ArrayList"/>
          ??? </form-bean>
          ?</form-beans>
          每個表單bean的name屬性必須都是獨一無二的,而且其type屬性必須定義一個Java類(擴展了Struts ActionForm類)的完全限定名。下一步
          是在一個或多個action元素中使用在form-benas段里的某個form-bean名。如下:
          ? <action
          ??? path="/login"
          ??? type='com.oreilly.struts.banking.action.LoginAction"
          ??? scope="request"
          ??? name="loginForm"
          ??? validate="true"
          ??? input="/login.jsp">
          ??? <forward name="Success" path="/action/getaccountinformation" redirect="ture>
          ??? <forward name="Failure" path="/login.jsp" redirect="true"/>
          ? </action>
          注意:登錄動作映射的name正好和前面form-beans段里某個name屬性相匹配。

          ?


          ?

          posted @ 2006-07-05 08:07 多力宇揚 閱讀(1160) | 評論 (5)編輯 收藏

          美國雜志300強及其網(wǎng)址

          No? 雜志名稱??????????????????????????????????????????????????? ???? ?網(wǎng)址???????????????????????????????????????????????? ?? 類別
          1?? People(人物)?? ??????????????????????? ??http://people.aol.com/people/index.html????????????????? ?? 娛樂
          2?? TV Guide(電視指南)?????????????? ? http://www.tvguide.com????????????????????????????????????????????? 娛樂
          3?? Time(時代)????????????????????????????? ? http://www.time.com????????????????????????????????????????????????? ?新聞
          4?? Sports Illustrated(體育畫報)?? http://sportsillustrated.cnn.com 體育
          5?? Better Homes & Gardens(美好家園)? http://www.bhg.com 家居
          6?? Reader’s Digest(讀者文摘)? http://www.rd.com/splash.jhtml 綜合
          7?? Parade(旅行)? http://www.parade.com/auth/entry.lasso 旅游
          8?? Newsweek(新聞周刊)? http://www.msnbc.com/news/NW-front_Front.asp 新聞
          9?? Business Week(商業(yè)周刊)? http://www.businessweek.com 商業(yè)
          10?? Good Housekeeping(好主婦)? http://www.goodhousekeeping.com 家庭
          11?? Fortune(財富)? http://www.fortune.com/ 商業(yè)
          12?? Cosmopolitan(全球主義者)? http://www.cosmopolitan.com/ 娛樂
          13?? Woman’s Day(婦女日)? http://www.womansday.com/xp6/WomansDay/home.xml 婦女
          14?? Forbes(福布斯)? http://www.forbes.com/ 商業(yè)
          15?? Family Circle(家庭圈)? http://www.familycircle.com/home/homepage.jsp 家庭
          16?? USA Weekend(美國周末)? http://www.usaweekend.com 休閑
          17?? Instyle(時髦)? http://www.instyle.com/instyle 時尚
          18?? Entertainment Weekly(娛樂周刊)? http://www.ew.com/ew/ 娛樂
          19?? Martha Stewart Living(瑪薩斯圖爾特生活)?? http://www.marthastewart.com 生活
          20?? U.S. News & World Report(美國新聞與世界報道)? http://www.usnews.com 新聞
          21?? Ladies’ Home Journal(婦女家庭雜志)?? http://www.lhj.com 家庭
          22?? National Geographic(國家地理雜志)?? http://www.nationalgeographic.com 地理
          23?? Southern Living(南方生活)? http://www.southernliving.com/ 生活
          24?? Vogue(時尚)? http://www.style.com/vogue/index.html 時尚
          25?? PC Magazine(個人電腦)? http://www.pcmag.com/ IT
          26?? Money(金錢)? http://money.cnn.com/ 理財
          27?? Maxim(馬克西姆)? http://www.maximonline.com/index.html 娛樂
          28?? O, The Oprah Magazine?? http://www.oprah.com/omagazine 婦女
          29?? Glamour(魅力)? http://www.glamour.com/ 時尚
          30?? National Enquirer, The(國家尋問者)? http://www.nationalenquirer.com/ 新聞
          31?? New York Times Magazine(紐約時報雜志)? http://www.nytimes.com/ 新聞
          32?? Golf Digest(高爾夫文摘)? http://www.golfdigest.com/ 體育
          33?? Rolling Stone(滾石)? http://www.rollingstone.com/ 音樂
          34?? Playboy(花花公子)? http://www.playboy.com/ 男性
          35?? Vanity Fair(名利場)? http://www.vanityfair.com 娛樂
          36?? Seventeen(十七歲)? http://www.seventeen.com/ 青年
          37?? Parents(父母)? http://www.parents.com/ 教育
          38?? Star Magazine(明星雜志)? http://www.starmagazine.com/ 娛樂
          39?? ESPN The Magazine(ESPN雜志)? http://espn.go.com/magazine/ 體育
          40?? Prevention(預(yù)防)? http://www.prevention.com/ 健康
          41?? Redbook(紅書)? http://magazines.ivillage.com/redbook/ 婦女
          42?? Rosie?? http://www.rosieo.com/ 生活
          43?? Golf Magazine(高爾夫雜志)? http://sportsillustrated.cnn.com/golfonline/ 體育
          44?? Travel & Leisure(旅游和休閑)? http://www.travelandleisure.com/ 休閑
          45?? Elle?? http://www.elle.com/ 時尚
          46?? New Yorker, The(紐約客)? http://www.newyorker.com/ 文藝
          47?? W?? http://www.style.com/w/ 時尚
          48?? Woman’s World(婦女世界)? http://www.robertcraig.com/womansworld.html 婦女
          49?? Parenting(養(yǎng)育)? http://www.parenting.com/parenting/ 家庭
          50?? Car & Driver(人車志)? http://www.caranddriver.com/xp/Caranddriver/home.xml 機車
          51?? Endless Vacation(無盡假日)? http://www.endlessvacation.com/ 休閑
          52?? Bride’s Magazine(新娘雜志)? http://www.brides.com 婚禮
          53?? InformationWeek(信息周刊)? http://www.informationweek.com/ IT
          54?? Country Living(鄉(xiāng)村生活)? http://magazines.ivillage.com/countryliving/ 生活
          55?? Us Weekly(美國周刊)? http://usweekly.abc.com/ 新聞
          56?? Marie Claire(瑪麗克萊爾)? http://www.marieclaire.com/ 時尚
          57?? Sunset(日落)? http://www.sunset.com/ 科學
          58?? Soap Opera Digest(肥皂劇文摘)? http://www.soapoperadigest.com 娛樂
          59?? AARP Modern Maturity(現(xiàn)代文明)?? http://www.modernmaturity.org/ 公益
          60?? GQ?? http://www.gq.com/ 時尚
          61?? Architectural Digest(建筑學文摘)? http://www.condenet.com/mags/archdigest/ 建筑
          62?? Harper’s Bazaar(哈潑氏)? http://www.harpersbazaar.com/ 時尚
          63?? Travel Agent(旅游代理)? http://www.travelagents.com/ 旅游
          64?? Smithsonian(史密森尼)? http://www.si.edu/ 博物
          65?? PC World(PC世界)? http://www.pcworld.com/ IT
          66?? Modern Bride(現(xiàn)代新娘)? http://www.modernbride.com/ 婚禮
          67?? Men’s Health(男性健康)? http://www.menshealth.com/ 健康
          68?? Bon Appetit(好 )? http://www.epicurious.com/b_ba/b00_home/ba.html 烹飪
          69?? Motor Trend(機車潮流)? http://www.motortrend.com/ 機車
          70?? Economist, The(經(jīng)濟學人)? http://www.economist.com/ 政經(jīng)
          71?? Self(自我)? http://www.self.com/ 婦女
          72?? Shape(體形)? http://www.shapeonline.com/ 健康
          73?? Teen People?? http://www.teenpeople.com/teenpeople/ 青年
          74?? YM?? http://www.ym.com 時尚
          75?? Consumer Reports(消費者報告)? http://www.consumerreports.org/main/home.jsp 生活
          76?? Cooking Light(烹飪之光)? http://www.cookinglight.com/ 烹飪
          77?? Travel Weekly(旅行周刊)? http://www.travelweekly.co.uk/tw_home/home.asp 旅游
          78?? House Beautiful(美麗住宅)? http://magazines.ivillage.com/housebeautiful/ 家居
          79?? Ebony(烏木)? http://www.ebony.com/ 成人
          80?? Popular Photography(大眾攝影)? http://www.popularphotography.com/index.asp 攝影
          81?? Country Home(鄉(xiāng)村家庭)? http://www.countryhome.com/ch/index.html 家庭
          82?? Barron’s?? http://www.barrons.com/ 商業(yè)
          83?? eWeek?? http://www.eweek.com 消費
          84?? Conde Nast Traveler?? http://www.concierge.com/cntraveler/ 旅游
          85?? Town & Country(城鎮(zhèn)和鄉(xiāng)村)?? http://magazines.ivillage.com/townandcountry/ 生活
          86?? InfoWorld(信息世界)?? http://www.infoworld.com/ IT
          87?? EE Times?? http://www.eetimes.com/ 電子
          88?? Food & Wine(食物和酒)?? http://www.foodandwine.com/ 食品
          89?? New York(紐約)?? http://www.newyorkmetro.com/ 城市
          90?? Essence(本質(zhì))?? http://www.essence.com/ 黑人
          91?? Road & Track(公路與軌跡)?? http://www.roadandtrack.com/ 機車
          92?? Health(健康)?? http://www.health.com/ 健康
          93?? Inc(公司)?? http://www.inc.com/home/ 商業(yè)
          94?? Allure(吸引)?? http://www.allure.com/ 時尚
          95?? Vibe?? http://www.vibe.com/new/home/pointer.html 娛樂
          96?? Gourmet(美食家)?? http://www.gourmet.com/ 烹飪
          97?? Taste of Home(家的滋味)?? http://www.tasteofhome.com/ 烹飪
          98?? Muscle & Fitness(肌肉和健身)?? http://www.muscleandfitness.com/ 健康
          99?? Popular Mechanics(大眾機械)?? http://popularmechanics.com/ 機械
          100?? Home(家)?? http://www.homemag.com/ 家居
          101?? fitness(健身)?? http://www.fitnessmagazine.com/home/index.jsp 健康
          102?? Field & Stream(田園和小溪)?? http://www.fieldandstream.com/ 休閑
          103?? American Baby(美國寶貝)?? http://www.americanbaby.com/ab/CDA/homepage/ 家庭
          104?? FamilyFun(家庭樂趣)?? http://familyfun.go.com/ 家庭
          105?? Sporting News, The(體育新聞)?? http://www.sportingnews.com/ 體育
          106?? Esquire(先生)?? http://www.esquire.com/ 男性
          107?? Penthouse(小棚屋)?? http://www.penthouse.com/ 成人
          108?? Kiplinger’s Personal Finance Magazine(吉樸林的個人金融雜志)?? http://www.kiplinger.com/ 理財
          109?? Globe(環(huán)球)?? http://www.boston.com/globe/ 環(huán)境
          110?? SmartMoney(精明理財)?? http://www.smartmoney.com/ 理財
          111?? Stuff(素材)?? http://www.stuffmagazine.com/ 男性
          112?? CRN ? http://www.crn.com/ IT
          113?? Men’s Journal(男人)?? http://www.mensjournal.com/ 男性
          114?? House & Garden(家園)?? http://www.condenet.com/mags/hg/ 家居
          115?? Fast Company(快速公司)?? http://www.fastcompany.com/homepage/ 商業(yè)
          116?? Computer Shopper(計算機購物者)?? http://shopper.cnet.com/ 消費
          117?? Jet(黑玉)?? http://www.jetmag.com/ 黑人
          118?? First For Women ?? http://www.ffwmarket.com/ 婦女
          119?? Traditional Home(傳統(tǒng)家庭)?? http://www.traditionalhome.com/ 家庭
          120?? Automobile Magazine(汽車雜志)?? http://www.automobilemag.com/ 機車
          121?? Red Herring(紅鯡魚)?? http://www.redherring.com/ 商業(yè)
          122?? Highlights for Children(兒童文粹)?? http://www.highlights.com/ 兒童
          123?? Wired(連線)?? http://www.wired.com/ IT
          124?? Outside(戶外)?? http://outsidemag.com/index.html 休閑
          125?? This Old House(這個老屋子)?? http://www.thisoldhouse.com/toh/ 家居
          126?? NetworkWorld(網(wǎng)絡(luò)世界)?? http://www.networkworld.com/ IT
          127?? Entrepreneur(企業(yè)家)?? http://www.entrepreneur.com/ 商業(yè)
          128?? Popular Science(大眾科學)?? http://www.popsci.com/popsci/ 科普
          129?? Elle Decor ?? http://www.elledecor.co.th/ 設(shè)計
          130?? Quick Cooking (速煮)?? http://www.quickcooking.com/ 烹飪
          131?? Family Handyman(家庭傭人)?? http://www.familyhandyman.com/ 家居
          132?? Science(科學)?? http://www.sciencemag.org/ 科學
          133?? Bridal Guide(新娘指南)?? http://www.bridalguide.com/ 婚禮
          134?? Child(孩子)?? http://www.child.com/index.jsp 家庭
          135?? Cable Guide(有線電視指南)?? http://www.cableguide.co.uk/ 娛樂
          136?? Midwest Living(中西部生活)?? http://www.midwestliving.com/ 生活
          137?? Metropolitan Home(大城市生活)?? http://www.mho.co.uk/ 生活
          138?? Chronicle of Higher Education, The(高等教育編年史)?? http://chronicle.com/ 教育
          139?? Mutual Funds Magazine(互動基金雜志)? http://www.mutual-funds.com/mfmag/ 商業(yè)
          140?? Travelhost(旅游主人)?? http://www.travelhost.com/ 旅游
          141?? Sound & Vision(聲與影)?? http://www.soundandvisionmag.com/index.asp 電影
          142?? CIO(首席信息官)?? http://www.cio.com/ IT
          143?? Hot Rod ?? http://www.hotrod.com/ 機車
          144?? Computerworld(計算機世界)?? http://www.computerworld.com/ IT
          145?? Source, The(來源)?? http://www.thesource.com/ 黑人
          146?? Departures(啟程)?? http://www.departures.com/ 商業(yè)
          147?? Spin(旋轉(zhuǎn))?? http://www.spin.com/ 音樂
          148?? Travel Holiday(旅行假日)?? http://www.travelholiday.com/ 旅游
          149?? Black Enterprise(黑人企業(yè))?? http://www.blackenterprise.com/ 商業(yè)
          150?? BabyTalk(寶貝說話)?? http://www.parenting.com/parenting/...s/babytalk.html 家庭
          151?? New England Journal of Medicine(新英格蘭醫(yī)學期刊)?? http://content.nejm.org/ 醫(yī)學
          152?? EBN Electronic Buyer’s News(EBN電子買主新聞)?? http://www.ebnonline.com/ 電子
          153?? Jane(簡)?? http://www.janes.com/ 軍事
          154?? Working Mother(婦女運動者) ? http://www.workingwoman.com/ 婦女
          155?? Men’s Fitness(男性健身)?? http://www.mensfitness.com/mens.html 健康
          156?? Victoria(維多利亞)?? http://magazines.ivillage.com/victoria/ 生活
          157?? CosmoGirl(都市女孩)?? http://www.cosmogirl.com/ 時尚
          158?? Nation’s Restaurant News(國家餐館新聞)?? http://www.nrn.com/ 行業(yè)
          159?? Harvard Business Review(哈佛商業(yè)評論)?? http://www.hbr.com 商業(yè)
          160?? FHM(男人幫)?? http://www.fhm.com/ 男性
          161?? Sports Illustrated For Kids(兒童體育畫報)?? http://www.sikids.com/ 兒童
          162?? Boating(航船)?? http://www.boatingmag.com/ 體育
          163?? Discover(探索)?? http://www.discover.com/ 科普
          164?? Real Simple(反樸歸真)?? http://www.realsimple.com/realsimple/ 生活
          165?? Guideposts(路標)?? http://www.guideposts.com/ 宗教
          166?? Cycle World(環(huán)形世界)?? http://www.cycleworld.com/xp6/CycleWorld/main.xml 機車
          167?? EDN?? http://www.e-insite.net/ednmag/ 電子
          168?? Tennis Magazine(網(wǎng)球雜志)?? http://www.tennis.com 體育
          169?? Advertising Age(廣告時代)?? http://www.adage.com/ 行業(yè)
          170?? Hemispheres(半球)?? http://www.hemispheresmagazine.com/home.htm 收藏
          171?? Fortune Small Business(財富小商業(yè))? http://www.fortune.com/smallbusiness/ 商業(yè)
          172?? Meetings & Conventions(會議)?? http://www.meetings-conventions.com/ 行業(yè)
          173?? Worth(價值)?? http://www.worth.com/magazine/index.cfm 理財
          174?? Outdoor Life(戶外生活)?? http://www.outdoorlife.com/outdoor/ 休閑
          175?? Official U.S. Playstation Magazine(美國官方PS雜志)? http://www.gamers.com/opm/index.jsp 游戲
          176?? Automotive News(汽車新聞)?? http://www.autonews.com/ 機車
          177?? Scientific American(科學美國人)?? http://www.sciam.com/ 科普
          178?? Nickelodeon ?? http://www.nick.com 娛樂
          179?? More(更多)?? http://www.more.com 時尚
          180?? Ski(滑雪)?? http://www.skinet.com/skinet/ 體育
          181?? Lucky(幸運)?? http://www.luckymag.com/ 時尚
          182?? Interior Design(室內(nèi)裝飾設(shè)計)?? http://www.interiordesign.net 行業(yè)
          183?? Sky (Delta Air Lines)(天空 三角航線)?? http://www.delta-sky.com/ 航線
          184?? Power & Motoryacht(能源和摩托艇)?? http://powerandmotoryacht.about.com/mbody.htm 休閑
          185?? GamePro(專業(yè)游戲)?? http://www.gamepro.com/ 游戲
          186?? JAMA(睡衣褲)?? http://jama.ama-assn.org/ 健康
          187?? Furniture Today(今日家具)?? http://www.furnituretoday.com/index.shtml 家居
          188?? My Generation(我們這一代)?? http://www.mygeneration.org/ 音樂
          189?? Successful Meetings(成功會議)?? http://www.successmtgs.com/successmtgs/index.jsp 行業(yè)
          190?? Premiere(首映)?? http://www.premiere.com 電影
          191?? Birds & Blooms(鳥語花香)?? http://www.birdsandblooms.com/ 家居
          192?? Aviation Week & Space Technology(航空技術(shù)周刊)?? http://www.aviationnow.com/ 休閑
          193?? Electronic Design(電子設(shè)計)?? http://www.e-insite.net/ednmag/ 電子
          194?? T & L Golf(T & L高爾夫)?? http://www.tlgolf.com/ 休閑
          195?? Wine Spectator(酒的旁觀者)?? http://www.winespectator.com/ 休閑
          196?? National Geographic Traveler(國家地理旅行者)?? http://www.nationalgeographic.com/traveler/ 旅游
          197?? AutoWeek(汽車周刊)?? http://www.autoweek.com/ 機車
          198?? Wood(木工) ?? http://www.woodmagazine.com/ 工藝
          199?? Chemical & Engineering News(化工新聞)?? http://pubs.acs.org/cen/ 行業(yè)
          200?? Electronic Gaming Monthly(電子游戲月刊)?? http://www.gamers.com/egm/index.jsp 游戲
          201?? Disney Adventures(迪斯尼冒險)?? http://disney.go.com/disneyadventures/ 孩子
          202?? National Examiner(國家主考者)?? http://www.nationalexaminer.com/ 教育
          203?? Soap Opera Weekly(肥皂劇周刊)?? http://www.soapoperaweekly.com/ 娛樂
          204?? Golf World(高爾夫世界)?? http://www.worldgolf.com/ 體育
          205?? Runner’s World(跑步者世界)?? http://www.runnersworld.com/ 體育
          206?? Country Weekly(鄉(xiāng)村周刊)?? http://www.countryweekly.com/ 音樂
          207?? American Way(美國道路)?? http://www.americanwaymag.com/ 旅游
          208?? Upside(上面)?? http://www.upside.com/ IT
          209?? Design News (設(shè)計新聞)?? http://www.manufacturing.net/ 行業(yè)
          210?? Details(詳細資料)?? http://www.condenet.com/mags/details/ 時尚
          211?? American Profile(美國外形)?? http://www.americanprofile.com/ 健康
          212?? ENR?? http://enr.construction.com/Default.asp 建筑
          213?? Machine Design(機械設(shè)計)?? http://www.machinedesign.com/ 行業(yè)
          214?? PC Gamer(PC游戲玩家)?? http://www.pcgamer.com/ 游戲
          215?? Biography(傳記)? http://www.biography.com/ 文學
          216?? Atlantic Monthly(大西洋月刊)?? http://www.theatlantic.com/ 文藝
          217?? Successful Farming(成功農(nóng)業(yè))?? http://www.agriculture.com/sfonline/ 行業(yè)
          218?? Texas Monthly(德克莎斯月刊)?? http://www.texasmonthly.com/ 地區(qū)
          219?? Skiing(滑雪運動)?? http://www.skiingmag.com/skiing/ 體育
          220?? Southern Accents(南方口音)?? http://www.southernaccents.com/accents/ 家庭
          221?? American Rifleman(美國步槍射手)?? http://www.americanrifleman.org/site/index.asp 槍械
          222?? Bassmaster?? http://www.bassmaster.com/ 休閑
          223?? SN-Supermarket News(超級市場新聞)?? http://www.supermarketnews.com 行業(yè)
          224?? ABA Journal(美國銀行家協(xié)會期刊)?? http://www.abanet.org/journal/redesign/home.html 行業(yè)
          225?? Nature(自然)?? http://www.nature.com/ 科學
          226?? Architectural Record(建筑學檔案)?? http://www.archrecord.com/ 行業(yè)
          227?? Adweek(廣告周刊)?? http://www.adweek.com/adweek/index.jsp 行業(yè)
          228?? Petersen’s 4-Wheel & Off Road?? http://www.4wheeloffroad.com/ 機車
          229?? Business 2.0(商業(yè)2.0)?? http://www.business2.com/ 商業(yè)
          230?? Flying(飛行)?? http://www.flyingmag.com/ 休閑
          231?? Billboard(公告牌)?? http://www.billboard.com/billboard/index.jsp 音樂
          232?? Coastal Living(海岸生活)?? http://www.coastalliving.com/coastal/ 生活
          233?? Country Woman(鄉(xiāng)村女人)?? http://www.countrywomanmagazine.com/ 家庭
          234?? Boys’sLife(男孩生活)?? http://www.boyslife.org/ 孩子
          235?? Transworld Skateboarding(環(huán)球滑板)? http://www.skateboarding.com/skate/ 體育
          236?? NFL Insider(美國足球聯(lián)盟知情者)?? http://ww2.nfl.com/insider/ 體育
          237?? People en Espanol(人物西班牙語版)?? http://www.peopleenespanol.com/pespanol/index.html/ 娛樂
          238?? Journal of Accountancy(會計學期刊)?? http://www.aicpa.org/pubs/jofa/joahome.htm 財務(wù)
          239?? Windows 2000 Magazine(視窗2000雜志)?? http://www.win2000mag.net/ IT
          240?? Veranda(陽臺)?? http://www.veranda.com/ 家居
          241?? Video Business(視頻商業(yè))?? http://www.videobusiness.com/ 商業(yè)
          242?? Backpacker(背包)?? http://www.backpacker.com/ 休閑
          243?? Cigar Aficionado(雪茄迷)?? http://www.cigaraficionado.com/ 休閑
          244?? Telephony(技術(shù))?? http://www.telephonyonline.com/ IT
          245?? Flex(彎曲)?? http://www.flexonline.com/ 健康
          246?? Variety (weekly)(品種周刊)?? http://www.variety.com/ 商業(yè)
          247?? Cruising World (巡航世界)?? http://www.cruisingworld.com/ 休閑
          248?? American Hunter(美國獵人)?? http://www.american-hunter.com/ 休閑
          249?? Crain’s Chicago Business(克瑞恩芝加哥商業(yè))?? http://www.chicagobusiness.com/ 商業(yè)
          250?? Broadcastin &Cable(寬帶與有線電視)?? http://www.broadcastingcable.com/ 行業(yè)
          251?? Petersen’s Photographic ? http://www.photographic.com/ 攝影
          252?? Golf for Women(女性高爾夫) ? http://www.golfdigest.com/gfw/ 體育
          253?? US Airways Attache Magazine??
          254?? Progressive Farmer(改進農(nóng)場主)?? http://www.progressivefarmer.com/farmer/ 農(nóng)業(yè)
          255?? Easyriders?? http://www.easyriders.com/Home/Home.asp 機車
          256?? Crain’s New York Business(克瑞恩紐約商業(yè))?? http://www.crainsny.com/ 商業(yè)
          257?? Yachting(游艇)?? http://www.yachtingnet.com/yachting/ 休閑
          258?? Chicago(芝加哥)?? http://www.chicagomag.com/ 城市
          259?? Computer Gaming World(計算機游戲世界)?? http://www.gamers.com/cgw/index.jsp 游戲
          260?? Video Store(視頻商店)?? http://www.videostoremag.com/ 商業(yè)
          261?? Country(鄉(xiāng)村) ?? http://www.country-magazine.com/ 生活
          262?? Fine Homebuilding(好家建造者)?? http://www.taunton.com/finehomebuilding/index.asp 家居
          263?? Yankee(美國佬)?? http://www.yankeemagazine.com/travel/index.php 旅游
          264?? Publisher’s Weekly(出版者周刊)?? http://www.publishersweekly.com/ 行業(yè)
          265?? Restaurants & Institutions(餐館與協(xié)會)?? http://www.rimag.com/ 行業(yè)
          266?? American Medical News(美國醫(yī)學新聞)?? http://www.ama-assn.org/public/journals/amnews/ 行業(yè)
          267?? North American Hunter(北美獵人)?? http://visitors.huntingclub.com/magazine.asp 休閑
          268?? Federal Computer Week(聯(lián)邦計算機周刊) ? http://www.fcw.com/ IT
          269?? Guns & Ammo(槍與軍火)?? http://www.gunsandammomag.com/dynamic.asp 槍械
          270?? Transworld Snowboarding(環(huán)球滑雪板)? http://www.snowboarding-online.com/ 體育
          271?? New Equipment Digest(新設(shè)備文摘) ? http://www.newequipment.com/ 行業(yè)
          272?? Weekly World News(世界新聞周刊) ?? http://www.weeklyworldnews.com/ 新聞
          273?? Chemical Week(化學周刊) ? http://www.chemweek.com/ 行業(yè)
          274?? Four Wheeler(四輪車) ? http://www.fourwheeler.com/ 機車
          275?? Gear(齒輪) ?? http://www.gearmagazine.com/ 家居
          276?? Pensions & Investments(養(yǎng)老金和投資) ? http://www.pionline.com/ 理財
          277?? Macworld(Mac世界) ?? http://www.macworld.com/ IT
          278?? Builder(建筑者) ?? http://builder.com.com/ IT
          279?? RB Restaurant Business(餐館業(yè)) ?? http://www.foodservicetoday.com/rb/index.shtml 行業(yè)
          280?? CFO(首席運營官) ?? http://www.cfo.com/ IT
          281?? American Family Physician(美國家庭醫(yī)生) ? http://www.aafp.org/afp.xml 健康
          282?? Los Angeles Times Magazine(洛杉磯時報雜志) ? http://www.latimes.com/ 新聞
          283?? Saveur ?? http://www.saveur.com 烹飪
          284?? Multichannel News(多頻道新聞) ? http://www.multichannel.com/ 行業(yè)
          285?? Purchasing(購買) ?? http://www.manufacturing.net/ 消費
          286?? Laser Focus World(激光焦點世界)?? http://lfw.pennnet.com/home.cfm 行業(yè)
          287?? HANDY(手工)?? http://visitors.handymanclub.com/handy_mag.asp 家居
          288?? Medical Economics(醫(yī)藥經(jīng)濟)?? http://www.medec.com/ 行業(yè)
          289?? Reminisce(回憶)?? http://www.reminisce.com/ 休閑
          290?? Pillsbury Classic Cookbooks?? http://www.pillsbury.com/ 烹飪
          291?? Skin Diver(滑水)?? http://www.skin-diver.com/ 休閑
          292?? Nursing 2002?? http://www.nursinghomesmagazine.com/ 護理
          293?? Hemmings Motor News?? http://cars.hemmings.com/ 機車
          294?? American Legion Magazine(美國軍團雜志)?? http://www.legion.org/ 公益
          295?? Farm Journal(農(nóng)業(yè)期刊)?? http://www.farmjournal.com/ 農(nóng)業(yè)
          296?? Southwest Airlines Spirit(西南航線精靈)?? http://www.spiritmag.com/ 航行
          297?? Dr. Dobb’s Journal?? http://www.ddj.com/ IT
          298?? Chicago Tribune Magazine(芝加哥論壇雜志)?? http://www.chicagotribune.com/features/magazine/ 新聞
          299?? Islands(島嶼)?? http://www.islands.com/ 休閑
          300?? Institutional Investor(金融機構(gòu)投資者)?? http://www.epinions.com 金融

          posted @ 2006-07-05 08:05 多力宇揚 閱讀(514) | 評論 (0)編輯 收藏

          Ant是什么?
          Ant是一種基于Java的build工具。理論上來說,它有些類似于(Unix)C中的make ,但沒有make的缺陷。

          既然我們已經(jīng)有了make, gnumake, nmake, jam以及其他的build工具為什么還要要一種新的build工具呢?因為Ant的原作者在多種(硬件)平臺上開發(fā)軟件時,無法忍受這些工具的限制和不便。類似于make的工具本質(zhì)上是基于shell(語言)的:他們計算依賴關(guān)系,然后執(zhí)行命令(這些命令與你在命令行敲的命令沒太大區(qū)別)。這就意味著你可以很容易地通過使用OS特有的或編寫新的(命令)程序擴展該工具;然而,這也意味著你將自己限制在了特定的OS,或特定的OS類型上,如Unix。

          Makefile也很可惡。任何使用過他們的人都碰到過可惡的tab問題。Ant的原作者經(jīng)常這樣問自己:“是否我的命令不執(zhí)行只是因為在我的tab前有一個空格?!!”。類似于jam的工具很好地處理了這類問題,但是(用戶)必須記住和使用一種新的格式。

          Ant就不同了。與基于shell命令的擴展模式不同,Ant用Java的類來擴展。(用戶)不必編寫shell命令,配置文件是基于XML的,通過調(diào)用target樹,就可執(zhí)行各種task。每個task由實現(xiàn)了一個實現(xiàn)了特定Task接口的對象來運行。(如果你對Ant一點概念都沒有的話,可能看不懂這一節(jié),沒有關(guān)系,后面會對target,task做詳細的介紹。你如果沒有太多的時間甚至可以略過這一節(jié),然后再回來瀏覽一下這里的介紹,那時你就會看懂了。同樣,如果你對make之類的工具不熟悉也沒關(guān)系,下面的介紹根本不會用到make中的概念。)

          必須承認,這樣做,在構(gòu)造shell命令時會失去一些特有的表達能力。如`find . -name foo -exec rm {}`,但卻給了你跨平臺的能力-你可以在任何地方工作。如果你真的需要執(zhí)行一些shell命令,Ant有一個<exec> task,這個task允許執(zhí)行特定OS上的命令。

          安裝Ant
          由于Ant是一個Open Source的軟件,所以有兩種安裝Ant的方式,一種是用已編譯好的binary 文件安裝Ant,另一種是用源代碼自己build Ant。

          binary 形式的Ant可以從http://jakarta.apache.org/builds/ant/release/v1.4.1/bin下載。如果你希望你能自己編譯Ant,則可從 http://jakarta.apache.org/builds/ant/release/v1.4.1/src。注意所列出的連接都是最新發(fā)行版的Ant。如果你讀到此文時,發(fā)現(xiàn)已經(jīng)有了更新的版本,那么請用新版本。如果你是一個瘋狂的技術(shù)追求者,你也可以從Ant CVS repository下載最新版本的Ant。

          系統(tǒng)需求

          要想自己build Ant。你需要一個JAXP兼容的XML解析器(parser)放在你的CLASSPATH系統(tǒng)變量中。

          binary 形式的Ant包括最新版的Apache Crimson XML解析器。你可以從http://java.sun.com/xml/ 得到更多的關(guān)于JAXP的信息。如果你希望使用其他的JAXP兼容的解析器。你要從Ant的lib目錄中刪掉jaxp.jar以及crimson.jar。然后你可將你心愛的解析器的jar文件放到Ant的lib目錄中或放在你的CLASSPATH系統(tǒng)變量中。

          對于當前版本的Ant,需要你的系統(tǒng)中有JDK,1.1版或更高。未來的Ant版本會要求使用JDK 1.2或更高版本。

          binary 版的Ant包括三個目錄:bin, docs 和lib。只有bin和lib目錄是運行Ant所需的。要想安裝Ant,選擇一個目錄并將發(fā)行版的文件拷貝到該目錄下。這個目錄被稱作ANT_HOME。

          在你運行Ant之前需要做一些配置工作。

          將bin目錄加入PATH環(huán)境變量。
          設(shè)定ANT_HOME環(huán)境變量,指向你安裝Ant的目錄。在一些OS上,Ant的腳本可以猜測ANT_HOME(Unix和Windos NT/2000)-但最好不要依賴這一特性。
          可選地,設(shè)定JAVA_HOME環(huán)境變量(參考下面的高級小節(jié)),該變量應(yīng)該指向你安裝JDK的目錄。

          注意:不要將Ant的ant.jar文件放到JDK/JRE的lib/ext目錄下。Ant是個應(yīng)用程序,而lib/ext目錄是為JDK擴展使用的(如JCE,JSSE擴展)。而且通過擴展裝入的類會有安全方面的限制。

          可選Task

          Ant支持一些可選task。一個可選task一般需要額外的庫才能工作。可選task與Ant的內(nèi)置task分開,單獨打包。這個可選包可以從你下載Ant的同一個地方下載。目前包含可選task的jar文件名叫jakarta-ant-1.4.1-optional.jar。這個jar文件應(yīng)該放到Ant安裝目錄的lib目錄下。

          每個可選task所需的外部庫可參看依賴庫小節(jié)。這些外部庫可以放到Ant的lib目錄下,這樣Ant就能自動裝入,或者將其放入環(huán)境變量中。

          Windows

          假定Ant安裝在c:\ant\目錄下。下面是設(shè)定環(huán)境的命令:

          set ANT_HOME=c:\ant
          set JAVA_HOME=c:\jdk1.2.2
          set PATH=%PATH%;%ANT_HOME%\bin
          Unix (bash)

          假定Ant安裝在/usr/local/ant目錄下。下面是設(shè)定環(huán)境的命令:

          export ANT_HOME=/usr/local/ant
          export JAVA_HOME=/usr/local/jdk-1.2.2
          export PATH=${PATH}:${ANT_HOME}/bin
          高級

          要想運行Ant必須使用很多的變量。你至少參考需要下面的內(nèi)容:

          Ant的CLASSPATH必須包含ant.jar以及你所選的JAXP兼容的XML解析器的jar文件。
          當你需要JDK的功能(如javac或rmic task)時,對于JDK 1.1,JDK的classes.zip文件必須放入CLASSPATH中;對于JDK 1.2或JDK 1.3,則必須加入tools.jar。如果設(shè)定了正確的JAVA_HOME環(huán)境變量,Ant所帶的腳本,在bin目錄下,會自動加入所需的JDK類。
          當你執(zhí)行特定平臺的程序(如exec task或cvs task)時,必須設(shè)定ant.home屬性指向Ant的安裝目錄。同樣,Ant所帶的腳本利用ANT_HOME環(huán)境變量自動設(shè)置該屬性。
          Building Ant

          要想從源代碼build Ant,你要先安裝Ant源代碼發(fā)行版或從CVS中checkout jakarta-ant模塊。

          安裝好源代碼后,進入安裝目錄。

          設(shè)定JAVA_HOME環(huán)境變量指向JDK的安裝目錄。要想知道怎么做請參看安裝Ant小節(jié)。

          確保你已下載了任何輔助jar文件,以便build你所感興趣的task。這些jar文件可以放在CLASSPATH中,也可以放在lib/optional目錄下。參看依賴庫小節(jié)可知不同的task需要那些jar文件。注意這些jar文件只是用作build Ant之用。要想運行Ant,你還要像安裝Ant小節(jié)中所做的那樣設(shè)定這些jar文件。

          現(xiàn)在你可以build Ant了:

          build -Ddist.dir=<directory_to_contain_Ant_distribution> dist (Windows)
          build.sh -Ddist.dir=<directory_to_contain_Ant_distribution> dist (Unix)

          這樣就可你指定的目錄中創(chuàng)建一個binary版本。

          上面的命令執(zhí)行下面的動作:

          如果有必要可以bootstrap Ant的代碼。bootstrap 包括手工編輯一些Ant代碼以便運行Ant。bootstrap 用于下面的build步驟。
          向build腳本傳遞參數(shù)以調(diào)用bootstrap Ant。參數(shù)定義了Ant的屬性值并指定了Ant自己的build.xml文件的"dist" target。

          大多數(shù)情況下,你不必直接bootstrap Ant,因為build腳本為你完成這一切。運行bootstrap.bat (Windows) 或 bootstrap.sh (UNIX) 可以build一個新的bootstrap版Ant。


          如果你希望將Ant安裝到ANT_HOME目錄下,你可以使用:

          build install (Windows)
          build.sh install (Unix)

          如果你希望跳過冗長的Javadoc步驟,可以用:

          build install-lite (Windows)
          build.sh install-lite (Unix)

          這樣就只會安裝bin和lib目錄。

          注意install和install-lite都會覆蓋ANT_HOME中的當前Ant版本。

          依賴庫

          如果你需要執(zhí)行特定的task,你需要將對應(yīng)的庫放入CLASSPATH或放到Ant安裝目錄的lib目錄下。注意使用mapper時只需要一個regexp庫。同時,你也要安裝Ant的可選jar包,它包含了task的定義。參考上面的安裝Ant小節(jié)。

          Jar Name Needed For Available At
          An XSL transformer like Xalan or XSL:P style task http://xml.apache.org/xalan-j/index.html or http://www.clc-marketing.com/xslp/
          jakarta-regexp-1.2.jar regexp type with mappers jakarta.apache.org/regexp/
          jakarta-oro-2.0.1.jar regexp type with mappers and the perforce tasks jakarta.apache.org/oro/
          junit.jar junit tasks www.junit.org
          stylebook.jar stylebook task CVS repository of xml.apache.org
          testlet.jar test task java.apache.org/framework
          antlr.jar antlr task www.antlr.org
          bsf.jar script task oss.software.ibm.com/developerworks/projects/bsf
          netrexx.jar netrexx task www2.hursley.ibm.com/netrexx
          rhino.jar javascript with script task www.mozilla.org
          jpython.jar python with script task www.jpython.org
          netcomponents.jar ftp and telnet tasks www.savarese.org/oro/downloads

          運行Ant
          運行Ant非常簡單,當你正確地安裝Ant后,只要輸入ant就可以了。

          沒有指定任何參數(shù)時,Ant會在當前目錄下查詢build.xml文件。如果找到了就用該文件作為buildfile。如果你用 -find 選項。Ant就會在上級目錄中尋找buildfile,直至到達文件系統(tǒng)的根。要想讓Ant使用其他的buildfile,可以用參數(shù) -buildfile file,這里file指定了你想使用的buildfile。

          你也可以設(shè)定一些屬性,以覆蓋buildfile中指定的屬性值(參看property task)。可以用 -Dproperty=value 選項,這里property是指屬性的名稱,而value則是指屬性的值。也可以用這種辦法來指定一些環(huán)境變量的值。你也可以用property task來存取環(huán)境變量。只要將 -DMYVAR=%MYVAR% (Windows) 或 -DMYVAR=$MYVAR (Unix) 傳遞給Ant -你就可以在你的buildfile中用${MYVAR}來存取這些環(huán)境變量。

          還有兩個選項 -quite,告訴Ant運行時只輸出少量的必要信息。而 -verbose,告訴Ant運行時要輸出更多的信息。

          可以指定執(zhí)行一個或多個target。當省略target時,Ant使用標簽<project>的default屬性所指定的target。

          如果有的話,-projecthelp 選項輸出項目的描述信息和項目target的列表。先列出那些有描述的,然后是沒有描述的target。

          命令行選項總結(jié):

          ant [options] [target [target2 [target3] ...]]
          Options:
          -help print this message
          -projecthelp print project help information
          -version print the version information and exit
          -quiet be extra quiet
          -verbose be extra verbose
          -debug print debugging information
          -emacs produce logging information without adornments
          -logfile file use given file for log output
          -logger classname the class that is to perform logging
          -listener classname add an instance of class as a project listener
          -buildfile file use specified buildfile
          -find file search for buildfile towards the root of the filesystem and use the first one found
          -Dproperty=value set property to value
          例子

          ant

          使用當前目錄下的build.xml運行Ant,執(zhí)行缺省的target。

          ant -buildfile test.xml

          使用當前目錄下的test.xml運行Ant,執(zhí)行缺省的target。

          ant -buildfile test.xml dist

          使用當前目錄下的test.xml運行Ant,執(zhí)行一個叫做dist的target。

          ant -buildfile test.xml -Dbuild=build/classes dist

          使用當前目錄下的test.xml運行Ant,執(zhí)行一個叫做dist的target,并設(shè)定build屬性的值為build/classes。

          文件

          在Unix上,Ant的執(zhí)行腳本在做任何事之前都會source(讀并計算值)~/.antrc 文件;在Windows上,Ant的批處理文件會在開始時調(diào)用%HOME%\antrc_pre.bat,在結(jié)束時調(diào)用%HOME%\antrc_post.bat。你可以用這些文件配置或取消一些只有在運行Ant時才需要的環(huán)境變量。看下面的例子。

          環(huán)境變量

          包裹腳本(wrapper scripts)使用下面的環(huán)境變量(如果有的話):

          JAVACMD Java可執(zhí)行文件的絕對路徑。用這個值可以指定一個不同于JAVA_HOME/bin/java(.exe)的JVM。
          ANT_OPTS 傳遞給JVM的命令行變量-例如,你可以定義屬性或設(shè)定Java堆的最大值

          手工運行Ant

          如果你自己動手安裝(DIY)Ant,你可以用下面的命令啟動Ant:

          java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target]

          這個命令與前面的ant命令一樣。選項和target也和用ant命令時一樣。這個例子假定你的CLASSPATH包含:

          ant.jar

          jars/classes for your XML parser

          the JDK's required jar/zip files

          編寫build.xml
          Ant的buildfile是用XML寫的。每個buildfile含有一個project。

          buildfile中每個task元素可以有一個id屬性,可以用這個id值引用指定的任務(wù)。這個值必須是唯一的。(詳情請參考下面的Task小節(jié))

          Projects

          project有下面的屬性:

          Attribute Description Required
          name 項目名稱. No
          default 當沒有指定target時使用的缺省target Yes
          basedir 用于計算所有其他路徑的基路徑。該屬性可以被basedir property覆蓋。當覆蓋時,該屬性被忽略。如果屬性和basedir property都沒有設(shè)定,就使用buildfile文件的父目錄。 No

          項目的描述以一個頂級的<description>元素的形式出現(xiàn)(參看description小節(jié))。

          一個項目可以定義一個或多個target。一個target是一系列你想要執(zhí)行的。執(zhí)行Ant時,你可以選擇執(zhí)行那個target。當沒有給定target時,使用project的default屬性所確定的target。

          Targets

          一個target可以依賴于其他的target。例如,你可能會有一個target用于編譯程序,一個target用于生成可執(zhí)行文件。你在生成可執(zhí)行文件之前必須先編譯通過,所以生成可執(zhí)行文件的target依賴于編譯target。Ant會處理這種依賴關(guān)系。

          然而,應(yīng)當注意到,Ant的depends屬性只指定了target應(yīng)該被執(zhí)行的順序-如果被依賴的target無法運行,這種depends對于指定了依賴關(guān)系的target就沒有影響。

          Ant會依照depends屬性中target出現(xiàn)的順序(從左到右)依次執(zhí)行每個target。然而,要記住的是只要某個target依賴于一個target,后者就會被先執(zhí)行。

          <target name="A"/>
          <target name="B" depends="A"/>
          <target name="C" depends="B"/>
          <target name="D" depends="C,B,A"/>

          假定我們要執(zhí)行target D。從它的依賴屬性來看,你可能認為先執(zhí)行C,然后B,最后A被執(zhí)行。錯了,C依賴于B,B依賴于A,所以先執(zhí)行A,然后B,然后C,最后D被執(zhí)行。

          一個target只能被執(zhí)行一次,即時有多個target依賴于它(看上面的例子)。

          如果(或如果不)某些屬性被設(shè)定,才執(zhí)行某個target。這樣,允許根據(jù)系統(tǒng)的狀態(tài)(java version, OS, 命令行屬性定義等等)來更好地控制build的過程。要想讓一個target這樣做,你就應(yīng)該在target元素中,加入if(或unless)屬性,帶上target因該有所判斷的屬性。例如:

          <target name="build-module-A" if="module-A-present"/>
          <target name="build-own-fake-module-A" unless="module-A-present"/>

          如果沒有if或unless屬性,target總會被執(zhí)行。

          可選的description屬性可用來提供關(guān)于target的一行描述,這些描述可由-projecthelp命令行選項輸出。

          將你的tstamp task在一個所謂的初始化target是很好的做法,其他的target依賴這個初始化target。要確保初始化target是出現(xiàn)在其他target依賴表中的第一個target。在本手冊中大多數(shù)的初始化target的名字是"init"。

          target有下面的屬性:

          Attribute Description Required
          name target的名字 Yes
          depends 用逗號分隔的target的名字列表,也就是依賴表。 No
          if 執(zhí)行target所需要設(shè)定的屬性名。 No
          unless 執(zhí)行target需要清除設(shè)定的屬性名。 No
          description 關(guān)于target功能的簡短描述。 No

          Tasks

          一個task是一段可執(zhí)行的代碼。

          一個task可以有多個屬性(如果你愿意的話,可以將其稱之為變量)。屬性只可能包含對property的引用。這些引用會在task執(zhí)行前被解析。

          下面是Task的一般構(gòu)造形式:

          <name attribute1="value1" attribute2="value2" ... />

          這里name是task的名字,attributeN是屬性名,valueN是屬性值。

          有一套內(nèi)置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。

          所有的task都有一個task名字屬性。Ant用屬性值來產(chǎn)生日志信息。

          可以給task賦一個id屬性:

          <taskname id="taskID" ... />

          這里taskname是task的名字,而taskID是這個task的唯一標識符。通過這個標識符,你可以在腳本中引用相應(yīng)的task。例如,在腳本中你可以這樣:

          <script ... >
          task1.setFoo("bar");
          </script>

          設(shè)定某個task實例的foo屬性。在另一個task中(用java編寫),你可以利用下面的語句存取相應(yīng)的實例。

          project.getReference("task1").

          注意1:如果task1還沒有運行,就不會被生效(例如:不設(shè)定屬性),如果你在隨后配置它,你所作的一切都會被覆蓋。

          注意2:未來的Ant版本可能不會兼容這里所提的屬性,因為很有可能根本沒有task實例,只有proxies。

          Properties

          一個project可以有很多的properties。可以在buildfile中用property task來設(shè)定,或在Ant之外設(shè)定。一個property有一個名字和一個值。property可用于task的屬性值。這是通過將屬性名放在"${"和"}"之間并放在屬性值的位置來實現(xiàn)的。例如如果有一個property builddir的值是"build",這個property就可用于屬性值:${builddir}/classes。這個值就可被解析為build/classes。

          內(nèi)置屬性

          如果你使用了<property> task 定義了所有的系統(tǒng)屬性,Ant允許你使用這些屬性。例如,${os.name}對應(yīng)操作系統(tǒng)的名字。

          要想得到系統(tǒng)屬性的列表可參考the Javadoc of System.getProperties。

          除了Java的系統(tǒng)屬性,Ant還定義了一些自己的內(nèi)置屬性:
          basedir project基目錄的絕對路徑 (與<project>的basedir屬性一樣)。
          ant.file buildfile的絕對路徑。
          ant.version Ant的版本。
          ant.project.name 當前執(zhí)行的project的名字;由<project>的name屬性設(shè)定.
          ant.java.version Ant檢測到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".
          例子:
          <?xml version="1.0" encoding="GB2312"?>

          ?<project name="MyApp" default="compile" basedir=".">
          ?<!--定義你需要的屬性-->
          ? <property environment="env" />
          ? <property name="src" value="WEB-INF/src" />
          ? <property name="classes" value="WEB-INF/classes" />
          ? <property name="lib" value="WEB-INF/lib" />
          ? <property name="dist" value="dist" />
          ?
          ? <path id="task.classpath">
          ??? <pathelement location="${classes}" />
          ??? <pathelement location="${lib}" />
          ???
          ??? <!-- Tomcat 5.0.16 Servlet 2.4 API -->
          ??? <pathelement location="${lib}/servlet-api.jar" />
          ???
          ??? <!-- Tomcat 5.0.16 JSP 2.0 API -->
          ??? <pathelement location="${lib}/jsp-api.jar" />
          ???
          ? </path>
          ?
          <!--定義操作-->?
          ? <target name="init" >
          ??? <echo>初始化完成!</echo>
          ??? <echo>ant home = ${ant.home} </echo>
          ??? <echo>java home = ${java.home} </echo>
          ??? <echo>user home = ${user.home} </echo>???????
          ??? ??
          ? </target>
          ?
          <!--depends定義依賴-->
          ? <target name="compile" depends="init" >
          ??? <javac classpathref="task.classpath" srcdir="${src}" destdir="${classes}" />
          ??? <echo level="verbose">Seen with -verbose</echo>
          ??? <echo level="debug">Seen with -debug</echo>???????
          ??? <echo>編譯完成!</echo>
          ? </target>
          ?
          ? <target name="war" >
          ??? <jar jarfile="${dist}/MyApp.war" basedir="."/>
          ? </target>

          </project>

          Token Filters
          一個project可以有很多tokens,這些tokens在文件拷貝時會被自動擴展,這要求在支持這一行為的task中選擇過濾拷貝功能。這一功能可用filter task在buildfile中設(shè)定。

          既然這很可能是一個有危害的行為,文件中的tokens必須采取@token@的形式,這里token是filter task中設(shè)定的token名。這種token語法與其他build系統(tǒng)執(zhí)行類似filtering的語法相同,而且與大多數(shù)的編程和腳本語言以及文檔系統(tǒng)并不沖突,

          注意:如果在一個文件中發(fā)現(xiàn)了一個@token@形式的token,但沒有filter與這個token關(guān)連,則不會發(fā)生任何事;因此,沒有轉(zhuǎn)義方法-但只要你為token選擇合適的名字,就不會產(chǎn)生問題。

          警告:如果你在拷貝binary文件時打開filtering功能,你有可能破壞文件。這個功能只針對文本文件。

          Path-like Structures
          你可以用":"和";"作為分隔符,指定類似PATH和CLASSPATH的引用。Ant會把分隔符轉(zhuǎn)換為當前系統(tǒng)所用的分隔符。

          當需要指定類似路徑的值時,可以使用嵌套元素。一般的形式是

          <classpath>
          <pathelement path="${classpath}"/>
          <pathelement location="lib/helper.jar"/>
          </classpath>
          location屬性指定了相對于project基目錄的一個文件和目錄,而path屬性接受逗號或分號分隔的一個位置列表。path屬性一般用作預(yù)定義的路徑--其他情況下,應(yīng)該用多個location屬性。

          為簡潔起見,classpath標簽支持自己的path和location屬性。所以:

          <classpath>
          <pathelement path="${classpath}"/>
          </classpath>
          可以被簡寫作:

          <classpath path="${classpath}"/>
          也可通過<fileset>元素指定路徑。構(gòu)成一個fileset的多個文件加入path-like structure的順序是未定的。

          <classpath>
          <pathelement path="${classpath}"/>
          <fileset dir="lib">
          <include name="**/*.jar"/>
          </fileset>
          <pathelement location="classes"/>
          </classpath>
          上面的例子構(gòu)造了一個路徑值包括:${classpath}的路徑,跟著lib目錄下的所有jar文件,接著是classes目錄。

          如果你想在多個task中使用相同的path-like structure,你可以用<path>元素定義他們(與target同級),然后通過id屬性引用--參考Referencs例子。

          path-like structure可能包括對另一個path-like structurede的引用(通過嵌套<path>元素):

          <path id="base.path">
          <pathelement path="${classpath}"/>
          <fileset dir="lib">
          <include name="**/*.jar"/>
          </fileset>
          <pathelement location="classes"/>
          </path>
          <path id="tests.path">
          <path refid="base.path"/>
          <pathelement location="testclasses"/>
          </path>

          前面所提的關(guān)于<classpath>的簡潔寫法對于<path>也是有效的,如:

          <path id="tests.path">
          ? <path refid="base.path"/>
          <pathelement location="testclasses"/>
          </path>
          可寫成:

          <path id="base.path" path="${classpath}"/>
          命令行變量

          有些task可接受參數(shù),并將其傳遞給另一個進程。為了能在變量中包含空格字符,可使用嵌套的arg元素。

          Attribute Description Required
          value 一個命令行變量;可包含空格字符。 只能用一個
          line 空格分隔的命令行變量列表。
          file 作為命令行變量的文件名;會被文件的絕對名替代。
          path 一個作為單個命令行變量的path-like的字符串;或作為分隔符,Ant會將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_的分隔符。

          例子

          <arg value="-l -a"/>
          是一個含有空格的單個的命令行變量。

          <arg line="-l -a"/>
          是兩個空格分隔的命令行變量。

          <arg path="/dir;/dir2:\dir3"/>
          是一個命令行變量,其值在DOS系統(tǒng)上為\dir;\dir2;\dir3;在Unix系統(tǒng)上為/dir:/dir2:/dir3 。

          References

          buildfile元素的id屬性可用來引用這些元素。如果你需要一遍遍的復(fù)制相同的XML代碼塊,這一屬性就很有用--如多次使用<classpath>結(jié)構(gòu)。

          下面的例子:

          <project ... >
          <target ... > ? ?
          <rmic ...> ? ? ?
          <classpath> ? ? ? ?
          <pathelement location="lib/"/> ? ? ? ?
          <pathelement path="${java.class.path}/"/> ? ? ? ?
          <pathelement path="${additional.path}"/> ? ? ?
          </classpath> ? ?
          </rmic> ?
          </target>
          <target ... >
          <javac ...>
          <classpath>
          <pathelement location="lib/"/>
          <pathelement path="${java.class.path}/"/>
          <pathelement path="${additional.path}"/>
          </classpath>
          </javac>
          </target>
          </project>
          可以寫成如下形式:

          <project ... >
          <path id="project.class.path"> ?
          <pathelement location="lib/"/>
          <pathelement path="${java.class.path}/"/> ?
          <pathelement path="${additional.path}"/>
          </path>
          <target ... >
          <rmic ...>
          <classpath refid="project.class.path"/>
          </rmic>
          </target>
          <target ... >
          <javac ...>
          <classpath refid="project.class.path"/>
          </javac>
          </target>
          </project>
          所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受這種類型的引用

          posted @ 2006-07-04 14:44 多力宇揚 閱讀(331) | 評論 (0)編輯 收藏

          JavaServer Pages Standard Tag Libray(1.1),其中文名字為JSP標準標簽函數(shù)庫。JSTL是一個標準的已
          制定好的標簽庫,可以應(yīng)用于各種領(lǐng)域,如:基本輸入輸出,流程控制,循環(huán),XML文件剖析,數(shù)據(jù)庫查
          詢以及國際化和文字格式標準化的應(yīng)用等。JSTL所提供的標簽庫分為以下五大類:
          ?核心標簽庫(Core tag Liabry)
          ?I18N格式標簽庫(I18N-capable formatting tag libary)
          ?SQL標簽庫(SQL tag Libary)
          ?XML標簽庫(XML tag Libary)
          ?函數(shù)標簽庫(Functions tag Libary)

          核心標簽庫(Core tag Liabry)主要有:基本輸入輸出,流程控制,迭代操作和URL操作。
          ?----------------------------------------------------------------------------
          ????? 分類??????????? 功能分類?????????????????標簽分類
          ???????????????????????????????????????????????????????????? out
          ????????????????????????????????????????????????????????????? set
          ???????????????????????? ?表達式操作???????????????????? remove
          ?????????????????????????????????????????????????????????????????? catch
          ??
          ???? Core????????????????????????????????????????????????????? if
          ?????????????????????????????????????????????????????????????????? choose
          ????????????????????????? ?流程控制?????????????????????????? ?when
          ?????????????????????????????????????????????????????????????????????? outherwise

          ??????????????????????????????????????????????????????????????????? forEach
          ??????????????????????????? ? 迭代操作????????????????????? forTokens

          ???????????????????????????????????????????????????????????????????? ? import
          ???????????????????????????????????????????????????????????????????????? ?param
          ????????????????????????????????????????????????????????????????????? ?url
          ?????????????????????????????? ? URL操作????????????????????????? param
          ???????????????????????????????????????????????????????????????????? redirect
          ?????????????????????????????????????????????????????????????????????????? param
          ------------------------------------------------------------------------------------------
          在JSP中使用JSTL中的標簽庫時,必須使用<%@taglib%>指令,并且設(shè)定prefix和uri的值得,通常設(shè)定:
          <%@taglib prefix="c" uri=">
          這樣就可以使用核心標簽庫了。

          .表達式操作
          ?表達式操作分類中包含四個標簽: <c:out>,<c:set>,<c:remove>和<c:catch>
          <c:out>:重要用來顯示數(shù)據(jù)的內(nèi)容,類似與<%=scripting-language%>。它的語法如下:
          語法1: 沒有body內(nèi)容
          <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>

          語法2: 有body內(nèi)容
          <c:out value="value"? [escapeXml="{true|false}"]>
          ? default value
          </c:out>

          Attribute
          -----------------------------------------------------------------------------------------------------------------------
          ?名稱?????????????????? ?? 說明???????????????????????????????????????????????????????????????EL???? 類型???? 必須?????? 默認值
          value????????????????? 需要顯示的值?????????????????????????? ????????????????????????? Y????? Object??? 是????????? 無
          default?????????????? 如果value值為null,則顯示default的值??????????????? ? Y????? Object??? 否????????? 無
          escapeXml??????? 是否轉(zhuǎn)換特殊字符,如: <轉(zhuǎn)換為&It?????????????????Y????? Object??? 否????????? true
          ----------------------------------------------------------------------------------------------------------------------
          Null和錯誤說明
          假若value為null,會顯示default的值;假若沒有設(shè)定default的值,則會顯示一個空的字符串。

          <c:set>:主要用來把變量存儲至JSP范圍或是JavaBean的屬性中。
          語法1: 沒有body
          將value的值存儲至范圍為scope的varName變量之中
          <c:set value="value" var="varName" [scope="{page|request|session|application}"]/>

          語法2: 有body
          將body內(nèi)容存儲至范圍為scope的varName變量之中
          <c:set value="value" [scope="{page|request|session|application}"]>
          ? body.....
          </c:set>

          語法3: 將value的值存儲至target對象屬性中
          <c:set value="value" target="target" property="propertyNmae"/>

          語法4: 將body內(nèi)容的數(shù)據(jù)存儲至target對象屬性中
          <c:set target="target" property="propertyNmae">
          ?body....
          </c:set>

          Attribute
          ----------------------------------------------------------------------------------------
          ?名稱????????????????????說明??????????????????????????????????????????????EL???? 類型????? 必須??????默認值
          value?????????????要被存儲的值????????????????????????????????????? Y????? Object????? 否????????? 無
          var????????????????欲存入的變量名??????????????????????????????????N????? String??????? 否????????? 無
          scope????????????var變量的JSP范圍???????????????????????????????N????? String??????? 否???????? page
          target????????????為一JavaBean或java.util.Map對象????????Y????? Object????? ?否????????? 無
          property????????指定target對象屬性??????????????????????????????Y????? String??????? 否????????? 無
          ------------------------------------------------------------------------------------------
          Null 和 錯誤處理:
          語法3和語法4會產(chǎn)生異常錯誤,有以下兩種情況:
          ?.target 為null
          ?.target 不是java.util.Map或JavaBean對象
          假若value為null時:將由存儲變量改為移除變量
          ?.語法1: 由var和scope所定義的變量,將被移除
          ??? .若scope已指定時,則PageContext.removeAttribute(varName,scope);
          ??? .若scope未指定時,則PageContext.removeAttribute(varName);
          ?.語法3:
          ??? .假若target為Map時,則Map.remove(property);
          ??? .假若target為JavaBean時,propertye指定的屬性為null
          注意: var和scope這兩個屬性不能使用表達式來表示,我們不能寫成 scope="${ourScope}"或var="${a}"

          <c:remove>:主要用來移除變量。
          語法:
          <c:remove var="varName" [scope="{page|request|session|application}"]/>

          Attribute
          ----------------------------------------------------------------------------------------
          ?名稱???????????????? 說明???????????????????????????????????? EL???? 類型???? 必須?????? 默認值
          ?var???????????? 欲移除變量的名稱???????????????????? N????? String???? 是?????????? ?? 無
          ?scope?????????? var變量的JSP范圍????????????????????N????? String???? 否???????????? page
          ----------------------------------------------------------------------------------------
          說明:
          <c:remove>必須要有var屬性,即要被移除的屬性名稱,scope則可有可無,如:
          <c:remove var="username" scope="session"/>
          將username變量從session范圍移除。若我們不設(shè)定scope,則<c:remove>會移除所有范圍名稱為username
          的數(shù)據(jù)。

          <c:catch>:主要用來處理產(chǎn)生錯誤的異常情況,并且將信息保存起來。
          語法:
          <c:catch [var="varName"]>
          ?...欲抓取錯誤的部分...
          </c:catch>

          Attribute
          ----------------------------------------------------------------------------------------
          ?名稱???????????????? 說明?????????????????????????????????????????? EL???? 類型???? 必須?????? 默認值
          ?var?????????? 用來存儲錯誤信息的變量???????????????? N????? String?????? 否????????? 無
          -----------------------------------------------------------------------------------------
          說明:
          <c:catch>主要將可能發(fā)生錯誤的部分放在<c:catch>和</c:catch>之間。如果真的發(fā)生錯誤,可將錯誤
          信息保存至變量varName標量中,如:
          <c:catch var="message">
          ??? //可能發(fā)生錯誤的部分
          </catch>
          另外,當錯誤發(fā)生<c:catch>和</c:catch>之間時,只有<c:catch>和</c:catch>之間的程序會被中止忽
          略,但整個網(wǎng)頁不會被中止。

          流程控制
          流程控制分類中包含四個標簽:<c:if>,<c:choose>,<c:when>和<c:otherwise>。

          <c:if>:的用途和我們在一般程序中寫的if一樣。
          語法:
          語法1:沒有body
          <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

          語法2: 有body
          <c:if test="testCondition" [var="varName"] [scope="{page|request|session|appliation}"]>
          ? ...body....
          </c:if>

          Attribute
          ------------------------------------------------------------------------------------------------------------------------
          ?名稱?????????????????????????? 說明?????????????????????????????????????????????????????????????????????????? EL???? 類型???? ? ?必須?????? 默認值
          test?????????????????? 如果表達式的結(jié)果為true則執(zhí)行body,false則相反????????????? Y????? boolean????? ?是????????? ?無
          var????????????????? ?用來存儲test運算后的結(jié)果,即true或false?????????????????????? ?? ?N?????String?????? ?? 否???????? ? 無
          scope?????????????? var變量的JSP范圍????????????????????????????????????????????????????????????????? N?????String???????? ?否??????? ? page
          ------------------------------------------------------------------------------------------------------------------------
          說明:
          <c:if>標簽必須要有test屬性,body里除了能是靜態(tài)文本之外可以是任何JSP代碼,標簽或HTML代碼。

          <c:choose>:本身只當作<c:when>和<c:otherwise>的父標簽。
          語法:
          <c:choose>
          ? body(<when>和<otherwise>)
          </c:choose>
          限制:
          <c:choose>的本地內(nèi)容只能有:
          ?.空白
          ?.1或多個<c:when>
          ?.0或多個<c:otherwise>
          如:
          <c:choose>

          ?<c:when test="${condition1}">
          ?? condition1 為 true
          ?</c:when>

          ?<c:when test="${condition2}">
          ?? condition2 為 true
          ?</c:when>

          ?<c:otherwise>
          ?? condition1和conditon2都為false
          ?</<c:otherwise >
          ?
          </c:choose>
          說明:
          在同一個<c:choose>中,假如所有的<c:when>的test都不為true時,則執(zhí)行<c:otherwise>的本體內(nèi)容。
          在同一個<c:choose>中,假若有好幾個<c:when>都會true時,只能有一個<c:when>成立。

          迭代操作
          迭代(Iterator)操作主要包含兩個標簽: <c:forEach>和<c:forTokens>。

          <c:forEach>為循環(huán)控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運做方式為當條件符合
          時,就會持續(xù)重復(fù)執(zhí)行<c:forEach>的body內(nèi)容。
          語法:
          語法1: 迭代一集合對象之所有成員
          <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
          ?????????? [begin="begin"] [end="end"] [step="step"]>
          ?...body內(nèi)容.....
          <c:forEach>

          語法2: 迭代指定的次數(shù)
          <c:forEach [var="varName"] [varStatus="varStatusName"]
          ?????????? begin="begin" end="end" [step="step"]>
          ?...body內(nèi)容.....
          <c:forEach>

          Attribute
          --------------------------------------------------------------------------------------------------------------------------
          ?名稱???????????????? 說明??????????????????????????????????? ?????????????? EL???? 類型??????? ? ?? 必須?????? 默認值
          ?var????????? 用來存放現(xiàn)在指到的成員????????????????????????? N????? String????????????? ?否????????? ?無

          ???????????????????????????????????????????????????????????????????????????????????????????????Arrays
          ????????????????????????????????????????????????????????????????????????????????????????????? Collection
          ???????????????????????????????????????????????????????????????????????????????????????????????Iterator?????????? ? 否????????? ?無
          items???????? 被迭代的集合對象??????????????????????????????????? Y?????? ?Enumeration????????????
          ?????????????????????????????????????????????????????????????????????????????????????????????? Map
          ????????????????????????????????????????????????????????????????????????????????????????????????String

          varStatus???? 用來存放到指到的相關(guān)成員信息??????????N?????? ?String???????????? ? 否?????????? 無
          begin?????????? 開始的位置?????????????????????????????????????????? ? Y???????? ?int???????????????? ? ?否????????? ?0
          end?????????? ?? 結(jié)束的位置???????????????????????????????????????????? Y???????? ?int????????????????? ?否????????? ?最后一個成員
          setp???????????? 每次迭代的間隔數(shù)???????????????????????????????? Y???????? ?int??????????????? ? ?否?????????? ?1
          -------------------------------------------------------------------------------------------------------------------------
          Null 和 錯誤處理
          .假若items為null時,則表示為一空的集合對象
          .假若begin大于或等于items時,則迭代不運算
          注意:
          varName的范圍只存在<c:forEach>的本體中,如果超出了本題,則不能取得varName的值。如:
          <c:forEach items="${atts}" var="item">
          </c:forEach>
          ${item}</br>
          ${item}則不會顯示item的內(nèi)容。<c:forEach>除了支持數(shù)組之外,還有標準的J2SE的結(jié)合類型,例如:
          ArrayList,List,LinkedList,Vector,Stack和Set等等;另外包括java.util.Map類的對象,例如:
          HashMap,Hashtable,Properties,Provider和Attributes。

          另外<c:forEach>還提供了varStatus屬性,主要用來存放現(xiàn)在指到成員的相關(guān)信息。例如:我們寫成
          varStatus="s",那么就會把信息存放到名稱為s的屬性當中。varStatus屬性還提供另外四個屬性:index,
          count,fist和last,它們個自的意義如下:
          ------------------------------------------------------------------------------------------
          ?? 屬性??????????????????? 類型?????????????????????????????????? 意義
          ?? index?????????????????? number????????????????????? 現(xiàn)在指到成員的索引
          ?? count?????????????????? number????????????????????? 總共指到成員的總和
          ?? first?????????????????? ? boolean???????????????????? 現(xiàn)在指到成員是否為第一個
          ?? last??????????????????? ?boolean???????????????????? 現(xiàn)在指到成員是否為最后一個
          -------------------------------------------------------------------------------------------
          如下例子:
          <
          %@page contentType="text/html;charset=gb2312"%>
          <%@taglib prefix="c" uri=">
          <%
          ?String atts[] = new String[5];
          ?atts[0]="hello";
          ?atts[1]="this";
          ?atts[2]="is";
          ?atts[3]="a";
          ?atts[4]="girl";
          ?request.setAttritue("atts",atts);
          %>
          <c:forEach items="${atts}" var="item" varStatus="s">
          <h2><c:out value="${item}"/>的四種屬性></h2>
          ?index: ${s.index}</br>
          ?count: ${s.count}</br>
          ?first: ${s.first}</br>
          ?last:? ${s.last}</br>
          </c:forEach>

          <c:forTokens>
          <c:forTokens>:用來瀏覽一字符串中所有的成員,起成員是由定義符號(delimiters)所分隔的。
          語法:
          <c:forTokens items="stringFoTokens" delims="delimmmmiters" [var="varName"]
          ???????????? [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
          ?...body內(nèi)容....
          </c:forTokens>

          Attribute
          --------------------------------------------------------------------------------------------------------------------
          ?名稱?????????????????????????????? ???? 說明????????????????????????????????????????????? ?EL???? 類型????? 必須?????? 默認值
          ?var???????????????? ? 用來存放現(xiàn)在指到的成員???????????????????????????? ?? Y????? String????? ?否????????? 無
          ?items??????????????? 被迭代的字符串????????????????????????????????????????????? ? Y????? String?????? 是????????? 無
          ?delims??????????? ? 定義用來分割字符串的字符????????????????????????? ? N????? String????? ?是????????? 無
          ?varStatus??????????用來存放現(xiàn)在指到的相關(guān)成員信息????????????? ? N????? String???? ? 否????????? 無
          ?begin????????????? ?開始的位置?????????????????????????????????????????????????????? ? Y?????? int???????? ? 否????????? ?0
          ?end??????????????? ?結(jié)束的位置????????????????????????????????????????????????????????? Y?????? int????????? 否?????????? 最后一個成員
          ?step???????????? ?? 每次迭代間隔數(shù)??????????????????????????????????????????????? ? Y?????? int?????????? 否?????????? 1
          ---------------------------------------------------------------------------------------------------------------------
          限制:
          .假若有begin屬性時,begin必須大于等于0
          .假若有end屬性時,必須大于begin
          .假若有step屬性時,step必須大于等于1

          Null 和 錯誤處理
          .假如itmes為null時,則表示為有空的集合對象
          .假若begin大于等于items的大小時,則迭代不運算

          例子:
          <c:forToken items="A,B,C,D,E,F,G" delims="," var="item>
          ${item}
          </c:forToken>
          items屬性也可以用EL,例如:
          <%
          ?String phonenumber="123-456-7899";
          ?request.setAttribute("userPhone",phonenumber);
          %>
          <c:forTokens items="${userPhone}" delims="-" var="item">
          ${item}
          </c:forTokens>

          URL操作
          JSTL包含三個URL操作有關(guān)的標簽,分別是: <c:import>,<c:redirect>和<c:url>。它們的主要功能是:
          用來將其他文件的內(nèi)容包含起來,網(wǎng)頁的向?qū)В€有url的產(chǎn)生。

          posted @ 2006-07-04 13:47 多力宇揚 閱讀(589) | 評論 (0)編輯 收藏

          應(yīng)聘Java筆試時可能出現(xiàn)問題
          Java基礎(chǔ)方面:
          1、作用域public,private,protected,以及不寫時的區(qū)別
          Public、Protected、Private是成員訪問修飾符;
          final、abstract、transient、synchronized、native、strictfp是非訪問成員修飾符。
          可見性PublicProtectedDefaultPrivate
          同一個類是是是是
          同一個包中的類是是是否
          同一個包中的子類是是是否
          同一包外的子類是是否否
          同一包外的非子類是否否否

          Java的基本包
          java.lang 其中包含有:
          接口:Comparable、Cloneable、Runable等
          類:八個基本數(shù)據(jù)類型封裝類、Math、Runtime、Object、String、StringBuffer、Thread、Exception等

          集合框架
          集合是將多個元素組成一個單元的對象。集合用于存儲、檢索和操縱數(shù)據(jù)。
          集合框架提供管理對象集合的接口和類。它包含幾個組件,接口是表示集合的抽象數(shù)據(jù)類型,用于操縱集合;類是用于存儲集合的實際數(shù)據(jù)對象;算法是用于操縱集合的。

          2、ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別
          答:就ArrayList與Vector主要從二方面來說.
          一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
          二.數(shù)據(jù)增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半

          ArrayList,Vector, LinkedList的存儲性能和特性
          ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。

          就HashMap與HashTable主要從三方面來說.
          一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一實現(xiàn)
          二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
          三.值:只有HashMap允許在一個集合中有一個null鍵和在一個集合中有多個null值

          Hashtable是HashMap的同步版本;HashMap允許有null值和一個null鍵,但是,Hashtable不允許有任何內(nèi)容為null

          Hashtable類的對象必須覆蓋Object類的hashCode()和equals()方法

          關(guān)于其他集合類型:
          一.ArrayList 提供快速遍歷和快速訪問。現(xiàn)在設(shè)計了新的 RandomAccess 接口,它指出這種列表支持快速隨機訪問。Vector也實現(xiàn)了RandomAccess 接口。
          二.遍歷HashSet與HashMap時,其順序是未知的(但添加刪除快)。LinkedHashSet和LinkedHashSet是按照元素的插入的順序遍歷的(遍歷快)。
          三.TreeSet和TreeMap將保證元素按照元素的自然順序進行排列。也可以使用一個用戶自己實現(xiàn)的比較規(guī)則。
          四、HashSet有一個散列表支持它。它為基本操作提供固定時間性能。TreeSet它確保了排序集將按元素升序,根據(jù)自然順序排序。

          Dictionary類
          主要用于將關(guān)鍵字轉(zhuǎn)換成值,該類接收一個關(guān)鍵字并返回一個值。Dictionary是一個抽象類,它是H
          Hashtable的超類。
          Properties類
          擴展了Hashtable類,但Properties對象的關(guān)鍵字和值必須是String類型,并能將對象寫入一個輸出流并保存在一個文件中,然后可以把它讀回一個輸入流。


          如果需要維護和搜索一個部件列表,它們由唯一的字母數(shù)字序列號標示,其中的部件是Part類型,這時應(yīng)該使用哪種集合?如果我們改變需求,你也需要能夠按順序、按它們的序列號打印出部件?
          1、應(yīng)該選擇HashMap
          2、應(yīng)該選擇TreeMap

          3、char型變量中能不能存貯一個中文漢字?為什么?
          答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節(jié),所以放一個中文是沒問題的

          4、多線程有幾種實現(xiàn)方法,都是什么?同步有幾種實現(xiàn)方法,都是什么?
          答:多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口
          同步的實現(xiàn)方面有兩種,分別是synchronized,wait與notify

          GC是什么? 為什么要有GC?
          GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。

          7、垃圾回收機制,如何優(yōu)化程序?
          當一個對象失去引用或者離開了作用域后,就成為垃圾而被Java運行環(huán)境自動清除,清除垃圾就是清除這些對象。
          Java垃圾回收機制的特點是:
          1、垃圾回收機制自動運行。系統(tǒng)提供一個低優(yōu)先級的線程來跟蹤內(nèi)存的分配情況。如果發(fā)現(xiàn)某個內(nèi)存單元不再使用,就清除它。
          2、何時清除垃圾是不可預(yù)期的。
          3、垃圾回收機制隨JVM的不同而不同。

          Java的垃圾搜索器為內(nèi)存管理器提供一種自動解決方案。缺點是不能完全控制它什么時候執(zhí)行以及什么時候不執(zhí)行。
          當垃圾搜集器運行時,其目的是查找和刪除不能被訪問的對象。
          垃圾搜集器受JVM控制,JVM決定什么時候運行垃圾搜集器。從Java程序內(nèi)可以請求JVM運行垃圾搜集器,但是,在任何情況下都無法保證JVM會答應(yīng)你的請求。JVM通常會在它感到內(nèi)存減少時運行垃圾搜集器。
          垃圾收集器運行時,當它發(fā)現(xiàn)一個對象不能被任何活線程訪問時,它將認為該對象符合刪除條件,它可能在某時刪除該對象。
          垃圾收集器不能保證有足夠的內(nèi)存,它只能保證可以使用的內(nèi)存將盡可能被有效的管理。
          使對象符合垃圾搜集器搜索條件的情況有:出現(xiàn)空引用、重新為引用變量賦值、隔離引用。

          強制執(zhí)行垃圾搜集:
          Runtime對象為直接與虛擬機通信提供一種機制。System類可以調(diào)用與其相同的方法。
          請求垃圾收集器的最簡單的方法是:System.gc();

          Javac編譯選項?
          G產(chǎn)生調(diào)試信息
          g:none不產(chǎn)生調(diào)試信息
          verbose輸出編譯器消息,可以知道程序編譯時用到了哪些Java類
          Noware編譯時不產(chǎn)生警告信息
          encoding指出原文件的編碼方式
          D指定類文件產(chǎn)生的目錄
          classPath指出用戶class文件的路徑
          sourcePath指出用戶源文件路徑

          9、介紹JAVA中的Collection FrameWork(包括如何寫自己的數(shù)據(jù)結(jié)構(gòu))?
          答:Collection FrameWork如下:
          核心接口有:
          CollectionSetSorted Set
          ListMapSorted Map

          Set接口:不允許重復(fù)的元素。它對add、equals、hashCode方法增加了限制
          SortedSet接口:擴展了Set接口,此接口的元素按升序排序。
          List接口:一些集合具有順序,即在一個項目后添加另一個項目。列表可以有重復(fù)元素。提供了ListIterator,允許向前或向后移動元素。
          Map接口:將鍵映射到值得對象。Map不能包含重復(fù)鍵,但可以包含重復(fù)值。每個鍵最多都只能映射到一個值。

          核心設(shè)計類:
          Map 設(shè)計Set 設(shè)計List 設(shè)計
          HashMapHashSetArrayList
          HashtableLinkedHashSetVector
          TreeMapTreeSetLinkedLisk
          LinkedHasMap

          散列表是最快的數(shù)據(jù)存儲結(jié)構(gòu),它是一個數(shù)組。數(shù)據(jù)存儲在數(shù)組中散列函數(shù)指定的特定下標。散列函數(shù)是一組輸入數(shù)據(jù)和一組整數(shù)之間的映射。

          集合類和接口層次

          Collections是一個類,帶有用于處理集合的靜態(tài)實用方法
          Collection是一個接口,帶有多數(shù)集合常用的方法聲明,包括add、remove、contains、size、iterator

          Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)
          Map提供key到value的映射

          集合框架的優(yōu)點:
          提供一組可用的集合接口,可以方便地擴展或改寫集合;
          接口和算法的可重用性提高了軟件的可重用性;
          提供了有效的數(shù)據(jù)結(jié)構(gòu)和算法,減少了編程工作。

          10、Java中異常處理機制,事件機制?
          事件代表了組件之間的交互。是一種在源對象和監(jiān)聽對象之間,某種狀態(tài)發(fā)生變化的傳遞機制。
          通過事件處理機制,可以讓一些組件作為事件源,發(fā)出可被組件環(huán)境或其它組件接收的事件。這樣,不同的組件就可以組合在一起,組件之間通過事件傳遞進行通信,構(gòu)成一個應(yīng)用。
          在java中實現(xiàn)事件機制的事件模型由三個部分構(gòu)成:一個事件對象用于描述事件源的狀態(tài)變化;一個事件源將會產(chǎn)生事件,提供注冊的事件監(jiān)聽器的方法,把事件發(fā)送到監(jiān)聽器;事件監(jiān)聽器接收事件通知,實現(xiàn)該事件的監(jiān)聽器接口。

          異常實際上是程序中錯誤導(dǎo)致中斷了正常的指令流的一種事件.
          Java異常處理用于在方法中能檢查出錯誤但不能處理錯誤的情況,在這樣的方法中將拋出一個異常。如果一個異常與某個catch程序塊中的參數(shù)匹配,那么就執(zhí)行該catch塊中的代碼。指出try catch finally的工作順序。

          運行時異常與一般異常有何異同?
          異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。

          事件有哪些?

          什么是斷言機制?
          斷言從JDK1.4版開始引入,它讓開發(fā)期間測試假設(shè),而沒有付出為異常編寫異常處理程序方面的代價,一旦程序完成開發(fā),并全部部署,假設(shè)將從不會發(fā)生。
          主要作用:因為在開發(fā)時對自己的假設(shè)非常肯定,所以不想花費時間來編寫異常處理代碼。斷言讓在開發(fā)期間測試你的假設(shè)。
          private void method(int num){
          assert(num>=0);//這里假定參數(shù)num是正數(shù),如果不是真的將拋出一個AssertionError錯誤
          useNum(num+x);
          }
          斷言有兩種形式:簡單和非常簡單。
          非常簡單:
          private void doStuff(){
          assert(y>x);
          //其他代碼
          }
          簡單:
          將通過表達式的值向錯誤跟蹤棧中添加更多信息,提供了更多調(diào)式幫助信息。
          private void doStuff(){
          assert(y>x):”y is ”+y+” x is”+x;
          //其他代碼
          }
          運行時啟用斷言:
          java –ea com.geeksanonymous.TestClass

          運行時禁用斷言:
          java –da com.geeksanonymous.TestClass

          11、JAVA中的多形與繼承?
          希望大家補上,謝謝

          對象是定義了邊界的、與要解決的問題有關(guān)的概念或事物。它們用于幫助理解現(xiàn)實世界。
          類是擁有相同特性、共同的行為和共同的關(guān)系的一組對象。
          封裝是讓開發(fā)者有選擇地隱藏類中的特性和方法的過程
          繼承是允許通過重用現(xiàn)有類來構(gòu)建新類的特性。]
          多態(tài)性使用同一函數(shù)在不同的類上具有不同的行為。Java中的多態(tài)性是通過方法的動態(tài)綁定實現(xiàn)的。

          12、抽象類與接口?
          答:抽象類與接口都用于抽象,但是抽象類(JAVA中)可以有自己的部分實現(xiàn),而接口則完全是一個標識(同時有多重繼承的功能)。

          abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized? 都不能

          接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class)?
          接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類可繼承實體類,但前提是實體類必須有明確的構(gòu)造函數(shù)。

          Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類,是否可以implements(實現(xiàn))interface(接口)?
          可以繼承其他類或完成其他接口,在swing編程中常用此方式。

          IO流
          字節(jié)流:數(shù)據(jù)在存儲時與傳輸時都是以字節(jié)為單位進行的。通常用于讀寫二進制數(shù)據(jù),如圖像和聲音文件。
          字符流:數(shù)據(jù)在存儲與傳輸時都是以字符為單位進行的。

          流:對數(shù)據(jù)源的一種抽象,其目的是想用統(tǒng)一的方式訪問各種不同的數(shù)據(jù)源(文件、網(wǎng)絡(luò)、內(nèi)存的緩沖區(qū))

          文件讀寫的基本類:File類提供定位本地文件系統(tǒng),描述文件和目錄的功能。

          管道流用于在線程之間通信:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
          線程1àPipedOutputStreamàPipedInputStreamà線程2

          鍵盤輸入:
          try{
          BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
          String s=br.readLine();
          System.out.println(s);
          }catch(Exception e){
          }

          文件輸入輸出:
          try{
          File f=new File("test.txt");
          FileOutputStream fout=new FileOutputStream(f);
          fout.write(System.in.read());
          fout.close();
          FileInputStream fin=new FileInputStream(f);
          int size=fin.available();
          for(int i=0;i<size;i++){
          System.out.print((char)fin.read());
          }
          fin.close();
          }catch(Exception e){
          }

          通過網(wǎng)絡(luò)傳輸文件:
          客戶端:
          File f=new File("bk.exe");
          FileInputStream fin=new FileInputStream(f);
          Socket st=new Socket("localhost",6000);
          BufferedOutputStream bout=new BufferedOutputStream(st.getOutputStream());
          int size=fin.available();
          for(int i=0;i<size;i++){
          bout.write(fin.read());
          }
          服務(wù)器端:
          ServerSocket server=new ServerSocket(6000);
          Socket st=server.accept();
          File f=new File("kk.exe");
          BufferedInputStream bin=new BufferedInputStream(st.getInputStream());
          FileOutputStream fout=new FileOutputStream(f);
          int i=0;
          while(i!=-1){
          i=bin.read();
          fout.write(i);
          }

          串行化的注意事項以及如何實現(xiàn)串行化
          對象的壽命通常隨著生成該對象的程序的終止而終止。有時候,可能需要將對象的狀態(tài)保存下來,在需要時再將對象恢復(fù)。我們把對象的這種能記錄自己的狀態(tài)以便將來再生的能力,叫做對象的持續(xù)性(persistence)。對象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己,這個過程叫對象的串行化(Serialization)。
          序列化的過程就是對象寫入字節(jié)流和從字節(jié)流中讀取對象。將對象狀態(tài)轉(zhuǎn)換成字節(jié)流之后,可以用java.io包中的各種字節(jié)流類將其保存到文件中,管道到另一線程中或通過網(wǎng)絡(luò)連接將對象數(shù)據(jù)發(fā)送到另一主機。
          一:對象序列化可以實現(xiàn)分布式對象。
          二:java對象序列化不僅保留一個對象的數(shù)據(jù),而且遞歸保存對象引用的每個對象的數(shù)據(jù)。
          // 序列化 today's date 到一個文件中.
          ?? FileOutputStream f = new FileOutputStream("tmp");
          ?? ObjectOutputStream s = new ObjectOutputStream(f);
          ?? s.writeObject("Today");
          ?? s.writeObject(new Date());
          ?? s.flush();
          //從文件中反序列化 string 對象和 date 對象
          ?? FileInputStream in = new FileInputStream("tmp");
          ?? ObjectInputStream s = new ObjectInputStream(in);
          ?? String today = (String)s.readObject();
          ?? Date date = (Date)s.readObject();
          記住,對象流不序列化static或transient。
          序列化通常可以自動完成,但有時可能要對這個過程進行控制。java可以將類聲明為serializable,但仍可手工控制聲明為static或transient的數(shù)據(jù)成員。
          如果一個類要完全負責自己的序列化,則實現(xiàn)Externalizable接口而不是Serializable接口。Externalizable接口定義包括兩個方法writeExternal()與readExternal()。利用這些方法可以控制對象數(shù)據(jù)成員如何寫入字節(jié)流

          NIO的特征
          l舊的I/O是以字節(jié)為單位進行讀寫的,而新的I/O是以塊為單位進行讀寫的
          l以新的Channel抽象類來配合節(jié)點類
          l使用Buffer的概念來進行基本數(shù)據(jù)類型的存取
          l增加更多字節(jié)編碼的支持
          l內(nèi)存映像及數(shù)據(jù)鎖定的支持
          l提供非阻塞的存取機制
          l提供正則表達式式的驗證機制


          import java.io.*;
          import java.nio.*;
          import java.nio.channels.*;
          import java.nio.channels.spi.*;
          import java.net.*;
          import java.util.*;

          class NBTest {
          NBTest(){}
          public void startServer() throws Exception{
          int channels = 0;
          int nKeys = 0;
          int currentSelector = 0;
          Selector selector = Selector.open();

          //建立Channel 并綁定到9000端口
          ServerSocketChannel ssc = ServerSocketChannel.open();
          InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
          ssc.socket().bind(address);

          //使設(shè)定non-blocking的方式。
          ssc.configureBlocking(false);

          //向Selector注冊Channel及我們有興趣的事件
          SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);
          printKeyInfo(s);

          while(true) //不斷的輪詢
          {
          debug("NBTest: Starting select");
          //Selector通過select方法通知我們我們感興趣的事件發(fā)生了。
          nKeys = selector.select();
          //如果有我們注冊的事情發(fā)生了,它的傳回值就會大于0
          if(nKeys > 0){
          debug("NBTest: Number of keys after select operation: " +nKeys);
          //Selector傳回一組SelectionKeys
          //我們從這些key中的channel()方法中取得我們剛剛注冊的channel。
          Set selectedKeys = selector.selectedKeys();
          Iterator i = selectedKeys.iterator();
          while(i.hasNext()){
          s = (SelectionKey) i.next();
          printKeyInfo(s);
          debug("NBTest: Nr Keys in selector: " +selector.keys().size());

          //一個key被處理完成后,就都被從就緒關(guān)鍵字(ready keys)列表中除去
          i.remove();
          if(s.isAcceptable()){
          // 從channel()中取得我們剛剛注冊的channel。
          Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
          SocketChannel sc = socket.getChannel();
          sc.configureBlocking(false);
          sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
          System.out.println(++channels);
          }else{
          debug("NBTest: Channel not acceptable");
          }
          }
          }else{
          debug("NBTest: Select finished without any keys.");
          }
          }
          }

          private static void debug(String s){
          System.out.println(s);
          }

          private static void printKeyInfo(SelectionKey sk)
          {
          String s = new String();
          s = "Att: " + (sk.attachment() == null ? "no" : "yes");
          s += ", Read: " + sk.isReadable();
          s += ", Acpt: " + sk.isAcceptable();
          s += ", Cnct: " + sk.isConnectable();
          s += ", Wrt: " + sk.isWritable();
          s += ", Valid: " + sk.isValid();
          s += ", Ops: " + sk.interestOps();
          debug(s);
          }

          public static void main (String args[])
          {
          NBTest nbTest = new NBTest();
          try{
          nbTest.startServer();
          }catch(Exception e){
          e.printStackTrace();
          }
          }
          }

          Socket通信(TCP、UDP區(qū)別及Java實現(xiàn)方式)
          套接字是一種進程間的數(shù)據(jù)交換機制。客戶端和服務(wù)器通過套接字建立連接和進行通信。套接字是由IP地址、傳輸協(xié)議和一個端口號三部分組成的。
          TCP/IP協(xié)議:其中TCP 為傳輸控制協(xié)議是傳輸層協(xié)議,
          功能TCPUDP
          數(shù)據(jù)傳輸連續(xù)的有序數(shù)據(jù)流消息傳輸
          多路功能接收主機根據(jù)端口號決定數(shù)據(jù)流向那個應(yīng)用相同
          可靠傳輸使用TCP頭部的序列與確認字段進行數(shù)據(jù)確認無
          流量控制使用窗口機制的流量控制無
          連接使用3次握手建立連接;連接后一直保持連接直到終止連接無連接

          URL的組件:協(xié)議、IP地址或主機名、端口號和實際文件路徑

          import java.net.*;
          import java.io.*;

          public class DatagramServer{
          public static DatagramSocket ds;
          public static int clientport=1089,serverport=1090;
          public static void main(String args[]) throws Exception{
          byte buffer[]=new byte[1024];
          ds=new DatagramSocket(serverport);
          BufferedReader dis=new BufferedReader(new InputStreamReader(System.in));
          System.out.println("服務(wù)器正等待輸入");
          InetAddress ia=InetAddress.getByName("localhost");
          while(true){
          String str=dis.readLine();
          if(str==null||str.equals("end")){
          break;
          }
          buffer=str.getBytes();
          ds.send(new DatagramPacket(buffer,str.length(),ia,clientport));
          }
          }
          }

          import java.net.*;
          import java.io.*;

          public class DatagramClient{
          public static DatagramSocket ds;
          public static byte buffer[]=new byte[1024];
          public static int clientport=1089,serverport=1090;
          public static void main(String args[]) throws Exception{
          ds=new DatagramSocket(clientport);
          System.out.println("客戶端正在等待服務(wù)器發(fā)送數(shù)據(jù)");
          while(true){
          DatagramPacket p=new DatagramPacket(buffer,buffer.length);
          ds.receive(p);
          String psx=new String(p.getData(),0,p.getLength());
          System.out.println(psx);
          }
          }
          }

          13、Java 的通信編程,編程題(或問答),用JAVA SOCKET編程,讀服務(wù)器幾個字符,再寫入本地顯示?
          答:Server端程序:
          package test;
          import java.net.*;
          import java.io.*;

          public class Server {
          private ServerSocket ss;
          private Socket socket;
          private BufferedReader in;
          private PrintWriter out;
          public Server() {
          try {
          ss=new ServerSocket(10000);
          while(true) {
          socket = ss.accept();
          String RemoteIP = socket.getInetAddress().getHostAddress();
          String RemotePort = ":"+socket.getLocalPort();
          System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          String line = in.readLine();
          System.out.println("Cleint send is :" + line);
          out = new PrintWriter(socket.getOutputStream(),true);
          out.println("Your Message Received!");
          out.close();
          in.close();
          socket.close();
          }
          }catch (IOException e) {
          out.println("wrong");
          }
          }
          public static void main(String[] args) {
          new Server();
          }
          };

          Client端程序:
          package test;
          import java.io.*;
          import java.net.*;

          public class Client {
          Socket socket;
          BufferedReader in;
          PrintWriter out;
          public Client() {
          try {
          System.out.println("Try to Connect to 127.0.0.1:10000");
          socket = new Socket("127.0.0.1",10000);
          System.out.println("The Server Connected!");
          System.out.println("Please enter some Character:");
          BufferedReader line = new BufferedReader(new

          InputStreamReader(System.in));
          out = new PrintWriter(socket.getOutputStream(),true);
          out.println(line.readLine());
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          System.out.println(in.readLine());
          out.close();
          in.close();
          socket.close();
          }catch(IOException e) {
          out.println("Wrong");
          }
          }
          public static void main(String[] args) {
          new Client();
          }
          };

          常見排序法:
          public class Sort{
          public static int count=0;
          public boolean LT(int num1,int num2){
          return num1<num2;
          }
          public void output(int[] array){
          System.out.print("第"+count+"次排序:");
          for(int i=0;i<array.length;i++)
          System.out.print(array[i]+"??? ");
          System.out.println();
          }

          //冒泡排序法
          public void BubbleSort(int[] array){
          boolean swap=true;
          int index=0;

          int i=0;
          while(i<array.length-1){
          int temp=array[i];
          for(int j=i;j<array.length;j++){
          if(!LT(array[i],array[j])){
          int temp2=array[i];
          array[i]=array[j];
          array[j]=temp2;
          swap=true;
          index=j;
          }else{
          swap=false;
          }
          }
          i++;
          if(swap){
          array[i]=array[index];
          array[index]=temp;
          i++;
          }
          output(array);
          }
          }

          //直接插入排序法
          public void InsertSort(int[] array){
          for(int i=1;i<array.length;++i){
          if (LT(array[i],array[i-1])){
          int temp=array[i];
          array[i]=array[i-1];
          array[i-1]=temp;
          for(int j=i-1;j>0;--j){
          if(LT(array[j],array[j-1])){
          array[j]=array[j-1];
          array[j-1]=temp;
          }else{
          break;
          }
          }
          output(array);
          }
          }
          }

          //快速排序法
          private int Partition(int array[],int low,int high){
          int temp=array[low];
          int pivotkey=array[low];
          while(low<high){
          while(low<high&&array[high]>pivotkey)--high;
          array[low]=array[high];
          while(low<high&&array[low]<=pivotkey)++low;
          array[high]=array[low];
          }
          array[low]=temp;
          output(array);
          return low;
          }

          public void QSort(int array[],int low,int high){
          if(low<high){
          int pivotloc=Partition(array,low,high);
          QSort(array,low,pivotloc-1);
          QSort(array,pivotloc+1,high);
          }
          }

          void QuickSort(int array[]){
          QSort(array,0,array.length-1);
          }
          public static void main(String args[]){
          int array[]={49,38,65,97,76,13,27,49};
          Sort sort=new Sort();

          System.out.println("===================================");
          sort.output(array);
          System.out.println("優(yōu)化冒泡排序法");
          sort.BubbleSort(array);

          System.out.println();
          System.out.println("===================================");
          array=new int[]{49,38,65,97,76,13,27,49};
          sort.output(array);
          System.out.println("直接插入排序法");
          sort.InsertSort(array);

          System.out.println();
          System.out.println("===================================");
          array=new int[]{49,38,65,97,76,13,27,49};
          sort.output(array);
          System.out.println("快速排序法");
          sort.QuickSort(array);
          }
          }

          14、如在COLLECTION框架中,實現(xiàn)比較要實現(xiàn)什么樣的接口?
          Collection框架中實現(xiàn)比較要實現(xiàn)Comparable 接口和 Comparator 接口

          什么是線程?
          線程與進程相似,是一段完成某個特定功能的代碼,是程序中單個順序的流控制;但與進程不同的是,同類的多個線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源,而線程本身的數(shù)據(jù)通常只有微處理器的寄存器數(shù)據(jù),以及一個供程序執(zhí)行時使用的堆棧。所以系統(tǒng)在產(chǎn)生一個線程,或者在各個線程之間切換時,負擔要比進程小的多,正因如此,線程被稱為輕負荷進程(light-weight process)。一個進程中可以包含多個線程。

            一個線程是一個程序內(nèi)部的順序控制流。
            1. 進程:每個進程都有獨立的代碼和數(shù)據(jù)空間(進程上下文) ,進程切換的開銷大。
            2. 線程:輕量的進程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC),線程切換的開銷小。
            3. 多進程:在操作系統(tǒng)中,能同時運行多個任務(wù)程序。
          4. 多線程:在同一應(yīng)用程序中,有多個順序流同時執(zhí)行。

          同步和異步有和異同,在什么情況下分別使用他們?
          臨界資源問題
          線程都是獨立的,而且異步執(zhí)行,也就是說每個線程都包含了運行時所需要的數(shù)據(jù)或方法,而不需要外部的資源或方法,也不必關(guān)心其它線程的狀態(tài)或行為。但是經(jīng)常有一些同時運行的線程需要共享數(shù)據(jù),此時就需考慮其他線程的狀態(tài)和行為,否則就不能保證程序的運行結(jié)果的正確性。
          我們需要做的是允許一個線程徹底完成其任務(wù)后,再允許下一個線程執(zhí)行。必須保證一個共享的資源一次只能被一個線程使用。實現(xiàn)此目的的過程稱為同步。
          同步是用于確保資源一次只能被一個線程使用的過程。
          同步對于單線程程序沒有任何好處。使用同步比非同步的性能差三到四倍。

          線程方法介紹:
          構(gòu)造函數(shù):
          Thread()
          Thread(Runable target)
          Thread(Runable target,String name)
          Thread(ThreadGroup group,Runable target)
          Thread(ThreadGroup group,Runable target,String name)
          Thread(ThreadGroup group,String name)

          用于完成一個線程“實際功能”的代碼放在run方法中。Run方法可以在Thread的子類中重寫,也可以在Runable對象中重寫。

          一旦線程死去,它就永遠不能再重新啟動,否則會拋出異常。用start方法啟動一個已經(jīng)啟動的線程也會拋出異常。

          isAlive、interrupt、Thread.currentThread、suspend、resume、stop

          Sleep方法可以使低優(yōu)先級的線程得到執(zhí)行的機會,Yield方法只能使同優(yōu)先級的線程有執(zhí)行的機會。Join方法能夠使調(diào)用該方法的線程在此之前執(zhí)行完畢,在該方法之后,調(diào)用join方法的線程不會產(chǎn)生輸出了,


          Wait與notify使用時,需要注意的事項?
          它們只能用于synchronized同步塊中;
          它們需要配對使用;
          Wait一般出現(xiàn)在一個while循環(huán)中,while語句使用一個boolean標志控制。

          死鎖
          當被鎖定的A對象試圖訪問另一個被鎖定的B對象,B對象同時又要訪問已被鎖定的A對象。這樣導(dǎo)致兩個線程都在等待另一個線程釋放資源,這樣就出現(xiàn)了死鎖。

          16、JAVA多線程編程。 用JAVA寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出。
          希望大家補上,謝謝

          17、STRING與STRINGBUFFER的區(qū)別。
          答:STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內(nèi)容經(jīng)常進行操作,特別是內(nèi)容要修改時,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

          String s = new String("xyz");創(chuàng)建了幾個String Object? 兩個

          JDBC調(diào)用數(shù)據(jù)庫的基本步驟

          Weblogic Server中的JDBC配置
          1、建立到指定數(shù)據(jù)庫的連接池Connection Pool
          2、建立基于該連接池的數(shù)據(jù)源DataSource
          3、訪問數(shù)據(jù)庫時通過數(shù)據(jù)源的JNDI名字查找到該數(shù)據(jù)源,然后通過數(shù)據(jù)源獲得數(shù)據(jù)庫連接對象。得到該對象后就可以依次生成數(shù)據(jù)庫語句對象和結(jié)果集對象,進行相應(yīng)的數(shù)據(jù)庫操作。

          import java.sql.*;
          import javax.naming.*;
          import javax.sql.*;
          import java.util.*;
          import javax.rmi.*;

          public class DataSourceTest{
          private static Context getInitialContext() throws Exception{
          String url="t3://localhost:7001";
          String user="system";
          String password="11111111";
          Properties properties=null;

          try{
          properties=new Properties();
          properties.put(Context.INITIAL_CONTEXT_FACTORY,
          "weblogic.jndi.WLInitialContextFactory");
          properties.put(Context.PROVIDER_URL,url);

          if(user!=null){
          properties.put(Context.SECURITY_PRINCIPAL,user);
          properties.put(Context.SECURITY_CREDENTIALS,
          password==null?"":password);
          }

          return new InitialContext(properties);
          }catch(Exception e){
          throw e;
          }
          }

          public static void main(String args[]){
          UserTransaction tx=null;
          DataSource ds=null;
          Context ctx=null;
          Connection myConn=null;

          try{
          ctx=getInitialContext();

          tx=(UserTranscation)ctx.lookup("javax.transcation.UserTranscation");
          tx.begin();

          ds=(DataSource)ctx.lookup("myTxDataSource");
          }catch(Exception e){
          e.printStackTrace();
          }

          Statement myStatement=null;
          ResultSet myResultSet=null;

          try{
          myConn=ds.getConnection();
          myStatement=myConn.createStatement();
          myResultSet=myStatement.executeQuery(
          "select fullname from employee");

          while(myResultSet.next()){
          System.out.println(myResultSet.getString("fullname"));
          }

          tx.commit();
          }catch(Exception e){
          try{
          tx.rollback();
          }catch(Exception e){
          }
          }finally{
          myStatement.close();
          myConn.close();
          }
          }
          }

          JavaMail發(fā)郵件的步驟:
          Properties props=System.getProperties();
          props.put(“mail.smtp.host”,”*******”); //設(shè)置相關(guān)的屬性
          try{
          ??? //創(chuàng)建一個會話對象
          ??? Session session=Session.getDefaultInstance(props,null);
          ??? //創(chuàng)建一個消息對象
          ??? MimeMessage message=new MimeMessage(session);
          ??? message.setText(“*****”); //發(fā)送文本格式的郵件
          ??? message.setSubject(“*****”);
          ??? message.setFrom(“*****”);
          ??? message.addRecipient(Message.RecipientType.To,
          ??????????????????????? new InternetAddress(“******”));
          ?? //使用傳送類的send方法發(fā)送消息
          ?? Transport.send(message);
          }catch(MessagingException me){
          ????????? me.printStackTrace();}

          解析XML文件的幾種方式和區(qū)別
          XML解析器使用的兩種基本API是:
          文檔對象模型DOM,一種基于樹結(jié)構(gòu)的API。它定義了一組java接口,用于創(chuàng)建、訪問和操縱XML文檔的內(nèi)部結(jié)構(gòu)。它是基于對象。整個XML文檔被作為對象體系結(jié)構(gòu)排列進行解析和存儲,應(yīng)用程序可以隨機訪問這些對象。
          DOM主要用于:在結(jié)構(gòu)上修改XML文檔時;在內(nèi)存中與其他應(yīng)用程序共享文檔時。

          SAX提供一種用于解析XML文檔的事件驅(qū)動模型,使用SAX接口的XML處理器并不創(chuàng)建數(shù)據(jù)結(jié)構(gòu),而是掃描輸入的XML文檔,并生成元素開始、元素結(jié)束等事件,在發(fā)生事件時,解析器會通知應(yīng)用程序。
          SAX優(yōu)點:在解析大型文檔時,不必將整個文件加載到內(nèi)存中,因此占有的內(nèi)存比DOM少。在只需要一個信息子集時,SAX忽略不需要的數(shù)據(jù),而DOM無法做到這點。
          SAX的缺點是:必須按到達順序處理數(shù)據(jù),不能對文檔進行隨即訪問。SAX是只讀的,它是設(shè)計來讀取XML文檔而不是寫入的。文檔只能遍歷一次。

          使用DOM API查找XML文檔中的元素和屬性
          import org.w3c.dom.*;
          import javax.xml.parsers.*;
          import java.io.*;
          import java.net.URL;

          public class BookDetails{
          public BookDetails(String filename){
          Document doc=null;
          try{
          DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
          dbf.setNamespaceAware(true);
          DocumentBuilder db=dbf.newDocumentBuilder();
          doc=db.parse(new File(filename));

          String nm="String local="a";
          String ob="

          System.out.println(nm+"名字空間中的元素");
          NodeList nl=doc.getElementsByTagNameNS(nm,"*");
          for(int i=0;i<nl.getLength();i++){
          Node n=nl.item(i);
          System.out.println(n.getNodeName());
          }

          System.out.println("\n 名稱為 "+local+" 的元素");
          nl=doc.getElementsByTagNameNS("*",local);
          for(int i=0;i<nl.getLength();i++){
          Node n=nl.item(i);
          System.out.println(n.getNodeName());
          }

          System.out.println("\n名字空間 "+ob+" 中的屬性");
          nl=doc.getElementsByTagName("*");
          for(int i=0;i<nl.getLength();i++){
          if(nl.item(i) instanceof Element){
          Text t=(Text)nl.item(i).getFirstChild();
          Element e=(Element)nl.item(i);
          Attr a=e.getAttributeNodeNS(ob,"class");
          if(a!=null){
          String val=a.getNodeValue();
          System.out.println("<"+val+">"+t.getNodeValue()+"</"+val+">");
          }
          }
          }
          }catch(Exception e){
          e.printStackTrace();
          }
          }

          public static void main(String args[]){
          BookDetails nsd=null;
          if(args.length>=1){
          nsd=new BookDetails(args[0]);
          }else{
          System.out.println("Books.xml");
          }
          }
          }
          使用SAX API解析XML文檔
          import org.xml.sax.Attributes;
          import org.xml.sax.SAXException;
          import org.xml.sax.helpers.DefaultHandler;
          import javax.xml.parsers.SAXParser;
          import javax.xml.parsers.SAXParserFactory;

          public class SAXParserHandler extends DefaultHanlder{
          public void startDocument() throws SAXException{
          System.out.println("起始文檔");
          }

          public void endDocument() throws SAXException{
          System.out.println("結(jié)束文檔");
          }

          //在遇到字符數(shù)據(jù)時激發(fā)
          public void characters(char[] ch,int start,int lenght) throws SAXException){
          String charString=new String(ch,start,lenght);
          System.out.println("字符:"+charString);
          }

          public void startElement(String namespaceURI,String localName,String qName,
          Attributes atts)throws SAXException{
          System.out.println("起始元素"+qName);
          for(int i=0;i<atts.getLength();i++){
          System.out.println("屬性值:"+atts.getvalue(i));
          }
          }

          public void endElement(String namespaceURI,String localName,String qName)
          throws SAXException{
          System.out.println("結(jié)束元素"+qName);
          }

          public static void main(String args[]) throws Exception{
          SAXParserFactory factory=SAXParserFactory.newInstance();
          SAXParser parser=factory.newSAXParser();
          parser.parse("book.xml",new SAXParserHanlder());
          }
          }
          使用DOM API寫XML文檔
          import org.w3c.dom.*;
          import javax.xml.parsers.*;
          import javax.xml.transform.*;
          import javax.xml.transform.dom.*;
          import javax.xml.transform.stream.*;

          import java.io.*;

          public class Student{
          public static void main(String args[]){
          Document doc;
          Element students;
          Element stud;
          Element fName;
          Element sName;
          try{
          DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
          DocumentBuilder db=dbf.newDocumentBuilder();
          doc=db.newDocument();

          stud=doc.createElement("Student");

          fName=doc.createElement("FirstName");;
          fName.appendChild(doc.createTextNode("John"));
          stud.appendChild(fName);

          sName=doc.createElement("Surname");
          sName.appendChild(doc.createTextNode("David"));
          stud.appendChild(sName);

          students=doc.createElement("Students");
          students.setAttribute("Department","Mathematics");
          students.appendChild(stud);

          doc.appendChild(students);

          TransformerFactory tf=TransformerFactory.newInstance();
          Transformer transformer=tf.newTransformer();
          transformer.transform(new DOMSource(doc),new StreamResult(System.out));

          }catch(Exception e){
          e.printStackTrace();
          }
          }
          }
          使用DOM API顯示現(xiàn)有XML文檔內(nèi)容

          使用DOM API將XML文檔數(shù)據(jù)插入數(shù)據(jù)庫

          使用DOM API根據(jù)數(shù)據(jù)庫創(chuàng)建XML文檔

          Java的國際化
          國際化是為了將應(yīng)用程序發(fā)布在多個地區(qū)(locale)而進行準備的過程。不同地區(qū)標識了各個特定的國家在信息表現(xiàn)上所廣泛使用的語言、流通貨幣、字符集、日期格式及其他要素。

          支持國際化的應(yīng)用程序具有以下特點:
          1、不用改變代碼就可以支持另外的語言。
          2、文本元素、消息和圖片保存在源代碼之外。
          3、將于文化背景有關(guān)的數(shù)據(jù),比如日期和時間、十進制數(shù)值以及流通貨幣,根據(jù)用戶所用的語言和所在地理位置進行正確格式化。
          4、支持非標準字符集。
          5、應(yīng)用程序可以快速適應(yīng)新的語言區(qū)域。

          為了使一個應(yīng)用程序國際化,:
          1、必須將用戶所見到的硬編碼字符(如標簽、工具提示和錯誤信息等)替換成包含在資源包ResourceBundle中的字符。它是一個java屬性文件,它將關(guān)鍵字映射為字符值。并且可以使用多個不同語言版本的ResourceBundle,這樣將可以對于不同語言提供不同的字符串。
          2、使用Locale對象,可以使數(shù)據(jù)格式化為與地區(qū)相關(guān)的數(shù)據(jù)。
          3、國際化的應(yīng)用程序還必須使用統(tǒng)一的字符編碼標準字符集。

          應(yīng)用服務(wù)器有那些?

          Servlet方面
          什么是Servlet?
          Servlet是J2EE應(yīng)用框架中部署于Web層的Web組件,運行在支持Servlet的Web服務(wù)器或應(yīng)用服務(wù)器上。Servlet為客戶端和服務(wù)器端的信息處理提供了一種“請求/響應(yīng)”機制。
          客戶程序?qū)⒄埱蟀l(fā)送到服務(wù)器;服務(wù)器將請求發(fā)送到Servlet;依據(jù)客戶程序的請求,Servlet動態(tài)地構(gòu)造回答信息并返回給服務(wù)器;服務(wù)器將回答返回給客戶程序。

          什么是JSP?
          JSP是J2EE應(yīng)用框架中部署于Web層的Web組件,是對Servlet技術(shù)的擴展。它使在靜態(tài)的頁面中加入動態(tài)的內(nèi)容變得非常容易。并且通過使用標簽庫可以大大節(jié)省開發(fā)時間;將JavaBean與JSP一起使用可以將數(shù)據(jù)表示和程序?qū)崿F(xiàn)分離。

          在MVC架構(gòu)模式中:
          使用Servlet作為控制器,而JSP作為數(shù)據(jù)視圖。

          CGI與Servlet的區(qū)別?
          CGI(公共網(wǎng)關(guān)接口)是一項標準,使WEB服務(wù)器可以與外部應(yīng)用程序交互。但是該技術(shù)存在一些嚴重的限制:
          1、CGI應(yīng)用程序占用資源很多。當系統(tǒng)要處理來自一個用戶的請求時,就會創(chuàng)建一個新的進程來處理該請求,一旦CGI腳本停止執(zhí)行,系統(tǒng)就必須收回該進程。這種重量級進程的經(jīng)常啟動和停止非常低效。
          2、CGI很難鏈接于請求進程的其他階段,因為在WEB服務(wù)器上它們運行于不同的進程。這就很難處理授權(quán)、工作流和日志記錄工作。

          Java Servlet技術(shù)提供了一個基于組件、與平臺無關(guān)的方法來構(gòu)建WEB應(yīng)用程序。Servlet沒有標準CGI應(yīng)用程序所遇到的性能局限。
          Servlet比CGI更高效是因為:
          Servlet應(yīng)用中將只創(chuàng)建一個單一個重量級進程,并對每個用戶請求使用更輕量級的線程來完成請求處理,并且這些線程是由JVM自動維護。每個客戶端請求對應(yīng)一個線程,每個Servlet類在Servlet容器中只存在一個唯一的對象(實例)。Servlet類首次加載后將常駐內(nèi)存。

          1、說一說Servlet的生命周期?
          答:在第一次請求Servlet時將創(chuàng)建Servlet實例,容器調(diào)用實例的init方法,如果容器有請求要傳送給servlet,它就會調(diào)用servlet實例的Service方法。一個請求將作為一個線程。如果服務(wù)器要銷毀servlet實例就會調(diào)用servlet實例的destory方法,否則該實例將會常駐內(nèi)存。

          2、Servlet版本間(忘了問的是哪兩個版本了)的不同?
          希望大家補上,謝謝

          會話根中技術(shù)
          用戶認證:使用用戶名和口令進行驗證來讓客戶端訪問某些資源。
          隱藏表單字段:用于保存一個瀏覽器在服務(wù)器中的相關(guān)信息。
          URL重寫:在URL后面添加附加信息
          持久Cookie:在請求和響應(yīng)頭信息中添加和編輯信息

          什么是會話對象?
          會話對象用于在用戶訪問一個Web站點的多個頁面時共享信息。任何時候用戶第一次訪問某個網(wǎng)頁,系統(tǒng)都將創(chuàng)建一個會話。如果以后用戶訪問此網(wǎng)頁,JSP將檢索有關(guān)此會話的信息。只要服務(wù)器收到此用戶的請求,則會話就會持續(xù),如果經(jīng)過一段時間沒有收到此用戶的新請求,會話就會終止。

          3、JAVA SERVLET API中forward() 與redirect()的區(qū)別?
          使用重定向:當調(diào)用sendRedirect方法時,Web容器就會向瀏覽器返回響應(yīng),指示需要新的URL。因為瀏覽器發(fā)出了完全嶄新的請求,所以在重定向之前存儲為請求屬性的任何對象都會消失。
          使用轉(zhuǎn)發(fā):當為一個請求調(diào)用轉(zhuǎn)發(fā)時,請求就發(fā)送給服務(wù)器上另一個資源,而無需通知客戶機由不同的資源處理請求。這個過程完全在Web容器內(nèi)部進行,客戶機絕不知曉。與重定向不同,轉(zhuǎn)發(fā)過程中,對象可以存儲在請求中,并發(fā)送給下一個資源使用。
          因為轉(zhuǎn)發(fā)過程完全在服務(wù)器上進行,與客戶機沒用通信,因此轉(zhuǎn)發(fā)的性能優(yōu)于重定向。
          但是如果在JSP頁面上使用圖形的相對路徑和其他資源,轉(zhuǎn)發(fā)機制就會帶來問題。因為瀏覽器無從得知發(fā)生了轉(zhuǎn)發(fā),所以相對路徑只是相對初始的Servlet,而不是所轉(zhuǎn)發(fā)到的JSP頁面。使用JSP自定義標簽可以解決這個問題。

          如何現(xiàn)實servlet的單線程模式

          servlet的配置

          4、Servlet的基本架構(gòu)
          public class ServletName extends HttpServlet {
          public void doPost(HttpServletRequest request, HttpServletResponse response) throws
          ServletException, IOException {
          }
          public void doGet(HttpServletRequest request, HttpServletResponse response) throws
          ServletException, IOException {
          }
          }

          ?

          Jsp方面
          1、jsp有哪些內(nèi)置對象?作用分別是什么?
          JSP的隱式對象
          RequestJavax.servlet.ServletRequest它包含了有關(guān)瀏覽器請求的信息.通過該對象可以獲得請求中的頭信息、Cookie和請求參數(shù)。
          Enumeration getHeaderNames()String getHeader(name)Cookie[] getCookies()Enumeration GetParameterNames()String getParameter(name)String[] GetParametervalues(name)HttpSession getSession(flag)
          responseJavax.servlet.ServletResponse作為JSP頁面處理結(jié)果返回給用戶的響應(yīng)存儲在該對象中。并提供了設(shè)置響應(yīng)內(nèi)容、響應(yīng)頭以及重定向的方法(如cookies,頭信息等)
          Void setContentType(type)String getCharacterEncoding()Void addCookie(cookie)Void sendRedirect(url)
          outJavax.servlet.jsp.JspWriter用于將內(nèi)容寫入JSP頁面實例的輸出流中,提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。
          pageContextJavax.servlet.jsp.PageContext描述了當前JSP頁面的運行環(huán)境。可以返回JSP頁面的其他隱式對象及其屬性的訪問,另外,它還實現(xiàn)將控制權(quán)從當前頁面?zhèn)鬏斨疗渌撁娴姆椒ā?br />Void forward(path)PAGE_SCOPEREQUEST_SCOPESESSION_SCOPEAPPLICATION_SCOPEVoid setAtrribute(key,value,scope)Enumeration getAttributeNamesInScope(scope)Object getAttribute(key,scope)Void RemoveAttribute(key,scope)Object findAttribute(name)Int getAttributeScope(name)
          sessionjavax.servlet.http.HttpSession會話對象存儲有關(guān)此會話的信息,也可以將屬性賦給一個會話,每個屬性都有名稱和值。會話對象主要用于存儲和檢索屬性值。
          Void setAttribute(name,data)Object getAttribute(name)
          applicationjavax.servle.ServletContext存儲了運行JSP頁面的servlet以及在同一應(yīng)用程序中的任何Web組件的上下文信息。
          pageJava.lang.Object表示當前JSP頁面的servlet實例
          configjavax.servlet.ServletConfig該對象用于存取servlet實例的初始化參數(shù)。
          Enumeration getInitParameterNames()String getInitParameter(name)
          ExceptionJavax.lang.Throwable在某個頁面拋出異常時,將轉(zhuǎn)發(fā)至JSP錯誤頁面,提供此對象是為了在JSP中處理錯誤。
          String getMessage()Void printStackTrace(out)<%@ page errorPage=”error.jsp”%><%@ page isErrorPage=”true” %>


          2、jsp有哪些動作?作用分別是什么?
          答:JSP共有以下6種基本動作
          ljsp:include:在頁面被請求的時候引入一個文件。
          ljsp:useBean:尋找或者實例化一個JavaBean。
          ljsp:setProperty:設(shè)置JavaBean的屬性。
          ljsp:getProperty:輸出某個JavaBean的屬性。
          ljsp:forward:把請求轉(zhuǎn)到一個新的頁面。
          ljsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記

          3、JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?
          答:動態(tài)INCLUDE用jsp:include動作實現(xiàn)
          <jsp:include page="included.jsp" flush="true" />它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)
          靜態(tài)INCLUDE用include偽碼實現(xiàn),定不會檢查所含文件的變化,適用于包含靜態(tài)頁面
          <%@ include file="included.htm" %>

          4、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?
          答:有兩種,分別為:
          <jsp:include page="included.jsp" flush="true">
          <jsp:forward page= "nextpage.jsp"/>
          前者頁面不會轉(zhuǎn)向include所指的頁面,只是顯示該頁的結(jié)果,主頁面還是原來的頁面。執(zhí)行完后還會回來,相當于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁面,不會再回來。相當于go to 語句。

          JSP的常用指令
          <%@ include file=”localURL” %>
          <%@ page attribute=”value1” %>
          屬性值缺省值示例
          contentTypeMIME類型和字符集“text/hmt”contentType=“text/html;charset=ISO-8859-1“contentType=“text/xml“
          Extends類名無Extends=“com.taglib.wdjsp.MyJspPage“
          Import 類名或包名無
          Session布爾值TrueSession=“true”
          isThreadSafe布爾值True
          ErrorPage
          isErrorPage


          <%@ taglib uri=”tagLibraryURL” prefix=”tagPrefix” %>

          Jdbc
          說出數(shù)據(jù)連接池的工作機制是什么?


          1、可能會讓你寫一段Jdbc連Oracle的程序,并實現(xiàn)數(shù)據(jù)查詢.
          答:程序如下:
          package hello.ant;
          import java.sql.*;
          public class jdbc {
          String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
          String theUser="admin";
          String thePw="manager";
          Connection c=null;
          Statement conn;
          ResultSet rs=null;
          public jdbc() {
          try{
          Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
          c = DriverManager.getConnection(dbUrl,theUser,thePw);
          conn=c.createStatement();
          }catch(Exception e){
          e.printStackTrace();
          }
          }
          public boolean executeUpdate(String sql) {
          try {
          conn.executeUpdate(sql);
          return true;
          } catch (SQLException e) {
          e.printStackTrace();
          return false;
          }
          }
          public ResultSet executeQuery(String sql) {
          rs=null;
          try {
          rs=conn.executeQuery(sql);
          } catch (SQLException e) {
          e.printStackTrace();
          }
          return rs;
          }
          public void close(){
          try {
          conn.close();
          c.close();
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
          public static void main(String[] args) {
          ResultSet rs;
          jdbc conn = new jdbc();
          rs=conn.executeQuery("select * from test");
          try{
          while (rs.next()) {
          System.out.println(rs.getString("id"));
          System.out.println(rs.getString("name"));
          }
          }catch(Exception e) {
          e.printStackTrace();
          }
          }
          }

          2、Class.forName的作用?為什么要用?
          答:調(diào)用該訪問返回一個以字符串指定類名的類的對象。

          說出在JSP頁面里是怎么分頁的?
          頁面需要保存以下參數(shù):
          總行數(shù):根據(jù)sql語句得到總行數(shù)
          每頁顯示行數(shù):設(shè)定值
          當前頁數(shù):請求參數(shù)
          頁面根據(jù)當前頁數(shù)和每頁行數(shù)計算出當前頁第一行行數(shù),定位結(jié)果集到此行,對結(jié)果集取出每頁顯示行數(shù)的行即可。

          4、在ORACLE大數(shù)據(jù)量下的分頁解決方法。一般用截取ID方法,還有是三層嵌套方法。
          答:一種分頁方法
          <%
          int i=1;
          int numPages=14;

          //獲取當前頁面
          String pages = request.getParameter("page") ;
          int currentPage = 1;
          currentPage=(pages==null)?(1):{Integer.parseInt(pages)};

          //獲得記錄總數(shù)
          sql = "select count(*) from tables";
          ResultSet rs = DBLink.executeQuery(sql) ;
          while(rs.next()) i = rs.getInt(1) ;

          //獲取總頁數(shù)
          int intPageCount=1;
          intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);

          //設(shè)置上下頁
          int nextPage ;
          int upPage;
          nextPage = currentPage+1;
          if (nextPage>=intPageCount) nextPage=intPageCount;
          upPage = currentPage-1;
          if (upPage<=1) upPage=1;

          //獲取數(shù)據(jù)內(nèi)容并顯示
          rs.close();
          sql="select * from tables";
          rs=DBLink.executeQuery(sql);
          i=0;
          while((i<numPages*(currentPage-1))&&rs.next()){i++;}
          %>
          //輸出內(nèi)容
          //輸出翻頁連接
          合計:<%=currentPage%>/<%=intPageCount%>
          <a href="List.jsp?page=1">第一頁</a>
          <a href="List.jsp?page=<%=upPage%>">上一頁</a>

          <%
          for(int j=1;j<=intPageCount;j++){
          if(currentPage!=j){
          %>
          //顯示所有頁面的連接
          <a href="list.jsp?page=<%=j%>">[<%=j%>]</a>

          <%
          }else{
          out.println(j);
          } //end of if
          } //end of for
          %>

          <a href="List.jsp?page=<%=nextPage%>">下一頁</a>
          <a href="List.jsp?page=<%=intPageCount%>">最后頁 </a>


          Xml方面
          2、你在項目中用到了xml技術(shù)的哪些方面?如何實現(xiàn)的?
          答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關(guān)信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數(shù)都存貯在XML文件中。

          3、用jdom解析xml文件時如何解決中文問題?如何解析?
          答:看如下代碼,用編碼方式加以解決
          package test;
          import java.io.*;
          public class DOMTest {
          private String inFile = "c:\\people.xml";
          private String outFile = "c:\\people.xml";
          public static void main(String args[]){
          new DOMTest();
          }
          public DOMTest() {
          try {
          javax.xml.parsers.DocumentBuilder builder =
          javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
          org.w3c.dom.Document doc = builder.newDocument();
          org.w3c.dom.Element root = doc.createElement("老師");
          org.w3c.dom.Element wang = doc.createElement("王");
          org.w3c.dom.Element liu = doc.createElement("劉");
          wang.appendChild(doc.createTextNode("我是王老師"));
          root.appendChild(wang);
          doc.appendChild(root);
          javax.xml.transform.Transformer transformer =
          javax.xml.transform.TransformerFactory.newInstance().newTransformer();

          transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
          transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
          transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
          new javax.xml.transform.stream.StreamResult(outFile));
          } catch (Exception e) {
          System.out.println (e.getMessage());
          }
          }
          }

          4、編程用JAVA解析XML的方式.
          答:用SAX方式解析XML,XML文件如下:
          <?xml version="1.0" encoding="gb2312"?>
          <person>
          <name>王小明</name>
          <college>信息學院</college>
          <telephone>6258113</telephone>
          <notes>男,1955年生,博士,95年調(diào)入海南大學</notes>
          </person>
          事件回調(diào)類SAXHandler.java
          import java.io.*;
          import java.util.Hashtable;
          import org.xml.sax.*;
          public class SAXHandler extends HandlerBase {
          private Hashtable table = new Hashtable();
          private String currentElement = null;
          private String currentvalue = null;
          public void setTable(Hashtable table) {
          this.table = table;
          }
          public Hashtable getTable(){
          return table;
          }
          public void startElement(String tag, AttributeList attrs) throws SAXException {
          currentElement = tag;
          }
          public void characters(char[] ch, int start, int length) throws SAXException {
          currentvalue = new String(ch, start, length);
          }
          public void endElement(String name) throws SAXException {
          if (currentElement.equals(name)) table.put(currentElement, currentvalue);
          }
          }

          JSP內(nèi)容顯示源碼,SaxXml.jsp:
          <HTML>
          <HEAD>
          <title>剖析XML文件people.xml</title>
          </HEAD>
          <BODY>
          <%@ page errorPage="ErrPage.jsp" contentType="text/html;charset=GB2312" %>
          <%@ page import="java.io.*" %>
          <%@ page import="java.util.Hashtable" %>
          <%@ page import="org.w3c.dom.*" %>
          <%@ page import="org.xml.sax.*" %>
          <%@ page import="javax.xml.parsers.SAXParserFactory" %>
          <%@ page import="javax.xml.parsers.SAXParser" %>
          <%@ page import="SAXHandler" %>
          <%
          File file = new File("c:\\people.xml");
          FileReader reader = new FileReader(file);
          Parser parser;
          SAXParserFactory spf = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          SAXHandler handler = new SAXHandler();
          sp.parse(new InputSource(reader), handler);
          Hashtable hashTable = handler.getTable();
          out.println("<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>");
          out.println("<TR><TD>姓名</TD>" + "<TD>" +
          (String)hashTable.get(new String("name")) + "</TD></TR>");
          out.println("<TR><TD>學院</TD>" + "<TD>" +
          (String)hashTable.get(new String("college"))+"</TD></TR>");
          out.println("<TR><TD>電話</TD>" + "<TD>" +
          (String)hashTable.get(new String("telephone")) + "</TD></TR>");
          out.println("<TR><TD>備注</TD>" + "<TD>" +
          (String)hashTable.get(new String("notes")) + "</TD></TR>");
          out.println("</TABLE>");
          %>
          </BODY>
          </HTML>

          EJB方面
          1、EJB2.0有哪些內(nèi)容?分別用在什么場合? EJB2.0和EJB1.1的區(qū)別?
          答:規(guī)范內(nèi)容包括Bean提供者,應(yīng)用程序裝配者,EJB容器,EJB配置工具,EJB服務(wù)提供者,系統(tǒng)管理員。這里面,EJB容器是EJB之所以能夠運行的核心。EJB容器管理著EJB的創(chuàng)建,撤消,激活,去活,與數(shù)據(jù)庫的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....

          2、EJB與JAVA BEAN的區(qū)別?
          JavaBean是可復(fù)用的平臺獨立的軟件組件,開發(fā)者可以在軟件構(gòu)造器工具中對其直接進行可視化操作。

          Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調(diào)用(RMI)技術(shù)的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過容器來訪問真正的EJB組件。

          3、EJB的基本架構(gòu)
          答:一個EJB包括三個部分:
          Remote Interface 接口的代碼
          package Beans;
          import javax.ejb.EJBObject;
          import java.rmi.RemoteException;
          public interface Add extends EJBObject {
          //some method declare
          }

          Home Interface 接口的代碼
          package Beans;
          import java.rmi.RemoteException;
          import jaax.ejb.CreateException;
          import javax.ejb.EJBHome;
          public interface AddHome extends EJBHome {
          //some method declare
          }

          EJB類的代碼
          package Beans;
          import java.rmi.RemoteException;
          import javax.ejb.SessionBean;
          import javx.ejb.SessionContext;
          public class AddBean Implements SessionBean {
          //some method declare
          }

          J2EE,MVC方面
          1、MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?
          答:MVC是Model-View-Controller的簡寫。設(shè)計的基本原理是將復(fù)雜性分解為三個組件,即模型、視圖、控制器。
          模型表示數(shù)據(jù)和處理數(shù)據(jù)的業(yè)務(wù)邏輯或應(yīng)用程序?qū)ο蟆?br />試圖是用戶要查看或存取的數(shù)據(jù)的表示。
          控制器定義了用戶與模型和試圖交互的方式。


          2、應(yīng)用服務(wù)器與WEB SERVER的區(qū)別?
          Web Service 是一種新的分布式技術(shù)。一個Web服務(wù)本質(zhì)上是一個應(yīng)用組件,可以通過Web協(xié)議和數(shù)據(jù)編碼機制,例如HTTP和XML,對這個組件進行訪問。

          Soap簡單對象訪問協(xié)議:
          是一種基于XML的通信協(xié)議。它包括3個部分。
          Soap封裝結(jié)構(gòu):定義消息的XML格式,包括其整體框架、消息內(nèi)容、由誰處理這些內(nèi)容等。
          Soap編程規(guī)則:定義如何將程序數(shù)據(jù)表示為XML。
          Soap RPC表示:定義如何使用scap進行遠程過程調(diào)用。

          WSDL Web服務(wù)描述語言:
          WSDL文件是一個XML文檔,用于說明一組soap消息以及如何交換這些消息。還定義了服務(wù)的位置以及使用服務(wù)的通信協(xié)議等。

          Uddi統(tǒng)一描述、發(fā)現(xiàn)和集成標準
          是wed服務(wù)的黃頁。它提供了用于服務(wù)注冊的目錄技術(shù),并用它來建立Web服務(wù)的目錄信息。UDDI的核心組件是UDDI商業(yè)注冊,它使用一個XML文檔來描述企業(yè)及所提供的Web服務(wù)。它包括3個部分:
          白頁:介紹提供服務(wù)的公司,包括名稱、地址和聯(lián)系方式等;
          黃頁:包括按照標準分類法進行分類的行業(yè)類別;
          綠頁:詳細介紹,訪問服務(wù)接口等技術(shù)信息。

          Web服務(wù)是構(gòu)建在soap(簡單對象訪問協(xié)議)、wsdl(web服務(wù)描述語言)、uddi(統(tǒng)一描述、發(fā)現(xiàn)和集成標準)3個開放的核心標準之上的。Soap用來進行Web服務(wù)通信的協(xié)議,WSDL用來進行說明和描述Web服務(wù)
          由于Web服務(wù)完全基于XML的,使Web服務(wù)成為一個跨語言、跨平臺、跨網(wǎng)絡(luò)的可互操作的分布式應(yīng)用軟件的新平臺。
          3、J2EE是什么?
          J2EE是sun公司推出的一個高層次的全方位、多功能的企業(yè)應(yīng)用開發(fā)環(huán)境。它包括了當今軟件工業(yè)界許多最新、最重要的軟件技術(shù)。J2EE平臺包含一整套的服務(wù)、應(yīng)用程序接口和協(xié)議,是java技術(shù)企業(yè)級應(yīng)用的整體解決方案。J2EE平臺通過基于組件的應(yīng)用程序模型大大簡化了開發(fā)過程,同時還支持任何分布式體系和多層次的應(yīng)用開發(fā)。隨著越來越多的第三方對J2EE的支持和標準認證,J2EE已被廣泛用來開發(fā)企業(yè)級應(yīng)用軟件、中間件和組件軟件。
          J2EE Java2平臺企業(yè)版:
          1、提供了基于組件的方式來設(shè)計、開發(fā)、組裝和部署企業(yè)應(yīng)用。
          2、提供了一個多層次分布式的應(yīng)用模型,包括了可復(fù)用的組件、基于XML數(shù)據(jù)交換、統(tǒng)一的安全模式以及靈活的事務(wù)控制。基于這些技術(shù),可開發(fā)出滿足市場要求的,基于平臺無關(guān)的J2EE組件的解決方案。
          3、J2EE平臺使用的多層分布式應(yīng)用模型中應(yīng)用程序主要分為:客戶層(Applet)、Web層(Servlet和JSP)、業(yè)務(wù)層(EJB)、企業(yè)信息系統(tǒng)層。


          使用類庫開發(fā)與使用框架包進行開發(fā)的區(qū)別?
          框架包簡單的可以認為是一組類和接口,它們相互協(xié)作以解決特定類型的軟件問題。
          類庫包含的是應(yīng)用程序可以調(diào)用的函數(shù)或例程。而框架包提供通用的、相互協(xié)作的組件,應(yīng)用程序通過擴展這些組件提供特定函數(shù)組。應(yīng)用程序?qū)⒃谶@些擴展點進行擴展,運行時這些擴展將被框架系統(tǒng)反調(diào)用。這正與使用類庫開發(fā)的應(yīng)用程序,運行時的函數(shù)調(diào)用時顛倒的。

          5、BS與CS的聯(lián)系與區(qū)別。
          傳統(tǒng)的分布式應(yīng)用程序都是基于Client/Server結(jié)構(gòu)的,而近年來人們發(fā)現(xiàn)基于Client/Server結(jié)構(gòu)的應(yīng)用程序有很多缺點,比如:如果客戶端的代碼需要改變,那么所有機器上的客戶端程序都要重新安裝;如果某臺機器有了不可修復(fù)的損壞,那么得去別的機器上重新安裝客戶端軟件才能夠使用。而基于Browser/Server結(jié)構(gòu)的應(yīng)用程序就沒有以上的缺點了,我們可以使用任何一臺有瀏覽器的機器來工作,而因為所有的程序邏輯都在服務(wù)器端,所以服務(wù)器端的代碼變動不需要作為客戶端的瀏覽器再做任何工作。

          6、STRUTS的應(yīng)用(如STRUTS架構(gòu))
          答:Struts是采用Java Servlet/JavaServer Pages技術(shù),開發(fā)Web應(yīng)用程序的開放源碼的framework。 采用Struts能開發(fā)出基于MVC(Model-View-Controller)設(shè)計模式的應(yīng)用構(gòu)架。 Struts有如下的主要功能:
          一.包含一個controller servlet,能將用戶的請求發(fā)送到相應(yīng)的Action對象。
          二.JSP自由tag庫,并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。
          三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。

          設(shè)計模式方面
          1、開發(fā)中都用到了那些設(shè)計模式?用在什么場合?
          答:人們在自己的環(huán)境中不斷發(fā)現(xiàn)問題和尋找問題的解決方案的時候,發(fā)現(xiàn)有一些問題及其解決方案不斷變換面孔重復(fù)出現(xiàn),但在這些不同的面孔后面有著共同的本質(zhì),這些共同的本質(zhì)就是模式。設(shè)計模式就是用來描述解決這些問題的解決方案的核心的。

          工廠模式
          專門負責將大量有共同接口的類實例化。工廠模式可以動態(tài)確定將那一個類實例化,不必事先知道每次要實例化那一個類。

          簡單工廠模式
          或稱靜態(tài)工廠方法模式。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。簡單工廠模式就是由一個工廠類根據(jù)傳入的參數(shù)決定創(chuàng)建那一種產(chǎn)品類的實例。
          簡單工廠模式涉及到工廠角色、抽象產(chǎn)品角色以及具體產(chǎn)品角色:l工廠類角色:含有與應(yīng)用緊密相關(guān)的商業(yè)邏輯。工廠類在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對象。l抽象產(chǎn)品角色:擔任這個角色的類是由工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。l具體產(chǎn)品角色:工廠方法模式所創(chuàng)建的任何對象都是這個角色的實例。
          優(yōu)點是:允許客戶端相對獨立于產(chǎn)品創(chuàng)建的過程,并且在系統(tǒng)引入新產(chǎn)品的時候無需修改客戶端。缺點是:如果有新的產(chǎn)品加入到系統(tǒng)中去,就需要修改工廠類,將必要的邏輯加入到工廠類中。
          工廠方法模式
          或稱多態(tài)性工廠模式。工廠方法模式的用意是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中。工廠方法模式中,核心的工廠類不再負責所有的產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。它僅負責給出具體工廠子類必須實現(xiàn)的接口。這樣可以用來允許系統(tǒng)在不修改具體工廠角色的情況下引進新的產(chǎn)品。
          工廠方法模式涉及到的角色:l抽象工廠角色:它不包含應(yīng)用邏輯。任何在模式中創(chuàng)建對象的工廠類必須實現(xiàn)這個接口。l具體工廠角色:含有與應(yīng)用密切相關(guān)的邏輯,并且受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對象。l抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。l具體產(chǎn)品角色:這個角色實現(xiàn)了抽象產(chǎn)品角色所聲明的接口。
          單例模式
          確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。
          特點:單例類只能有一個實例;單例類必須自己創(chuàng)建自己的惟一的實例;單例類必須給所有其他對象提供這一實例。
          多例模式
          多例類可以有多個實例,并且多例類必須自己創(chuàng)建、管理自己的實例,并向外界提供自己的實例。
          在系統(tǒng)中可以用于數(shù)據(jù)庫連接池、鍵值緩存等。
          代理模式
          給某個對象提供一個代理對象,并由代理對象控制對原對象的引用。
          代理模式所涉及的角色:抽象主題角色:聲明了真實主題和代理主題的共同接口,這樣一來在任何可以使用真實主題的地方都可以使用代理主題角色。

          名稱

          ?

          2、UML方面
          UML包括的圖有:案例圖、類圖、序列圖、合作圖、狀態(tài)圖、活動圖、構(gòu)件圖、部署圖。

          類圖中的關(guān)系有:
          一般關(guān)系(類于類的繼承關(guān)系、接口與接口的繼承關(guān)系、類對接口的實現(xiàn)關(guān)系);
          關(guān)聯(lián)關(guān)系:它使一個類知道另一個類的屬性和方法。在java中,使用實例變量實現(xiàn)。
          聚合關(guān)系:是整體與個體之間的關(guān)系。也是使用實例變量實現(xiàn)。
          合成關(guān)系:是比聚合關(guān)系強的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對象負責代表部分的對象的生命周期。
          依賴關(guān)系:總是單向的。表示一個類依賴于另一個類的定義。

          3、軟件的可維護性與可復(fù)用性
          一個好的系統(tǒng)設(shè)計應(yīng)該有如下性質(zhì):
          可擴展性:新的性能可以很容易地加入到系統(tǒng)中。
          靈活性:可以允許代碼修改平穩(wěn)地發(fā)生、而不會波及到很多其他的模塊。
          可插入性:可以很容易地將一個類抽出去,同時將另一個有同樣接口的類加入進來。

          在java中可以給出一個或多個抽象java類或java接口,規(guī)定出所有的具體類必須提供的方法特征作為系統(tǒng)設(shè)計的抽象層。這個抽象層預(yù)見了所有的可能擴展,因此,在任何擴展情況下都不會改變。

          接口是實現(xiàn)構(gòu)件的可插入性的關(guān)鍵。一個java接口是一些方法特征的集合,這些方法一般都是在系統(tǒng)經(jīng)常出現(xiàn)的方法。一個接口只有方法的特征,沒有方法的實現(xiàn),因此在不同地方的該方法實現(xiàn),可以具有不同的行為。
          接口是對可插入性的保證:
          因為在類的關(guān)聯(lián)中,如果一個關(guān)聯(lián)不是針對一個具體類的,而是針對一個接口的,那么任何實現(xiàn)這個接口的類就都可以滿足要求。當前對象并不在意所關(guān)聯(lián)的是哪個具體類,而僅僅關(guān)心這個類是否實現(xiàn)了某個接口。這樣一來,就可以動態(tài)地將這個關(guān)聯(lián)從一個具體類轉(zhuǎn)換到另一個具體類,而這樣做的唯一條件是它們都實現(xiàn)某個接口。

          抽象類僅提供一個類型的部分實現(xiàn)。抽象類通常代表一個抽象概念,它提供一個繼承的出發(fā)點。
          javascript方面
          1、如何校驗數(shù)字型?
          var re=/^\d{1,8}$|\.\d{1,2}$/;
          var str=document.form1.all(i).value;
          var r=str.match(re);
          if (r==null) {
          sign=-4;
          break;
          } else{
          document.form1.all(i).value=parseFloat(str);
          }

          CORBA方面
          什么是RMI?
          Java RMI(Remote Method Invocation)--Java的遠程方法調(diào)用是Java所特有的分布式計算技術(shù),它允許運行在一個Java虛擬機上的對象調(diào)用運行在另一個Java虛擬機上的對象的方法,從而使Java編程人員可以方便地在網(wǎng)絡(luò)環(huán)境中作分布式計算。面向?qū)ο笤O(shè)計要求每個任務(wù)由最適合該任務(wù)的對象執(zhí)行,RMI將這個概念更深入了一步,使任務(wù)可以在最適合該任務(wù)的機器上完成。
          RMI定義了一組遠程接口,可以用于生成遠程對象。客戶機可以象調(diào)用本地對象的方法一樣用相同的語法調(diào)用遠程對象。RMI API提供的類和方法可以處理所有訪問遠程方法的基礎(chǔ)通信和參數(shù)引用要求的串行化。
          使用RMI開發(fā)步驟:
          1、定義一個遠程接口(遠程接口必須繼承接口,每個方法必須拋出遠程異常,方法參數(shù)和方法返回值都必須是可序列化的)
          2、實現(xiàn)遠程接口
          3、定義使用遠程對象的客戶程序
          4、產(chǎn)生遠程訪問對象的樁和框
          5、注冊遠程對象
          6、運行服務(wù)器和客戶程序

          RMI和CORBA的區(qū)別?
          遠程方法調(diào)用(RMI)和CORBA都是分布式計算技術(shù),在進行分布式時各有其優(yōu)缺點,CORBA和RMI的區(qū)別。
            CORBA(Common Object Request Broker Architecture)是OMG的Object Management Architecture(對象管理結(jié)構(gòu)),它是面向?qū)ο蟮姆植际较到y(tǒng)建立所依據(jù)的標準。CORBA被設(shè)計成一個能供所有編程語言使用的一個開放性說明,就是說一個機器上的Java客戶可以要求另一個用SmallTalk或C++的機器服務(wù)。正是由于這種語言的獨立性使得CORBA這么靈活和吸引人。為了適應(yīng)語言獨立性,CORBA采用了非常通用的標準作為其接口。在不同的語言中,遠程調(diào)用、簽名和對象的引入有各自不同的定義,所以CORBA必須盡可能的中立和開放。正是這種通用性是CORBA的一個弱點。當開發(fā)人員都采用CORBA時,他們要用一種新的標準定義語言接口,它要求開發(fā)者學習新的編程接口,從而減小了遠程模型的透明性。
            RMI是為僅在Java對Java的分布式計算中而開發(fā)的。遠程調(diào)用的標準是為了Java和應(yīng)用Java的自然Java簽名和調(diào)用而開發(fā)的,這使得RMI對Java的開發(fā)者相當透明而且易于實現(xiàn)。RMI用Java語言緊密集成從而同CORBA相比能夠提供非常好的容錯能力及對異常的處理。盡管Java的RMI標準不像CORBA那樣語言獨立,但Java本身是一個獨立的平臺,這就使RMI在跨平臺的分布軟件開發(fā)中是一個很好的選擇。
            RMI是Java語言在分布式計算上的基本模型,很多Java的分布式系統(tǒng),包括我們本章要涉及的EJB,都是建立在RMI的思想上的。

          基于IIOP協(xié)議的遠程方法調(diào)用(RMI-IIOP)
          RMI是一個分布對象系統(tǒng),允許java對象與運行在其他虛擬機上的java對象進行交互。使得可以象訪問本地對象一樣訪問遠程對象;只要獲得一個遠程對象的引用,就可以把這個對象看作如同運行在同一虛擬機上那樣來調(diào)用它的方法。但RMI是一個僅限于Java的分布式對象系統(tǒng),這個系統(tǒng)使用了一個java特有的傳輸協(xié)議,即java遠程方法協(xié)議(JRMP),在客戶端和服務(wù)器之間進行信息傳輸。然而,這也意味著使用這種協(xié)議只能訪問其他java對象,而無法訪問非java對象。
          遠程方法調(diào)用的實際處理過程與CORBA的過程相似,即RMI使用客戶端樁和服務(wù)器端框。要調(diào)用遠程方法,客戶端首先在樁上生成一個請求,然后將此請求傳遞給服務(wù)器,在服務(wù)器的框?qū)⒄埱筠D(zhuǎn)換成對遠程對象的實際方法調(diào)用。客戶端樁將遠程方法的所有參數(shù)序列化后傳遞給服務(wù)器框,框?qū)?shù)反序列化。
          但是由于這種協(xié)議不支持EJB需要的企業(yè)級交互,因為在這種類型的交互中必須通過遠程方法調(diào)用來傳遞事務(wù)和安全環(huán)境。為此sun公司創(chuàng)建了RMI-IIOP即基于因特網(wǎng)內(nèi)部對象請求代理協(xié)議之上的遠程方法調(diào)用。IIOP是一個用在CORBA對象請求代理間進行通信的協(xié)議,在IIOP之上的RMI同時具有RMI和CORBA技術(shù)的特點。

          LINUX方面
          1、LINUX下線程,GDI類的解釋。
          答:LINUX實現(xiàn)的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應(yīng)一個核心輕量級進程,而線程之間的管理在核外函數(shù)庫中實現(xiàn)。
          GDI類為圖像設(shè)備編程接口類庫。

          posted @ 2006-07-04 08:02 多力宇揚 閱讀(1069) | 評論 (0)編輯 收藏

          ??????????????????????????????????????????????? 控制器組件 -- ActionServlet

          我們知道 Struts 的入口是 ActionServlet. org.apache.struts.ActionServlet 類在 Struts 應(yīng)用程序中負責攔截工作。所有來自客戶層的請求,在交給應(yīng)用程序處理之前,都會先經(jīng)過 ActionServlet ActionServlet 的一個實例接受到一個 HttpRequest 對象時,無論這是通過 doGet() 方法還是 doPost() 方法受到的 , 都會調(diào)用 process() 方法來處理該請求。 ActionServlet process() 方法如下所示 :

          Protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletExcepion

          {

          RequestUtils.selectModule(request,getServletContext());

          getRequestProcessor(getModuleConfig(request)).process(request,response);

          }

          盡管 process() 方法看起來并不復(fù)雜,但是它調(diào)用的方法卻很復(fù)雜。首先,它會調(diào)用 org.apache.struts.util.RequestUtils 類的靜態(tài)方法 selectModule(), 并把當前的請求和這個 Web 應(yīng)用程序的 ServletContext 都傳入該方法。 selectModule() 方法的工作是將 request.getServletContext() 返回的路徑與每個配置應(yīng)用模塊的前綴相匹配,從而選出處理當前請求的應(yīng)用模塊。

          : 如果你只用到了一個 Struts 配置文件 , 那么你就只會有一個應(yīng)用程序,也就是默認的應(yīng)用程序。為了讓默認的應(yīng)用程序和應(yīng)用模塊能夠簡單而一致的處理請求,默認應(yīng)用程序可視為一個應(yīng)用模塊。因此 , 任何請求只要不含應(yīng)用程序的后綴 (suffix), 都會被傳送給默認的應(yīng)用程序 , 由其處理。

          擴展 ActionServlet

          盡管 Struts 框架仍然允許你擴展 ActionServlet 類,但是這么做的好處已大不入前,因為它的大部分功能都已經(jīng)放到新的 RequestProcessor 類里了。如果你仍然想擴展自己的 ActionSerlvet 類,那么只要創(chuàng)建一個擴展了 ActionServlet 的類并配置 Struts 框架讓它使用你的類就可以了。看以下一個覆蓋了 init() 方法的類。

          ?

          Package dory.doo.framework;

          import javax.servlet.ServeltException;

          import javax.sertlvet.UnaviableException;

          import org.apache.struts.action.ActionServlet;

          import dory.doo.strutus.service.IStorefrontService;

          import dory.doo.strutus.service.StorefrontServiceImpl;

          import dory.doo.strutus.framework.util.IConstants;

          import dory.doo.strutus.framework.exceptions.DatastoreException;

          /**

          * 擴展了 Struts ActionServlet, 以此來完成你自己特殊的初始化工作

          */

          public class ExtendedActionServlet extends ActionServlet

          ?{

          ?? public void init() throws ServletException

          {

          ? // 確定你先調(diào)用了超類

          ? super.init();

          ? // 初始化持久存儲服務(wù)

          ? try

          ?? {

          ???? // 創(chuàng)建服務(wù)接口的一個實例

          ???? IStorefrontService serviceImpl=new StorefrontServiceImpl();

          ???? // 把服務(wù)對象存儲到應(yīng)用作用域類

          ???? getServletContext().setAttribute(IConstants.SERVICE_INTERPACE_KEY,serviceImpl);

          ?? }

          ? catch(DatastoreException ex)

          ?? {

          ???? // 如果服務(wù)對象的初始化工作出了問題,就關(guān)閉 web 應(yīng)用程序

          ???? ex.printStackTrace();

          ???? throw new UnavailableException(ex.getMessage());

          ?? }

          ??? }

          ?}

          覆蓋 init() 方法只是一個例子 , 你可以覆蓋任何你想覆蓋的方法 , 如果真的需要覆蓋 init() 方法 , 請確定你先調(diào)用了 super.init() 方法 , 這樣才會完成默認的初始化工作。

          要使用自己的 ActionServlet 子類,那么必須將 web.xml 修改如下 :

          ?<servlet>

          ?? <servlet-name>MyActionServlet</servlt-name>

          ?? <servlet-class>dory.doo.framework. ExtendedActionServlet</servlet-class>

          ?</servlet>

          Struts 初始化過程

          web.xml 文件中配置的初始化參數(shù)而定, servlet 容器首次啟動時 , 或者第一個對比 servlet 的請求來到時 ,servlet 容器就會加載 Stuts ActionServlet. 無論是哪種情況 ( 也不管是什么樣的 Java Servlet) ,都一定要保證 inint() 得到調(diào)用,而且必須在 servlet 處理任何請求之前完成。 Struts 框架在 init() 被調(diào)用時 , 會做好所有的初始化工作。看看如下就知道了它到底干了些什么 :

          1.?????? Struts 框架內(nèi)部的消息資源包進行初始化。這些消息資源包是用來向日志文件傳輸信息性,警示和錯誤消息的 . org.apache.struts.action.ActionResources 資源包 ( /org/acache/struts/action/ActionResources.properties 文件 ) 則用來取得這些內(nèi)部消息。

          2.?????? web.xml 文件加載控制 ActionServlet 類各項行為的初始化參數(shù)。這些參數(shù)包括 config,debug,detail 以及 convertNull

          3.?????? web.xml 文件加載 servlet 名和 servlet 映射信息,并進行初始化。這些值可供整個 Struts 框架使用 ( 幾乎都是給 JSP 標記庫使用 ), 以便在 HTML 表單提交時,輸出正確的 URL 目標。在此初始化期間, Struts 框架給所有使用 DTD 也會得到注冊。 DTD 接下來可以用于嚴正配置文件。

          4.?????? 加載默認應(yīng)用程序的 Struts 配置數(shù)據(jù),并進行初始化,這些配置數(shù)據(jù)由 config 初始化參數(shù)來指定。默認的 Struts 配置文件得到解析后,會創(chuàng)建一個 ApplicationConfig 對象,并存儲在 ServletContext 對象中。默認應(yīng)用程序的 ApplicationConfig 對象會以 org.apache.struts.action.APPLICATION 這個鍵值存儲在 ServeltContext 對象中。

          5.?????? Struts 配置文件中為默認應(yīng)用程序指定的每個消息資源都會被加載,初始化,并存儲在 ServletContext 對象中適當位置 ( 依每個 message-resources 元素中指定的 key 屬性而定 ) 。如果沒有指定 key 屬性,那么相應(yīng)的消息資源會鍵值 org.apache.struts.action.MESSAGE 來存儲。只有一個消息資源可作為默認消息資源存儲,因為每個鍵都必須是唯一的。

          6.?????? Struts 配置文件中所聲明的每個數(shù)據(jù)源都被會被加載并初始化。如果沒有指定任何 data-sources 元素,則會跳過這個步驟。

          7.?????? Struts 配置文件中所指定的每個 plug-in( 插件 ) 元素都會被加載和初始化。對于每個 plug-in 元素所指定的類,其 itit() 方法都將被調(diào)用。

          8.?????? 一旦默認應(yīng)用程序正確地完成了初始化之后, servlet init() 方法會確定是否指定了任何其他的應(yīng)用模塊,如果有的話,對于每個應(yīng)用模塊都要重復(fù)步驟 4-7

          : 為了達到更好的性能,你可能會嘗試為一個應(yīng)用程序建立多個 Struts 控制器 servlet 。這么做幾乎得不到更好的性能或擴展性, Struts 設(shè)計者也不認為這是一個好注意。 Servlet 是多線程的,因此可以讓多個客戶同時執(zhí)行。一個 servlet 就能同時為多個客戶提供服務(wù)。

          ?

          posted @ 2006-06-30 10:14 多力宇揚 閱讀(963) | 評論 (0)編輯 收藏

          在web應(yīng)用中實施過濾是我們常用的技術(shù),通過過濾,可以對請求進行統(tǒng)一編碼,對請求進行認證等.每個Fillter可能只擔任很少的任務(wù),多個Filter可以互相協(xié)作,通過這種協(xié)作,可以完成一個復(fù)雜的功能.

          Fileter
          聲明: public interface Filter
          它是Filter必須實現(xiàn)的接口,它包含一下的方法
          . init(FilterConfig config): 這個方法初始化Filter.
          . doFilter(ServletRequest request,ServletResponse,FilterChain chain): Filter的業(yè)務(wù)方法就在這里實現(xiàn).
          . destory(): 釋放Filter占用的資源.

          FilterChain
          聲明: public interface FilterChain
          它是代碼的過濾鏈,通過這個接口把過濾的任務(wù)在不同的Filter之間轉(zhuǎn)移.它包含一個方法:
          doFilter(ServletRequest,request,ServletResponse response)
          通過這個方法來調(diào)用下一下Filter,如果沒有嚇一個Filter,那么將調(diào)用目標資源.

          FilterConfig
          聲明: public interface FilterConfig
          代表了Filter的配置,和Servlet一樣,Servlet也有一些配置信息,比如名字和初始化參數(shù)等.
          它包含以下的方法.
          .getFilterName(): 返回Filter的名字.
          .getInitParameter(String name): 獲得名稱為name的初始化參數(shù)
          .getServletContext(): 返回這個Filter所在Servlet上下文對象.
          .getInitParameterNames(): 獲得Filter配置中的所有初始化參數(shù)的名字.

          過濾器主要對客戶端的請求和客戶端的響應(yīng)進行統(tǒng)一處理.最常見的web過濾器有權(quán)限認證過濾器,字符編碼過濾器,圖象處理過濾器等.

          字符編碼過濾器(EncodingFillter.java)
          package dorydoo.util;

          import javax.servlet.FilterChain;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.ServletException;
          import javax.servlet.FilterConfig;
          /**
          ?*
          ?* @author?Dory Doo
          ?*/
          public class EncodingFillter implements Filter
          {
          ??? protected FilterConfig filterConfig;
          ??? private String targetEncoding="gb2312";
          ??? /**
          ???? *初始化過濾器像一般的Servlet一樣,它也可以獲得初始化參數(shù)
          ??? */
          ??? public void init(FilterConfig config)throws ServletException
          ??? {
          ??????? this.filterConfig=config;
          ??????? this.targetEncoding=config.getInitParameter("encoding");
          ??? }
          ??? /**
          ???? *進行過濾處理,最最要的地方就是這里了
          ??? */
          ??? public void doFilter(ServletRequest srequest,ServletResponse sresponse,FilterChain chain)
          ??? throws IOException,ServletException
          ??? {
          ??????? System.out.println("使用以下方法進行編碼:encoding="+targetEncoding);
          ???????
          ??????? HttpServletRequest request=(HttpServletRequest)srequest;
          ??????? request.setCharacterEncoding(targetEncoding);
          ??????? //把處理權(quán)發(fā)送到下一個
          ??????? chain.doFilter(srequest,sresponse);
          ??? }
          ???
          ??? public void setFilterConfig(final FilterConfig filterConfig)
          ??? {
          ??????? this.filterConfig=filterConfig;
          ??? }
          ??? //銷毀過濾器
          ??? public void destroy()
          ??? {
          ??????? this.filterConfig=null;
          ??? }
          }
          然后在web.xml中配置我們的應(yīng)用.
          ?<web-app>
          ????? .................
          ??????? <!--Filter Config-->
          ?????? <filter>
          ??????????? <filter-name>cncoding</filter-name>
          ??????????? <filter-class>dorydoo.util.EncodingFilter</filter-class>
          ??????????? <init-param>
          ??????????????? <param-name>encoding</param-name>
          ??????????????? <param-value>gb2312</param-value>
          ??????????? </init-param>
          ??????? </filter>??
          ??????? <filter-mapping>
          ??????????? <filter-name>encoding</filter-name>
          ??????????? <servlet-name>action</servlet-name>
          ??????? </filter-mapping>?
          ??????? <filter-mapping>
          ??????????? <filter-name>encoding</filter-name>
          ??????????? <url-pattern>/*</url-pattern>
          ??????? </filter-mapping>
          ????? ........
          ?</web-app>


          在來看一用戶認證的過濾器(SignonFilter)
          package dorydoo.util;

          import javax.servlet.FilterChain;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.ServletException;
          import javax.servlet.FilterConfig;
          import javax.servlet.http.HttpSession;
          /**
          ?*
          ?* @author DuYang
          ?*/
          public class SignonFilter implements Filter
          {
          ??? protected FilterConfig filterConfig;
          ??? String LOGIN_PAGE="login.jsp";
          ??? /**
          ???? *初始化過濾器像一般的Servlet一樣,它也可以獲得初始化參數(shù)
          ??? */
          ??? public void init(FilterConfig config)throws ServletException
          ??? {
          ??????? this.filterConfig=config;
          ??? }
          ??? /**
          ???? *進行過濾處理,最最要的地方就是這里了
          ??? */
          ??? public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
          ??? throws IOException,ServletException
          ??? {????
          ??????? HttpServletRequest hreq=(HttpServletRequest)req;
          ??????? HttpServletResponse hres=(HttpServletResponse)res;
          ??????? HttpSession session=hreq.getSession();
          ??????? String isLogin="";
          ??????? try
          ??????? {
          ??????????? isLogin=(String)session.getAttribute("isLogin");
          ??????????? if(isLogin.equals("true"))
          ??????????? {
          ??????????????? System.out.println("在SignonFilter中驗證通過");
          ??????????????? //驗證通過繼續(xù)處理
          ??????????????? chain.doFilter(req,res);
          ??????????? }
          ??????????? else
          ??????????? {
          ??????????????? //驗證不成功重新登錄
          ??????????????? hres.sendRedirect(LOGIN_PAGE);
          ??????????????? System.out.println("被SignonFilter攔截一個為認證的請求");
          ??????????? }
          ??????? }
          ??????? catch(Exception e)
          ??????? {
          ??????????? e.printStackTrace();
          ??????? }
          ??? }
          ???
          ??? public void setFilterConfig(final FilterConfig filterConfig)
          ??? {
          ??????? this.filterConfig=filterConfig;
          ??? }
          ??? //銷毀過濾器
          ??? public void destroy()
          ??? {
          ??????? this.filterConfig=null;
          ??? }
          }
          在SignonFilter的doFilter()方法中,首先通過isLogin=(String)session.getAttribute("isLogin");判斷是否登錄用戶,如果不是則返回到login頁面.配置web.xml文件就和上面的基本上沒什么差別.

          posted @ 2006-06-29 11:23 多力宇揚 閱讀(298) | 評論 (0)編輯 收藏

          因為自己獲得過別人的幫助,所以把自己的資源拿出來幫助別人,如果你需要這些資源,請留下email,我會在晚上一起發(fā)送給大家,這次分享的資源目錄如下:(里面的都是我測試好了,都已經(jīng)下載到我的本地機器上了的,所以大家放心,可能有的比較慢,還有大家需要自己去尋找最好的下載時間,因為我在下載張孝詳老師的講座的時候有的課程就比較慢有的就很快130KB/s),如果需要就趕緊吧,因為有的服務(wù)器不大穩(wěn)定.
          contents:
          (1) MySQL數(shù)據(jù)庫教程光盤
          (2) LINUX視屏教程
          (3).面向?qū)ο蟪绦蛟O(shè)計
          (4).張孝詳JavaScript視頻講座
          (5).動態(tài)網(wǎng)頁設(shè)計(ASP+JSP+PHP)
          (6).JSP程序設(shè)計
          (7).Eclipse基礎(chǔ)教程
          (8).HTML語言速成
          (9).HTML協(xié)議教程
          (9).xml_asp_學習光盤
          (10)JAVA程序設(shè)計計算
          (11)WEB應(yīng)用系統(tǒng)設(shè)計[32講]

          暫時就分享到這里吧,以后有空了在和大家分享,有問題請博客留言或者mail To me ^_^!大多數(shù)我在下載的時候速度都達到了130KB/s,只有少數(shù)幾個課程比較慢一點!例外我只能以郵件附件的形式發(fā)送給大家,請大家放心絕對安全,呵呵!

          posted @ 2006-06-28 10:52 多力宇揚 閱讀(899) | 評論 (10)編輯 收藏

          ? Tomcat從5.x開始就可以在server.xml里配置數(shù)據(jù)源,后來用到了Proxool對比了一下覺得Proxool更方便更好用,它提供了更多的方法,簡單,推薦大家使用.
          ? 下載地址:http://proxool.sourceforge.net/ 最新版本為: Proxool 0.9.0RC2
          ? 下載后解壓縮Proxool 0.9.0RC2后,把Proxool 0.9.0RC2/lib下的.jar文件部署到WEB-INF/lib下.
          ? 看看下面的范例(example for Oracle):
          ? Proxool.jsp

          <%@ page import="java.sql.*"%>
          <%@ page contentType="text/html;charset=gb2312"%>

          <html>
          ?? ?<head>
          ?? ??? ?<title>Proxool.jsp</title>
          ?? ?</head>
          ?? ?<body>
          ?? ??? ?<h2>使用Proxool.jsp</h2>
          ?? ??? ?<%
          ?? ??? ??? Connection con=null;
          ?? ??? ??? Statement stmt=null;
          ?? ??? ??? ResultSet rs=null;
          ?? ??? ?? ?
          ?? ??? ??? String ename="";
          ?? ??? ?? ?
          ?? ??? ??? try
          ?? ??? ??? {
          ?? ??? ????? Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
          ?? ??? ????? con=DriverManager.getConnection("proxool.JSPBook:oracle.jdbc.driver.OracleDriver:
          ?????????????????????? jdbc:oracle:thin:@yang:1521:orcl","scott","ss");?? ??? ???? ?
          ?? ??? ????? stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
          ?? ??? ?????????????????????????????? ResultSet.CONCUR_UPDATABLE);
          ?? ??? ????? String query="select * from emp";
          ?? ??? ????? rs=stmt.executeQuery(query);
          ?? ??? ????? while(rs.next())
          ?? ??? ????? {
          ?? ??? ??????? ename=rs.getString("ename");
          ????? %>
          ??????? 從emp表中取出姓名<%=ename%><br>
          ????? <%
          ?? ??? ????? }
          ?? ??? ????? stmt.close();
          ?? ??? ????? con.close();
          ?? ??? ??? }
          ?? ??? ??? catch(SQLException e)
          ?? ??? ??? {
          ?? ??? ????? out.println("發(fā)生異常"+e);
          ?? ??? ??? }
          ?? ??? ??? finally
          ?? ??? ??? {
          ?? ??? ????? try
          ?? ??? ????? {
          ?? ??? ??????? if(con!=null)
          ?? ??? ??????? {
          ?? ??? ????????? con.close();
          ?? ??? ??????? }
          ?? ??? ????? }
          ?? ??? ????? catch(SQLException ne)
          ?? ??? ????? {
          ?? ??? ??????? out.println("SQLException:"+ne);
          ?? ??? ????? }
          ?? ??? ??? }
          ?? ??? ?%>
          ?? ?</bdoy>
          </html>
          Proxool.jsp通過Proxool連接池取得Connection,然后顯示emp表格中的ename.
          首先動態(tài)加載Proxool的driver:
          ? Class.forName("org.logicalcobwebs.proxool.ProxoolDriver);
          然后將Proxool URL分為三個部分: 連接池的別名,JDBC驅(qū)動程序(DataBase JDBC Drivers),連接URL.

          設(shè)定Proxool
          proxool提供了許多連接池的參數(shù),例如:連接池最多有幾個Connection,最少有幾個Connection,Connection生命期限等等。
          Proxool主要有以下四種設(shè)定方式:
          (一) 通過java.util.Properties對象來設(shè)定,例如:
          Properties info=new Properties();
          info.setProperty("proxool.maximum-connection-count","20");
          info.setProperty("proxool.house-keeping-test-sql","select CURRENT_DATE");
          info.setProperty("user","your DB username");
          info.setProperty("password","your DB prassword");
          String alias="Develop"; //Proxool連接池的別名,根據(jù)自己喜好隨便寫^_^
          String driverClass="oracle.jdbc.driver.OracleDriver";
          String driverUrl="jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName";
          String url="proxool."+alias+":"+drvierClass+":"+driverUrl;
          connection=DrvierManager.getConnection(rul,info);

          (二) 通過XML文件來設(shè)定,例如:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!--the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored.-->
          <proxool>
          ? <alias>Develop</alias>
          ? <driver-url>
          ??? jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
          ? </driver-url>
          ? <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
          ? <driver-properties>
          ??? <property name="user" value="your database name"/>
          ??? <property name="password" value="your DB password"/>
          ? </driver-properties>
          ? <maximum-connection-count>10</maximum-connection-count>
          ? <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
          </proxool>
          然后通過JAXPConfiguration讀取XML文件:
          JAXPConfigurator.configure("/WEB-INF/classes/proxool.xml",false);

          (三) 先通過Properties文件來設(shè)定,例如:
          jdbc-0.proxool.alias=Develop
          jdbc-0.proxool.drvier-url=jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
          jdbc-0.proxool.driver-class=oracle.jdbc.driver.OracleDriver;
          jdbc-0.user=your database username
          jdbc-0.password=your database password
          jdbc-0.proxool.maximum-connection-count=10
          jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
          然后通過PropertyConfigurator讀取Properties文件:
          PropertyConfigurator.configure("/WEB-INF/classes/Proxool.properties");

          (四)在web.xml中,通過servlet來設(shè)定.方法又有三種,前兩種是按照格式來的:
          1.XML文件
          <servlet>
          ? <servlet-name>ServletConfigurator</servlet-name>
          ? <servlet-class>
          ???? org.logicalcobwebs.proxool.configuration.ServletConfigurator
          ? </servlet-class>
          ? <init-param>
          ???? <param-name>xmlFile</param-name>
          ???? <param-value>WEB-INF/classes/Proxool.xml</param-value>
          ? </init-param>
          ? <load-on-start>1</load-on-start>
          </servlet>

          2.Properties文件
          <servlet>
          ? <servlet-name>ServletConfigurator</servlet-name>
          ? <servlet-class>
          ???? org.logicalcobwebs.proxool.configuration.ServletConfigurator
          ? </servlet-class>
          ? <init-param>
          ???? <param-name>propertyFile</param-name>
          ???? <param-value>WEB-INF/classes/Proxool.properties</param-value>
          ? </init-param>
          ? <load-on-start>1</load-on-start>
          </servlet>

          3.Init Prameter
          <servlet>
          ? <servlet-name>ServletConfigurator</servlet-name>
          ? <servlet-class>
          ???? org.logicalcobwebs.proxool.configuration.ServletConfigurator
          ? </servlet-class>
          ? <init-param>
          ???? <init-name>jdbc-0.proxool.alias</init-param>
          ???? <init-value>Develop</init-value>
          ? </init-param>
          ? <init-param>
          ???? <init-name>jdbc-0.proxool.driver-rul</init-param>
          ???? <init-value>
          ??????? jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
          ???? </init-value>
          ? </init-param>
          ? <init-param>
          ???? <init-name>jdbc-0.proxool.driver-class</init-param>
          ???? <init-value>oracle.jdbc.driver.OracleDriver</init-value>
          ? <init-param>
          </servlet>

          建議大家使用第四種方法,好處在于當Container啟動時,Proxool的參數(shù)會自動設(shè)定加載到內(nèi)存中,原因在于:
          <servlet>
          ......略
          <load-on-start>1</load-on-start>

          一個完整的示例如下:
          web.xml
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
          ???????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ???????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          ???????? version="2.4">
          .......略
          ? <servlet>
          ???? <servlet-name>ServletConfigurator</servlet-name>
          ???? <servlet-class>
          ?????? org.logicalcobwebs.proxool.configuration.ServletConfigurator
          ???? </servlet-class>
          ???? <init-param>
          ?????? <param-name>propertyFile</param-name>
          ?????? <param-value>WEB-INF/classes/Proxool.properties</param-value>
          ???? </init-param>
          ???? <load-on-start>1</load-on-start>
          ? </servlet>
          .......略
          </web-app>

          Proxool.proterties
          jdbc-0.proxool.alias=Develop
          jdbc-0.proxool.driver-class=oracle.jdbc.driver.OracleDriver
          jdbc-0.proxool.driver.url=jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
          jdbc-0.proxool.maximum-connection-count=10
          jdbc-0.proxool.prototype-count=4
          jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
          jdbc=0.proxool.verbose=true

          我們可以用下面的Test Page來進行測試
          Proxool-config.jsp
          ____________________________________________________
          <%@ page import="java.sql.*"%>
          <%@ page contentType="text/html;charset=gb2312"%>

          <html>
          ?? ?<head>
          ?? ??? ?<title>Proxool.jsp</title>
          ?? ?</head>
          ?? ?<body>
          ?? ??? ?<h2>使用Proxool.jsp</h2>
          ?? ??? ?<%
          ?? ??? ??? Connection con=null;
          ?? ??? ??? Statement stmt=null;
          ?? ??? ??? ResultSet rs=null;
          ?? ??? ?? ?
          ?? ??? ??? String ename="";
          ?? ??? ?? ?
          ?? ??? ??? try
          ?? ??? ??? {
          ?? ??? ????? con=DriverManager.getConnection("proxool.Develop");?? ??? ???? ?
          ?? ??? ????? stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
          ?? ??? ?????????????????????????????? ResultSet.CONCUR_UPDATABLE);
          ?? ??? ????? String query="select * from emp";
          ?? ??? ????? rs=stmt.executeQuery(query);
          ?? ??? ????? while(rs.next())
          ?? ??? ????? {
          ?? ??? ??????? ename=rs.getString("ename");
          ????? %>
          ??????? 從emp表中取出姓名<%=ename%><br>
          ????? <%
          ?? ??? ????? }
          ?? ??? ????? stmt.close();
          ?? ??? ????? con.close();
          ?? ??? ??? }
          ?? ??? ??? catch(SQLException e)
          ?? ??? ??? {
          ?? ??? ????? out.println("發(fā)生異常"+e);
          ?? ??? ??? }
          ?? ??? ??? finally
          ?? ??? ??? {
          ?? ??? ????? try
          ?? ??? ????? {
          ?? ??? ??????? if(con!=null)
          ?? ??? ??????? {
          ?? ??? ????????? con.close();
          ?? ??? ??????? }
          ?? ??? ????? }
          ?? ??? ????? catch(SQLException ne)
          ?? ??? ????? {
          ?? ??? ??????? out.println("SQLException:"+ne);
          ?? ??? ????? }
          ?? ??? ??? }
          ?? ??? ?%>
          ?? ?</bdoy>
          </html>
          測試結(jié)果為:
          =====================================
          使用Proxool.jsp
          從emp表中取出姓名SMITH
          從emp表中取出姓名ALLEN
          從emp表中取出姓名WARD
          從emp表中取出姓名JONES
          從emp表中取出姓名MARTIN
          從emp表中取出姓名BLAKE
          從emp表中取出姓名CLARK
          從emp表中取出姓名SCOTT
          從emp表中取出姓名KING
          從emp表中取出姓名TURNER
          從emp表中取出姓名ADAMS
          從emp表中取出姓名JAMES
          從emp表中取出姓名FORD
          從emp表中取出姓名MILLER
          從emp表中取出姓名feiyang
          從emp表中取出姓名yang
          從emp表中取出姓名feifei
          從emp表中取出姓名fei

          posted @ 2006-06-28 09:51 多力宇揚 閱讀(606) | 評論 (0)編輯 收藏

          Tomcat下JNDI的配置

          ??? JNDI全名為Java Naming and Directory Interface.JNDI主要提供應(yīng)用程序所需要資源上命名與目錄服務(wù).在Java EE環(huán)境中,JNDI扮演了一個很重要的角色,
          它提供了一個接口讓用戶在不知道資源所在位置的情形下,取得該資源服務(wù).
          ??? 就好比網(wǎng)絡(luò)磁盤驅(qū)動器的功能一樣。如果有人事先將另一臺機器上的磁盤驅(qū)動器接到用戶的機器上,用戶在使用的時候根本就分辨不出現(xiàn)在的驅(qū)動器是存在本端,
          還是在另一端的機器上,用戶只需取得資源來用,根本就不知道資源在什么地方。
          ??? JNDI這個接口基本上是LDAP,LDAP全名為Lightweight Directory Access Protocol.
          ?? ?
          ??? 要設(shè)定JNDI的JDBC數(shù)據(jù)源和DBCP連接池需要做以下的工作:(for example Oracle DataBase)

          ??? 一. 安裝JDBC Driver
          ??? 將你DB的JDBC Driver部署到{Tomcat_Install]\common\lib目錄下。
          ??? 二. 設(shè)定Tomcat下的server.xml
          ??? 修改{Tomcat_Install|\conf\server.xml文件中你的站臺標簽里的<Host></Host>之間的內(nèi)容.如下:
          ??? server.xml
          ???? <Host>
          ??????? <Context path="/Develop" docBase="Develop" debug="0" reloadable="true"?????????????? crossContext="true">
          ??????? <Resource name="jdbc/dy" auth="Container" type="javax.sql.DataSource"/>
          ??????????? <ResourceParams name="jdbc/dy">
          ?????????????? <parameter>
          ????????????????? <name>factory</name>
          ????????????????? <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>driverClassName</name>
          ????????????????? <value>oracle.jdbc.driver.OracleDriver</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>url</name>
          ????????????????? <value>jdbc:oracle:thin:@yang:1521:orcl</value>
          ?????????????? </parameter>????????????? ?
          ?????????????? <parameter>
          ????????????????? <name>username</name>
          ????????????????? <value>scott</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>password</name>
          ????????????????? <value>ss</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>maxActive</name>
          ????????????????? <value>20</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>maxIdle</name>
          ????????????????? <value>10</value>
          ?????????????? </parameter>
          ?????????????? <parameter>
          ????????????????? <name>maxWait</name>
          ????????????????? <value>-1</value>
          ?????????????? </parameter>? ????????????????????????????????????????????????????????????? ?
          ??????????? </ResourceParams>
          ??????? </Context>
          ????? </Host>
          ? 上述社定所表示的意思是在Develop站臺中,定義一個JDBC數(shù)據(jù)來源,名稱為jdbc/dy.
          ? 通過以下的代碼來設(shè)置的這個jdbc/dy的數(shù)據(jù)來源和DBCP連接池:
          ? <parameter>
          ???? <name>factory</name>
          ???? <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
          ? </parameter>
          ? 設(shè)定使用DBCP連接池,這是有Jakarta Project組織所制定的連接池程序,它一樣是OpenSource的.
          參數(shù)說明:
          ???? <Context></Context>用于設(shè)置你的站臺.
          ???? <Context>標簽中的path="/Develop"代表網(wǎng)站名稱,即: http://IP_DomaninName/Develop; docBase="Develop"代表站臺的目錄位置,debug則是設(shè)定debug level
          ???? ,0表示提供最少的信息,9表示提供最都多的信息;reloadable則表示Tomcat執(zhí)行時,當class,web.xml被更新時,都會自動重新加載,不需要重新啟動Tomcat;
          ???? maxActive表示連接池的最大數(shù)據(jù)庫連接數(shù);設(shè)為0表示無限制;maxIdle表示設(shè)定連接池中最小能有幾個Connection,若為0表示不限制;maxWait 最大建立連接等待時間。
          ??? 如果超過此時間將接到異常,設(shè)為-1表示無限制,單位為ms;driverClassName JDBC驅(qū)動程序;url表示數(shù)據(jù)庫連接字符串.

          ?三. 設(shè)定應(yīng)用站臺中的web.xml
          ?eg:設(shè)定Develop的web.xml如下:
          ? <resource-ref>
          ???? <description>JNDI JDBC DataSource of Develop</description>?? //一個描述
          ???? <res-ref-name>jdbc/dy</res-ref-name>??????????????????????? //這里必須為你之前指定的<ResourceParams name="jdbc/dy">
          ???? <res-type>javax.sql.DataSource</res-type>
          ???? <res-auth>Container</res-auth>
          ? </resource-ref>

          ?四. 使用JDBC數(shù)據(jù)來源獲得Connection對象
          ?? Context initContext=new InitialContext();
          ?? Context envContext=(Context)initContext.lookup("java:/comp/env");
          ?? 或者
          ?? Context envContext=(Context)initContext.lookup("java:comp/env");
          ?? DataSourceds conn=(DataSource)envContext.lookup("jdbc/dy");
          ?? conn=ds.getConnection();

          按照這四個步驟做下來后,那么你就可以寫個Test Page來測試一下了.
          Test Page1:
          _________________________________________________________________________________________________________
          testpool.jsp
          <!--測試JNID數(shù)據(jù)源的配置-->
          <%@ page contentType="text/html;charset=gb2312"%>
          <%@ page import="javax.naming.Context"%>
          <%@ page import="javax.sql.DataSource"%>
          <%@ page import="javax.naming.InitialContext"%>
          <%@ page import="java.sql.*"%>
          <%
          ? DataSource ds=null;
          ? try
          ? {
          ????? Context initCtx=new InitialContext();
          ????? Context envCtx=(Context)initCtx.lookup("java:comp/env");
          ????? //從Context中l(wèi)oopup 數(shù)據(jù)源
          ????? ds=(DataSource)envCtx.lookup("jdbc/dy");
          ????? if(ds!=null)
          ????? {
          ??????? out.println("已經(jīng)獲得DataSource!");
          ??????? out.println("<br>");
          ??????? Connection conn=ds.getConnection();
          ??????? Statement stmt=conn.createStatement();
          ??????? ResultSet rst=stmt.executeQuery("select * from emp");
          ??????? out.println("以下是從數(shù)據(jù)庫里讀出來的數(shù)據(jù)");
          ??????? out.println("<hr>");
          ??????? while(rst.next())
          ??????? {
          ????????? out.println("empName:"+rst.getString("ename"));
          ????????? out.println("<br>");
          ??????? }
          ????? }
          ??? else
          ?? ??? ?out.println("連接失敗");
          ? }
          ? catch(Exception e)
          ? {
          ????? out.println(e);
          ? }
          %>
          如果成功那么輸出結(jié)果:
          ========================================
          已經(jīng)獲得DataSource!
          以下是從數(shù)據(jù)庫里讀出來的數(shù)據(jù):
          empName:SMITH
          empName:ALLEN
          empName:WARD
          empName:JONES
          empName:MARTIN
          empName:BLAKE
          empName:CLARK
          empName:SCOTT
          empName:KING
          empName:TURNER
          empName:ADAMS
          empName:JAMES
          empName:FORD
          empName:MILLER
          empName:feiyang
          empName:yang
          empName:feifei
          empName:fei

          posted @ 2006-06-28 09:48 多力宇揚 閱讀(550) | 評論 (0)編輯 收藏

          JDBC 2.0比1.0有了一些不同,體現(xiàn)在四個比較明顯的方面:
          1>. ResutlSet對象中的Cursor能夠自由上下移動
          2>. 能直接使用Java程序語言來更新DB表里的內(nèi)容,而不需要額外寫SQL語法
          3>. 可以一次傳送許多SQL語句到DB執(zhí)行----Batch
          4>. 新增2個數(shù)據(jù)類型(BLOB和CLOB)
          ?? 我們知道在JDBC 1.0時,只要用 connection.createStatement()就能取得Statement()對象.不過在2.0中多的createStatement()
          多了兩個參數(shù)值,需要我們自己來定義它.
          public Statement createStatement(int resultSetType,
          ???????????????????????????????? int resultSetConcurrency)throws SQLException
          ?? 第一個參數(shù)resultSetType用來設(shè)定ResultSet對象中的光標是否可以自由上下移動,它的值有三種,TYPE_FORWARD_ONLY,TYPE_SCROLL_SENSITIVE,
          TYPE_SCROLL_INSENSITIVE.若為TYPE_FORWARD_ONLY就表示和1.0一樣只能用next()方法;然后后兩者可以讓Cursor隨便的自由移動,不過,
          它們兩者最大的區(qū)別在于:當ResutlSet中的值有改變時,TYPE_SCROLL_SENSITIVE能取得修改后的值,而TYPE_SCROLL_INSENSITIVE則不能.
          ? 第而個參數(shù)resultSetConcurrentcy,主要是設(shè)定ResultSet對象是只讀(read-only)還是可以改變的(updateable),它可能的值有兩種,
          CONCUR_READ_ONLY或者是CONCUR_UPDATE.若設(shè)置為CONCUR_READ_ONLY,ResultSet對象和1.0一樣;若為CONCUR_UPDATEABLE,那么就可以用
          ResultSet對象執(zhí)行數(shù)據(jù)庫的修改,增加和移除功能.for example:
          先看功能和1.0一樣的寫法:
          Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
          ?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
          RestultSet rs=stmt.executeQuery("select ename,empno from emp");
          while(rs.next())
          {
          ?? String name=rs.getString("ename");
          ?? int empno=rs.getInt("empno");
          ?? System.out.println("name="+name+","+"number="+empno);
          }
          輸出結(jié)果為:
          name=feiyang,number=1190
          name=jack,?? number=1230
          name=BillGates number=12
          ...........
          再看看下面這個:
          Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
          ?????????????????????????????????? ResultSet.CONCUR_READ_ONLY);
          RestultSet rs=stmt.executeQuery("select ename,empno from emp");
          rs.afterLast();
          while(rs.previous())
          {
          ?? String name=rs.getString("ename");
          ?? int empno=rs.getInt("empno");
          ?? System.out.println("name="+name+","+"number="+empno);
          }
          輸出結(jié)果為:
          name=BillGates number=12
          name=jack,?? number=1230
          name=feiyang,number=1190
          .............
          這和上面第一有點不同的是順序顛倒了,這是因為我們使用了rs.afterLast()這個方法.其實2.0中還有很多方法,如下:
          rs.absolute(-1); //表示cursor在最后一筆數(shù)據(jù),即 rs.last()
          rs.absolute(1);? //表示cursor在第一筆數(shù)據(jù),即rs.first()
          rs.absolute(n);? //表示cursor在第N筆數(shù)據(jù)
          假使我們目前有1000筆數(shù)據(jù),取得第997筆
          rs.absolute(-4);
          還有一個方法和absolute很相像,那就是relative(),
          rs.absolute(5); //表示第五筆數(shù)據(jù)
          ......
          rs.relative(-3);? //表示cursor目前在第二筆數(shù)據(jù)
          .......
          rs.relative(1);? //cursor目前在第三筆數(shù)據(jù)
          看看怎么用ResultSet對象執(zhí)行更新數(shù)據(jù)庫動作
          ?? 要讓ResultSet對象執(zhí)行更新數(shù)據(jù)庫的動作,首先在聲明Statement對象時,參數(shù)必須設(shè)置為TYPE_SCROLL_SENSITIVE和
          CUNCOR_UPDATEABLE.
          Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
          ????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
          ResultSet rs=stmt.executeQuery("select ename,empno from emp);
          rs.last();
          rs.updateInt("empno",2230);
          rs.cancelRowUpdates();
          rs.updateInt("empno",1213);
          rs.updateRow();
          新增數(shù)據(jù)到數(shù)據(jù)庫
          Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
          ????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
          ResultSet rs=stmt.executeQuery("select * from emp);
          rs.moveToInsertRow();
          rs.updateInt("empno",2230);
          rs.updateString("ename","feiyang");
          rs.updateString("job","clerk");
          rs.updateFloat("sal",123456.5);
          rs.insertRow();
          刪除數(shù)據(jù)
          Statement stmt=con.createStatment(RestultSet.TYPE_SCROLL_SENSITIVE,
          ????????????????????????????????? ResultSet.CONCUR_UPDATEABLE);
          ResultSet rs=stmt.executeQuery("select * from emp);
          rs.absolute(4);
          rs.deleteRow();
          依次執(zhí)行多條SQL語句
          Statement stmt=con.createStatment();
          int[] rows;
          stmt.addBatch("insert into emp values('feiyang','123456')");
          stmt.addBatch("insert into offcie values('employee','Shanghai')");
          rows=stmt.executeBatch();
          當執(zhí)行大量數(shù)據(jù)的時候為了數(shù)據(jù)的完整性,建議使用Transaction
          eg:
          con.setAutoCommit(false);
          Statement stmt=con.createStatement();
          int[] rows;
          stmt.addBatch("1...........");
          stmt.addBatch("2...........");
          stmt.addBatch("3...........");
          stmt.addBatch("4...........");
          stmt.addBatch("5...........");
          stmt.addBatch("6...........");
          rows=stmt.executeBatch();
          con.commit();
          在JDBC2.0中新增加BLOB和CLOB兩個數(shù)據(jù)類型
          BOLB指的是二進制大型對象(Binary Large Object),CLOB指的是字符大型對象(Character Large Object).它們用來處理大型
          的數(shù)據(jù)類型,他們分別代表大量的二進制數(shù)據(jù)和文字數(shù)據(jù).

          posted @ 2006-06-28 09:46 多力宇揚 閱讀(434) | 評論 (0)編輯 收藏

          checkbox全選實現(xiàn)
          ?
          function CheckOthers(form)
          {
          ??? for (var i=0;i<form.elements.length;i++)
          ??? {
          ??????? var e = form.elements[i];
          //??????? if (e.name != 'chkall')
          ??????????? if (e.checked==false)
          ??????????? {
          ??????????????? e.checked = true;// form.chkall.checked;
          ??????????? }
          ??????????? else
          ??????????? {
          ??????????????? e.checked = false;
          ??????????? }
          ??? }
          }

          function CheckAll(form)
          {
          ??? for (var i=0;i<form.elements.length;i++)
          ??? {
          ??????? var e = form.elements[i];
          //??????? if (e.name != 'chkall')
          ??????????? e.checked = true// form.chkall.checked;
          ??? }
          }
          建立表單對象,表單名:name=form,并建立checkbox,命名:name="checked"
          建立全選按鈕,代碼:
          <INPUT title=選擇所有的Banner,點擊選定按鈕 onclick=CheckAll(this.form) type=button value=全選 name=chkall style="cursor:hand">
          建立反選按鈕,代碼:
          <INPUT title=反向選擇所有的Banner,點擊選定按鈕 onclick=CheckOthers(this.form) type=button value=反選 name=chkOthers style="cursor:hand">

          ?

          ?

          完整代碼:

          <%@page contentType="text/html;charset=gb2312"%>
          <html>
          ?<head>
          ? <title>Dory.Doo-測試JSTL</title>
          ? <script language="javascript">
          ?? <!--
          ?? function CheckOthers(form)
          {
          ??? for (var i=0;i<form.elements.length;i++)
          ??? {
          ??????? var e = form.elements[i];
          //??????? if (e.name != 'chkall')
          ??????????? if (e.checked==false)
          ??????????? {
          ??????????????? e.checked = true;// form.chkall.checked;
          ??????????? }
          ??????????? else
          ??????????? {
          ??????????????? e.checked = false;
          ??????????? }
          ??? }
          }

          function CheckAll(form)
          {
          ??? for (var i=0;i<form.elements.length;i++)
          ??? {
          ??????? var e = form.elements[i];
          //??????? if (e.name != 'chkall')
          ??????????? e.checked = true// form.chkall.checked;
          ??? }
          }
          ?? -->
          ? </script>
          ?</head>
          ?<body>
          ? <h2>體育運動種類</h2>
          ? <hr>
          ? <form action="test.jsp" method="post" name="form">
          ?? <input type="checkbox" name="sports" value="football"/>足球<br>
          ?? <input type="checkbox" name="sports" value="basketball"/>藍球<br>
          ?? <input type="checkbox" name="sports" value="f1"/>F1<br>
          ?? <input type="checkbox" name="sports" value="f3"/>賽車<br>
          ?? <input type="checkbox" name="sports" value="f5"/>談話<br>
          ?? <input type="checkbox" name="sports" value="qe"/>好<br>
          ?? <input type="checkbox" name="sports" value="fs"/>Helo<br>
          ?? <input type="checkbox" name="sports" value="a1"/>a1<br>
          ?? <input type="checkbox" name="sports" value="a2"/>a2<br>
          ?? <input type="checkbox" name="sports" value="a3"/>a3<br>
          ?? <input type="checkbox" name="sports" value="a4"/>a4<br>
          ?? <input type="checkbox" name="sports" value="a5"/>a5<br>
          ?? <input type="checkbox" name="sports" value="a6"/>a6<br>
          ?? <input type="checkbox" name="sports" value="a7"/>a7<br>
          ?? <br>
          ?? <p></p>
          ?? <input type="submit" name="submit" value="提交">
          ?? <input type="reset" name="reset" value="重置">
          ??
          <INPUT title="選擇所有的Banner,點擊選定按鈕" onclick="CheckAll(this.form)"
          ?type="button" value="全選" name="chkall" style="cursor:hand">
          ???
          <INPUT title="反向選擇所有的Banner,點擊選定按鈕" onclick="CheckOthers(this.form)"
          type="button" value="反選" name="chkOthers" style="cursor:hand">
          ? </form>
          ?</body>
          </html>
          ?

          posted @ 2006-06-28 09:37 多力宇揚 閱讀(530) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 通河县| 平安县| 磐安县| 阳东县| 阜平县| 焦作市| 云浮市| 金溪县| 甘肃省| 玛多县| 盐池县| 卢龙县| 贵南县| 钦州市| 冀州市| 常德市| 调兵山市| 丁青县| 汝阳县| 武夷山市| 东乌| 潍坊市| 班戈县| 通化市| 金阳县| 句容市| 遵义县| 白朗县| 正宁县| 宁安市| 樟树市| 南部县| 宝兴县| 江孜县| 米林县| 蓬莱市| 塘沽区| 玉田县| 思南县| 武陟县| 五大连池市|