# Servlet æå - [JavaWeb ç®ä»](#javaweb-ç®ä») - [Web åºç¨ç¨åº](#web-åºç¨ç¨åº) - [å¸¸è§ Web æå¡å¨](#常è§-web-æå¡å¨) - [Servlet ç®ä»](#servlet-ç®ä») - [ä»ä¹æ¯ Servlet](#ä»ä¹æ¯-servlet) - [Servlet å CGI çåºå«](#servlet-å-cgi-çåºå«) - [Servlet çæ¬ä»¥å主è¦ç¹æ§](#servlet-çæ¬ä»¥å主è¦ç¹æ§) - [Servlet ä»»å¡](#servlet-ä»»å¡) - [Servlet çå½å¨æ](#servlet-çå½å¨æ) - [Servlet API](#servlet-api) - [Servlet å ](#servlet-å ) - [Servlet æ¥å£](#servlet-æ¥å£) - [Servlet å HTTP ç¶æç ](#servlet-å-http-ç¶æç ) - [HTTP ç¶æç ](#http-ç¶æç ) - [设置 HTTP ç¶æç çæ¹æ³](#设置-http-ç¶æç çæ¹æ³) - [HTTP ç¶æç å®ä¾](#http-ç¶æç å®ä¾) ## JavaWeb ç®ä» ### Web åºç¨ç¨åº Webï¼å¨è±è¯ä¸ web å³è¡¨ç¤ºç½é¡µçææï¼å®ç¨äºè¡¨ç¤º Internet 主æºä¸ä¾å¤ç访é®çèµæºã Web åºç¨ç¨åºæ¯ä¸ç§å¯ä»¥éè¿ Web 访é®çåºç¨ç¨åºï¼ç¨åºçæå¤§å¥½å¤æ¯ç¨æ·å¾å®¹æè®¿é®åºç¨ç¨åºï¼ç¨æ·åªéè¦ææµè§å¨å³å¯ï¼ä¸éè¦åå®è£ å ¶ä»è½¯ä»¶ã Internet ä¸ä¾å¤ç访é®ç Web èµæºåä¸ºï¼ - éæ web èµæºï¼æ web 页é¢ä¸ä¾äººä»¬æµè§çæ°æ®å§ç»æ¯ä¸åã常è§éæèµæºæä»¶ï¼htmlãcssãåç§å¾çç±»åï¼jpgãpngï¼ - 卿 web èµæºï¼æ web 页é¢ä¸ä¾äººä»¬æµè§çæ°æ®æ¯ç±ç¨åºäº§ççï¼ä¸åæ¶é´ç¹è®¿é® web 页é¢çå°çå 容åä¸ç¸åã常è§å¨æèµæºææ¯ï¼JSP/ServletãASPãPHP ### å¸¸è§ Web æå¡å¨ - [Tomcat](http://tomcat.apache.org/) - [Jetty](http://www.eclipse.org/jetty/) - [Resin](https://caucho.com/) - [Apache](http://httpd.apache.org/) - [Nginx](http://nginx.org/en/) - [WebSphere](https://www.ibm.com/cloud/websphere-application-platform) - [WebLogic](https://www.oracle.com/middleware/technologies/weblogic.html) - JBoss ## Servlet ç®ä» ### ä»ä¹æ¯ Servlet Servletï¼Server Appletï¼ï¼å³å°æå¡ç¨åºææå¡è¿æ¥å¨ãServlet æ¯ Java ç¼åçæå¡å¨ç«¯ç¨åºï¼å ·æç¬ç«äºå¹³å°ååè®®çç¹æ§ï¼ä¸»è¦åè½å¨äºäº¤äºå¼å°æµè§åçææ°æ®ï¼çæå¨æ Web å 容ã - çä¹ç Servlet æ¯æ Java å®ç°çä¸ä¸ªæ¥å£ã - 广ä¹ç Servlet æ¯æä»»ä½å®ç°äºè¿ä¸ª Servlet æ¥å£çç±»ã Servlet è¿è¡äºæ¯æ Java çåºç¨æå¡å¨ä¸ãä»åçä¸è®²ï¼Servlet å¯ä»¥ååºä»»ä½ç±»åç请æ±ï¼ä½ç»å¤§å¤æ°æ åµä¸ Servlet åªç¨æ¥æ©å±åºäº HTTP åè®®ç Web æå¡å¨ã ### Servlet å CGI çåºå« Servlet ææ¯åºç°ä¹åï¼Web 主è¦ä½¿ç¨ CGI ææ¯ãå®ä»¬çåºå«å¦ä¸ï¼ - Servlet æ¯åºäº Java ç¼åçï¼å¤äºæå¡å¨è¿ç¨ä¸ï¼ä»è½å¤éè¿å¤çº¿ç¨æ¹å¼è¿è¡ service() æ¹æ³ï¼ä¸ä¸ªå®ä¾å¯ä»¥æå¡äºå¤ä¸ªè¯·æ±ï¼èä¸ä¸è¬ä¸ä¼éæ¯ï¼ - CGI(Common Gateway Interface)ï¼å³éç¨ç½å ³æ¥å£ãå®ä¼ä¸ºæ¯ä¸ªè¯·æ±äº§çæ°çè¿ç¨ï¼æå¡å®æåéæ¯ï¼æä»¥æçä¸ä½äº Servletã ### Servlet çæ¬ä»¥å主è¦ç¹æ§ | çæ¬ | æ¥æ | JAVA EE/JDK çæ¬ | ç¹æ§ | | ----------- | ------------- | ------------------ | --------------------------------------------------------------------- | | Servlet 4.0 | 2017 å¹´ 10 æ | JavaEE 8 | HTTP2 | | Servlet 3.1 | 2013 å¹´ 5 æ | JavaEE 7 | éé»å¡ I/Oï¼HTTP åè®®å级æºå¶ | | Servlet 3.0 | 2009 å¹´ 12 æ | JavaEE 6, JavaSE 6 | å¯æææ§ï¼æäºå¼åï¼å¼æ¥ Servletï¼å®å ¨æ§ï¼æä»¶ä¸ä¼ | | Servlet 2.5 | 2005 å¹´ 10 æ | JavaEE 5, JavaSE 5 | ä¾èµ JavaSE 5ï¼æ¯ææ³¨è§£ | | Servlet 2.4 | 2003 å¹´ 11 æ | J2EE 1.4, J2SE 1.3 | web.xml ä½¿ç¨ XML Schema | | Servlet 2.3 | 2001 å¹´ 8 æ | J2EE 1.3, J2SE 1.2 | Filter | | Servlet 2.2 | 1999 å¹´ 8 æ | J2EE 1.2, J2SE 1.2 | æä¸º J2EE æ å | | Servlet 2.1 | 1998 å¹´ 11 æ | æªæå® | First official specification, added RequestDispatcher, ServletContext | | Servlet 2.0 | | JDK 1.1 | Part of Java Servlet Development Kit 2.0 | | Servlet 1.0 | 1997 å¹´ 6 æ | | | ### Servlet ä»»å¡ Servlet æ§è¡ä»¥ä¸ä¸»è¦ä»»å¡ï¼ - 读å客æ·ç«¯ï¼æµè§å¨ï¼åéçæ¾å¼çæ°æ®ãè¿å æ¬ç½é¡µä¸ç HTML 表åï¼æè ä¹å¯ä»¥æ¯æ¥èª applet æèªå®ä¹ç HTTP 客æ·ç«¯ç¨åºç表åã - 读å客æ·ç«¯ï¼æµè§å¨ï¼åéçéå¼ç HTTP è¯·æ±æ°æ®ãè¿å æ¬ cookiesãåªä½ç±»ååæµè§å¨è½çè§£çåç¼©æ ¼å¼ççã - å¤çæ°æ®å¹¶çæç»æãè¿ä¸ªè¿ç¨å¯è½éè¦è®¿é®æ°æ®åºï¼æ§è¡ RMI æ CORBA è°ç¨ï¼è°ç¨ Web æå¡ï¼æè ç´æ¥è®¡ç®å¾åºå¯¹åºçååºã - åéæ¾å¼çæ°æ®ï¼å³ææ¡£ï¼å°å®¢æ·ç«¯ï¼æµè§å¨ï¼ãè¯¥ææ¡£çæ ¼å¼å¯ä»¥æ¯å¤ç§å¤æ ·çï¼å æ¬ææ¬æä»¶ï¼HTML æ XMLï¼ãäºè¿å¶æä»¶ï¼GIF å¾åï¼ãExcel çã - åééå¼ç HTTP ååºå°å®¢æ·ç«¯ï¼æµè§å¨ï¼ãè¿å æ¬åè¯æµè§å¨æå ¶ä»å®¢æ·ç«¯è¢«è¿åçææ¡£ç±»åï¼ä¾å¦ HTMLï¼ï¼è®¾ç½® cookies åç¼ååæ°ï¼ä»¥åå ¶ä»ç±»ä¼¼çä»»å¡ã ### Servlet çå½å¨æ  Servlet çå½å¨æå¦ä¸ï¼ 1. **å è½½** - 第ä¸ä¸ªå°è¾¾æå¡å¨ç HTTP 请æ±è¢«å§æ´¾å° Servlet 容å¨ã容å¨éè¿ç±»å è½½å¨ä½¿ç¨ Servlet 类对åºçæä»¶å è½½ servletï¼ 2. **åå§å** - Servlet éè¿è°ç¨ **init ()** æ¹æ³è¿è¡åå§åã 3. **æå¡** - Servlet è°ç¨ **service()** æ¹æ³æ¥å¤ç客æ·ç«¯ç请æ±ã 4. **鿝** - Servlet éè¿è°ç¨ **destroy()** æ¹æ³ç»æ¢ï¼ç»æï¼ã 5. **å¸è½½** - Servlet æ¯ç± JVM çåå¾åæ¶å¨è¿è¡åå¾åæ¶çã ## Servlet API ### Servlet å Java Servlet æ¯è¿è¡å¨å¸¦ææ¯æ Java Servlet è§èçè§£éå¨ç web æå¡å¨ä¸ç Java ç±»ã Servlet å¯ä»¥ä½¿ç¨ **javax.servlet** å **javax.servlet.http** å å建ï¼å®æ¯ Java ä¼ä¸ççæ åç»æé¨åï¼Java ä¼ä¸çæ¯æ¯æå¤§åå¼å项ç®ç Java ç±»åºçæ©å±çæ¬ã Java Servlet å°±åä»»ä½å ¶ä»ç Java ç±»ä¸æ ·å·²ç»è¢«å建åç¼è¯ã卿¨å®è£ Servlet å å¹¶æå®ä»¬æ·»å å°æ¨çè®¡ç®æºä¸ç Classpath 类路å¾ä¸ä¹åï¼æ¨å°±å¯ä»¥éè¿ JDK ç Java ç¼è¯å¨æä»»ä½å ¶ä»ç¼è¯å¨æ¥ç¼è¯ Servletã ### Servlet æ¥å£ #### init() æ¹æ³ init æ¹æ³è¢«è®¾è®¡æåªè°ç¨ä¸æ¬¡ãå®å¨ç¬¬ä¸æ¬¡å建 Servlet æ¶è¢«è°ç¨ï¼å¨åç»æ¯æ¬¡ç¨æ·è¯·æ±æ¶ä¸åè°ç¨ãå æ¤ï¼å®æ¯ç¨äºä¸æ¬¡æ§åå§åï¼å°±å Applet ç init æ¹æ³ä¸æ ·ã Servlet å建äºç¨æ·ç¬¬ä¸æ¬¡è°ç¨å¯¹åºäºè¯¥ Servlet ç URL æ¶ï¼ä½æ¯æ¨ä¹å¯ä»¥æå® Servlet 卿å¡å¨ç¬¬ä¸æ¬¡å¯å¨æ¶è¢«å è½½ã å½ç¨æ·è°ç¨ä¸ä¸ª Servlet æ¶ï¼å°±ä¼å建ä¸ä¸ª Servlet å®ä¾ï¼æ¯ä¸ä¸ªç¨æ·è¯·æ±é½ä¼äº§çä¸ä¸ªæ°ç线ç¨ï¼éå½çæ¶åç§»äº¤ç» doGet æ doPost æ¹æ³ãinit() æ¹æ³ç®åå°å建æå è½½ä¸äºæ°æ®ï¼è¿äºæ°æ®å°è¢«ç¨äº Servlet çæ´ä¸ªçå½å¨æã init æ¹æ³çå®ä¹å¦ä¸ï¼ ```java public void init() throws ServletException { // åå§å代ç ... } ``` #### service() æ¹æ³ service() æ¹æ³æ¯æ§è¡å®é ä»»å¡çä¸»è¦æ¹æ³ãServlet 容å¨ï¼å³ Web æå¡å¨ï¼è°ç¨ service() æ¹æ³æ¥å¤çæ¥èªå®¢æ·ç«¯ï¼æµè§å¨ï¼ç请æ±ï¼å¹¶ææ ¼å¼åçååºååç»å®¢æ·ç«¯ã æ¯æ¬¡æå¡å¨æ¥æ¶å°ä¸ä¸ª Servlet è¯·æ±æ¶ï¼æå¡å¨ä¼äº§çä¸ä¸ªæ°ç线ç¨å¹¶è°ç¨æå¡ãservice() æ¹æ³æ£æ¥ HTTP 请æ±ç±»åï¼GETãPOSTãPUTãDELETE çï¼ï¼å¹¶å¨éå½çæ¶åè°ç¨ doGetãdoPostãdoPutï¼doDelete çæ¹æ³ã ä¸é¢æ¯è¯¥æ¹æ³çç¹å¾ï¼ ```java public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ } ``` service() æ¹æ³ç±å®¹å¨è°ç¨ï¼service æ¹æ³å¨éå½çæ¶åè°ç¨ doGetãdoPostãdoPutãdoDelete çæ¹æ³ãæä»¥ï¼æ¨ä¸ç¨å¯¹ service() æ¹æ³åä»»ä½å¨ä½ï¼æ¨åªéè¦æ ¹æ®æ¥èªå®¢æ·ç«¯ç请æ±ç±»åæ¥éå doGet() æ doPost() å³å¯ã doGet() å doPost() æ¹æ³æ¯æ¯æ¬¡æå¡è¯·æ±ä¸æå¸¸ç¨çæ¹æ³ãä¸é¢æ¯è¿ä¸¤ç§æ¹æ³çç¹å¾ã #### doGet() æ¹æ³ GET è¯·æ±æ¥èªäºä¸ä¸ª URL çæ£å¸¸è¯·æ±ï¼æè æ¥èªäºä¸ä¸ªæªæå® METHOD ç HTML 表åï¼å®ç± doGet() æ¹æ³å¤çã ```java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代ç } ``` #### doPost() æ¹æ³ POST è¯·æ±æ¥èªäºä¸ä¸ªç¹å«æå®äº METHOD 为 POST ç HTML 表åï¼å®ç± doPost() æ¹æ³å¤çã ```java public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代ç } ``` #### destroy() æ¹æ³ destroy() æ¹æ³åªä¼è¢«è°ç¨ä¸æ¬¡ï¼å¨ Servlet çå½å¨æç»ææ¶è¢«è°ç¨ãdestroy() æ¹æ³å¯ä»¥è®©æ¨ç Servlet å ³éæ°æ®åºè¿æ¥ã忢åå°çº¿ç¨ãæ Cookie å表æç¹å»è®¡æ°å¨åå ¥å°ç£çï¼å¹¶æ§è¡å ¶ä»ç±»ä¼¼çæ¸ çæ´»å¨ã å¨è°ç¨ destroy() æ¹æ³ä¹åï¼servlet 对象被æ 记为åå¾åæ¶ãdestroy æ¹æ³å®ä¹å¦ä¸æç¤ºï¼ ```java public void destroy() { // ç»æ¢å代ç ... } ``` ## Servlet å HTTP ç¶æç title: JavaEE Servlet HTTP ç¶æç date: 2017-11-08 categories: - javaee tags: - javaee - servlet - http ### HTTP ç¶æç HTTP 请æ±å HTTP ååºæ¶æ¯çæ ¼å¼æ¯ç±»ä¼¼çï¼ç»æå¦ä¸ï¼ - åå§ç¶æè¡ + å车æ¢è¡ç¬¦ï¼å车+æ¢è¡ï¼ - é¶ä¸ªæå¤ä¸ªæ é¢è¡+å车æ¢è¡ç¬¦ - ä¸ä¸ªç©ºç½è¡ï¼å³å车æ¢è¡ç¬¦ - ä¸ä¸ªå¯éçæ¶æ¯ä¸»ä½ï¼æ¯å¦æä»¶ãæ¥è¯¢æ°æ®ææ¥è¯¢è¾åº ä¾å¦ï¼æå¡å¨çååºå¤´å¦ä¸æç¤ºï¼ ```http HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line)
... ... ``` ç¶æè¡å æ¬ HTTP çæ¬ï¼å¨æ¬ä¾ä¸ä¸º HTTP/1.1ï¼ãä¸ä¸ªç¶æç ï¼å¨æ¬ä¾ä¸ä¸º 200ï¼åä¸ä¸ªå¯¹åºäºç¶æç ççæ¶æ¯ï¼å¨æ¬ä¾ä¸ä¸º OKï¼ã 以䏿¯å¯è½ä» Web æå¡å¨è¿åç HTTP ç¶æç åç¸å ³çä¿¡æ¯åè¡¨ï¼ - `1**`ï¼ä¿¡æ¯æ§ç¶æç - `2**`ï¼æåç¶æç - 200ï¼è¯·æ±æ£å¸¸æå - 204ï¼æç¤ºè¯·æ±æå使²¡æè¿åæ°ä¿¡æ¯ - 206ï¼æç¤ºæå¡å¨å·²å®æå¯¹èµæºçé¨å GET è¯·æ± - `3**`ï¼éå®åç¶æç - 301ï¼æ°¸ä¹ æ§éå®å - 302ï¼ä¸´æ¶æ§éå®å - 304ï¼æå¡å¨ç«¯å 许请æ±è®¿é®èµæºï¼ä½æªæ»¡è¶³æ¡ä»¶ - `4**`ï¼å®¢æ·ç«¯éè¯¯ç¶æç - 400ï¼è¯·æ±æ¥æä¸åå¨è¯æ³é误 - 401ï¼åéç请æ±éè¦æéè¿ HTTP 认è¯ç认è¯ä¿¡æ¯ - 403ï¼å¯¹è¯·æ±èµæºç访é®è¢«æå¡å¨æç»äº - 404ï¼æå¡å¨ä¸æ æ³æ¾å°è¯·æ±çèµæº - `5**`ï¼æå¡å¨éè¯¯ç¶æç - 500ï¼æå¡å¨ç«¯å¨æ§è¡è¯·æ±æ¶åçäºé误 - 503ï¼æå¡å¨ææ¶å¤äºè¶ è´è½½ææ£å¨è¿è¡åæºç»´æ¤ï¼ç°å¨æ æ³å¤çè¯·æ± ### 设置 HTTP ç¶æç çæ¹æ³ ä¸é¢çæ¹æ³å¯ç¨äºå¨ Servlet ç¨åºä¸è®¾ç½® HTTP ç¶æç ãè¿äºæ¹æ³éè¿ `HttpServletResponse` 对象å¯ç¨ã | åºå· | æ¹æ³ & æè¿° | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | **public void setStatus ( int statusCode )**è¯¥æ¹æ³è®¾ç½®ä¸ä¸ªä»»æçç¶æç ãsetStatus æ¹æ³æ¥åä¸ä¸ª intï¼ç¶æç ï¼ä½ä¸ºåæ°ã妿æ¨çååºå å«äºä¸ä¸ªç¹æ®çç¶æç åææ¡£ï¼è¯·ç¡®ä¿å¨ä½¿ç¨ _PrintWriter_ å®é è¿åä»»ä½å 容ä¹åè°ç¨ setStatusã | | 2 | **public void sendRedirect(String url)**è¯¥æ¹æ³çæä¸ä¸ª 302 ååºï¼è¿åä¸ä¸ªå¸¦ææ°ææ¡£ URL ç _Location_ 头ã | | 3 | **public void sendError(int code, String message)**è¯¥æ¹æ³åéä¸ä¸ªç¶æç ï¼é常为 404ï¼ï¼è¿åä¸ä¸ªå¨ HTML ææ¡£å é¨èªå¨æ ¼å¼åå¹¶åéå°å®¢æ·ç«¯ççæ¶æ¯ã | ### HTTP ç¶æç å®ä¾ ä¸é¢çä¾åæ 407 é误代ç åéå°å®¢æ·ç«¯æµè§å¨ï¼æµè§å¨ä¼æ¾ç¤º "Need authentication!!!" æ¶æ¯ã ```java // å¯¼å ¥å¿ éç java åº import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // æ©å± HttpServlet ç±» public class showError extends HttpServlet { // å¤ç GET æ¹æ³è¯·æ±çæ¹æ³ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置é误代ç ååå response.sendError(407, "Need authentication!!!" ); } // å¤ç POST æ¹æ³è¯·æ±çæ¹æ³ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` ç°å¨ï¼è°ç¨ä¸é¢ç Servlet å°æ¾ç¤ºä»¥ä¸ç»æï¼ ```http HTTP Status 407 - Need authentication!!! type Status report message Need authentication!!! description The client must first authenticate itself with the proxy (Need authentication!!!). Apache Tomcat/5.5.29 ```