官术网_书友最值得收藏!

第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應用的工作目錄。

主站蜘蛛池模板: 洮南市| 丰台区| 大姚县| 大竹县| 都江堰市| 进贤县| 澄江县| 河津市| 通化县| 溧水县| 新河县| 岳阳市| 慈利县| 潮安县| 桦川县| 长岭县| 文安县| 泰安市| 济宁市| 三江| 都安| 湖南省| 福安市| 盐城市| 多伦县| 卢龙县| 无锡市| 威信县| 安陆市| 洮南市| 四会市| 黄大仙区| 永年县| 邵阳市| 曲水县| 泰顺县| 青川县| 仙桃市| 雷山县| 太湖县| 田林县|