2006年6月29日

          動作映射

          這個時候,你可能會問自己:“當控制器接受到一個請求的時候,它如何知道調用哪個Action實例?”控制器要通過查看請求消息并使用一組動作
          映射(action mapping)來做出決定。動作映射是Struts配置信息(配置一個特殊的XML文件中)的一部分。這個配置信息會在啟動時加載到內存中
          ,讓Struts框架得以在運行時加以利用。每個action元素在內存中都被表示為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"字符串的請求時,就會調用LoginAction實例的execute()方法。Struts框架還會使用映射來指出“動作"完成后要讓用戶
          轉向哪個資源。

          ?

          使用Struts ActionForm

          Struts框架的ActionForm對象可用來在用戶和業務層之間傳輸客戶的輸入數據。Struts框架會自動從請求中收集輸入數據,再將這些數據交給
          一個使用表單bean(form bean)的Action對象,接著表單再交給業務層。為了把表示層和業務層分離開來,你不應該直接把ActionForm對象交
          給業務層,而是應該使用由ActionForm對象得到的數據創建適當的DTO。下面的步驟說明了Struts框架如何處理每個請求相應的ActionForm對
          象:
          ?
          ? 1.檢查該項動作的相應設置,查看是否已經有某個ActionForm得到配置。
          ? 2.如果對應這個動作配置了某個ActionForm,則使用action元素中的name屬性來查找表單bean的配置信息。
          ? 3.查看是否已經創建了一個ActionForm的一個實例。
          ? 4.如果在適當的作用域內已經存在一個ActionForm實例,而且這個實例的類型正是這個請求所需要的類型,則重用這個實例。
          ? 5.否則,創建所需ActionForm的一個新實例,并存儲在適當的作用域中(由action元素的scope屬性設置)。
          ? 6.調用ActionForm實例的reset()方法。
          ? 7.反復處理請求參數,如果參數名在ActionForm實例中具有對應的設置方法(setter method),就為它填上該請求參數的值。
          ? 8.最后,如果validate屬性的值設置為true,則調用ActionForm實例的validate()方法,并返回所出現的任何錯誤。
          對任何HTML頁面而言,如果表單數據是以POST方法傳輸的,就應該使用ActionForm。必要時,相同的ActionForm可以同時給多個頁面使用,只
          要HTML字段能和ActionForm對象的屬性(property)匹配就可以了。
          Struts框架所提供的ActionForm類實現了多個方法,但到目前為止,最重要的兩個方法就是reset()和validate():
          ? public void reset(ActionMapping mapping,HttpServletRequest request);
          ? public ActionErrors validate(ActionMapping mapping,HttpServletRequest request);
          在Struts ActionForm類中,這兩個方法的默認實現是不完成任何的邏輯。你必須在自己的ActionForm類中覆蓋這兩個方法。控制器以請求中的
          值來填寫ActionForm實例之前,會先調用reset()方法。reset()方法給了ActionForm一個機會,可將其屬性設置為原來默認的狀態。這一點非
          常重要,因為表單bean實例可能會由多個請求共享或者由好幾個不同的線程所存取。不過,如果你是讓好幾頁共享一個ActionForm實例,可能
          不會去想去實現reset()方法,這樣一來只要這個實例還在,屬性的值就不會被重新設置。另一種做法就是實現你自己的resetFields()方法,
          在成功更新業務之后,就從這個Action類來調用此方法。
          當請求中所攜帶的值已經插入到ActionFrom實例之后,控制器就回調用validate()方法。ActionForm應該對輸入數據完成必要的驗證工作,然
          后向控制器返回所檢測到的任何錯誤。業務邏輯驗證應該在業務對象中而不是在ActionForm中來完成。在ActionForm中所進行的驗證工作,只
          是表示的驗證而已。
          一旦寫好ActionForm類后,你必須通知Struts應用程序有這些ActionForm存在,告訴Struts應用程序哪個動作映射應該使用哪個ActionForm。
          這是在配置文件中設置的。第一步是為你的應用程序在配置文件中的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強及其網址

          No? 雜志名稱??????????????????????????????????????????????????? ???? ?網址???????????????????????????????????????????????? ?? 類別
          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(商業周刊)? http://www.businessweek.com 商業
          10?? Good Housekeeping(好主婦)? http://www.goodhousekeeping.com 家庭
          11?? Fortune(財富)? http://www.fortune.com/ 商業
          12?? Cosmopolitan(全球主義者)? http://www.cosmopolitan.com/ 娛樂
          13?? Woman’s Day(婦女日)? http://www.womansday.com/xp6/WomansDay/home.xml 婦女
          14?? Forbes(福布斯)? http://www.forbes.com/ 商業
          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(預防)? 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(養育)? 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(鄉村生活)? 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(現代文明)?? 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(現代新娘)? 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(經濟學人)? http://www.economist.com/ 政經
          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(鄉村家庭)? http://www.countryhome.com/ch/index.html 家庭
          82?? Barron’s?? http://www.barrons.com/ 商業
          83?? eWeek?? http://www.eweek.com 消費
          84?? Conde Nast Traveler?? http://www.concierge.com/cntraveler/ 旅游
          85?? Town & Country(城鎮和鄉村)?? 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(本質)?? http://www.essence.com/ 黑人
          91?? Road & Track(公路與軌跡)?? http://www.roadandtrack.com/ 機車
          92?? Health(健康)?? http://www.health.com/ 健康
          93?? Inc(公司)?? http://www.inc.com/home/ 商業
          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(環球)?? http://www.boston.com/globe/ 環境
          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/ 商業
          116?? Computer Shopper(計算機購物者)?? http://shopper.cnet.com/ 消費
          117?? Jet(黑玉)?? http://www.jetmag.com/ 黑人
          118?? First For Women ?? http://www.ffwmarket.com/ 婦女
          119?? Traditional Home(傳統家庭)?? http://www.traditionalhome.com/ 家庭
          120?? Automobile Magazine(汽車雜志)?? http://www.automobilemag.com/ 機車
          121?? Red Herring(紅鯡魚)?? http://www.redherring.com/ 商業
          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(網絡世界)?? http://www.networkworld.com/ IT
          127?? Entrepreneur(企業家)?? http://www.entrepreneur.com/ 商業
          128?? Popular Science(大眾科學)?? http://www.popsci.com/popsci/ 科普
          129?? Elle Decor ?? http://www.elledecor.co.th/ 設計
          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/ 商業
          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/ 商業
          147?? Spin(旋轉)?? http://www.spin.com/ 音樂
          148?? Travel Holiday(旅行假日)?? http://www.travelholiday.com/ 旅游
          149?? Black Enterprise(黑人企業)?? http://www.blackenterprise.com/ 商業
          150?? BabyTalk(寶貝說話)?? http://www.parenting.com/parenting/...s/babytalk.html 家庭
          151?? New England Journal of Medicine(新英格蘭醫學期刊)?? http://content.nejm.org/ 醫學
          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/ 行業
          159?? Harvard Business Review(哈佛商業評論)?? http://www.hbr.com 商業
          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(環形世界)?? http://www.cycleworld.com/xp6/CycleWorld/main.xml 機車
          167?? EDN?? http://www.e-insite.net/ednmag/ 電子
          168?? Tennis Magazine(網球雜志)?? http://www.tennis.com 體育
          169?? Advertising Age(廣告時代)?? http://www.adage.com/ 行業
          170?? Hemispheres(半球)?? http://www.hemispheresmagazine.com/home.htm 收藏
          171?? Fortune Small Business(財富小商業)? http://www.fortune.com/smallbusiness/ 商業
          172?? Meetings & Conventions(會議)?? http://www.meetings-conventions.com/ 行業
          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(室內裝飾設計)?? http://www.interiordesign.net 行業
          183?? Sky (Delta Air Lines)(天空 三角航線)?? http://www.delta-sky.com/ 航線
          184?? Power & Motoryacht(能源和摩托艇)?? http://powerandmotoryacht.about.com/mbody.htm 休閑
          185?? GamePro(專業游戲)?? 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 行業
          190?? Premiere(首映)?? http://www.premiere.com 電影
          191?? Birds & Blooms(鳥語花香)?? http://www.birdsandblooms.com/ 家居
          192?? Aviation Week & Space Technology(航空技術周刊)?? http://www.aviationnow.com/ 休閑
          193?? Electronic Design(電子設計)?? 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/ 行業
          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(鄉村周刊)?? http://www.countryweekly.com/ 音樂
          207?? American Way(美國道路)?? http://www.americanwaymag.com/ 旅游
          208?? Upside(上面)?? http://www.upside.com/ IT
          209?? Design News (設計新聞)?? http://www.manufacturing.net/ 行業
          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(機械設計)?? http://www.machinedesign.com/ 行業
          214?? PC Gamer(PC游戲玩家)?? http://www.pcgamer.com/ 游戲
          215?? Biography(傳記)? http://www.biography.com/ 文學
          216?? Atlantic Monthly(大西洋月刊)?? http://www.theatlantic.com/ 文藝
          217?? Successful Farming(成功農業)?? http://www.agriculture.com/sfonline/ 行業
          218?? Texas Monthly(德克莎斯月刊)?? http://www.texasmonthly.com/ 地區
          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 行業
          224?? ABA Journal(美國銀行家協會期刊)?? http://www.abanet.org/journal/redesign/home.html 行業
          225?? Nature(自然)?? http://www.nature.com/ 科學
          226?? Architectural Record(建筑學檔案)?? http://www.archrecord.com/ 行業
          227?? Adweek(廣告周刊)?? http://www.adweek.com/adweek/index.jsp 行業
          228?? Petersen’s 4-Wheel & Off Road?? http://www.4wheeloffroad.com/ 機車
          229?? Business 2.0(商業2.0)?? http://www.business2.com/ 商業
          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(鄉村女人)?? http://www.countrywomanmagazine.com/ 家庭
          234?? Boys’sLife(男孩生活)?? http://www.boyslife.org/ 孩子
          235?? Transworld Skateboarding(環球滑板)? http://www.skateboarding.com/skate/ 體育
          236?? NFL Insider(美國足球聯盟知情者)?? 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 財務
          239?? Windows 2000 Magazine(視窗2000雜志)?? http://www.win2000mag.net/ IT
          240?? Veranda(陽臺)?? http://www.veranda.com/ 家居
          241?? Video Business(視頻商業)?? http://www.videobusiness.com/ 商業
          242?? Backpacker(背包)?? http://www.backpacker.com/ 休閑
          243?? Cigar Aficionado(雪茄迷)?? http://www.cigaraficionado.com/ 休閑
          244?? Telephony(技術)?? http://www.telephonyonline.com/ IT
          245?? Flex(彎曲)?? http://www.flexonline.com/ 健康
          246?? Variety (weekly)(品種周刊)?? http://www.variety.com/ 商業
          247?? Cruising World (巡航世界)?? http://www.cruisingworld.com/ 休閑
          248?? American Hunter(美國獵人)?? http://www.american-hunter.com/ 休閑
          249?? Crain’s Chicago Business(克瑞恩芝加哥商業)?? http://www.chicagobusiness.com/ 商業
          250?? Broadcastin &Cable(寬帶與有線電視)?? http://www.broadcastingcable.com/ 行業
          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(改進農場主)?? http://www.progressivefarmer.com/farmer/ 農業
          255?? Easyriders?? http://www.easyriders.com/Home/Home.asp 機車
          256?? Crain’s New York Business(克瑞恩紐約商業)?? http://www.crainsny.com/ 商業
          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/ 商業
          261?? Country(鄉村) ?? 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/ 行業
          265?? Restaurants & Institutions(餐館與協會)?? http://www.rimag.com/ 行業
          266?? American Medical News(美國醫學新聞)?? http://www.ama-assn.org/public/journals/amnews/ 行業
          267?? North American Hunter(北美獵人)?? http://visitors.huntingclub.com/magazine.asp 休閑
          268?? Federal Computer Week(聯邦計算機周刊) ? http://www.fcw.com/ IT
          269?? Guns & Ammo(槍與軍火)?? http://www.gunsandammomag.com/dynamic.asp 槍械
          270?? Transworld Snowboarding(環球滑雪板)? http://www.snowboarding-online.com/ 體育
          271?? New Equipment Digest(新設備文摘) ? http://www.newequipment.com/ 行業
          272?? Weekly World News(世界新聞周刊) ?? http://www.weeklyworldnews.com/ 新聞
          273?? Chemical Week(化學周刊) ? http://www.chemweek.com/ 行業
          274?? Four Wheeler(四輪車) ? http://www.fourwheeler.com/ 機車
          275?? Gear(齒輪) ?? http://www.gearmagazine.com/ 家居
          276?? Pensions & Investments(養老金和投資) ? http://www.pionline.com/ 理財
          277?? Macworld(Mac世界) ?? http://www.macworld.com/ IT
          278?? Builder(建筑者) ?? http://builder.com.com/ IT
          279?? RB Restaurant Business(餐館業) ?? http://www.foodservicetoday.com/rb/index.shtml 行業
          280?? CFO(首席運營官) ?? http://www.cfo.com/ IT
          281?? American Family Physician(美國家庭醫生) ? 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/ 行業
          285?? Purchasing(購買) ?? http://www.manufacturing.net/ 消費
          286?? Laser Focus World(激光焦點世界)?? http://lfw.pennnet.com/home.cfm 行業
          287?? HANDY(手工)?? http://visitors.handymanclub.com/handy_mag.asp 家居
          288?? Medical Economics(醫藥經濟)?? http://www.medec.com/ 行業
          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(農業期刊)?? http://www.farmjournal.com/ 農業
          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(金融機構投資者)?? http://www.epinions.com 金融

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

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

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

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

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

          必須承認,這樣做,在構造shell命令時會失去一些特有的表達能力。如`find . -name foo -exec rm {}`,但卻給了你跨平臺的能力-你可以在任何地方工作。如果你真的需要執行一些shell命令,Ant有一個<exec> task,這個task允許執行特定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。注意所列出的連接都是最新發行版的Ant。如果你讀到此文時,發現已經有了更新的版本,那么請用新版本。如果你是一個瘋狂的技術追求者,你也可以從Ant CVS repository下載最新版本的Ant。

          系統需求

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

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

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

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

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

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

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

          可選Task

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

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

          Windows

          假定Ant安裝在c:\ant\目錄下。下面是設定環境的命令:

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

          假定Ant安裝在/usr/local/ant目錄下。下面是設定環境的命令:

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

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

          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。如果設定了正確的JAVA_HOME環境變量,Ant所帶的腳本,在bin目錄下,會自動加入所需的JDK類。
          當你執行特定平臺的程序(如exec task或cvs task)時,必須設定ant.home屬性指向Ant的安裝目錄。同樣,Ant所帶的腳本利用ANT_HOME環境變量自動設置該屬性。
          Building Ant

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

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

          設定JAVA_HOME環境變量指向JDK的安裝目錄。要想知道怎么做請參看安裝Ant小節。

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

          現在你可以build Ant了:

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

          這樣就可你指定的目錄中創建一個binary版本。

          上面的命令執行下面的動作:

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

          大多數情況下,你不必直接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版本。

          依賴庫

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

          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就可以了。

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

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

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

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

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

          命令行選項總結:

          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,執行缺省的target。

          ant -buildfile test.xml

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

          ant -buildfile test.xml dist

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

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

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

          文件

          在Unix上,Ant的執行腳本在做任何事之前都會source(讀并計算值)~/.antrc 文件;在Windows上,Ant的批處理文件會在開始時調用%HOME%\antrc_pre.bat,在結束時調用%HOME%\antrc_post.bat。你可以用這些文件配置或取消一些只有在運行Ant時才需要的環境變量??聪旅娴睦印?br />
          環境變量

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

          JAVACMD Java可執行文件的絕對路徑。用這個值可以指定一個不同于JAVA_HOME/bin/java(.exe)的JVM。
          ANT_OPTS 傳遞給JVM的命令行變量-例如,你可以定義屬性或設定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值引用指定的任務。這個值必須是唯一的。(詳情請參考下面的Task小節)

          Projects

          project有下面的屬性:

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

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

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

          Targets

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

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

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

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

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

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

          如果(或如果不)某些屬性被設定,才執行某個target。這樣,允許根據系統的狀態(java version, OS, 命令行屬性定義等等)來更好地控制build的過程。要想讓一個target這樣做,你就應該在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總會被執行。

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

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

          target有下面的屬性:

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

          Tasks

          一個task是一段可執行的代碼。

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

          下面是Task的一般構造形式:

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

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

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

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

          可以給task賦一個id屬性:

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

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

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

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

          project.getReference("task1").

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

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

          Properties

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

          內置屬性

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

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

          除了Java的系統屬性,Ant還定義了一些自己的內置屬性:
          basedir project基目錄的絕對路徑 (與<project>的basedir屬性一樣)。
          ant.file buildfile的絕對路徑。
          ant.version Ant的版本。
          ant.project.name 當前執行的project的名字;由<project>的name屬性設定.
          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中設定。

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

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

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

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

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

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

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

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

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

          <classpath>
          <pathelement path="${classpath}"/>
          <fileset dir="lib">
          <include name="**/*.jar"/>
          </fileset>
          <pathelement location="classes"/>
          </classpath>
          上面的例子構造了一個路徑值包括:${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>

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

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

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

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

          Attribute Description Required
          value 一個命令行變量;可包含空格字符。 只能用一個
          line 空格分隔的命令行變量列表。
          file 作為命令行變量的文件名;會被文件的絕對名替代。
          path 一個作為單個命令行變量的path-like的字符串;或作為分隔符,Ant會將其轉變為特定平臺的分隔符。

          例子

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

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

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

          References

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

          下面的例子:

          <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標準標簽函數庫。JSTL是一個標準的已
          制定好的標簽庫,可以應用于各種領域,如:基本輸入輸出,流程控制,循環,XML文件剖析,數據庫查
          詢以及國際化和文字格式標準化的應用等。JSTL所提供的標簽庫分為以下五大類:
          ?核心標簽庫(Core tag Liabry)
          ?I18N格式標簽庫(I18N-capable formatting tag libary)
          ?SQL標簽庫(SQL tag Libary)
          ?XML標簽庫(XML tag Libary)
          ?函數標簽庫(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%>指令,并且設定prefix和uri的值得,通常設定:
          <%@taglib prefix="c" uri=">
          這樣就可以使用核心標簽庫了。

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

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

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

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

          語法2: 有body
          將body內容存儲至范圍為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內容的數據存儲至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會產生異常錯誤,有以下兩種情況:
          ?.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范圍移除。若我們不設定scope,則<c:remove>會移除所有范圍名稱為username
          的數據。

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

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

          流程控制
          流程控制分類中包含四個標簽:<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?????????????????? 如果表達式的結果為true則執行body,false則相反????????????? Y????? boolean????? ?是????????? ?無
          var????????????????? ?用來存儲test運算后的結果,即true或false?????????????????????? ?? ?N?????String?????? ?? 否???????? ? 無
          scope?????????????? var變量的JSP范圍????????????????????????????????????????????????????????????????? N?????String???????? ?否??????? ? page
          ------------------------------------------------------------------------------------------------------------------------
          說明:
          <c:if>標簽必須要有test屬性,body里除了能是靜態文本之外可以是任何JSP代碼,標簽或HTML代碼。

          <c:choose>:本身只當作<c:when>和<c:otherwise>的父標簽。
          語法:
          <c:choose>
          ? body(<when>和<otherwise>)
          </c:choose>
          限制:
          <c:choose>的本地內容只能有:
          ?.空白
          ?.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時,則執行<c:otherwise>的本體內容。
          在同一個<c:choose>中,假若有好幾個<c:when>都會true時,只能有一個<c:when>成立。

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

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

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

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

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

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

          另外<c:forEach>還提供了varStatus屬性,主要用來存放現在指到成員的相關信息。例如:我們寫成
          varStatus="s",那么就會把信息存放到名稱為s的屬性當中。varStatus屬性還提供另外四個屬性:index,
          count,fist和last,它們個自的意義如下:
          ------------------------------------------------------------------------------------------
          ?? 屬性??????????????????? 類型?????????????????????????????????? 意義
          ?? index?????????????????? number????????????????????? 現在指到成員的索引
          ?? count?????????????????? number????????????????????? 總共指到成員的總和
          ?? first?????????????????? ? boolean???????????????????? 現在指到成員是否為第一個
          ?? last??????????????????? ?boolean???????????????????? 現在指到成員是否為最后一個
          -------------------------------------------------------------------------------------------
          如下例子:
          <
          %@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內容....
          </c:forTokens>

          Attribute
          --------------------------------------------------------------------------------------------------------------------
          ?名稱?????????????????????????????? ???? 說明????????????????????????????????????????????? ?EL???? 類型????? 必須?????? 默認值
          ?var???????????????? ? 用來存放現在指到的成員???????????????????????????? ?? Y????? String????? ?否????????? 無
          ?items??????????????? 被迭代的字符串????????????????????????????????????????????? ? Y????? String?????? 是????????? 無
          ?delims??????????? ? 定義用來分割字符串的字符????????????????????????? ? N????? String????? ?是????????? 無
          ?varStatus??????????用來存放現在指到的相關成員信息????????????? ? N????? String???? ? 否????????? 無
          ?begin????????????? ?開始的位置?????????????????????????????????????????????????????? ? Y?????? int???????? ? 否????????? ?0
          ?end??????????????? ?結束的位置????????????????????????????????????????????????????????? Y?????? int????????? 否?????????? 最后一個成員
          ?step???????????? ?? 每次迭代間隔數??????????????????????????????????????????????? ? 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操作有關的標簽,分別是: <c:import>,<c:redirect>和<c:url>。它們的主要功能是:
          用來將其他文件的內容包含起來,網頁的向導,還有url的產生。

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

          核心設計類:
          Map 設計Set 設計List 設計
          HashMapHashSetArrayList
          HashtableLinkedHashSetVector
          TreeMapTreeSetLinkedLisk
          LinkedHasMap

          散列表是最快的數據存儲結構,它是一個數組。數據存儲在數組中散列函數指定的特定下標。散列函數是一組輸入數據和一組整數之間的映射。

          集合類和接口層次

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

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

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

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

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

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

          事件有哪些?

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

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

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

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

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

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

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

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

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

          流:對數據源的一種抽象,其目的是想用統一的方式訪問各種不同的數據源(文件、網絡、內存的緩沖區)

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

          管道流用于在線程之間通信: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){
          }

          通過網絡傳輸文件:
          客戶端:
          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());
          }
          服務器端:
          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);
          }

          串行化的注意事項以及如何實現串行化
          對象的壽命通常隨著生成該對象的程序的終止而終止。有時候,可能需要將對象的狀態保存下來,在需要時再將對象恢復。我們把對象的這種能記錄自己的狀態以便將來再生的能力,叫做對象的持續性(persistence)。對象通過寫出描述自己狀態的數值來記錄自己,這個過程叫對象的串行化(Serialization)。
          序列化的過程就是對象寫入字節流和從字節流中讀取對象。將對象狀態轉換成字節流之后,可以用java.io包中的各種字節流類將其保存到文件中,管道到另一線程中或通過網絡連接將對象數據發送到另一主機。
          一:對象序列化可以實現分布式對象。
          二:java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。
          // 序列化 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。
          序列化通??梢宰詣油瓿桑袝r可能要對這個過程進行控制。java可以將類聲明為serializable,但仍可手工控制聲明為static或transient的數據成員。
          如果一個類要完全負責自己的序列化,則實現Externalizable接口而不是Serializable接口。Externalizable接口定義包括兩個方法writeExternal()與readExternal()。利用這些方法可以控制對象數據成員如何寫入字節流

          NIO的特征
          l舊的I/O是以字節為單位進行讀寫的,而新的I/O是以塊為單位進行讀寫的
          l以新的Channel抽象類來配合節點類
          l使用Buffer的概念來進行基本數據類型的存取
          l增加更多字節編碼的支持
          l內存映像及數據鎖定的支持
          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);

          //使設定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方法通知我們我們感興趣的事件發生了。
          nKeys = selector.select();
          //如果有我們注冊的事情發生了,它的傳回值就會大于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被處理完成后,就都被從就緒關鍵字(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區別及Java實現方式)
          套接字是一種進程間的數據交換機制。客戶端和服務器通過套接字建立連接和進行通信。套接字是由IP地址、傳輸協議和一個端口號三部分組成的。
          TCP/IP協議:其中TCP 為傳輸控制協議是傳輸層協議,
          功能TCPUDP
          數據傳輸連續的有序數據流消息傳輸
          多路功能接收主機根據端口號決定數據流向那個應用相同
          可靠傳輸使用TCP頭部的序列與確認字段進行數據確認無
          流量控制使用窗口機制的流量控制無
          連接使用3次握手建立連接;連接后一直保持連接直到終止連接無連接

          URL的組件:協議、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("服務器正等待輸入");
          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("客戶端正在等待服務器發送數據");
          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編程,讀服務器幾個字符,再寫入本地顯示?
          答: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("優化冒泡排序法");
          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框架中,實現比較要實現什么樣的接口?
          Collection框架中實現比較要實現Comparable 接口和 Comparator 接口

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

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

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

          線程方法介紹:
          構造函數:
          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方法啟動一個已經啟動的線程也會拋出異常。

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

          Sleep方法可以使低優先級的線程得到執行的機會,Yield方法只能使同優先級的線程有執行的機會。Join方法能夠使調用該方法的線程在此之前執行完畢,在該方法之后,調用join方法的線程不會產生輸出了,


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

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

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

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

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

          JDBC調用數據庫的基本步驟

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

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

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

          SAX提供一種用于解析XML文檔的事件驅動模型,使用SAX接口的XML處理器并不創建數據結構,而是掃描輸入的XML文檔,并生成元素開始、元素結束等事件,在發生事件時,解析器會通知應用程序。
          SAX優點:在解析大型文檔時,不必將整個文件加載到內存中,因此占有的內存比DOM少。在只需要一個信息子集時,SAX忽略不需要的數據,而DOM無法做到這點。
          SAX的缺點是:必須按到達順序處理數據,不能對文檔進行隨即訪問。SAX是只讀的,它是設計來讀取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("結束文檔");
          }

          //在遇到字符數據時激發
          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("結束元素"+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顯示現有XML文檔內容

          使用DOM API將XML文檔數據插入數據庫

          使用DOM API根據數據庫創建XML文檔

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

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

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

          應用服務器有那些?

          Servlet方面
          什么是Servlet?
          Servlet是J2EE應用框架中部署于Web層的Web組件,運行在支持Servlet的Web服務器或應用服務器上。Servlet為客戶端和服務器端的信息處理提供了一種“請求/響應”機制。
          客戶程序將請求發送到服務器;服務器將請求發送到Servlet;依據客戶程序的請求,Servlet動態地構造回答信息并返回給服務器;服務器將回答返回給客戶程序。

          什么是JSP?
          JSP是J2EE應用框架中部署于Web層的Web組件,是對Servlet技術的擴展。它使在靜態的頁面中加入動態的內容變得非常容易。并且通過使用標簽庫可以大大節省開發時間;將JavaBean與JSP一起使用可以將數據表示和程序實現分離。

          在MVC架構模式中:
          使用Servlet作為控制器,而JSP作為數據視圖。

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

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

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

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

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

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

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

          如何現實servlet的單線程模式

          servlet的配置

          4、Servlet的基本架構
          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有哪些內置對象?作用分別是什么?
          JSP的隱式對象
          RequestJavax.servlet.ServletRequest它包含了有關瀏覽器請求的信息.通過該對象可以獲得請求中的頭信息、Cookie和請求參數。
          Enumeration getHeaderNames()String getHeader(name)Cookie[] getCookies()Enumeration GetParameterNames()String getParameter(name)String[] GetParametervalues(name)HttpSession getSession(flag)
          responseJavax.servlet.ServletResponse作為JSP頁面處理結果返回給用戶的響應存儲在該對象中。并提供了設置響應內容、響應頭以及重定向的方法(如cookies,頭信息等)
          Void setContentType(type)String getCharacterEncoding()Void addCookie(cookie)Void sendRedirect(url)
          outJavax.servlet.jsp.JspWriter用于將內容寫入JSP頁面實例的輸出流中,提供了幾個方法使你能用于向瀏覽器回送輸出結果。
          pageContextJavax.servlet.jsp.PageContext描述了當前JSP頁面的運行環境??梢苑祷豃SP頁面的其他隱式對象及其屬性的訪問,另外,它還實現將控制權從當前頁面傳輸至其他頁面的方法。
          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會話對象存儲有關此會話的信息,也可以將屬性賦給一個會話,每個屬性都有名稱和值。會話對象主要用于存儲和檢索屬性值。
          Void setAttribute(name,data)Object getAttribute(name)
          applicationjavax.servle.ServletContext存儲了運行JSP頁面的servlet以及在同一應用程序中的任何Web組件的上下文信息。
          pageJava.lang.Object表示當前JSP頁面的servlet實例
          configjavax.servlet.ServletConfig該對象用于存取servlet實例的初始化參數。
          Enumeration getInitParameterNames()String getInitParameter(name)
          ExceptionJavax.lang.Throwable在某個頁面拋出異常時,將轉發至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:設置JavaBean的屬性。
          ljsp:getProperty:輸出某個JavaBean的屬性。
          ljsp:forward:把請求轉到一個新的頁面。
          ljsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記

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

          4、兩種跳轉方式分別是什么?有什么區別?
          答:有兩種,分別為:
          <jsp:include page="included.jsp" flush="true">
          <jsp:forward page= "nextpage.jsp"/>
          前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完后還會回來,相當于函數調用。并且可以帶參數.后者完全轉向新頁面,不會再回來。相當于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
          說出數據連接池的工作機制是什么?


          1、可能會讓你寫一段Jdbc連Oracle的程序,并實現數據查詢.
          答:程序如下:
          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的作用?為什么要用?
          答:調用該訪問返回一個以字符串指定類名的類的對象。

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

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

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

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

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

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

          //獲取數據內容并顯示
          rs.close();
          sql="select * from tables";
          rs=DBLink.executeQuery(sql);
          i=0;
          while((i<numPages*(currentPage-1))&&rs.next()){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技術的哪些方面?如何實現的?
          答:用到了數據存貯,信息配置兩方面。在做數據交換平臺時,將不能數據源的數據組裝成XML文件,然后將XML文件壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數都存貯在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年調入海南大學</notes>
          </person>
          事件回調類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內容顯示源碼,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有哪些內容?分別用在什么場合? EJB2.0和EJB1.1的區別?
          答:規范內容包括Bean提供者,應用程序裝配者,EJB容器,EJB配置工具,EJB服務提供者,系統管理員。這里面,EJB容器是EJB之所以能夠運行的核心。EJB容器管理著EJB的創建,撤消,激活,去活,與數據庫的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....

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

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

          3、EJB的基本架構
          答:一個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的各個部分都有那些技術來實現?如何實現?
          答:MVC是Model-View-Controller的簡寫。設計的基本原理是將復雜性分解為三個組件,即模型、視圖、控制器。
          模型表示數據和處理數據的業務邏輯或應用程序對象。
          試圖是用戶要查看或存取的數據的表示。
          控制器定義了用戶與模型和試圖交互的方式。


          2、應用服務器與WEB SERVER的區別?
          Web Service 是一種新的分布式技術。一個Web服務本質上是一個應用組件,可以通過Web協議和數據編碼機制,例如HTTP和XML,對這個組件進行訪問。

          Soap簡單對象訪問協議:
          是一種基于XML的通信協議。它包括3個部分。
          Soap封裝結構:定義消息的XML格式,包括其整體框架、消息內容、由誰處理這些內容等。
          Soap編程規則:定義如何將程序數據表示為XML。
          Soap RPC表示:定義如何使用scap進行遠程過程調用。

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

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

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


          使用類庫開發與使用框架包進行開發的區別?
          框架包簡單的可以認為是一組類和接口,它們相互協作以解決特定類型的軟件問題。
          類庫包含的是應用程序可以調用的函數或例程。而框架包提供通用的、相互協作的組件,應用程序通過擴展這些組件提供特定函數組。應用程序將在這些擴展點進行擴展,運行時這些擴展將被框架系統反調用。這正與使用類庫開發的應用程序,運行時的函數調用時顛倒的。

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

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

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

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

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

          名稱

          ?

          2、UML方面
          UML包括的圖有:案例圖、類圖、序列圖、合作圖、狀態圖、活動圖、構件圖、部署圖。

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

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

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

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

          抽象類僅提供一個類型的部分實現。抽象類通常代表一個抽象概念,它提供一個繼承的出發點。
          javascript方面
          1、如何校驗數字型?
          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的遠程方法調用是Java所特有的分布式計算技術,它允許運行在一個Java虛擬機上的對象調用運行在另一個Java虛擬機上的對象的方法,從而使Java編程人員可以方便地在網絡環境中作分布式計算。面向對象設計要求每個任務由最適合該任務的對象執行,RMI將這個概念更深入了一步,使任務可以在最適合該任務的機器上完成。
          RMI定義了一組遠程接口,可以用于生成遠程對象。客戶機可以象調用本地對象的方法一樣用相同的語法調用遠程對象。RMI API提供的類和方法可以處理所有訪問遠程方法的基礎通信和參數引用要求的串行化。
          使用RMI開發步驟:
          1、定義一個遠程接口(遠程接口必須繼承接口,每個方法必須拋出遠程異常,方法參數和方法返回值都必須是可序列化的)
          2、實現遠程接口
          3、定義使用遠程對象的客戶程序
          4、產生遠程訪問對象的樁和框
          5、注冊遠程對象
          6、運行服務器和客戶程序

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

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

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

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

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

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

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

          {

          RequestUtils.selectModule(request,getServletContext());

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

          }

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

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

          擴展 ActionServlet

          盡管 Struts 框架仍然允許你擴展 ActionServlet 類,但是這么做的好處已大不入前,因為它的大部分功能都已經放到新的 RequestProcessor 類里了。如果你仍然想擴展自己的 ActionSerlvet 類,那么只要創建一個擴展了 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

          {

          ? // 確定你先調用了超類

          ? super.init();

          ? // 初始化持久存儲服務

          ? try

          ?? {

          ???? // 創建服務接口的一個實例

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

          ???? // 把服務對象存儲到應用作用域類

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

          ?? }

          ? catch(DatastoreException ex)

          ?? {

          ???? // 如果服務對象的初始化工作出了問題,就關閉 web 應用程序

          ???? ex.printStackTrace();

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

          ?? }

          ??? }

          ?}

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

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

          ?<servlet>

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

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

          ?</servlet>

          Struts 初始化過程

          web.xml 文件中配置的初始化參數而定, servlet 容器首次啟動時 , 或者第一個對比 servlet 的請求來到時 ,servlet 容器就會加載 Stuts ActionServlet. 無論是哪種情況 ( 也不管是什么樣的 Java Servlet) ,都一定要保證 inint() 得到調用,而且必須在 servlet 處理任何請求之前完成。 Struts 框架在 init() 被調用時 , 會做好所有的初始化工作??纯慈缦戮椭懒怂降赘闪诵┦裁?/span> :

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

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

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

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

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

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

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

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

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

          ?

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

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

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

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

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

          過濾器主要對客戶端的請求和客戶端的響應進行統一處理.最常見的web過濾器有權限認證過濾器,字符編碼過濾器,圖象處理過濾器等.

          字符編碼過濾器(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一樣,它也可以獲得初始化參數
          ??? */
          ??? 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);
          ??????? //把處理權發送到下一個
          ??????? chain.doFilter(srequest,sresponse);
          ??? }
          ???
          ??? public void setFilterConfig(final FilterConfig filterConfig)
          ??? {
          ??????? this.filterConfig=filterConfig;
          ??? }
          ??? //銷毀過濾器
          ??? public void destroy()
          ??? {
          ??????? this.filterConfig=null;
          ??? }
          }
          然后在web.xml中配置我們的應用.
          ?<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一樣,它也可以獲得初始化參數
          ??? */
          ??? 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中驗證通過");
          ??????????????? //驗證通過繼續處理
          ??????????????? 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)編輯 收藏

          主站蜘蛛池模板: 西藏| 温州市| 彭阳县| 开平市| 东宁县| 南阳市| 清新县| 红河县| 云龙县| 成武县| 罗山县| 沈丘县| 闸北区| 富源县| 新乡县| 东港市| 仁布县| 星子县| 聂荣县| 大冶市| 泸水县| 江阴市| 增城市| 班玛县| 南城县| 神农架林区| 博罗县| 宜宾市| 盐池县| 大厂| 改则县| 竹北市| 河曲县| 石首市| 东阿县| 岳阳县| 扬州市| 永宁县| 陆良县| 长汀县| 磐石市|