2006年6月30日

          動(dòng)作映射

          這個(gè)時(shí)候,你可能會(huì)問(wèn)自己:“當(dāng)控制器接受到一個(gè)請(qǐng)求的時(shí)候,它如何知道調(diào)用哪個(gè)Action實(shí)例?”控制器要通過(guò)查看請(qǐng)求消息并使用一組動(dòng)作
          映射(action mapping)來(lái)做出決定。動(dòng)作映射是Struts配置信息(配置一個(gè)特殊的XML文件中)的一部分。這個(gè)配置信息會(huì)在啟動(dòng)時(shí)加載到內(nèi)存中
          ,讓Struts框架得以在運(yùn)行時(shí)加以利用。每個(gè)action元素在內(nèi)存中都被表示為org.apache.struts.action.ActionMapping類的實(shí)例。
          ActionMapping對(duì)象包含一個(gè)path屬性,用來(lái)與外部請(qǐng)求的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>
          這里的登錄動(dòng)作映射把路徑"/login"映射到了com.oreilly.struts.banking.LoginAction這個(gè)Action類。無(wú)論何時(shí),當(dāng)控制器接受到一個(gè)URI
          路徑中包含"/login"字符串的請(qǐng)求時(shí),就會(huì)調(diào)用LoginAction實(shí)例的execute()方法。Struts框架還會(huì)使用映射來(lái)指出“動(dòng)作"完成后要讓用戶
          轉(zhuǎn)向哪個(gè)資源。

          ?

          使用Struts ActionForm

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

          ?


          ?

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

          美國(guó)雜志300強(qiáng)及其網(wǎng)址

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

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

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

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

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

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

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

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

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

          系統(tǒng)需求

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

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

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

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

          在你運(yùn)行Ant之前需要做一些配置工作。

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

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

          可選Task

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

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

          Windows

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

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

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

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

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

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

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

          安裝好源代碼后,進(jìn)入安裝目錄。

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

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

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

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

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

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

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

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


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

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

          如果你希望跳過(guò)冗長(zhǎng)的Javadoc步驟,可以用:

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

          這樣就只會(huì)安裝bin和lib目錄。

          注意install和install-lite都會(huì)覆蓋ANT_HOME中的當(dāng)前Ant版本。

          依賴庫(kù)

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

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

          運(yùn)行Ant
          運(yùn)行Ant非常簡(jiǎn)單,當(dāng)你正確地安裝Ant后,只要輸入ant就可以了。

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

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

          還有兩個(gè)選項(xiàng) -quite,告訴Ant運(yùn)行時(shí)只輸出少量的必要信息。而 -verbose,告訴Ant運(yùn)行時(shí)要輸出更多的信息。

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

          如果有的話,-projecthelp 選項(xiàng)輸出項(xiàng)目的描述信息和項(xiàng)目target的列表。先列出那些有描述的,然后是沒(méi)有描述的target。

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

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

          ant

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

          ant -buildfile test.xml

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

          ant -buildfile test.xml dist

          使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行一個(gè)叫做dist的target。

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

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

          文件

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

          環(huán)境變量

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

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

          手工運(yùn)行Ant

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

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

          這個(gè)命令與前面的ant命令一樣。選項(xiàng)和target也和用ant命令時(shí)一樣。這個(gè)例子假定你的CLASSPATH包含:

          ant.jar

          jars/classes for your XML parser

          the JDK's required jar/zip files

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

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

          Projects

          project有下面的屬性:

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

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

          一個(gè)項(xiàng)目可以定義一個(gè)或多個(gè)target。一個(gè)target是一系列你想要執(zhí)行的。執(zhí)行Ant時(shí),你可以選擇執(zhí)行那個(gè)target。當(dāng)沒(méi)有給定target時(shí),使用project的default屬性所確定的target。

          Targets

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

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

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

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

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

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

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

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

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

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

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

          target有下面的屬性:

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

          Tasks

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

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

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

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

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

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

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

          可以給task賦一個(gè)id屬性:

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

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

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

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

          project.getReference("task1").

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

          注意2:未來(lái)的Ant版本可能不會(huì)兼容這里所提的屬性,因?yàn)楹苡锌赡芨緵](méi)有task實(shí)例,只有proxies。

          Properties

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

          內(nèi)置屬性

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

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

          除了Java的系統(tǒng)屬性,Ant還定義了一些自己的內(nèi)置屬性:
          basedir project基目錄的絕對(duì)路徑 (與<project>的basedir屬性一樣)。
          ant.file buildfile的絕對(duì)路徑。
          ant.version Ant的版本。
          ant.project.name 當(dāng)前執(zhí)行的project的名字;由<project>的name屬性設(shè)定.
          ant.java.version Ant檢測(cè)到的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
          一個(gè)project可以有很多tokens,這些tokens在文件拷貝時(shí)會(huì)被自動(dòng)擴(kuò)展,這要求在支持這一行為的task中選擇過(guò)濾拷貝功能。這一功能可用filter task在buildfile中設(shè)定。

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

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

          警告:如果你在拷貝binary文件時(shí)打開filtering功能,你有可能破壞文件。這個(gè)功能只針對(duì)文本文件。

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

          當(dāng)需要指定類似路徑的值時(shí),可以使用嵌套元素。一般的形式是

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

          為簡(jiǎn)潔起見,classpath標(biāo)簽支持自己的path和location屬性。所以:

          <classpath>
          <pathelement path="${classpath}"/>
          </classpath>
          可以被簡(jiǎn)寫作:

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

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

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

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

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

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

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

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

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

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

          例子

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

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

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

          References

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

          下面的例子:

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

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

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

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

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

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

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

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

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

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

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

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

          語(yǔ)法3: 將value的值存儲(chǔ)至target對(duì)象屬性中
          <c:set value="value" target="target" property="propertyNmae"/>

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

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

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

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

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

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

          流程控制
          流程控制分類中包含四個(gè)標(biāo)簽:<c:if>,<c:choose>,<c:when>和<c:otherwise>。

          <c:if>:的用途和我們?cè)谝话愠绦蛑袑懙膇f一樣。
          語(yǔ)法:
          語(yǔ)法1:沒(méi)有body
          <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

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

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

          <c:choose>:本身只當(dāng)作<c:when>和<c:otherwise>的父標(biāo)簽。
          語(yǔ)法:
          <c:choose>
          ? body(<when>和<otherwise>)
          </c:choose>
          限制:
          <c:choose>的本地內(nèi)容只能有:
          ?.空白
          ?.1或多個(gè)<c:when>
          ?.0或多個(gè)<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>
          說(shuō)明:
          在同一個(gè)<c:choose>中,假如所有的<c:when>的test都不為true時(shí),則執(zhí)行<c:otherwise>的本體內(nèi)容。
          在同一個(gè)<c:choose>中,假若有好幾個(gè)<c:when>都會(huì)true時(shí),只能有一個(gè)<c:when>成立。

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

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

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

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

          ???????????????????????????????????????????????????????????????????????????????????????????????Arrays
          ????????????????????????????????????????????????????????????????????????????????????????????? Collection
          ???????????????????????????????????????????????????????????????????????????????????????????????Iterator?????????? ? 否????????? ?無(wú)
          items???????? 被迭代的集合對(duì)象??????????????????????????????????? Y?????? ?Enumeration????????????
          ?????????????????????????????????????????????????????????????????????????????????????????????? Map
          ????????????????????????????????????????????????????????????????????????????????????????????????String

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

          另外<c:forEach>還提供了varStatus屬性,主要用來(lái)存放現(xiàn)在指到成員的相關(guān)信息。例如:我們寫成
          varStatus="s",那么就會(huì)把信息存放到名稱為s的屬性當(dāng)中。varStatus屬性還提供另外四個(gè)屬性:index,
          count,fist和last,它們個(gè)自的意義如下:
          ------------------------------------------------------------------------------------------
          ?? 屬性??????????????????? 類型?????????????????????????????????? 意義
          ?? index?????????????????? number????????????????????? 現(xiàn)在指到成員的索引
          ?? count?????????????????? number????????????????????? 總共指到成員的總和
          ?? first?????????????????? ? boolean???????????????????? 現(xiàn)在指到成員是否為第一個(gè)
          ?? last??????????????????? ?boolean???????????????????? 現(xiàn)在指到成員是否為最后一個(gè)
          -------------------------------------------------------------------------------------------
          如下例子:
          <
          %@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>:用來(lái)瀏覽一字符串中所有的成員,起成員是由定義符號(hào)(delimiters)所分隔的。
          語(yǔ)法:
          <c:forTokens items="stringFoTokens" delims="delimmmmiters" [var="varName"]
          ???????????? [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
          ?...body內(nèi)容....
          </c:forTokens>

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

          Null 和 錯(cuò)誤處理
          .假如itmes為null時(shí),則表示為有空的集合對(duì)象
          .假若begin大于等于items的大小時(shí),則迭代不運(yùn)算

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

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

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

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

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

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

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

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

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

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

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

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


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

          3、char型變量中能不能存貯一個(gè)中文漢字?為什么?
          答:是能夠定義成為一個(gè)中文的,因?yàn)閖ava中以u(píng)nicode編碼,一個(gè)char占16個(gè)字節(jié),所以放一個(gè)中文是沒(méi)問(wèn)題的

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

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

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

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

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

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

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

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

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

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

          集合類和接口層次

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

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

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

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

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

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

          事件有哪些?

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

          運(yùn)行時(shí)禁用斷言:
          java –da com.geeksanonymous.TestClass

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

          while(true) //不斷的輪詢
          {
          debug("NBTest: Starting select");
          //Selector通過(guò)select方法通知我們我們感興趣的事件發(fā)生了。
          nKeys = selector.select();
          //如果有我們注冊(cè)的事情發(fā)生了,它的傳回值就會(huì)大于0
          if(nKeys > 0){
          debug("NBTest: Number of keys after select operation: " +nKeys);
          //Selector傳回一組SelectionKeys
          //我們從這些key中的channel()方法中取得我們剛剛注冊(cè)的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());

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

          try{
          ctx=getInitialContext();

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

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

          Statement myStatement=null;
          ResultSet myResultSet=null;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          import java.io.*;

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

          stud=doc.createElement("Student");

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

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

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

          doc.appendChild(students);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          servlet的配置

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

          ?

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


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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

          3、用jdom解析xml文件時(shí)如何解決中文問(wèn)題?如何解析?
          答:看如下代碼,用編碼方式加以解決
          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>信息學(xué)院</college>
          <telephone>6258113</telephone>
          <notes>男,1955年生,博士,95年調(diào)入海南大學(xué)</notes>
          </person>
          事件回調(diào)類SAXHandler.java
          import java.io.*;
          import java.util.Hashtable;
          import org.xml.sax.*;
          public class SAXHandler extends HandlerBase {
          private Hashtable table = new Hashtable();
          private String currentElement = null;
          private String currentvalue = null;
          public void setTable(Hashtable table) {
          this.table = table;
          }
          public Hashtable getTable(){
          return table;
          }
          public void startElement(String tag, AttributeList attrs) throws SAXException {
          currentElement = tag;
          }
          public void characters(char[] ch, int start, int length) throws SAXException {
          currentvalue = new String(ch, start, length);
          }
          public void endElement(String name) throws SAXException {
          if (currentElement.equals(name)) table.put(currentElement, currentvalue);
          }
          }

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

          名稱

          ?

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

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

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

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

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

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

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

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

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

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

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

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

          我們知道 Struts 的入口是 ActionServlet. org.apache.struts.ActionServlet 類在 Struts 應(yīng)用程序中負(fù)責(zé)攔截工作。所有來(lái)自客戶層的請(qǐng)求,在交給應(yīng)用程序處理之前,都會(huì)先經(jīng)過(guò) ActionServlet 當(dāng) ActionServlet 的一個(gè)實(shí)例接受到一個(gè) HttpRequest 對(duì)象時(shí),無(wú)論這是通過(guò) doGet() 方法還是 doPost() 方法受到的 , 都會(huì)調(diào)用 process() 方法來(lái)處理該請(qǐng)求。 ActionServlet process() 方法如下所示 :

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

          {

          RequestUtils.selectModule(request,getServletContext());

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

          }

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

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

          擴(kuò)展 ActionServlet

          盡管 Struts 框架仍然允許你擴(kuò)展 ActionServlet 類,但是這么做的好處已大不入前,因?yàn)樗拇蟛糠止δ芏家呀?jīng)放到新的 RequestProcessor 類里了。如果你仍然想擴(kuò)展自己的 ActionSerlvet 類,那么只要?jiǎng)?chuàng)建一個(gè)擴(kuò)展了 ActionServlet 的類并配置 Struts 框架讓它使用你的類就可以了。看以下一個(gè)覆蓋了 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;

          /**

          * 擴(kuò)展了 Struts ActionServlet, 以此來(lái)完成你自己特殊的初始化工作

          */

          public class ExtendedActionServlet extends ActionServlet

          ?{

          ?? public void init() throws ServletException

          {

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

          ? super.init();

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

          ? try

          ?? {

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

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

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

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

          ?? }

          ? catch(DatastoreException ex)

          ?? {

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

          ???? ex.printStackTrace();

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

          ?? }

          ??? }

          ?}

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

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

          ?<servlet>

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

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

          ?</servlet>

          Struts 初始化過(guò)程

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

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

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

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

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

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

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

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

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

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

          ?

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

          主站蜘蛛池模板: 庆安县| 托里县| 武平县| 信丰县| 安顺市| 壶关县| 武川县| 榆社县| 平武县| 望城县| 安图县| 杭锦旗| 舟曲县| 巧家县| 舞钢市| 垣曲县| 安岳县| 任丘市| 汝城县| 凤庆县| 萍乡市| 灯塔市| 泰和县| 剑阁县| 边坝县| 静海县| 萍乡市| 嵊泗县| 赫章县| 黔江区| 灵台县| 武山县| 宁蒗| 克什克腾旗| 沐川县| 铅山县| 日照市| 隆回县| 高碑店市| 达拉特旗| 霍山县|