JavaEE——03.Servlet容器模型

1.ServletContext接口

1.概念

容器在啟動時會加載每個Web應(yīng)用程序,并為每個Web應(yīng)用程序創(chuàng)建一個唯一的javax.servlet.ServletContext實(shí)例對象,一般稱為Servlet上下文對象。

2.得到ServletContext引用

方法一:直接調(diào)用Servlet的getServletContext()方法
ServletContext context = getServletContext();
方法二:調(diào)用getServletConfig()方法得到ServletConfig引用,再調(diào)用它的getServletContext()方法
ServletContext context = getServletConfig().getServletContext();

3.用處

通過這個上下文對象,可以獲取到應(yīng)用程序的初始化參數(shù)。
public String getInitParameter(String name)
這些初始化參數(shù)是在Web.xml中使用<context-param>元素定義的。例如:

<context-param>
<param-name>adminEmail</param-name>
<param-value>webmaster@163.com</param-value>
</context-param>

獲取的方法:

ServletContext context = getServletContext();
String value = context.getInitParameter("adminEmail");
out.print("參數(shù)adminEmail="+value);

2.ServletContext對象共享數(shù)據(jù)

1.定義

ServletContext對象是一個作用域?qū)ο?,它的作用域?strong>整個項(xiàng)目文件

2.作用

ServletContext對象主要用于共享數(shù)據(jù)。也就是說在a.Servlet文件中向ServletContext對象中保存了一個數(shù)據(jù)x,那么在b.Servlet文件中也能獲取到數(shù)據(jù)x。
具體實(shí)現(xiàn)代碼(下面的例子運(yùn)行AServlet就能在jsp頁面上顯示張三):
AServlet.java:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = getServletContext();
        context.setAttribute("name","張三");
        response.sendRedirect("BServlet");
    }

BServlet.java:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = getServletContext();
        //context.getAttribute的返回值是一個對象,需要強(qiáng)制轉(zhuǎn)換為
        String name = (String) context.getAttribute("name");
        System.out.println("Servlet得到的上下文對象的name屬性值是"+name);
        response.sendRedirect("NewFile.jsp");
    }

NewFile.jsp:

<body>
${applicationScope.name}
</body>

注意:當(dāng)服務(wù)器停止工作后,ServletContext對象就會被銷毀,這時如果再次啟動服務(wù)器,就會創(chuàng)建一個新的ServletContext對象,但是不能直接訪問NewFile.jsp頁面,需要先運(yùn)行AServlet,將屬性和屬性值綁定到ServletContext對象之后NewFile.jsp頁面才能訪問到。

3.會話管理

1.狀態(tài)

狀態(tài):協(xié)議記住用戶及其請求的能力
因此,協(xié)議可以分為有狀態(tài)協(xié)議無狀態(tài)協(xié)議兩種類型。HTTP是一種無狀態(tài)的協(xié)議。

2.會話

會話是服務(wù)器和客戶之間的不中斷的請求響應(yīng)序列。對會話的每個請求,服務(wù)器能識別出請求來自于同一個客戶。當(dāng)一個未知的用戶向Web應(yīng)用程序發(fā)送第一個請求時就開始了一個會話,服務(wù)器就會為這個請求創(chuàng)建一個會話對象也就是HttpSession對象,并且擁有一個自己的會話ID(一般是32位的16進(jìn)制數(shù))用來區(qū)分不同的會話對象。當(dāng)服務(wù)器返回響應(yīng)給客戶時,可以通過Cookie請求頭來顯示會話ID。在后續(xù)的請求中,Cookie請求頭(會話ID)會和請求內(nèi)容一起發(fā)送給服務(wù)器,然后服務(wù)器會將傳進(jìn)來的會話ID和第一次生成的會話ID進(jìn)行比對,就能知道兩次請求是否屬于同一個會話對象。
當(dāng)客戶端瀏覽器關(guān)掉之后,內(nèi)存中的ID也會被清空等下一次打開瀏覽器向服務(wù)器發(fā)送請求時會為客戶重新創(chuàng)建一個會話,會話ID。會話對象通常用來保存和用戶相關(guān)的一些信息,比如登錄的用戶名密碼,購物車?yán)锩娴纳唐贰?/p>

3.session常用方法

1.獲取HttpSession對象:getSession()——返回與當(dāng)前請求關(guān)聯(lián)的會話,如果沒有就創(chuàng)建一個。
2.boolean isNew():確定當(dāng)前session是不是一個新的session
3.void invalidate():使當(dāng)前session失效
4.String getID():返回當(dāng)前session的ID號,每個session的ID號都是唯一的
5.setMaxInactiveInterval():設(shè)置HTTP會話的超時時間,單位為秒
示例代碼如下:

response.setContentType("text/html;charset=utf-8");
        //創(chuàng)建或返回用戶會話對象,參數(shù)是true表示如果沒有會話對象就創(chuàng)建一個
        HttpSession session =request.getSession(true);
        String heading=null;
        //從會話對象中檢素accessCount屬性
        Integer accessCount=(Integer)session.getAttribute("accessCount");
        if(accessCount==null){
            accessCount=new Integer(1);
            heading = "歡迎您, 首次登錄該頁面!";
        }else{
            heading = "歡迎您, 再次訪問該頁面!";
            accessCount = accessCount+1;
        }
        //將accessCount作為屬性存儲到會話對象中
        session.setAttribute("accessCount" ,accessCount) ;
        PrintWriter out = response.getWriter();
        out.println("<html><head>");
        out.println("<title>會話跟蹤示例</title></head>");
        out.println("<body><center>");
        out.println("<h4>"+heading+"<a href='ShowSessionServlet'>再次訪問</a>"+"</h4>");
        out.println("<table border-'0'>");
        out.println("<tr bgcolor=\"ffad00\"><td>信 息</td><td>值</td>\n");
        String state = session. isNew()?"新會話":"舊會話";
        out.println("<tr><td>會話狀態(tài): <td>"+state+"\n");
        out.println("<tr><td>會話ID:<td>"+session.getId()+"\n");
        out.println("<tr><td>創(chuàng)建時間:<td>");
        out.println(""+new Date(session.getCreationTime())+"\n");
        out.println("<tr><td>最近訪問時間:<td>");
        out.println(""+new Date(session.getLastAccessedTime())+"\n");
        out.println("<tr><td>最大不活動時間:<td>"+
        session. getMaxInactiveInterval()+"n");
        out.println("<tr><td>Cookie:<td>"+request.getHeader("Cookie")+"\n");
        out.println("<tr><td>已被訪問次數(shù):<td>" +accessCount+"\n");
        out.println("</table>");
        out.println("</center></body></html>");

4.HttpSession對象共享數(shù)據(jù)

此過程和ServletContext對象共享數(shù)據(jù)大同小異:
AServlet.java:

String name = request.getParameter("name");
        HttpSession session = request.getSession();
        session.setAttribute("name",name);
        response.sendRedirect("BServlet");

BServlet.java:

HttpSession session = request.getSession();
        String name = (String) session.getAttribute("name");
        String id = session.getId();
        System.out.println("name:"+name);
        System.out.println("session id:"+id);
        response.sendRedirect("NewFile.jsp");

NewFile.jsp:

<body>
在會話存儲name值是${sessionScope.name}
</body>

當(dāng)啟動AServlet文件時在地址欄后面添加?name=zhangsan,name屬性值就被輸出。

4.JavaBeans

1.概念
JavaBeans是Java平臺的組件技術(shù),在Java We開發(fā)中常用JavaBeans來存放數(shù)據(jù),封裝業(yè)務(wù)邏輯等,從而很好地實(shí)現(xiàn)業(yè)務(wù)邏輯和表示邏輯的分離,使系統(tǒng)具有更好地健壯性和靈活性。對程序員來說,JavaBeans最大的好處是可以實(shí)現(xiàn)代碼的重用。
2.JavaBeans的規(guī)范
JavaBeans是用Java語言定義的,這種類的設(shè)計需要遵循有關(guān)規(guī)定。任何遵循下面三個規(guī)范的都可以作為JavaBeans來使用:

1.JavaBeans應(yīng)該是public類,并且有無參數(shù)的public'構(gòu)造方法
2.JavaBeans類的成員變量一般稱為屬性,對每個屬性的訪問權(quán)限定義為private而不是public(屬性名必須以小寫字母開頭)
3.每個屬性通常定義兩個public方法,一個是訪問方法(getter),另一個是修改方法(setter)。訪問方法名應(yīng)該定義為getXXX(),修改方法名應(yīng)該定義為setXXX(),XXX指的是屬性名

例如,假設(shè)JavaBeans類中有一個String類型的color屬性,那么它的訪問方法和修改方法就是:

//訪問方法
public String getColor(){
    return this.color;
}
//修改方法
public void setColor(String color){
     this.color = color;
}

示例代碼:

public class Customer {
//必須要有一個無參數(shù)的Customer的構(gòu)造方法
    public Customer() {
        super();
    }
    //為了調(diào)試方便可以用toString方法輸出屬性的值
    public String toString() {
        return "Customer [custName=" + custName + ", email=" + email + ", phone=" + phone + "]";
    }
    //這個有參數(shù)的構(gòu)造方法開始用來設(shè)置初始值,這樣在新建Customer對象時可以直接傳參數(shù)進(jìn)去不用再另外賦值
    public Customer(String custName, String email, String phone) {
        this.custName = custName;
        this.email = email;
        this.phone = phone;
    }
    //屬性名必須以小寫字母卡頭
    private String custName;
    private String email;
    private String phone;
    public String getCustName() {
        return custName;
    }
    public void setCustName(String custName) {
        this.custName = custName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}   

5.Cookie應(yīng)用

1.概念
Cookie是客戶訪問Web服務(wù)器時,服務(wù)器在客戶硬盤存放的信息。Cookie實(shí)際上是一小段文本信息,客戶以后訪問同一個Web服務(wù)器時瀏覽器會把它們原樣發(fā)送給服務(wù)器。
2.Cookie的傳輸過程
在瀏覽器第一次向服務(wù)器發(fā)送請求時不包含Cookie,當(dāng)服務(wù)器發(fā)送響應(yīng)到瀏覽器時這個過程包含了服務(wù)器發(fā)出的Cookie,然后瀏覽器解析Cookie并保存為文件。當(dāng)下次發(fā)送請求時,請求的信息中就包含了Cookie,服務(wù)器解析Cookie獲取信息,再返回響應(yīng)。
3.向客戶端發(fā)送Cookie
Cookie是在服務(wù)器端創(chuàng)建的,在客戶端保存。每個Cookie都是javax.servlet.http.Cookie類的對象。
常用方法:

//創(chuàng)建cookie對象
Cookie cookie = new Cookie(“username”,“admin”);
//設(shè)置cookie保存時間為一個小時
//cookie的生命周期可以通過cookie.setMaxAge()方法來設(shè)置,單位是秒。**如果不設(shè)置,則該cookie在瀏覽器關(guān)閉時就不存在了**
cookie.setMaxAge(3600);
//放置到客戶端
response.addCookie(cookie)

4.獲取客戶端Cookie
服務(wù)器通過request獲取客戶端提交的Cookie,并對其進(jìn)行操作request.getCookies()返回Cookie[]數(shù)組
遍歷獲取到的Cookie[]數(shù)組,通過getName()getValue()獲取cookie的

String cookieName = "username";
        String cookieValue = null;
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for(int i=0;i<cookies.length;i++){
                Cookie cookie = cookies[i];
                if(cookie.getName().equals(cookieName)){
                    cookieValue=cookie.getValue();
                }
                System.out.println("cookie name:"+cookie.getName());
                System.out.println("cookie value:"+cookie.getValue());
            }
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • [toc] 第三章 Servlet 容器模型 Web容器在啟動時會加載每個Web應(yīng)用程序,并為每個Web應(yīng)用程序創(chuàng)...
    zju_dream閱讀 670評論 0 0
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,502評論 0 10
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評論 0 11
  • Servlet:Sun公司制訂的一種用來擴(kuò)展Web服務(wù)器功能的組件規(guī)范。當(dāng)瀏覽器將請求發(fā)送給Web服務(wù)器(比如:a...
    南山伐木閱讀 629評論 0 4
  • 一 servlet概述 狹義的Servlet指javax.servlet包中的一個接口,而廣義的Servlet則是...
    靜慎獨(dú)閱讀 587評論 0 0

友情鏈接更多精彩內(nèi)容