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

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

圖6.2 在Servlet中實現(xiàn)頁面轉(zhuǎn)發(fā)
關(guān)鍵技術(shù)
在Servlet中實現(xiàn)頁面轉(zhuǎn)發(fā),使用的是RequestDispatcher對象的forward()方法。可以在Servlet中通過forward()方法將當(dāng)前的請求轉(zhuǎn)發(fā)到其他Web組件(如Servlet、JSP、HTML)。
設(shè)計過程
(1)新建index.jsp頁,該頁主要包含一個輸入用戶名和密碼的<form>表單,其中<form>中的action屬性值為Servlet類在web.xml中配置的URL,提交方式為POST,關(guān)鍵代碼如下:
<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()方法中獲得表單請求信息,然后根據(jù)請求信息轉(zhuǎn)發(fā)頁面,關(guān)鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設(shè)置請求的字符編碼格式 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對象將頁面請求轉(zhuǎn)發(fā)到success.jsp頁 request.getRequestDispatcher("success.jsp").forward(request, response); }else{ request.getRequestDispatcher("error.jsp").forward(request, response); } } }
(3)在web.xml中配置ForwardServlet類,主要修改用于配置URL的<url-pattern>標(biāo)簽值為“/forward”,關(guān)鍵代碼如下:
<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>
秘笈心法
如果實現(xiàn)的是單純的頁面跳轉(zhuǎn)并不需要傳遞請求對象,可以使用HttpServletResponse對象的sendRedirect()方法。如果想要在轉(zhuǎn)發(fā)頁面中獲得當(dāng)前的請求對象,那就需要通過RequestDispatcher對象的forward()方法來實現(xiàn)。
實例166 在Servlet中實現(xiàn)頁面重定向
光盤位置:光盤\MR\06\166
初級
實用指數(shù):
實例說明
本實例將介紹如何在Servlet中實現(xiàn)頁面重定向。如圖6.3所示,當(dāng)用戶輸入的用戶名或密碼錯誤時,提交表單后在Servlet中會進行判斷,然后將頁面重定向到錯誤頁。

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

圖6.4 在Servlet中獲取表單數(shù)據(jù)
關(guān)鍵技術(shù)
在Servlet中獲取表單信息主要是應(yīng)用HttpServletRequest對象的getParameter()方法,該方法有一個String類型的參數(shù),這個參數(shù)的名稱與表單元素的name屬性值對應(yīng),如果getParameter()方法嘗試讀取一個Null值,執(zhí)行時會拋出一個java.lang.NULLPointerException的異常,也就是說getParameter()方法中的參數(shù)名必須要與表單元素中的name屬性值一樣,否則會發(fā)生異常。
例如,表單中有這樣一個文本框,代碼如下:
<input type="text" name="username" />
在Servlet中獲取該表單文本框的值,代碼如下:
String userName = request.getParameter("username");
在Servlet中會根據(jù)客戶端表單<form>的method屬性值來決定調(diào)用doXXX()方法,如果method屬性值為POST,表單提交會調(diào)用Servlet中的doPost()方法,如果method屬性值為GET,則調(diào)用doGet()方法。
設(shè)計過程
(1)新建用戶注冊頁index.jsp,關(guān)鍵代碼如下:
<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()方法中獲得表單請求信息,關(guān)鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //設(shè)置請求的字符編碼格式 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類,關(guān)鍵代碼如下:
<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中獲得客戶端表單請求數(shù)據(jù)時,應(yīng)該及時處理中文亂碼問題,中文亂碼問題一直是程序開發(fā)中不可避免的問題。有效的處理辦法之一就是在Servlet中獲取請求數(shù)據(jù)之前,應(yīng)該通過HttpServletRequest對象的setCharacterEncoding()方法統(tǒng)一請求信息的編碼格式,當(dāng)JSP頁面的編碼格式為UTF-8時,HttpServletRequest對象的setCharacterEncoding()方法的參數(shù)值也應(yīng)該為UTF-8。
實例168 在Servlet中向客戶端寫Cookie信息
光盤位置:光盤\MR\06\168
初級
實用指數(shù):
實例說明
本實例介紹的是如何在Servlet中向客戶端寫Cookie信息,運行本實例,如圖6.5所示,輸入用戶名和密碼并將其提交到Servlet中,在Servlet中將用戶名添加到Cookie對象中,然后關(guān)閉瀏覽器,在重新訪問用戶登錄頁時,用戶名的文本框中會顯示上一次輸入的用戶名信息。

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

設(shè)計過程
(1)新建用戶登錄表單頁index.jsp,關(guān)鍵代碼如下:
<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對象中并保存到客戶端,關(guān)鍵代碼如下:
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); //創(chuàng)建一個Cookie對象,并將用戶名保存到Cookie對象中 nameCookie.setMaxAge(60); //設(shè)置Cookie的過期之前的時間,單位為秒 response.addCookie(nameCookie); //通過response的addCookie()方法將此Cookie對象保存到客戶端瀏覽器的Cookie中 request.getRequestDispatcher("success.jsp").forward(request, response); }
(3)在index.jsp頁中讀取所有客戶端的Cookie,通過循環(huán)Cookie數(shù)組找到保存用戶名的Cookie,關(guān)鍵代碼如下:
<% 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的值賦值給“用戶名”文本框,關(guān)鍵代碼如下:
<input type="text"name="name"value="<%if(userName! =null){out.print(userName); }%>"/>
(5)在web.xml文件中配置CookieServlet類,關(guān)鍵代碼如下:
<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>
秘笈心法
在創(chuàng)建Cookie對象時,由于不可以直接將中文字符作為Cookie中的值,因此在將中文字符保存到Cookie對象之前,應(yīng)該使用java.net.URLEncoder類的encode()方法對中文字符進行編碼。在獲取該Cookie對象中的值時,需要使用java.net.URLDecoder類的decode()方法對已經(jīng)編碼過的字符串進行解碼,還原字符串的初始值。
實例169 在Servlet中將JavaBean對象傳遞到JSP頁
光盤位置:光盤\MR\06\169
初級
實用指數(shù):
實例說明
本實例將介紹如何將一個封裝用戶注冊信息的JavaBean對象傳遞到JSP頁中,然后在JSP頁中讀取該JavaBean對象中的數(shù)據(jù),運行結(jié)果如圖6.6所示。

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

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

圖6.8 打印ServletContext對象中所有的屬性值
關(guān)鍵技術(shù)
在Servlet中,訪問Web應(yīng)用的工作目錄主要是通過ServletContext對象的getAttribute()方法,在ServletContext對象中包含一個名為javax.servlet.context.tempdir的屬性,在Servlet初始化時會自動在ServletContext對象中設(shè)置該屬性,通過這個屬性返回的對象就是Web應(yīng)用的工作目錄。在Servlet中獲得Web應(yīng)用的工作目錄的關(guān)鍵代碼如下:
File workPath = (File)context.getAttribute("javax.servlet.context.tempdir");
設(shè)計過程
(1)新建名為WebWorkPathServlet的Servlet類,在該類的doPost()方法中,獲得所有的ServletContext中的屬性并打印輸出,然后獲得Web應(yīng)用的工作目錄,并向該目錄中寫入一個文本文件,關(guān)鍵代碼如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); //響應(yīng)正文的MIME類型以及字符編碼格式 PrintWriter out = response.getWriter(); ServletContext context = this.getServletContext(); Enumeration e=context.getAttributeNames(); //獲得ServletContext對象中的所有屬性名 while(e.hasMoreElements()){ //循環(huán)Enumeration對象,讀出ServletContext對象中的所有屬性值 String attributeName = (String)e.nextElement(); out.println("<br>"+attributeName+" : "+context.getAttribute(attributeName)); } out.close(); //獲得Web應(yīng)用的工作目錄 File workPath = (File)context.getAttribute("javax.servlet.context.tempdir"); FileWriter writer =new FileWriter(workPath+"/test.txt"); BufferedWriter bf = new BufferedWriter(writer); bf.write("獲取Web應(yīng)用的工作目錄"); //向文件中寫入字符 bf.newLine(); //換行 bf.write("明日科技!"); bf.flush(); //刷新緩沖區(qū) bf.close(); //關(guān)閉緩沖區(qū)輸出流 }
(2)在web.xml中配置WebWorkPathServlet類,關(guān)鍵代碼如下:
<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應(yīng)用都有一個工作目錄,Servlet容器會把與這個Web應(yīng)用相關(guān)的臨時文件存放在這個目錄下。在Servlet中通過ServletContext對象來訪問Web應(yīng)用的工作目錄。
- MATLAB應(yīng)用與實驗教程
- 你必須知道的204個Visual C++開發(fā)問題
- 從學(xué)徒到高手:汽車電路識圖、故障檢測與維修技能全圖解
- Python機器學(xué)習(xí)編程與實戰(zhàn)
- 精通MATLAB(第3版)
- Windows Phone 7.5:Building Location-aware Applications
- Instant Nancy Web Development
- C語言程序設(shè)計
- Visual Basic程序設(shè)計上機實驗教程
- Python High Performance Programming
- Visual Basic 6.0程序設(shè)計實驗教程
- Spring+Spring MVC+MyBatis從零開始學(xué)
- SQL Server 2016 從入門到實戰(zhàn)(視頻教學(xué)版)
- Struts 2.x權(quán)威指南
- SpringBoot從零開始學(xué)(視頻教學(xué)版)