JavaWeb學習總結(三)之Servlet開發(二)

一、ServletConfig講解

1.1、配置Servlet初始化參數

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

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>demoServlet</servlet-name>
    <servlet-class>demo.cha.servlet.demoServlet</servlet-class>
    <!--配置ServletConfigDemo1的初始化參數 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>cha</param-value>
    </init-param>
     <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
    <init-param>
        <param-name>charset</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </servlet>

1.2、通過ServletConfig獲取Servlet的初始化參數

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

public class demoServlet 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域對象。

三、ServletContext的應用

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

          範例:demoServlet1和demoServlet2通過ServletContext對象實現數據共享

         

public class demoServlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "cha_199X";
        /**
         * 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);
    }
}

public class demoServlet2 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);
    }
}
       先運行demoServlet1,將數據data存儲到ServletContext對象中,然後運行demoServlet2就可以從ServletContext對象中取出數據了,這樣就實現了數據共享

       如下圖所示:

      

      3.2、獲取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 demoServlet3 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);
    }

}

       測試下結果:

      

      

       3.3、用servletContext實現請求轉發

        
public class demoServlet4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "<h1><font color='red'>cha_199X</font></h1>";
        response.getOutputStream().write(data.getBytes());
        ServletContext context = this.getServletContext();//獲取ServletContext對象
        RequestDispatcher rd = context.getRequestDispatcher("/servlet/demoServlet5");//獲取請求轉發對象(RequestDispatcher)
        rd.forward(request, response);//調用forward方法實現請求轉發
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
}

public class demoServlet5 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);
    }

}

        測試下結果:

                   

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

       

      3.4、利用ServletContext對象讀取資源文件


       

        

public class demoServlet6 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目錄下的demo.cha.servlet包中的db4.properties配置文件
     * @param response
     * @throws IOException
     */
    private void readPropCfgFile2(HttpServletResponse response)
            throws IOException {
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/demo/cha/servlet/db.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目錄下的demo.cha.servlet包中的db.properties配置文件:");
        response.getWriter().println(
                MessageFormat.format(
                        "driver={0},url={1},username={2},password={3}", 
                        driver,url, username, password));
    }

    /**
     * 讀取src目錄下的db.config包中的db.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/db.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包中的db.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("/db.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目錄下的db.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/db.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目錄下的db.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);
    }

}

        測試下結果:

        

四、原博文地址:http://www.cnblogs.com/xdp-gacl/p/3763559.html


      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章