国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Servlet

2019-11-14 20:55:48
字體:
來源:轉載
供稿:網友
ServletServlet的運行過程

Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求后:  ①Web服務器首先檢查是否已經裝載并創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。  ②裝載并創建該Servlet的一個實例對象。  ③調用Servlet實例對象的init()方法。  ④創建一個用于封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然后調用Servlet的service()方法并將請求和響應對象作為參數傳遞進去。  ⑤WEB應用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,并在卸載之前調用Servlet的destroy()方法。

downloaddownloaddownloaddownloaddownloaddownloaddownloaddownload

Servlet調用圖

download

在Eclipse中開發Servlet

在eclipse中新建一個web PRoject工程,eclipse會自動創建下圖所示目錄結構:

download

download

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 ServletDemo1 extends HttpServlet {    /**     * The doGet method of the servlet. <br>     *     * This method is called when a form has its tag value method equals to get.     *      * @param request the request send by the client to the server     * @param response the response send by the server to the client     * @throws ServletException if an error occurred     * @throws IOException if an error occurred     */    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.print("    This is ");        out.print(this.getClass());        out.println(", using the GET method");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }    /**     * The doPost method of the servlet. <br>     *     * This method is called when a form has its tag value method equals to post.     *      * @param request the request send by the client to the server     * @param response the response send by the server to the client     * @throws ServletException if an error occurred     * @throws IOException if an error occurred     */    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.print("    This is ");        out.print(this.getClass());        out.println(", using the POST method");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();    }}

這些代碼都是Eclipse自動生成的,而web.xml文件中也多了<servlet></servlet>和<servlet-mapping></servlet-mapping>兩對標簽,這兩對標簽是配置ServletDemo1的,如下圖所示:

download

然后我們就可以通過瀏覽器訪問ServletDemo1這個Servlet,如下圖所示:

download

Servlet接口實現類

Servlet接口SUN公司定義了兩個默認實現類,分別為:GenericServlet、HttpServlet。

HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet接口上添加了一些與HTTP協議處理方法,它比Servlet接口的功能更為強大。因此開發人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現Servlet接口。HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如為GET請求,則調用HttpServlet的doGet方法,如為Post請求,則調用doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

Servlet訪問URL映射配置

由于客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。<servlet>元素用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用于設置Servlet的注冊名稱和Servlet的完整類名。一個<servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。(同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的注冊名。)

<servlet>    <servlet-name>ServletDemo1</servlet-name>    <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>    <url-pattern>/servlet/ServletDemo1</url-pattern>  </servlet-mapping> <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>    <url-pattern>/1.htm</url-pattern>  </servlet-mapping>   <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>    <url-pattern>/2.jsp</url-pattern>  </servlet-mapping>   <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>    <url-pattern>/3.php</url-pattern>  </servlet-mapping>   <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>    <url-pattern>/4.aspX</url-pattern>  </servlet-mapping>

通過上面的配置,當我們想訪問名稱是ServletDemo1的Servlet,可以使用如下的幾個地址去訪問:

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/servlet/ServletDemo1

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/1.htm

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/2.jsp

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/3.php

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/4.ASPX

ServletDemo1被映射到了多個URL上。

Servlet訪問URL使用*通配符映射

在Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:一種格式是"*.擴展名",另一種格式是以正斜杠(/)開頭并以"/*"結尾

download

<servlet>    <servlet-name>ServletDemo1</servlet-name>    <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>  </servlet>   <servlet-mapping>    <servlet-name>ServletDemo1</servlet-name>   <url-pattern>/*</url-pattern>

*可以匹配任意的字符,所以此時可以用任意的URL去訪問ServletDemo1這個Servlet:

download

對于如下的一些映射關系:  Servlet1 映射到 /abc/*  Servlet2 映射到 /*  Servlet3 映射到 /abc  Servlet4 映射到 *.do問題:  當請求URL為“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個servlet響應 Servlet引擎將調用Servlet1。  當請求URL為“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應 Servlet引擎將調用Servlet3。  當請求URL為“/abc/a.do”時,“/abc/*”和“*.do”都匹配,哪個servlet響應 Servlet引擎將調用Servlet1。  當請求URL為“/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應 Servlet引擎將調用Servlet2。  當請求URL為“/xxx/yyy/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應 Servlet引擎將調用Servlet2。匹配的原則就是"誰長得更像就找誰"

Servlet與普通Java類的區別

Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調度。  針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,也就是說Servlet實例對象一旦創建,它就會駐留在內存中,為后續的其它請求服務,直至web容器退出,servlet實例對象才會銷毀。  在Servlet的整個生命周期內,Servlet的init方法只被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servlet的service方法。對于每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然后將這兩個對象作為參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。

  如果在<servlet>元素中配置了一個<load-on-startup>元素,那么WEB應用程序在啟動時,就會裝載并創建Servlet的實例對象、以及調用Servlet實例對象的init()方法。

<servlet>        <servlet-name>invoker</servlet-name>        <servlet-class>            org.apache.catalina.servlets.InvokerServlet        </servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>

用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用創建必要的數據庫表和數據。

缺省Servlet

如果某個Servlet的映射路徑僅僅為一個正斜杠(/),那么這個Servlet就成為當前Web應用程序的缺省Servlet。  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用于處理所有其他Servlet都不處理的訪問請求。

<servlet>    <servlet-name>ServletDemo2</servlet-name>    <servlet-class>gacl.servlet.study.ServletDemo2</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>    <!-- 將ServletDemo2配置成缺省Servlet -->  <servlet-mapping>    <servlet-name>ServletDemo2</servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping>

當訪問不存在的Servlet時,就使用配置的默認Servlet進行處理:

download

在<tomcat的安裝目錄>/conf/web.xml文件中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個Servlet設置為了缺省Servlet。

<servlet>        <servlet-name>default</servlet-name>        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>0</param-value>        </init-param>        <init-param>            <param-name>listings</param-name>            <param-value>false</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet> <!-- The mapping for the default servlet -->    <servlet-mapping>        <servlet-name>default</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>

當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet。

Servlet的線程安全問題

當多個客戶端并發訪問同一個Servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,并在這個線程上調用Servlet的service方法,因此service方法內如果訪問了同一個資源的話,就有可能引發線程安全問題。例如下面的代碼:

不存在線程安全問題的代碼:

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo3 extends HttpServlet {        public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {                /**         * 當多線程并發訪問這個方法里面的代碼時,會存在線程安全問題嗎         * i變量被多個線程并發訪問,但是沒有線程安全問題,因為i是doGet方法里面的局部變量,         * 當有多個線程并發訪問doGet方法時,每一個線程里面都有自己的i變量,         * 各個線程操作的都是自己的i變量,所以不存在線程安全問題         * 多線程并發訪問某一個方法的時候,如果在方法內部定義了一些資源(變量,集合等)         * 那么每一個線程都有這些東西,所以就不存在線程安全問題了         */        int i=1;        i++;        response.getWriter().write(i);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

存在線程安全問題的代碼:

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo3 extends HttpServlet {    int i=1;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {                i++;        try {            Thread.sleep(1000*4);        } catch (InterruptedException e) {            e.printStackTrace();        }        response.getWriter().write(i+"");    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

把i定義成全局變量,當多個線程并發訪問變量i時,就會存在線程安全問題了,如下圖所示:同時開啟兩個瀏覽器模擬并發訪問同一個Servlet,本來正常來說,第一個瀏覽器應該看到2,而第二個瀏覽器應該看到3的,結果兩個瀏覽器都看到了3,這就不正常。

線程安全問題只存在多個線程并發操作同一個資源的情況下,所以在編寫Servlet的時候,如果并發訪問某一個資源(變量,集合等),就會存在線程安全問題,那么該如何解決這個問題呢?

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo3 extends HttpServlet {    int i=1;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        /**         * 加了synchronized后,并發訪問i時就不存在線程安全問題了,         * 為什么加了synchronized后就沒有線程安全問題了呢?         * 假如現在有一個線程訪問Servlet對象,那么它就先拿到了Servlet對象的那把鎖         * 等到它執行完之后才會把鎖還給Servlet對象,由于是它先拿到了Servlet對象的那把鎖,         * 所以當有別的線程來訪問這個Servlet對象時,由于鎖已經被之前的線程拿走了,后面的線程只能排隊等候了         *          */        synchronized (this) {//在java中,每一個對象都有一把鎖,這里的this指的就是Servlet對象            i++;            try {                Thread.sleep(1000*4);            } catch (InterruptedException e) {                e.printStackTrace();            }            response.getWriter().write(i+"");        }            }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

這種做法雖然解決了線程安全問題,但是編寫Servlet卻萬萬不能用這種方式處理線程安全問題,假如有9999個人同時訪問這個Servlet,那么這9999個人必須按先后順序排隊輪流訪問。

  針對Servlet的線程安全問題,Sun公司是提供有解決方案的:讓Servlet去實現一個SingleThreadModel接口,如果某個Servlet實現了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調用其service方法。  查看Sevlet的API可以看到,SingleThreadModel接口中沒有定義任何方法和常量,在Java中,把沒有定義任何方法和常量的接口稱之為標記接口,經常看到的一個最典型的標記接口就是"Serializable",這個接口也是沒有定義任何方法和常量的,標記接口在Java中有什么用呢?主要作用就是給某個對象打上一個標志,告訴JVM,這個對象可以做什么,比如實現了"Serializable"接口的類的對象就可以被序列化,還有一個"Cloneable"接口,這個也是一個標記接口,在默認情況下,Java中的對象是不允許被克隆的,就像現實生活中的人一樣,不允許克隆,但是只要實現了"Cloneable"接口,那么對象就可以被克隆了。

  讓Servlet實現了SingleThreadModel接口,只要在Servlet類的定義中增加實現SingleThreadModel接口的聲明即可。 對于實現了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程并發訪問,其采用的方式是產生多個Servlet實例對象,并發的每個線程分別調用一個獨立的Servlet實例對象。  實現SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因為Servlet引擎會創建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)。

配置Servlet初始化參數

在Servlet的配置文件web.xml中,可以使用一個或多個<init-param>標簽為servlet配置一些初始化參數。

<servlet>    <servlet-name>ServletConfigDemo1</servlet-name>    <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>    <!--配置ServletConfigDemo1的初始化參數 -->    <init-param>        <param-name>name</param-name>        <param-value>gacl</param-value>    </init-param>     <init-param>        <param-name>passWord</param-name>        <param-value>123</param-value>    </init-param>    <init-param>        <param-name>charset</param-name>        <param-value>UTF-8</param-value>    </init-param></servlet>
通過ServletConfig獲取Servlet的初始化參數

當servlet配置了初始化參數后,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,我們通過ServletConfig對象就可以得到當前servlet的初始化參數信息。

import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletConfigDemo1 extends HttpServlet {    /**     * 定義ServletConfig對象來接收配置的初始化參數     */    private ServletConfig config;        /**     * 當servlet配置了初始化參數后,web容器在創建servlet實例對象時,     * 會自動將這些初始化參數封裝到ServletConfig對象中,并在調用servlet的init方法時,     * 將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以     * 得到當前servlet的初始化參數信息。     */    @Override    public void init(ServletConfig config) throws ServletException {        this.config = config;    }    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //獲取在web.xml中配置的初始化參數        String paramVal = this.config.getInitParameter("name");//獲取指定的初始化參數        response.getWriter().print(paramVal);                response.getWriter().print("<hr/>");        //獲取所有的初始化參數        Enumeration<String> e = config.getInitParameterNames();        while(e.hasMoreElements()){            String name = e.nextElement();            String value = config.getInitParameter(name);            response.getWriter().print(name + "=" + value + "<br/>");        }    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        this.doGet(request, response);    }}
ServletContext對象

WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。  ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。  由于一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。ServletContext對象通常也被稱之為context域對象。

多個Servlet通過ServletContext對象實現數據共享

范例:ServletContextDemo1和ServletContextDemo2通過ServletContext對象實現數據共享

import java.io.IOException;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 ServletContextDemo1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String data = "xdp_gacl";        /**         * ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,         * 可以通過ServletConfig.getServletContext方法獲得ServletContext對象。         */        ServletContext context = this.getServletConfig().getServletContext();//獲得ServletContext對象        context.setAttribute("data", data);  //將data存儲到ServletContext對象中    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
import java.io.IOException;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 ServletContextDemo2 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ServletContext context = this.getServletContext();        String data = (String) context.getAttribute("data");//從ServletContext對象中取出數據        response.getWriter().print("data="+data);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

先運行ServletContextDemo1,將數據data存儲到ServletContext對象中,然后運行ServletContextDemo2就可以從ServletContext對象中取出數據了,這樣就實現了數據共享,如下圖所示:

download

獲取WEB應用的初始化參數

在web.xml文件中使用<context-param>標簽配置WEB應用的初始化參數,如下所示:

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">    <display-name></display-name>    <!-- 配置WEB應用的初始化參數 -->    <context-param>        <param-name>url</param-name>        <param-value>jdbc:MySQL://localhost:3306/test</param-value>    </context-param>    <welcome-file-list>        <welcome-file>index.jsp</welcome-file>    </welcome-file-list></web-app>

獲取Web應用的初始化參數,代碼如下:

public class ServletContextDemo3 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ServletContext context = this.getServletContext();        //獲取整個web站點的初始化參數        String contextInitParam = context.getInitParameter("url");        response.getWriter().print(contextInitParam);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
用servletContext實現請求轉發
ServletContextDemo4
public class ServletContextDemo4 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String data = "<h1><font color='red'>abcdefghjkl</font></h1>";        response.getOutputStream().write(data.getBytes());        ServletContext context = this.getServletContext();//獲取ServletContext對象        RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");//獲取請求轉發對象(RequestDispatcher)        rd.forward(request, response);//調用forward方法實現請求轉發    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {    }}
ServletContextDemo5
public class ServletContextDemo5 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.getOutputStream().write("servletDemo5".getBytes());    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        this.doGet(request, response);    }}

運行結果:

download

訪問的是ServletContextDemo4,瀏覽器顯示的卻是ServletContextDemo5的內容,這就是使用ServletContext實現了請求轉發

利用ServletContext對象讀取資源文件

項目目錄結構如下:

download

/** * 使用servletContext讀取資源文件*/public class ServletContextDemo6 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {         /**         * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼;         * 這樣就不會出現中文亂碼了         */        response.setHeader("content-type","text/html;charset=UTF-8");        readSrcDirPropCfgFile(response);//讀取src目錄下的properties配置文件        response.getWriter().println("<hr/>");        readWebRootDirPropCfgFile(response);//讀取WebRoot目錄下的properties配置文件        response.getWriter().println("<hr/>");        readPropCfgFile(response);//讀取src目錄下的db.config包中的db3.properties配置文件        response.getWriter().println("<hr/>");        readPropCfgFile2(response);//讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件            }    /**     * 讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件     * @param response     * @throws IOException     */    private void readPropCfgFile2(HttpServletResponse response)            throws IOException {        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/gacl/servlet/study/db4.properties");        Properties prop = new Properties();        prop.load(in);        String driver = prop.getProperty("driver");        String url = prop.getProperty("url");        String username = prop.getProperty("username");        String password = prop.getProperty("password");        response.getWriter().println("讀取src目錄下的gacl.servlet.study包中的db4.properties配置文件:");        response.getWriter().println(                MessageFormat.format(                        "driver={0},url={1},username={2},password={3}",                         driver,url, username, password));    }    /**     * 讀取src目錄下的db.config包中的db3.properties配置文件     * @param response     * @throws FileNotFoundException     * @throws IOException     */    private void readPropCfgFile(HttpServletResponse response)            throws FileNotFoundException, IOException {        //通過ServletContext獲取web資源的絕對路徑        String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.properties");        InputStream in = new FileInputStream(path);        Properties prop = new Properties();        prop.load(in);        String driver = prop.getProperty("driver");        String url = prop.getProperty("url");        String username = prop.getProperty("username");        String password = prop.getProperty("password");        response.getWriter().println("讀取src目錄下的db.config包中的db3.properties配置文件:");        response.getWriter().println(                MessageFormat.format(                        "driver={0},url={1},username={2},password={3}",                         driver,url, username, password));    }    /**     * 通過ServletContext對象讀取WebRoot目錄下的properties配置文件     * @param response     * @throws IOException     */    private void readWebRootDirPropCfgFile(HttpServletResponse response)            throws IOException {        /**         * 通過ServletContext對象讀取WebRoot目錄下的properties配置文件         * “/”代表的是項目根目錄         */        InputStream in = this.getServletContext().getResourceAsStream("/db2.properties");        Properties prop = new Properties();        prop.load(in);        String driver = prop.getProperty("driver");        String url = prop.getProperty("url");        String username = prop.getProperty("username");        String password = prop.getProperty("password");        response.getWriter().println("讀取WebRoot目錄下的db2.properties配置文件:");        response.getWriter().print(                MessageFormat.format(                        "driver={0},url={1},username={2},password={3}",                         driver,url, username, password));    }    /**     * 通過ServletContext對象讀取src目錄下的properties配置文件     * @param response     * @throws IOException     */    private void readSrcDirPropCfgFile(HttpServletResponse response) throws IOException {        /**         * 通過ServletContext對象讀取src目錄下的db1.properties配置文件         */        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");        Properties prop = new Properties();        prop.load(in);        String driver = prop.getProperty("driver");        String url = prop.getProperty("url");        String username = prop.getProperty("username");        String password = prop.getProperty("password");        response.getWriter().println("讀取src目錄下的db1.properties配置文件:");        response.getWriter().println(                MessageFormat.format(                        "driver={0},url={1},username={2},password={3}",                         driver,url, username, password));    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        this.doGet(request, response);    }}

運行結果如下:

download

使用類裝載器讀取資源文件
/** * 用類裝載器讀取資源文件 * 通過類裝載器讀取資源文件的注意事項:不適合裝載大文件,否則會導致jvm內存溢出 * @author gacl * */public class ServletContextDemo7 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        /**         * response.setContentType("text/html;charset=UTF-8");目的是控制瀏覽器用UTF-8進行解碼;         * 這樣就不會出現中文亂碼了         */        response.setHeader("content-type","text/html;charset=UTF-8");        test1(response);        response.getWriter().println("<hr/>");        test2(response);        response.getWriter().println("<hr/>");        //test3();        test4();            }        /**     * 讀取類路徑下的資源文件     * @param response     * @throws IOException     */    private void test1(HttpServletResponse response) throws IOException {        //獲取到裝載當前類的類裝載器        ClassLoader loader = ServletContextDemo7.class.getClassLoader();        //用類裝載器讀取src目錄下的db1.properties配置文件        InputStream in = loader.getResourceAsStream("db1.properties");        Properties prop = new Properties();        prop.load(in);        String driver = prop.getProperty("driver");        String url = prop.getProperty("url");        String username = prop.getProperty("username");        String password = prop.getProperty("password");        response.getWriter().println("用類裝載器讀取src目錄下的db1.properties配置文件:");        response.getWriter().println(                MessageFormat.format(                        "driver={0},url={1},username={2},password={3}",                         driver,url, username, password));    }    /**     * 讀取類路徑下面、包下面的資源文件     * @param respo
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 多伦县| 贵定县| 汉川市| 永寿县| 钦州市| 新密市| 广西| 唐海县| 富锦市| 田阳县| 五河县| 宜春市| 乌兰浩特市| 和林格尔县| 昌宁县| 乌兰察布市| 伊春市| 清镇市| 闵行区| 交城县| 大化| 清丰县| 筠连县| 准格尔旗| 凤阳县| 城口县| 永州市| 来宾市| 凤凰县| 团风县| 江门市| 茂名市| 临朐县| 广宗县| 财经| 资溪县| 莱芜市| 莱芜市| 连云港市| 阳春市| 会同县|