Java Servlet教程– ULTIMATE指南(PDF下载)
Java Servlets是一種基于Java的Web技術。 Java Servlet技術為Web開發人員提供了一種簡單,一致的機制,以擴展Web服務器的功能并訪問現有的業務系統。
幾乎可以將Servlet看作是在服務器端運行的applet,它沒有任何表情。 Java servlet使許多Web應用程序成為可能。
Java Servlet構成Java企業版(Java EE)的基本部分。 請注意,Java Servlet必須在兼容Servlet的“ Servlet容器(例如Web服務器)內執行”才能起作用。
本教程可作為基于Java Servlet的代碼的全面的入門指南。
目錄
1.簡介1.簡介
Servlet是Java編程語言類,是Java Enterprise Edition(Java EE)的一部分。 Sun Microsystems在1997年開發了第一個版本1.0。當前版本是Servlet 3.1。
Servlet用于通過擴展服務器的功能在Java中創建動態Web應用程序。 它可以在任何與Servlet容器集成的Web服務器上運行。
1.1 Java Servlet流程
servlet的過程如下所示:
圖1:用戶請求的servlet處理
- 客戶端將請求發送到Servlet容器。 該容器充當Web服務器。
- Web服務器搜索servlet并啟動它。
- 客戶端請求由Servlet處理,并將響應發送回服務器。
- 然后,服務器響應將轉發給客戶端。
1.2優點
- Servlet是獨立于平臺的,因為它們可以在任何平臺上運行。
- Servlet API繼承了Java平臺的所有功能。
- 它為服務器端擴展構建和修改安全邏輯。
- Servlet繼承了Web服務器提供的安全性。
- 在Servlet中,僅單個請求實例同時運行。 它不會在單獨的進程中運行。 因此,它通過消除為每個請求創建新進程的開銷來節省內存。
2.生命周期
Servlet生命周期描述Servlet容器如何管理Servlet對象。
- 加載Servlet類
- Servlet實例在加載Servlet類時由Web容器創建
- init() :僅在創建servlet時調用一次。 無需多次調用它。
- service() :Web容器調用它來處理來自客戶端的請求。 此處完成了代碼的實際功能。 每次收到servlet請求時,Web容器都會調用此方法。
它調用doGet() , doPost() , doTrace() , doPut() , doDelete()和其他方法
- doGet() :
- doPost() :
- destroy() :它用于清理資源,在刪除servlet實例之前被調用。
圖2:Servlet生命周期
3.容器
它被稱為Servlet引擎,它管理Web服務器頂部的Java Servlet組件,以響應客戶端發送的請求。
3.1服務
Servlet容器提供以下服務:
- 它管理Servlet的生命周期。
- Servlet,JSP頁面和HTML文件等資源由Servlet容器管理。
- 它將會話ID附加到URL路徑以維護會話。
- 提供安全服務。
- 它從網絡服務,文件系統(例如遠程文件系統)和本地文件系統中加載servlet類。
3.2 Servlet容器配置
可以使用Web服務器將servlet容器配置為通過以下三種方式管理servlet:
- 獨立容器
- 加工容器
- 后處理容器
獨立容器 :這種類型的Web服務器功能由Servlet容器提供。 在這里,容器與Web服務器緊密耦合。
進程內容器 :在此容器中,容器在Web服務器進程內運行。
進程外容器 :在這種類型中,需要將servlet容器配置為在Web服務器進程外部運行。 在某些情況下(例如需要在不同的進程/系統中運行Servlet和Servlet容器)使用它。
4.演示:首先
這是顯示Demo Servlet的示例。 請按照以下步驟從NetBeansIDE中的第一個Servlet應用程序開始。
步驟1:打開NetBeansIDE->文件->新建項目-> WebApplication->將項目名稱設置為WebApplicationServletDemo
圖3:在NetBeansIDE中創建新的WebApplication項目:WebApplicationServletDemo
步驟2:現在,單擊Next>,如上所示。 這將創建具有以下目錄結構的新項目。
圖4:創建新項目后的項目目錄
步驟3:通過右鍵單擊Project Directory-> New-> Servlet創建新的Servlet應用程序
圖5:添加Servlet文件
步驟4:將Servlet類名稱添加為“ ServletDemo ”,然后單擊Next 。
圖6:添加Servlet類名
步驟5:現在,通過選中“ 將信息添加到部署描述符(web.xml) ”并添加URL模式(鏈接可見)作為ServletDemo 來配置Servlet部署。 此步驟將在WEB-INF文件夾中生成web.xml文件。
圖7:配置Servlet部署
步驟6:如上圖所示,單擊Finish,這將在項目目錄下添加ServletDemo.java servlet。 檢查目錄結構下的更改:
圖8:配置后項目目錄下的更改
這是URL- patter為/ ServletDemo的部署描述符(web.xml)的代碼:
清單1:web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>ServletDemo</servlet-class> </servlet> <servlet-mapping><servlet-name>ServletDemo</servlet-name><url-pattern>/ServletDemo</url-pattern> </servlet-mapping> <session-config> <session-timeout>30 </session-timeout> </session-config> </web-app>這里,
<servlet-name>: name given to Servlet <servlet-class>: servlet class <servlet-mapping>: maps internal name to URL <url-pattern>: link displays when Servlet runs超鏈接下被提及作為ServletDemo。 因此,當用戶單擊它時,頁面將重定向到ServletDemo servlet,該servlet的url-pattern被稱為ServetDemo :
清單2:index.html
<html> <head> <title>Welcome</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <div><h2>Welcome</h2></div> <p>We're still under development stage. Stay Tuned for our website's new design and learning content.</p> <a href="ServletDemo"><b>Next</b></a> </body> </html>清單3:ServletDemo.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ServletDemo extends HttpServlet {protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");try (PrintWriter out = response.getWriter()) {out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<title>Servlet ServletDemo</title>"); out.println("</head>");out.println("<body>");out.println("<h1>Servlet ServletDemo at " + request.getContextPath() + "</h1>");out.println("</body>");out.println("</html>");}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter(); try {/* TODO output your page here. You may use following sample code. */ out.println("<!DOCTYPE html>"); out.println("<html>");out.println("<head>");out.println("<title>Servlets</title>");out.println("</head>");out.println("<body>");out.println("<br /><p><h2>First Demo Servlet application</h2><br />Here, the URL-pattern is ServletDemo in web.xml. So, the address is <i>WebApplicationServletDemo/ServletDemo</i>.</p>");out.println("<br /><br /><a href=\"index.html\">Previous Page</a>");out.println("</body>");out.println("</html>");} finally { out.close(); }} }圖9:顯示index.html歡迎頁面的輸出
圖10:顯示重定向到ServletDemo.java的輸出
5.篩選
過濾器將請求,響應和標頭信息的內容從一種格式轉換為另一種格式。 這些是可重用的代碼。
- 過濾器類在部署描述符中聲明。
- 它用于編寫可重用的組件。
- 該請求是使用過濾器調用之前的處理過程。
- 它可以在Web應用程序下用于某些任務,例如:
- 驗證方式
5.1界面
它由以下3個過濾器組成:
圖11:過濾器API接口
過濾
這是所有過濾器類都應實現的初始接口和基本接口。 Java.servlet.Filter接口具有以下方法:
| init(FilterConfig) | 此方法初始化過濾器 |
| doFilter(ServletRequest, ServletResponse, FilterChain) | 此方法將服務邏輯封裝在ServletRequest上以生成ServletResponse。 FilterChain將請求/響應對轉發到下一個過濾器。 |
| destroy() | 它破壞了過濾器類的實例。 |
FilterConfig
過濾器初始化時使用其對象。 部署描述符(web.xml)由配置信息組成。 FilterConfig接口的對象用于獲取有關web.xml中指定的過濾器的配置信息。 其方法如下:
| getFilterName() | 它在web.xml中返回過濾器的名稱 |
| getInitParameter(String) | 它從web.xml返回指定的初始化參數的值 |
| getInitParameterNames() | 它返回過濾器的所有初始化參數的枚舉。 |
| getServletContext() | 它返回ServletContext對象。 |
過濾鏈
它存儲有關1個以上過濾器(鏈)的信息。 在處理請求之前,應根據請求應用此鏈中的所有篩選器。
5.2范例
這是一個顯示NetBeansIDE中的篩選器應用程序的示例。 以與演示部分相同的方式創建一個WebApplication項目WebApplicationFilterDemo 。 右鍵單擊項目目錄->新建->過濾器,可以將新過濾器添加到Web應用程序中
圖12:將新的過濾器添加到Web應用程序
圖13:將類名添加為NewFilter,然后單擊Next
通過選中“ 將信息添加到部署描述符(web.xml) ” 來配置過濾器部署。 現在,由于圖13中突出顯示的錯誤,此處的“ 下一步”按鈕被禁用。可以通過單擊“ 新建 ”來解決“ 輸入至少一個URL模式 ”錯誤。
圖14:通過選中“將信息添加到部署描述符(web.xml)”來配置過濾器部署
現在,通過添加URL模式來映射過濾器,如圖15所示。
圖15:過濾器映射
添加新的過濾器并單擊“確定”后,錯誤將得到解決。 現在,添加帶有名稱和值的init參數 。 然后單擊完成 。
圖16:添加init參數
清單4:web.xml
可以將Filter NewFilter應用于每個servlet,因為這里為URL模式指定了/ *。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <filter> <filter-name>NewFilter</filter-name> <filter-class>NewFilter</filter-class><init-param><param-name>newParam</param-name><param-value>valueOne</param-value></init-param> </filter> <filter-mapping><filter-name>NewFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping> <session-config><session-timeout>30</session-timeout> </session-config> </web-app>清單5:NewFilter.java
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*;public class NewFilter implements Filter {public void init(FilterConfigfilterConfig) { // init parameterString value = filterConfig.getInitParameter("newParam"); // displaying init parameter valueSystem.out.println("The Parameter value: " + value); }public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// IP address of the client machine. String remoteAddress = request.getRemoteAddr();// Returns the remote addressSystem.out.println("Remote Internet Protocl Address: "+ remoteAddress);chain.doFilter(request,response);}public void destroy( ){} }圖17:顯示控制臺輸出
6.會議
它是客戶端和服務器之間的HTTP請求的集合。 會話在過期時將被銷毀,并且其資源將返回給Servlet引擎。
6.1會話處理
這是跟蹤會話數據的一種方法。 這表示在會話中傳輸的數據。 當Web服務器可能需要來自一個會話的會話數據來完成相同或不同會話中的任務時,將使用此方法。 會話處理也稱為會話跟蹤。
6.2會話處理機制
會話處理有四種機制:
URL重寫 :下一個請求中所需的會話數據將附加到客戶端用于發出下一個請求的URL路徑中。
· 查詢字符串:在請求的URI后面附加的字符串是查詢字符串。 該字符串后面加上分隔符“?” 字符。
示例1): http://localhost:8080/newproject/login?user=test&passwd=abcde
· 路徑信息:它是請求URI的一部分。 可以將會話數據添加到請求URI的路徑信息部分。
示例2): http://localhost:8080/newproject/myweb/login;user=test&passwd=abcde
隱藏的表單字段 :一種HTML表單字段,在視圖中保持隱藏狀態。 其他一些表單字段包括:文本框,密碼等。此方法可用于基于表單的請求。 它僅用于從其他不同類型的用戶隱藏用戶數據。
示例3: <input type="hidden" username="name" value="nameOne"/>
Cookies :它是一個文件,包含服務器發送給客戶端的信息。 Cookie通過HTTP響應標頭傳輸到客戶端(從服務器)后,將保存在客戶端。
當我們想減少網絡流量時,cookie被認為是最好的。 它的屬性是名稱,值,域,版本號,路徑和注釋。 包javax.servlet.http由一個名為Cookie的類組成。
下面列出了javax.servlet.http.Cookie類中的一些方法:
- setValue (String)
- getValue()
- getName()
- setComment(String)
- getComment()
- setVersion(String)
- getVersion()
- setDomain(String)
- setPath(String)
- getPath()
- setSecure(boolean)
- getSecure(boolean)
HTTP會話 :它提供通過HttpSession對象實現的會話管理服務。
這里列出了一些HttpSession對象方法。 這是從Oracle官方文檔中引用的:
| public Object getAttribute(String name) | 它在此會話中返回與指定名稱綁定的對象;如果該名稱下未綁定任何對象,則返回null。 |
| public Enumeration getAttributeNames() | 它返回String的Enumeration對象,其中包含綁定到該會話的所有對象的名稱。 |
| public String getId() | 它返回一個字符串,其中包含分配給該會話的唯一標識符。 |
| public long getCreationTime() | 它返回創建此會話的時間,以格林尼治標準時間1970年1月1日午夜以來的毫秒數為單位。 |
| public long getLastAccessedTime() | 它返回客戶端最后一次發送與此會話關聯的請求的時間。 |
| public int getMaxInactiveInterval() | 它返回最大時間間隔(以秒為單位),servlet容器將在客戶機訪問之間保持此會話打開。 |
| public void invalidate() | 它使該會話無效,然后取消綁定到該會話的任何對象。 |
| public boolean isNew() | 如果客戶端尚不知道會話,或者客戶端選擇不加入會話,則返回true。 |
6.3范例
在此示例下,將打印會話信息,例如會話ID,會話創建時間,上次訪問時間等。
清單6:ServletSession.java
import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class ServletSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// session object creationHttpSessionnewSession = request.getSession(true);// Session creation time.Date cTime = new Date(newSession.getCreationTime());// The last time the client sent a request.Date lTime = new Date( newSession.getLastAccessedTime());/* sets the time, in seconds, between client requests before the servlet container invalidates this session */newSession.setMaxInactiveInterval(1 * 60 * 60);String str = "Website | Session";response.setContentType("text/html");PrintWriter out = response.getWriter();String document ="<!doctype html public \"-//w3c//dtd html 4.0 " +"transitional//en\">\n";out.println(document +"<html>\n" +"<head><title>" + str + "</title></head>\n" +"<body bgcolor=\"#bbf5f0\">\n" +"<h2>Website: Displaying Session Information</h2>\n" +"<table border=\"2\">\n" +"<tr>\n" +" <td>Unique identifier assigned to this session</td>\n" +" <td>" + newSession.getId() + "</td>"+ "</tr>\n" +"<tr>\n" +" <td>The time when this session was created</td>\n" +" <td>" + cTime + " </td>"+ "</tr>\n" +"<tr>\n" +" <td>The last time the client sent a request associated with this session</td>\n"+ " <td>" + lTime + " </td>"+ "</tr>\n" +"</tr>\n" +"<tr>\n" +" <td> the maximum time interval, in seconds that the servlet container will keep this session open between client accesses.</td>\n" +" <td>" + newSession.getMaxInactiveInterval() + " </td>"+ "</tr>\n" +"</table>\n" +"</body></html>");} }圖18:顯示輸出
7.異常處理
異常用于處理錯誤。 這是對無法忍受的條件的反應。 這是web.xml的角色,即用于運行JSP和servlet頁面的部署描述。 容器在web.xml中搜索配置以查找匹配項。 因此,在servlet引發異常時,請在web.xml中使用這些異常類型元素與所引發的異常類型進行匹配。
7.1錯誤代碼配置
當出現狀態碼為403的錯誤時,將調用/ HandlerClass servlet,如下所示:
清單7:錯誤代碼為403
<error-page><error-code>403</error-code><location>/HandlerClass</location> </error-page>7.2異常類型配置
如果應用程序引發IOException,則/ HandlerClass servlet被容器調用:
清單8:對于異常類型IOException
<error-page><exception-type>java.io.IOException</exception-type ><location>/HandlerClass</location> </error-page>如果要避免添加單獨的元素的開銷,請使用java.lang.Throwable作為異常類型:
清單9:對于所有異常,請提及java.lang.Throwable:
<error-page><exception-type>java.lang.Throwable</exception-type ><location>/HandlerClass</location> </error-page>8.調試
在Servlet中,大量的客戶機/服務器交互。 這使得錯誤很難定位。 對于位置警告和錯誤,可以采用不同的方法。
8.1消息記錄
提供日志以獲取有關警告和錯誤消息的信息。 為此,使用標準的日志記錄方法。 Servlet API可以使用log()方法生成此信息。 使用Apache Tomcat,可以在TomcatDirectory / logs中找到這些日志。
8.2 Java調試器
可以使用JDB調試器(即Java調試器)調試Servlet。 在此,要調試的程序是sun.servlet.http.HttpServer。 設置調試器的類路徑以查找以下類:
- servlet.http.HttpServer
- server_root / servlet和server_root / classes:通過此調試器,可以在servlet中設置斷點。
8.3標頭
用戶應該具有一些與HTTP標頭結構有關的信息。 可以使用它們來判斷問題,從而可以進一步定位一些未知錯誤。 與HTTP標頭相關的信息可以幫助您查找錯誤。 研究請求和響應可以幫助您猜測進展不順利。
8.4刷新
刷新瀏覽器的網頁,以避免其緩存先前的請求。 在某些階段,瀏覽器會顯示先前執行的請求。 這是一個已知點,但對于那些工作正常但無法正確顯示結果的人來說可能是個問題。
清單21:ServletDebugging.java
在這里,顯示了Servlet Debugging,它在Tomcat日志中顯示錯誤。
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ServletDebugging extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// parameter "name"String strpm = request.getParameter("name");ServletContext context = getServletContext( );// checks if the parameter is set or notif (strpm == null || strpm.equals(""))context.log("No message received:", new IllegalStateException("Sorry, the parameter is missing."));elsecontext.log("Here is the visitor's message: " +strpm);} }圖19:在Apache Tomcat日志中可見的輸出
9.國際化
在建立全球網站時,要考慮一些重要點,其中包括與用戶國籍有關的語言。 國際化使網站能夠根據用戶的國籍提供以不同語言翻譯的內容。
9.1方法
為了查找訪客的本地區域和語言,使用了以下方法:
| String getCountry() | 返回國家代碼。 |
| String getDisplayCountry() | 返回訪問者所在國家/地區的名稱。 |
| String getLanguage() | 返回語言代碼。 |
| String getDisplayLanguage() | 返回訪問者語言的名稱。 |
| String getISO3Country() | 返回訪問者所在國家/地區的三個字母的縮寫。 |
| String getISO3Language() | 返回訪問者語言的三個字母的縮寫。 |
9.2范例
該示例顯示用戶的當前語言環境。 在NetBeansIDE中創建以下項目:
Project Name: WebApplicationInternationalization Project Location: C:\Users\Test\Documents\NetBeansProjects Servlet: ServletLocale URL Pattern: /ServletLocale清單22:ServletLocale.java
import java.io.IOException; import java.io.PrintWriter; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ServletLocale extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//Get the client's LocaleLocale newloc = request.getLocale();String country = newloc.getCountry();// Set response content typeresponse.setContentType("text/html");PrintWriter out = response.getWriter();// this sets the page title and body contentString title = "Finding Locale of current user";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " +"transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#C0C0C0\">\n" + "<h3>" + country + "</h3>\n" +"</body></html>");} }清單23:具有位置超鏈接作為URL模式的index.html – ServletLocale
<html> <head> <title>User's Location</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body><p>Click on the following link for finding the locale of visitor:</p><a href="ServletLocale"><b>Location</b></a> </body> </html>清單24:帶有URL模式為/ ServletLocale的 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> <servlet><servlet-name>ServletLocale</servlet-name><servlet-class>ServletLocale</servlet-class> </servlet> <servlet-mapping><servlet-name>ServletLocale</servlet-name><url-pattern>/ServletLocale</url-pattern> </servlet-mapping> <session-config> <session-timeout>30 </session-timeout> </session-config> </web-app>圖20:顯示index.html
圖21:將語言環境顯示為輸出
10.參考
10.1網站
- 官方Oracle文檔
- Sun開發人員網絡
- 免費NetBeans下載
- 免費Apache下載
- 免費Java下載
10.2書籍
- 首要的Servlet和JSP:通過Sun認證的Web組件開發人員考試,作者Bryan Basham,Kathy Sierra和Bert Bates
- Servlet和JSP(教程),作者Budi Kurniawan
11.結論
與傳統的通用網關接口(CGI)相比,Servlet具有快速的性能并且易于使用。 通過本指南,您可以輕松學習與Java Servlet相關的概念。 項目代碼是在NetBeansIDE下開發的,因此您還將對它的一些驚人的用戶友好功能有所了解。
12.下載
這是有關Java Servlet的教程。
下載您可以在此處下載本教程的完整源代碼: Servlet_Project_Code
翻譯自: https://www.javacodegeeks.com/2014/12/java-servlet-tutorial.html
總結
以上是生活随笔為你收集整理的Java Servlet教程– ULTIMATE指南(PDF下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科技昨夜今晨 0908:苹果四款 iPh
- 下一篇: 使用WSO2开发