1. 程式人生 > >ServletConfig物件,ServletContext物件

ServletConfig物件,ServletContext物件

ServletConfig物件

ServletConfig物件有什麼用? 通過此物件可以讀取web.xml中配置的初始化引數。

為什麼我們要把引數資訊放到web.xml檔案中呢?我們可以直接在程式中都可以定義引數資訊,搞到web.xml檔案中又有什麼好處呢? 好處就是:能夠讓你的程式更加靈活【更換需求,更改配置檔案web.xml即可,程式程式碼不用改】

配置web.xml檔案配置的引數資訊

    <servlet>
        <servlet-name>MyServletDemo1</servlet-name>
        <servlet-class>com.jiuyue.servlet.MyServlet</servlet-class>
        <!--WEB應用程式在啟動時,就會裝載並建立Servlet的例項物件、
        以及呼叫Servlet例項物件的init()方法。-->
        <!--<load-on-startup>1</load-on-startup>-->
        <!--此時不能使用<load-on-startup>-->
        <init-param>
            <param-name>name</param-name>
            <param-value>jiuyue</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServletDemo1</servlet-name>
        <url-pattern>/MyServletDemo1</url-pattern>
    </servlet-mapping>

在Servlet中獲取ServletConfig物件,通過ServletConfig物件獲取在web.xml檔案配置的引數

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        //獲取ServletConfig物件
        ServletConfig servletConfig = this.getServletConfig();
        //根據配置獲取資料
        String name = servletConfig.getInitParameter("name");
        System.out.println("name: "+name);
    }

控制檯輸出(這裡發起doGet請求):

doGet
name: jiuyue

ServletContext物件

什麼是ServletContext物件? 當Tomcat啟動的時候,就會建立一個ServletContext物件。它代表著當前web站點

ServletContext有什麼用?

1、ServletContext既然代表著當前web站點,那麼所有Servlet都共享著一個ServletContext物件,所以Servlet之間可以通過ServletContext實現通訊。 2、ServletConfig獲取的是配置的是單個Servlet的引數資訊,ServletContext可以獲取的是配置整個web站點的引數資訊 3、利用ServletContext讀取web站點的資原始檔 4、實現Servlet的轉發【用ServletContext轉發不多,主要用request轉發】

Servlet之間實現通訊

ServletContext物件可以被稱之為域物件其實域物件可以簡單理解成一個容器【類似於Map集合】 實現Servlet之間通訊就要用到ServletContext的setAttribute(String name,Object obj)方法.

MyServlet01類

public class MyServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String name= "jiuyue";
        //在MyServlet01設定域物件
        servletContext.setAttribute("myName",name);
    }
}

MyServlet02類

public class MyServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取ServletContext物件
        ServletContext servletContext = this.getServletContext();
        //通過關鍵字獲取儲存在域物件的值
        String value = (String) servletContext.getAttribute("myName");
        System.out.println(value);
    }
}

訪問MyServlet02可以獲取MyServlet01儲存的資訊,從而實現多個Servlet之間通訊。 剛開始直接訪問MyServlet02並沒有獲取到資料myName資訊,其實是要先訪問MyServlet01再來訪問MyServlet02才能獲取到資料myName資訊。

MyServlet01設定域物件在JSP中獲取資料值

public class MyServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String name= "jiuyue";
        //在MyServlet01設定域物件
        servletContext.setAttribute("myName",name);
        req.getRequestDispatcher("test.jsp").forward(req,resp);
    }
}

test.jsp

<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Hello,MyServlet01</h1><br>
<h1>${myName}</h1>
</body>
</html>

“掃碼關注“