|
|
(не показана 1 промежуточная версия 1 участника) |
Строка 1: |
Строка 1: |
− | [http://s1.shard.jp/bireba/avguard-antivirus.html desinstalar norton antivirus
| + | {{Цикл/Java EE}} |
− | ] [http://s1.shard.jp/bireba/antivirus-f-prot.html avg antivirus for downloading
| + | == {{oncolor||red|Телефонная книга}}: переход на JSP == |
− | ] [http://s1.shard.jp/losaul/this-day-in-australian.html australia disaster in natural
| + | ''{{oncolor||red|ЧАСТЬ 2}} Встречают по одежке – и Большой Босс не был сильно впечатлен созданной нами в прошлый раз адресной книгой. '''Александр Бабаев''' исправляет замеченные недочеты.'' |
− | ] [http://s1.shard.jp/olharder/auto-escort-ford.html mitsubishi discount auto parts
| + | |
− | ] [http://s1.shard.jp/losaul/limousine-hire.html motorhome travel in australia
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html map] [http://s1.shard.jp/olharder/stan-olsen-auto.html semi auto stretch wrapper
| + | |
− | ] [http://s1.shard.jp/frhorton/7fqgy22i2.html african american by poem
| + | |
− | ] [http://s1.shard.jp/frhorton/lpujl5mms.html african american biographies.com
| + | |
− | ] [http://s1.shard.jp/losaul/centacare-australia.html leader computers australia
| + | |
− | ] [http://s1.shard.jp/olharder/automotive-tool.html auto heating system repair
| + | |
− | ] [http://s1.shard.jp/olharder/autorizadas.html auto search vans
| + | |
− | ] [http://s1.shard.jp/bireba/antivirusreviews.html review of antivirus programs
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html page] [http://s1.shard.jp/olharder/gxautos.html automators for runescape
| + | |
− | ] [http://s1.shard.jp/olharder/autobiographer.html automatic bristle cutter material
| + | |
− | ] [http://s1.shard.jp/galeach/new173.html asian market baltimore
| + | |
− | ] [http://s1.shard.jp/olharder/arena-auto-auction.html arena auto auction bolingbrook] [http://s1.shard.jp/bireba/norton-antivirus.html antivirusprogramma
| + | |
− | ] [http://s1.shard.jp/galeach/new159.html asiago cheese fresco
| + | |
− | ] [http://s1.shard.jp/olharder/bournes-auto.html automotive classified domain public script
| + | |
− | ] [http://s1.shard.jp/frhorton/lt8tyfnvp.html west african traditions
| + | |
− | ] [http://s1.shard.jp/losaul/simple-plan.html 2005 australian open tennis tournament
| + | |
− | ] [http://s1.shard.jp/galeach/new181.html asian girl pictures
| + | |
− | ] [http://s1.shard.jp/frhorton/1aei449pv.html cold war in africa
| + | |
− | ] [http://s1.shard.jp/galeach/new15.html tight and asian 6] [http://s1.shard.jp/galeach/new176.html akenasia
| + | |
− | ] [http://s1.shard.jp/galeach/new32.html asian asses.com
| + | |
− | ] [http://s1.shard.jp/frhorton/2u1ol1yan.html african dancer picture
| + | |
− | ] [http://s1.shard.jp/galeach/new158.html asia finest discussion board] [http://s1.shard.jp/galeach/new55.html sykes asia website
| + | |
− | ] [http://s1.shard.jp/losaul/auction-houses.html air north australia
| + | |
− | ] [http://s1.shard.jp/olharder/autocad-2005-serial.html klasse auto wax
| + | |
− | ] [http://s1.shard.jp/losaul/dog-bike-trailer.html small business opportunities australia
| + | |
− | ] [http://s1.shard.jp/bireba/panda-titanium.html dansguardian antivirus
| + | |
− | ] [http://s1.shard.jp/olharder/lisa-lopez-autopsy.html automobile dealer association
| + | |
− | ] [http://s1.shard.jp/olharder/autoridad-nacional.html hydraulic press automotive
| + | |
− | ] [http://s1.shard.jp/frhorton/tulkpyc4u.html african orchids impatients
| + | |
− | ] [http://s1.shard.jp/bireba/maafee-antivirus.html kaspersky antivirus review
| + | |
− | ] [http://s1.shard.jp/losaul/australian-journal.html crown plaza darling harbour sydney australia
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html links] [http://s1.shard.jp/olharder/what-is-autonomously.html automobile upholstery
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html map] [http://s1.shard.jp/frhorton/xntk9qgnd.html african american coloring books
| + | |
− | ] [http://s1.shard.jp/frhorton/map.html african american movies list
| + | |
− | ] [http://s1.shard.jp/frhorton/n6s8w7eys.html african american achievement award
| + | |
− | ] [http://s1.shard.jp/galeach/new174.html expressive aphasia.
| + | |
− | ] [http://s1.shard.jp/olharder/concession-auto.html concession auto] [http://s1.shard.jp/olharder/22-auto-barrels.html cd rom autorun xp
| + | |
− | ] [http://s1.shard.jp/bireba/antivirus-free-download.html pop pro up winantivirus
| + | |
− | ]
| + | |
− | [http://s1.shard.jp/galeach/new98.html asian menus
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html url] [http://s1.shard.jp/olharder/autologous-cell.html colorado's transition from no-fault to tort auto insurance
| + | |
− | ] [http://s1.shard.jp/losaul/hsbc-asset-management.html book designers australia
| + | |
− | ] [http://s1.shard.jp/frhorton/ocdp2flvo.html african elephant masks] [http://s1.shard.jp/bireba/kaspersky-antivirus.html mac os x antivirus download
| + | |
− | ] [http://s1.shard.jp/frhorton/ufkvsduv1.html west african fish recipes
| + | |
− | ] [http://s1.shard.jp/frhorton/3q938n1mz.html edgars stores south africa
| + | |
− | ] [http://s1.shard.jp/galeach/new76.html asian ts.commembers http
| + | |
− | ] [http://s1.shard.jp/galeach/new41.html asian buffet indulge
| + | |
− | ] [http://s1.shard.jp/bireba/antivirusreviews.html antivirus trendmicro
| + | |
− | ] [http://s1.shard.jp/olharder/auto-remer.html car accident claim auto cheap insurance
| + | |
− | ] [http://s1.shard.jp/frhorton/vuku1m6uz.html african american life during the great deppression
| + | |
− | ] [http://s1.shard.jp/olharder/best-way-auto-care.html rhode island automobile insurance plan
| + | |
− | ] [http://s1.shard.jp/frhorton/lth7qsfbq.html south african war medals] [http://s1.shard.jp/bireba/anyware-antivirus.html anyware antivirus] [http://s1.shard.jp/bireba/antivirus-avg7.html symantec antivirus client removal tool
| + | |
− | ] [http://s1.shard.jp/frhorton/b9vqclfhc.html tefsa south africa
| + | |
− | ] [http://s1.shard.jp/losaul/2006-australia.html liquor licensing act south australia
| + | |
− | ] [http://s1.shard.jp/bireba/panda-titanium-antivirus.html panda titanium antivirus 2005 reviews
| + | |
− | ] [http://s1.shard.jp/frhorton/bq5czt3ax.html africa marine world usa
| + | |
− | ] [http://s1.shard.jp/bireba/mobile-antivirus.html antivirus w32 rontokbro
| + | |
− | ] [http://s1.shard.jp/galeach/new44.html utech asia 2005
| + | |
− | ] [http://s1.shard.jp/galeach/new153.html de fantasia jardin
| + | |
− | ] [http://s1.shard.jp/losaul/06-australia.html bunnings australia
| + | |
− | ] [http://s1.shard.jp/olharder/rockies-auto-colorado.html renta de automobile
| + | |
− | ] [http://s1.shard.jp/galeach/new190.html doug robb hoobastank asian] [http://s1.shard.jp/losaul/alzeihmers-australia.html 21 australia century estate real
| + | |
− | ] [http://s1.shard.jp/galeach/new88.html southern asia bible college bangalore
| + | |
− | ] [http://s1.shard.jp/bireba/antivirus-2004.html titanium antivirus and truprevent compusa display
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html domain] [http://s1.shard.jp/frhorton/91rryr9x4.html south african cricket tickets
| + | |
− | ] [http://s1.shard.jp/galeach/new178.html international calling card to africa asia
| + | |
− | ] [http://s1.shard.jp/losaul/australian-bull.html ibm notebook australia
| + | |
− | ] [http://s1.shard.jp/olharder/luggage-rack-automobile.html prays auto
| + | |
− | ] [http://s1.shard.jp/galeach/new84.html asian ladyboy ladyboys
| + | |
− | ] [http://s1.shard.jp/olharder/automobile-promotion.html automatically format drive boot disk
| + | |
− | ] [http://s1.shard.jp/bireba/northon-antivirus.html nortun antivirus
| + | |
− | ] [http://s1.shard.jp/bireba/panda-titanium.html avg antivirus system download
| + | |
− | ] [http://s1.shard.jp/bireba/alertaantivirus.html 2006 keygen pro v2.0.205.1 winantivirus
| + | |
− | ] [http://s1.shard.jp/olharder/accessory-automotive.html autocourse.com
| + | |
− | ] [http://s1.shard.jp/galeach/new33.html what is hip dysplasia in dogs
| + | |
− | ] [http://s1.shard.jp/galeach/new51.html mr. chews asian beaver mika
| + | |
− | ] [http://s1.shard.jp/losaul/beds-online-australia.html australia biggest looser chanel ten
| + | |
− | ] [http://s1.shard.jp/bireba/antivirus-stop.html types of antivirus softwares
| + | |
− | ] [http://s1.shard.jp/losaul/quiksilver-pro.html electoral role australia search
| + | |
− | ] [http://s1.shard.jp/bireba/winantivirus-pro.html norton antivirus 2005 cracked
| + | |
− | ] [http://s1.shard.jp/losaul/australia-transcriber.html good food guide melbourne australia
| + | |
− | ] [http://s1.shard.jp/frhorton/upga9mswa.html africa city south sun things
| + | |
− | ] [http://s1.shard.jp/losaul/australia-importing.html australia importing]
| + | |
− | [http://s1.shard.jp/losaul/picture-of-food.html cpi paper australia
| + | |
− | ] [http://s1.shard.jp/losaul/exchange-rate-australian.html hedge funds australia
| + | |
− | ] [http://s1.shard.jp/galeach/new100.html ductular hepatic hypoplasia syndromatic
| + | |
− | ] [http://s1.shard.jp/galeach/new170.html att calling card international prepaid asia
| + | |
− | ] [http://s1.shard.jp/bireba/download-norton.html uninstall norton antivirus corporate edition
| + | |
− | ] [http://s1.shard.jp/olharder/auto-escort-ford.html autobahn vw parts
| + | |
− | ] [http://s1.shard.jp/losaul/weight-loss-medication.html aboriginal australian picture
| + | |
− | ] [http://s1.shard.jp/galeach/new113.html asian babe cam hot web
| + | |
− | ] [http://s1.shard.jp/galeach/new57.html asian rainforests
| + | |
− | ] [http://s1.shard.jp/olharder/automotive-tool.html autotrader.co.ukwww.
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html link] [http://s1.shard.jp/losaul/murrays-buses.html australian manufacturing inc.
| + | |
− | ] [http://s1.shard.jp/olharder/automoveis-bmw.html auto cad viz
| + | |
− | ] [http://s1.shard.jp/bireba/download-symantec.html norton antivirus update crack
| + | |
− | ] [http://s1.shard.jp/frhorton/yoc3js17e.html elephants african] [http://s1.shard.jp/olharder/autoroll-654.html link] [http://s1.shard.jp/galeach/new186.html asian fever 12
| + | |
− | ] [http://s1.shard.jp/losaul/australia-bus.html australian open competitors
| + | |
− | ] [http://s1.shard.jp/galeach/new47.html booking online airasia
| + | |
− | ] [http://s1.shard.jp/galeach/new184.html anastasia - bartok
| + | |
− | ] [http://s1.shard.jp/losaul/compare-flights.html australia craft supply
| + | |
− | ] [http://s1.shard.jp/bireba/download-kaspersky.html download kaspersky antivirus file server version 5] [http://s1.shard.jp/olharder/jl-french-automotive.html a language for automation
| + | |
− | ] [http://s1.shard.jp/olharder/kurt-cobain-autograph.html lab automation career job
| + | |
− | ] [http://s1.shard.jp/losaul/06-australia.html physiotherapist jobs australia
| + | |
− | ] [http://s1.shard.jp/olharder/sunnyside-auto.html autoverhuur en language language malaga nl nl site
| + | |
− | ] [http://s1.shard.jp/olharder/automobile-dealer.html auto accident personal injury claims
| + | |
− | ] [http://s1.shard.jp/frhorton/77murrpay.html joberg south africa
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html url] [http://s1.shard.jp/bireba/quickheal-antivirus.html mdaemon antivirus
| + | |
− | ] [http://s1.shard.jp/olharder/autonomy-principal.html holzvergaser auto
| + | |
− | ] [http://s1.shard.jp/bireba/download-free.html grisoft antivirus
| + | |
− | ] [http://s1.shard.jp/galeach/new60.html asia holiday travel
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html page] [http://s1.shard.jp/losaul/emmigrating-australia.html state library of south australia
| + | |
− | ] [http://s1.shard.jp/frhorton/1euh2vemn.html timbavati south africa
| + | |
− | ] [http://s1.shard.jp/galeach/new51.html asian beaver mr.chews
| + | |
− | ] [http://s1.shard.jp/frhorton/9rxlvcl6n.html african men pics
| + | |
− | ] [http://s1.shard.jp/frhorton/lyfh4c7mt.html african american body image in woman
| + | |
− | ] [http://s1.shard.jp/olharder/autoroll-654.html webmap] [http://s1.shard.jp/losaul/car-importers-australia.html car importers australia] [http://s1.shard.jp/bireba/microworld-antivirus.html antivirus software for server 2003
| + | |
− | ] [http://s1.shard.jp/olharder/subasta-de-autos.html literary autobiography 1994 infant prodigy
| + | |
− | ] [http://s1.shard.jp/frhorton/vjlche4gq.html africa against aids current fight in news
| + | |
− | ] [http://s1.shard.jp/bireba/antivirus-stop.html antivirus stop sign] [http://s1.shard.jp/losaul/australian-landrover.html gun australia
| + | |
− | ] [http://s1.shard.jp/frhorton/xntk9qgnd.html medical association of south africa
| + | |
− | ] [http://s1.shard.jp/losaul/quiksilver-pro.html electoral role australia search
| + | |
− | ] [http://s1.shard.jp/losaul/ralph-lauren.html sydney australia phone directory
| + | |
− | ]
| + | |
− | {{ÃÂæÃÂøÃÂúÃÂû/Java EE}} | + | |
− | == {{oncolor||red|ÃÂâÃÂõÃÂûÃÂõÃÂÃÂÃÂþÃÂýÃÂýÃÂðÃÂàÃÂúÃÂýÃÂøÃÂóÃÂð}}: ÃÂÿÃÂõÃÂÃÂÃÂõÃÂÃÂ
ÃÂþÃÂô ÃÂýÃÂð JSP == | + | |
− | ''{{oncolor||red|ÃÂçÃÂÃÂÃÂáÃÂâÃÂì 2}} ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂÿÃÂþ ÃÂþÃÂôÃÂõÃÂöÃÂúÃÂõ âÃÂàÃÂø ÃÂÃÂÃÂþÃÂûÃÂÃÂÃÂÃÂÃÂþÃÂù ÃÂÃÂÃÂþÃÂÃÂÃÂàÃÂýÃÂõ ÃÂñÃÂÃÂÃÂû ÃÂÃÂÃÂøÃÂûÃÂÃÂÃÂýÃÂþ ÃÂòÃÂÿÃÂõÃÂÃÂÃÂðÃÂÃÂÃÂûÃÂõÃÂý ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂýÃÂýÃÂþÃÂù ÃÂýÃÂðÃÂüÃÂø ÃÂò ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂù ÃÂÃÂÃÂðÃÂ÷ ÃÂðÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂþÃÂù ÃÂúÃÂýÃÂøÃÂóÃÂþÃÂù. '''ÃÂÃÂÃÂûÃÂõÃÂúÃÂÃÂÃÂðÃÂýÃÂôÃÂàÃÂÃÂÃÂðÃÂñÃÂðÃÂõÃÂò''' ÃÂøÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂòÃÂûÃÂÃÂÃÂõÃÂàÃÂ÷ÃÂðÃÂüÃÂõÃÂÃÂÃÂõÃÂýÃÂýÃÂÃÂÃÂõ ÃÂýÃÂõÃÂôÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂÃÂ.'' | + | |
| | | |
| __TOC__ | | __TOC__ |
− | ÃÂàÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂÃÂÃÂù ÃÂÃÂÃÂðÃÂ÷ ÃÂüÃÂàÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂûÃÂø ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂûÃÂõÃÂúÃÂÃÂÃÂÃÂÃÂþÃÂýÃÂýÃÂÃÂÃÂàÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂàÃÂúÃÂýÃÂøÃÂöÃÂúÃÂÃÂ. ÃÂÃÂÃÂýÃÂð ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂõÃÂàÃÂò ÃÂñÃÂÃÂÃÂðÃÂÃÂÃÂ÷ÃÂõÃÂÃÂÃÂõ ÃÂø ÃÂÿÃÂþÃÂúÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂàÃÂýÃÂõÃÂÃÂÃÂúÃÂþÃÂûÃÂÃÂÃÂúÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂõÃÂú, ÃÂýÃÂð ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂ
ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂøÃÂÃÂÃÂþÃÂú ÃÂúÃÂþÃÂýÃÂÃÂÃÂðÃÂúÃÂÃÂÃÂþÃÂò, ÃÂôÃÂþÃÂñÃÂðÃÂòÃÂøÃÂÃÂÃÂàÃÂýÃÂþÃÂòÃÂÃÂÃÂù ÃÂúÃÂþÃÂýÃÂÃÂÃÂðÃÂúÃÂÃÂ, ÃÂÃÂÃÂôÃÂðÃÂûÃÂøÃÂÃÂÃÂàÃÂõÃÂóÃÂþ ÃÂøÃÂûÃÂø ÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂðÃÂúÃÂÃÂÃÂøÃÂÃÂÃÂþÃÂòÃÂðÃÂÃÂÃÂÃÂ. ÃÂàÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂðÃÂàÃÂôÃÂðÃÂòÃÂðÃÂùÃÂÃÂÃÂõ ÃÂÿÃÂþÃÂÿÃÂÃÂÃÂþÃÂñÃÂÃÂÃÂõÃÂü ÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂõ ÃÂÃÂÃÂÃÂÃÂþ ÃÂñÃÂþÃÂûÃÂõÃÂõ ÃÂÿÃÂÃÂÃÂðÃÂòÃÂøÃÂûÃÂÃÂÃÂýÃÂþ.
| + | В прошлый раз мы создали простейшую электронную записную книжку. Она работает в браузере и показывает несколько простых страничек, на которых можно просмотреть список контактов, добавить новый контакт, удалить его или отредактировать. А сейчас давайте попробуем сделать все это более правильно. |
| | | |
− | === ÃÂÃÂÃÂþÃÂÃÂÃÂõÃÂüÃÂàÃÂñÃÂÃÂÃÂûÃÂþ ÃÂÿÃÂûÃÂþÃÂÃÂ
ÃÂþ? === | + | === Почему было плохо? === |
| | | |
− | ÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂÃÂÃÂòÃÂøÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ, ÃÂÿÃÂþÃÂÃÂÃÂõÃÂüÃÂÃÂ? ÃÂàÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂõÃÂÃÂ, ÃÂø ÃÂÃÂ
ÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþ. ÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂþÃÂÃÂÃÂýÃÂþ ÃÂñÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþ ÃÂø ÃÂýÃÂõ ÃÂÃÂÃÂûÃÂøÃÂÃÂÃÂúÃÂþÃÂü ÃÂÃÂÃÂûÃÂþÃÂöÃÂýÃÂþ. ÃÂÃÂÃÂþ ÃÂòÃÂôÃÂÃÂÃÂÃÂÃÂó ÃÂ÷ÃÂðÃÂÃÂ
ÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÿÃÂþÃÂüÃÂõÃÂýÃÂÃÂÃÂÃÂÃÂàÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂý ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂõÃÂú? ÃÂàÃÂ÷ÃÂðÃÂÃÂ
ÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂõÃÂ÷ ÃÂôÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂüÃÂøÃÂýÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂÃÂ. ÃÂÃÂÃÂûÃÂø ÃÂÿÃÂþÃÂÃÂÃÂûÃÂõ ÃÂÃÂÃÂþÃÂóÃÂþ, ÃÂúÃÂðÃÂú ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂúÃÂàÃÂÿÃÂþÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂøÃÂàÃÂýÃÂðÃÂÃÂÃÂðÃÂûÃÂÃÂÃÂýÃÂøÃÂú.
| + | Действительно, почему? Работает, и хорошо. Достаточно быстро и не слишком сложно. Но вдруг захочется поменять дизайн страничек? А захочется через десять минут работы. Или после того, как страничку посмотрит начальник. |
| | | |
− | ÃÂçÃÂÃÂÃÂþÃÂñÃÂàÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂþ, ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂøÃÂ÷ÃÂüÃÂõÃÂýÃÂøÃÂÃÂÃÂàÃÂúÃÂþÃÂô ÃÂÿÃÂÃÂÃÂþÃÂõÃÂúÃÂÃÂÃÂð, ÃÂÿÃÂþÃÂÃÂÃÂþÃÂü ÃÂÿÃÂõÃÂÃÂÃÂõÃÂúÃÂþÃÂüÃÂÿÃÂøÃÂûÃÂøÃÂÃÂÃÂþÃÂòÃÂðÃÂÃÂÃÂàÃÂõÃÂóÃÂþ, ÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂþÃÂòÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂõÃÂà(ÃÂÃÂ? ÃÂÃÂÃÂÃÂÃÂþ-ÃÂÃÂÃÂþ ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂû? ÃÂÃÂÃÂ÷ÃÂòÃÂøÃÂýÃÂøÃÂÃÂÃÂõ...), ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂþÃÂòÃÂøÃÂÃÂÃÂàÃÂýÃÂþÃÂòÃÂÃÂÃÂù ÃÂúÃÂþÃÂô ÃÂø ÃÂÿÃÂþÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂýÃÂþ ÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂõÃÂÃÂ. ÃÂÃÂÃÂõÃÂÃÂÃÂþÃÂô, ÃÂüÃÂÃÂÃÂóÃÂúÃÂþ ÃÂóÃÂþÃÂòÃÂþÃÂÃÂÃÂÃÂ, ÃÂýÃÂõÃÂÃÂÃÂôÃÂþÃÂñÃÂýÃÂÃÂÃÂù. ÃÂàÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂøÃÂ÷ÃÂüÃÂõÃÂýÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂü ÃÂÿÃÂÃÂÃÂþÃÂõÃÂúÃÂàÃÂÃÂÃÂðÃÂú, ÃÂÃÂÃÂÃÂÃÂþÃÂñÃÂàÃÂòÃÂÃÂÃÂÿÃÂþÃÂûÃÂýÃÂõÃÂýÃÂøÃÂõ ÃÂÃÂÃÂðÃÂúÃÂøÃÂÃÂ
ÃÂÿÃÂþÃÂöÃÂõÃÂûÃÂðÃÂýÃÂøÃÂù ÃÂýÃÂõ ÃÂÃÂÃÂÃÂÃÂõÃÂñÃÂþÃÂòÃÂðÃÂûÃÂþ ÃÂÃÂÃÂÃÂÃÂþÃÂûÃÂàÃÂÃÂÃÂûÃÂþÃÂöÃÂýÃÂÃÂÃÂÃÂ
ÃÂôÃÂõÃÂùÃÂÃÂÃÂÃÂÃÂòÃÂøÃÂù. ÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂù ÃÂÿÃÂÃÂÃÂÃÂÃÂàÃÂ÷ÃÂþÃÂòÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂðÃÂúÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂýÃÂóÃÂþÃÂü ÃÂø ÃÂóÃÂþÃÂÃÂÃÂðÃÂ÷ÃÂôÃÂþ ÃÂñÃÂþÃÂûÃÂõÃÂõ ÃÂúÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂúÃÂÃÂÃÂõÃÂý. ÃÂÃÂÃÂÃÂÃÂûÃÂø ÃÂÃÂÃÂðÃÂ÷ÃÂôÃÂõÃÂûÃÂøÃÂÃÂÃÂàÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂý ÃÂø ÃÂûÃÂþÃÂóÃÂøÃÂúÃÂàÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂà(ÃÂñÃÂøÃÂ÷ÃÂýÃÂõÃÂÃÂ-ÃÂûÃÂþÃÂóÃÂøÃÂúÃÂÃÂ), ÃÂÃÂÃÂþ ÃÂò ÃÂôÃÂðÃÂûÃÂÃÂÃÂýÃÂõÃÂùÃÂÃÂÃÂõÃÂü ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂñÃÂÃÂÃÂôÃÂõÃÂÃÂ, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, ÃÂÃÂÃÂðÃÂ÷ÃÂôÃÂõÃÂûÃÂøÃÂÃÂÃÂàÃÂø ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂàÃÂÿÃÂþ ÃÂøÃÂÃÂ
ÃÂÿÃÂþÃÂôÃÂôÃÂõÃÂÃÂÃÂöÃÂðÃÂýÃÂøÃÂÃÂ. ÃÂÃÂ¥ÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂù ÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂüÃÂøÃÂÃÂÃÂàÃÂýÃÂõ ÃÂòÃÂÃÂÃÂõÃÂóÃÂôÃÂð ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂõÃÂàÃÂÃÂ
ÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂõ ÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂÃÂÃÂúÃÂøÃÂõ ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂÃÂ, ÃÂÿÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂüÃÂàÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂù ÃÂðÃÂÃÂÃÂÿÃÂõÃÂúÃÂàÃÂÃÂÃÂþÃÂöÃÂõ ÃÂòÃÂðÃÂöÃÂõÃÂý.
| + | Чтобы сделать это, можно изменить код проекта, потом перекомпилировать его, остановить сервер (А? Кто-то работал? Извините...), установить новый код и повторно запустить сервер. Метод, мягко говоря, неудобный. А можно изменить сам проект так, чтобы выполнение таких пожеланий не требовало столь сложных действий. Второй путь зовется рефакторингом и гораздо более корректен. Если разделить дизайн и логику работы приложения (бизнес-логику), то в дальнейшем можно будет, например, разделить и работу по их поддержанию. Хороший программист не всегда создает хорошие пользовательские интерфейсы, поэтому данный аспект тоже важен. |
| | | |
− | === ÃÂÃÂÃÂðÃÂú ÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂÃÂ
ÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþ? === | + | === Как сделать хорошо? === |
| | | |
− | ÃÂÃÂÃÂÃÂ, ÃÂòÃÂúÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂõ ÃÂÃÂÃÂöÃÂõ ÃÂÿÃÂþÃÂýÃÂÃÂÃÂÃÂÃÂýÃÂþ. ÃÂÃÂÃÂÃÂÃÂöÃÂýÃÂþ ÃÂòÃÂÃÂÃÂýÃÂõÃÂÃÂÃÂÃÂÃÂø ÃÂò ÃÂþÃÂÃÂÃÂôÃÂõÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂðÃÂùÃÂûÃÂàÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂ, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂðÃÂàÃÂüÃÂõÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂþ (ÃÂò ÃÂýÃÂðÃÂÃÂÃÂõÃÂü ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂõ, ÃÂÃÂÃÂÃÂÃÂþ ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂÃÂ) ÃÂø ÃÂúÃÂðÃÂú-ÃÂÃÂÃÂþ ÃÂÿÃÂþÃÂôÃÂúÃÂûÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂø ÃÂÃÂÃÂðÃÂùÃÂûÃÂàÃÂøÃÂ÷ ÃÂýÃÂðÃÂÃÂÃÂõÃÂù ÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂüÃÂÃÂ. ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂ, ÃÂöÃÂõÃÂûÃÂðÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ ÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂðÃÂú, ÃÂÃÂÃÂÃÂÃÂþÃÂñÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂðÃÂàÃÂÃÂÃÂðÃÂùÃÂûÃÂþÃÂò ÃÂëÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂýÃÂðÃÂû ÃÂñÃÂÃÂÃÂû ÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂôÃÂðÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂü, ÃÂÃÂÃÂÃÂÃÂþÃÂñÃÂàÃÂúÃÂðÃÂöÃÂôÃÂÃÂÃÂù ÃÂÃÂÃÂðÃÂ÷ ÃÂýÃÂõ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂøÃÂòÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ.
| + | Ну, вкратце уже понятно. Нужно вынести в отдельные файлы ту часть, которая меняется часто (в нашем случае, это интерфейс) и как-то подключить эти файлы из нашей программы. Плюс, желательно сделать это так, чтобы формат файлов «дизайна» был стандартным, чтобы каждый раз не переучиваться. |
| | | |
− | ÃÂàÃÂõÃÂÃÂÃÂõÃÂýÃÂøÃÂù ÃÂôÃÂûÃÂàÃÂôÃÂðÃÂýÃÂýÃÂþÃÂù ÃÂÿÃÂÃÂÃÂþÃÂñÃÂûÃÂõÃÂüÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂõÃÂàÃÂüÃÂýÃÂþÃÂöÃÂõÃÂÃÂÃÂÃÂÃÂòÃÂþ. ÃÂàÃÂðÃÂÃÂÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂøÃÂü ÃÂÃÂÃÂðÃÂüÃÂÃÂÃÂõ ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂõÃÂýÃÂýÃÂÃÂÃÂõ:
| + | Решений для данной проблемы существует множество. Рассмотрим самые распространенные: |
| | | |
− | * '''ÃÂèÃÂðÃÂñÃÂûÃÂþÃÂýÃÂÃÂ.''' ÃÂÃÂÃÂôÃÂýÃÂð ÃÂøÃÂ÷ ÃÂÃÂÃÂðÃÂüÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂõÃÂýÃÂýÃÂÃÂÃÂÃÂ
ÃÂñÃÂøÃÂñÃÂûÃÂøÃÂþÃÂÃÂÃÂõÃÂú ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂàÃÂàÃÂÃÂÃÂðÃÂñÃÂûÃÂþÃÂýÃÂðÃÂüÃÂø âÃÂà''Velocity''. ÃÂÃÂÃÂÃÂÃÂø ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂýÃÂøÃÂø ÃÂÃÂÃÂðÃÂñÃÂûÃÂþÃÂýÃÂýÃÂÃÂÃÂÃÂ
ÃÂôÃÂòÃÂøÃÂöÃÂúÃÂþÃÂò ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂôÃÂþÃÂñÃÂðÃÂòÃÂûÃÂÃÂÃÂÃÂÃÂàÃÂò ÃÂÃÂÃÂõÃÂúÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõ ÃÂóÃÂþÃÂòÃÂþÃÂÃÂÃÂÃÂÃÂÃÂ: ÃÂëÃÂâÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂøÃÂÃÂÃÂàÃÂ÷ÃÂýÃÂðÃÂÃÂÃÂõÃÂýÃÂøÃÂõ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂüÃÂõÃÂýÃÂýÃÂþÃÂù {{oncolor||red|Name}}ÃÂû. ÃÂÃÂÃÂýÃÂþÃÂóÃÂôÃÂð ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂñÃÂþÃÂûÃÂõÃÂõ ÃÂÃÂÃÂûÃÂþÃÂöÃÂýÃÂÃÂÃÂõ ÃÂþÃÂÿÃÂõÃÂÃÂÃÂðÃÂÃÂÃÂøÃÂø (ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂð ÃÂÿÃÂþÃÂôÃÂÃÂÃÂðÃÂñÃÂûÃÂþÃÂýÃÂþÃÂò, ÃÂòÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂûÃÂõÃÂýÃÂøÃÂÃÂ, ÃÂÃÂÃÂÃÂÃÂûÃÂþÃÂòÃÂýÃÂÃÂÃÂõ ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø). | + | * '''Шаблоны.''' Одна из самых распространенных библиотек работы с шаблонами – ''Velocity''. При использовании шаблонных движков можно добавлять в текст специальные вставки, которые говорят: «Тут вставить значение переменной {{oncolor||red|Name}}». Иногда можно делать более сложные операции (вставка подшаблонов, вычисления, условные вставки). |
| | | |
− | * '''JSP (Java Server Pages).''' ÃÂÃÂÃÂþ ÃÂòÃÂÃÂÃÂõÃÂüÃÂõÃÂýÃÂø ÃÂÿÃÂþÃÂÃÂÃÂòÃÂûÃÂõÃÂýÃÂøÃÂÃÂ, ÃÂÿÃÂþÃÂöÃÂðÃÂûÃÂÃÂÃÂù, ÃÂÿÃÂõÃÂÃÂÃÂòÃÂðÃÂàÃÂÃÂÃÂõÃÂÃÂ
ÃÂýÃÂþÃÂûÃÂþÃÂóÃÂøÃÂàÃÂôÃÂûÃÂàÃÂþÃÂÃÂÃÂôÃÂõÃÂûÃÂõÃÂýÃÂøÃÂàÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂýÃÂð ÃÂþÃÂàÃÂñÃÂøÃÂ÷ÃÂýÃÂõÃÂÃÂ-ÃÂûÃÂþÃÂóÃÂøÃÂúÃÂø. ÃÂÃÂÃÂþ ÃÂàÃÂõÃÂõ ÃÂÿÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂøÃÂû ÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂù, ÃÂÃÂÃÂðÃÂú ÃÂúÃÂðÃÂú ÃÂþÃÂýÃÂð ÃÂÃÂÃÂûÃÂþÃÂöÃÂýÃÂõÃÂõ, ÃÂÃÂÃÂõÃÂü ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂðÃÂñÃÂûÃÂþÃÂýÃÂýÃÂðÃÂàÃÂñÃÂøÃÂñÃÂûÃÂøÃÂþÃÂÃÂÃÂõÃÂúÃÂð. JSP ÃÂÿÃÂþÃÂ÷ÃÂòÃÂþÃÂûÃÂÃÂÃÂõÃÂàÃÂòÃÂýÃÂõÃÂôÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂúÃÂþÃÂô ÃÂýÃÂð (ÃÂÿÃÂþ ÃÂ÷ÃÂðÃÂôÃÂÃÂÃÂüÃÂúÃÂõ) ÃÂûÃÂÃÂÃÂñÃÂþÃÂü ÃÂÃÂÃÂ÷ÃÂÃÂÃÂúÃÂõ ÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂüÃÂøÃÂÃÂÃÂþÃÂòÃÂðÃÂýÃÂøÃÂàÃÂòÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂü ÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂü ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂýÃÂýÃÂþÃÂù ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂúÃÂø. ÃÂÃÂÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂõÃÂü, ÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂýÃÂþ ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàJava. ÃÂâÃÂõÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂøÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂø, ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂýÃÂðÃÂÿÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂõÃÂÃÂÃÂýÃÂþÃÂõ ÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂõ, ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂÃÂÃÂàÃÂøÃÂÃÂÃÂúÃÂûÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ JSP. ÃÂÃÂÃÂÃÂÃÂþÃÂàÃÂÿÃÂþÃÂôÃÂÃÂ
ÃÂþÃÂô ÃÂÿÃÂþÃÂÃÂ
ÃÂþÃÂö ÃÂýÃÂð PHP, ÃÂàÃÂÃÂÃÂõÃÂü ÃÂþÃÂÃÂÃÂûÃÂøÃÂÃÂÃÂøÃÂõÃÂü, ÃÂÃÂÃÂÃÂÃÂþ JSP-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂàâÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂþÃÂûÃÂýÃÂþÃÂÃÂÃÂõÃÂýÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂÃÂÃÂ, ÃÂþÃÂýÃÂø ÃÂúÃÂþÃÂüÃÂÿÃÂøÃÂûÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂø ÃÂþÃÂñÃÂýÃÂþÃÂòÃÂûÃÂõÃÂýÃÂøÃÂø ÃÂøÃÂÃÂÃÂÃÂ
ÃÂþÃÂôÃÂýÃÂþÃÂóÃÂþ ÃÂÃÂÃÂõÃÂúÃÂÃÂÃÂÃÂÃÂð ÃÂø ÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂðÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂúÃÂðÃÂú ÃÂÃÂÃÂðÃÂúÃÂþÃÂòÃÂÃÂÃÂõ. | + | * '''JSP (Java Server Pages).''' По времени появления, пожалуй, первая технология для отделения дизайна от бизнес-логики. Но я ее поставил второй, так как она сложнее, чем просто шаблонная библиотека. JSP позволяет внедрить код на (по задумке) любом языке программирования внутрь специальным образом созданной странички. Впрочем, обычно используется Java. Теоретически, можно написать серверное приложение, используя исключительно JSP. Этот подход похож на PHP, с тем отличием, что JSP-страницы – это полноценные сервлеты, они компилируются при обновлении исходного текста и обрабатываются как таковые. |
| | | |
− | * '''JSF (Java Server Faces).''' ÃÂàÃÂýÃÂõÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂü ÃÂÃÂÃÂþÃÂôÃÂõ ÃÂÃÂÃÂÃÂÃÂð ÃÂÃÂÃÂõÃÂÃÂ
ÃÂýÃÂþÃÂûÃÂþÃÂóÃÂøÃÂàÃÂþÃÂñÃÂÃÂÃÂõÃÂôÃÂøÃÂýÃÂÃÂÃÂõÃÂàÃÂÿÃÂþÃÂôÃÂÃÂ
ÃÂþÃÂôÃÂÃÂ, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõ ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂø ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂýÃÂøÃÂø ÃÂëÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂÃÂ
ÃÂû ÃÂø ÃÂëÃÂÃÂÃÂõÃÂÃÂÃÂõÃÂòÃÂÃÂÃÂÃÂ
ÃÂû ÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂü. ÃÂÃÂÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂà(ÃÂúÃÂðÃÂú ÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂý ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂð, ÃÂÃÂÃÂðÃÂú ÃÂø ÃÂõÃÂóÃÂþ ÃÂûÃÂþÃÂóÃÂøÃÂúÃÂð) ÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂüÃÂàÃÂþÃÂÿÃÂøÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂü ÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂü, ÃÂð ÃÂÿÃÂþÃÂÃÂÃÂûÃÂõ ÃÂÃÂÃÂÃÂÃÂþÃÂóÃÂþ ÃÂÿÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂàJSP-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂúÃÂø, ÃÂò ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂÃÂ
ÃÂÃÂÃÂúÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂëÃÂÃÂÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂøÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂñÃÂûÃÂøÃÂÃÂÃÂàÃÂàÃÂøÃÂüÃÂõÃÂýÃÂõÃÂü ÃÂÃÂÃÂðÃÂúÃÂøÃÂü-ÃÂÃÂÃÂþÃÂû. JSF ÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂðÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂõÃÂàÃÂÃÂÃÂÃÂÃÂø ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø ÃÂø ÃÂëÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂû ÃÂÃÂÃÂÃÂÃÂýÃÂúÃÂÃÂÃÂøÃÂþÃÂýÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂõ ÃÂÃÂÃÂûÃÂõÃÂüÃÂõÃÂýÃÂÃÂÃÂàÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂð (ÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂðÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂàÃÂÃÂÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂøÃÂàÃÂþÃÂàÃÂýÃÂøÃÂÃÂ
ÃÂø ÃÂÃÂÃÂðÃÂú ÃÂôÃÂðÃÂûÃÂõÃÂõ), ÃÂÿÃÂþÃÂ÷ÃÂòÃÂþÃÂûÃÂÃÂÃÂàÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂýÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂýÃÂð ÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂûÃÂÃÂÃÂýÃÂþÃÂü. | + | * '''JSF (Java Server Faces).''' В некотором роде эта технология объединяет подходы, которые используются при создании «обычных» и «сетевых» программ. Интерфейс (как дизайн интерфейса, так и его логика) программы описывается специальным образом, а после этого пишутся JSP-странички, в которых указывается «тут вставить таблицу с именем таким-то». JSF обрабатывает эти спецвставки и «рисует» функциональные элементы интерфейса (обрабатывая события от них и так далее), позволяя дизайнеру сосредоточиться на остальном. |
| | | |
− | * '''Google Web Toolkit.''' ÃÂÃÂÃÂõ ÃÂüÃÂþÃÂóÃÂàÃÂýÃÂõ ÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂþÃÂòÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂýÃÂð ÃÂÃÂÃÂÃÂÃÂþÃÂü ÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂÃÂÃÂÃÂÃÂòÃÂõ. ÃÂÃÂÃÂÃÂÃÂø ÃÂõÃÂóÃÂþ ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂýÃÂøÃÂø ÃÂýÃÂð ÃÂòÃÂÃÂÃÂÃÂ
ÃÂþÃÂôÃÂõ ÃÂÿÃÂþÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÿÃÂþÃÂûÃÂýÃÂþÃÂÃÂÃÂõÃÂýÃÂýÃÂþÃÂõ AJAX-ÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂõ (ÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂðÃÂúÃÂþÃÂõ âÃÂàÃÂÃÂÃÂõÃÂüÃÂð ÃÂþÃÂÃÂÃÂôÃÂõÃÂûÃÂÃÂÃÂýÃÂþÃÂù ÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂø, ÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂàâÃÂàGoogle Mail), ÃÂð ÃÂýÃÂð ÃÂòÃÂÃÂ
ÃÂþÃÂôÃÂõ âÃÂàÃÂòÃÂÃÂÃÂõ ÃÂÃÂÃÂþÃÂàÃÂöÃÂõ Java-ÃÂúÃÂþÃÂô. ÃÂàÃÂõÃÂÃÂÃÂõÃÂýÃÂøÃÂõ ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂþÃÂõ, ÃÂýÃÂõ ÃÂûÃÂøÃÂÃÂÃÂõÃÂýÃÂýÃÂþÃÂõ ÃÂÃÂÃÂòÃÂþÃÂøÃÂÃÂ
ÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂøÃÂýÃÂÃÂÃÂÃÂÃÂò ÃÂø ÃÂýÃÂõÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂúÃÂþÃÂò. | + | * '''Google Web Toolkit.''' Не могу не остановиться на этом средстве. При его использовании на выходе получается полноценное AJAX-приложение (что это такое – тема отдельной статьи, пример – Google Mail), а на входе – все тот же Java-код. Решение интересное, не лишенное своих достоинств и недостатков. |
| | | |
− | ÃÂÃÂÃÂàÃÂöÃÂõ ÃÂò ÃÂÃÂÃÂðÃÂüÃÂúÃÂðÃÂÃÂ
ÃÂôÃÂðÃÂýÃÂýÃÂþÃÂù ÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂø ÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂøÃÂü ÃÂëÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂýÃÂõÃÂýÃÂÃÂÃÂúÃÂþÃÂõÃÂû ÃÂÃÂÃÂõÃÂÃÂÃÂõÃÂýÃÂøÃÂõ âÃÂàJava Server Pages. ÃÂàÃÂþÃÂÃÂÃÂýÃÂþÃÂòÃÂýÃÂþÃÂü âÃÂàÃÂøÃÂ÷-ÃÂ÷ÃÂð ÃÂõÃÂóÃÂþ ÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂôÃÂðÃÂÃÂÃÂÃÂÃÂýÃÂþÃÂÃÂÃÂÃÂÃÂø, ÃÂÃÂ
ÃÂþÃÂÃÂÃÂàÃÂôÃÂûÃÂàÃÂôÃÂðÃÂýÃÂýÃÂþÃÂóÃÂþ ÃÂúÃÂþÃÂýÃÂúÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂþÃÂóÃÂþ ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂàÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂòÃÂÃÂÃÂñÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂúÃÂðÃÂúÃÂþÃÂù-ÃÂýÃÂøÃÂñÃÂÃÂÃÂôÃÂàÃÂÃÂÃÂðÃÂñÃÂûÃÂþÃÂýÃÂýÃÂÃÂÃÂù ÃÂôÃÂòÃÂøÃÂöÃÂþÃÂú, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, ÃÂÃÂÃÂþÃÂàÃÂöÃÂõ Velocity (http://velocity.apache.org).
| + | Мы же в рамках данной статьи рассмотрим «средненькое» решение – Java Server Pages. В основном – из-за его стандартности, хотя для данного конкретного случая можно выбрать какой-нибудь шаблонный движок, например, тот же Velocity (http://velocity.apache.org). |
| | | |
− | === ÃÂÃÂÃÂñÃÂÃÂÃÂðÃÂàÃÂÃÂÃÂÃÂ
ÃÂõÃÂüÃÂð ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂà=== | + | === Общая схема работы приложения === |
| | | |
− | ÃÂÃÂÃÂþÃÂýÃÂÃÂÃÂò, ÃÂÃÂÃÂÃÂÃÂþ ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂþÃÂÃÂÃÂôÃÂõÃÂûÃÂøÃÂÃÂÃÂàÃÂûÃÂþÃÂóÃÂøÃÂúÃÂàÃÂþÃÂàÃÂôÃÂøÃÂ÷ÃÂðÃÂùÃÂýÃÂð, ÃÂôÃÂðÃÂòÃÂðÃÂùÃÂÃÂÃÂõ ÃÂÿÃÂþÃÂôÃÂÃÂÃÂüÃÂðÃÂõÃÂü, ÃÂúÃÂðÃÂúÃÂøÃÂü ÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂü ÃÂÃÂÃÂÃÂÃÂþ ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂÃÂ. ÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂûÃÂðÃÂóÃÂðÃÂàÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂþÃÂòÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂýÃÂð ÃÂÃÂÃÂûÃÂõÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂù ÃÂÃÂÃÂÃÂ
ÃÂõÃÂüÃÂõ - '''(ÃÂàÃÂøÃÂÃÂ. 1)'''.
| + | Поняв, что нужно отделить логику от дизайна, давайте подумаем, каким образом это можно сделать. Предлагаю остановиться на следующей схеме - '''(Рис. 1)'''. |
| | | |
− | ÃÂáÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂòÃÂÃÂÃÂôÃÂðÃÂõÃÂàÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂõ, ÃÂðÃÂñÃÂÃÂÃÂþÃÂûÃÂÃÂÃÂÃÂÃÂýÃÂþ ÃÂýÃÂõ ÃÂ÷ÃÂðÃÂñÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂþ ÃÂÃÂÃÂþÃÂü, ÃÂúÃÂðÃÂú ÃÂþÃÂýÃÂø ÃÂñÃÂÃÂÃÂôÃÂÃÂÃÂàÃÂþÃÂÃÂÃÂþÃÂñÃÂÃÂÃÂðÃÂöÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ. ÃÂÃÂÃÂþ ÃÂòÃÂÃÂÃÂôÃÂðÃÂõÃÂàÃÂþÃÂý ÃÂøÃÂÃÂ
ÃÂýÃÂõ ÃÂò ÃÂëÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂüÃÂû ÃÂòÃÂøÃÂôÃÂõ, ÃÂð ÃÂò ÃÂÿÃÂþÃÂûÃÂýÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂýÃÂýÃÂþÃÂü, ÃÂóÃÂþÃÂÃÂÃÂþÃÂòÃÂþÃÂü ÃÂôÃÂûÃÂàÃÂþÃÂÃÂÃÂþÃÂñÃÂÃÂÃÂðÃÂöÃÂõÃÂýÃÂøÃÂàÃÂýÃÂð ÃÂÃÂÃÂúÃÂÃÂÃÂðÃÂýÃÂõ (ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, ÃÂõÃÂÃÂÃÂûÃÂø ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂÿÃÂþÃÂûÃÂýÃÂþÃÂõ ÃÂøÃÂüÃÂàÃÂÃÂÃÂõÃÂûÃÂþÃÂòÃÂõÃÂúÃÂð, ÃÂð ÃÂò ÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂÃÂ
âÃÂàÃÂõÃÂóÃÂþ ÃÂäÃÂÃÂÃÂàÃÂÿÃÂþ ÃÂþÃÂÃÂÃÂôÃÂõÃÂûÃÂÃÂÃÂýÃÂþÃÂÃÂÃÂÃÂÃÂø, ÃÂÃÂÃÂþ ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂôÃÂþÃÂûÃÂöÃÂõÃÂý ÃÂÿÃÂÃÂÃÂõÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂòÃÂðÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂõ ÃÂò ÃÂÿÃÂõÃÂÃÂÃÂòÃÂþÃÂõ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂô ÃÂÿÃÂõÃÂÃÂÃÂõÃÂôÃÂðÃÂÃÂÃÂõÃÂù ÃÂò JSP).
| + | Сервлет выдает данные, абсолютно не заботясь о том, как они будут отображаться. Но выдает он их не в «сыром» виде, а в полностью обработанном, готовом для отображения на экране (например, если нужно полное имя человека, а в данных – его ФИО по отдельности, то сервлет должен преобразовать второе в первое перед передачей в JSP). |
| | | |
− | ÃÂÃÂÃÂþÃÂ÷ÃÂýÃÂøÃÂúÃÂðÃÂõÃÂàÃÂòÃÂþÃÂÿÃÂÃÂÃÂþÃÂÃÂ: ÃÂúÃÂðÃÂú ÃÂöÃÂõ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂôÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂõ ÃÂþÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂÃÂð ÃÂò JSP? ÃÂçÃÂõÃÂÃÂÃÂõÃÂ÷ ÃÂÃÂÃÂöÃÂõ ÃÂøÃÂ÷ÃÂòÃÂõÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂù ÃÂýÃÂðÃÂü ÃÂþÃÂñÃÂÃÂÃÂõÃÂúÃÂà{{oncolor||red|request}}. ÃÂàÃÂýÃÂõÃÂüÃÂàÃÂëÃÂÿÃÂÃÂÃÂøÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂýÃÂû ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂù ÃÂðÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂøÃÂðÃÂÃÂÃÂøÃÂòÃÂýÃÂÃÂÃÂù ÃÂüÃÂðÃÂÃÂÃÂÃÂÃÂøÃÂò ÃÂë{{oncolor||red|String âÃÂàObject}}ÃÂû, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂýÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂðÃÂÃÂÃÂÃÂÃÂøÃÂñÃÂÃÂÃÂÃÂÃÂðÃÂüÃÂø ÃÂø ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂöÃÂøÃÂòÃÂõÃÂÃÂ, ÃÂÿÃÂþÃÂúÃÂð ÃÂöÃÂøÃÂò ÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂþÃÂÃÂ. ÃÂàÃÂýÃÂõÃÂüÃÂàÃÂøÃÂüÃÂõÃÂõÃÂàÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂÃÂÃÂÿ ÃÂø ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ, ÃÂø JSP-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂð, ÃÂÿÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂüÃÂàÃÂõÃÂóÃÂþ ÃÂüÃÂþÃÂöÃÂýÃÂþ (ÃÂø ÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂÃÂÃÂðÃÂòÃÂøÃÂûÃÂÃÂÃÂýÃÂþ) ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂÃÂÃÂàÃÂôÃÂûÃÂàÃÂÿÃÂõÃÂÃÂÃÂõÃÂôÃÂðÃÂÃÂÃÂø ÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂÃÂ
.
| + | Возникает вопрос: как же передаются данные от сервлета в JSP? Через уже известный нам объект {{oncolor||red|request}}. К нему «прикручен» специальный ассоциативный массив «{{oncolor||red|String – Object}}», который называется атрибутами и который живет, пока жив запрос. К нему имеет доступ и сервлет, и JSP-страница, поэтому его можно (и это правильно) использовать для передачи данных. |
| | | |
− | === ÃÂÃÂÃÂõÃÂÃÂÃÂõÃÂÃÂ
ÃÂþÃÂôÃÂøÃÂü ÃÂýÃÂð Tomcat === | + | === Переходим на Tomcat === |
| | | |
− | ÃÂÃÂÃÂþ ÃÂÃÂÃÂýÃÂðÃÂÃÂÃÂðÃÂûÃÂð ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂÿÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂýÃÂðÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂëÃÂÿÃÂþ-ÃÂòÃÂ÷ÃÂÃÂÃÂþÃÂÃÂÃÂûÃÂþÃÂüÃÂÃÂÃÂû. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂõÃÂýÃÂýÃÂÃÂÃÂù ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂõÃÂàâÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂ÷ÃÂðÃÂüÃÂõÃÂÃÂÃÂðÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ ÃÂôÃÂûÃÂàÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂÃÂÃÂÃÂ
ÃÂÿÃÂÃÂÃÂþÃÂõÃÂúÃÂÃÂÃÂþÃÂò, ÃÂýÃÂþ ÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂýÃÂþ ÃÂúÃÂþÃÂýÃÂÃÂÃÂõÃÂùÃÂýÃÂõÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂÃÂþÃÂò ÃÂÃÂÃÂöÃÂõ ÃÂÃÂÃÂÃÂÃÂþÃÂøÃÂÃÂ, ÃÂø ÃÂÿÃÂþÃÂôÃÂúÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂûÃÂõÃÂôÃÂÃÂÃÂõÃÂàÃÂú ÃÂýÃÂõÃÂüÃÂÃÂ.
| + | Но сначала нужно переписать наш сервлет «по-взрослому». Встроенный сервер – это замечательно для кустарных проектов, но обычно контейнер сервлетов уже стоит, и подключаться следует к нему. |
| | | |
− | ÃÂÃÂÃÂàÃÂñÃÂÃÂÃÂôÃÂõÃÂü ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂÃÂÃÂàTomcat 5.5. ÃÂÃÂÃÂÃÂÃÂþ ÃÂúÃÂûÃÂðÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂøÃÂù, ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂôÃÂðÃÂöÃÂõ ÃÂÃÂÃÂúÃÂðÃÂ÷ÃÂðÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂôÃÂðÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂù ÃÂþÃÂÃÂÃÂúÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂù ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ-ÃÂúÃÂþÃÂýÃÂÃÂÃÂõÃÂùÃÂýÃÂõÃÂÃÂ. ÃÂÃÂÃÂûÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂþÃÂòÃÂúÃÂø Tomcat ÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂþÃÂÃÂÃÂýÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂúÃÂðÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂõÃÂóÃÂþ ÃÂàhttp://tomcat.apache.org (ÃÂøÃÂûÃÂø ÃÂòÃÂ÷ÃÂÃÂÃÂÃÂÃÂàÃÂàÃÂýÃÂðÃÂÃÂÃÂõÃÂóÃÂþ DVD), ÃÂÃÂÃÂðÃÂÃÂÃÂÿÃÂðÃÂúÃÂþÃÂòÃÂðÃÂÃÂÃÂàÃÂø ÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂà'''bin/startup.sh''' (ÃÂøÃÂûÃÂø ÃÂÃÂÃÂþÃÂþÃÂÃÂÃÂòÃÂõÃÂÃÂÃÂÃÂÃÂòÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂù '''.bat'''). ''Tomcat'' ÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂõÃÂàÃÂàÃÂÃÂÃÂðÃÂùÃÂûÃÂðÃÂüÃÂø ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂþÃÂóÃÂþ ÃÂÃÂÃÂøÃÂÿÃÂð Web Archive (WAR). ÃÂÃÂÃÂñÃÂýÃÂðÃÂÃÂÃÂÃÂÃÂöÃÂøÃÂò ÃÂÃÂÃÂðÃÂúÃÂþÃÂù ÃÂÃÂÃÂðÃÂùÃÂû ÃÂò ÃÂþÃÂÿÃÂÃÂÃÂõÃÂôÃÂõÃÂûÃÂõÃÂýÃÂýÃÂþÃÂü ÃÂúÃÂðÃÂÃÂÃÂðÃÂûÃÂþÃÂóÃÂõ, Tomcat ÃÂÃÂÃÂðÃÂ÷ÃÂòÃÂþÃÂÃÂÃÂðÃÂÃÂÃÂøÃÂòÃÂðÃÂõÃÂàÃÂõÃÂóÃÂþ ÃÂø ÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂÃÂÃÂúÃÂðÃÂõÃÂàÃÂÃÂÃÂþÃÂôÃÂõÃÂÃÂÃÂöÃÂðÃÂÃÂÃÂõÃÂõÃÂÃÂÃÂàÃÂò ÃÂýÃÂõÃÂü ÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂõ. ÃÂçÃÂÃÂÃÂþÃÂñÃÂàÃÂÿÃÂõÃÂÃÂÃÂõÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂàÃÂøÃÂûÃÂø ÃÂþÃÂñÃÂýÃÂþÃÂòÃÂøÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂþÃÂóÃÂÃÂÃÂðÃÂüÃÂüÃÂÃÂ, ÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂþÃÂÃÂÃÂýÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþ ÃÂ÷ÃÂðÃÂüÃÂõÃÂýÃÂøÃÂÃÂÃÂàÃÂþÃÂôÃÂøÃÂý WAR-ÃÂÃÂÃÂðÃÂùÃÂû ÃÂôÃÂÃÂÃÂÃÂÃÂóÃÂøÃÂü.
| + | Мы будем использовать Tomcat 5.5. Это классический, можно даже сказать, стандартный открытый сервлет-контейнер. Для установки Tomcat достаточно просто скачать его с http://tomcat.apache.org (или взять с нашего DVD), распаковать и запустить '''bin/startup.sh''' (или соответсвующий '''.bat'''). ''Tomcat'' работает с файлами специального типа Web Archive (WAR). Обнаружив такой файл в определенном каталоге, Tomcat разворачивает его и запускает содержащееся в нем приложение. Чтобы перезапустить или обновить программу, достаточно просто заменить один WAR-файл другим. |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂõÃÂôÃÂÃÂÃÂôÃÂÃÂÃÂÃÂÃÂøÃÂù ÃÂúÃÂþÃÂô ÃÂýÃÂõ ÃÂóÃÂþÃÂÃÂÃÂþÃÂò ÃÂôÃÂûÃÂàÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂàÃÂàTomcat, ÃÂÿÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂüÃÂàÃÂõÃÂóÃÂþ ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂýÃÂõÃÂüÃÂýÃÂþÃÂóÃÂþ ÃÂÿÃÂõÃÂÃÂÃÂõÃÂÿÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂÃÂ. ÃÂÃÂÃÂþÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂñÃÂÃÂÃÂôÃÂõÃÂàÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂýÃÂþ:
| + | Предыдущий код не готов для работы с Tomcat, поэтому его нужно немного переписать. Вот что будет сделано: |
| | | |
− | * '''{{oncolor||red|AddressBook}}''' ÃÂÿÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂõÃÂàÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂà{{oncolor||red|start}} ÃÂø {{oncolor||red|main}} ÃÂø ÃÂÿÃÂÃÂÃÂõÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂàÃÂò ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂõ ÃÂÃÂ
ÃÂÃÂÃÂðÃÂýÃÂøÃÂûÃÂøÃÂÃÂÃÂõ ÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂõÃÂù. | + | * '''{{oncolor||red|AddressBook}}''' потеряет методы {{oncolor||red|start}} и {{oncolor||red|main}} и превратится в простое хранилище записей. |
− | * '''{{oncolor||red|AddressBookHandler}}''' ÃÂÿÃÂÃÂÃÂõÃÂòÃÂÃÂÃÂðÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂàÃÂò {{oncolor||red|AddressBookServlet}}, ÃÂø ÃÂò ÃÂýÃÂõÃÂóÃÂþ ÃÂñÃÂÃÂÃÂôÃÂõÃÂàÃÂôÃÂþÃÂñÃÂðÃÂòÃÂûÃÂõÃÂýÃÂþ ÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂÃÂýÃÂþ ÃÂÃÂÃÂûÃÂõÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂõ '''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 1)''': | + | * '''{{oncolor||red|AddressBookHandler}}''' превратится в {{oncolor||red|AddressBookServlet}}, и в него будет добавлено примерно следующее '''(Листинг 1)''': |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 1. ÃÂÃÂÃÂþÃÂòÃÂÃÂÃÂù AddressBook}}''' | + | '''{{oncolor||red|Листинг 1. Новый AddressBook}}''' |
| | | |
| private AddressBook _addressBook = null; | | private AddressBook _addressBook = null; |
Строка 194: |
Строка 66: |
| } | | } |
| | | |
− | ÃÂáÃÂðÃÂü ÃÂüÃÂõÃÂÃÂÃÂþÃÂô {{oncolor||red|handle}} ÃÂÃÂÃÂþÃÂöÃÂõ ÃÂÃÂÃÂûÃÂõÃÂóÃÂúÃÂð ÃÂÿÃÂÃÂÃÂõÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂà'''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 2)''':
| + | Сам метод {{oncolor||red|handle}} тоже слегка преобразуется '''(Листинг 2)''': |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 2. ÃÂÃÂÃÂþÃÂòÃÂÃÂÃÂù ÃÂüÃÂõÃÂÃÂÃÂþÃÂô handle}}''' | + | '''{{oncolor||red|Листинг 2. Новый метод handle}}''' |
| | | |
| private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse) | | private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse) |
Строка 218: |
Строка 90: |
| } | | } |
| | | |
− | * ÃÂÃÂÃÂûÃÂàÃÂÃÂÃÂþÃÂóÃÂþ, ÃÂÃÂÃÂÃÂÃÂþÃÂñÃÂàTomcat ÃÂëÃÂÿÃÂþÃÂýÃÂÃÂÃÂûÃÂû, ÃÂÃÂÃÂÃÂÃÂþ ÃÂõÃÂüÃÂàÃÂÿÃÂþÃÂûÃÂþÃÂöÃÂøÃÂûÃÂø ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ, ÃÂø ÃÂ÷ÃÂýÃÂðÃÂû, ÃÂúÃÂðÃÂú ÃÂõÃÂóÃÂþ ÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂðÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂÃÂÃÂÃÂ, ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂýÃÂðÃÂÿÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂù ÃÂÃÂÃÂðÃÂùÃÂû, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂýÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂëÃÂôÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂû. ÃÂÃÂÃÂõÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂàÃÂýÃÂð ÃÂÃÂÃÂþ, ÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂûÃÂþÃÂòÃÂþ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂýÃÂþÃÂõ, ÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþ XML-ÃÂôÃÂþÃÂúÃÂÃÂÃÂüÃÂõÃÂýÃÂàÃÂàÃÂþÃÂÿÃÂøÃÂÃÂÃÂðÃÂýÃÂøÃÂõÃÂü ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂÃÂð. ÃÂÃÂÃÂÃÂÃÂûÃÂø ÃÂÿÃÂõÃÂÃÂÃÂõÃÂòÃÂõÃÂÃÂÃÂÃÂÃÂø ÃÂàÃÂÃÂÃÂ÷ÃÂÃÂÃÂúÃÂð ÃÂýÃÂðÃÂÿÃÂøÃÂÃÂÃÂðÃÂýÃÂøÃÂàÃÂôÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂò ÃÂýÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂúÃÂøÃÂù, ÃÂÃÂÃÂþ ÃÂÿÃÂþÃÂûÃÂÃÂÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂàÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂÃÂýÃÂþ ÃÂÃÂÃÂûÃÂõÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂàÃÂøÃÂýÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂðÃÂÃÂÃÂøÃÂÃÂ: | + | * Для того, чтобы Tomcat «понял», что ему положили сервлет, и знал, как его обрабатывать, нужно написать специальный файл, который называется «дескриптор». Несмотря на то, что слово страшное, это просто XML-документ с описанием сервлета. Если перевести с языка написания дескрипторов на русский, то получится примерно следующая информация: |
| | | |
− | ** ÃÂÃÂÃÂðÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂýÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂà{{oncolor||red|ÃÂëABServletÃÂû}} ÃÂø ÃÂ÷ÃÂðÃÂÿÃÂÃÂÃÂÃÂÃÂúÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂúÃÂûÃÂðÃÂÃÂÃÂÃÂÃÂþÃÂü {{oncolor||red|AddressBookServlet}}. ÃÂâÃÂõÃÂþÃÂÃÂÃÂõÃÂÃÂÃÂøÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂø ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂýÃÂðÃÂ÷ÃÂòÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂÃÂÃÂðÃÂú ÃÂöÃÂõ, ÃÂúÃÂðÃÂú ÃÂø ÃÂúÃÂûÃÂðÃÂÃÂÃÂÃÂ, ÃÂýÃÂþ ÃÂüÃÂàÃÂýÃÂõ ÃÂñÃÂÃÂÃÂôÃÂõÃÂü ÃÂÃÂÃÂðÃÂú ÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂÃÂÃÂþÃÂñÃÂàÃÂñÃÂÃÂÃÂûÃÂþ ÃÂüÃÂõÃÂýÃÂÃÂÃÂÃÂÃÂõ ÃÂÿÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂÃÂ. | + | ** Наш сервлет называется {{oncolor||red|«ABServlet»}} и запускается классом {{oncolor||red|AddressBookServlet}}. Теоретически можно назвать сервлет так же, как и класс, но мы не будем так делать, чтобы было меньше путаницы. |
| | | |
− | ** ÃÂÃÂÃÂûÃÂàÃÂòÃÂÃÂÃÂõÃÂÃÂ
URL, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõ ÃÂýÃÂðÃÂÃÂÃÂøÃÂýÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂàÃÂë/ÃÂû, ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂòÃÂÃÂÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂýÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂàABServlet. | + | ** Для всех URL, которые начинаются с «/», нужно вызывать сервлет, который называется ABServlet. |
| | | |
− | ÃÂàÃÂòÃÂþÃÂàÃÂúÃÂðÃÂú ÃÂþÃÂý ÃÂòÃÂÃÂÃÂóÃÂûÃÂÃÂÃÂôÃÂøÃÂà'''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 3)''':
| + | А вот как он выглядит '''(Листинг 3)''': |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 3. ÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÿÃÂÃÂÃÂþÃÂàÃÂôÃÂûÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂÃÂð}}''' | + | '''{{oncolor||red|Листинг 3. Дескриптор для сервлета}}''' |
| | | |
| <?xml version="1.0" encoding="UTF-8"?> | | <?xml version="1.0" encoding="UTF-8"?> |
Строка 249: |
Строка 121: |
| </web-app> | | </web-app> |
| | | |
− | * ÃÂÃÂÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÿÃÂÃÂÃÂþÃÂàÃÂñÃÂÃÂÃÂôÃÂõÃÂàÃÂýÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂÃÂÃÂÃÂÃÂÃÂÃÂà'''web.xml''' ÃÂø ÃÂÃÂ
ÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂò ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂþÃÂü ÃÂúÃÂðÃÂÃÂÃÂðÃÂûÃÂþÃÂóÃÂõ. ÃÂÃÂÃÂôÃÂõ ÃÂøÃÂüÃÂõÃÂýÃÂýÃÂþ âÃÂàÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂôÃÂøÃÂü, ÃÂúÃÂþÃÂóÃÂôÃÂð ÃÂñÃÂÃÂÃÂôÃÂõÃÂü ÃÂÃÂÃÂþÃÂñÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂàÃÂò {{oncolor||red|WAR}} | + | * Дескриптор будет называться '''web.xml''' и храниться в специальном каталоге. Где именно – обсудим, когда будем собирать сервлет в {{oncolor||red|WAR}} |
| . | | . |
− | ÃÂáÃÂôÃÂõÃÂûÃÂðÃÂùÃÂÃÂÃÂõ ÃÂÃÂÃÂúÃÂðÃÂ÷ÃÂðÃÂýÃÂýÃÂÃÂÃÂõ ÃÂøÃÂ÷ÃÂüÃÂõÃÂýÃÂõÃÂýÃÂøÃÂàÃÂÃÂÃÂðÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ ÃÂøÃÂûÃÂø ÃÂòÃÂþÃÂ÷ÃÂÃÂÃÂüÃÂøÃÂÃÂÃÂõ ÃÂóÃÂþÃÂÃÂÃÂþ-ÃÂòÃÂÃÂÃÂù ÃÂúÃÂþÃÂô ÃÂàDVD. ÃÂÃÂÃÂÃÂÃÂõ ÃÂò ÃÂÿÃÂþÃÂÃÂÃÂÃÂÃÂôÃÂúÃÂõ? ÃÂâÃÂþÃÂóÃÂôÃÂð ÃÂôÃÂòÃÂøÃÂöÃÂõÃÂüÃÂÃÂÃÂàÃÂôÃÂðÃÂûÃÂÃÂÃÂÃÂÃÂõ.
| + | Сделайте указанные изменения самостоятельно или возьмите гото-вый код с DVD. Все в порядке? Тогда движемся дальше. |
| | | |
− | === ÃÂÃÂÃÂþÃÂòÃÂÃÂÃÂù ÃÂüÃÂõÃÂÃÂÃÂþÃÂô === | + | === Новый метод === |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂûÃÂø ÃÂÿÃÂÃÂÃÂøÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂñÃÂþÃÂûÃÂõÃÂõ ÃÂòÃÂýÃÂøÃÂüÃÂðÃÂÃÂÃÂõÃÂûÃÂÃÂÃÂýÃÂþ ÃÂú ÃÂúÃÂþÃÂôÃÂàÃÂýÃÂþÃÂòÃÂþÃÂóÃÂþ {{oncolor||red|handle}}, ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂ÷ÃÂðÃÂüÃÂõÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ, ÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂÃÂðÃÂü ÃÂÿÃÂþÃÂÃÂÃÂòÃÂøÃÂûÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂ÷ÃÂþÃÂò ÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂð {{oncolor||red|outputPage}}. ÃÂàÃÂðÃÂýÃÂÃÂÃÂÃÂÃÂõ ÃÂõÃÂóÃÂþ, ÃÂò ÃÂþÃÂÃÂÃÂûÃÂøÃÂÃÂÃÂøÃÂõ ÃÂþÃÂàÃÂÃÂÃÂðÃÂ÷ÃÂýÃÂÃÂÃÂÃÂ
{{oncolor||red|handle}}... ÃÂýÃÂõ ÃÂñÃÂÃÂÃÂûÃÂþ. ÃÂÃÂÃÂÃÂÃÂþ ÃÂüÃÂõÃÂÃÂÃÂþÃÂô, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂòÃÂÃÂÃÂñÃÂøÃÂÃÂÃÂðÃÂõÃÂàJSP-ÃÂÃÂÃÂðÃÂùÃÂû ÃÂø ÃÂÿÃÂõÃÂÃÂÃÂõÃÂôÃÂðÃÂõÃÂàÃÂõÃÂüÃÂàÃÂÃÂÃÂÿÃÂÃÂÃÂðÃÂòÃÂûÃÂõÃÂýÃÂøÃÂõ ÃÂôÃÂûÃÂàÃÂòÃÂÃÂÃÂòÃÂþÃÂôÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂõÃÂú. ÃÂÃÂÃÂÃÂÃÂóÃÂûÃÂÃÂÃÂôÃÂøÃÂàÃÂüÃÂõÃÂÃÂÃÂþÃÂô ÃÂÃÂÃÂûÃÂõÃÂôÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂü ÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂü '''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 4)''':
| + | Если присмотреться более внимательно к коду нового {{oncolor||red|handle}}, можно заметить, что там появился вызов метода {{oncolor||red|outputPage}}. Раньше его, в отличие от разных {{oncolor||red|handle}}... не было. Это метод, который выбирает JSP-файл и передает ему управление для вывода страничек. Выглядит метод следующим образом '''(Листинг 4)''': |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 4. ÃÂÃÂÃÂõÃÂÃÂÃÂþÃÂô outputPage}}''' | + | '''{{oncolor||red|Листинг 4. Метод outputPage}}''' |
| | | |
| public void outputPage(String aJSPName, HttpServletRequest aRequest, HttpServletResponse aResponse) throws IOException, ServletException | | public void outputPage(String aJSPName, HttpServletRequest aRequest, HttpServletResponse aResponse) throws IOException, ServletException |
Строка 265: |
Строка 137: |
| } | | } |
| | | |
− | ÃÂàÃÂÃÂÃÂÃÂÃÂþÃÂü ÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂõ ÃÂüÃÂàÃÂñÃÂõÃÂÃÂÃÂõÃÂü ÃÂýÃÂÃÂÃÂöÃÂýÃÂÃÂÃÂù JSP-ÃÂÃÂÃÂðÃÂùÃÂû ÃÂø ÃÂóÃÂþÃÂòÃÂþÃÂÃÂÃÂøÃÂü ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ-ÃÂúÃÂþÃÂýÃÂÃÂÃÂõÃÂùÃÂýÃÂõÃÂÃÂÃÂÃÂ: ÃÂëÃÂÃÂÃÂñÃÂÃÂÃÂðÃÂñÃÂþÃÂÃÂÃÂðÃÂù, ÃÂÿÃÂþÃÂöÃÂðÃÂûÃÂÃÂÃÂùÃÂÃÂÃÂÃÂÃÂðÃÂû. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂûÃÂÃÂÃÂýÃÂþÃÂõ ÃÂñÃÂõÃÂÃÂÃÂõÃÂàÃÂýÃÂð ÃÂÃÂÃÂõÃÂñÃÂàÃÂúÃÂþÃÂýÃÂÃÂÃÂõÃÂùÃÂýÃÂõÃÂÃÂ. ÃÂÃÂÃÂý ÃÂøÃÂÃÂÃÂõÃÂàJSP-ÃÂÃÂÃÂðÃÂùÃÂû, ÃÂ÷ÃÂðÃÂóÃÂÃÂÃÂÃÂÃÂöÃÂðÃÂõÃÂàÃÂõÃÂóÃÂþ, ÃÂúÃÂþÃÂüÃÂÿÃÂøÃÂûÃÂøÃÂÃÂÃÂÃÂÃÂõÃÂà(ÃÂõÃÂÃÂÃÂûÃÂø ÃÂÃÂÃÂÃÂÃÂþ ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ), ÃÂòÃÂÃÂÃÂÿÃÂþÃÂûÃÂýÃÂÃÂÃÂõÃÂàÃÂÿÃÂþÃÂûÃÂÃÂÃÂÃÂÃÂøÃÂòÃÂÃÂÃÂøÃÂùÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂûÃÂõÃÂÃÂ, ÃÂð ÃÂÃÂÃÂõÃÂ÷ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂàÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂõÃÂàÃÂò {{oncolor||red|aResponse}}.
| + | В этом методе мы берем нужный JSP-файл и говорим сервлет-контейнеру: «Обработай, пожалуйста». Остальное берет на себя контейнер. Он ищет JSP-файл, загружает его, компилирует (если это нужно), выполняет получившийся сервлет, а результат записывает в {{oncolor||red|aResponse}}. |
| | | |
− | === JSP-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂà=== | + | === JSP-страницы === |
| | | |
− | ÃÂÃÂÃÂûÃÂàÃÂýÃÂðÃÂÃÂÃÂðÃÂûÃÂð ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂôÃÂøÃÂü ÃÂúÃÂðÃÂÃÂÃÂðÃÂûÃÂþÃÂó, ÃÂò ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂü ÃÂñÃÂÃÂÃÂôÃÂõÃÂü ÃÂÃÂÃÂþÃÂñÃÂøÃÂÃÂÃÂðÃÂÃÂÃÂàÃÂýÃÂðÃÂÃÂÃÂõ ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂõÃÂÃÂ-ÃÂÿÃÂÃÂÃÂøÃÂûÃÂþÃÂöÃÂõÃÂýÃÂøÃÂõ. ÃÂÃÂÃÂðÃÂ÷ÃÂòÃÂðÃÂÃÂÃÂàÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂúÃÂðÃÂú ÃÂÃÂÃÂóÃÂþÃÂôÃÂýÃÂþ, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, {{oncolor||red|WebApp}} ({{oncolor||red|Web Application}}). ÃÂàÃÂýÃÂõÃÂü ÃÂÃÂÃÂþÃÂ÷ÃÂôÃÂðÃÂôÃÂøÃÂü ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂù ÃÂúÃÂðÃÂÃÂÃÂðÃÂûÃÂþÃÂó '''WEB-INF''', ÃÂóÃÂôÃÂõ ÃÂôÃÂþÃÂûÃÂöÃÂõÃÂý ÃÂýÃÂðÃÂÃÂ
ÃÂþÃÂôÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂôÃÂõÃÂÃÂÃÂúÃÂÃÂÃÂøÃÂÿÃÂÃÂÃÂþÃÂà'''web.xml''', ÃÂø ÃÂúÃÂðÃÂÃÂÃÂðÃÂûÃÂþÃÂó '''jsps''', ÃÂò ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂü ÃÂñÃÂÃÂÃÂôÃÂÃÂÃÂàÃÂÃÂ
ÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂÃÂÃÂÃÂÃÂàJSP-ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂúÃÂø.
| + | Для начала создадим каталог, в котором будем собирать наше интернет-приложение. Назвать можно как угодно, например, {{oncolor||red|WebApp}} ({{oncolor||red|Web Application}}). В нем создадим специальный каталог '''WEB-INF''', где должен находиться дескриптор '''web.xml''', и каталог '''jsps''', в котором будут храниться JSP-странички. |
| | | |
− | ÃÂáÃÂþÃÂ÷ÃÂôÃÂðÃÂôÃÂøÃÂü ÃÂÃÂÃÂÃÂÃÂø JSP-ÃÂÃÂÃÂðÃÂùÃÂûÃÂð: ÃÂôÃÂûÃÂàÃÂøÃÂýÃÂôÃÂõÃÂúÃÂÃÂÃÂýÃÂþÃÂù ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂúÃÂø, ÃÂôÃÂûÃÂàÃÂÃÂÃÂõÃÂôÃÂðÃÂúÃÂÃÂÃÂøÃÂÃÂÃÂþÃÂòÃÂðÃÂýÃÂøÃÂà(ÃÂøÃÂûÃÂø ÃÂôÃÂþÃÂñÃÂðÃÂòÃÂûÃÂõÃÂýÃÂøÃÂÃÂ) ÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂõÃÂù ÃÂø ÃÂôÃÂûÃÂàÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂð, ÃÂø ÃÂýÃÂðÃÂ÷ÃÂþÃÂòÃÂõÃÂü ÃÂøÃÂÃÂ
, ÃÂÃÂÃÂþÃÂþÃÂÃÂÃÂòÃÂõÃÂÃÂÃÂÃÂÃÂÃÂÃÂòÃÂõÃÂýÃÂýÃÂþ, '''index.jsp''', '''edit.jsp''', '''view.jsp'''. ÃÂÃÂÃÂõ ÃÂ÷ÃÂðÃÂñÃÂÃÂÃÂôÃÂÃÂÃÂÃÂÃÂõ âÃÂàÃÂøÃÂÃÂ
ÃÂýÃÂÃÂÃÂöÃÂýÃÂþ ÃÂÃÂÃÂþÃÂÃÂ
ÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂàÃÂò ÃÂò {{oncolor||red|WebApp/jsps}}.
| + | Создадим три JSP-файла: для индексной странички, для редактирования (или добавления) записей и для просмотра, и назовем их, соответственно, '''index.jsp''', '''edit.jsp''', '''view.jsp'''. Не забудьте – их нужно сохранить в в {{oncolor||red|WebApp/jsps}}. |
| | | |
− | ÃÂáÃÂðÃÂü JSP ÃÂôÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂþÃÂÃÂÃÂýÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂ. ÃÂàÃÂðÃÂÃÂÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂøÃÂü '''index.jsp''' '''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 5)''':
| + | Сам JSP достаточно прост. Рассмотрим '''index.jsp''' '''(Листинг 5)''': |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 5. index.jsp}}''' | + | '''{{oncolor||red|Листинг 5. index.jsp}}''' |
| | | |
| <nowiki> | | <nowiki> |
Строка 282: |
Строка 154: |
| <head> | | <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
− | <title>ÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂðÃÂàÃÂúÃÂýÃÂøÃÂóÃÂð</title> | + | <title>Адресная книга</title> |
| </head> | | </head> |
− | <body><h1>ÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂðÃÂàÃÂúÃÂýÃÂøÃÂóÃÂð</h1> | + | <body><h1>Адресная книга</h1> |
− | <a href="<%=request.getContextPath()%>/add">ÃÂÃÂÃÂþÃÂñÃÂðÃÂòÃÂøÃÂÃÂÃÂàÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂÃÂ</a><br/> | + | <a href="<%=request.getContextPath()%>/add">Добавить запись</a><br/> |
− | <a href="<%=request.getContextPath()%>/view">ÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂ÷ÃÂðÃÂÿÃÂøÃÂÃÂÃÂø</a><br/> | + | <a href="<%=request.getContextPath()%>/view">Просмотреть записи</a><br/> |
| </body> | | </body> |
| </html> | | </html> |
| </nowiki> | | </nowiki> |
| | | |
− | ÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂðÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂÃÂÃÂúÃÂð ÃÂôÃÂþÃÂñÃÂðÃÂòÃÂûÃÂÃÂÃÂõÃÂàÃÂÿÃÂþÃÂûÃÂõ ÃÂëContent-typeÃÂû ÃÂú HTTP-ÃÂ÷ÃÂðÃÂóÃÂþÃÂûÃÂþÃÂòÃÂúÃÂàÃÂþÃÂÃÂÃÂòÃÂõÃÂÃÂÃÂð. ÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂÃÂÃÂÃÂÃÂüÃÂþÃÂù ÃÂðÃÂýÃÂðÃÂûÃÂþÃÂó ÃÂÃÂÃÂÃÂÃÂÃÂÃÂþÃÂúÃÂø
| + | Первая строчка добавляет поле «Content-type» к HTTP-заголовку ответа. Это прямой аналог строки |
| | | |
| aRequest.setContentType("text/html; charset=utf-8") | | aRequest.setContentType("text/html; charset=utf-8") |
| | | |
− | ÃÂøÃÂ÷ ÃÂëÃÂÃÂÃÂÃÂÃÂðÃÂÃÂÃÂþÃÂóÃÂþÃÂû ÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂð {{oncolor||red|handle}}. ÃÂàÃÂôÃÂðÃÂûÃÂÃÂÃÂÃÂÃÂõ, ÃÂúÃÂÃÂÃÂþÃÂüÃÂõ ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂýÃÂÃÂÃÂÃÂ
ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂþÃÂú {{oncolor||red|<%...%>}}, ÃÂøÃÂôÃÂõÃÂàÃÂþÃÂñÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂù HTML-ÃÂúÃÂþÃÂô. ÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂÃÂ
ÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþ! ÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂþÃÂýÃÂÃÂÃÂÃÂÃÂýÃÂþ! ÃÂâÃÂõÃÂÿÃÂõÃÂÃÂÃÂàÃÂÃÂÃÂðÃÂ÷ÃÂñÃÂõÃÂÃÂÃÂõÃÂüÃÂÃÂÃÂàÃÂàÃÂýÃÂõÃÂÿÃÂþÃÂýÃÂÃÂÃÂÃÂÃÂýÃÂÃÂÃÂü.
| + | из «старого» метода {{oncolor||red|handle}}. А дальше, кроме странных вставок {{oncolor||red|<%...%>}}, идет обычный HTML-код. И это хорошо! Это понятно! Теперь разберемся с непонятным. |
| | | |
− | ÃÂàJSP ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂûÃÂÃÂÃÂÃÂÃÂàÃÂëÃÂøÃÂýÃÂþÃÂÃÂÃÂþÃÂôÃÂýÃÂÃÂÃÂùÃÂû ÃÂôÃÂûÃÂàHTML ÃÂúÃÂþÃÂô, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂù ÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂü ÃÂþÃÂñÃÂÃÂÃÂðÃÂ÷ÃÂþÃÂü ÃÂøÃÂýÃÂÃÂÃÂõÃÂÃÂÃÂÿÃÂÃÂÃÂõÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂõÃÂÃÂÃÂòÃÂõÃÂÃÂÃÂþÃÂü ÃÂø ÃÂüÃÂþÃÂöÃÂõÃÂàÃÂñÃÂÃÂÃÂÃÂÃÂàÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂðÃÂý ÃÂôÃÂûÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø ÃÂÃÂÃÂðÃÂ÷ÃÂûÃÂøÃÂÃÂÃÂýÃÂÃÂÃÂÃÂ
ÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂÃÂ
. ÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂýÃÂõÃÂÃÂÃÂúÃÂþÃÂûÃÂÃÂÃÂúÃÂþ ÃÂÃÂÃÂøÃÂÿÃÂþÃÂò ÃÂÃÂÃÂðÃÂúÃÂøÃÂÃÂ
ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂþÃÂú.
| + | В JSP можно вставлять «инородный» для HTML код, который специальным образом интерпретируется сервером и может быть использован для вставки различных данных. Есть несколько типов таких вставок. |
| | | |
− | * {{oncolor||red|<%@...%>}} âÃÂàÃÂþÃÂñÃÂþÃÂ÷ÃÂýÃÂðÃÂÃÂÃÂðÃÂõÃÂàÃÂÃÂÃÂÿÃÂõÃÂÃÂÃÂøÃÂðÃÂûÃÂÃÂÃÂýÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂÃÂ, ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂðÃÂàÃÂþÃÂÿÃÂÃÂÃÂõÃÂôÃÂõÃÂûÃÂÃÂÃÂõÃÂàÃÂÿÃÂðÃÂÃÂÃÂðÃÂüÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂÃÂ, ÃÂò ÃÂýÃÂðÃÂÃÂÃÂõÃÂü ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂõ âÃÂà{{oncolor||red|ContentType}}. ÃÂÃÂÃÂþÃÂöÃÂýÃÂþ ÃÂ÷ÃÂðÃÂôÃÂðÃÂòÃÂðÃÂÃÂÃÂÃÂ, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, ÃÂÃÂÃÂ÷ÃÂÃÂÃÂú, ÃÂýÃÂð ÃÂúÃÂþÃÂÃÂÃÂþÃÂÃÂÃÂþÃÂü ÃÂýÃÂðÃÂÿÃÂøÃÂÃÂÃÂðÃÂýÃÂð ÃÂÃÂÃÂÃÂÃÂÃÂÃÂðÃÂýÃÂøÃÂÃÂÃÂð. ÃÂÃÂÃÂý ÃÂöÃÂõ ÃÂøÃÂÃÂÃÂÿÃÂþÃÂûÃÂÃÂÃÂ÷ÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂôÃÂûÃÂàÃÂÃÂÃÂõÃÂúÃÂÃÂÃÂøÃÂù {{oncolor||red|import}} (ÃÂÃÂÃÂü. '''view.jsp''' ÃÂýÃÂøÃÂöÃÂõ). | + | * {{oncolor||red|<%@...%>}} – обозначает специальную вставку, которая определяет параметры страницы, в нашем случае – {{oncolor||red|ContentType}}. Можно задавать, например, язык, на котором написана страница. Он же используется для секций {{oncolor||red|import}} (см. '''view.jsp''' ниже). |
− | * {{oncolor||red|<%=...%>}} âÃÂàÃÂÃÂÃÂÃÂÃÂþ ÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂù ÃÂòÃÂÃÂÃÂòÃÂþÃÂô ÃÂÿÃÂõÃÂÃÂÃÂõÃÂüÃÂõÃÂýÃÂýÃÂþÃÂù. ÃÂÃÂÃÂõÃÂùÃÂÃÂÃÂÃÂÃÂòÃÂøÃÂõ ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø {{oncolor||red|<%=ÃÂÃÂÃÂÃÂÃÂþ-ÃÂýÃÂøÃÂñÃÂÃÂÃÂôÃÂÃÂ%>}} ÃÂðÃÂýÃÂðÃÂûÃÂþÃÂóÃÂøÃÂÃÂÃÂýÃÂþ ÃÂòÃÂÃÂÃÂ÷ÃÂþÃÂòÃÂà{{oncolor||red|request.getWriter().write(ÃÂÃÂÃÂÃÂÃÂþ-ÃÂýÃÂøÃÂñÃÂÃÂÃÂôÃÂÃÂ)}}. | + | * {{oncolor||red|<%=...%>}} – это простой вывод переменной. Действие вставки {{oncolor||red|<%=что-нибудь%>}} аналогично вызову {{oncolor||red|request.getWriter().write(что-нибудь)}}. |
− | * {{oncolor||red|<%...%>}} âÃÂàÃÂÃÂÃÂðÃÂüÃÂÃÂÃÂù ÃÂþÃÂñÃÂÃÂÃÂøÃÂù ÃÂòÃÂðÃÂÃÂÃÂøÃÂðÃÂýÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂø, ÃÂòÃÂýÃÂÃÂÃÂÃÂÃÂÃÂÃÂø ÃÂüÃÂþÃÂöÃÂõÃÂàÃÂñÃÂÃÂÃÂÃÂÃÂàÃÂûÃÂÃÂÃÂñÃÂþÃÂù ÃÂúÃÂþÃÂô. ÃÂàÃÂýÃÂðÃÂÃÂÃÂõÃÂü ÃÂÃÂÃÂûÃÂÃÂÃÂÃÂÃÂðÃÂõ, ÃÂýÃÂð Java. | + | * {{oncolor||red|<%...%>}} – самый общий вариант вставки, внутри может быть любой код. В нашем случае, на Java. |
| | | |
− | '''index.jsp''' âÃÂàÃÂÿÃÂÃÂÃÂþÃÂÃÂÃÂÃÂÃÂþÃÂù ÃÂÃÂÃÂðÃÂùÃÂû, ÃÂÿÃÂþÃÂÃÂÃÂüÃÂþÃÂÃÂÃÂÃÂÃÂøÃÂü ÃÂýÃÂð ÃÂýÃÂõÃÂÃÂÃÂÃÂÃÂþ ÃÂñÃÂþÃÂûÃÂõÃÂõ ÃÂÃÂÃÂûÃÂþÃÂöÃÂýÃÂþÃÂõ. ÃÂÃÂÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, '''view.jsp''' '''(ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 6)'''. | + | '''index.jsp''' – простой файл, посмотрим на нечто более сложное. Например, '''view.jsp''' '''(Листинг 6)'''. |
| | | |
− | '''{{oncolor||red|ÃÂÃÂÃÂøÃÂÃÂÃÂÃÂÃÂøÃÂýÃÂó 6. view.jsp}}''' | + | '''{{oncolor||red|Листинг 6. view.jsp}}''' |
| | | |
| <nowiki> | | <nowiki> |
Строка 311: |
Строка 183: |
| <%@ page import="java.util.*" %> | | <%@ page import="java.util.*" %> |
| <html> | | <html> |
− | <head><title>ÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂðÃÂàÃÂúÃÂýÃÂøÃÂóÃÂð</title></head> | + | <head><title>Адресная книга</title></head> |
− | <body><h1>ÃÂÃÂÃÂôÃÂÃÂÃÂõÃÂÃÂÃÂýÃÂðÃÂàÃÂúÃÂýÃÂøÃÂóÃÂð, ÃÂÃÂÃÂÿÃÂøÃÂÃÂÃÂþÃÂú ÃÂúÃÂþÃÂýÃÂÃÂÃÂðÃÂúÃÂÃÂÃÂþÃÂò</h1> | + | <body><h1>Адресная книга, список контактов</h1> |
− | <a href="<%=request.getContextPath()%>">ÃÂÃÂÃÂð ÃÂóÃÂûÃÂðÃÂòÃÂýÃÂÃÂÃÂÃÂ</a><br/> | + | <a href="<%=request.getContextPath()%>">На главную</a><br/> |
| <span style="color: green;"><%=request.getAttribute("message")%></span> | | <span style="color: green;"><%=request.getAttribute("message")%></span> |
| <table border="1"> | | <table border="1"> |
− | <tr><td width="100">ÃÂÃÂÃÂüÃÂÃÂ</td><td width="100">ÃÂÃÂÃÂþÃÂüÃÂõÃÂÃÂ</td><td width="100">ÃÂÃÂÃÂþÃÂüÃÂüÃÂõÃÂýÃÂÃÂÃÂðÃÂÃÂÃÂøÃÂù</td><td> - </td></tr> | + | <tr><td width="100">Имя</td><td width="100">Номер</td><td width="100">Комментарий</td><td> - </td></tr> |
| <% Map numbers = (Map) request.getAttribute("numbers"); | | <% Map numbers = (Map) request.getAttribute("numbers"); |
| Map comments = (Map) request.getAttribute("comments"); | | Map comments = (Map) request.getAttribute("comments"); |
Строка 328: |
Строка 200: |
| <td class="comment"><%=comment%></td> | | <td class="comment"><%=comment%></td> |
| <td class="name"> | | <td class="name"> |
− | <a href="<%=request.getContextPath()%>/remove?number=<%=number%>">ÃÂãÃÂôÃÂðÃÂûÃÂøÃÂÃÂÃÂÃÂ</a> | + | <a href="<%=request.getContextPath()%>/remove?number=<%=number%>">Удалить</a> |
− | <a href="<%=request.getContextPath()%>/edit?number=<%=number%>">ÃÂàÃÂõÃÂôÃÂðÃÂúÃÂÃÂÃÂøÃÂÃÂÃÂþÃÂòÃÂðÃÂÃÂÃÂÃÂ</a> | + | <a href="<%=request.getContextPath()%>/edit?number=<%=number%>">Редактировать</a> |
| </td> | | </td> |
| </tr> | | </tr> |
Строка 338: |
Строка 210: |
| </nowiki> | | </nowiki> |
| | | |
− | ÃÂÃÂÃÂðÃÂú ÃÂüÃÂþÃÂöÃÂýÃÂþ ÃÂ÷ÃÂðÃÂüÃÂõÃÂÃÂÃÂøÃÂÃÂÃÂÃÂ, ÃÂ÷ÃÂôÃÂõÃÂÃÂÃÂàÃÂõÃÂÃÂÃÂÃÂÃÂàÃÂø ÃÂøÃÂüÃÂÿÃÂþÃÂÃÂÃÂà(ÃÂþ ÃÂÃÂÃÂõÃÂü ÃÂàÃÂóÃÂþÃÂòÃÂþÃÂÃÂÃÂøÃÂû ÃÂÃÂÃÂÃÂÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂÃÂÃÂõ), ÃÂø ÃÂòÃÂÃÂÃÂÃÂÃÂðÃÂòÃÂúÃÂð Java-ÃÂúÃÂþÃÂôÃÂð. ÃÂÃÂÃÂðÃÂýÃÂýÃÂÃÂÃÂù ÃÂÃÂÃÂðÃÂùÃÂû ÃÂþÃÂÃÂÃÂûÃÂøÃÂÃÂÃÂýÃÂþ ÃÂÿÃÂþÃÂúÃÂðÃÂ÷ÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂ, ÃÂúÃÂðÃÂú, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂà(ÃÂýÃÂõ ÃÂÃÂÃÂðÃÂüÃÂÃÂÃÂù ÃÂûÃÂÃÂÃÂÃÂÃÂÃÂÃÂøÃÂù ÃÂÃÂÃÂÿÃÂþÃÂÃÂÃÂþÃÂñ, ÃÂúÃÂþÃÂýÃÂõÃÂÃÂÃÂýÃÂþ), ÃÂÃÂÃÂôÃÂõÃÂûÃÂðÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂòÃÂþÃÂô ÃÂò ÃÂÃÂÃÂøÃÂúÃÂûÃÂõ.
| + | Как можно заметить, здесь есть и импорт (о чем я говорил чуть выше), и вставка Java-кода. Данный файл отлично показывает, как, например (не самый лучший способ, конечно), сделать вывод в цикле. |
| | | |
− | === ÃÂàÃÂúÃÂðÃÂú ÃÂÃÂÃÂÃÂÃÂþ ÃÂþÃÂñÃÂÃÂÃÂðÃÂñÃÂðÃÂÃÂÃÂÃÂÃÂòÃÂðÃÂõÃÂÃÂÃÂÃÂÃÂÃÂ-ÃÂÃÂÃÂþ? === | + | === А как это обрабатывается-то? === |
| | | |
− | ÃÂÃÂÃÂÃÂÃÂÃÂÃÂõÃÂÃÂÃÂÃÂÃÂòÃÂõÃÂýÃÂýÃÂþ, ÃÂø ÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂà{{oncolor||red|handle}}... ÃÂÿÃÂþÃÂÃÂÃÂûÃÂõ ÃÂÃÂÃÂðÃÂúÃÂþÃÂóÃÂþ ÃÂøÃÂ÷ÃÂüÃÂõÃÂýÃÂõÃÂýÃÂøÃÂàÃÂÃÂÃÂÃÂÃÂðÃÂûÃÂø ÃÂôÃÂÃÂÃÂÃÂÃÂóÃÂøÃÂüÃÂø. ÃÂÃÂÃÂõÃÂÃÂÃÂàÃÂòÃÂÃÂÃÂòÃÂþÃÂô HTML-ÃÂúÃÂþÃÂôÃÂð ÃÂøÃÂÃÂÃÂÃÂÃÂõÃÂ÷, ÃÂþÃÂÃÂÃÂÃÂÃÂðÃÂûÃÂðÃÂÃÂÃÂàÃÂÿÃÂþÃÂôÃÂóÃÂþÃÂÃÂÃÂþÃÂòÃÂúÃÂð ÃÂôÃÂðÃÂýÃÂýÃÂÃÂÃÂÃÂ
, ÃÂø ÃÂòÃÂÃÂÃÂ÷ÃÂþÃÂò ÃÂüÃÂõÃÂÃÂÃÂþÃÂôÃÂð {{oncolor||red|outputPage}}. ÃÂÃÂÃÂþÃÂÃÂ, ÃÂýÃÂðÃÂÿÃÂÃÂÃÂøÃÂüÃÂõÃÂÃÂ, ÃÂüÃÂõÃÂÃÂÃÂþÃÂô {{oncolor||red|handleEdit(...)
| + | Естественно, и методы {{oncolor||red|handle}}... после такого изменения стали другими. Весь вывод HTML-кода исчез, осталась подготовка данных, и вызов метода {{oncolor||red|outputPage}}. Вот, например, метод {{oncolor||red|handleEdit(...)}} '''(Листинг 7)''': |
| + | |
| + | '''{{oncolor||red|Листинг 7. Метод handleEdit, обработка редактирования записи}}''' |
| + | |
| + | if (aRequest.getParameter("number") == null) { |
| + | _addressBook.removeContactByNumber(aRequest.getParameter("number")); |
| + | aRequest.setAttribute("message", "Не определено, что редактировать"); |
| + | handleView(aRequest, aResponse); |
| + | } else if (aRequest.getParameter("edited") != null) { |
| + | _addressBook.editContact(aRequest.getParameter("edited"), |
| + | aRequest.getParameter("name"), |
| + | aRequest.getParameter("number"), |
| + | aRequest.getParameter("comment")); |
| + | aRequest.setAttribute("message", "Контакт \"" + |
| + | aRequest.getParameter("name") + "\" отредактирован"); |
| + | handleView(aRequest, aResponse); |
| + | } else { |
| + | Contact contact = _addressBook.getContactByNumber(aRequest.getParameter("number")); |
| + | aRequest.setAttribute("action", "edit"); |
| + | aRequest.setAttribute("edit.name", contact.getName()); |
| + | aRequest.setAttribute("edit.number", contact.getNumber()); |
| + | aRequest.setAttribute("edit.comment", contact.getComment()); |
| + | outputPage("edit.jsp", aRequest, aResponse); |
| + | } |
| + | |
| + | Остальные методы меняются аналогично – их [[Media:Archive.tar.bz2|полный код]] можно найти на диске. |
| + | |
| + | === И как все это вставить в Tomcat? === |
| + | |
| + | Теперь у нас есть: |
| + | |
| + | * Классы {{oncolor||red|Contact}}, {{oncolor||red|AddressBook}}, {{oncolor||red|AddressBookServlet}}. |
| + | * Файл '''web.xml'''. |
| + | * Каталог '''jsps''' с файлами '''edit.jsp''', '''index.jsp''', '''view.jsp'''. |
| + | |
| + | Для того, чтобы Tomcat понял, что ему дали полноценное приложение, нужно выполнить всего три шага: |
| + | |
| + | * Скомпилировать все, что компилируется, и создать правильную иерархию файлов и каталогов, которая представлена '''на рис. 2'''. |
| + | * Создать специальный файл-описание архива («манифест»). |
| + | * Заархивировать созданную структуру при помоци утилиты ''jar'', входящей в комплект JDK. |
| + | |
| + | Скомпилируем файлы. Тут ничего нового не появилось, разве что изменилась сама команда (обратите внимание на ключ {{oncolor||red|-cp}}, задающий библиотеки {{oncolor||red|classpath}}): |
| + | |
| + | cd ~/Programming/AddressBook/src |
| + | javac -encoding utf-8 -cp ~/bin/tomcat/common/lib/servlet-api.jar -d ../build/WEB-INF/classes/ *.java |
| + | |
| + | Переходим к созданию манифеста. Он должен называться '''MANIFEST.MF''' и располагаться в каталоге '''META-INF'''. К счастью, за этим следит сам '''jar''', поэтому нам достаточно просто сохранить где-то файл и указать его '''jar''''у как манифест. В нашем случае он предельно прост и не содержит интересной информации, но в принципе здесь могут располагаться всякие настройки для запуска вашего приложения. Вот его текст '''(Листинг 8)''': |
| + | |
| + | '''{{oncolor||red|Листинг 8. Манифест для war-файла}}''' |
| + | |
| + | Manifest-Version: 1.0 |
| + | Created-By: Hands of programmer |
| + | |
| + | Теперь соберем все в {{oncolor||red|war}} (Web Archive). Манифест для приведенной ниже команды должен быть назван '''MANIFEST.MF''' и располагаться рядом с каталогом '''build'''. Результирующий архив называется '''address.war''' и располагается там же, рядом с манифестом. |
| + | |
| + | jar -cfm ../address.war ../MANIFEST.MF * |
| + | |
| + | А сейчас наступает самый волшебный момент! Возьмите '''address.war''' и положите его в каталог webapps Tomcat'а. Подождите несколько секунд. Увидев новое приложение, Tomcat развернет его (появляется каталог с именем вашего war'а) и подключит к системе. После этого можно просто зайти в браузер и набрать: |
| + | |
| + | http://localhost:8080/address/ |
| + | |
| + | Вуаля, получите ваше приложение. |
| + | |
| + | === И что теперь? === |
| + | |
| + | А теперь можно менять JSP-файлы «на лету» в распакованном каталоге '''webapps/address/jsps'''. При этом будет автоматически происходить несколько действий, в результате которых файлы подхватятся приложением. Так меняется дизайн без перекомпиляции, без рестарта серверного приложения, как это у нас было до сих пор. |
| + | |
| + | Я считаю, что на данном этапе приложение «Адресная книга» работает хорошо. Оно выполняет свои несложные функции и умеет изменяться «на лету» по запросу пользователя. Оно простое – и это чуть ли не самое главное. Но есть еще достаточно аспектов, о которых стоит знать при разработке более сложных интернет-приложений. Мы рассмотрим их в следующих статьях данной серии. [http://www.linuxformat.ru LXF] |
В прошлый раз мы создали простейшую электронную записную книжку. Она работает в браузере и показывает несколько простых страничек, на которых можно просмотреть список контактов, добавить новый контакт, удалить его или отредактировать. А сейчас давайте попробуем сделать все это более правильно.
Действительно, почему? Работает, и хорошо. Достаточно быстро и не слишком сложно. Но вдруг захочется поменять дизайн страничек? А захочется через десять минут работы. Или после того, как страничку посмотрит начальник.
Чтобы сделать это, можно изменить код проекта, потом перекомпилировать его, остановить сервер (А? Кто-то работал? Извините...), установить новый код и повторно запустить сервер. Метод, мягко говоря, неудобный. А можно изменить сам проект так, чтобы выполнение таких пожеланий не требовало столь сложных действий. Второй путь зовется рефакторингом и гораздо более корректен. Если разделить дизайн и логику работы приложения (бизнес-логику), то в дальнейшем можно будет, например, разделить и работу по их поддержанию. Хороший программист не всегда создает хорошие пользовательские интерфейсы, поэтому данный аспект тоже важен.
Ну, вкратце уже понятно. Нужно вынести в отдельные файлы ту часть, которая меняется часто (в нашем случае, это интерфейс) и как-то подключить эти файлы из нашей программы. Плюс, желательно сделать это так, чтобы формат файлов «дизайна» был стандартным, чтобы каждый раз не переучиваться.
Решений для данной проблемы существует множество. Рассмотрим самые распространенные:
Мы же в рамках данной статьи рассмотрим «средненькое» решение – Java Server Pages. В основном – из-за его стандартности, хотя для данного конкретного случая можно выбрать какой-нибудь шаблонный движок, например, тот же Velocity (http://velocity.apache.org).
Поняв, что нужно отделить логику от дизайна, давайте подумаем, каким образом это можно сделать. Предлагаю остановиться на следующей схеме - (Рис. 1).
Сервлет выдает данные, абсолютно не заботясь о том, как они будут отображаться. Но выдает он их не в «сыром» виде, а в полностью обработанном, готовом для отображения на экране (например, если нужно полное имя человека, а в данных – его ФИО по отдельности, то сервлет должен преобразовать второе в первое перед передачей в JSP).
Возникает вопрос: как же передаются данные от сервлета в JSP? Через уже известный нам объект request. К нему «прикручен» специальный ассоциативный массив «String – Object», который называется атрибутами и который живет, пока жив запрос. К нему имеет доступ и сервлет, и JSP-страница, поэтому его можно (и это правильно) использовать для передачи данных.
Но сначала нужно переписать наш сервлет «по-взрослому». Встроенный сервер – это замечательно для кустарных проектов, но обычно контейнер сервлетов уже стоит, и подключаться следует к нему.
Мы будем использовать Tomcat 5.5. Это классический, можно даже сказать, стандартный открытый сервлет-контейнер. Для установки Tomcat достаточно просто скачать его с http://tomcat.apache.org (или взять с нашего DVD), распаковать и запустить bin/startup.sh (или соответсвующий .bat). Tomcat работает с файлами специального типа Web Archive (WAR). Обнаружив такой файл в определенном каталоге, Tomcat разворачивает его и запускает содержащееся в нем приложение. Чтобы перезапустить или обновить программу, достаточно просто заменить один WAR-файл другим.
Предыдущий код не готов для работы с Tomcat, поэтому его нужно немного переписать. Вот что будет сделано:
.
Сделайте указанные изменения самостоятельно или возьмите гото-вый код с DVD. Все в порядке? Тогда движемся дальше.
В этом методе мы берем нужный JSP-файл и говорим сервлет-контейнеру: «Обработай, пожалуйста». Остальное берет на себя контейнер. Он ищет JSP-файл, загружает его, компилирует (если это нужно), выполняет получившийся сервлет, а результат записывает в aResponse.
Для начала создадим каталог, в котором будем собирать наше интернет-приложение. Назвать можно как угодно, например, WebApp (Web Application). В нем создадим специальный каталог WEB-INF, где должен находиться дескриптор web.xml, и каталог jsps, в котором будут храниться JSP-странички.
Создадим три JSP-файла: для индексной странички, для редактирования (или добавления) записей и для просмотра, и назовем их, соответственно, index.jsp, edit.jsp, view.jsp. Не забудьте – их нужно сохранить в в WebApp/jsps.
Сам JSP достаточно прост. Рассмотрим index.jsp (Листинг 5):
Первая строчка добавляет поле «Content-type» к HTTP-заголовку ответа. Это прямой аналог строки
В JSP можно вставлять «инородный» для HTML код, который специальным образом интерпретируется сервером и может быть использован для вставки различных данных. Есть несколько типов таких вставок.
Как можно заметить, здесь есть и импорт (о чем я говорил чуть выше), и вставка Java-кода. Данный файл отлично показывает, как, например (не самый лучший способ, конечно), сделать вывод в цикле.
Для того, чтобы Tomcat понял, что ему дали полноценное приложение, нужно выполнить всего три шага:
Скомпилируем файлы. Тут ничего нового не появилось, разве что изменилась сама команда (обратите внимание на ключ -cp, задающий библиотеки classpath):
Переходим к созданию манифеста. Он должен называться MANIFEST.MF и располагаться в каталоге META-INF. К счастью, за этим следит сам jar, поэтому нам достаточно просто сохранить где-то файл и указать его jar'у как манифест. В нашем случае он предельно прост и не содержит интересной информации, но в принципе здесь могут располагаться всякие настройки для запуска вашего приложения. Вот его текст (Листинг 8):
Вуаля, получите ваше приложение.
Я считаю, что на данном этапе приложение «Адресная книга» работает хорошо. Оно выполняет свои несложные функции и умеет изменяться «на лету» по запросу пользователя. Оно простое – и это чуть ли не самое главное. Но есть еще достаточно аспектов, о которых стоит знать при разработке более сложных интернет-приложений. Мы рассмотрим их в следующих статьях данной серии. LXF