1. 程式人生 > 實用技巧 >ServletContext物件,,,,,

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)響應體設定文字

PrintWriter getWriter()

獲得字元流,通過字元流的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響應返回給瀏覽器。