ServletContext物件,,,,,
ServletContext物件
1.什麼是ServletContext物件(代表整個專案的物件)
ServletContext代表是一個web應用的環境(上下文)物件,ServletContext物件 內部封裝是該web應用的資訊,ServletContext物件一個web應用只有一個
問題:一個web應用有幾個servlet物件?----多個
ServletContext物件的生命週期?
建立:該web應用被載入(伺服器啟動或釋出web應用(前提,伺服器啟動狀 態))
銷燬:web應用被解除安裝(伺服器關閉,移除該web應用)
開啟伺服器時建立
銷燬伺服器時銷燬
2.怎樣獲得ServletContext物件
1)ServletContext servletContext = config.getServletContext();
2)ServletContext servletContext = this.getServletContext();
//獲取ServletContext物件 ServletContext context=getServletContext();
3.ServletContext的作用
(1)獲得web應用中任何資源的絕對路徑(重要 重要 重要)
在伺服器上的絕對路徑
方法:String path = context.getRealPath(相對於該web應用的相對地址);
寫一個相對,得到一個絕對的path
通過相對路徑獲取絕對路徑,相對路徑相也對於伺服器
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取ServletContext物件 ServletContext context=getServletContext(); //獲取通過相對路徑獲取絕對路徑 String patha=context.getRealPath("a.txt"); String pathb=context.getRealPath("WEB-INF/b.txt"); String pathc=context.getRealPath("WEB-INF/classes/c.txt"); System.out.println(patha); System.out.println(pathb); System.out.println(pathc); }
(2)ServletContext是一個域物件(重要 重要 重要)
什麼是域物件?什麼是域?
儲存資料的區域就是域物件
ServletContext域物件的作用範圍:整個web應用(所有的web資源都可以隨意向 servletcontext域中存取資料,資料可以共享)
Servlet01封存訊息,
Servlet02獲取訊息
public class Servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context=getServletContext();
//存值 context.setAttribute("name", "小紅帽"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
public class Servlet02 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context=getServletContext();
//取值 String name=(String)context.getAttribute("name"); System.out.println(name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
域物件的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
登入,顯示第幾個登入的
public class LoginServlet extends HttpServlet { private UserService userService=new UserService(); //對自定義資料進行初始化 public void init() throws ServletException { int count=0; //獲取ServletContext 物件 ServletContext context=getServletContext(); context.setAttribute("count", count); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname=request.getParameter("uname"); String pwd=request.getParameter("pwd"); //調Service層方法 int count=userService.login(uname, pwd); if(count>0){ //獲取ServletContext物件 ServletContext context=getServletContext(); //取值 int c=(int)context.getAttribute("count"); int num=++c; //存值 context.setAttribute("count", num); response.getWriter().write("you are "+num+" success"); }else{ response.getWriter().write("fail"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
HttpServletResponse(set方法)
我們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個引數,一個為代表請求的request和代表響應response。
service方法中的response的型別是ServletResponse,而doGet/doPost方法的response的型別是HttpServletResponse,HttpServletResponse是ServletResponse的子介面,功能和方法更加強大。
1.response的執行流程
因為response代表響應,所以我們可以通過該物件分別設定Http響應的響應行,響 應頭和響應體
1.通過response設定響應行
設定響應行的狀態碼
setStatus(int sc)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //相應行 response.setStatus(404); }
2.通過response設定響應頭
addHeader(
String name,
String value)
addIntHeader(
String name, int value)
addDateHeader(
String name, long date)
setHeader(
String name,
String value)//給頭設定值
setDateHeader(
String name, long date)
setIntHeader(
String name, int value)
其中,add表示新增,而set表示設定
重定向需要:1.狀態碼:302
2.響應頭:location 代表重定向地址
MyServlet01直接跳轉到MyServlet02
public class MyServlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.setStatus(302);//設定狀態碼302 //設定Location頭 //response.setHeader("Location","/Web03/MyServlet02" ); //重定向 response.sendRedirect("/Web03/MyServlet02"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
public class MyServlet02 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("hello dandan..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.通過response設定響應體
(1)響應體設定文字
獲得字元流,通過字元流的write(
String s)
方法可以將字串設定到response 緩衝區中,隨後Tomcat會將response緩衝區中的內容組裝成Http響應返回給瀏覽 器端。
關於設定中文的亂碼問題
原因:response緩衝區的預設編碼是iso8859-1,此碼錶中沒有中文,可以通過 response的setCharacterEncoding(
String charset)
設定response的編碼
但我們發現客戶端還是不能正常顯示文字
原因:我們將response緩衝區的編碼設定成UTF-8,但瀏覽器的預設編碼是本地系 統的編碼,因為我們都是中文系統,所以客戶端瀏覽器的預設編碼是GBK,我們可以 手動修改瀏覽器的編碼是UTF-8。
我們還可以在程式碼中指定瀏覽器解析頁面的編碼方式,
通過response的setContentType(
String type)
方法指定頁面解析時的編碼是UTF-8
response.setContentType("text/html;charset=UTF-8");
上面的程式碼不僅可以指定瀏覽器解析頁面時的編碼,同時也內含 setCharacterEncoding的功能,所以在實際開發中只要編寫 response.setContentType("text/html;charset=UTF-8");就可以解決頁面輸出中文亂碼問題。
(2)響應頭設定位元組
ServletOutputStream
getOutputStream()
獲得位元組流,通過該位元組流的write(byte[] bytes)可以向response緩衝區中寫入字 節,在由Tomcat伺服器將位元組內容組成Http響應返回給瀏覽器。