1. 程式人生 > >ServletContext對象

ServletContext對象

有用 request 圖片 bubuko artifacts url lod 共享 替代

1.什麽是ServletContext對象?

ServletContext官方叫servlet上下文。服務器會為每一個工程創建一個對象,這個對象就是ServletContext對象。這個對象全局唯一,而且工程內部的所有servlet都共享這個對象。所以叫全局應用程序共享對象。

2.如果創建ServletContext對象?

(1)Request對象調用getServletContext()方法。

(2)HttpServlet對象調用getServletContext()方法。

示例:

public class ServletDemo1 extends HttpServlet {
    @Override
    
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context1 = req.getServletContext(); ServletContext context2 = this.getServletContext(); System.out.println(context1 == context2); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } // 輸出結果: true

3.ServletContext對象有什麽用?

(1)獲取MIME類型 String getMimeType(String file)

什麽是MIME類型?

MIME類型:在互聯網通信過程中定義的一種文件數據類型。

格式: 大類型/小類型 text/html image/jpeg

(2)域對象:共享數據(範圍:所有用戶所有請求的數據)

1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)

(3)獲取文件的真實(服務器)路徑

說到服務器目錄,就先要說一下我們的本地工作目錄。

當我們打開IDEA的時候,工作目錄是這樣的:

技術分享圖片

但是Tomcat並不是根據這些文件運行的。他根據的是~/桌面/JavaTemp/Demo2/out/artifacts/Demo2_war_exploded/這個目錄的文件去運行的!同時這個目錄也對應著項目URL的虛擬目錄!

這個目錄下的文件路徑如下:

Demo2_war_exploded/
├── c.txt
├── index.jsp
└── WEB-INF

├── libs
├── b.txt
└── classes
├── a.txt
└── com
└── chichung
└── web
└── ServletDemo1.class
所以在指定文件目錄時要按照服務器的路徑來指定,不能根據我們的工作目錄來指定!

ServletContext對象可以獲取文件的真實路徑,也就是服務器的路徑。

方法:String getRealPath(String path)

示例:

@WebServlet("/servletdemo1")
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context1 = req.getServletContext();

        String c = context1.getRealPath("/c.txt");
        System.out.println(c);

        String b = context1.getRealPath("/WEB-INF/b.txt");
        System.out.println(b);

        String a = context1.getRealPath("/WEB-INF/classes/a.txt");
        System.out.println(a);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

// 輸出結果:
/home/chichung/桌面/JavaTemp/Demo2/out/artifacts/Demo2_war_exploded/c.txt
/home/chichung/桌面/JavaTemp/Demo2/out/artifacts/Demo2_war_exploded/WEB-INF/b.txt
/home/chichung/桌面/JavaTemp/Demo2/out/artifacts/Demo2_war_exploded/WEB-INF/classes/a.txt

4.可以獲取當前工程的虛擬路徑(最重要!!!)

String getContextPath()

在我們寫路徑時,虛擬路徑部分用這個替代,如果以後更改虛擬路徑就不用一個一個來替換了!

ServletContext對象