ServletContext對象
1.什麽是ServletContext對象?
ServletContext官方叫servlet上下文。服務器會為每一個工程創建一個對象,這個對象就是ServletContext對象。這個對象全局唯一,而且工程內部的所有servlet都共享這個對象。所以叫全局應用程序共享對象。
2.如果創建ServletContext對象?
(1)Request對象調用getServletContext()方法。
(2)HttpServlet對象調用getServletContext()方法。
示例:
public class ServletDemo1 extends HttpServlet { @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context1 = req.getServletContext(); ServletContext context2 = this.getServletContext(); System.out.println(context1 == context2); } @Overrideprotected 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對象