|
м |
(2 промежуточные версии не показаны) |
Строка 1: |
Строка 1: |
- | [http://s1.shard.jp/galeach/new98.html asian menus
| + | {{Цикл/Java EE}} |
- | ] [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
| + | == {{oncolor||red|Телефонная книга}}: переход на JSP == |
- | ] [http://s1.shard.jp/losaul/hsbc-asset-management.html book designers australia
| + | ''{{oncolor||red|ЧАСТЬ 2}} Встречают по одежке – и Большой Босс не был сильно впечатлен созданной нами в прошлый раз адресной книгой. '''Александр Бабаев''' исправляет замеченные недочеты.'' |
- | ] [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; |
Строка 151: |
Строка 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) |
Строка 175: |
Строка 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"?> |
Строка 206: |
Строка 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 |
Строка 222: |
Строка 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> |
Строка 239: |
Строка 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> |
Строка 268: |
Строка 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"); |
Строка 285: |
Строка 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> |
Строка 295: |
Строка 210: |
| </nowiki> | | </nowiki> |
| | | |
- | ÃÂðú üþöýþ ÷ðüõÃÂøÃÂÃÂ, ÷ôõÃÂàõÃÂÃÂàø øüÿþÃÂà(þ ÃÂõü àóþòþÃÂøû ÃÂÃÂÃÂàòÃÂÃÂõ), ø òÃÂÃÂðòúð Java-úþôð. ÃÂðýýÃÂù ÃÂðùû þÃÂûøÃÂýþ ÿþúð÷ÃÂòðõÃÂ, úðú, ýðÿÃÂøüõà(ýõ ÃÂðüÃÂù ûÃÂÃÂÃÂøù ÃÂÿþÃÂþñ, úþýõÃÂýþ), ÃÂôõûðÃÂàòÃÂòþô ò ÃÂøúûõ.
| + | Как можно заметить, здесь есть и импорт (о чем я говорил чуть выше), и вставка Java-кода. Данный файл отлично показывает, как, например (не самый лучший способ, конечно), сделать вывод в цикле. |
| | | |
- | === àúðú ÃÂÃÂþ þñÃÂðñðÃÂÃÂòðõÃÂÃÂÃÂ-ÃÂþ? === | + | === А как это обрабатывается-то? === |
| | | |
- | ÃÂÃÂÃÂõÃÂÃÂòõýýþ, ø üõÃÂþôà{{oncolor||red|handle}}... ÿþÃÂûõ ÃÂðúþóþ ø÷üõýõýøàÃÂÃÂðûø ôÃÂÃÂóøüø. ÃÂõÃÂàòÃÂòþô HTML-úþôð øÃÂÃÂõ÷, þÃÂÃÂðûðÃÂàÿþôóþÃÂþòúð ôðýýÃÂÃÂ
, ø òÃÂ÷þò üõÃÂþôð {{oncolor||red|outputPage}}. ÃÂþÃÂ, ýðÿÃÂøüõÃÂ, üõÃÂþô {{oncolor||red|handleEdit(...)}} '''(ÃÂøÃÂÃÂøýó 7)''':
| + | Естественно, и методы {{oncolor||red|handle}}... после такого изменения стали другими. Весь вывод HTML-кода исчез, осталась подготовка данных, и вызов метода {{oncolor||red|outputPage}}. Вот, например, метод {{oncolor||red|handleEdit(...)}} '''(Листинг 7)''': |
| | | |
- | '''{{oncolor||red|ÃÂøÃÂÃÂøýó 7. ÃÂõÃÂþô handleEdit, þñÃÂðñþÃÂúð ÃÂõôðúÃÂøÃÂþòðýøà÷ðÿøÃÂø}}''' | + | '''{{oncolor||red|Листинг 7. Метод handleEdit, обработка редактирования записи}}''' |
| | | |
| if (aRequest.getParameter("number") == null) { | | if (aRequest.getParameter("number") == null) { |
| _addressBook.removeContactByNumber(aRequest.getParameter("number")); | | _addressBook.removeContactByNumber(aRequest.getParameter("number")); |
- | aRequest.setAttribute("message", "ÃÂõ þÿÃÂõôõûõýþ, ÃÂÃÂþ ÃÂõôðúÃÂøÃÂþòðÃÂÃÂ"); | + | aRequest.setAttribute("message", "Не определено, что редактировать"); |
| handleView(aRequest, aResponse); | | handleView(aRequest, aResponse); |
| } else if (aRequest.getParameter("edited") != null) { | | } else if (aRequest.getParameter("edited") != null) { |
Строка 312: |
Строка 227: |
| aRequest.getParameter("number"), | | aRequest.getParameter("number"), |
| aRequest.getParameter("comment")); | | aRequest.getParameter("comment")); |
- | aRequest.setAttribute("message", "ÃÂþýÃÂðúà\"" + | + | aRequest.setAttribute("message", "Контакт \"" + |
- | aRequest.getParameter("name") + "\" þÃÂÃÂõôðúÃÂøÃÂþòðý"); | + | aRequest.getParameter("name") + "\" отредактирован"); |
| handleView(aRequest, aResponse); | | handleView(aRequest, aResponse); |
| } else { | | } else { |
Строка 324: |
Строка 239: |
| } | | } |
| | | |
- | ÃÂÃÂÃÂðûÃÂýÃÂõ üõÃÂþôàüõýÃÂÃÂÃÂÃÂàðýðûþóøÃÂýþ â øÃÂ
[[Media:Archive.tar.bz2âÂÂ|ÿþûýÃÂù úþô]] üþöýþ ýðùÃÂø ýð ôøÃÂúõ.
| + | Остальные методы меняются аналогично – их [[Media:Archive.tar.bz2|полный код]] можно найти на диске. |
| | | |
- | === àúðú òÃÂõ ÃÂÃÂþ òÃÂÃÂðòøÃÂàò Tomcat? === | + | === И как все это вставить в Tomcat? === |
| | | |
- | âõÿõÃÂààýðàõÃÂÃÂÃÂ:
| + | Теперь у нас есть: |
| | | |
- | * ÃÂûðÃÂÃÂà{{oncolor||red|Contact}}, {{oncolor||red|AddressBook}}, {{oncolor||red|AddressBookServlet}}. | + | * Классы {{oncolor||red|Contact}}, {{oncolor||red|AddressBook}}, {{oncolor||red|AddressBookServlet}}. |
- | * äðùû '''web.xml'''. | + | * Файл '''web.xml'''. |
- | * ÃÂðÃÂðûþó '''jsps''' àÃÂðùûðüø '''edit.jsp''', '''index.jsp''', '''view.jsp'''. | + | * Каталог '''jsps''' с файлами '''edit.jsp''', '''index.jsp''', '''view.jsp'''. |
| | | |
- | ÃÂûàÃÂþóþ, ÃÂÃÂþñàTomcat ÿþýÃÂû, ÃÂÃÂþ õüàôðûø ÿþûýþÃÂõýýþõ ÿÃÂøûþöõýøõ, ýÃÂöýþ òÃÂÿþûýøÃÂàòÃÂõóþ ÃÂÃÂø ÃÂðóð:
| + | Для того, чтобы Tomcat понял, что ему дали полноценное приложение, нужно выполнить всего три шага: |
| | | |
- | * áúþüÿøûøÃÂþòðÃÂàòÃÂõ, ÃÂÃÂþ úþüÿøûøÃÂÃÂõÃÂÃÂÃÂ, ø ÃÂþ÷ôðÃÂàÿÃÂðòøûÃÂýÃÂàøõÃÂðÃÂÃÂ
øàÃÂðùûþò ø úðÃÂðûþóþò, úþÃÂþÃÂðàÿÃÂõôÃÂÃÂðòûõýð '''ýð ÃÂøÃÂ. 2'''. | + | * Скомпилировать все, что компилируется, и создать правильную иерархию файлов и каталогов, которая представлена '''на рис. 2'''. |
- | * áþ÷ôðÃÂàÃÂÿõÃÂøðûÃÂýÃÂù ÃÂðùû-þÿøÃÂðýøõ ðÃÂÃÂ
øòð (ëüðýøÃÂõÃÂÃÂû). | + | * Создать специальный файл-описание архива («манифест»). |
- | * ÃÂððÃÂÃÂ
øòøÃÂþòðÃÂàÃÂþ÷ôðýýÃÂàÃÂÃÂÃÂÃÂúÃÂÃÂÃÂàÿÃÂø ÿþüþÃÂø ÃÂÃÂøûøÃÂà''jar'', òÃÂ
þôÃÂÃÂõù ò úþüÿûõúàJDK. | + | * Заархивировать созданную структуру при помоци утилиты ''jar'', входящей в комплект JDK. |
| | | |
- | áúþüÿøûøÃÂÃÂõü ÃÂðùûÃÂ. âÃÂàýøÃÂõóþ ýþòþóþ ýõ ÿþÃÂòøûþÃÂÃÂ, ÃÂð÷òõ ÃÂÃÂþ ø÷üõýøûðÃÂàÃÂðüð úþüðýôð (þñÃÂðÃÂøÃÂõ òýøüðýøõ ýð úûÃÂà{{oncolor||red|-cp}}, ÷ðôðÃÂÃÂøù ñøñûøþÃÂõúø {{oncolor||red|classpath}}):
| + | Скомпилируем файлы. Тут ничего нового не появилось, разве что изменилась сама команда (обратите внимание на ключ {{oncolor||red|-cp}}, задающий библиотеки {{oncolor||red|classpath}}): |
| | | |
| cd ~/Programming/AddressBook/src | | cd ~/Programming/AddressBook/src |
| javac -encoding utf-8 -cp ~/bin/tomcat/common/lib/servlet-api.jar -d ../build/WEB-INF/classes/ *.java | | 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)''':
| + | Переходим к созданию манифеста. Он должен называться '''MANIFEST.MF''' и располагаться в каталоге '''META-INF'''. К счастью, за этим следит сам '''jar''', поэтому нам достаточно просто сохранить где-то файл и указать его '''jar''''у как манифест. В нашем случае он предельно прост и не содержит интересной информации, но в принципе здесь могут располагаться всякие настройки для запуска вашего приложения. Вот его текст '''(Листинг 8)''': |
| | | |
- | '''{{oncolor||red|ÃÂøÃÂÃÂøýó 8. ÃÂðýøÃÂõÃÂàôûàwar-ÃÂðùûð}}''' | + | '''{{oncolor||red|Листинг 8. Манифест для war-файла}}''' |
| | | |
| Manifest-Version: 1.0 | | Manifest-Version: 1.0 |
| Created-By: Hands of programmer | | Created-By: Hands of programmer |
| | | |
- | âõÿõÃÂàÃÂþñõÃÂõü òÃÂõ ò {{oncolor||red|war}} (Web Archive). ÃÂðýøÃÂõÃÂàôûàÿÃÂøòõôõýýþù ýøöõ úþüðýôàôþûöõý ñÃÂÃÂàýð÷òðý '''MANIFEST.MF''' ø ÃÂðÃÂÿþûðóðÃÂÃÂÃÂàÃÂÃÂôþü àúðÃÂðûþóþü '''build'''. àõ÷ÃÂûÃÂÃÂøÃÂÃÂÃÂÃÂøù ðÃÂÃÂ
øò ýð÷ÃÂòðõÃÂÃÂà'''address.war''' ø ÃÂðÃÂÿþûðóðõÃÂÃÂàÃÂðü öõ, ÃÂÃÂôþü àüðýøÃÂõÃÂÃÂþü.
| + | Теперь соберем все в {{oncolor||red|war}} (Web Archive). Манифест для приведенной ниже команды должен быть назван '''MANIFEST.MF''' и располагаться рядом с каталогом '''build'''. Результирующий архив называется '''address.war''' и располагается там же, рядом с манифестом. |
| | | |
| jar -cfm ../address.war ../MANIFEST.MF * | | jar -cfm ../address.war ../MANIFEST.MF * |
| | | |
- | àÃÂõùÃÂðàýðÃÂÃÂÃÂÿðõàÃÂðüÃÂù òþûÃÂõñýÃÂù üþüõýÃÂ! ÃÂþ÷ÃÂüøÃÂõ '''address.war''' ø ÿþûþöøÃÂõ õóþ ò úðÃÂðûþó webapps Tomcat'ð. ÃÂþôþöôøÃÂõ ýõÃÂúþûÃÂúþ ÃÂõúÃÂýô. ãòøôõò ýþòþõ ÿÃÂøûþöõýøõ, Tomcat ÃÂð÷òõÃÂýõàõóþ (ÿþÃÂòûÃÂõÃÂÃÂàúðÃÂðûþó àøüõýõü òðÃÂõóþ war'ð) ø ÿþôúûÃÂÃÂøàú ÃÂøÃÂÃÂõüõ. ÃÂþÃÂûõ ÃÂÃÂþóþ üþöýþ ÿÃÂþÃÂÃÂþ ÷ðùÃÂø ò ñÃÂðÃÂ÷õàø ýðñÃÂðÃÂÃÂ:
| + | А сейчас наступает самый волшебный момент! Возьмите '''address.war''' и положите его в каталог webapps Tomcat'а. Подождите несколько секунд. Увидев новое приложение, Tomcat развернет его (появляется каталог с именем вашего war'а) и подключит к системе. После этого можно просто зайти в браузер и набрать: |
| | | |
| http://localhost:8080/address/ | | http://localhost:8080/address/ |
| | | |
- | ÃÂÃÂðûÃÂ, ÿþûÃÂÃÂøÃÂõ òðÃÂõ ÿÃÂøûþöõýøõ.
| + | Вуаля, получите ваше приложение. |
| | | |
- | === àÃÂÃÂþ ÃÂõÿõÃÂÃÂ? === | + | === И что теперь? === |
| | | |
- | àÃÂõÿõÃÂàüþöýþ üõýÃÂÃÂàJSP-ÃÂðùûàëýð ûõÃÂÃÂû ò ÃÂðÃÂÿðúþòðýýþü úðÃÂðûþóõ '''webapps/address/jsps'''. ÃÂÃÂø ÃÂÃÂþü ñÃÂôõàðòÃÂþüðÃÂøÃÂõÃÂúø ÿÃÂþøÃÂÃÂ
þôøÃÂàýõÃÂúþûÃÂúþ ôõùÃÂÃÂòøù, ò ÃÂõ÷ÃÂûÃÂÃÂðÃÂõ úþÃÂþÃÂÃÂÃÂ
ÃÂðùûàÿþôÃÂ
òðÃÂÃÂÃÂÃÂàÿÃÂøûþöõýøõü. âðú üõýÃÂõÃÂÃÂàôø÷ðùý ñõ÷ ÿõÃÂõúþüÿøûÃÂÃÂøø, ñõ÷ ÃÂõÃÂÃÂðÃÂÃÂð ÃÂõÃÂòõÃÂýþóþ ÿÃÂøûþöõýøÃÂ, úðú ÃÂÃÂþ àýðàñÃÂûþ ôþ ÃÂøÃÂ
ÿþÃÂ.
| + | А теперь можно менять JSP-файлы «на лету» в распакованном каталоге '''webapps/address/jsps'''. При этом будет автоматически происходить несколько действий, в результате которых файлы подхватятся приложением. Так меняется дизайн без перекомпиляции, без рестарта серверного приложения, как это у нас было до сих пор. |
| | | |
- | ï ÃÂÃÂøÃÂðÃÂ, ÃÂÃÂþ ýð ôðýýþü ÃÂÃÂðÿõ ÿÃÂøûþöõýøõ ëÃÂôÃÂõÃÂýðàúýøóðû ÃÂðñþÃÂðõàÃÂ
þÃÂþÃÂþ. ÃÂýþ òÃÂÿþûýÃÂõàÃÂòþø ýõÃÂûþöýÃÂõ ÃÂÃÂýúÃÂøø ø ÃÂüõõàø÷üõýÃÂÃÂÃÂÃÂàëýð ûõÃÂÃÂû ÿþ ÷ðÿÃÂþÃÂàÿþûÃÂ÷þòðÃÂõûÃÂ. ÃÂýþ ÿÃÂþÃÂÃÂþõ â ø ÃÂÃÂþ ÃÂÃÂÃÂàûø ýõ ÃÂðüþõ óûðòýþõ. ÃÂþ õÃÂÃÂàõÃÂõ ôþÃÂÃÂðÃÂþÃÂýþ ðÃÂÿõúÃÂþò, þ úþÃÂþÃÂÃÂÃÂ
ÃÂÃÂþøà÷ýðÃÂàÿÃÂø ÃÂð÷ÃÂðñþÃÂúõ ñþûõõ ÃÂûþöýÃÂÃÂ
øýÃÂõÃÂýõÃÂ-ÿÃÂøûþöõýøù. ÃÂàÃÂðÃÂÃÂüþÃÂÃÂøü øÃÂ
ò ÃÂûõôÃÂÃÂÃÂøÃÂ
ÃÂÃÂðÃÂÃÂÃÂÃÂ
ôðýýþù ÃÂõÃÂøø. [http://www.linuxformat.ru LXF]
| + | Я считаю, что на данном этапе приложение «Адресная книга» работает хорошо. Оно выполняет свои несложные функции и умеет изменяться «на лету» по запросу пользователя. Оно простое – и это чуть ли не самое главное. Но есть еще достаточно аспектов, о которых стоит знать при разработке более сложных интернет-приложений. Мы рассмотрим их в следующих статьях данной серии. [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