LXF90:JavaEE
Dionysius (обсуждение | вклад) (→А как это обрабатывается-то?) |
|||
Строка 1: | Строка 1: | ||
− | {{ | + | http://www.textervardellido.com |
− | == {{oncolor||red| | + | {{Цикл/Java EE}} |
− | ''{{oncolor||red| | + | == {{oncolor||red|ТелеÑÐ¾Ð½Ð½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°}}: пеÑеÑ
од на JSP == |
+ | ''{{oncolor||red|ЧÐСТЬ 2}} ÐÑÑÑеÑаÑÑ Ð¿Ð¾ одежке â и ÐолÑÑой ÐоÑÑ Ð½Ðµ бÑл ÑилÑно впеÑаÑлен Ñозданной нами в пÑоÑлÑй Ñаз адÑеÑной книгой. '''ÐлекÑÐ°Ð½Ð´Ñ Ðабаев''' иÑпÑавлÑÐµÑ Ð·Ð°Ð¼ÐµÑеннÑе недоÑеÑÑ.'' | ||
__TOC__ | __TOC__ | ||
− | + | РпÑоÑлÑй Ñаз Ð¼Ñ Ñоздали пÑоÑÑейÑÑÑ ÑлекÑÑоннÑÑ Ð·Ð°Ð¿Ð¸ÑнÑÑ ÐºÐ½Ð¸Ð¶ÐºÑ. Ðна ÑабоÑÐ°ÐµÑ Ð² бÑаÑзеÑе и показÑÐ²Ð°ÐµÑ Ð½ÐµÑколÑко пÑоÑÑÑÑ
ÑÑÑаниÑек, на коÑоÑÑÑ
можно пÑоÑмоÑÑеÑÑ ÑпиÑок конÑакÑов, добавиÑÑ Ð½Ð¾Ð²Ñй конÑакÑ, ÑдалиÑÑ ÐµÐ³Ð¾ или оÑÑедакÑиÑоваÑÑ. Ð ÑейÑÐ°Ñ Ð´Ð°Ð²Ð°Ð¹Ñе попÑобÑем ÑделаÑÑ Ð²Ñе ÑÑо более пÑавилÑно. | |
− | === | + | === ÐоÑÐµÐ¼Ñ Ð±Ñло плоÑ
о? === |
− | + | ÐейÑÑвиÑелÑно, поÑемÑ? РабоÑаеÑ, и Ñ
оÑоÑо. ÐоÑÑаÑоÑно бÑÑÑÑо и не ÑлиÑком Ñложно. Ðо вдÑÑг заÑ
оÑеÑÑÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ ÑÑÑаниÑек? РзаÑ
оÑеÑÑÑ ÑеÑез деÑÑÑÑ Ð¼Ð¸Ð½ÑÑ ÑабоÑÑ. Ðли поÑле Ñого, как ÑÑÑаниÑÐºÑ Ð¿Ð¾ÑмоÑÑÐ¸Ñ Ð½Ð°ÑалÑник. | |
− | + | ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо, можно измениÑÑ ÐºÐ¾Ð´ пÑоекÑа, поÑом пеÑекомпилиÑоваÑÑ ÐµÐ³Ð¾, оÑÑановиÑÑ ÑеÑÐ²ÐµÑ (Ð? ÐÑо-Ñо ÑабоÑал? ÐзвиниÑе...), ÑÑÑановиÑÑ Ð½Ð¾Ð²Ñй код и повÑоÑно запÑÑÑиÑÑ ÑеÑвеÑ. ÐеÑод, мÑгко говоÑÑ, неÑдобнÑй. Рможно измениÑÑ Ñам пÑÐ¾ÐµÐºÑ Ñак, ÑÑÐ¾Ð±Ñ Ð²Ñполнение ÑакиÑ
пожеланий не ÑÑебовало ÑÑÐ¾Ð»Ñ ÑложнÑÑ
дейÑÑвий. ÐÑоÑой пÑÑÑ Ð·Ð¾Ð²ÐµÑÑÑ ÑеÑакÑоÑингом и гоÑаздо более коÑÑекÑен. ÐÑли ÑазделиÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ и Ð»Ð¾Ð³Ð¸ÐºÑ ÑабоÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (бизнеÑ-логикÑ), Ñо в далÑнейÑем можно бÑдеÑ, напÑимеÑ, ÑазделиÑÑ Ð¸ ÑабоÑÑ Ð¿Ð¾ иÑ
поддеÑжаниÑ. ХоÑоÑий пÑогÑаммиÑÑ Ð½Ðµ вÑегда ÑÐ¾Ð·Ð´Ð°ÐµÑ Ñ
оÑоÑие полÑзоваÑелÑÑкие инÑеÑÑейÑÑ, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñй аÑÐ¿ÐµÐºÑ Ñоже важен. | |
− | === | + | === Ðак ÑделаÑÑ Ñ
оÑоÑо? === |
− | + | ÐÑ, вкÑаÑÑе Ñже понÑÑно. ÐÑжно вÑнеÑÑи в оÑделÑнÑе ÑÐ°Ð¹Ð»Ñ ÑÑ ÑаÑÑÑ, коÑоÑÐ°Ñ Ð¼ÐµÐ½ÑеÑÑÑ ÑаÑÑо (в наÑем ÑлÑÑае, ÑÑо инÑеÑÑейÑ) и как-Ñо подклÑÑиÑÑ ÑÑи ÑÐ°Ð¹Ð»Ñ Ð¸Ð· наÑей пÑогÑаммÑ. ÐлÑÑ, желаÑелÑно ÑделаÑÑ ÑÑо Ñак, ÑÑÐ¾Ð±Ñ ÑоÑÐ¼Ð°Ñ Ñайлов «дизайна» бÑл ÑÑандаÑÑнÑм, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз не пеÑеÑÑиваÑÑÑÑ. | |
− | + | РеÑений Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ пÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво. РаÑÑмоÑÑим ÑамÑе ÑаÑпÑоÑÑÑаненнÑе: | |
− | * ''' | + | * '''ШаблонÑ.''' Ðдна из ÑамÑÑ
ÑаÑпÑоÑÑÑаненнÑÑ
библиоÑек ÑабоÑÑ Ñ Ñаблонами â ''Velocity''. ÐÑи иÑполÑзовании ÑаблоннÑÑ
движков можно добавлÑÑÑ Ð² ÑекÑÑ ÑпеÑиалÑнÑе вÑÑавки, коÑоÑÑе говоÑÑÑ: «ТÑÑ Ð²ÑÑавиÑÑ Ð·Ð½Ð°Ñение пеÑеменной {{oncolor||red|Name}}». Ðногда можно делаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑе опеÑаÑии (вÑÑавка подÑаблонов, вÑÑиÑлениÑ, ÑÑловнÑе вÑÑавки). |
− | * '''JSP (Java Server Pages).''' | + | * '''JSP (Java Server Pages).''' Ðо вÑемени поÑвлениÑ, пожалÑй, пеÑÐ²Ð°Ñ ÑеÑ
Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð´Ð»Ñ Ð¾ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð° Ð¾Ñ Ð±Ð¸Ð·Ð½ÐµÑ-логики. Ðо Ñ ÐµÐµ поÑÑавил вÑоÑой, Ñак как она Ñложнее, Ñем пÑоÑÑо ÑÐ°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека. JSP позволÑÐµÑ Ð²Ð½ÐµÐ´ÑиÑÑ ÐºÐ¾Ð´ на (по задÑмке) лÑбом ÑзÑке пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑÑ ÑпеÑиалÑнÑм обÑазом Ñозданной ÑÑÑаниÑки. ÐпÑоÑем, обÑÑно иÑполÑзÑеÑÑÑ Java. ТеоÑеÑиÑеÑки, можно напиÑаÑÑ ÑеÑвеÑное пÑиложение, иÑполÑзÑÑ Ð¸ÑклÑÑиÑелÑно JSP. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од поÑ
ож на PHP, Ñ Ñем оÑлиÑием, ÑÑо JSP-ÑÑÑаниÑÑ â ÑÑо полноÑеннÑе ÑеÑвлеÑÑ, они компилиÑÑÑÑÑÑ Ð¿Ñи обновлении иÑÑ
одного ÑекÑÑа и обÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº ÑаковÑе. |
− | * '''JSF (Java Server Faces).''' | + | * '''JSF (Java Server Faces).''' РнекоÑоÑом Ñоде ÑÑа ÑеÑ
Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¾Ð±ÑединÑÐµÑ Ð¿Ð¾Ð´Ñ
одÑ, коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð¿Ñи Ñоздании «обÑÑнÑÑ
» и «ÑеÑевÑÑ
» пÑогÑамм. ÐнÑеÑÑÐµÐ¹Ñ (как дизайн инÑеÑÑейÑа, Ñак и его логика) пÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÑпеÑиалÑнÑм обÑазом, а поÑле ÑÑого пиÑÑÑÑÑ JSP-ÑÑÑаниÑки, в коÑоÑÑÑ
ÑказÑваеÑÑÑ Â«ÑÑÑ Ð²ÑÑавиÑÑ ÑаблиÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñаким-Ñо». JSF обÑабаÑÑÐ²Ð°ÐµÑ ÑÑи ÑпеÑвÑÑавки и «ÑиÑÑеÑ» ÑÑнкÑионалÑнÑе ÑлеменÑÑ Ð¸Ð½ÑеÑÑейÑа (обÑабаÑÑÐ²Ð°Ñ ÑобÑÑÐ¸Ñ Ð¾Ñ Ð½Ð¸Ñ
и Ñак далее), позволÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ÐµÑÑ ÑоÑÑедоÑоÑиÑÑÑÑ Ð½Ð° оÑÑалÑном. |
− | * '''Google Web Toolkit.''' | + | * '''Google Web Toolkit.''' Ðе Ð¼Ð¾Ð³Ñ Ð½Ðµ оÑÑановиÑÑÑÑ Ð½Ð° ÑÑом ÑÑедÑÑве. ÐÑи его иÑполÑзовании на вÑÑ
оде полÑÑаеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñенное AJAX-пÑиложение (ÑÑо ÑÑо Ñакое â Ñема оÑделÑной ÑÑаÑÑи, пÑÐ¸Ð¼ÐµÑ â Google Mail), а на вÑ
оде â вÑе ÑÐ¾Ñ Ð¶Ðµ Java-код. РеÑение инÑеÑеÑное, не лиÑенное ÑвоиÑ
доÑÑоинÑÑв и недоÑÑаÑков. |
− | + | ÐÑ Ð¶Ðµ в ÑамкаÑ
данной ÑÑаÑÑи ÑаÑÑмоÑÑим «ÑÑедненÑкое» ÑеÑение â Java Server Pages. РоÑновном â из-за его ÑÑандаÑÑноÑÑи, Ñ
оÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ конкÑеÑного ÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑбÑаÑÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ ÑаблоннÑй движок, напÑимеÑ, ÑÐ¾Ñ Ð¶Ðµ Velocity (http://velocity.apache.org). | |
− | === | + | === ÐбÑÐ°Ñ ÑÑ
ема ÑабоÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ === |
− | + | ÐонÑв, ÑÑо нÑжно оÑделиÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð¾Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð°, давайÑе подÑмаем, каким обÑазом ÑÑо можно ÑделаÑÑ. ÐÑÐµÐ´Ð»Ð°Ð³Ð°Ñ Ð¾ÑÑановиÑÑÑÑ Ð½Ð° ÑледÑÑÑей ÑÑ
еме - '''(РиÑ. 1)'''. | |
− | + | СеÑÐ²Ð»ÐµÑ Ð²ÑÐ´Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе, абÑолÑÑно не забоÑÑÑÑ Ð¾ Ñом, как они бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ. Ðо вÑÐ´Ð°ÐµÑ Ð¾Ð½ иÑ
не в «ÑÑÑом» виде, а в полноÑÑÑÑ Ð¾Ð±ÑабоÑанном, гоÑовом Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑкÑане (напÑимеÑ, еÑли нÑжно полное Ð¸Ð¼Ñ Ñеловека, а в даннÑÑ
â его ФÐРпо оÑделÑноÑÑи, Ñо ÑеÑÐ²Ð»ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑеобÑазоваÑÑ Ð²ÑоÑое в пеÑвое пеÑед пеÑедаÑей в JSP). | |
− | + | ÐÐ¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð²Ð¾Ð¿ÑоÑ: как же пеÑедаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе Ð¾Ñ ÑеÑвлеÑа в JSP? ЧеÑез Ñже извеÑÑнÑй нам обÑÐµÐºÑ {{oncolor||red|request}}. Ð Ð½ÐµÐ¼Ñ Â«Ð¿ÑикÑÑÑен» ÑпеÑиалÑнÑй аÑÑоÑиаÑивнÑй маÑÑив «{{oncolor||red|String â Object}}», коÑоÑÑй назÑваеÑÑÑ Ð°ÑÑибÑÑами и коÑоÑÑй живеÑ, пока жив запÑоÑ. Ð Ð½ÐµÐ¼Ñ Ð¸Ð¼ÐµÐµÑ Ð´Ð¾ÑÑÑп и ÑеÑвлеÑ, и JSP-ÑÑÑаниÑа, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ можно (и ÑÑо пÑавилÑно) иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ
. | |
− | === | + | === ÐеÑеÑ
одим на Tomcat === |
− | + | Ðо ÑнаÑала нÑжно пеÑепиÑаÑÑ Ð½Ð°Ñ ÑеÑÐ²Ð»ÐµÑ Â«Ð¿Ð¾-взÑоÑломÑ». ÐÑÑÑоеннÑй ÑеÑÐ²ÐµÑ â ÑÑо замеÑаÑелÑно Ð´Ð»Ñ ÐºÑÑÑаÑнÑÑ
пÑоекÑов, но обÑÑно конÑÐµÐ¹Ð½ÐµÑ ÑеÑвлеÑов Ñже ÑÑоиÑ, и подклÑÑаÑÑÑÑ ÑледÑÐµÑ Ðº немÑ. | |
− | + | ÐÑ Ð±Ñдем иÑполÑзоваÑÑ Tomcat 5.5. ÐÑо клаÑÑиÑеÑкий, можно даже ÑказаÑÑ, ÑÑандаÑÑнÑй оÑкÑÑÑÑй ÑеÑвлеÑ-конÑейнеÑ. ÐÐ»Ñ ÑÑÑановки Tomcat доÑÑаÑоÑно пÑоÑÑо ÑкаÑаÑÑ ÐµÐ³Ð¾ Ñ http://tomcat.apache.org (или взÑÑÑ Ñ Ð½Ð°Ñего DVD), ÑаÑпаковаÑÑ Ð¸ запÑÑÑиÑÑ '''bin/startup.sh''' (или ÑооÑвеÑÑвÑÑÑий '''.bat'''). ''Tomcat'' ÑабоÑÐ°ÐµÑ Ñ Ñайлами ÑпеÑиалÑного Ñипа Web Archive (WAR). ÐбнаÑÑжив Ñакой Ñайл в опÑеделенном каÑалоге, Tomcat ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ и запÑÑÐºÐ°ÐµÑ ÑодеÑжаÑееÑÑ Ð² нем пÑиложение. ЧÑÐ¾Ð±Ñ Ð¿ÐµÑезапÑÑÑиÑÑ Ð¸Ð»Ð¸ обновиÑÑ Ð¿ÑогÑаммÑ, доÑÑаÑоÑно пÑоÑÑо замениÑÑ Ð¾Ð´Ð¸Ð½ WAR-Ñайл дÑÑгим. | |
− | + | ÐÑедÑдÑÑий код не гоÑов Ð´Ð»Ñ ÑабоÑÑ Ñ Tomcat, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ нÑжно немного пеÑепиÑаÑÑ. ÐÐ¾Ñ ÑÑо бÑÐ´ÐµÑ Ñделано: | |
− | * '''{{oncolor||red|AddressBook}}''' | + | * '''{{oncolor||red|AddressBook}}''' поÑеÑÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ {{oncolor||red|start}} и {{oncolor||red|main}} и пÑевÑаÑиÑÑÑ Ð² пÑоÑÑое Ñ
ÑанилиÑе запиÑей. |
− | * '''{{oncolor||red|AddressBookHandler}}''' | + | * '''{{oncolor||red|AddressBookHandler}}''' пÑевÑаÑиÑÑÑ Ð² {{oncolor||red|AddressBookServlet}}, и в него бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ пÑимеÑно ÑледÑÑÑее '''(ÐиÑÑинг 1)''': |
− | '''{{oncolor||red| | + | '''{{oncolor||red|ÐиÑÑинг 1. ÐовÑй AddressBook}}''' |
private AddressBook _addressBook = null; | private AddressBook _addressBook = null; | ||
Строка 66: | Строка 67: | ||
} | } | ||
− | + | Сам меÑод {{oncolor||red|handle}} Ñоже Ñлегка пÑеобÑазÑеÑÑÑ '''(ÐиÑÑинг 2)''': | |
− | '''{{oncolor||red| | + | '''{{oncolor||red|ÐиÑÑинг 2. ÐовÑй меÑод handle}}''' |
private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse) | private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse) | ||
Строка 90: | Строка 91: | ||
} | } | ||
− | * | + | * ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Tomcat «понÑл», ÑÑо ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ð»Ð¸ ÑеÑвлеÑ, и знал, как его обÑабаÑÑваÑÑ, нÑжно напиÑаÑÑ ÑпеÑиалÑнÑй Ñайл, коÑоÑÑй назÑваеÑÑÑ Â«Ð´ÐµÑкÑипÑоÑ». ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ñлово ÑÑÑаÑное, ÑÑо пÑоÑÑо XML-докÑÐ¼ÐµÐ½Ñ Ñ Ð¾Ð¿Ð¸Ñанием ÑеÑвлеÑа. ÐÑли пеÑевеÑÑи Ñ ÑзÑка напиÑÐ°Ð½Ð¸Ñ Ð´ÐµÑкÑипÑоÑов на ÑÑÑÑкий, Ñо полÑÑиÑÑÑ Ð¿ÑимеÑно ÑледÑÑÑÐ°Ñ Ð¸Ð½ÑоÑмаÑиÑ: |
− | ** | + | ** ÐÐ°Ñ ÑеÑÐ²Ð»ÐµÑ Ð½Ð°Ð·ÑваеÑÑÑ {{oncolor||red|«ABServlet»}} и запÑÑкаеÑÑÑ ÐºÐ»Ð°ÑÑом {{oncolor||red|AddressBookServlet}}. ТеоÑеÑиÑеÑки можно назваÑÑ ÑеÑÐ²Ð»ÐµÑ Ñак же, как и клаÑÑ, но Ð¼Ñ Ð½Ðµ бÑдем Ñак делаÑÑ, ÑÑÐ¾Ð±Ñ Ð±Ñло менÑÑе пÑÑаниÑÑ. |
− | ** | + | ** ÐÐ»Ñ Ð²ÑеÑ
URL, коÑоÑÑе наÑинаÑÑÑÑ Ñ Â«/», нÑжно вÑзÑваÑÑ ÑеÑвлеÑ, коÑоÑÑй назÑваеÑÑÑ ABServlet. |
− | + | Ð Ð²Ð¾Ñ ÐºÐ°Ðº он вÑглÑÐ´Ð¸Ñ '''(ÐиÑÑинг 3)''': | |
− | '''{{oncolor||red| | + | '''{{oncolor||red|ÐиÑÑинг 3. ÐеÑкÑипÑÐ¾Ñ Ð´Ð»Ñ ÑеÑвлеÑа}}''' |
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Строка 121: | Строка 122: | ||
</web-app> | </web-app> | ||
− | * | + | * ÐеÑкÑипÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð½Ð°Ð·ÑваÑÑÑÑ '''web.xml''' и Ñ
ÑаниÑÑÑÑ Ð² ÑпеÑиалÑном каÑалоге. Ðде именно â обÑÑдим, когда бÑдем ÑобиÑаÑÑ ÑеÑÐ²Ð»ÐµÑ Ð² {{oncolor||red|WAR}} |
. | . | ||
− | + | СделайÑе ÑказаннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑамоÑÑоÑÑелÑно или возÑмиÑе гоÑо-вÑй код Ñ DVD. ÐÑе в поÑÑдке? Тогда движемÑÑ Ð´Ð°Ð»ÑÑе. | |
− | === | + | === ÐовÑй меÑод === |
− | + | ÐÑли пÑиÑмоÑÑеÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ внимаÑелÑно к ÐºÐ¾Ð´Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ {{oncolor||red|handle}}, можно замеÑиÑÑ, ÑÑо Ñам поÑвилÑÑ Ð²Ñзов меÑода {{oncolor||red|outputPage}}. РанÑÑе его, в оÑлиÑие Ð¾Ñ ÑазнÑÑ
{{oncolor||red|handle}}... не бÑло. ÐÑо меÑод, коÑоÑÑй вÑбиÑÐ°ÐµÑ JSP-Ñайл и пеÑÐµÐ´Ð°ÐµÑ ÐµÐ¼Ñ ÑпÑавление Ð´Ð»Ñ Ð²Ñвода ÑÑÑаниÑек. ÐÑглÑÐ´Ð¸Ñ Ð¼ÐµÑод ÑледÑÑÑим обÑазом '''(ÐиÑÑинг 4)''': | |
− | '''{{oncolor||red| | + | '''{{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 | ||
Строка 137: | Строка 138: | ||
} | } | ||
− | + | Ð ÑÑом меÑоде Ð¼Ñ Ð±ÐµÑем нÑжнÑй JSP-Ñайл и говоÑим ÑеÑвлеÑ-конÑейнеÑÑ: «ÐбÑабоÑай, пожалÑйÑÑа». ÐÑÑалÑное беÑÐµÑ Ð½Ð° ÑÐµÐ±Ñ ÐºÐ¾Ð½ÑейнеÑ. Ðн иÑÐµÑ JSP-Ñайл, загÑÑÐ¶Ð°ÐµÑ ÐµÐ³Ð¾, компилиÑÑÐµÑ (еÑли ÑÑо нÑжно), вÑполнÑÐµÑ Ð¿Ð¾Ð»ÑÑивÑийÑÑ ÑеÑвлеÑ, а ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑÐ²Ð°ÐµÑ Ð² {{oncolor||red|aResponse}}. | |
− | === JSP- | + | === 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''' '''(ÐиÑÑинг 5)''': | |
− | '''{{oncolor||red| | + | '''{{oncolor||red|ÐиÑÑинг 5. index.jsp}}''' |
<nowiki> | <nowiki> | ||
Строка 154: | Строка 155: | ||
<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> |
</head> | </head> | ||
− | <body><h1> | + | <body><h1>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°</h1> |
− | <a href="<%=request.getContextPath()%>/add"> | + | <a href="<%=request.getContextPath()%>/add">ÐобавиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ</a><br/> |
− | <a href="<%=request.getContextPath()%>/view"> | + | <a href="<%=request.getContextPath()%>/view">ÐÑоÑмоÑÑеÑÑ Ð·Ð°Ð¿Ð¸Ñи</a><br/> |
</body> | </body> | ||
</html> | </html> | ||
</nowiki> | </nowiki> | ||
− | + | ÐеÑÐ²Ð°Ñ ÑÑÑоÑка добавлÑÐµÑ Ð¿Ð¾Ð»Ðµ «Content-type» к HTTP-Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ Ð¾ÑвеÑа. ÐÑо пÑÑмой аналог ÑÑÑоки | |
aRequest.setContentType("text/html; charset=utf-8") | aRequest.setContentType("text/html; charset=utf-8") | ||
− | + | из «ÑÑаÑого» меÑода {{oncolor||red|handle}}. РдалÑÑе, кÑоме ÑÑÑаннÑÑ
вÑÑавок {{oncolor||red|<%...%>}}, Ð¸Ð´ÐµÑ Ð¾Ð±ÑÑнÑй HTML-код. Ð ÑÑо Ñ
оÑоÑо! ÐÑо понÑÑно! ТепеÑÑ ÑазбеÑемÑÑ Ñ Ð½ÐµÐ¿Ð¾Ð½ÑÑнÑм. | |
− | + | Ð JSP можно вÑÑавлÑÑÑ Â«Ð¸Ð½Ð¾ÑоднÑй» Ð´Ð»Ñ HTML код, коÑоÑÑй ÑпеÑиалÑнÑм обÑазом инÑеÑпÑеÑиÑÑеÑÑÑ ÑеÑвеÑом и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован Ð´Ð»Ñ Ð²ÑÑавки ÑазлиÑнÑÑ
даннÑÑ
. ÐÑÑÑ Ð½ÐµÑколÑко Ñипов ÑакиÑ
вÑÑавок. | |
− | * {{oncolor||red|<%@...%>}} | + | * {{oncolor||red|<%@...%>}} â обознаÑÐ°ÐµÑ ÑпеÑиалÑнÑÑ Ð²ÑÑавкÑ, коÑоÑÐ°Ñ Ð¾Ð¿ÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑÑÑаниÑÑ, в наÑем ÑлÑÑае â {{oncolor||red|ContentType}}. Ðожно задаваÑÑ, напÑимеÑ, ÑзÑк, на коÑоÑом напиÑана ÑÑÑаниÑа. Ðн же иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑекÑий {{oncolor||red|import}} (Ñм. '''view.jsp''' ниже). |
− | * {{oncolor||red|<%=...%>}} | + | * {{oncolor||red|<%=...%>}} â ÑÑо пÑоÑÑой вÑвод пеÑеменной. ÐейÑÑвие вÑÑавки {{oncolor||red|<%=ÑÑо-нибÑдÑ%>}} аналогиÑно вÑÐ·Ð¾Ð²Ñ {{oncolor||red|request.getWriter().write(ÑÑо-нибÑдÑ)}}. |
− | * {{oncolor||red|<%...%>}} | + | * {{oncolor||red|<%...%>}} â ÑамÑй обÑий ваÑÐ¸Ð°Ð½Ñ Ð²ÑÑавки, внÑÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой код. РнаÑем ÑлÑÑае, на Java. |
− | '''index.jsp''' | + | '''index.jsp''' â пÑоÑÑой Ñайл, поÑмоÑÑим на неÑÑо более Ñложное. ÐапÑимеÑ, '''view.jsp''' '''(ÐиÑÑинг 6)'''. |
− | '''{{oncolor||red| | + | '''{{oncolor||red|ÐиÑÑинг 6. view.jsp}}''' |
<nowiki> | <nowiki> | ||
Строка 183: | Строка 184: | ||
<%@ page import="java.util.*" %> | <%@ page import="java.util.*" %> | ||
<html> | <html> | ||
− | <head><title> | + | <head><title>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°</title></head> |
− | <body><h1> | + | <body><h1>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°, ÑпиÑок конÑакÑов</h1> |
− | <a href="<%=request.getContextPath()%>"> | + | <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"> | + | <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"); | ||
Строка 200: | Строка 201: | ||
<td class="comment"><%=comment%></td> | <td class="comment"><%=comment%></td> | ||
<td class="name"> | <td class="name"> | ||
− | <a href="<%=request.getContextPath()%>/remove?number=<%=number%>"> | + | <a href="<%=request.getContextPath()%>/remove?number=<%=number%>">УдалиÑÑ</a> |
− | <a href="<%=request.getContextPath()%>/edit?number=<%=number%>"> | + | <a href="<%=request.getContextPath()%>/edit?number=<%=number%>">РедакÑиÑоваÑÑ</a> |
</td> | </td> | ||
</tr> | </tr> | ||
Строка 210: | Строка 211: | ||
</nowiki> | </nowiki> | ||
− | + | Ðак можно замеÑиÑÑ, здеÑÑ ÐµÑÑÑ Ð¸ импоÑÑ (о Ñем Ñ Ð³Ð¾Ð²Ð¾Ñил ÑÑÑÑ Ð²ÑÑе), и вÑÑавка Java-кода. ÐаннÑй Ñайл оÑлиÑно показÑваеÑ, как, напÑÐ¸Ð¼ÐµÑ (не ÑамÑй лÑÑÑий ÑпоÑоб, конеÑно), ÑделаÑÑ Ð²Ñвод в Ñикле. | |
− | === | + | === Ркак ÑÑо обÑабаÑÑваеÑÑÑ-Ñо? === |
− | + | ÐÑÑеÑÑвенно, и меÑÐ¾Ð´Ñ {{oncolor||red|handle}}... поÑле Ñакого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑали дÑÑгими. ÐеÑÑ Ð²Ñвод HTML-кода иÑÑез, оÑÑалаÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовка даннÑÑ
, и вÑзов меÑода {{oncolor||red|outputPage}}. ÐоÑ, напÑимеÑ, меÑод {{oncolor||red|handleEdit(...)}} '''(ÐиÑÑинг 7)''': | |
− | '''{{oncolor||red| | + | '''{{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) { | ||
Строка 227: | Строка 228: | ||
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 { | ||
Строка 239: | Строка 240: | ||
} | } | ||
− | + | ÐÑÑалÑнÑе меÑÐ¾Ð´Ñ Ð¼ÐµÐ½ÑÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно â иÑ
[[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 | 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)''': | |
− | '''{{oncolor||red| | + | '''{{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''' и ÑаÑполагаеÑÑÑ Ñам же, ÑÑдом Ñ Ð¼Ð°Ð½Ð¸ÑеÑÑом. | |
jar -cfm ../address.war ../MANIFEST.MF * | jar -cfm ../address.war ../MANIFEST.MF * | ||
− | + | Ð ÑейÑÐ°Ñ Ð½Ð°ÑÑÑÐ¿Ð°ÐµÑ ÑамÑй волÑебнÑй моменÑ! ÐозÑмиÑе '''address.war''' и положиÑе его в каÑалог webapps Tomcat'а. ÐодождиÑе неÑколÑко ÑекÑнд. Увидев новое пÑиложение, Tomcat ÑазвеÑÐ½ÐµÑ ÐµÐ³Ð¾ (поÑвлÑеÑÑÑ ÐºÐ°Ñалог Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ваÑего war'а) и подклÑÑÐ¸Ñ Ðº ÑиÑÑеме. ÐоÑле ÑÑого можно пÑоÑÑо зайÑи в бÑаÑÐ·ÐµÑ Ð¸ набÑаÑÑ: | |
http://localhost:8080/address/ | http://localhost:8080/address/ | ||
− | + | ÐÑалÑ, полÑÑиÑе ваÑе пÑиложение. | |
− | === | + | === Ð ÑÑо ÑепеÑÑ? === |
− | + | Ð ÑепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ менÑÑÑ JSP-ÑÐ°Ð¹Ð»Ñ Â«Ð½Ð° леÑÑ» в ÑаÑпакованном каÑалоге '''webapps/address/jsps'''. ÐÑи ÑÑом бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑоиÑÑ
одиÑÑ Ð½ÐµÑколÑко дейÑÑвий, в ÑезÑлÑÑаÑе коÑоÑÑÑ
ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾Ð´Ñ
ваÑÑÑÑÑ Ð¿Ñиложением. Так менÑеÑÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ без пеÑекомпилÑÑии, без ÑеÑÑаÑÑа ÑеÑвеÑного пÑиложениÑ, как ÑÑо Ñ Ð½Ð°Ñ Ð±Ñло до ÑиÑ
поÑ. | |
− | + | Я ÑÑиÑаÑ, ÑÑо на данном ÑÑапе пÑиложение «ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°Â» ÑабоÑÐ°ÐµÑ Ñ
оÑоÑо. Ðно вÑполнÑÐµÑ Ñвои неÑложнÑе ÑÑнкÑии и ÑÐ¼ÐµÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Â«Ð½Ð° леÑÑ» по запÑоÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. Ðно пÑоÑÑое â и ÑÑо ÑÑÑÑ Ð»Ð¸ не Ñамое главное. Ðо еÑÑÑ ÐµÑе доÑÑаÑоÑно аÑпекÑов, о коÑоÑÑÑ
ÑÑÐ¾Ð¸Ñ Ð·Ð½Ð°ÑÑ Ð¿Ñи ÑазÑабоÑке более ÑложнÑÑ
инÑеÑнеÑ-пÑиложений. ÐÑ ÑаÑÑмоÑÑим иÑ
в ÑледÑÑÑиÑ
ÑÑаÑÑÑÑ
данной ÑеÑии. [http://www.linuxformat.ru LXF] |
Версия 00:50, 23 мая 2009
|
|
|
http://www.textervardellido.com Шаблон:Цикл/Java EE
ТелеÑÐ¾Ð½Ð½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°: пеÑÐµÑ Ð¾Ð´ на JSP
ЧÐСТЬ 2 ÐÑÑÑеÑаÑÑ Ð¿Ð¾ одежке â и ÐолÑÑой ÐоÑÑ Ð½Ðµ бÑл ÑилÑно впеÑаÑлен Ñозданной нами в пÑоÑлÑй Ñаз адÑеÑной книгой. ÐлекÑÐ°Ð½Ð´Ñ Ðабаев иÑпÑавлÑÐµÑ Ð·Ð°Ð¼ÐµÑеннÑе недоÑеÑÑ.
РпÑоÑлÑй Ñаз Ð¼Ñ Ñоздали пÑоÑÑейÑÑÑ ÑлекÑÑоннÑÑ Ð·Ð°Ð¿Ð¸ÑнÑÑ ÐºÐ½Ð¸Ð¶ÐºÑ. Ðна ÑабоÑÐ°ÐµÑ Ð² бÑаÑзеÑе и показÑÐ²Ð°ÐµÑ Ð½ÐµÑколÑко пÑоÑÑÑÑ ÑÑÑаниÑек, на коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑоÑмоÑÑеÑÑ ÑпиÑок конÑакÑов, добавиÑÑ Ð½Ð¾Ð²Ñй конÑакÑ, ÑдалиÑÑ ÐµÐ³Ð¾ или оÑÑедакÑиÑоваÑÑ. Ð ÑейÑÐ°Ñ Ð´Ð°Ð²Ð°Ð¹Ñе попÑобÑем ÑделаÑÑ Ð²Ñе ÑÑо более пÑавилÑно.
ÐоÑÐµÐ¼Ñ Ð±Ñло Ð¿Ð»Ð¾Ñ Ð¾?
ÐейÑÑвиÑелÑно, поÑемÑ? РабоÑаеÑ, и Ñ Ð¾ÑоÑо. ÐоÑÑаÑоÑно бÑÑÑÑо и не ÑлиÑком Ñложно. Ðо вдÑÑг Ð·Ð°Ñ Ð¾ÑеÑÑÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ ÑÑÑаниÑек? Ð Ð·Ð°Ñ Ð¾ÑеÑÑÑ ÑеÑез деÑÑÑÑ Ð¼Ð¸Ð½ÑÑ ÑабоÑÑ. Ðли поÑле Ñого, как ÑÑÑаниÑÐºÑ Ð¿Ð¾ÑмоÑÑÐ¸Ñ Ð½Ð°ÑалÑник.
ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо, можно измениÑÑ ÐºÐ¾Ð´ пÑоекÑа, поÑом пеÑекомпилиÑоваÑÑ ÐµÐ³Ð¾, оÑÑановиÑÑ ÑеÑÐ²ÐµÑ (Ð? ÐÑо-Ñо ÑабоÑал? ÐзвиниÑе...), ÑÑÑановиÑÑ Ð½Ð¾Ð²Ñй код и повÑоÑно запÑÑÑиÑÑ ÑеÑвеÑ. ÐеÑод, мÑгко говоÑÑ, неÑдобнÑй. Рможно измениÑÑ Ñам пÑÐ¾ÐµÐºÑ Ñак, ÑÑÐ¾Ð±Ñ Ð²Ñполнение ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ð¹ не ÑÑебовало ÑÑÐ¾Ð»Ñ ÑложнÑÑ Ð´ÐµÐ¹ÑÑвий. ÐÑоÑой пÑÑÑ Ð·Ð¾Ð²ÐµÑÑÑ ÑеÑакÑоÑингом и гоÑаздо более коÑÑекÑен. ÐÑли ÑазделиÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ и Ð»Ð¾Ð³Ð¸ÐºÑ ÑабоÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (бизнеÑ-логикÑ), Ñо в далÑнейÑем можно бÑдеÑ, напÑимеÑ, ÑазделиÑÑ Ð¸ ÑабоÑÑ Ð¿Ð¾ Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжаниÑ. ХоÑоÑий пÑогÑаммиÑÑ Ð½Ðµ вÑегда ÑÐ¾Ð·Ð´Ð°ÐµÑ Ñ Ð¾ÑоÑие полÑзоваÑелÑÑкие инÑеÑÑейÑÑ, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñй аÑÐ¿ÐµÐºÑ Ñоже важен.
Ðак ÑделаÑÑ Ñ Ð¾ÑоÑо?
ÐÑ, вкÑаÑÑе Ñже понÑÑно. ÐÑжно вÑнеÑÑи в оÑделÑнÑе ÑÐ°Ð¹Ð»Ñ ÑÑ ÑаÑÑÑ, коÑоÑÐ°Ñ Ð¼ÐµÐ½ÑеÑÑÑ ÑаÑÑо (в наÑем ÑлÑÑае, ÑÑо инÑеÑÑейÑ) и как-Ñо подклÑÑиÑÑ ÑÑи ÑÐ°Ð¹Ð»Ñ Ð¸Ð· наÑей пÑогÑаммÑ. ÐлÑÑ, желаÑелÑно ÑделаÑÑ ÑÑо Ñак, ÑÑÐ¾Ð±Ñ ÑоÑÐ¼Ð°Ñ Ñайлов «дизайна» бÑл ÑÑандаÑÑнÑм, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз не пеÑеÑÑиваÑÑÑÑ.
РеÑений Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ пÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво. РаÑÑмоÑÑим ÑамÑе ÑаÑпÑоÑÑÑаненнÑе:
- ШаблонÑ. Ðдна из ÑамÑÑ ÑаÑпÑоÑÑÑаненнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек ÑабоÑÑ Ñ Ñаблонами â Velocity. ÐÑи иÑполÑзовании ÑаблоннÑÑ Ð´Ð²Ð¸Ð¶ÐºÐ¾Ð² можно добавлÑÑÑ Ð² ÑекÑÑ ÑпеÑиалÑнÑе вÑÑавки, коÑоÑÑе говоÑÑÑ: «ТÑÑ Ð²ÑÑавиÑÑ Ð·Ð½Ð°Ñение пеÑеменной Name». Ðногда можно делаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑе опеÑаÑии (вÑÑавка подÑаблонов, вÑÑиÑлениÑ, ÑÑловнÑе вÑÑавки).
- JSP (Java Server Pages). Ðо вÑемени поÑвлениÑ, пожалÑй, пеÑÐ²Ð°Ñ ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð´Ð»Ñ Ð¾ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð° Ð¾Ñ Ð±Ð¸Ð·Ð½ÐµÑ-логики. Ðо Ñ ÐµÐµ поÑÑавил вÑоÑой, Ñак как она Ñложнее, Ñем пÑоÑÑо ÑÐ°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека. JSP позволÑÐµÑ Ð²Ð½ÐµÐ´ÑиÑÑ ÐºÐ¾Ð´ на (по задÑмке) лÑбом ÑзÑке пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑÑ ÑпеÑиалÑнÑм обÑазом Ñозданной ÑÑÑаниÑки. ÐпÑоÑем, обÑÑно иÑполÑзÑеÑÑÑ Java. ТеоÑеÑиÑеÑки, можно напиÑаÑÑ ÑеÑвеÑное пÑиложение, иÑполÑзÑÑ Ð¸ÑклÑÑиÑелÑно JSP. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ Ð¿Ð¾Ñ Ð¾Ð¶ на PHP, Ñ Ñем оÑлиÑием, ÑÑо JSP-ÑÑÑаниÑÑ â ÑÑо полноÑеннÑе ÑеÑвлеÑÑ, они компилиÑÑÑÑÑÑ Ð¿Ñи обновлении иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑекÑÑа и обÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº ÑаковÑе.
- JSF (Java Server Faces). РнекоÑоÑом Ñоде ÑÑа ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¾Ð±ÑединÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ, коÑоÑÑе иÑполÑзÑÑÑÑÑ Ð¿Ñи Ñоздании «обÑÑнÑÑ Â» и «ÑеÑевÑÑ Â» пÑогÑамм. ÐнÑеÑÑÐµÐ¹Ñ (как дизайн инÑеÑÑейÑа, Ñак и его логика) пÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÑпеÑиалÑнÑм обÑазом, а поÑле ÑÑого пиÑÑÑÑÑ JSP-ÑÑÑаниÑки, в коÑоÑÑÑ ÑказÑваеÑÑÑ Â«ÑÑÑ Ð²ÑÑавиÑÑ ÑаблиÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñаким-Ñо». JSF обÑабаÑÑÐ²Ð°ÐµÑ ÑÑи ÑпеÑвÑÑавки и «ÑиÑÑеÑ» ÑÑнкÑионалÑнÑе ÑлеменÑÑ Ð¸Ð½ÑеÑÑейÑа (обÑабаÑÑÐ²Ð°Ñ ÑобÑÑÐ¸Ñ Ð¾Ñ Ð½Ð¸Ñ Ð¸ Ñак далее), позволÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ÐµÑÑ ÑоÑÑедоÑоÑиÑÑÑÑ Ð½Ð° оÑÑалÑном.
- Google Web Toolkit. Ðе Ð¼Ð¾Ð³Ñ Ð½Ðµ оÑÑановиÑÑÑÑ Ð½Ð° ÑÑом ÑÑедÑÑве. ÐÑи его иÑполÑзовании на вÑÑ Ð¾Ð´Ðµ полÑÑаеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñенное AJAX-пÑиложение (ÑÑо ÑÑо Ñакое â Ñема оÑделÑной ÑÑаÑÑи, пÑÐ¸Ð¼ÐµÑ â Google Mail), а на Ð²Ñ Ð¾Ð´Ðµ â вÑе ÑÐ¾Ñ Ð¶Ðµ Java-код. РеÑение инÑеÑеÑное, не лиÑенное ÑÐ²Ð¾Ð¸Ñ Ð´Ð¾ÑÑоинÑÑв и недоÑÑаÑков.
ÐÑ Ð¶Ðµ в ÑÐ°Ð¼ÐºÐ°Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑаÑÑи ÑаÑÑмоÑÑим «ÑÑедненÑкое» ÑеÑение â Java Server Pages. РоÑновном â из-за его ÑÑандаÑÑноÑÑи, Ñ Ð¾ÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ конкÑеÑного ÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑбÑаÑÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ ÑаблоннÑй движок, напÑимеÑ, ÑÐ¾Ñ Ð¶Ðµ Velocity (http://velocity.apache.org).
ÐбÑÐ°Ñ ÑÑ ÐµÐ¼Ð° ÑабоÑÑ Ð¿ÑиложениÑ
ÐонÑв, ÑÑо нÑжно оÑделиÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð¾Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð°, давайÑе подÑмаем, каким обÑазом ÑÑо можно ÑделаÑÑ. ÐÑÐµÐ´Ð»Ð°Ð³Ð°Ñ Ð¾ÑÑановиÑÑÑÑ Ð½Ð° ÑледÑÑÑей ÑÑ ÐµÐ¼Ðµ - (РиÑ. 1).
СеÑÐ²Ð»ÐµÑ Ð²ÑÐ´Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе, абÑолÑÑно не забоÑÑÑÑ Ð¾ Ñом, как они бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ. Ðо вÑÐ´Ð°ÐµÑ Ð¾Ð½ Ð¸Ñ Ð½Ðµ в «ÑÑÑом» виде, а в полноÑÑÑÑ Ð¾Ð±ÑабоÑанном, гоÑовом Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑкÑане (напÑимеÑ, еÑли нÑжно полное Ð¸Ð¼Ñ Ñеловека, а в даннÑÑ â его ФÐРпо оÑделÑноÑÑи, Ñо ÑеÑÐ²Ð»ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑеобÑазоваÑÑ Ð²ÑоÑое в пеÑвое пеÑед пеÑедаÑей в JSP).
ÐÐ¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð²Ð¾Ð¿ÑоÑ: как же пеÑедаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе Ð¾Ñ ÑеÑвлеÑа в JSP? ЧеÑез Ñже извеÑÑнÑй нам обÑÐµÐºÑ request. Ð Ð½ÐµÐ¼Ñ Â«Ð¿ÑикÑÑÑен» ÑпеÑиалÑнÑй аÑÑоÑиаÑивнÑй маÑÑив «String â Object», коÑоÑÑй назÑваеÑÑÑ Ð°ÑÑибÑÑами и коÑоÑÑй живеÑ, пока жив запÑоÑ. Ð Ð½ÐµÐ¼Ñ Ð¸Ð¼ÐµÐµÑ Ð´Ð¾ÑÑÑп и ÑеÑвлеÑ, и JSP-ÑÑÑаниÑа, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ можно (и ÑÑо пÑавилÑно) иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ .
ÐеÑÐµÑ Ð¾Ð´Ð¸Ð¼ на Tomcat
Ðо ÑнаÑала нÑжно пеÑепиÑаÑÑ Ð½Ð°Ñ ÑеÑÐ²Ð»ÐµÑ Â«Ð¿Ð¾-взÑоÑломÑ». ÐÑÑÑоеннÑй ÑеÑÐ²ÐµÑ â ÑÑо замеÑаÑелÑно Ð´Ð»Ñ ÐºÑÑÑаÑнÑÑ Ð¿ÑоекÑов, но обÑÑно конÑÐµÐ¹Ð½ÐµÑ ÑеÑвлеÑов Ñже ÑÑоиÑ, и подклÑÑаÑÑÑÑ ÑледÑÐµÑ Ðº немÑ.
ÐÑ Ð±Ñдем иÑполÑзоваÑÑ Tomcat 5.5. ÐÑо клаÑÑиÑеÑкий, можно даже ÑказаÑÑ, ÑÑандаÑÑнÑй оÑкÑÑÑÑй ÑеÑвлеÑ-конÑейнеÑ. ÐÐ»Ñ ÑÑÑановки Tomcat доÑÑаÑоÑно пÑоÑÑо ÑкаÑаÑÑ ÐµÐ³Ð¾ Ñ http://tomcat.apache.org (или взÑÑÑ Ñ Ð½Ð°Ñего DVD), ÑаÑпаковаÑÑ Ð¸ запÑÑÑиÑÑ bin/startup.sh (или ÑооÑвеÑÑвÑÑÑий .bat). Tomcat ÑабоÑÐ°ÐµÑ Ñ Ñайлами ÑпеÑиалÑного Ñипа Web Archive (WAR). ÐбнаÑÑжив Ñакой Ñайл в опÑеделенном каÑалоге, Tomcat ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ и запÑÑÐºÐ°ÐµÑ ÑодеÑжаÑееÑÑ Ð² нем пÑиложение. ЧÑÐ¾Ð±Ñ Ð¿ÐµÑезапÑÑÑиÑÑ Ð¸Ð»Ð¸ обновиÑÑ Ð¿ÑогÑаммÑ, доÑÑаÑоÑно пÑоÑÑо замениÑÑ Ð¾Ð´Ð¸Ð½ WAR-Ñайл дÑÑгим.
ÐÑедÑдÑÑий код не гоÑов Ð´Ð»Ñ ÑабоÑÑ Ñ Tomcat, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ нÑжно немного пеÑепиÑаÑÑ. ÐÐ¾Ñ ÑÑо бÑÐ´ÐµÑ Ñделано:
- AddressBook поÑеÑÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ start и main и пÑевÑаÑиÑÑÑ Ð² пÑоÑÑое Ñ ÑанилиÑе запиÑей.
- AddressBookHandler пÑевÑаÑиÑÑÑ Ð² AddressBookServlet, и в него бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ пÑимеÑно ÑледÑÑÑее (ÐиÑÑинг 1):
ÐиÑÑинг 1. ÐовÑй AddressBook
private AddressBook _addressBook = null; public void init(ServletConfig aServletConfig) throws ServletException { super.init(aServletConfig); _addressBook = new AddressBook(); } protected void doGet(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException handle(aRequest, aResponse); } protected void doPost(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException handle(aRequest, aResponse); }
Сам меÑод handle Ñоже Ñлегка пÑеобÑазÑеÑÑÑ (ÐиÑÑинг 2):
ÐиÑÑинг 2. ÐовÑй меÑод handle
private void handle(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletException, IOException { aRequest.setCharacterEncoding("utf-8"); String target = aRequest.getRequestURI().substring( aRequest.getContextPath().length()); if (target.equals("/")) { _drawer.outputPage("index.jsp", aRequest, aResponse); } else if ("/add".equals(target)) { handleAdd(aRequest, aResponse); } else if ("/view".equals(target)) { handleView(aRequest, aResponse); } else if ("/edit".equals(target)) { handleEdit(aRequest, aResponse); } else if ("/remove".equals(target)) { handleRemove(aRequest, aResponse); } }
- ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Tomcat «понÑл», ÑÑо ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ð»Ð¸ ÑеÑвлеÑ, и знал, как его обÑабаÑÑваÑÑ, нÑжно напиÑаÑÑ ÑпеÑиалÑнÑй Ñайл, коÑоÑÑй назÑваеÑÑÑ Â«Ð´ÐµÑкÑипÑоÑ». ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ñлово ÑÑÑаÑное, ÑÑо пÑоÑÑо XML-докÑÐ¼ÐµÐ½Ñ Ñ Ð¾Ð¿Ð¸Ñанием ÑеÑвлеÑа. ÐÑли пеÑевеÑÑи Ñ ÑзÑка напиÑÐ°Ð½Ð¸Ñ Ð´ÐµÑкÑипÑоÑов на ÑÑÑÑкий, Ñо полÑÑиÑÑÑ Ð¿ÑимеÑно ÑледÑÑÑÐ°Ñ Ð¸Ð½ÑоÑмаÑиÑ:
- ÐÐ°Ñ ÑеÑÐ²Ð»ÐµÑ Ð½Ð°Ð·ÑваеÑÑÑ Â«ABServlet» и запÑÑкаеÑÑÑ ÐºÐ»Ð°ÑÑом AddressBookServlet. ТеоÑеÑиÑеÑки можно назваÑÑ ÑеÑÐ²Ð»ÐµÑ Ñак же, как и клаÑÑ, но Ð¼Ñ Ð½Ðµ бÑдем Ñак делаÑÑ, ÑÑÐ¾Ð±Ñ Ð±Ñло менÑÑе пÑÑаниÑÑ.
- ÐÐ»Ñ Ð²ÑÐµÑ URL, коÑоÑÑе наÑинаÑÑÑÑ Ñ Â«/», нÑжно вÑзÑваÑÑ ÑеÑвлеÑ, коÑоÑÑй назÑваеÑÑÑ ABServlet.
Ð Ð²Ð¾Ñ ÐºÐ°Ðº он вÑглÑÐ´Ð¸Ñ (ÐиÑÑинг 3):
ÐиÑÑинг 3. ÐеÑкÑипÑÐ¾Ñ Ð´Ð»Ñ ÑеÑвлеÑа
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet> <display-name>AddressBook</display-name> <servlet-name>Servlet</servlet-name> <servlet-class>AddressBookServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>Servlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
</web-app>
- ÐеÑкÑипÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð½Ð°Ð·ÑваÑÑÑÑ web.xml и Ñ ÑаниÑÑÑÑ Ð² ÑпеÑиалÑном каÑалоге. Ðде именно â обÑÑдим, когда бÑдем ÑобиÑаÑÑ ÑеÑÐ²Ð»ÐµÑ Ð² WAR
. СделайÑе ÑказаннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑамоÑÑоÑÑелÑно или возÑмиÑе гоÑо-вÑй код Ñ DVD. ÐÑе в поÑÑдке? Тогда движемÑÑ Ð´Ð°Ð»ÑÑе.
ÐовÑй меÑод
ÐÑли пÑиÑмоÑÑеÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ внимаÑелÑно к ÐºÐ¾Ð´Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ handle, можно замеÑиÑÑ, ÑÑо Ñам поÑвилÑÑ Ð²Ñзов меÑода outputPage. РанÑÑе его, в оÑлиÑие Ð¾Ñ ÑазнÑÑ handle... не бÑло. ÐÑо меÑод, коÑоÑÑй вÑбиÑÐ°ÐµÑ JSP-Ñайл и пеÑÐµÐ´Ð°ÐµÑ ÐµÐ¼Ñ ÑпÑавление Ð´Ð»Ñ Ð²Ñвода ÑÑÑаниÑек. ÐÑглÑÐ´Ð¸Ñ Ð¼ÐµÑод ÑледÑÑÑим обÑазом (ÐиÑÑинг 4):
ÐиÑÑинг 4. ÐеÑод outputPage
public void outputPage(String aJSPName, HttpServletRequest aRequest, HttpServletResponse aResponse) throws IOException, ServletException { RequestDispatcher dispatcher = aRequest.getRequestDispatcher("/jsps/" + aJSPName); dispatcher.forward(aRequest, aResponse); }
Ð ÑÑом меÑоде Ð¼Ñ Ð±ÐµÑем нÑжнÑй JSP-Ñайл и говоÑим ÑеÑвлеÑ-конÑейнеÑÑ: «ÐбÑабоÑай, пожалÑйÑÑа». ÐÑÑалÑное беÑÐµÑ Ð½Ð° ÑÐµÐ±Ñ ÐºÐ¾Ð½ÑейнеÑ. Ðн иÑÐµÑ JSP-Ñайл, загÑÑÐ¶Ð°ÐµÑ ÐµÐ³Ð¾, компилиÑÑÐµÑ (еÑли ÑÑо нÑжно), вÑполнÑÐµÑ Ð¿Ð¾Ð»ÑÑивÑийÑÑ ÑеÑвлеÑ, а ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑÐ²Ð°ÐµÑ Ð² aResponse.
JSP-ÑÑÑаниÑÑ
ÐÐ»Ñ Ð½Ð°Ñала Ñоздадим каÑалог, в коÑоÑом бÑдем ÑобиÑаÑÑ Ð½Ð°Ñе инÑеÑнеÑ-пÑиложение. ÐазваÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ как Ñгодно, напÑимеÑ, WebApp (Web Application). Рнем Ñоздадим ÑпеÑиалÑнÑй каÑалог WEB-INF, где должен Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð´ÐµÑкÑипÑÐ¾Ñ web.xml, и каÑалог jsps, в коÑоÑом бÑдÑÑ Ñ ÑаниÑÑÑÑ JSP-ÑÑÑаниÑки.
Создадим ÑÑи JSP-Ñайла: Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑной ÑÑÑаниÑки, Ð´Ð»Ñ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (или добавлениÑ) запиÑей и Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа, и назовем Ð¸Ñ , ÑооÑвеÑÑÑвенно, index.jsp, edit.jsp, view.jsp. Ðе забÑдÑÑе â Ð¸Ñ Ð½Ñжно ÑÐ¾Ñ ÑаниÑÑ Ð² в WebApp/jsps.
Сам JSP доÑÑаÑоÑно пÑоÑÑ. РаÑÑмоÑÑим index.jsp (ÐиÑÑинг 5):
ÐиÑÑинг 5. index.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°</title> </head> <body><h1>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°</h1> <a href="<%=request.getContextPath()%>/add">ÐобавиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ</a><br/> <a href="<%=request.getContextPath()%>/view">ÐÑоÑмоÑÑеÑÑ Ð·Ð°Ð¿Ð¸Ñи</a><br/> </body> </html>
ÐеÑÐ²Ð°Ñ ÑÑÑоÑка добавлÑÐµÑ Ð¿Ð¾Ð»Ðµ «Content-type» к HTTP-Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ Ð¾ÑвеÑа. ÐÑо пÑÑмой аналог ÑÑÑоки
aRequest.setContentType("text/html; charset=utf-8")
из «ÑÑаÑого» меÑода handle. РдалÑÑе, кÑоме ÑÑÑаннÑÑ Ð²ÑÑавок <%...%>, Ð¸Ð´ÐµÑ Ð¾Ð±ÑÑнÑй HTML-код. Ð ÑÑо Ñ Ð¾ÑоÑо! ÐÑо понÑÑно! ТепеÑÑ ÑазбеÑемÑÑ Ñ Ð½ÐµÐ¿Ð¾Ð½ÑÑнÑм.
Ð JSP можно вÑÑавлÑÑÑ Â«Ð¸Ð½Ð¾ÑоднÑй» Ð´Ð»Ñ HTML код, коÑоÑÑй ÑпеÑиалÑнÑм обÑазом инÑеÑпÑеÑиÑÑеÑÑÑ ÑеÑвеÑом и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован Ð´Ð»Ñ Ð²ÑÑавки ÑазлиÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ . ÐÑÑÑ Ð½ÐµÑколÑко Ñипов ÑÐ°ÐºÐ¸Ñ Ð²ÑÑавок.
- <%@...%> â обознаÑÐ°ÐµÑ ÑпеÑиалÑнÑÑ Ð²ÑÑавкÑ, коÑоÑÐ°Ñ Ð¾Ð¿ÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑÑÑаниÑÑ, в наÑем ÑлÑÑае â ContentType. Ðожно задаваÑÑ, напÑимеÑ, ÑзÑк, на коÑоÑом напиÑана ÑÑÑаниÑа. Ðн же иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑекÑий import (Ñм. view.jsp ниже).
- <%=...%> â ÑÑо пÑоÑÑой вÑвод пеÑеменной. ÐейÑÑвие вÑÑавки <%=ÑÑо-нибÑдÑ%> аналогиÑно вÑÐ·Ð¾Ð²Ñ request.getWriter().write(ÑÑо-нибÑдÑ).
- <%...%> â ÑамÑй обÑий ваÑÐ¸Ð°Ð½Ñ Ð²ÑÑавки, внÑÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой код. РнаÑем ÑлÑÑае, на Java.
index.jsp â пÑоÑÑой Ñайл, поÑмоÑÑим на неÑÑо более Ñложное. ÐапÑимеÑ, view.jsp (ÐиÑÑинг 6).
ÐиÑÑинг 6. view.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <html> <head><title>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°</title></head> <body><h1>ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°, ÑпиÑок конÑакÑов</h1> <a href="<%=request.getContextPath()%>">Ðа главнÑÑ</a><br/> <span style="color: green;"><%=request.getAttribute("message")%></span> <table border="1"> <tr><td width="100">ÐмÑ</td><td width="100">ÐомеÑ</td><td width="100">ÐомменÑаÑий</td><td> - </td></tr> <% Map numbers = (Map) request.getAttribute("numbers"); Map comments = (Map) request.getAttribute("comments"); for (Object entry : numbers.entrySet()) { String name = (String) ((Map.Entry) entry).getKey(); String number = (String) numbers.get(name); String comment = (String) comments.get(name); %> <tr> <td class="name"><%=name%></td> <td class="number"><%=number%></td> <td class="comment"><%=comment%></td> <td class="name"> <a href="<%=request.getContextPath()%>/remove?number=<%=number%>">УдалиÑÑ</a> <a href="<%=request.getContextPath()%>/edit?number=<%=number%>">РедакÑиÑоваÑÑ</a> </td> </tr> <% } %> </table> </body> </html>
Ðак можно замеÑиÑÑ, здеÑÑ ÐµÑÑÑ Ð¸ импоÑÑ (о Ñем Ñ Ð³Ð¾Ð²Ð¾Ñил ÑÑÑÑ Ð²ÑÑе), и вÑÑавка Java-кода. ÐаннÑй Ñайл оÑлиÑно показÑваеÑ, как, напÑÐ¸Ð¼ÐµÑ (не ÑамÑй лÑÑÑий ÑпоÑоб, конеÑно), ÑделаÑÑ Ð²Ñвод в Ñикле.
Ркак ÑÑо обÑабаÑÑваеÑÑÑ-Ñо?
ÐÑÑеÑÑвенно, и меÑÐ¾Ð´Ñ handle... поÑле Ñакого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑали дÑÑгими. ÐеÑÑ Ð²Ñвод HTML-кода иÑÑез, оÑÑалаÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовка даннÑÑ , и вÑзов меÑода outputPage. ÐоÑ, напÑимеÑ, меÑод handleEdit(...) (ÐиÑÑинг 7):
ÐиÑÑинг 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); }
ÐÑÑалÑнÑе меÑÐ¾Ð´Ñ Ð¼ÐµÐ½ÑÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно â Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñй код можно найÑи на диÑке.
Ркак вÑе ÑÑо вÑÑавиÑÑ Ð² Tomcat?
ТепеÑÑ Ñ Ð½Ð°Ñ ÐµÑÑÑ:
- ÐлаÑÑÑ Contact, AddressBook, AddressBookServlet.
- Файл web.xml.
- ÐаÑалог jsps Ñ Ñайлами edit.jsp, index.jsp, view.jsp.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Tomcat понÑл, ÑÑо ÐµÐ¼Ñ Ð´Ð°Ð»Ð¸ полноÑенное пÑиложение, нÑжно вÑполниÑÑ Ð²Ñего ÑÑи Ñага:
- СкомпилиÑоваÑÑ Ð²Ñе, ÑÑо компилиÑÑеÑÑÑ, и ÑоздаÑÑ Ð¿ÑавилÑнÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ Ñайлов и каÑалогов, коÑоÑÐ°Ñ Ð¿ÑедÑÑавлена на ÑиÑ. 2.
- СоздаÑÑ ÑпеÑиалÑнÑй Ñайл-опиÑание аÑÑ Ð¸Ð²Ð° («маниÑеÑÑ»).
- ÐааÑÑ Ð¸Ð²Ð¸ÑоваÑÑ ÑозданнÑÑ ÑÑÑÑкÑÑÑÑ Ð¿Ñи помоÑи ÑÑилиÑÑ jar, Ð²Ñ Ð¾Ð´ÑÑей в ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ JDK.
СкомпилиÑÑем ÑайлÑ. ТÑÑ Ð½Ð¸Ñего нового не поÑвилоÑÑ, Ñазве ÑÑо изменилаÑÑ Ñама команда (обÑаÑиÑе внимание на клÑÑ -cp, задаÑÑий библиоÑеки 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):
ÐиÑÑинг 8. ÐаниÑеÑÑ Ð´Ð»Ñ war-Ñайла
Manifest-Version: 1.0 Created-By: Hands of programmer
ТепеÑÑ ÑобеÑем вÑе в 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. ÐÑи ÑÑом бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð½ÐµÑколÑко дейÑÑвий, в ÑезÑлÑÑаÑе коÑоÑÑÑ ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾Ð´Ñ Ð²Ð°ÑÑÑÑÑ Ð¿Ñиложением. Так менÑеÑÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½ без пеÑекомпилÑÑии, без ÑеÑÑаÑÑа ÑеÑвеÑного пÑиложениÑ, как ÑÑо Ñ Ð½Ð°Ñ Ð±Ñло до ÑÐ¸Ñ Ð¿Ð¾Ñ.
Я ÑÑиÑаÑ, ÑÑо на данном ÑÑапе пÑиложение «ÐдÑеÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°Â» ÑабоÑÐ°ÐµÑ Ñ Ð¾ÑоÑо. Ðно вÑполнÑÐµÑ Ñвои неÑложнÑе ÑÑнкÑии и ÑÐ¼ÐµÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Â«Ð½Ð° леÑÑ» по запÑоÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. Ðно пÑоÑÑое â и ÑÑо ÑÑÑÑ Ð»Ð¸ не Ñамое главное. Ðо еÑÑÑ ÐµÑе доÑÑаÑоÑно аÑпекÑов, о коÑоÑÑÑ ÑÑÐ¾Ð¸Ñ Ð·Ð½Ð°ÑÑ Ð¿Ñи ÑазÑабоÑке более ÑложнÑÑ Ð¸Ð½ÑеÑнеÑ-пÑиложений. ÐÑ ÑаÑÑмоÑÑим Ð¸Ñ Ð² ÑледÑÑÑÐ¸Ñ ÑÑаÑÑÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑеÑии. LXF