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());
}
}