- Java Web開發實例大全(基礎卷) (軟件工程師開發大系)
- 軟件開發技術聯盟
- 5468字
- 2021-03-26 13:01:26
第6章 Servlet技術
6.1 Servlet基礎
Servlet是Java Web應用中最核心的組件,也是Web服務器組件,它是一個中間控制層,負責處理客戶端提交過來的請求數據以及調用業務邏輯對象,根據業務邏輯來控制頁面轉發。為了更好地理解Servlet,本節將介紹一些Servlet基礎方面的實例。
實例164 動態生成HTML文檔
光盤位置:光盤\MR\06\164
初級
實用指數:
實例說明
在實際開發過程中,有時需要直接在Servlet中將數據的處理結果反饋給客戶端瀏覽器,這就需要通過Servlet來生成HTML內容。本實例將介紹如何在Servlet類中動態生成一個HTML頁面,運行結果如圖6.1所示。

圖6.1 使用Servlet動態生成的HTML頁的內容
關鍵技術
本實例主要是通過在Servlet類中使用HttpServletResponse對象來動態生成HTML頁。Servlet通過該對象來生成響應結果,首先需要通過HttpServletResponse對象的setContentType()方法來設置響應正文內容的MIME類型為text/html,表示響應結果為HTML網頁,然后再通過getWriter()方法獲得一個PrintWriter對象,該對象用于輸出字符串形式的HTML正文數據。
設計過程
(1)新建名為HTMLServlet的Servlet類,該類繼承自HttpServlet類,并在doPost()方法中編寫生成HTML文檔的代碼,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置響應的字符集格式為UTF-8 response.setCharacterEncoding("UTF-8"); //設置響應正文的MIME類型 response.setContentType("text/html"); //返回一個PrintWriter對象,Servlet使用它來輸出字符串形式的正文數據 PrintWriter out = response.getWriter(); //以下為輸出的HTML正文數據 out.println("<! DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println("HEAD><TITLE>動態生成HTML文檔</TITLE></HEAD>"); out.println("<BODY>"); out.println("<table border='0' align='center'>"); out.println("<tr><td bgcolor='skyblue'colspan=2>動態生成HTML文檔</td></tr>"); out.println("</table>"); out.println("</BODY>"); out.println("</HTML>"); out.flush(); out.close(); }
(2)在web.xml中配置HTMLServlet類,此處修改配置的URL為“/html”,然后通過路徑http://localhost:8080/143/html來訪問該Servlet類,關鍵代碼如下:
<servlet> <servlet-name>HTMLServlet</servlet-name> <servlet-class>com.lh.servlet.HTMLServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HTMLServlet</servlet-name> <url-pattern>/html</url-pattern> </servlet-mapping>
秘笈心法
在有些情況下,需要通過Servlet將數據處理的結果反饋給客戶端瀏覽器,因此需要通過Servlet來生成HTML文檔內容并響應給客戶端,而且生成的HTML文檔內容還可以包含JavaScript代碼以及CSS樣式等。
實例165 在Servlet中實現頁面轉發
光盤位置:光盤\MR\06\165
初級
實用指數:
實例說明
在實際的網站開發中,頁面轉發是最常見的。本實例將介紹如何在Servlet中控制頁面的轉發,在相應的文本框中輸入用戶名和密碼,單擊“登錄”按鈕,如果用戶名和密碼輸入正確則頁面轉發到成功頁,否則頁面跳轉到失敗頁,運行結果如圖6.2所示。

圖6.2 在Servlet中實現頁面轉發
關鍵技術
在Servlet中實現頁面轉發,使用的是RequestDispatcher對象的forward()方法。可以在Servlet中通過forward()方法將當前的請求轉發到其他Web組件(如Servlet、JSP、HTML)。
設計過程
(1)新建index.jsp頁,該頁主要包含一個輸入用戶名和密碼的<form>表單,其中<form>中的action屬性值為Servlet類在web.xml中配置的URL,提交方式為POST,關鍵代碼如下:
<form action="forward"method="post"> <table align="center"> <tr> <td>用戶名:</td> <td><input type="text"name="name"/></td> </tr> <tr> <td>密碼:</td> <td><input type="password"name="pwd"/></td> </tr> <tr> <td colspan="2"><input type="submit"value="登錄"/></td> </tr> </table> </form>
(2)新建名為ForwardServlet的Servlet類,在該類的doPost()方法中獲得表單請求信息,然后根據請求信息轉發頁面,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設置請求的字符編碼格式 String name=request.getParameter("name"); //獲得請求表單中的用戶名 String pwd=request.getParameter("pwd"); //獲得請求表單中的密碼 if((name! =null&&! name.equals(""))&&(pwd! =null&&! pwd.equals(""))){ if(name.equals("mr")&&pwd.equals("123")){ //使用RequestDispatcher對象將頁面請求轉發到success.jsp頁 request.getRequestDispatcher("success.jsp").forward(request, response); }else{ request.getRequestDispatcher("error.jsp").forward(request, response); } } }
(3)在web.xml中配置ForwardServlet類,主要修改用于配置URL的<url-pattern>標簽值為“/forward”,關鍵代碼如下:
<servlet> <servlet-name>ForwardServlet</servlet-name> <servlet-class>com.lh.servlet.ForwardServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ForwardServlet</servlet-name> <url-pattern>/forward</url-pattern> </servlet-mapping>
秘笈心法
如果實現的是單純的頁面跳轉并不需要傳遞請求對象,可以使用HttpServletResponse對象的sendRedirect()方法。如果想要在轉發頁面中獲得當前的請求對象,那就需要通過RequestDispatcher對象的forward()方法來實現。
實例166 在Servlet中實現頁面重定向
光盤位置:光盤\MR\06\166
初級
實用指數:
實例說明
本實例將介紹如何在Servlet中實現頁面重定向。如圖6.3所示,當用戶輸入的用戶名或密碼錯誤時,提交表單后在Servlet中會進行判斷,然后將頁面重定向到錯誤頁。

圖6.3 在Servlet中實現頁面重定向
關鍵技術
實現頁面重定向主要應用的是HttpServletResponse對象的sendRedirect()方法,該方法與頁面轉發的forward()方法有本質的區別。使用forward()方法時,會將當前正在處理的請求轉發到其他Web組件(Servlet、JSP、HTML),如將請求轉發到index.jsp頁,在該頁中可以通過request內置對象來獲得此請求。而sendRedirect()方法不會轉發請求,只是簡單的頁面跳轉。
設計過程
(1)新建名為RedirectServlet的Servlet類,該類繼承自HttpServlet類,在該類的doPost()方法中判斷用戶名和密碼是否正確,如果不正確會使用sendRedirect()方法將頁面重定向到錯誤頁,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設置請求數據的字符編碼格式 String name=request.getParameter("name"); //獲得請求表單中的用戶名 String pwd=request.getParameter("pwd"); //獲得請求表單中的密碼 if((name! =null&&! name.equals(""))&&(pwd! =null&&! pwd.equals(""))){ if(name.equals("mr")&&pwd.equals("123")){ //使用RequestDispatcher對象將頁面請求轉發到success.jsp頁 request.getRequestDispatcher("success.jsp").forward(request, response); }else{ response.sendRedirect("error.jsp"); //使用sendRedirect()方法將頁面重定向到error.jsp } } }
(2)在Servlet的配置文件web.xml中配置RedirectServlet類,關鍵代碼如下:
<servlet> <servlet-name>RedirectServlet</servlet-name> <servlet-class>com.lh.servlet.RedirectServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RedirectServlet</servlet-name> <url-pattern>/redirect</url-pattern> </servlet-mapping>
秘笈心法
HttpServletResponse對象的sendRedirect()方法一律返回狀態代碼為302的響應結果,瀏覽器端接收到這種響應結果后,立即自動請求訪問重定向的目標Web組件,客戶端最后接收到的是目標Web組件的響應結果。
實例167 在Servlet中處理表單提交的數據
光盤位置:光盤\MR\06\167
初級
實用指數:
實例說明
Java Web的核心組件Servlet的主要功能是處理客戶端的表單請求數據,在Servlet中首先對這些數據進行驗證,可能會將其封裝到JavaBean,接下來調用數據庫的業務邏輯方法將數據保存或者進行其他的操作,最后Servlet控制將響應結果返回給客戶端。運行本實例,如圖6.4所示,輸入用戶注冊信息提交后,在Servlet中將獲取這些表單請求信息,然后通過forward()方法將這些請求信息轉發,最后在轉發頁中顯示出這些信息。

圖6.4 在Servlet中獲取表單數據
關鍵技術
在Servlet中獲取表單信息主要是應用HttpServletRequest對象的getParameter()方法,該方法有一個String類型的參數,這個參數的名稱與表單元素的name屬性值對應,如果getParameter()方法嘗試讀取一個Null值,執行時會拋出一個java.lang.NULLPointerException的異常,也就是說getParameter()方法中的參數名必須要與表單元素中的name屬性值一樣,否則會發生異常。
例如,表單中有這樣一個文本框,代碼如下:
<input type="text" name="username" />
在Servlet中獲取該表單文本框的值,代碼如下:
String userName = request.getParameter("username");
在Servlet中會根據客戶端表單<form>的method屬性值來決定調用doXXX()方法,如果method屬性值為POST,表單提交會調用Servlet中的doPost()方法,如果method屬性值為GET,則調用doGet()方法。
設計過程
(1)新建用戶注冊頁index.jsp,關鍵代碼如下:
<form action="login"method="post"> <table align="center"> <tr> <td>用戶名:</td><td><input type="text"name="name"/></td> </tr> <tr> <td>密碼:</td><td><input type="password"name="pwd"/></td> </tr> <tr> <td>性別:</td> <td> <input type="radio"name="sex"value="男"/>男 <input type="radio"name="sex"value="女"/>女 </td> </tr> <tr> <td>年齡:</td><td><input type="text"name="age"/></td> </tr> <tr> <td>Email:</td><td><input type="text"name="email"/></td> </tr> <tr> <td colspan="2"align="center"> <input type="submit"value="注冊"/><input type="reset"value="重置"/> </td> </tr> </table> </form>
(2)新建名為LoginServlet的Servlet類,在doPost()方法中獲得表單請求信息,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設置請求的字符編碼格式 String name=request.getParameter("name"); //獲得用戶名 String pwd=request.getParameter("pwd"); //獲得密碼 String sex=request.getParameter("sex"); //獲得性別 String age=request.getParameter("age"); //獲得年齡 String email=request.getParameter("email"); //獲得Email request.getRequestDispatcher("logininfo.jsp").forward(request, response); }
(3)在web.xml中配置LoginServlet類,關鍵代碼如下:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.lh.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
秘笈心法
在Servlet中獲得客戶端表單請求數據時,應該及時處理中文亂碼問題,中文亂碼問題一直是程序開發中不可避免的問題。有效的處理辦法之一就是在Servlet中獲取請求數據之前,應該通過HttpServletRequest對象的setCharacterEncoding()方法統一請求信息的編碼格式,當JSP頁面的編碼格式為UTF-8時,HttpServletRequest對象的setCharacterEncoding()方法的參數值也應該為UTF-8。
實例168 在Servlet中向客戶端寫Cookie信息
光盤位置:光盤\MR\06\168
初級
實用指數:
實例說明
本實例介紹的是如何在Servlet中向客戶端寫Cookie信息,運行本實例,如圖6.5所示,輸入用戶名和密碼并將其提交到Servlet中,在Servlet中將用戶名添加到Cookie對象中,然后關閉瀏覽器,在重新訪問用戶登錄頁時,用戶名的文本框中會顯示上一次輸入的用戶名信息。

圖6.5 關閉瀏覽器再次訪問的結果
關鍵技術
本實例的實現主要是應用Servlet API中提供的Cookie類。用戶把表單信息提交給Servlet后,在Servlet中獲取用戶請求的信息并添加到Cookie對象中,再通過HttpServletResponse對象把Cookie信息返回給客戶端,然后在JSP頁面中通過request內置對象來獲取客戶端的Cookie信息。
在JSP中使用request對象獲取的是一個Cookie對象的數組,需要在循環中遍歷所有Cookie對象,并通過Cookie對象的getName()方法查找所有Cookie對象的名稱,然后根據找到的Cookie名稱獲得Cookie對象中的值。Cookie類中包含的主要方法及說明如表6.1所示。
表6.1 Cookie類的主要方法及說明

設計過程
(1)新建用戶登錄表單頁index.jsp,關鍵代碼如下:
<form action="cookieservlet"method="post"> <table align="center"> <tr><td>用戶名:</td><td><input type="text"name="name"/></td></tr> <tr><td>密碼:</td><td><input type="password"name="pwd"/></td></tr> <tr><td colspan="2"><input type="submit"value="登錄"/></td></tr> </table> </form>
(2)新建名為CookieServlet的Servlet類,在該類的doPost()方法中獲取用戶名信息,然后添加到Cookie對象中并保存到客戶端,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String name=request.getParameter("name"); //獲得用戶名 name=java.net.URLEncoder.encode(name, "UTF-8"); //將用戶名進行格式編碼 Cookie nameCookie=new Cookie("userName", name); //創建一個Cookie對象,并將用戶名保存到Cookie對象中 nameCookie.setMaxAge(60); //設置Cookie的過期之前的時間,單位為秒 response.addCookie(nameCookie); //通過response的addCookie()方法將此Cookie對象保存到客戶端瀏覽器的Cookie中 request.getRequestDispatcher("success.jsp").forward(request, response); }
(3)在index.jsp頁中讀取所有客戶端的Cookie,通過循環Cookie數組找到保存用戶名的Cookie,關鍵代碼如下:
<% String userName=null; //用于保存從Cookie中讀取出的用戶名 Cookie cookieArr[]=request.getCookies(); //獲取客戶端的所有Cookie if(cookieArr! =null&&cookieArr.length>0){ for(Cookie c:cookieArr){ if(c.getName().equals("userName")){ //如果Cookie中有一個名為userName的Cookie userName = java.net.URLDecoder.decode(c.getValue(), "UTF-8"); //將字符串解碼,獲得此Cookie的值 } } } %>
(4)將獲取到的用戶名Cookie的值賦值給“用戶名”文本框,關鍵代碼如下:
<input type="text"name="name"value="<%if(userName! =null){out.print(userName); }%>"/>
(5)在web.xml文件中配置CookieServlet類,關鍵代碼如下:
<servlet> <servlet-name>CookieServlet</servlet-name> <servlet-class>com.lh.servlet.CookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet</servlet-name> <url-pattern>/cookieservlet</url-pattern> </servlet-mapping>
秘笈心法
在創建Cookie對象時,由于不可以直接將中文字符作為Cookie中的值,因此在將中文字符保存到Cookie對象之前,應該使用java.net.URLEncoder類的encode()方法對中文字符進行編碼。在獲取該Cookie對象中的值時,需要使用java.net.URLDecoder類的decode()方法對已經編碼過的字符串進行解碼,還原字符串的初始值。
實例169 在Servlet中將JavaBean對象傳遞到JSP頁
光盤位置:光盤\MR\06\169
初級
實用指數:
實例說明
本實例將介紹如何將一個封裝用戶注冊信息的JavaBean對象傳遞到JSP頁中,然后在JSP頁中讀取該JavaBean對象中的數據,運行結果如圖6.6所示。

圖6.6 在JSP中讀取由Servlet傳遞過來的JavaBean對象中的數據
關鍵技術
實現本實例主要是在Servlet中使用HttpServletRequest對象的getParameter()方法、setAttribute()方法以及getAttribute()方法。setAttribute()方法的作用是可以在HttpServletRequest對象中保存一個屬性,該方法的語法結構如下:
public void setAttribute(String name, Object object)
參數說明
? name:屬性名。
? object:屬性值。
設置完屬性后,通過getAttribute()方法來獲取屬性值,該方法的語法結構如下:
public Object getAttribute(String name)
根據參數name來查找請求范圍內匹配的屬性值。
設計過程
(1)新建用戶注冊頁index.jsp,關鍵代碼如下:
<form action="passservlet"method="post"> <table align="center"> <tr> <td>用戶名:</td> <td><input type="text"name="name"/></td> </tr> <tr> <td>密碼:</td> <td><input type="password"name="pwd"/></td> </tr> … 此處省略了部分文本框的標簽 <tr> <td colspan="2"align="center"> <input type="submit"value="注冊"/> <input type="reset"value="重置"/> </td> </tr> </table> </form>
(2)新建名為UserInfo的JavaBean類,該類用于封裝用戶的注冊信息,關鍵代碼如下:
public class UserInfo { private String userName; //用戶名 private String userPwd; //密碼 private String userSex; //性別 private int userAge; //年齡 private String email; //電子郵件 public UserInfo(){} / /默認的構造方法 …… //此處省略了屬性的getXXX()和setXXX()方法 }
(3)新建名為PassServlet的Servlet類,在該類的doPost()方法中將獲取的用戶注冊信息封裝到UserInfo中,然后將請求轉發到logininfo.jsp頁,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設置請求的字符編碼格式 String name=request.getParameter("name"); //獲取用戶名 String pwd=request.getParameter("pwd"); //獲取密碼 String sex=request.getParameter("sex"); //獲取性別 String age=request.getParameter("age"); //獲取年齡 String email=request.getParameter("email"); //獲取Email UserInfo user=new UserInfo(); //創建封裝用戶信息的JavaBean對象 //以下方法將獲得的表單數據封裝到user對象中 user.setUserName(name); user.setUserPwd(pwd); user.setUserSex(sex); Integer userAge = new Integer(age); user.setUserAge(userAge); user.setEmail(email); request.setAttribute("User", user); //將user對象添加到request對象中 request.getRequestDispatcher("logininfo.jsp").forward(request, response); //將請求轉發到logininfo.jsp頁面 }
(4)在logininfo.jsp頁中,使用request內置對象的getAttribute()方法獲取封裝用戶注冊信息的JavaBean對象,然后將該對象中封裝的注冊信息顯示出來,關鍵代碼如下:
<%
UserInfo user = (UserInfo)request.getAttribute("User");
%>
<table align="center">
<tr>
<td>用戶名:</td><td><%=user.getUserName()%></td>
</tr>
<tr>
<td>密碼:</td><td><%=user.getUserPwd()%></td>
</tr>
<tr>
<td>性別:</td><td><%=user.getUserSex()%></td>
</tr>
<tr>
<td>年齡:</td><td><%=user.getUserAge()%></td>
</tr>
<tr>
<td>Email:</td><td><%=user.getEmail()%></td>
</tr>
</table>
秘笈心法
本實例意在說明MVC(Model-View-Controller)模式的三層架構設計理念,其中JSP相當于View(視圖)層、JavaBean相當于Model(模型)、Servlet相當于Controller(控制器)。MVC架構有助于將應用程序分割成若干邏輯部件,使程序設計變得更加容易。基于MVC結構的開源框架包括Struts1、WebWork、Struts2等,而目前被廣泛應用的框架是Struts2,如果讀者感興趣,可以參考這些開源框架的相關資料或書籍。
實例170 在Servlet中獲取Web路徑和文件真實路徑
光盤位置:光盤\MR\06\170
初級
實用指數:
實例說明
在實際的開發中,經常需要獲得Web路徑以及某個文件的真實路徑,然后根據這些路徑來做相應的操作。本實例將介紹如何在Servlet中獲取Web路徑和真實路徑。運行本實例,在瀏覽器的地址欄中輸入“http://localhost:8080/149/getpath”,運行結果如圖6.7所示。

圖6.7 訪問Servlet后輸出的Web路徑以及文件的真實路徑
關鍵技術
在Servlet中,使用HttpServletRequest對象中的一系列方法可以獲取相關路徑的信息,然后可以根據這些信息組合成一個Web站點的虛擬路徑。HttpServletRequest接口中提供的用于獲取路徑有關的信息的方法如下。
? getScheme():返回請求協議(http)。
? getServerName():返回服務器的名稱。如果訪問本機,則返回的是localhost。
? getServerPort():返回服務器的端口號。Tomcat服務器的默認端口為8080。
? getContextPath():返回客戶端所請求的Web應用的URL入口。例如,在瀏覽器中訪問http://localhost:8080/helloapp/getpath,該方法返回的是“/helloapp”。
? getRequestURL():返回請求Web服務器的完全路徑。例如,在瀏覽器中訪問http://localhost:8080/149/getpath,該方法就直接返回的是http://localhost:8080/149/getpath這個路徑。
獲取文件的真實路徑,可以使用ServletContext接口的getRealPath(String path)方法,該方法根據參數指定的虛擬路徑,返回文件在系統中的真實路徑,這個路徑主要是指發布在Tomcat服務中的文件路徑。例如,找出index.jsp文件的真實路徑的寫法為getRealPath("index.jsp"),那么返回的真實路徑為“D:\Program Files\apache-tomcat-7.0.41\webapps\149\index.jsp”。
設計過程
(1)新建名為GetPathServlet的Servlet類,在該類的doPost()方法中獲取Web服務器的路徑以及文件的真實路徑,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String scheme=request.getScheme(); //獲取請求協議(http) String serverName=request.getServerName(); //獲取服務器名稱(localhost) int serverPort=request.getServerPort(); //獲取服務器端口號 String contextPath=request.getContextPath(); //返回Web應用的URL入口 //以上這些屬性組合成一個站點路徑(http://localhost:8080/149/) String path = scheme+"://"+serverName+":"+serverPort+contextPath+"/"; //getRealPath()方法返回一個給定虛擬路徑的真實路徑 String realPath = this.getServletContext().getRealPath("index.jsp"); //設置HTTP響應的正文的MIME類型以及字符編碼格式 request.setAttribute("path", path); //將Web路徑添加到request對象中 request.setAttribute("realPath", realPath); //將真實路徑添加到request對象中 request.getRequestDispatcher("path.jsp").forward(request, response); }
(2)在web.xml中配置GetPathServlet類,具體代碼請參考前面講解的實例中給出的代碼。
(3)新建path.jsp頁,在該頁中獲得請求中保存的路徑信息并顯示,關鍵代碼如下:
<table align="center">
<tr>
<td>Web路徑:</td><td><%=(String)request.getAttribute("path") %></td>
</tr>
<tr>
<td>真實路徑:</td><td><%=(String)request.getAttribute("realPath") %></td>
</tr>
</table>
秘笈心法
在實際的開發過程中,經常需要根據獲取的Web路徑來實現文件的讀寫操作。例如,在實現將文件上傳到服務器時,首先需要獲取到Web服務器的工作目錄,然后再根據該目錄實現相應的操作。因此,讀者應該掌握本實例的實現過程。
實例171 在Servlet中訪問Web應用的工作目錄
光盤位置:光盤\MR\06\171
初級
實用指數:
實例說明
本實例將介紹如何通過Servlet來訪問Web應用的工作目錄。運行本實例,在Servlet中讀取ServletContext中的所有屬性值,其中包含一個名為javax.servlet.context.tempdir的屬性,該屬性值代表當前Web應用的工作目錄,運行結果如圖6.8所示。

圖6.8 打印ServletContext對象中所有的屬性值
關鍵技術
在Servlet中,訪問Web應用的工作目錄主要是通過ServletContext對象的getAttribute()方法,在ServletContext對象中包含一個名為javax.servlet.context.tempdir的屬性,在Servlet初始化時會自動在ServletContext對象中設置該屬性,通過這個屬性返回的對象就是Web應用的工作目錄。在Servlet中獲得Web應用的工作目錄的關鍵代碼如下:
File workPath = (File)context.getAttribute("javax.servlet.context.tempdir");
設計過程
(1)新建名為WebWorkPathServlet的Servlet類,在該類的doPost()方法中,獲得所有的ServletContext中的屬性并打印輸出,然后獲得Web應用的工作目錄,并向該目錄中寫入一個文本文件,關鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); //響應正文的MIME類型以及字符編碼格式 PrintWriter out = response.getWriter(); ServletContext context = this.getServletContext(); Enumeration e=context.getAttributeNames(); //獲得ServletContext對象中的所有屬性名 while(e.hasMoreElements()){ //循環Enumeration對象,讀出ServletContext對象中的所有屬性值 String attributeName = (String)e.nextElement(); out.println("<br>"+attributeName+" : "+context.getAttribute(attributeName)); } out.close(); //獲得Web應用的工作目錄 File workPath = (File)context.getAttribute("javax.servlet.context.tempdir"); FileWriter writer =new FileWriter(workPath+"/test.txt"); BufferedWriter bf = new BufferedWriter(writer); bf.write("獲取Web應用的工作目錄"); //向文件中寫入字符 bf.newLine(); //換行 bf.write("明日科技!"); bf.flush(); //刷新緩沖區 bf.close(); //關閉緩沖區輸出流 }
(2)在web.xml中配置WebWorkPathServlet類,關鍵代碼如下:
<servlet> <servlet-name>WebWorkPathServlet</servlet-name> <servlet-class>com.lh.servlet.WebWorkPathServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>WebWorkPathServlet</servlet-name> <url-pattern>/webworkpath</url-pattern> </servlet-mapping>
秘笈心法
每個Web應用都有一個工作目錄,Servlet容器會把與這個Web應用相關的臨時文件存放在這個目錄下。在Servlet中通過ServletContext對象來訪問Web應用的工作目錄。
- Python概率統計
- 控糖控脂健康餐
- 新編Premiere Pro CC從入門到精通
- C語言從入門到精通(第4版)
- Building Mapping Applications with QGIS
- Mastering RStudio:Develop,Communicate,and Collaborate with R
- C++ 從入門到項目實踐(超值版)
- Oracle JDeveloper 11gR2 Cookbook
- HTML5+CSS3 Web前端開發技術(第2版)
- 深入剖析Java虛擬機:源碼剖析與實例詳解(基礎卷)
- Java Web從入門到精通(第3版)
- Python Interviews
- Zabbix Performance Tuning
- Machine Learning for Developers
- Go語言從入門到精通