ãJavaãJava Servlet ææ¯ç®ä»
Java å¼å人åå ¼å¹è®å¸ Roy Miller å°æä»¬ç°æç servlet ä»ç»èµæä¿®æ¹æäºè¿ç¯æäºå¦ä¹ çå®ç¨æç¨ãRoy å°ä»ç»å¹¶è§£é servlet æ¯ä»ä¹ï¼å®ä»¬æ¯å¦ä½å·¥ä½çï¼å¦ä½ä½¿ç¨å®ä»¬æ¥å建æ¨è½å¤æ³åå°çä»»æå¤æåº¦ç Web åºç¨ç¨åºï¼ä»¥åä½ä¸ºä¸åä¸ä¸ç¼ç¨äººåï¼æ¨å¦ä½æè½æææå°ä½¿ç¨ servletã
Roy W. Miller ([email protected]), ç¬ç«ç软件å¼åè¾ å¯¼åãç¨åºååä½è , RoleModel Software
2004 å¹´ 12 æ 20 æ¥
å¼å§ä¹å
å ³äºæ¬æç¨
卿¨æå欢ç Web æµè§å¨ä¸ï¼æ¨æé 读ç页颿¯å¦ä½åºç°çå¢ï¼å½ç»å½å°æ¨æå欢ç Web ç«ç¹æ¶ï¼è¯¥ Web ç«ç¹å¦ä½ç¥éç»å½çç¨æ·æ¯æ¨ï¼è Web é¶å®ååå¦ä½æ¥åæ¨çå¨çº¿è®¢è´å¢ï¼è¿äºåè½é½æ¯å¯è½çï¼å 为å¨è¿äºåºæ¯çèåï¼è¿è¡äºæå¡å¨ä¸ç代ç å°å¨ Web ä¼è¯ä¸ä¸æ¨è¿è¡äº¤äºï¼éè¿è¯¥è¿ç¨è®¿é®å·²åå¨çä¿¡æ¯ï¼å¹¶ç»å¸¸å¨ä¸ä¸ªæå¤ä¸ª Web 页é¢ä¸å±ç¤ºå¨æä¿¡æ¯ãå¨ Java è¯è¨ä¸çä¸ï¼è¿äºåè½çæ ¸å¿é¨åæ¯ç± servletæä¾çãæ¬æç¨çç®çå°±æ¯åæ¨ä»ç» servletãæä¸å°æè¿° servlet æ¯ä»ä¹ï¼å®ä»¬æ¯å¦ä½å·¥ä½çï¼æ¨å¯ä»¥å¦ä½ä½¿ç¨å®ä»¬æ¥å建æ¨è½å¤æ³åå°çä»»æå¤æåº¦ç Web åºç¨ç¨åºï¼ä»¥åä½ä¸ºä¸åä¸ä¸ç¼ç¨äººåï¼æ¨å¦ä½æè½æææå°ä½¿ç¨ servletã
æ¬æç¨çå 容æ¯ä¸ºä¸çæï¼æè åªæ¯ç¥å¾®çæ servlet ç Java ç¼ç¨äººååå¤çãæ¬æç¨å宿¨å¯¹äºä¸è½½åå®è£ 软件以å Java è¯è¨ï¼å建类ãå¯¼å ¥ç±»çï¼æä¸è¬æ§çäºè§£ï¼ä½å¹¶ä¸å宿¨å·²ç»äºè§£ servletãæ¬æç¨å æ¬ä¸ä¸ªè¯´æ servlet åºæ¬æ¦å¿µçç®åä¾åï¼ä»¥åä¸ä¸ªæ¶åæ´å¤å 容çä¾åï¼å®è¯´æå¦ä½å¨å°åçåå管çç¨åºä¸æ´å¤æå°ä½¿ç¨ servletã
æ¬æç¨çéç¨å¯¹è±¡
妿æ¨å·²ç¼å Web åºç¨ç¨åºå¤å¹´ï¼é£ä¹æ¬æç¨å¯è½ä¸é忍ã妿æ¨ä¸ç¥é servlet æ¯ä»ä¹ï¼æè åªæ¯ç¥æä¸äºï¼é£ä¹è¯·æ¨ç»§ç»è¯»ä¸å»ãè½ç¶æ¬æç¨æå å«çåªæ¯ servlet çé¨åå 容ï¼ä½å®æ¯ä¸ç¯å¾å¥½çå ¥é¨ä»ç»ã
ä¸è¿ï¼æ¨åºè¯¥é常äºè§£ Java ç¼ç¨çåºç¡ç¥è¯ã使¯ï¼å¦ææ¨è¿æ²¡æå®å ¨è¾¾å°è¿äºè¦æ±ï¼é£ä¹è¯·ä»é è¯»ææ°åç Java ç¼ç¨ç®ä» æç¨å¼å§ã
å·¥å ·å代ç
为äºè¿è¡æ¬æç¨ä¸çä¾åæç¤ºä¾ä»£ç ï¼è³å°éè¦å¨æºå¨ä¸å®è£ JDK 1.4.2 ææ´é«çæ¬ï¼ä»¥å Eclipse IDEãæä»¬å°ä»ç»å®è£ ç¨äº Eclipse ç Tomcat æä»¶çæ´ä¸ªè¿ç¨ï¼è¿å°å 许æ¨å¾å®¹æå°å¼å servlet åºç¨ç¨åºã
æ¬æç¨ä¸çææä»£ç 示ä¾é½å¨ Windows XP å¹³å°ä¸ç¨ J2SE 1.4.2 è¿è¡äºæµè¯ï¼ä½å¿ é¡»ä½¿ç¨ J2SE 1.4.1 æè çè³æ¯ 5.0 çæ¬ï¼å¹¶ä¸ä¸å¯¹å®ä»¬è¿è¡ä¿®æ¹ï¼å®ä»¬æä¼å·¥ä½ã
è¦å®è£ Tomcatï¼åéè¦è¿å ¥ Jakarta ç Web ç«ç¹ï¼è¯·åé åèèµæï¼ï¼å¹¶ä¸è½½äºè¿å¶çæ¬ç Tomcat 5.0.28ï¼ç¼åæ¬æç¨æ¶ï¼è¿æ¯å¹é J2SE 1.4.2 çææ°çæ¬ï¼ãé Windows å®è£ ç¨åºä¸èµ·æä¾çå ä¼ä½¿è¯¥å¹³å°ä¸çå®è£ è½»èæä¸¾å°å®æãæç § readme æä»¶ä¸ç说æè¿è¡å®è£ ï¼æ¨å°é¡ºå©å®æè¿é¡¹æä½ã
为äºå®è£ ç¨äº Eclipse ç Tomcat æä»¶ï¼éè¦è¿å ¥ Sysdeo ç Web ç«ç¹ï¼è¯·åé åèèµæ ï¼ï¼å¹¶ä¸è½½è¯¥æä»¶ç zip æä»¶ï¼ç¼åæ¬æç¨æ¶ï¼è¯¥æä»¶æ¯ tomcatPluginV3.zipï¼ãç¶ååªè¦å°ä¹è§£åè³ plugins ç®å½ï¼å¹¶æç §ä¸è½½é¡µé¢åºé¨ç说æå®è£ 该æä»¶å³å¯ã为äºç¡®ä¿è¿ä¸ªæä»¶æ£å¸¸å·¥ä½ï¼è¯·é 读æä¸ºç®åç HelloWorld servlet 设置âæç¨âï¼Sysdeo 页é¢åºé¨æå ¶é¾æ¥ï¼è³äºç´æ¥é¾æ¥ï¼è¯·åé åèèµæï¼ã
䏿¦å®è£ äº Tomcat åå ¶æä»¶ï¼å°±å¯ä»¥åå¤å¼å§æ¬æç¨äºã
servlet ç®ä»
servlet çä½ç¨
å½ä½¿ç¨äº¤äºå¼ Web ç«ç¹æ¶ï¼æ¨æçå°çææå 容齿¯å¨æµè§å¨ä¸æ¾ç¤ºçãå¨è¿äºåºæ¯èåï¼æä¸ä¸ª Web æå¡å¨æ¥æ¶ä¼è¯ 䏿¥èªäºæ¨ç请æ±ï¼å¯è½è¦åæ¢å°å ¶ä»ä»£ç ï¼å¯è½ä½äºå ¶ä»æå¡å¨ä¸ï¼æ¥å¤ç该请æ±åè®¿é®æ°æ®ï¼å¹¶çæå¨æµè§å¨ä¸æ¾ç¤ºçç»æã
servlet å°±æ¯ç¨äºè¯¥è¿ç¨çç½å®ï¼gatekeeperï¼ãå®é©»çå¨ Web æå¡å¨ä¸ï¼å¤çæ°æ¥ç请æ±åè¾åºçååºãå®ä¸è¡¨ç¤ºæ å ³ï¼å®é ä¸ä¹ä¸å®åºè¯¥ä¸è¡¨ç¤ºæå ³ãæ¨å¯ä»¥ä½¿ç¨ servlet ç¼åä¸ä¸ªæµï¼å°å 容添å å° Web 页é¢ä¸ï¼ä½é£é常ä¹ä¸æ¯ä¸ä¸ªå¥½åæ³ï¼å ä¸ºå®æé¼å±è¡¨ç¤ºä¸ä¸å¡é»è¾çæ··åçå¾åã
servlet çæ¿ä»£å
servlet 䏿¯æå¡äº Web 页é¢çæä¸æ¹å¼ã满足该ç®ççææ©ææ¯ä¹ä¸æ¯å ¬å ±ç½å ³æ¥å£ï¼CGIï¼ï¼ä½é£æ ·å°±è¦ä¸ºæ¯ä¸ªè¯·æ±æ´¾çä¸åçè¿ç¨ï¼å èä¼å½±åæçãè¿æä¸ç¨æå¡å¨æ©å±ï¼å¦ Netscape Server APIï¼NSAPIï¼ï¼ä½é£äºé½æ¯å®å ¨ä¸ç¨çãå¨ Microsoft çä¸çéï¼ææ´»å¨æå¡å¨é¡µé¢ï¼ASPï¼æ åãservlet 为ææè¿äºæä¾äºä¸ä¸ªæ¿ä»£åï¼å¹¶æä¾äºä¸äºå¥½å¤ï¼
- å®ä»¬ä¸ Java è¯è¨ä¸æ ·æ¯ä¸å¹³å°æ å ³çã
- å®ä»¬å 许æ¨å®å ¨è®¿é®æ´ä¸ª Java è¯è¨ APIï¼å æ¬æ°æ®è®¿é®åºï¼å¦ JDBCï¼ã
- 大夿°æ åµä¸ï¼å®ä»¬å å¨å°æ¯ CGI æ´é«æï¼å 为 servlet ä¸ºè¯·æ±æ´¾çæ°ç线ç¨ï¼èéä¸åçè¿ç¨ã
- å¯¹äº servelet æä¸ä¸ªå¹¿æ³çè¡ä¸æ¯æï¼å æ¬ç¨äºææµè¡ç Web ååºç¨ç¨åºæå¡å¨ç容å¨ã
servlet æ¯å¯¹ä¸ä¸ç¼ç¨äººåå·¥å ·ç®±ç强大补å ã
ä½ä»ä¹æ¯ servletï¼
ä½ä¸ºä¸åä¸ä¸ç¼ç¨äººåï¼æ¨ç¢°å°ç大夿° Java servlet 齿¯ä¸ºååº Web åºç¨ç¨åºä¸ä¸æä¸ç HTTP 请æ±è设计çãå æ¤ï¼javax.servlet
åjavax.servlet.http
å
ä¸ç¹å®äº HTTP çç±»æ¯æ¨åºè¯¥å
³å¿çã
å¨å建ä¸ä¸ª Java servlet æ¶ï¼ä¸è¬éè¦åç±» HttpServlet
ã该类ä¸çæ¹æ³å
许æ¨è®¿é®è¯·æ±åååºå
è£
å¨ï¼wrapperï¼ï¼æ¨å¯ä»¥ç¨è¿ä¸ªå
è£
卿¥å¤ç请æ±åå建ååºã
å½ç¶ï¼HTTP åè®®ä¸æ¯ç¹å®äº Java çãå®åªæ¯ä¸ä¸ªè§èï¼å®ä¹æå¡è¯·æ±åååºç大è´å¼æ ·ãJava servlet ç±»å°é£äºä½å±çç»æå
è£
å¨ Java ç±»ä¸ï¼è¿äºç±»æå
å«çä¾¿å©æ¹æ³ä½¿å
¶å¨ Java è¯è¨ç¯å¢ä¸æ´æäºå¤çãæ£å¦æ¨æ£ä½¿ç¨çç¹å® servlet 容å¨çé
ç½®æä»¶ä¸æå®ä¹çï¼å½ç¨æ·éè¿ URL ååºä¸ä¸ªè¯·æ±æ¶ï¼è¿äº Java servlet 类就å°ä¹è½¬æ¢æä¸ä¸ª HttpServletRequest
ï¼å¹¶åéç» URL ææåçç®æ ã彿å¡å¨ç«¯å®æå
¶å·¥ä½æ¶ï¼Java è¿è¡æ¶ç¯å¢ï¼Java Runtime Environmentï¼å°±å°ç»æå
è£
å¨ä¸ä¸ª HttpServletResponse
ä¸ï¼ç¶åå°å HTTP ååºéåç»ååºè¯¥è¯·æ±çå®¢æ·æºãå¨ä¸ Web åºç¨ç¨åºè¿è¡äº¤äºæ¶ï¼é常ä¼ååºå¤ä¸ªè¯·æ±å¹¶è·å¾å¤ä¸ªååºãææè¿äºé½æ¯å¨ä¸ä¸ªä¼è¯è¯å¢ä¸ï¼Java è¯è¨å°ä¹å
è£
å¨ä¸ä¸ªHttpSession
对象ä¸ãå¨å¤çååºæ¶ï¼æ¨å¯ä»¥è®¿é®è¯¥å¯¹è±¡ï¼å¹¶å¨å建ååºæ¶åå
¶æ·»å äºä»¶ã宿ä¾äºä¸äºè·¨è¯·æ±çè¯å¢ã
容å¨ï¼å¦ Tomcatï¼å°ä¸º servlet 管çè¿è¡æ¶ç¯å¢ãæ¨å¯ä»¥é 置该容å¨ï¼å®å¶ J2EE æå¡å¨ç工使¹å¼ï¼è䏿¨å¿ é¡» é ç½®å®ï¼ä»¥ä¾¿å° servlet æ´é²ç»å¤é¨ä¸çãæ£å¦æä»¬å°çå°çï¼éè¿è¯¥å®¹å¨ä¸çåç§é ç½®æä»¶ï¼æ¨å¨ URLï¼ç±ç¨æ·å¨æµè§å¨ä¸è¾å ¥ï¼ä¸æå¡å¨ç«¯ç»ä»¶ä¹é´æå»ºäºä¸åº§æ¡¥æ¢ï¼è¿äºç»ä»¶å°å¤çæ¨éè¦è¯¥ URL 转æ¢ç请æ±ãå¨è¿è¡åºç¨ç¨åºæ¶ï¼è¯¥å®¹å¨å°å 载并åå§å servletï¼ç®¡çå ¶çå½å¨æã
å½æä»¬è¯´ servlet å ·æçå½å¨ææ¶ï¼åªæ¯æå¨è°ç¨ servlet æ¶ï¼äºæ æ¯ä»¥ä¸ç§å¯é¢è§çæ¹å¼åççãæ¢è¨ä¹ï¼å¨ä»»ä½ servlet ä¸åå»ºçæ¹æ³æ»æ¯æç¸åçæ¬¡åºè¢«è°ç¨çãä¸é¢æ¯ä¸ä¸ªå ¸ååºæ¯ï¼
- ç¨æ·å¨æµè§å¨ä¸è¾å ¥ä¸ä¸ª URLãWeb æå¡å¨é ç½®æä»¶ç¡®å®è¯¥ URL æ¯å¦æåä¸ä¸ªç±è¿è¡äºæå¡å¨ä¸ç servlet å®¹å¨æç®¡çç servletã
- å¦æè¿æ²¡æå建该 servlet çä¸ä¸ªå®ä¾ï¼ä¸ä¸ªåºç¨ç¨åºåªæä¸ä¸ª servlet å®ä¾ï¼ï¼é£ä¹è¯¥å®¹å¨å°±å 载该类ï¼å¹¶å°ä¹å®ä¾åã
- 该容å¨è°ç¨ servlet ä¸ç
init()
ã - 该容å¨è°ç¨ servlet ä¸ç
service()
ï¼å¹¶å¨å è£ çHttpServletRequest
åHttpServletResponse
ä¸è¿è¡ä¼ éã - 该 servlet é常访é®è¯·æ±ä¸çå ç´ ï¼ä»£è¡¨å ¶ä»æå¡å¨ç«¯ç±»æ¥æ§è¡æè¯·æ±çæå¡å¹¶è®¿é®è¯¸å¦æ°æ®åºä¹ç±»çèµæºï¼ç¶å使ç¨è¯¥ä¿¡æ¯å¡«å ååºã
- 妿æå¿
è¦ï¼å¨ servlet çæç¨çå½ç»ææ¶ï¼è¯¥å®¹å¨ä¼è°ç¨ servlet ä¸ç
destroy()
æ¥æ¸ é¤å®ã
å¦ä½âè¿è¡âservlet
âè¿è¡âservlet å°±åè¿è¡ Java ç¨åºä¸æ ·ã䏿¦é ç½®äºå®¹å¨ï¼ä½¿å®¹å¨äºè§£ servletï¼å¹¶ç¥éæäº URL ä¼è´ä½¿å®¹å¨è°ç¨è¯¥ servletï¼è¯¥å®¹å¨å°±å°æç §é¢å®ç次åºè°ç¨çå½å¨ææ¹æ³ãå æ¤ï¼è¿è¡ servlet ä¸»è¦æ¯ææ£ç¡®é ç½®å®ï¼ç¶åå°æµè§å¨æåæ£ç¡®ç URLãå½ç¶ï¼servlet ä¸çä»£ç æ£æ¯åç°æè¶£çä¸å¡é»è¾çå°æ¹ãæ¨ä¸å¿ æ å¿ä½å±äºä»¶çè¿å±ï¼é¤éåçæç§é误ã
ä¸å¹¸çæ¯ï¼ç»å¸¸ä¼åç ä¸äºä»¤äººæ²®ä¸§çé误ï¼å°¤å ¶æ¯å¨è®¾ç½® servlet æ¶ãè´ä½¿ servlet åºç¨ç¨åºä»¤äººå¤´ççæå¤§åå å°±æ¯é ç½®æä»¶ãæ¨æ æ³ææå°è°è¯å®ä»¬ãæ¨åªè½éè¿è¯éæ³å¼æ¸ æ¥è¿äºéè¯¯ï¼æ¯å¦å°½åç ´è¯å¯è½ä¼æä¸ä¼å¨æµè§å¨ä¸çå°çéè¯¯æ¶æ¯ã
ä¸ä¸ªç®åç servlet
è¿ä¸ªç®åç servlet è¦å®æçä»»å¡
第ä¸ä¸ª servlet å°å®ææå°éçå·¥ä½ï¼ä½æ¯å®å°æ´é²ç¼å servlet çææåºæ¬è¦æ±ãå®å°å¨æµè§å¨çªå£ä¸è¾åºä¸äºç®åçæ æ ¼å¼ææ¬ï¼
Hello, World!
å¨å建该 servlet æ¶ï¼æä»¬å°å¯ä»¥è¯å® Tomcat åºèµ·çä½ç¨ï¼å¹¶è¯å®æä»¬å¯ä»¥æç §è®¡åä½¿ç¨ Eclipse å建 Web 项ç®ãæä»¬è¿å°éåå¨ Tomcat servlet 容å¨ä¸é ç½® Web åºç¨ç¨åºçæ´ä¸ªè¿ç¨ï¼å¦ææ¨ç¢°å·§å¨ XML æä»¶ä¸ç¯äºä¸ä¸ªå°é误ï¼é£ä¹æ¨å¯è½ä¼å¯¹è¿ä¸ªè¿ç¨æå ´è¶£ãä¸è¦æ å¿ï¼è³å°å¨æ¬æç¨ä¸ï¼Tomcat ä¼ä¸ç´åæ¥èµ·ä½ç¨ã
å¨è¿ç¬¬ä¸ä¸ªä¾åä¸ï¼æä»¬ä¼å°è¾åºç´æ¥ä» servlet åå ¥æµè§å¨ä¸ã卿¬æç¨ä¸ï¼è¿å°æ¯æä»¬æå䏿¬¡ä½¿ç¨è¯¥æ¹æ³ã
设置 Eclipse
æä»¬éè¦æ§è¡å°éå·¥ä½ï¼ç¡®ä¿å¯ä»¥å¨ Eclipse ä¸å建并管ç Tomcat 项ç®ã
妿已ç»å®è£ äºè¯¥æä»¶ï¼ä» ä» éè¿å° Sysdeo zip æä»¶è§£åè³ eclipse/plugins ç®å½ï¼ï¼é£ä¹æ¨åºè¯¥å¯ä»¥å¨å·¥å ·æ ä¸è·å¾ä¸äºéå çèå项åå·¥å ·ãå¦å¾ 1 ä¸æç¤ºã
å¾ 1. Tomcat æä»¶åè½
å·¥å ·æ æé®å 许æ¨å¯å¨ã忢åéå¯ Tomcatï¼å½éè¦è¿è¡ servlet æ¶ï¼å¿ é¡»è¿è¡è¿äºå·¥ä½ã
为äºå 许æä»¬å建 Tomcat 项ç®ï¼è¿äºé¡¹ç®å ·æåéçå¸å±ï¼æå©äº Tomcat çé¨ç½²ï¼æä»¬å¿ é¡»åè¯ Eclipse ä¸äºäºæ ã妿åå»Window>Preferencesï¼é£ä¹æ¨å°±å°çå°æ åç Eclipse å好设å®å¯¹è¯æ¡ï¼å ¶å表åºé¨æä¸ä¸ªå为 Tomcat çæ°ç±»å«ãåå»å®å°åæ¨å±ç¤º Tomcat å好设å®ç主页ï¼åè§å¾ 2ï¼ã
å¾ 2. Tomcat çå好设å®
éæ© Version 5.xï¼å¹¶æå® Tomcat home çä½ç½®ãï¼æçç³»ç»ä¸ï¼è¯¥ä½ç½®æ¯ C:\Program Files\Apache Software Foundation\Tomcat 5.0ï¼ä½æ¨çå¯è½ä¼ä¸åï¼ãéæ© Context files 为å å®¹å£°ææ¨¡å¼ãç¶åï¼åå» JVM Settings 对åç±»å«è¿è¡å好设å®ï¼å¹¶ç¡®ä¿å¨è¯¥é¡µé¡¶é¨ç䏿èåä¸éæ©ä¸ä¸ªææç JREãæ¨å¯ä»¥ä½¿ç¨é»è®¤ç JREï¼ä¹å¯ä»¥æåæ¨ç JDKï¼å¹¶å¨ Java>Installed JREs å好设å®é¡µé¢ä¸åè¯ Eclipse è¿ä¸ª JDKã
宿è¿äºæä½åï¼è¯·åå» OKãç°å¨ï¼æä»¬åå¤å建 Tomcat 项ç®ã
å建 Tomcat 项ç®
Tomcat æä»¶ä½¿ Web å¼åäººåæ´æäºä½¿ç¨ Tomcatã妿åå» File>New>Projectï¼å¹¶å±å¼å¯¹è¯æ¡ï¼åè§å¾ 3ï¼ä¸ç Java å导类å«ï¼é£ä¹æ¨ä¼å¨è¯¥å¯¹è¯æ¡ä¸çå°ä¸ç±»æ°ç项ç®å导ï¼Tomcat 项ç®ã
å¾ 3. æ°å»º Tomcat 项ç®
åå» Nextï¼å°è¯¥é¡¹ç®å½å为âHelloWorldâï¼ç¶ååå» Finishãå¦æå¨ Eclipse ä¸åæ¢è³ Java éè§å¾ï¼é£ä¹å°±å¯ä»¥çå°è¿ä¸ªæ°é¡¹ç®ãå®æå ·æçç»æå°æå©äºé¨ç½² Tomcatï¼åè§å¾ 4ï¼ã
å¾ 4. Tomcat 项ç®ç»æ
æ£å¦æä»¬ç¨åå°çå°çï¼workãWEB-INF å WEB-INF/src ç®å½ç¹å«éè¦ã
æµè¯ Tomcat
åå» Start Tomcat å·¥å ·æ æé®ãå½ Tomcat å°è¯å¯å¨æ¶ï¼Eclipse å°ç¨ä¿¡æ¯è¯å¥æ´æ°æ§å¶å°ã妿å®å¯å¨äºï¼å¹¶ä¸æ²¡ææ¾ç¤ºä»»ä½å æ è·è¸ªï¼é£ä¹æ¨å·²ä½å¥½åå¤ã妿çå°å æ è·è¸ªï¼åäºæ ä¼éº»ç¦ä¸äºãä¸å¹¸çæ¯ï¼è¯éæ³ï¼éè¿æ¨ç好æå Googleï¼æ¯è·è¸ªæåçé误çæä¸æ¹æ³ãå¥½æ¶æ¯æ¯ï¼å¯ä»¥è¿è¡å·æ°ï¼æ°ç项ç®ï¼å¦æä»¬åæå建çé£ä¸ªï¼å°æ¶é¤åç严éé误çå¯è½æ§ã
å½ Tomcat å¯å¨æ¶ï¼æ¨ä¸ä¼çå°ä»»ä½ä¸è¥¿ï¼é¤äºæ§å¶å°å 容ï¼ãæ¨å¿ é¡»å 以æµè¯ä»¥ç¡®ä¿å®è½å·¥ä½ã妿æ¨éè¦ä¸ä¸ªå¿«éæç¤ºï¼å°±è®¾æ³æå¼æµè§å¨å¹¶è¾å ¥ä¸å URLï¼
http://localhost:8080/
妿ä¸åæ£å¸¸ï¼æ¨å°±å°çå°ä¸ä¸ªç²¾è´ç Tomcat 欢è¿é¡µé¢ï¼æä¸ä¸ªåä¸¾äº Tomcatâå¯å¨å 容âçç®å½ãä¸å¿ å ³æ³¨ç¬¬äºä¸ªã彿们è¿è¡ç¬¬ä¸ä¸ª servlet æ¶ï¼æä»¬å°è¯æ Tomcat å¨å·¥ä½ã
声æç±»
servlet æ¯ä¸ä¸ªç±»ï¼å æ¤ï¼è®©æä»¬å建ä¸ä¸ªåºæ¬çãå¨ Eclipse ä¸ï¼è¦å¨ HelloWorld 项ç®ä¸å建ä¸ä¸ªå为 HelloWorldServlet
çç±»ã该类å¦ä¸æç¤ºï¼
public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.println("Hello, World!"); writer.close(); } }
è¾å ¥è¿äºä»£ç ï¼ç¶åæ Ctrl+Shift+O ç»ç»ä¸ä¸å¯¼å ¥è¯å¥ãEclipse å°å 许æ¨å¯¼å ¥ä¸åç±»ï¼
java.io.IOException
java.io.PrintWriter
javax.servlet.ServletException
javax.servlet.HttpServlet
javax.servlet.HttpServletRequest
javax.servlet.HttpServletResponse
请注æï¼æä»¬å° HttpServlet
ä½ä¸ºåç±»ï¼å¹¶éè½½äº service()
æ¹æ³ãservice()
æ¹æ³æ¯ servlet 弿å°å¨ servlet çå½å¨æä¸è°ç¨çæåºæ¬çå¤çæ¹æ³ã宿¥æ¶ä¸ä¸ªè¯·æ±å
è£
å¨åä¸ä¸ªååºå
è£
å¨ï¼èæä»¬å¯ä»¥å¨æä»¬çæ¹æ³ä¸è®¿é®å®ä»¬ãä½å¨è¿éï¼æä»¬ä¸éè¦è¿æ ·åï¼å 为æä»¬åªæ¯è¿è¡ä¸äºåºæ¬æä½æ¥ä½¿ servlet å·¥ä½ãæä»¬å¯è½éè½½äº doGet()
ï¼ä½æ¯ service()
尿便们æéè¦çä¸è¥¿ã
卿们ç service()
æ¹æ³ä¸ï¼æä»¬å¨ response
å
è£
å¨ä¸è°ç¨ getWriter()
ï¼ä»¥ä¾¿è½å¤å°ä¸ä¸²æåè¾åºå°è¾åºæµä¸ãç¶åï¼æä»¬å
³éè¾åºæµãè¿å¨çæè¾åºç servlet 䏿¯å¾å
¸åçï¼æ¨æ§è¡éè¦æ§è¡çé»è¾ï¼ç¶ååå
¥è¾åºæµã
é ç½® Web åºç¨ç¨åº
Java ç¼ç¨å·¥ä½å°±å®æäºï¼ä½æ¯ç°å¨ï¼æä»¬è¿å¿ 须对é ç½®æä»¶è¿è¡å¿ è¦çå·¥ä½ãå¨æçæ¥ï¼è¿æ¯ Web å¼åçæå¤§é¾ç¹ã幸好ï¼è¯¥ Tomcat æä»¶åæ äºé¨åéæ ã
å³å» HelloWorld 项ç®ï¼å¹¶éæ© Propertiesã鿩屿§ç Tomcat ç±»å«ãæ¨å°çå°è¯¥é¡¹ç®çç¯å¢ï¼å¦ä¸æç¤ºï¼
/HelloWorld
ç°å¨ï¼å»æ¥çæ¨ Tomcat åç®å½ä¸çæä»¶ç³»ç»ãè½¬è³ conf/Catalina/localhost åç®å½ãå¨é£éï¼æ¨å°çå°ä¸ç» XML æä»¶ãå ·ä½å°è¯´ï¼æ¨å°çå°ä¸ä¸ª HelloWorld.xml æä»¶ãæå¼å®ã该æä»¶ä¸º Tomcat å®ä¹äºä¸ä¸ª Web åºç¨ç¨åºè¯å¢ã
<Context path="/HelloWorld" reloadable="true" docBase="path to your project\HelloWorld" workDir="path to your project\HelloWorld\work" />
å½ Tomcat å¯å¨æ¶ï¼å®è¯»åè¿äºä¸ä¸ææä»¶ï¼åè¯ servlet 容å¨å¨åªéæ¾æ¨çç±»ï¼å æ¬ servletï¼ã妿å顾å è½½ Tomcat æ¶åæ§å¶å°ååºçä¿¡æ¯ï¼INFOï¼è¯å¥ï¼å°±ä¼çå°è¯¥å表ä¸ä¸ Web åºç¨ç¨åºä¸ä¸ææå ³çä¿¡æ¯ã
å¨ Tomcat ä¸é ç½® Web åºç¨ç¨åºçæå䏿¥æ¯å建 web.xml æä»¶ï¼éè¦å°è¯¥æä»¶æ¾å¨é¡¹ç®ç WEB-INF ç®å½ä¸ãï¼æ³¨æï¼ä¸è¦ å°å ¶æ¾å¨ WEB-INF/src ç®å½ä¸ ââ 该ç®å½å°å å«å ¶ä»ä¸è¥¿ãï¼å¯¹äºè¿ä¸ªç®åä¾åï¼è¯¥æä»¶å°å¦ä¸æç¤ºï¼
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
该æä»¶å Tomcat å®ä¹äº Web åºç¨ç¨åºã该æä»¶ä¸ç servlet-name
å
ç´ å½åäºæä½¿ç¨ç servletãservlet-class
å
ç´ å°è¯¥åç§°æ å°å°ä¸ä¸ªç¹å®çç±»ï¼è¯¥ç±»å®ä¹äº servletï¼å³ HelloWorldServlet
ï¼æ¬ç¤ºä¾ä¸ï¼ãservlet-mapping
å
ç´ åè¯ Tomcat /hello
ï¼æ¬ä¾ä¸ï¼å½¢å¼ç URL æ 尿们ç servletï¼è¿æ¯ç±æ å°ç servlet ç±»å®ä¹çã
䏿¦è®¾ç½®å¥½è¯¥æä»¶ï¼å°±å¯ä»¥å¯å¨ Tomcat å¹¶è½çå° servlet å è½½ã
è¿è¡ servlet
æ£å¦å颿å°çï¼âè¿è¡ servletâä» ä» å æ¬å¯å¨ Tomcatï¼ä»¥åå° Web æµè§å¨æåå°è°ç¨å®ç URLãéè¿éå½çå·¥å ·æ æé®å¯å¨ Tomcatï¼å¦æå®å·²ç»è¿è¡ï¼åéè¦åæ¢å¹¶éæ°å¯å¨å®ï¼ã䏿¦ Tomcat ç»æå¯å¨è¿ç¨ï¼å®ä¼æå¼æµè§å¨å¹¶è¾åºä¸å URLï¼
http://localhost:8080/HelloWorld/hello
æ¨å°å¨æµè§å¨çªå£ä¸çå°ä¸æ¡å¥½æ¶æ¯ã
å¨ä½ servlet
ç®ä»
å¨ Web å¼ååæï¼è®¸å¤ä¸ä¸ç¼ç¨äººåé½ä¸å¾ä¸å¼æ¸ å½ä»ä»¬ç»§ç»æ¶ï¼å¦ä½è¾å¥½å°ä½¿ç¨ servletãææ®éçç»æä¹ä¸å°±æ¯å¨æå¡å¨ä¸æ´é² servletãæ¯ç§ç±»åç请æ±é½æä¸ä¸ªã
è¿å¾å¿«å°±åå¾ä»¤äººå¤´çï¼å æ¤ï¼ç¼ç¨äººåå¼å§å¨å ¶ servlet ä¸å 嫿¡ä»¶é»è¾ä½¿ä¹æ´å ·éåºæ§ï¼ä»¥ä¾¿å¤çå¤ç§ç±»åç请æ±ã䏿®µæ¶é´åï¼è¿ä¹äº§çäºä¸äºç³ç³ç代ç ãæä¸ç§æ´å¥½çæ¹å¼ï¼ç§°ä½å¨ä½ servletï¼action servletï¼ï¼å®å®ç°äºå为模å 2 çæ¦å¿µãæ®æäºè§£ï¼è¯¥ææ³æ¯ç± David M. Gearyï¼å ³äºä»çæ´å¤ä¿¡æ¯ï¼è¯·åé åèèµæï¼é¦æ¬¡åå°çï¼ä½æ¯å®å·²ç»è¾å¥½çç¨äºæµè¡ç servlet åºä¸äºï¼ä¾å¦ Jakarta Struts 项ç®ã
å¨å¨ä½ servlet ä¸ï¼å¹¶æ²¡ææç¤º servlet è¡ä¸ºçæ¡ä»¶é»è¾ï¼èæ¯å
·æå¨ä½ï¼ç¼ç¨äººåå®ä¹çç±»ï¼ï¼servlet ææè¿äºç±»æ¥å¤çä¸åç±»åç请æ±ã大夿°æ
åµä¸ï¼è¿ä¸ªé¢å对象ï¼OOï¼çæ¹æ³è¦ä¼äºæ¥æå¤ä¸ª servletï¼æå¨ä¸ä¸ª servlet 䏿å¤ä¸ª if
æ¡ä»¶ã
æä»¬ç示ä¾å¨ä½ servlet æ§è¡çæä½
æä»¬ç示ä¾å¨ä½ servlet å°æ¯ä¸ä¸ªæç®åçãåºäºæµè§å¨çåºç¨ç¨åºçç½å®ï¼gatekeeperï¼ï¼è¯¥åºç¨ç¨åºå°å 许æä»¬å建ãåå¨ãæ¥ç以åå é¤ååå表项ãè¿äºè®°å½é¡¹çæ ¼å¼é½é常è¯å¥½ãæåï¼ä¸ºäºä½¿ç¨è¯¥åºç¨ç¨åºï¼ç¨æ·å°å¿ é¡»ç»å½å®ï¼ä½æ¯ï¼æä»¬ç¨åå°å¨ ç¨æ·åæ°æ® 䏿·»å è¿é¡¹åè½ã
设置该项ç®
å¨ Eclipse ä¸å建ä¸ä¸ªæ°ç Tomcat 项ç®ï¼å°±åæ¨ä¸º HelloWorld æåç䏿 ·ã请注æï¼é¡¹ç®åç§°å°±æ¯ servlet é»è®¤çä¸ä¸æå¼ï¼å æ¤ï¼å½è¾å ¥è®¿é® servlet ç URL æ¶ï¼å°ä½¿ç¨å®ã妿é ç½® Tomcat 使ç¨ä¸ä¸ææä»¶ï¼é£ä¹å®å°ä¸ºè¯¥é¡¹ç®èªå¨å建ä¸ä¸ªä¸ä¸æå¼ã
Eclipse è¿åºå建ä¸ä¸ªå ·ææ£ç¡®ç»æç项ç®ï¼å¹¶å¸¦æä¸åéè¦ç®å½ï¼
- WEB-INF
- WEB-INF/src
- work
第ä¸ä¸ªç®å½ï¼WEB-INFï¼åå¨éè¦çé ç½®æä»¶ï¼å ·ä½å°è¯´å°±æ¯ web.xml æä»¶ï¼æä»¬ç¨åå°è®¨è®ºå®ãå®è¿å¨ classes ç®å½ä¸å å«äºç¼è¯ç代ç ã第äºä¸ªç®å½ï¼WEB-INF/srcï¼åå¨ Java ç±»çæºä»£ç ã第ä¸ä¸ªç®å½ï¼workï¼å å« JavaServer Pagesï¼JSPï¼æä»¶çç¼è¯ä»£ç ï¼ä»£ç åçæ´æ¹ä¹åï¼æ¯å½æä»¬ç¬¬ä¸æ¬¡ç¹å» JSP 页颿¶ï¼Tomcat å°±ä¼ä¸ºæä»¬èªå¨å建è¿äºç¼è¯ä»£ç ï¼æä»¬å°å¨ä¸ä¸é¢æ¿ä¸è°è®ºæ´å¤ JSP ææ¯ï¼ã该项ç®çæ ¹ç®å½å 嫿æç JSP æºæä»¶ï¼ä»¥åæ°æ®åºæä»¶ã
请注æï¼æ¨å¯ä»¥å¨ Eclipse ç Resource è§å¾ä¸çå°è¯¥ç»æçææä¸è¥¿ï¼ä½æ¯å¨ Java Browsing è§å¾ä¸åªè½çå° WEB-INF/src å work ç®å½ã
ææè¿äºæä»¶é½å å«å¨æ¬æç¨æå æ¬ç contacts.jar æä»¶ä¸ï¼æå ³é¾æ¥ï¼è¯·åé åèèµæï¼ã为äºå¯¼å ¥å®ä»¬ï¼åªè¦å建ä¸ä¸ªæ°ç Tomcat 项ç®ï¼ç¶åå¯¼å ¥ contacts.jarï¼ä½¿ç¨ Import>Zip file é项ï¼å³å¯ãè¿å°ä¼å¨æ£ç¡®çä½ç½®ä¸äº§ç餿ºä»£ç ä¹å¤çæææä»¶ãæºä»£ç æç»ä¼å¨é¡¹ç®æ ¹ç®å½ç src ç®å½ä¸äº§çãå°è¯¥æä»¶å¤¹çå å®¹ç§»è³ WEB-INF/src ä¸ï¼æ¨å°±å®æäºææçåå¤å·¥ä½ã
表示
è¿æ¯ç«æ¯ä¸ç¯å ³äº servlet çæç¨ï¼å ä¹ä¸è¡¨ç¤ºæ å ³ãç¶èï¼è¥ä¸å¨å±å¹æå¤çå°ä¸äºç»æï¼æä»¬å®é ä¸å°±åªåç¥äºäºæ çé¨åå å®¹ãæ¨å½ç¶å¯ä»¥ç¼åæ ¹æ¬ä¸æ¶å表示ç servletï¼ä½æ¯å¤§å¤æ° Web åºç¨ç¨åºå¨æµè§å¨ä¸æ¾ç¤ºä¿¡æ¯ï¼è¿æå³çæ¨å¿ é¡»éæ©ä½¿ç¨ä¸ç§è¡¨ç¤ºæºå¶ãJavaServer Pages ææ¯å°±æ¯ä¸ç§å ¸åçå¤éæ¹æ¡ï¼å¹¶å¾å°äºå¹¿æ³éç¨ã
éè¿ JSP ææ¯ï¼æ¨å¯ä»¥åå»ºå¨æ Web 页é¢ãå®ä»¬æ¯æéæ HTMLï¼æå ¶ä»æ è®°ï¼å¦ XMLï¼å卿代ç å ç´ ï¼èæ£å¦ååæéå«çï¼å¨æä»£ç å ç´ å¯ä»¥å¨æå建å 容ãå¨å¹åï¼å¯ä»¥éè¿è¯¸å¦ Tomcat ä¹ç±»ç容å¨å° JSP 页é¢ç¼è¯æ servletï¼å³è½¬æ¢æ Java 代ç ï¼ãç¶èï¼æ¨å 乿°¸è¿ä¸å¿ å ³å¿è¿ä¸ç¹ãåªéè¦ç¥éåçäºä¸åæµç¨å³å¯ï¼
- ç¨æ·å¨æµè§å¨ä¸è¾å ¥ URLï¼J2EE servlet 容å¨å°è¯¥æµè§å¨æåä¸ä¸ª servletã
- servlet å®æå ¶å·¥ä½ï¼å¹¶å¨ä¼è¯ä¸è¾å ¥ä¿¡æ¯ï¼æè å¨ bean ä¸ï¼ååéç» JSP 页é¢ã
- JSP 代ç è½¬æ¢ bean å/æä¼è¯ä¸çä¿¡æ¯ï¼å¹¶å°ååºåéç»æµè§å¨ã
æ¨å¯ä»¥å¾å®¹æå°å建ç®åç JSP 页é¢ï¼åªéè¦å¨ Web åºç¨ç¨åºä¸è¿è¡å¾®å°çä¿®æ¹å³å¯ï¼å¹¶ä¸æ éä¸è½½é¢å¤ç代ç åºï¼å°±å¯ä»¥å¨ Tomcat ä¸è¿è¡å®ä»¬ï¼å æ¤ï¼æä»¬å°å¨è¿é使ç¨å®ä»¬ï¼å ³äº JSP ææ¯çæ´å¤è¯¦ç»ä¿¡æ¯ï¼è¯·åé åèèµæï¼ã
æä»¬ç Contacts åºç¨ç¨åºä¼æä¸ä¸ªä¸»è¦ç JSP 页é¢ï¼åä¸¾ç°æçååå¹¶æ·»å æ°çååãç¨åï¼æä»¬å°æ·»å ç¨äºç»å½åéåºé¡µé¢ã
éè¦çæ¯è®°å¾ JSP ææ¯åªæ¯ä¸ç§è¡¨ç¤ºéæ©ãè¿æå ¶ä»æ¹æ³ãåå°æå¤§æ¬¢è¿çä¸ç§æ¹æ³æ¯ Jakarta Velocity 模æ¿å ï¼è¯·åé åèèµæï¼ãJSP ææ¯åå¨ä¸ä¸ªä¸»è¦çä¸è¶³ï¼å¤æçãåè½ä¸°å¯çåºç¨ç¨åºå¾åäºéè¦æå ¶å¤æç JSP 页é¢ï¼å¦ææ³ä½¿é»è¾ä¸è¡¨ç¤ºåå¼ï¼é£ä¹è¿éè¦è¿è¡é¢å¤çæå¡å¨å·¥ä½æ¥å建å®å¶æ ç¾ãå¦ä¸ä¸ªä¸è¶³å°±æ¯ JSP ææ¯ç»å¸¸å¸¦æ¥äºæ æ³æå¶ç诱æï¼å°ä¸å¡é»è¾å表示混åï¼è¿å®¹æå¯¼è´éè¦ç¹éçç»´æ¤å·¥ä½çè弱系ç»ã
æ®æçæ¥ï¼JSP ææ¯å¸¸å¸¸æ¯ä¸ä¸ªé误çéæ©ï¼è Velocityï¼æè å ¶ä»æç§æ¨¡æ¿åæ¹æ³ï¼éå¸¸æ¯æ£ç¡®çãä½å¯¹äºæä»¬è¿ä¸ªç®åä¾åï¼JSP ææ¯å°èµ·ä½ç¨ï¼å¯ä»¥è¯´ææä»¬éè¦ä»ç»çæ¦å¿µãå¨è¿æ ·çç®åæ åµä¸ï¼å°ä¸ç¹ç¹é»è¾åä¸ç¹ç¹è¡¨ç¤ºæ··åæ¯å¯ä»¥æ¥åçãä½ä»ä¸ä¸çè§åº¦æ¥è¯´ï¼å¤æ°æ åµä¸ï¼è¿ç§åæ³æ¯ä¸ææºçï¼å³ä½¿è®¸å¤ç¼ç¨äººåé½è¿æ ·åã
web.xml æä»¶
为äºè®©æä»¬è½å¤ä½¿ç¨å°è¦å建ç JSP 页é¢ï¼æä»¬å¿ é¡»åè¯ Tomcat å¦ä½å¤ç该页é¢ãå æ¤ï¼æä»¬å¿ é¡»å¨ WEB-INF ç®å½ä¸å建ä¸ä¸ª web.xml æä»¶ãå¦ä¸æç¤ºï¼
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <servlet> <servlet-name>contacts</servlet-name> <servlet-class>com.roywmiller.contacts.model2.ContactsServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>contacts</servlet-name> <url-pattern>/index.htm</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>contacts</servlet-name> <url-pattern>*.perform</url-pattern> </servlet-mapping> <servlet> <servlet-name>jspAssign</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>logVerbosityLevel</param-name> <param-value>WARNING</param-value> </init-param> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jspAssign</servlet-name> <url-pattern>/*.jsp</url-pattern> </servlet-mapping> </web-app>
æä»¬ä¸º HelloWorldServlet
å建äºä¸ä¸ªåºæ¬ç web.xml æä»¶ï¼ä½æ¯å®é常å°ãéçåºç¨ç¨åºå徿´å 夿ï¼web.xml æä»¶ä¹ä¸å¾ä¸å徿´æºè½ã让æä»¬å¿«éåæè¯¥æä»¶ã
<servlet>
æ ç¾ä¸º servlet æå®ä¸ä¸ªå«åï¼æä»¬å°å¨è¯¥æä»¶çå«å¤ä½¿ç¨å®ãå®è¿åè¯ Tomcat å®ä¾ååªä¸ªç±»ï¼ä»¥ä¾¿å¨å
åä¸å建 servletã卿ç Eclipse å·¥ä½åºä¸ï¼æåå»ºäº com.roywmiller.contacts.model2
å
æ¥ä¿å该 servlet ç±»ãæ è®ºéè¦ä»ä¹ï¼é½å¯ä»¥è°ç¨æä»¬çå
ï¼ä½æ¯å° servlet çè·¯å¾å¿
é¡»å¹é
<servlet-class>
å
ç´ ä¸çå
容ãæä»¬å®ä¹ç第äºä¸ª servlet æ¯ä¸è½½ Tomcat æ¶é带çï¼æ¨ä¸å¿
ä¿®æ¹å®ãå®åªæ¯ JSP æ£å¨å¤çç servletã
<servlet-mapping>
åè¯ Tomcat å½æä¸ª URL å°è¾¾æå¡å¨æ¶ï¼æ§è¡åªä¸ª servletãæä»¬è¿éæä¸ä¸ªæ å°ã第ä¸ä¸ªå° Web æå¡å¨æ¥æ¾çé»è®¤é¡µé¢ï¼<index.htm>
ï¼æ å°å° servletã第äºä¸ªåè¯ Tomcat å°ä»¥ .perform
ç»å°¾ç URL æ å°å° servletã该形å¼ç URL å°åè¯ servlet å®ç°åªä¸ªå¨ä½ï¼ç¨åï¼æä»¬å°æ´è¯¦ç»å°è®¨è®ºå
¶å·¥ä½æ¹å¼ï¼ã第ä¸ä¸ªæ å°åè¯ Tomcat ä½¿ç¨ JSP servlet æ¥å¤ç JSP 页é¢ã
JSP 页é¢çç¨æ·è§å¾
卿们çç®åä¾åä¸ï¼æä»¬ä¸ä¼è±å¤ªå¤æ¶é´è°è®º JSP ææ¯ãJSP ææ¯å¯ä»¥ä½¿äºæ ç®åï¼ä¸ä¼é·å ¥ä¸è¬è¡¨ç¤ºçç»èä¸ï¼ç¹å«æ¯ä¸ä¼é·å ¥ JSP ææ¯ç»èä¸ãï¼æå ³çæ´å¤ä¿¡æ¯ï¼è¯·å次åé åèèµæãï¼æä»¬è¿ä¼å°ææäºæ æ¾ç½®å¨ä¸ä¸ªé¡µé¢ä¸ï¼å³ä½¿è¿æ ·åæäºä¸å¤ªç°å®ãè¿å°æå¤§ç¨åº¦å°åå°ä» ä» ä¸ºäºè¯´æå¦ä½ä½¿ç¨ servlet çéè¦æ¦å¿µèå¿ é¡»å建ç页颿°ã
æä»¬çæå页é¢å°æ¾ç¤ºååå表ï¼è¿å°æ¥èªäºä¸ä¸ªå å«äºè¯¥å表ç对象ãå®è¿å°å å«ä¸ä¸ªç¨äºæ·»å æ°ååç表åã该页å°å¦å¾ 5 æç¤ºã
å¾ 5. ååå表页é¢
è½ç¶å¹¶éä¸ä»¶èºæ¯ä½åï¼ä½è¯¥é¡µå¨é¡¶é¨æç §è¯å¥½çæ ¼å¼æ¾ç¤ºäºææååãæ¯ä¸ä¸ªé¡µé¢é½æ Delete 龿¥ï¼ç¨æ·å¯ä»¥åå»å®æ¥å é¤ç¹å®çååã该表åå å«åç§°åå°åå¼å段ï¼ä»¥åå ³äºååç±»åï¼æä»¬çç®å示ä¾ä¸æ¯ family æ acquaintanceï¼çåéæé®ãè¿ä¸ªç®å页é¢å°å 许æä»¬æ¢ç´¢å¦ä½å¨ servlet åºç¨ç¨åºä½¿ç¨ç®åçå¨ä½æ¡æ¶ãå®è¿å°è®©æä»¬æ¢ç´¢å¦ä½å¨ç¨æ·ä¼è¯æé´ä½¿ç¨è¯·æ±ï¼ä»¥å对 servlet 仿µè§å¨æ¥æ¶çå 容è¿è¡ååºã
ç°å¨ï¼æä»¬åå¤å建该页é¢ã
JSP 页é¢ç¼ç
ä¸é¢æ¯æä»¬ç JSP 页é¢ç代ç ï¼
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ page import="java.util.*" %> <%@ page import="com.roywmiller.contacts.model.*" %> <html> <head> <title>Contacts List 1.0</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style type="text/css"> body, table, hr { color: black; background: silver; font-family: Verdana, sans-serif; font-size: x-small; } </style> </head> <body> <jsp:useBean id="contacts" scope="session" class="com.roywmiller.contacts.model.ContactList"/> <h2>Contact List 1.0</h2> <hr size="2"/> <table frame="below" width="100%"> <tr> <th align="left"></th> <th align="left">Name</th> <th align="left">Street</th> <th align="left">City</th> <th align="left">State</th> <th align="left">Zip</th> <th align="left">Type</th> </tr> <% List list = contacts.getContacts(); for (Iterator i = list.iterator(); i.hasNext();) { Contact contact = (Contact)i.next(); %> <tr> <td width="100"><a href="removeContactAction.perform?id=<%= contact.getId()%>" >Delete</a></td> <td width="200"><%=contact.getFirstname()%> <%=contact.getLastname()%></td> <td width="150"><%=contact.getStreet()%></td> <td width="100"><%=contact.getCity()%></td> <td width="100"><%=contact.getState()%></td> <td width="100"><%=contact.getZip()%></td> <td width="100"><%=contact.getType()%></td> </tr> <% } %> </table> <br/> <br/> <br/> <fieldset> <legend><b>Add Contact</b></legend> <form method="post" action="addContactAction.perform"> <table> <tr> <td>First Name:<td> <td><input type="text" size="30" name="firstname"></td> </tr> <tr> <td>Last Name:<td> <td><input type="text" size="30" name="lastname"></td> </tr> <tr> <td>Street:<td> <td><input type="text" size="30" name="street"></td> </tr> <tr> <td>City:<td> <td><input type="text" size="30" name="city"></td> </tr> <tr> <td>State:<td> <td><input type="text" size="30" name="state"></td> </tr> <tr> <td>Zip:<td> <td><input type="text" size="30" name="zip"></td> </tr> <tr> <td>Type:<td> <td><input type="radio" size="30" name="type" value="family"> Family <input type="radio" size="30" name="type" value="acquaintance" checked> Acquaintance</td> </tr> </table> <br/> <input type="submit" name="addContact" value=" Add "> </form> </fieldset> </body> </html>
æ¤æ¶ï¼å¨è¯¥é¡µé¢ä¸çå°ç大夿°å 容å¯è½æ¯å¸è æãæä»¬ä¸ä¼å¯¹ææå 容é½è¿è¡è¯¦ç»è®¨è®ºï¼ä½æ¯å¨æ¥ä¸æ¥çå å±ä¸ï¼æä»¬å°æåºå ¶ä¸è¦ç¹ï¼ä¾¿äºæ¨çè§£ servlet å°å¦ä½ä¸è¯¥é¡µé¢è¿è¡äº¤äºã
ç®å JSP 页é¢çåæ
å¨ JSP 页é¢ä¸ï¼HTML å°±æ¯ HTMLãJava 代ç åµå¨è¯¥é¡µé¢ä¸ï¼å¦ä¸æç¤ºï¼
<% Java code %>
为äºå¨è¯¥é¡µé¢ä¸åµå ¥ Java 代ç ï¼å¿ é¡»åè¯ JSP 页é¢è¿äºç±»ä½äºä½å¤ï¼å°±åæ¨å¨ Java ç±»ä¸æåç飿 ·ãå¯ä»¥ç¨è¯å¥å®æè¿é¡¹å·¥ä½ï¼å¦ä¸æç¤ºï¼
<%@ page import="java.util.*" %>
æä»¬ç页颿¾ç¤ºä¸ä¸ªååå表ï¼è¯¥å表æ¥èªäºä¸ä¸ª ContactList
å®ä¾ï¼JSP 页é¢éè¿ä¸å代ç è¡å¯ä»¥äºè§£è¯¥å®ä¾ï¼
<jsp:useBean id="contacts" scope="session" class="com.roywmiller.contacts.model.ContactList"/>
è¿è¡ä»£ç åè¯ JSP 页é¢å¨è¯¥é¡µé¢çå«å¤ä½¿ç¨ä¸ä¸ªå为 contacts
ç beanã宿¯ com.roywmiller.contacts.model.ContactList
çå®ä¾ï¼å¹¶æ¥æ session
ä½ç¨åã
请注æï¼è¯¥é¡µé¢ç主ä½ä¸æä¸ä¸ª Java for
循ç¯ï¼
List list = contacts.getContacts(); for (Iterator i = list.iterator(); i.hasNext();) { Contact contact = (Contact)i.next(); %> <tr> <td width="100"> <a href="removeContactAction.perform?id=<%= contact.getId()%>" >Delete</a> </td> <td width="200"><%=contact.getFirstname()%> <%=contact.getLastname()%></td> <td width="150"><%=contact.getStreet()%></td> <td width="100"><%=contact.getCity()%></td> <td width="100"><%=contact.getState()%></td> <td width="100"><%=contact.getZip()%></td> <td width="100"><%=contact.getType()%></td> </tr> <% }
è¿è¯´æäº JSP ææ¯æ¯å¦ä½æ··å HTML å Java è¯å¥çãå¨è¿éï¼æä»¬å°éå contact
对象çåååè¡¨ãæ¯è¿è¡ä¸æ¬¡å¾ªç¯ï¼å°±è¦å HTML 表添å ä¸ä¸ª <tr>
å
ç´ ãå¨è¯¥è¡¨ä¸ï¼æ¯ä¸ªåå为ä¸è¡ï¼æä»¬è°ç¨ Contact
å®ä¾ç getter æ¥å¡«å
表åå
ã对äºç¬¬ä¸ä¸ªåå
ï¼éè¦ä¸ºæ¯ä¸è¡å建ä¸ä¸ª Delete 龿¥ãæä»¬å° href
屿§è®¾ç½®ä¸ºä¸åå符串ï¼
removeContactAction.perform?id=<%= contact.getId()%>
å½ç¨æ·åå»è¯¥é¾æ¥æ¶ï¼å
æ·»å ä¸ä¸ªæçº¿ï¼/
ï¼ï¼ç¶åï¼è¯¥å符串å°è¿½å å°åéè³æå¡å¨ç URL çæ«å°¾å¤ãé®å·æ¯è¯·æ±åæ°çå®ç符ï¼delimiterï¼ï¼ç´§è·å¨ name=value
对ä¹åãæ¬ä¾ä¸ï¼æä»¬åéæ¯ä¸ªååç IDã
该页é¢å«å¤ä¹æ¯åçç¸åçäºæ
ï¼ä¾å¦ï¼å¨è¡¨å䏿·»å æ°ååã请注æ <form>
æ ç¾ï¼
<form method="post" action="addContactAction.perform">
å½ç¨æ·åå» Add æé®ï¼è¡¨ååºé¨çæäº¤æé®ï¼æ¶ï¼addContactAction.perform
被追å å° URL ä¸ã
è¿å°±æ¯å ¨é¨å·¥ä½ï¼ä¸äºç²¾å¦çè¯æ³æ£æ¯è®¸å¤ä¸ä¸ç¼ç¨äººåè¦ä¹åå¬äºä½¿ç¨ JSP ææ¯ï¼è¦ä¹å建åç§ helper ç±»ï¼ä¾å¦å®å¶ç JSP æ ç¾ï¼æ¥æå页é¢çå建ã读ååç»´æ¤çé¨ååå ã使¢ç¶æä»¬æäºè¯¥é¡µé¢ï¼å°±å¯ä»¥å¼å§ç¼åä¸äºä»£ç äºã
å建 servlet
æä»¬ç servlet ç±»ä¼¼äº HelloWorldServlet
ï¼å¹¶æ·»å äºå¨ä½å¤çåè½ï¼
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.roywmiller.contacts.actions.Action; public class ContactsServlet extends HttpServlet { protected ActionFactory factory = new ActionFactory(); public ContactsServlet() { super(); } protected String getActionName(HttpServletRequest request) { String path = request.getServletPath(); return path.substring(1, path.lastIndexOf(".")); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Action action = factory.create(getActionName(request)); String url = action.perform(request, response); if (url != null) getServletContext().getRequestDispatcher(url).forward(request, response); } }
å°±å以å䏿 ·ï¼æä»¬æ©å± HttpServlet
å¹¶éè½½ service()
æ¹æ³ãå¨è¯¥æ¹æ³ä¸ï¼æä»¬ï¼
- ä»å¯¼è´è°ç¨ servlet ç URL 䏿´¾çå¨ä½åã
- åºäºè¯¥åç§°å®ä¾åæ£ç¡®çå¨ä½ã
- åè¯è¯¥å¨ä½å¼å§æ§è¡ã
- å°ååºåéç»å¨ä½ææåç URLã
æä»¬ä»å¯¼è´è°ç¨ servlet ç URL 䏿´¾çå¨ä½åï¼è该 servlet æ¯ä» request.servletPath()
è·å¾çã请记ä½ï¼å¯¼è´æä»¬è°ç¨å¨ä½çææ URL é½å
·æ *.perform
çå½¢å¼ãæä»¬å°è§£æè¯¥å½¢å¼æ¥è·å¾åç¹å·¦è¾¹çå符串ï¼è¯¥å符串就æ¯å¨ä½åï¼ç¶åå°è¯¥å¨ä½åä¼ éç» ActionFactory
ï¼ä»¥å®ä¾åæ£ç¡®çå¨ä½ãç°å¨ï¼æ¨çå°æä»¬ä¸ºä½åè¯ Web åºç¨ç¨åºå¦ä½å¤ç该形å¼ç URLï¼ä»¥å为ä½å¨ JSP 页é¢ä¸ä½¿ç¨è¿äºâç¥å¥âçåç¬¦ä¸²ãæ£æ¯å ä¸ºè¿æ ·ï¼æä»¬æå¯ä»¥å¨è¿é对å®ä»¬è¿è¡è§£ç ï¼å¹¶éå对æä»¬æå©çå¨ä½ãæä»ä¹æ¿ä»£æ¹æ¡ï¼å¤§éç if
è¯å¥å大éçéå 代ç ãæ£å¦æä»¬å°çå°çï¼éè¿å¨ä½ï¼éè¦æ§è¡çæ¯ä¸ªå¨ä½é½å·²å®å
¨å°è£
ã
è¿æ ·åå¾å¥½ï¼ä½æ¯æä»¬éè¦ä¸äºéå ç±»æ¥å®æè¯¥ä»»å¡ãè¿å°±æ¯å¨ä½æ¡æ¶è¦åçäºã
ç®åçå¨ä½æ¡æ¶
æä»¬çç®åå¨ä½æ¡æ¶æ 4 个主è¦ç»ä»¶ï¼
-
ActionFactory
ã该工åå°è¯·æ±ä¸çå¨ä½åè½¬æ¢æ servlet å¯ä»¥ç¨æ¥å®æå ¶å·¥ä½çå¨ä½ç±»ã -
Action
æ¥å£ã该æ¥å£å®ä¹ææå¨ä½çæå ¶ç®åçå ¬å ±æ¥å£ã -
å为
ContactsAction
çæ½è±¡ç±»ã该类å®ç°äºææå¨ä½å ±ç¨çä¸ä¸ªæ¹æ³ï¼å¹¶å¼ºå¶åç±»å®ç°å¦ä¸ä¸ªæ¹æ³ï¼perform()
ï¼ã -
ContactsAction
çä¸ä¸ªåç±»ãè¿äºå类使 servlet è½å¤è¿è¡èªæå¼å¯¼ãæ·»å æ°åååå é¤ååã
å¨ servlet ç service()
æ¹æ³ä¸ï¼è¯¥è¿ç¨ä»¥ ActionFactory
å¼å§ã
ActionFactory
ä¸é¢æ¯æä»¬ç ActionFactory
ï¼
import java.util.HashMap; import java.util.Map; import com.roywmiller.contacts.actions.Action; import com.roywmiller.contacts.actions.AddContactAction; import com.roywmiller.contacts.actions.BootstrapAction; import com.roywmiller.contacts.actions.RemoveContactAction; public class ActionFactory { protected Map map = defaultMap(); public ActionFactory() { super(); } public Action create(String actionName) { Class klass = (Class) map.get(actionName); if (klass == null) throw new RuntimeException(getClass() + " was unable to find an action named '" + actionName + "'."); Action actionInstance = null; try { actionInstance = (Action) klass.newInstance(); } catch (Exception e) { e.printStackTrace(); } return actionInstance; } protected Map defaultMap() { Map map = new HashMap(); map.put("index", BootstrapAction.class); map.put("addContactAction", AddContactAction.class); map.put("removeContactAction", RemoveContactAction.class); return map; } }
ActionFactory
æå
¶ç®åã宿ä¸ä¸ª Map
å¨ä½ç±»åå
¶åç§°ãæä»¬å¨é¡µé¢ä¸ä½¿ç¨è¯¥åç§°åè¯ servlet æ§è¡åªä¸ªå¨ä½ãæ¬ä¾ä¸ï¼æä»¬æä¸ä¸ªå¨ä½ï¼
BootstrapAction
AddContactAction
RemoveContactAction
è®°å¾è¦åå«éè¿ Add 表åå Delete 龿¥ï¼å°æ·»å åå é¤ååçå¨ä½ä½ä¸º URL åéç» servletãBootstrapAction
ä»
ä»
éç¨äºå° /index.htm
è°ç¨è³æä»¬çå¨ä½æ¡æ¶ä¸ã
å½åè¯è¯¥å·¥åå建 Action
æ¶ï¼å®å°å®ä¾å该类ï¼å¹¶æå®éåå®ä¾ãåè¯¥å·¥åæ·»å æ°å¨ä½å
¶å®å°±æ¯ç®åå°ä¸ºè¯¥å¨ä½å建ä¸ä¸ªç±»ï¼ç¶åå¨å·¥åçå¨ä½ Map
䏿·»å æ°çæ¡ç®ã
Action
Action
æ¥å£å¦ä¸æç¤ºï¼
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface Action { public String perform(HttpServletRequest request, HttpServletResponse response); public void writeToResponseStream(HttpServletResponse response, String output); }
ç°å¨ï¼æä»¬å°å¹¿æ³ä½¿ç¨çæ¹æ³æ¯ perform()
ãèå¦ä¸æ¹æ³ï¼writeToReponseStream()
å
许å¨ä½ç´æ¥åå
¥ååºçè¾åºæµï¼ä»¥ä¼ éç» JSP 页é¢ãåå
¥çä»»ä½å
å®¹ï¼ææ¬ãHTML çï¼é½å°å¨è¯¥é¡µé¢ä¸æ¾ç¤ºãæä»¬ææ¶ä¸éè¦ä½¿ç¨è¯¥æ¹æ³ï¼ä½æ¯ï¼æ¨å¯ä»¥å¨ ContactsAction
ä¸è·å¾å®ï¼ä»¥æ¥çå®å¦ä½å·¥ä½ãè®°å¾æä»¬å¨ HelloWorldServlet
é使ç¨äºè¯¥æ¹æ³ä½ä¸ç代ç ï¼å æ¤ï¼æ¨ä¸ä¼å¯¹å®æå°éçã
ç¨ BootstrapAction å¯å¨
æä»¬æ¥æç ContactsAction
çæç®åçåç±»æ¯ BootstrapAction
ï¼å®æ¯å
¶ä»åç±»çä¸ä¸ªå¥½æ¨¡åï¼
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BootstrapAction extends ContactsAction { public String perform(HttpServletRequest request, HttpServletResponse response) { return "/" + "contactList.jsp"; } }
æä»¬ä»
å®ç° perform()
æ¥å®æéè¦çå·¥ä½ãæ¬ä¾ä¸ï¼æä»¬åªè¦è¿åä¸ä¸ªæå contactList.jsp ç URLï¼å¼å¤´çæçº¿å¾éè¦ï¼å æ¤ä¸è¦å¿äºå®ï¼ãç°å¨æ¥å顾 ContactsServlet
ä¸ç service()
æ¹æ³ï¼
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Action action = factory.create(getActionName(request)); String url = action.perform(request, response); if (url != null) getServletContext().getRequestDispatcher(url).forward(request, response); }
该å¨ä½è¦ä¹è¿åä¸ä¸ª URL å符串ï¼è¦ä¹åå
¥è¾åºæµï¼å¨ JSP 页é¢ä¸æ¾ç¤ºã妿å¨ä½è¿å URL å符串ï¼é£ä¹è¿æ¯ BootstrapAction
çåå³ï¼æä»¬å¯ä»¥è·å ServletContext
ï¼å¨ URL ä¸åå®è¯·æ± RequestDispatcher
ï¼æåå°è¯·æ±åååºåéç» JSP servletï¼ä»¥ä¾¿æé 该页é¢ãå¨è¿ä¹åï¼åªè¦å¨ä½ servlet 没æåå
¥ JSP 页é¢ç PrintStream
ï¼ç°å¨å·²ç»å
³éï¼ï¼å®å°±ä¼ååæ§å¶æï¼å¹¶å®æå©ä¸çå·¥ä½ã
妿éè¦ï¼å¯ä»¥å¨ response
ä¸è°ç¨ sendRedirect()
ï¼è䏿¯ä½¿ç¨ RequestDispatcher
ï¼
response.sendRedirect("http://...");
使¯ï¼è¿æ ·åè¦ä»åºä»£ä»·ãå½ä½¿ç¨è°åº¦ç¨åºæ¶ï¼æä»¬å° request
å response
ææç» JSP servletï¼å®è¿å°è½¬åç°æç HttpSession
ã飿 ·å°±ä¿åäºè¯¥ä¼è¯çå
容ã转åç»å¦ä¸ä¸ª URL å°±ä¸ä¼å¦æ¤ãæ¤å»ï¼å½æä»¬å¼å§æ¾ç¤ºè¯¥é¡µæ¶ï¼æä»¬æå
³å¿çä¼è¯ä¸æ²¡æä»»ä½ä¸è¥¿ï¼å æ¤ï¼æææ¯ä¸æ ·çã使¯å¾å¿«ï¼ä¿åä¼è¯å
容就ä¼å¾éè¦ã
为äºåè¯å¨ä½æ¡æ¶è¿ä¸ªæ°çå¯ç¨å¨ä½ï¼æä»¬è¦åå·¥åçå¨ä½ Map
æ·»å 以ä¸ä»£ç è¡ï¼
map.put("index", BootstrapAction.class);
æ·»å åå
ä¸ä¸ªä» æ¾ç¤ºé¡µé¢å´ä¸å 许æ¨åä»»ä½äºæ çåºç¨ç¨åºä¸æ¯å¾æç¨ãæä»¬éè¦è½å¤æ·»å ååç页é¢ã
为æ¤ï¼å¿ é¡»æ§è¡ä»¥ä¸æä½ï¼
- å建ä¸ä¸ªå为
AddContactAction
çç±»ã - å®ç°
perform()
ï¼å Web ä¼è¯ä¸ç»´æ¤çContactList
æ·»å æ°çContact
å®ä¾ã - å°æ°å¨ä½åè¯å·¥åã
å°å¨ä½åè¯å·¥åå°±æ¯å¨å·¥åç map 䏿·»å å¦ä¸æ¡ç®ï¼æ£å¦æä»¬ç¨ BootstrapAction
æåç飿 ·ã
AddContactAction
ç±»åå
¶å·²å®ç°ç perform()
æ¹æ³å¦ä¸æç¤ºï¼
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.roywmiller.contacts.model.Contact; import com.roywmiller.contacts.model.ContactList; public class AddContactAction extends ContactsAction { public String perform(HttpServletRequest request, HttpServletResponse response) { Contact newContact = createContact(request); HttpSession session = request.getSession(); ContactList contacts = (ContactList) session.getAttribute("contacts"); contacts.addContact(newContact); session.setAttribute("contacts", contacts); return "/contactList.jsp"; } protected Contact createContact(HttpServletRequest request) { Contact contact = new Contact(); contact.setFirstname(request.getParameter(RequestParameters.FIRSTNAME)); contact.setLastname(request.getParameter(RequestParameters.LASTNAME)); contact.setStreet(request.getParameter(RequestParameters.STREET)); contact.setCity(request.getParameter(RequestParameters.CITY)); contact.setState(request.getParameter(RequestParameters.STATE)); contact.setZip(request.getParameter(RequestParameters.ZIP)); contact.setType(request.getParameter(RequestParameters.TYPE)); return contact; } }
å¨è¿éï¼æä»¬è¦åçæææä½å°±æ¯è°ç¨ createContact()
å建ä¸ä¸ªæ°ç Contact
ï¼å¹¶å°å
¶å®ä¾åé设置为å
å«è¯·æ±åæ°çç¸åºå¼ãç¶åï¼æä»¬å¨ HttpSession
ä¸å ContactList
æ·»å æ°ç Contact
ãæåï¼æä»¬åè¯ servlet è¿å /contactList.jspã
è®°ä½æ¯å½æä»¬å建ä¸ä¸ª Contact
æ¶ï¼æé 彿°å°±ç»å®åé
ä¸ä¸ªæä¸ç IDãå顾ä¸ä¸ JSP 代ç ãæ¨å°çå°ä¸æä»¬å¨è¯¥å¨ä½ä¸åä»ä¹æå
³ç两项éè¦äºæ
ãé¦å
è¦æ³¨æçæ¯ï¼éè¿æ·»å ä¸åè¿ä¸ªè¡ï¼æä»¬ä¿è¯å¨ä¼è¯ä¸æ»æ¯æä¸ä¸ª ContactList
å®ä¾ï¼
<jsp:useBean id="contacts" scope="session" class="com.roywmiller.contacts.model.ContactList"/>
å¨ç¬¬ä¸æ¬¡ç¼è¯å¹¶æ¾ç¤ºï¼BootstrapAction
æ§è¡ååéè³ JSP 页é¢çç»æï¼JSP 页颿¶ï¼å®å°å®ä¾å ContactList
ã该对象没æå
å«ä»»ä½å
容ï¼å æ¤ï¼å½æä»¬å¯å¨åºç¨ç¨åºæ¶ï¼ååå表æ¾ç¤ºä¸ºç©ºãå¨ AddContactAction
ä¸ï¼æä»¬ä¿®æ¹è¯¥å¯¹è±¡ï¼æ·»å æ°çååä¿¡æ¯ï¼ç¶åå°å®éæ°æå
¥ä¼è¯ä¸ã以åï¼å½æ¾ç¤ºè¯¥é¡µé¢æ¶ï¼å®å°è¯»å Contact
å®ä¾ç ContactList
å表ï¼å¹¶æ¾ç¤ºå®ä»¬ã
第äºï¼æ³¨æç¨æ¥æ·»å ååç表åï¼å¦ä¸æç¤ºï¼
<form method="post" action="addContactAction.perform"> table with labels and text input fields <input type="submit" name="addContact" value=" Add "> </form>
该表åçå¨ä½è´ä½¿å¨è¯·æ±ä¸å° addContactAction.perform
åéç» servletãç¶åï¼å®æå addContactAction
çä¸é¨åä½ä¸ºå¨ä½åï¼å¨å·¥å䏿¥æ¾å®ï¼å¹¶å建 AddContactsAction
çä¸ä¸ªå®ä¾ã
å é¤åå
æ·»å ååå¾éè¦ï¼ä½æ¯è½å¤å é¤å®ä»¬ä¹åæ ·éè¦ãè½å¤å¯¹ååè¿è¡ç¼è¾æ¯å¾ä¸éï¼ä½æ¬æç¨åªè½åå°è¿äºãæ¤å¤ï¼æ·»å ç¼è¾åè½å°åæ·»å å¦ä¸å¨ä½ä¸æ ·ç®åãå æ¤ï¼æä»¬ææ¶åªæ¯æ·»å å é¤ååçåè½ï¼ç¶åè½¬åæ´æææçäºæ ã
ä¸åé¢ä¸æ ·ï¼æä»¬åªè¦æ·»å äºä¸ä¸ªæ°çå¨ä½ç±»ï¼å¹¶å®ç°å
¶ perform()
æ¹æ³ï¼åè¯å·¥åæ·»å äºè¿ä¸ªæ¹æ³ãæä»¬è¿å¿
é¡»ç¡®ä¿ JSP 代ç å¨åéçæ¶ååè¯ servlet è°ç¨è¯¥å¨ä½ã
å¯ä»¥å¨ JSP 页é¢ä¸æ¥çååè¡¨ä¸æ¯ä¸è¡ç Delete
龿¥ï¼
<a href="removeContactAction.perform?id=<%= contact.getId()%>" >Delete</a>
è¯¥é¾æ¥åè¯ servlet 请æ±å·¥å为åç§° removeContactAction
æä¾æ£ç¡®çå¨ä½ç±»ãå®è¿ä¼ éäºè¯¥è¯·æ±ä¸ä¸ä¸ªå为 id
çåæ°ï¼è¯¥è¯·æ±ä¸æä¸ä¸ªä¸ºå½ååå ID 设置çå¼ã
æä»¬çç±»å¦ä¸æç¤ºï¼
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.roywmiller.contacts.model.ContactList; public class RemoveContactAction extends ContactsAction { public String perform(HttpServletRequest request, HttpServletResponse response) { int contactId = Integer.parseInt(request.getParameter("id")); HttpSession session = request.getSession(); ContactList contacts = (ContactList) session.getAttribute("contacts"); contacts.removeContact(contactId); session.setAttribute("contacts", contacts); return "/contactList.jsp"; } }
è¿éï¼æä»¬è¦åçå°±æ¯ä»ä¼è¯ä¸æå id
åæ°å ContactList
ï¼åè¯è¯¥å表å é¤å
·æè¯¥ id
ç Contact
ï¼ç¶åæ¿æ¢ä¼è¯ä¸çå表ãæåä½ä¹æ¯å¾éè¦çï¼æä»¬è¦åè¯ servlet è¿å contactList.jspã
è¿è¡åºç¨ç¨åº
妿好å¥å¿è¿æ²¡æå ä¸é£ï¼é£ä¹æ¨ç°å¨å°±åºè¯¥è¿è¡è¿ä¸ªåºç¨ç¨åºï¼çç宿¯å¦ä½å·¥ä½çã
å¯å¨æµè§å¨ï¼å¹¶è¾å ¥ä¸å URLï¼
http://localhost:8080/contacts/
妿 Tomcat è¿è¡æ£ç¡®ï¼æ¨å°±åºæ¥ç contactList.jspï¼å ¶åè¡¨ä¸æ²¡æååãå¨ add 表åä¸çææ¬åæ®µä¸è¾å ¥ä¸äºå¼ï¼ç¶åå¹¶åå» Add æé®ãæ¨å°å¨è¯¥å表ä¸çå°æ°çååï¼è¯¥åååç§°ç左边æä¸ä¸ª Delete 龿¥ãé¤éæ¨ä¿®æ¹å®ï¼å¦åå ¶ç±»åå°è®¾ä¸º Acquaintanceï¼åéé®çé»è®¤ç±»åéæ©ï¼ã为äºç®ä¾¿èµ·è§ï¼æä»¬æ²¡æå¯¹è¯¥è¡¨åè¿è¡ä»»ä½éªè¯ï¼å æ¤ï¼æ¨å¯ä»¥è¾å ¥ææå段å¼å®å ¨ç¸åçå¤ä¸ªååãæ¯ä¸ªåå齿ä¸ä¸ªæä¸ç IDï¼å æ¤ï¼æ¯ä¸ªååå°å弿¾ç¤ºï¼æ¨å¯ä»¥é个å é¤å®ä»¬ã
说å¾ç®åç¹ ââ æä»¬æäºä¸ä¸ªå®ç¨ç Web åºç¨ç¨åºï¼ä½æä»¬æ æ³ä¿åååå表ï¼å æ¤ï¼æ¯å½å¯å¨è¯¥åºç¨ç¨åºæ¶ï¼æä»¬é½å¿ 须鿰è¾å ¥å®ä»¬ãæ´ç³çæ¯ï¼è¯¥åºç¨ç¨åºçæ¯ä½ç¨æ·é½æç¸åçååå表ãæä»¬æ¯å¯ä»¥éè¿æ·»å å¯¹äºæä¸ç¨æ·çæ¯æï¼ä»¥åéè¿å¨æä»¶ä¸å卿°æ®ï¼å¯ä»¥å·¥ä½çæç®åçæ°æ®åºï¼ï¼æ¥è§£å³è¿äºé®é¢ãå¨ä¸ä¸å°èä¸ï¼æä»¬å°å®æè¿ä¸¤é¡¹å·¥ä½ã
ç¨æ·åæ°æ®
å¢å¼ºåºç¨ç¨åº
å¨è¿ä¸å°èä¸ï¼æä»¬å°å¯¹ä»£ç åç°æç JSP 页é¢è¿è¡å°ééæï¼refactorï¼ï¼ä»¥ä¾¿è½ä¸ºæä¸çç¨æ·å¤çæä¹ åå¨çååæ°æ®ãç®è¨ä¹ï¼æä»¬è¿è¡ä¸åå·¥ä½ï¼
- å建ä¸ä¸ª
ContactsUser
对象ã - 为æ¯ä¸ª
ContactsUser
æä¾ç¨æ·åãå¯ç åååå表ã - ä¿®æ¹ JSP 页é¢ç
<jsp:useBean/>
æ ç¾ä»¥ä½¿ç¨ContactsUser
ã - æ·»å login.jsp ä½ä¸ºè¯¥åºç¨ç¨åºç第ä¸é¡µã
- ä¿®æ¹ contactList.jspï¼ä¸ºç»å½ç¨æ·æä¾åå¥½çæ¬¢è¿æ¶æ¯ã
- å contactList.jsp æ·»å Logout 龿¥ï¼ç¶åè°ç¨
LogoutAction
ã - æ·»å goodbye.jsp æ¥æ¾ç¤ºä¸ªæ§åçåè§æ¶æ¯ã
- æ·»å
LoginAction
åLogoutAction
ã - æ·»å
UsersDatabase
æ¥å¤ç usersDatabase.txt ä¸Contacts
çåå¨åæ£ç´¢ã - éè¿éè½½ servlet ä¸ç
init()
åå§åContactsDatabase
ã - éè½½ servlet ä¸ç
destroy()
ï¼åè¯UsersDatabase
å ³é usersDatabase.txtã
å®é ä¸å¹¶é妿¤ç³ç³ãæä¸çæ£è¾æ°çæ¦å¿µæ¯ä½¿ç¨æä»¶ï¼åªæ¯æ´å¤æ å Java è¯è¨å·¥ä½ï¼ä»¥åæåæ°é¡µé¢ãææå¨ä½å¤çæºå¶é½æ¯ç¸åçãè¿è¯´æå¨ä½æ¡æ¶çåè½å¼ºå¤§ï¼èåå»ºè¯¥æ¡æ¶åªéè¦è±è´¹ä¸ç¹ç¹å®è´µçæ¶é´ãå®å®å ¨ä¸å Jakarta ç Struts æ¡æ¶é£æ ·å¤æï¼è¯·åé åèèµæï¼ï¼å° Struts æ¡æ¶ç¨äºåºç¨ç¨åºä¸æè¿è¡çå·¥ä½å¯è½æç¹å°é¢å¤§åã
ContactsUser
å é¤å¯¼å
¥è¯å¥åååç¨åºä¹åï¼ContactsUser
对象å°å¦ä¸æç¤ºï¼æ¨å¯ä»¥å¨ contacts.jar 䏿¾å°å®æ´çæºä»£ç ï¼ï¼
public class ContactsUser { protected String username = ""; protected String password = ""; protected List contactList = new ArrayList(); public ContactsUser() { } public ContactsUser(String username, String password, List contactList) { this.username = username; this.password = password; this.contactList.addAll(contactList); } public boolean hasContacts() { return !contactList.isEmpty(); } public void addContact(Contact aContact) { contactList.add(aContact); } public void removeContact(Contact aContact) { contactList.remove(aContact); } public void removeContact(int id) { Contact toRemove = findContact(id); contactList.remove(toRemove); } protected Contact findContact(int id) { Contact found = null; Iterator iterator = contactList.iterator(); while (iterator.hasNext()) { Contact current = (Contact) iterator.next(); if (current.getId() == id) found = current; } return found; } accessors... }
该类ä¿ååºç¨ç¨åºç¨æ·çæå
³ä¿¡æ¯ãè¿é常就æ¯å®æè¦åçææå·¥ä½ãå®ä¿åç¨æ·çç¨æ·ååå¯ç ï¼å¹¶ç»´æ¤è¯¥ç¨æ·çååå表ãå®å
许å¨ä½æ¡æ¶ä¸çåç§å¨ä½ä¸ºè¯¥ç¨æ·æ·»å åå é¤ Contact
ãå¨è¿éï¼ä¸å¸¦åæ°çæé 彿°è¢«ç¨äºåå
æµè¯ãå¦ä¸ä¸ªæ¥æ¶ä¸ä¸ªåæ°çæé 彿°ææ¯åºç¨ç¨åºç¨æ·æä½¿ç¨çã
æ¨å¯è½ä¼é®èªå·±ï¼âè¯¥ç±»ä¸ºä½æ²¡æä¸ä¸ª ContactList
å®ä¾åéå¢ï¼âæ¯ç«ï¼æä»¬æ©å
è±å夫å建äºè¿æ ·ä¸ä¸ªå®ä¾ãæä»¬ä¸ºä½ä¸ä½¿ç¨å®å¢ï¼çæ¡å¾ç®åï¼æä»¬å®é
ä¸ä¸åéè¦è¯¥ç±»ãå®å
è£
äºä¸ä¸ª ArrayList
ï¼å¹¶ä¸ºæä»¬æä¾äºä¸äºè¾
婿¹æ³ãè¿äºè¾
婿¹æ³å®é
å¨ ContactUser
䏿´ææä¹ã妿æä»¬ä½¿ç¨äº ContactList
ï¼åéè¦éè¿æ¥æç¸åå称以åéè¦å®æç¸åäºæ
ç ContactUser
æ¥è°ç¨å®ä¸é¢çæ¹æ³ãä¾å¦ï¼å¦æContactUser
æ¥æä¸ä¸ª ContactList
ï¼å¹¶ä¸å°è¯¥å®ä¾åéå½å为 contactList
ï¼é£ä¹ addContact()
å°å¦ä¸æç¤ºï¼
public void addContact(Contact aContact) { contactList.addContact(aContact); }
å¨è¿é对å
¶ä»å¯¹è±¡è¿è¡æææäºæè ¢ãå æ¤ï¼æä»¬å é¤äº ContactList
ç±»ã飿£æ¯éæè¦åçå
¨é¨å·¥ä½ãæä»¬ç®åäºä»£ç ï¼å¹¶åå°äºç³»ç»ä¸ç±»çæ°ç®ï¼ä½ä»è½å®æç¸åçä»»å¡ãæ¥æ ContactList
æ¯åå»ºç³»ç»æ¶çä¸é´æ¥éª¤ãå®å
许æä»¬å¯å¨å¹¶è¿è¡ç³»ç»ï¼å¹¶å¸®å©æä»¬å建å¨ä½æ¡æ¶ãç¶åï¼å®çææå¯¿å½å°±ç»æäºï¼æä»¬å°å é¤å®ãç¼åä¸äºä»£ç å¹¶ä¸ä»£è¡¨æ¨å¿
须永è¿ç»´æ¤å®ä»¬ã
ä¿®æ¹ contactList.jsp
ä¿®æ¹ JSP 页颿¥ä½¿ç¨æ°ç ContactUser
ååç®åãæä»¬éè¦è¿è¡ä¸å¤ä¿®æ¹ã
第ä¸å¤å°±æ¯ä¿®æ¹ <jsp:useBean>
æ ç¾ï¼å¦ä¸æç¤ºï¼
<jsp:useBean id="user" scope="session" class="com.roywmiller.contacts.model.ContactsUser"/>
ç°å¨ï¼é¡µé¢å°å®ä¾å ContactsUser
ï¼èé ContactList
ã
第äºå¤ä¿®æ¹å°±æ¯æ´æ°é¡µé¢ä¸çè¡¨è¡æå»ºé»è¾ï¼ä»¥ä½¿ç¨æ°ç user
åéï¼
<% List list = user.getContacts(); for (Iterator i = list.iterator(); i.hasNext();) { Contact contact = (Contact)i.next(); %>
第ä¸å¤ä¿®æ¹å°±æ¯ä¸ºç¨æ·æ·»å ä¸ä¸ªéåºé¾æ¥ï¼
<a href="logoutAction.perform">Logout</a>
æä»¬å°è¯¥é¾æ¥ç½®äºâContacts 1.0â头æè¾¹ãå½ç¨æ·åå»è¯¥é¾æ¥æ¶ï¼servlet å°æ§è¡ LogoutAction
ã
æ·»å ç»å½/éåºé¡µé¢
ä¸å
¶ä»é¡µé¢ç¸æ¯ï¼æ¯æç»å½åéåºç页é¢é½ååç®åãæä¸çå·®å«åå¨äº <body>
æ ç¾ä¸ãä¸é¢æ¯ login.jspï¼
<body> <h2>Contact List 1.0</h2> <hr size="2"/> <fieldset> <legend><b>Please Login</b></legend> <form method="post" action="loginAction.perform"> <table> <tr> <td>Username:<td> <td><input type="text" size="30" name="username"></td> </tr> <tr> <td>Password:<td> <td><input type="text" size="30" name="password"></td> </tr> </table> <br/> <input type="submit" name="login" value=" Login "> </form> </fieldset> </body>
è¯¥é¡µé¢æä¸ä¸ªè¡¨åï¼å
¶ä¸å¸¦æä¸¤ä¸ªææ¬å段åä¸ä¸ªæäº¤æé®ãå½ç¨æ·åå» Login æ¶ï¼servlet å°æ§è¡ LoginAction
ã
ä¸é¢æ¯ goodbye.jspï¼
<body> <jsp:useBean id="user" scope="session" class="com.roywmiller.contacts.model.ContactsUser"/> <h2>Contact List 1.0</h2> <hr size="2"/> Goodbye <%= user.getUsername() %>! </body>
该页é¢è°ç¨ ContactsUser
bean ä¸ç getUsername()
æ¥æ¾ç¤ºä¸ªæ§åçåè§æ¶æ¯ã
å½ç¨æ·ç¨ä¸ä¸ªæ°æ®åºä¸æ²¡æçç¨æ·åå°è¯ç»å½æ¶ï¼åºç¨ç¨åºå°æ¾å¼ç»å½ï¼å¹¶å°ç¨æ·æåä¸ä¸ªé误页é¢ï¼å¦ä¸æç¤ºï¼
<body> <h2>Contact List 1.0</h2> <hr size="2"/> <fieldset> <legend><b>Error</b></legend> There was an error: <%= session.getAttribute("errorMessage") %> </fieldset> </body>
è¿æ¯æä»¬æ¥æçæç®åç页é¢ãå®ä½¿ç¨å¯ä»ææ JSP 页é¢è·å¾çé»è®¤ session
å鿥æ¾ç¤ºåºéæ¶æ¯ã
æ·»å LoginAction
LoginAction
ç±»å¦ä¸æç¤ºï¼
public class LoginAction implements Action { public String perform(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter(USERNAME); String password = request.getParameter(PASSWORD); ContactsUser user = UserDatabase.getSingleton().get(username, password); if (user != null) { ContactsUser contactsUser = (ContactsUser) user; request.getSession().setAttribute("user", contactsUser); return "/contactList.jsp"; } else request.getSession().setAttribute("errorMessage", "Invalid username/password."); return "/error.jsp"; } }
该å¨ä½ä»è¯·æ±ä¸æå username å password åæ°ï¼ç¶åç¨ username/password ç»åæ¥çæ°æ®åºä¸æ¯å¦å å«è¯¥ç¨æ·ã妿åå¨è¯¥ç¨æ·ï¼é£ä¹å°±å°è¯¥ç¨æ·ç½®äºä¼è¯ä¸ï¼å¹¶ç´æ¥è¿å ¥ contactList.jspãå¦ææ°æ®åºä¸æ²¡æè¯¥ç¨æ·ï¼é£ä¹å°±å¨ä¼è¯ä¸è®¾ç½®ä¸æ¡åºéæ¶æ¯ï¼å¹¶è½¬è³ error.jspã
ç°å¨ï¼æ·»å å¨ä½å¯¹äºæä»¬èè¨åºè¯¥å¾å®¹æäºãæä»¬åå¨ä½å·¥åæ·»å ä¸ä¸ªæ¡ç®ï¼å¦ä¸æç¤ºï¼
map.put("loginAction", LoginAction.class);
å¨è®¾ç½®å¥½é¡µé¢ä¹åï¼å·¥åä¼æç¥æ°å¨ä½ï¼æ·»å æä½ä¹å°±å®æäºãæ¨åºè¯¥è½å¤è¿è¡è¯¥åºç¨ç¨åºï¼å¹¶çå°ç»å½é¡µé¢ãå½è¾å ¥ç¨æ·ååå¯ç æ¶ï¼ä¸ç®¡è¾å ¥çæ¯ä»ä¹ï¼æ¨é½ä¼çå°åºé页é¢ãçä¸ä¼å¿ä¹åï¼æ¨å°±å¯ä»¥éè¿ææçç¨æ·ååå¯ç ç»å½ï¼å¹¶çå°å å«ç©ºååå表ç contactList.jspã
æ·»å LogoutAction
LogoutAction
ç±»å¦ä¸æç¤ºï¼
public class LogoutAction implements Action { public String perform(HttpServletRequest request, HttpServletResponse response) { UserDatabase.getSingleton().shutDown(); return "/goodbye.jsp"; } }
å¨è¿éï¼æä»¬å°åè¯æ°æ®åºæ§è¡ shutDown()
æä½ãUserDatabase
ä¸çæ¹æ³å¦ä¸æç¤ºï¼
public void shutDown() { writeUsers(); } protected void writeUsers() { StringBuffer buffer = new StringBuffer(); Collection allUsers = users.values(); Iterator iterator = allUsers.iterator(); while (iterator.hasNext()) { ContactsUser each = (ContactsUser) iterator.next(); UserRecord record = new UserRecord(each); buffer.append(record.getFullRecord()); } writeText(buffer.toString()); } protected synchronized void writeText(String text) { Writer writer = null; try { writer = new FileWriter(usersFile.getAbsolutePath()); writer.write(text); } catch (Exception e) { throw new RuntimeException("Unable to append to file.", e); } finally { closeWriter(writer); } }
shutDown()
è°ç¨ writeUsers()
ï¼è¯¥æ¹æ³å°è¿ä»£å
åä¸ä¿åçææç¨æ·ï¼å½ servlet 对èªèº«è¿è¡åå§åæ¶ï¼å°ä»æä»¬è¯»å
¥è¯¥æä»¶çå°æ¹å¼å§ï¼ï¼ä¸ºæ¯ä¸ªç¨æ·å建ä¸ä¸ª UserRecord
ï¼ç¶åå°å®æ´çåç¬¦ä¸²ä¼ éç» writeText()
ãwriteText() å°è¯¥å符串åå
¥æä»¶ä¸ï¼éåç°æçå
容ãUserRecord
ç±»æ¯ä¸ä¸ªæå¥½çè¾
å©ç±»ï¼å°è£
äºæä»¶ä¸æ¯æ¡ç¨æ·è®°å½çææç¦æçæ è®°å·¥ä½ãæ¨å¯ä»¥èªå·±æ£æ¥ä»£ç ï¼å
³äºå®æ´çæºä»£ç æ¸
åï¼è¯·åé
contacts.jarï¼ã
䏿¦å ³éæ°æ®åºï¼å°±å¯ä»¥åè¯ servlet åé goodbye.jspï¼æ¾ç¤ºä¸ªæ§åçåè§ã
userDatabase.txt æä»¶
大夿° Web åºç¨ç¨åºä»æç§âæ°æ®åºâä¸è®¿é®æ°æ®ã许å¤é½ä½¿ç¨è¡ä¸çº§ï¼industrial-strengthï¼ç RDBMSï¼ä½ææ¬æä»¶ä¹å¯ä»¥æ¯æ°æ®åºã宿¯å¯ä»¥å·¥ä½çæç®åçæ°æ®åºã妿æ¨å°å®å è£ å¾å¾å¥½ï¼å¹¶å°è®¿é®ç»èéèå¨ä¸ä¸ªæ¥å£ä¹åï¼è该æ¥å£ä½¿å¾åºç¨ç¨åºä¸çå ¶ä»ç±»ææäºè®¿é®è¿äºæ°æ®ï¼é£ä¹åºå±æ°æ®éç¨ä»ä¹æ ·çåå¨å½¢å¼å®é ä¸å°±æ²¡ä»ä¹å ³ç³»ã
å¨è¿ä¸ªåºç¨ç¨åºä¸ï¼æä»¬å°ä½¿ç¨ä¸ä¸ªææ¬æä»¶ã该æä»¶å°æç §ä¸åå½¢å¼ï¼ä¸ºæ¯ä½ç¨æ·ä¿åä¸è¡ï¼
username password comma-delimited contact1 info|comma-delimited contactN info|...
该æä»¶ä¸çç¨æ·åå°æ¯ææï¼ä½åºäºå®å
¨èèï¼å¯ç å°æ¯ Base64 ç¼ç ï¼ç»å¯¹æç®åï¼ãååæ¡ç®å°ç¨éå·åéãèååæ¬èº«å°éè¿ |
å符åéãè¿ç§æ ¼å¼æ²¡æä»ä¹ç¹å«ãå®åªæ¯æ§è¡æä»¬éè¦å®å®æçå·¥ä½ï¼ä»¥å
许æä»¬æäºè§£æè¯¥æä»¶ã
ä¸ºäºæ¹ä¾¿ï¼æä»¬å°è¯¥æä»¶æ¾ç½®å¨æ¬é¡¹ç®çæ ¹ç®å½ä¸ï¼ä»¥ä¾¿è¯¥æä»¶çè·¯å¾ç®åç´æ¥ã
为äºä½¿äºæ
ç®åï¼è¯¥åºç¨ç¨åºä¸æ¯æç¨æ·ç»´æ¤åè½ï¼è¿æå³çæ æ³å¨åºç¨ç¨åºä¸æ·»å æå é¤ç¨æ·ãè¿å°±è¡¨ç¤ºæ¨å¿
é¡»æå·¥å°ç¨æ·æ·»å å° userDatabase.txt ä¸ãä¾å¦ï¼è¦æ·»å ä¸ä¸ªå为 testuser
以åå¯ç 为 password
çç¨æ·ï¼å°±è¦å该æä»¶æ·»å ä¸åä¸è¡ï¼
testuser cGFzc3dvcmQ=
æ¯ä¸ªæ¡ç®ä¸çå¯ç 齿¯éè¿ Base64 ç¼ç è¿è¡ç¼ç çãæ¨å¯ä»¥å¨ contacts.jar ä¸ä½¿ç¨ EncoderDecoder
ç±»æ¥è®¡ç®æ¨å¯ç çç¼ç çæ¬ãå®çmain()
æ¹æ³å
许æ¨è¾å
¥ææå符串ï¼ç¶åè¿è¡è¯¥ç±»ï¼å¨æ§å¶å°ä¸è¾åºå·²ç¼ç çå¯ç ã
UserDatabase
UserDatabase
å
è£
äºä¸ææ¬æä»¶ç交äºãè¿ä¸ªç±»çæ¸
åçä¸å»å¾å¤§ï¼ä½æ¯å¹¶ä¸å¤æï¼å¤§é¨å让人æè§å¾å¤æçä¸è¥¿æ¯é£äºé¢å¤ç Java ç¼ç å
容ï¼å¤ç读åæä»¶æä½éè¦å®ä»¬ï¼ãæä»¬å°å¨æ¬é¢æ¿ä¸è®¨è®ºä¸äºè¦ç¹ï¼å
³äºå®æ´çä»£ç æ¸
åï¼è¯·åé
contacts.jarï¼ã
该类å®ç°äº Singleton 模å¼ï¼å¹¶ä¸ç»´æ¤äºä¸ä¸ªå®ä¾ï¼èææç¨æ·åéè¿è°ç¨ getSingleton()
å
±äº«è¿ä¸ªå®ä¾ã
该类维æ¤äº ContactsUser
çä¸ä¸ª Map
ï¼è¯¥ Map å°ç¨æ·åä¸å¯ç çç»åä½ä¸ºæ¯ä¸ªæ¡ç®ç**ãä»»ä½ä¸è¥¿é½å¯ä»¥å
彿¯ä¸ªæ¡ç®çé®ï¼ä½è¿ä¸ªæ¯è¾æ¹ä¾¿ã
å¨ servlet ç init()
æ¹æ³ä¸ï¼æä»¬å°åè¯ UserDatabase
æ°æ®åºæä»¶ä½äºä½å¤ï¼åºäº ServletContext
ï¼ï¼ç¶ååè¯å®éè¿è°ç¨ initialize()
åå§å宿¬èº«ãè¯¥æ¹æ³å¦ä¸æç¤ºï¼
public void initialize() { usersFile = new File(databaseFilePathname); String allUsers = retrieveText(); StringTokenizer tokenizer = new StringTokenizer(allUsers, "\n"); while (tokenizer.hasMoreTokens()) { String userEntry = tokenizer.nextToken(); UserRecord record = new UserRecord(userEntry); put(new ContactsUser(record.getName(), record.getPassword(), record.getContactList())); } }
è¯¥æ¹æ³éè¿è°ç¨ retrieveText
读å
¥å®æ´çæä»¶ï¼æ è®°è¾å¤§çå符串ï¼ä¸ºæ¯ä¸ªç¨æ·å建 UserRecord
ï¼ç¶åè°ç¨ put()
æ¥å¨è¯¥ map 䏿¾ç½®æ°çContactsUser
ãè¯¥æ¹æ³ççæ£ä½ç¨ä½ç°å¨è°ç¨ retrieveText()
å put()
ä¸ï¼
protected synchronized String retrieveText() { BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new FileReader(usersFile.getAbsolutePath())); char charBuff[] = new char[(int) new File(usersFile.getAbsolutePath()).length()]; bufferedReader.read(charBuff); return new String(charBuff); } catch (Exception e) { throw new RuntimeException("Unable to read in the file.", e); } finally { closeReader(bufferedReader); } } protected void closeReader(BufferedReader bufferedReader) { try { if (bufferedReader != null) bufferedReader.close(); } catch (Exception ex) {} } public void put(ContactsUser user) { String userKey = user.getUsername() + user.getPassword(); users.put(userKey, user); }
retrieveText()
æ¹æ³è´è´£å®ææä»¶è¯»åå·¥ä½ãå®å建äºä¸ä¸ª BufferedReader
ï¼å°æ´ä¸ªæä»¶å
容读å
¥å°å符ç¼å²åºä¸ï¼ç¶åå°è¿äºå
å®¹è½¬æ¢æä¸ä¸ª String
ãå¨å
¶ finally
åå¥ä¸ï¼å®åªè°ç¨ closeReader()
æ¥å®æè¯¥å·¥ä½ãwriteText()
æ¹æ³å°è¾åºåå
¥æä»¶ï¼éåç°æçå
容ãè¯¥æ¹æ³éèäºåä¸ç±»åçæä»¶äº¤äºç»èã
put()
æ¹æ³ä¸ºç¨æ·å建**ï¼ç¨æ·åå ä¸å¯ç ï¼ï¼å¹¶å°è¯¥**æå
¥ç¨æ·ç map ä¸ã
ææå°ä½¿ç¨ servlet
ç®ä»
æ¬æç¨ä¸ï¼æä»¬åªæ¶åäºç¨ servlet å¯å®æçæµ å±åè½ãWeb åºç¨ç¨åºå¯ä»¥ä¸æ¨æè½æ³åç䏿 ·å¤æãå°½ç®¡ææ Web åºç¨ç¨åºçåºå±æºå¶åºæ¬ä¸æ¯ç¸åçï¼å¦æç¨ Java è¯è¨ç¼å代ç ï¼servlet å°æ¯æ ¸å¿é¨åãå建æ´ä¸ºå¤æçåºç¨ç¨åºå®è´¨ä¸å°±æ¯ä½¿ç¨æ´å¤æçå·¥å ·ååºã
ç¶èï¼è®¸å¤ç¼ç¨äººåä¼å¨è¿ä¸ªå°æ¹ç¯éï¼ä»è导è´å建åºç³ç³ç Web åºç¨ç¨åºãè¿ä¸å°èå å«ä¸äºå ³äºå¦ä½é¿å è¿äºé误ç建议ã大夿°å ·æ Web å¼åç»éªç Java ç¼ç¨äººåé½èµåå ¶ä¸çä¸äºå»ºè®®ãè¿æä¸äºæ´å ·äºè®®æ§çå»ºè®®ãæ è®ºå¨åªç§æ åµä¸ï¼å®ä»¬é½å°å¸®å©æ¨è¾å¥½å°äºè§£ servletã
使ç¨ä¸ä¸ª servlet
妿æ¨ä¸è½åªä½¿ç¨ä¸ä¸ª servletï¼å°±ä½¿ç¨å°½å¯è½å°çæ°ç®ãå®é ä¸ï¼æå»ºè®®æ¨åªä½¿ç¨ä¸ä¸ªï¼ç´å°è¯å®æ æ³åè¿æ ·ä¸å»ãåºè¯¥ä¸éå¾å¤ servletï¼æ¨è¯å®æ é为æ¯ç§ç±»åçè¯·æ±æä¾ä¸ä¸ª servletã
ä¸è¦å¨ servlet ä¸èè´¹å¤ªé¿æ¶é´
å¨ servlet ä¸å°½å¯è½å°è±æ¶é´ã
servlet 䏿¯ä¸ºä¸å¡é»è¾æä¾çåºæãåªæç³ç³ç OOP 设计æé£æ ·ãå° servlet èèæä»¥ä¸ä¸¤ç§äºç©ä¹ä¸ï¼
- UI åé¢çä¸ä¸ªéå å±ï¼å¸®å©æå¡å¨äºè§£âäºä»¶âã
- æå¡å¨åé¢çä¸ä¸ªéå å±ï¼å 许æ¨å°æµè§å¨ç¨ä½ UIã
æ è®ºå° servlet è§ä¸ºåªä¸ç§äºç©ï¼å®é½æ¯æ¨å¿«éå°é®é¢åæ´¾å°åºç¨ç¨åºçå ¶ä»é¨åãç¶åéåºçä¸ä¸ªå°æ¹ã
使ç¨å¨ä½
å¨ä½æ¡æ¶ï¼å³ä½¿æ¯åæ¬æç¨ä¸æä½¿ç¨ç䏿 ·ç®åï¼æ¯ä¸ç§åè½å¼ºå¤§çæ¹æ³ãå®å 许æ¨é纳åé¢çæè§ï¼å¨ servlet ä¸è±è´¹å°½å¯è½å°çæ¶é´ãå®è¿æ¯å¾å¥½ç OOP è®¾è®¡ãæ¯ä¸ªå¨ä½ç±»å®æä¸ä»¶äºï¼æä¸ç»è系紧å¯çäºæ ã
æäºäººè®¤ä¸ºè¿ä¼åè£ä»£ç ï¼ä½¿ä¹æ´é¾ä»¥çè§£ãæè®¤ä¸ºè¿ç§å对æºäºä»¥ä¸ä¸¤ä»¶äºï¼
- 人们ä¸ä¹ æ¯äºæ¥çé¢å对象ç代ç ï¼å½æ¨ç¬¬ä¸æ¬¡å¼å§æ¥ç宿¶ï¼è¯å®ä¼æè§å®ä»¬æ¯ç¦»ç ´ç¢çã
- 人们æ´å欢ç¨åºä»£ç ï¼å³ä½¿è¯¥ä»£ç å¨å¯¹è±¡ä¸ã
èèå
¶ä»éæ©ãè¥æ²¡æå¨ä½ï¼å设æ¨ä¸æ¯ç®åå°ææç»å
¶ä»å¯¹è±¡ï¼ä¸è°ç¨âå¨ä½âï¼ï¼åå¿
须使ç¨å¤§éç if
è¯å¥ãå¦æåªæä¸¤ä¸ä¸ª if è¯å¥ï¼ä»£ç å¯è½è¿å¾å®¹æé
读ã使¯å¦ææ¨æ 10 个 if è¯å¥ï¼åå¾å¯è½ä»¤äººæå°ç®ç©ãè¦æ±æ¨æ»å¨å¤ä¸ªå±å¹çæ¹æ³æ¯è¾ä»¤äººè®¨åãå®é常æå³çè¯¥æ¹æ³è¦è¿è¡å¤ªå¤å·¥ä½ãè³å°ï¼æ¨è¦å° service()
ï¼æ doGet()
çï¼ä¸å®æç类似äºå¨ä½çäºæ
æåå°å
¶ä»æ¹æ³ä¸ï¼è¦å¯¹è¿äºæ¹æ³èµ·ä¸ªå¥½çåç§°ï¼è¿æ ·æ¨æç¥éå®ä»¬æ¯åä»ä¹çã
使ç¨å¨ä½ãå¨éè¦æ·»å åè½æ¶ï¼å°½ç®¡æ·»å å¨ä½å¥½äºã
ä½¿ç¨ service()ï¼é¤éæ¨ä¸è½ä½¿ç¨å®
servlet ä¸çä¸æè®¸å¤äººä»¬å£°ç§°ï¼æ¨ä¸åºéè½½ service()
ãå¹¶ä¸è¯´æ¨åºè¯¥éè½½ doGet()
å/æ doPost()
ï¼å¯ä»¥è®©å®ä»¬ç¸äºè°ç¨ï¼ä½¿ä»£ç 类似äºä¸é¢æç¤ºï¼
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { statements } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
æä¸ç¥éè¿äºææ³æºäºä½å¤ãBruce Eckle æåºè¯¥ææ³æ¯ä» CGI æ¶æéç䏿¥çï¼å½äººä»¬å¼å§ä¹ æ¯æ³¨æè¿æ¥çæ¯ GET
è¿æ¯ POST
æ¶ãï¼å
³äºå¯¹ä»ççè®ºçæ´è¯¦ç»çæ¬ç龿¥ï¼è¯·åé
åèèµæãï¼æä»æªå¬å°ä¸è¦ä½¿ç¨ service()
ç好çç±ã任使
åµä¸ï¼å¦ææ¨ä½¿ç¨ service()ï¼ç¶åç¡®å®å®å°æ¯ä½¿ç¨ä»»ä½ä¸ç§ doX()
飿 ¼é½è¦å¥½ï¼é£ä¹è¯·éæä»£ç ï¼å¨è¿ä¸ªæ¶åï¼å°±ä½¿ç¨ service()
ï¼å ä¸ºå®æ´ç®åã
ä¸è¦æ··å表示åä¸å¡é»è¾
对äºç®åçåºç¨ç¨åºèè¨ï¼çæå¤æç HTML å符串æ¥è¾åº JSP 页é¢çè¾åºæµå¾ä¸éï¼ä½æ¯å建åè½æ´ä¸°å¯çåºç¨ç¨åºæ¶ï¼è¯¥æ¹æ³è¦å°é¾å¾å¤ã
å°è¡¨ç¤ºæ¾ç½®å¨å®æå±çå°æ¹æ¯ä¸ç§æ¯è¾ææºçåæ³ï¼å¨é¡µé¢ä¸ãJSP ææ¯å 许æ¨å®æè¯¥å·¥ä½ï¼ä½æ£å¦æåé¢æè¯´çï¼å®éè¦å大é工使è½ä½¿ä¸å¡é»è¾ä¸è¡¨ç¤ºå离ãè¯¸å¦ Velocity ä¹ç±»ç模æ¿å弿éå¸¸æ¯æ´å¥½çéæ©ãæ è®ºæ¨éæ©åªç§æ¹æ³ï¼é½è¦å°½å¯è½å°å°æ··åä¸å¡é»è¾å表示ã
å¾å¥½å°å¤çå¼å¸¸
æä»¬æ²¡æå¨æ¬æç¨ä¸è¿å¤è°è®ºè¿ä¸ç¹ï¼ä½æ¯å¼å¸¸å¤çå¨å建 Web åºç¨ç¨åºæ¶åå¾å¾éè¦ãæ²¡ææ¯å¨æå¡å¨ç«¯åçä¸äºææ³ä¸å°çäºæ ï¼ç¶å卿µè§å¨ä¸çå°éèçå æ è·è¸ªæ´è®©ç¨æ·æ²®ä¸§çäºãå ¶ä¸ä¸äºè·è¸ªå¯è½æå ¶è¿éãæ¦æ¶©ã追æ¥å®ä»¬å¯è½ä»¤äººå¾è¦æ¼ã
è®¸å¤æå ç Web åºç¨ç¨åºå¼ååºï¼å¦ Strutsï¼è¯·åé åèèµæï¼ï¼é½é带äºç¨æ¥å¤çå¨ææ¶æ¯ï¼å æ¬éè¯¯ï¼æ¾ç¤ºçå ç½®æ¡æ¶ãæ¨å¯ä»¥ä½¿ç¨è¿äºåè½ã
ä¸è¦ä½¿ç¨æ¯ç§åè½
æ¨æ¯å¦éè¦ä½¿ç¨æ¨æ£éç¨ç Web åºç¨ç¨åºå¼åæ¡æ¶æåºä¸çæ¯é¡¹åè½å¢ï¼å¾å¯è½ä¸éè¦ï¼æ¯ä¸ç§åè½é½ä½¿ç¨å°ä½¿ä»£ç æ¯æ¨æéè¦çè¦å¤æå¾å¤ãå®é ä¸ï¼é¤äºå¯ä»¥å·¥ä½çæç®åæ¡æ¶ï¼æå»ºè®®æ¨æ ¹æ¬ä¸è¦ä½¿ç¨å«çæ¡æ¶ãææ¶åæ¨ç¥éï¼å¯¹äºæ¨æå¤´çé®é¢èè¨ï¼å°è¦ä½¿ç¨æéè¦ä½¿ç¨çåè½ææ¡æ¶å¯è½æäºå°é¢å¤§åã
å½ä½¿ç¨æ¡æ¶æ¯å¯åçæ¹æ³æ¶ï¼å°±ä½¿ç¨å®ãä¸è¦å宿¨éè¦å®ï¼çå¾ ç³»ç»åè¯æ¨éè¦ä½¿ç¨æ¶å使ç¨å®ãä¸äºç¼ç¨äººåè®¤ä¸ºé£æ¯âç³ç³ç设计âãå¹¶é妿¤ãå设æ¨å°éè¦ä¸ä¸ªç¹å®çæ¡æ¶ï¼çè³æ¯éè¦è¯¥æ¡æ¶ä¸çæä¸ªç¹å®åè½ï¼é£ä¹è¿æ ·ç设计å¯è½æ¯è¿åè®¾è®¡ãæ¨åºé对æéè¦çè¿è¡è®¾è®¡ï¼è®¾è®¡é常ä¼éçç³»ç»æ©å±èæ´æ¹ãå¨å¼åå¼å§ä¹åéæ©æ¡æ¶æ¯æ ççï¼å¦æè¯¥æ¡æ¶ä¸æ¯ææä¸å è®¸å®ææ¨éè¦å®æçä¸äºå·¥ä½ï¼é£ä¼è®©æ¨æ¥å¾æå¢ã
ç»æè¯
æ¬æç¨ä¸ï¼æ¨ç¥éäº Java servletï¼ä»¥åå¦ä½ä¸ä¸å°ä½¿ç¨å®ä»¬ãå½ç¶ï¼æ¬æç¨ä¸çä¾åååç®åï¼ä½æ¯å®ä»¬è¯´æäºå建 Web åºç¨ç¨åºå°ç¨å°ç大é¨å servlet æ¦å¿µãè¿ææ´å¤å¯ç¨çåè½ï¼é ç½®çï¼ï¼ä½æ¯å ä¹ç¨ Java è¯è¨ç¼åçæ¯ä¸ª Web åºç¨ç¨åºçæ ¸å¿é½æ¯ä¸ä¸ªæå¤ä¸ª servletï¼å®ä»¬å¨å¹åçä¸å°æå¤å°æå¡å¨ä¸å å½ä¸å¡é»è¾çç½å®ã
æ´éè¦çæ¯ï¼æ¨äºè§£äºå¾å¥½å°ä½¿ç¨ servlet çä¸äºææ¯ãWeb åºç¨ç¨åºå¸¸å¸¸ä¼åæä¸å¤§å åä¹±ç代ç ãéè¿ä½¿ç¨ç±åºæ¬ OOP åå驱å¨çç®åææ¯ï¼æ¨å¯ä»¥é¿å è¿ç§æ··ä¹±ï¼å建æäºå¢å¼ºåç»´æ¤çåºç¨ç¨åºã
http://www.ibm.com/developerworks/cn/education/java/j-intserv/j-intserv.html