jsp內置對象

jsp內置對象

1、jsp提供了9個內置對象,這些對象將由容器爲用戶進行實例化,用戶能夠直接使用,java須要new對象,這裏直接使用就行。

對象 描述
request HttpServletRequest 接口的實例
response HttpServletResponse 接口的實例
out JspWriter類的實例,用於把結果輸出至網頁上
session HttpSession類的實例
application ServletContext類的實例,與應用上下文有關
config ServletConfig類的實例
pageContext PageContext類的實例,提供對JSP頁面全部對象以及命名空間的訪問
page 相似於Java類中的this關鍵字
Exception Exception類的對象,表明發生錯誤的JSP頁面中對應的異常對象

2、4種做用域

在jsp中提供了4種屬性的保存範圍,所謂的保存範圍,指的就是一個內置對象,能夠在多少個頁面中保存而且繼續使用。
做用域 功能
pageContext 做用域僅限於當前頁面對象,能夠近似於理解爲java的this對象,離開當前JSP頁面(不管是redirect仍是forward),則pageContext中的全部屬性值就會丟失。
request 做用域是同一個請求以內,在頁面跳轉時,若是經過forward方式跳轉,則forward目標頁面仍然能夠拿到request中的屬性值。若是經過redirect方式進行頁面跳轉,因爲redirect至關於從新發出的請求,此種場景下,request中的屬性值會丟失。(適用於請求轉發,在重定向中會失去被賦予的值)
session session的做用域是在一個會話的生命週期內,會話失效,則session中的數據也隨之丟失。
application 做用域是最大的,只要服務器不中止,則application對象就一直存在,而且爲全部會話所共享。(定義的對象被存儲在服務器,因此少使用該對象,否則會增長服務器負載,影響服務器性能)
使用setAttribute("id","value",[服務器跳轉後該id的做用域]);來設置屬性以及做用域。
  1. 設置屬性
<%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/21/021
  Time: 17:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>setAttribute</title>
</head>
<body>
<%
pageContext.setAttribute("name","taeyeon",PageContext.REQUEST_SCOPE);//只有pageContext纔有第三個參數,session,application,request都沒有第三個參數.
    
%>
<jsp:forward page="getAttribute.jsp"/>

</body>
</html>
  1. 獲取屬性
<%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/21/021
  Time: 17:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>getAttribute</title>
</head>
<body>
<%
String s= (String) request.getAttribute("name");
out.println(s);
%>
<%=s%>
</body>
</html>
  1. 輸出
taeyeon  taeyeon

當沒有設置pageContext.setAttribute()中沒有添加這一參數==PageContext.REQUEST_SCOPE==。就會輸出null null。由於page域中設置的參數只能在本頁面有做用,因此當頁面跳轉後就獲取不到name的屬性值。html


3、request對象

當瀏覽器請求一個網頁時,它會向網絡服務器發送一系列不能被直接讀取的信息,由於這些信息是做爲HTTP信息頭的一部分來傳送的。您能夠查閱HTTP協議來得到更多的信息。
下表列出了瀏覽器端信息頭的一些重要內容,在之後的網絡編程中將會常常見到這些信息:
信息 描述
Accept 指定瀏覽器或其餘客戶端能夠處理的MIME類型。它的值一般爲 image/png 或 image/jpeg
Accept-Charset 指定瀏覽器要使用的字符集。好比 ISO-8859-1
Accept-Encoding 指定編碼類型。它的值一般爲 gzip 或compress
Accept-Language 指定客戶端首選語言,servlet會優先返回以當前語言構成的結果集,若是servlet支持這種語言的話。好比 en,en-us,ru等等
Authorization 在訪問受密碼保護的網頁時識別不一樣的用戶
Connection 代表客戶端是否能夠處理HTTP持久鏈接。持久鏈接容許客戶端或瀏覽器在一個請求中獲取多個文件。Keep-Alive 表示啓用持久鏈接
Content-Length 僅適用於POST請求,表示 POST 數據的字節數
Cookie 返回先前發送給瀏覽器的cookies至服務器
Host 指出原始URL中的主機名和端口號
If-Modified-Since 代表只有當網頁在指定的日期被修改後客戶端才須要這個網頁。 服務器發送304碼給客戶端,表示沒有更新的資源
If-Unmodified-Since 與If-Modified-Since相反, 只有文檔在指定日期後仍未被修改過,操做纔會成功
Referer 標誌着所引用頁面的URL。好比,若是你在頁面1,而後點了個連接至頁面2,那麼頁面1的URL就會包含在瀏覽器請求頁面2的信息頭中
User-Agent 用來區分不一樣瀏覽器或客戶端發送的請求,並對不一樣類型的瀏覽器返回不一樣的內容
request對象的經常使用方法:
方法 做用
Cookie[] getCookies(); 取得客戶端傳遞的Cookie信息
String getHeader(String str); 取得請求頭信息,根據請求頭名稱取得對應的值
Enumeration<String> getHeaderNames(); 按照枚舉的方式取得全部請求頭信息
String getMethod(); 取得請求的方式
String getPathInfo(); 取得額外路徑
String getContextPath(); 去的當前項目的根路徑
String getQueryString(); 取得URL地址?後面的參數
String getRequestURI(); 取得URL地址
String getServletPath(); 取得Servlet的映射路徑
HTTPSession getSession(); 取得Session內置對象
String getRealPath(); 取得項目的真實路徑
String getRemoteHost(); 取得主機名稱
String getParameter(String name); 取得表單提交的參數,適用於每次接收一個參數,會出現空指針異常
String getParameterValues(String name); 取得表單提交的參數,適用於接收多個參數,好比複選框的值。會出現空指針異常
void setAttribute(String key,Object value); 以鍵值對形式保存數據
void getAttribute(String key); 獲取保存的數據屬性值
void getRequestDispatcher(String loc).forward(HttpServletRequest req, HttpServletResponse resp); 服務器跳轉
1.解決亂碼問題

除了前面介紹的兩種解決亂碼問題,咱們也能使用request對象來解決亂碼問題,使用request。setCharacterEncoding("編碼格式");來設置全局的編碼格式。java

2.接收請求數據

全部參數不必定都要用表單的形式來傳遞,也可使用url重寫的方式進行傳遞,格式以下: 動態頁面地址?參數名稱 1=參數內容 1&參數名稱 2=參數內容 2&....mysql

在這個例子中,咱們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP信息頭。這個方法以枚舉的形式返回當前HTTP請求的頭信息。
獲取Enumeration對象後,用標準的方式來遍歷Enumeration對象,用hasMoreElements()方法來肯定何時中止,用nextElement()方法來得到每一個參數的名字。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>requestTest(runoob.com)</title>
</head>
<body>
<h2>HTTP 頭部請求實例</h2>
<table width="100%" border="1" align="center">
<tr bgcolor="#949494">
<th>Header Name</th><th>Header Value(s)</th>
</tr>
<%
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
      String paramName = (String)headerNames.nextElement();
      out.print("<tr><td>" + paramName + "</td>\n");
      String paramValue = request.getHeader(paramName);
      out.println("<td> " + paramValue + "</td></tr>\n");
   }
%>
</table>
</body>
</html>
輸出


4、response對象

Response響應對象主要將JSP容器處理後的結果傳回到客戶端。能夠經過response變量設置HTTP的狀態和向客戶端發送數據,如Cookie、HTTP文件頭信息等。
一個典型的響應看起來就像下面這樣:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (空行)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
狀態行包含HTTP版本信息,好比HTTP/1.1,一個狀態碼,好比200,還有一個很是短的信息對應着狀態碼,好比OK。
下表摘要出了HTTP1.1響應頭中最有用的部分,在網絡編程中您將會常常見到它們:
響應頭 描述
Allow 指定服務器支持的request方法(GET,POST等等)
Cache-Control 指定響應文檔可以被安全緩存的狀況。一般取值爲 public,private 或no-cache 等等。 Public意味着文檔可緩存,Private意味着文檔只爲單用戶服務而且只能使用私有緩存。No-cache 意味着文檔不被緩存。
Connection 命令瀏覽器是否要使用持久的HTTP鏈接。close值 命令瀏覽器不使用持久HTTP鏈接,而keep-alive 意味着使用持久化鏈接。
Content-Disposition 讓瀏覽器要求用戶將響應以給定的名稱存儲在磁盤中
Content-Encoding 指定傳輸時頁面的編碼規則
Content-Language 表述文檔所使用的語言,好比en, en-us,,ru等等
Content-Length 代表響應的字節數。只有在瀏覽器使用持久化 (keep-alive) HTTP 鏈接時纔有用
Content-Type 代表文檔使用的MIME類型
Expires 指明啥時候過時並從緩存中移除
Last-Modified 指明文檔最後修改時間。客戶端能夠 緩存文檔而且在後續的請求中提供一個 If-Modified-Since請求頭
Location 在300秒內,包含全部的有一個狀態碼的響應地址,瀏覽器會自動重連而後檢索新文檔
Refresh 指明瀏覽器每隔多久請求更新一次頁面。
Retry-After 與503 (Service Unavailable)一塊兒使用來告訴用戶多久後請求將會獲得響應
Set-Cookie 指明當前頁面對應的cookie
response 對象是 javax.servlet.http.HttpServletResponse 類的一個實例。就像服務器會建立request對象同樣,它也會建立一個客戶端響應。
response對象定義了處理建立HTTP信息頭的接口。經過使用這個對象,開發者們能夠添加新的cookie或時間戳,還有HTTP狀態碼等等。
下表列出了用來設置HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:
S.N. 方法 描述
1 String encodeRedirectURL(String url) 對sendRedirect()方法使用的URL進行編碼
2 String encodeURL(String url) 將URL編碼,回傳包含Session ID的URL
3 boolean containsHeader(String name) 返回指定的響應頭是否存在
4 boolean isCommitted() 返回響應是否已經提交到客戶端
5 void addCookie(Cookie cookie) 添加指定的cookie至響應中
6 void addDateHeader(String name, long date) 添加指定名稱的響應頭和日期值
7 void addHeader(String name, String value) 添加指定名稱的響應頭和值
8 void addIntHeader(String name, int value) 添加指定名稱的響應頭和int值
9 void flushBuffer() 將任何緩存中的內容寫入客戶端
10 void reset() 清除任何緩存中的任何數據,包括狀態碼和各類響應頭
11 void resetBuffer() 清除基本的緩存數據,不包括響應頭和狀態碼
12 void sendError(int sc) 使用指定的狀態碼向客戶端發送一個出錯響應,而後清除緩存
13 void sendError(int sc, String msg) 使用指定的狀態碼和消息向客戶端發送一個出錯響應
14 void sendRedirect(String location) 使用指定的URL向客戶端發送一個臨時的間接響應,重定向
15 void setBufferSize(int size) 設置響應體的緩存區大小
16 void setCharacterEncoding(String charset) 指定響應的編碼集(MIME字符集),例如UTF-8
17 void setContentLength(int len) 指定HTTP servlets中響應的內容的長度,此方法用來設置 HTTP Content-Length 信息頭
18 void setContentType(String type) 設置響應的內容的類型,若是響應還未被提交的話
19 void setDateHeader(String name, long date) 使用指定名稱和值設置響應頭的名稱和內容
20 void setHeader(String name, String value) 使用指定名稱和值設置響應頭的名稱和內容
21 void setIntHeader(String name, int value) 指定 int 類型的值到 name 標頭
22 void setLocale(Locale loc) 設置響應的語言環境,若是響應還沒有被提交的話
23 void setStatus(int sc) 設置響應的狀態碼
接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鐘:
<%@ page import="java.util.Calendar" %>
<%@ page import="java.util.Locale" %>
<%@ page import="com.mysql.jdbc.util.TimezoneDump" %>
<%@ page import="java.util.TimeZone" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/10/22/022
  Time: 14:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>response對象的示例Refresh</title>
</head>
<body>
<h2>自動刷新,response</h2>
<%
    response.setIntHeader("Refresh",2);
    Calendar calendar=Calendar.getInstance(TimeZone.getDefault());
   int hour=calendar.get(Calendar.HOUR);
   int min=calendar.get(Calendar.MINUTE);
   int s=calendar.get(Calendar.SECOND);
   String am_pm="";
   if(calendar.get(Calendar.AM_PM)==0)//AM==0;PM==1
       am_pm="AM";
else
       am_pm="PM";
String time=hour+":"+min+":"+s+am_pm;
%>
<h2><%=time%></h2>
</body>
</html>
將以上代碼保存爲main.jsp,而後經過瀏覽器訪問它。它將會每隔5秒顯示一下系統當前時間。
輸出

瀏覽器技術Cookie

Cookie一般在HTTP信息頭中設置(雖然JavaScript可以直接在瀏覽器中設置cookie)好比:Set-Cookie: name=runoob; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=runoob.com(Set-Cookie 信息頭包含一個鍵值對,一個 GMT(格林尼治標準)時間,一個路徑,一個域名。鍵值對會被編碼爲URL。有效期域是個指令,告訴瀏覽器在何時以後就能夠清除這個 cookie。)的形式體現;cookie是瀏覽器所提供的一種技術,一些信息存儲在客戶端,使用時能夠不用經過網絡傳輸,而獲取信息,提升網頁的處理效率,減小服務器的負載。可是因爲存儲在客戶端,因此安全性不好。
全部的cookie是由服務器端設置到客戶端的,因此要使用response對象來增長cookie對象。response.addCookie(Cookie cooke)
大多數直接增長的cookie並非存儲在客戶端的,而是存儲在瀏覽器,因此當關閉瀏覽器後再打開就會發現cookie中的信息爲空。因此咱們要設置cookie的保存時間,來作到真正的保存在客戶端。當咱們設置爲可存儲的cookie時,咱們再次向服務器發送請求時,會將以前服務器返回的cookie再次發送給服務器。
cookie經常使用的方法
序號 方法 描述
1 public void setDomain(String pattern) 設置 cookie 的域名,好比 runoob.com
2 public String getDomain() 獲取 cookie 的域名,好比 runoob.com
3 public void setMaxAge(int expiry) 設置 cookie 有效期,以秒爲單位,默認有效期爲當前session的存活時間
4 public int getMaxAge() 獲取 cookie 有效期,以秒爲單位,默認爲-1 ,代表cookie會活到瀏覽器關閉爲止
5 public String getName() 返回 cookie 的名稱,名稱建立後將不能被修改
6 public void setValue(String newValue) 設置 cookie 的值
7 public String getValue() 獲取cookie的值
8 public void setPath(String uri) 設置 cookie 的路徑,默認爲當前頁面目錄下的全部 URL,還有此目錄下的全部子目錄
9 public String getPath() 獲取 cookie 的路徑
10 public void setSecure(boolean flag) 指明 cookie 是否要加密傳輸
11 public void setComment(String purpose) 設置註釋描述 cookie 的目的。當瀏覽器將 cookie 展示給用戶時,註釋將會變得很是有用
12 public String getComment() 返回描述 cookie 目的的註釋,若沒有則返回 null
使用jsp設置Cookie
  1. 建立一個 cookie 對象: 調用 cookie 的構造函數,使用一個 cookie 名稱和值作參數,它們都是字符串。
  2. 設置有效期:調用 setMaxAge() 函數代表 cookie 在多長時間(以秒爲單位)內有效。下面的操做將有效期設爲了 24 小時。
  3. 將 cookie 發送至 HTTP 響應頭中:調用 response.addCookie() 函數來向 HTTP 響應頭中添加 cookie。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>建立cookie</title>
</head>
<body>
<%
Cookie cookie1=new Cookie("name","teayeon");//建立cookie對象
Cookie cookie2=new Cookie("age","18");
cookie1.setMaxAge(60*60*24);//設置最大生存時間
cookie2.setMaxAge(60*60*24);
response.addCookie(cookie1);//添加到相應的報文頭中
response.addCookie(cookie2);
%>
<h2><a href="getCookie.jsp">點我</a>跳轉到獲取Cookie信息</h2>
</body>
</html>
獲取cookie的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>獲取cookie的值</title>
</head>
<body>
<%!
    String name;
    String value;
%>
<%
Cookie cookies[]=request.getCookies();
for(int x=0;x<cookies.length;x++){
    name=cookies[x].getName();
    value=cookies[x].getValue();

%>
     <h2><%=name%>---><%=value%></h2>
<%
    }
%>
</body>
</html>
輸出
name--->teayeon
age--->18
JSESSIONID--->5C600F1372097AE7A09ED74D1274FAC5
當某個界面設置了增長Cookie的代碼後,在瀏覽器上運行了該頁面,服務器就會返回這個Cookie信息,保存在客戶端。能夠看見這裏我沒有設置JSESSIONID的鍵值對,可是服務器也給返回了。這個JSESSIONID是系統自動生成的。在每個客端訪問服務器時,服務器爲了明確區分每個客戶端,都會自動設置一個JSESSIONID的cookie,表示用戶的惟一身份標識。
可使用設置報文頭的方式爲客戶端加入Cookie。
<%
response.setHeader("Set-Cookie","name=teayeon");
%>
使用jsp刪除cookie
  • 可使用cookie1.setMaxAge(xx);設置最大生存時間.這裏的xx能夠設置爲0,cookie是你前面建立的cookie對象;
  • 也能夠在瀏覽器中手動刪除cookie。

注意:通常一個客戶端最多保存300多個cookie,當數據量太大時將沒法使用cookie。web


5、session

Http是無狀態協議,這意味着每次客戶端檢索網頁時,都要單獨打開一個服務器連接,所以服務器不會記錄下先前客戶端請求的任何信息。有三種方式解決這種問題:
  • Cookies:服務器能夠指定一個惟一的session ID做爲cookie來表明每一個客戶端,用來識別這個客戶端接下來的請求。
  • 重寫URL:你能夠在每一個url後面添加一些額外的數據來區分會話,服務器可以根據這些數據來關聯session標識符,就算瀏覽器不支持cookies也能工做,可是必須爲每個url動態指定一個session ID,就算是靜態的html頁面。
  • session對象:JSP利用servlet提供的HttpSession接口來識別一個用戶保存在服務器端,存儲這個用戶的所訪問信息。默認狀況下,jsp容許會話跟蹤,一個新的HttpSession對象將會自動得爲新的客戶端實例化,禁止會話跟蹤須要顯式的關掉它,經過page指令中的session屬性:
<%@page session="false" %>
  • 隱藏表單域 一個網絡服務器能夠發送一個隱藏的HTML表單域和一個惟一的session ID,就像下面這樣: <input type="hidden" name="sessionid" value="12345"> 這個條目意味着,當表單被提交時,指定的名稱和值將會自動包含在GET或POST數據中。每當瀏覽器發送一個請求,session_id的值就能夠用來保存不一樣瀏覽器的軌跡。 這種方式多是一種有效的方式,但點擊<AHREF>標籤中的超連接時不會產生表單提交事件,所以隱藏表單域也不支持通用會話跟蹤。因此說只有三種方式支持會話

提問:session是否能夠在服務器從新啓動後繼續使用?sql

回答:能夠經過序列化的方式保存session對象。apache

下表列出session對象的一些經常使用方法:
S.N. 方法 描述
1 public Object getAttribute(String name) 返回session對象中與指定名稱綁定的對象,若是不存在則返回null
2 public Enumeration getAttributeNames() 返回session對象中全部的對象名稱
3 public long getCreationTime() 返回session對象被建立的時間, 以毫秒爲單位,從1970年1月1號凌晨開始算起
4 public String getId() 返回session對象的ID
5 public long getLastAccessedTime() 返回客戶端最後訪問的時間,以毫秒爲單位,從1970年1月1號凌晨開始算起
6 public int getMaxInactiveInterval() 返回最大時間間隔,以秒爲單位,servlet 容器將會在這段時間內保持會話打開
7 public void invalidate() 將session無效化,解綁任何與該session綁定的對象
8 public boolean isNew() 返回是否爲一個新的客戶端,或者客戶端是否拒絕加入session
9 public void removeAttribute(String name) 移除session中指定名稱的對象
10 public void setAttribute(String name, Object value) 使用指定的名稱和值來產生一個對象並綁定到session中
11 public void setMaxInactiveInterval(int interval) 用來指定時間,以秒爲單位,servlet容器將會在這段時間內保持會話有效
使用HttpSession對象來獲取建立時間和最後一次訪問時間。咱們將會爲request對象關聯一個新的session對象,若是這個對象還沒有存在的話。
<%@ page import="java.util.Date" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/11/4/004
  Time: 22:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>session</title>
</head>
<%
    out.print("--------");
    //獲取session的建立時間
    Date createdate = new Date(session.getCreationTime());
//獲取session最後一次使用的時間
    Date lastdate = new Date(session.getLastAccessedTime());
    Integer count = Integer.valueOf(0);
    String countKey = String.valueOf("count");
    String userid = String.valueOf("teayeon");
    String userKey = String.valueOf("name");
    if (session.isNew()) {
        session.setAttribute(countKey, count);
        session.setAttribute(userKey, userid);
    } else {
        count = (Integer) session.getAttribute(countKey);
        count += 1;
        userid = (String) session.getAttribute(userKey);
        session.setAttribute(countKey, count);
    }
%>
<body>
<h1>Session 跟蹤</h1>
<table border="1" align="center">
    <tr bgcolor="#949494">
        <th>Session 信息</th>
        <th>值</th>
    </tr>
    <tr>
        <td>id</td>
        <td><% out.print(session.getId()); %></td>
    </tr>
    <tr>
        <td>建立時間</td>
        <td><% out.print(createdate); %></td>
    </tr>
    <tr>
        <td>最後訪問時間</td>
        <td><% out.print(lastdate); %></td>
    </tr>
    <tr>
        <td>用戶 ID</td>
        <td><% out.print(userid); %></td>
    </tr>
    <tr>
        <td>訪問次數</td>
        <td><% out.print(count); %></td>
    </tr>
</table>
</body>
</html>
第一次瀏覽
Session信息
id 2AF9C0F94869D5049E786A6ECDA8DF8A
建立時間 Mon Nov 04 22:53:52 CST 2019
最後訪問時間 Mon Nov 04 22:53:52 CST 2019
用戶 ID teayeon
訪問次數 0
第二次.....。同一個瀏覽器在session的生命週期內,只要不清理瀏覽器歷史記錄,服務器不重啓,這個次數會一直加1.
Session信息
id 2AF9C0F94869D5049E786A6ECDA8DF8A
建立時間 Mon Nov 04 22:53:52 CST 2019
最後訪問時間 Mon Nov 04 22:53:52 CST 2019
用戶 ID teayeon
訪問次數 1
刪除Session數據

當處理完一個用戶的會話數據後,您能夠有以下選擇:編程

  • 移除一個特定的屬性:調用public void removeAttribute(String name) 方法來移除指定的屬性。瀏覽器

  • 刪除整個會話:調用public void invalidate() 方法來使整個session無效。緩存

  • 設置會話有效期:調用 public void setMaxInactiveInterval(int interval) 方法來設置session超時。tomcat

  • 登出用戶:支持servlet2.4版本的服務器,能夠調用logout()方法來登出用戶,而且使全部相關的session無效。

  • 配置web.xml文件:若是使用的是Tomcat,能夠向下面這樣配置web.xml文件:

<session-config>
    <session-timeout>15</session-timeout>
  </session-config>

==超時以分鐘爲單位,Tomcat中的默認的超時時間是30分鐘。==

Servlet中的getMaxInactiveInterval()方法以秒爲單位返回超時時間。若是在web.xml中配置的是15分鐘,則getMaxInactiveInterval( ) 方法將會返回900。


6、application對象

application對象直接包裝了servlet的ServletContext類的對象,是javax.servlet.ServletContext 類的實例。咱們也可使用this.getServletContext()來代替ServletContext類的對象(jsp中不可以使用,java中存在)
這個對象在JSP頁面的整個生命週期中都表明着這個JSP頁面。這個對象在JSP頁面初始化時被建立,隨着jspDestroy()方法的調用而被移除。
經過向application中添加屬性,則全部組成您web應用的JSP文件都能訪問到這些屬性。
  1. application對象中提供了getAttributeNames()方法,能夠取得所有屬性的名稱,下面利用此方法列出所有的屬性名稱和內容。
<%@ page import="java.util.*" %><%--
  Created by IntelliJ IDEA.
  User: YOONA
  Date: 2019/11/6/006
  Time: 13:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>獲取所有的屬性名稱及內容</title>
</head>
<body>
<%
    Enumeration enu = application.getAttributeNames();
    while (enu.hasMoreElements()) {
        String name = (String) enu.nextElement();
%>
<h3><%=name%>-----><%=application.getAttribute(name)%>
</h3>
<%
    }
%>
</body>
</html>
輸出
javax.servlet.context.tempdir----->D:\taeyeon\weblearn\target\tomcat\work\Tomcat\localhost\_
org.apache.catalina.resources----->org.apache.naming.resources.ProxyDirContext@7f6dafb
                         ......
  1. 網站計數器:
  • 由於訪問網站的人會不少,有可能超過20位,因此使用Integer類——Integer完成
  • 用戶每次的第一次訪問時才須要進行計數,使用isNew()判斷。
  • 在進行更改、保存時須要同步操做。
經過application.getRealPath("/")能夠獲取當前工程的真實路徑(D:\taeyeon\weblearn\src\main\webapp\),到webapp結束。參數"/"是當前操做系統設置的路徑分隔符。
<%@ page import="java.math.BigInteger" %>
<%@ page import="java.io.File" %>
<%@ page import="java.util.Scanner" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.io.PrintStream" %>

<%--
 Created by IntelliJ IDEA.
 User: YOONA
 Date: 2019/11/6/006
 Time: 14:59
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>網站計數器</title>
</head>
<body>
<%--瀏覽人數保存在文件中,每次訪問都會去讀取該文件中的數據,而後判斷當前用戶是否爲新用戶,來給流量加一--%>
<%!
   Integer count = null;//建立存放瀏覽人數的對象
   File file1 = null;
%>
<%!
   public Integer load(File file) {//返回當前保存的瀏覽量
       try {
           Scanner scanner = null;
           file1 = new File(file + "/count.txt");
           if (file.exists()) ;
           else {
               file.mkdir();
           }
           if (file1.exists()) {//判斷當前文件是否存在
               scanner = new Scanner(new FileInputStream(file1));
               if (scanner.hasNext()) {
                   count = Integer.valueOf(scanner.next());
               }
               scanner.close();
           } else {
               count = 0;
               save(file, count);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return count;
   }

   //用來保存每一判斷後的瀏覽量
   public void save(File file, Integer count) {
       try {
           if (file.exists()) ;
           else {
               file.mkdir();
           }
           PrintStream ps = new PrintStream(new FileOutputStream(file1));
           ps.println(count);
           ps.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

%>
<%
   String filePath = application.getRealPath("/");
   File file = new File(filePath + "/file");
   if (session.isNew()) {
       synchronized (this) {
           count = load(file);
           System.out.println(count);
           count = count + 1;
           save(file, count);
       }
   }
  session.setMaxInactiveInterval(1);
   response.setHeader("refresh","1");
%>
<H2>你是第<%=count == null ? "0" : count%>個訪客!</H2>
</body>
</html>
由於是保存到txt文件裏的數據,因此該訪問量不會由於服務器的重啓而初始爲0;

7、config對象

config是javax.servlet.ServletConfig接口的實例對象,主要功能是取得一些初始化的配置信息,全部的初始化信息都在web.xml中配置。

config對象經常使用方法有:

方 法 說 明
  getServletContext()   獲取Servlet上下文
  getServletName()    獲取servlet服務器名
  getInitParameter()    獲取服務器全部初始參數名稱,返回值爲java.util.Enumeration對象
  getInitParameterNames()    獲取服務器中name參數的初始值
  1. 初始化一個參數name
<servlet>
    <servlet-name>initmsg</servlet-name>
    <jsp-file>/WEB-INF/config.jsp</jsp-file>
    <init-param>
      <param-name>name</param-name>
      <param-value>teayeon</param-value>
    </init-param>
  </servlet>
  1. 獲取初始化的參數值
<%= config.getInitParameter("name")%>
在web目錄中必須存在一個WEB-INFO文件夾,這個目錄是受保護的,其中的內容沒法被外部所訪問到,安全性很高,若是將一個頁面jsp文件保存在該目錄下,那麼在瀏覽器中用戶是訪問不到該頁面的。因此咱們就要經過配置WEB-INFO下的web.xml文件了,進行映射操做。
  1. 不配置web.xml
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>config安全性</title>
</head>
<body>
<h3>我在WEB-INFO下面</h3>
</body>
</html>
輸出
HTTP狀態404-
類型狀態報告

信息

描述 所請求的資源不可用。

Apache Tomcat / 7.0.47
  1. 配置了web.xml,就能夠經過虛擬路徑進行訪問了(servlet-name不能重複)。
<servlet>
    <servlet-name>config</servlet-name>
    <jsp-file>/WEB-INF/config.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>config</servlet-name>
    <url-pattern>/config</url-pattern>
  </servlet-mapping>

注意:咱們在書寫web.xml文件時,<servlet>節點必定要放在<servlet-mapping>的前面。好比:

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

這樣書寫會報錯的,正確方式以下:

<servlet>

</servlet>

<servlet>

</servlet>

<servlet-mapping>

</servlet-mapping>

<servlet-mapping>

</servlet-mapping>

8、out對象

out對象是javax.servlet.jsp.JspWriter類的實例化對象,主要功能是完成頁面的輸出操做,使用println();print()方法輸出。建議你們多使用表達式<%=%>輸出頁面內容。

9、pageContext對象

經常使用方法:
方法 描述
forward(String relativeUrlPath): 將當前頁面轉發到另一個頁面或者Servlet組建上;
getRequest(): 返回當前頁面的request對象;
getResponse(): 返回當前頁面的response對象;
getServetConfig(): 返回當前頁面的servletConfig對象;
getServletContext(): 返回當前頁面的ServletContext對象,這個對象是全部的頁面共享的.
getSession(): 返回當前頁面的session對象;
findAttribute(): 按照頁面,請求,會話,以及應用程序範圍的屬性實現對某個屬性的搜索;
setAttribute(): 設置默認頁面範圍或特定對象範圍之中的對象.
removeAttribute(): 刪除默認頁面對象或特定對象範圍之中的已命名對象.
pageContext對象是javax.servlet.jsp.PageContext 類的實例,用來表明整個JSP頁面。
  1. 這個對象主要用來訪問頁面信息,同時過濾掉大部分實現細節。

  2. 這個對象存儲了request對象和response對象的引用。application對象,config對象,session對象,out對象能夠經過訪問這個對象的屬性來導出。

  3. pageContext對象也包含了傳給JSP頁面的指令信息,包括緩存信息,ErrorPage URL,頁面scope等。

  4. PageContext類定義了一些字段(訪問域int類型),包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40餘種方法,有一半繼承自javax.servlet.jsp.JspContext 類。

pageContext.setAttribute(String s,Object b,int i);//s爲key,b爲value,i爲域
  1. 其中一個重要的方法就是removeArribute(),它可接受一個或兩個參數。好比,pageContext.removeArribute("attrName")移除四個scope中相關屬性,可是下面這種方法只移除特定scope中的相關屬性:
pageContext.removeAttribute("attrName", PAGE_SCOPE);

獲取request對象:pageContext.getRequest();

獲取application對象:pageContext.getServletContext();

. . . . . . . 這樣的方式就能夠等價的獲取到對象,而後使用該實例。


10、page對象

page對象是當前jsp頁面自己,也就是this。是java.lang.Object類的實例。因此他的經常使用方法就是Object類的方法。

11、exception對象

exception 對象包裝了從先前頁面中拋出的異常信息。它一般被用來產生對出錯條件的適當響應。

總結

除了學好每一個內置對象外,咱們還要熟練的使用這些內置對象所繼承或者實現的接口名。這樣咱們才能在servlet中熟練使用這些對象,在servlet中可沒有這些內置對象,想要使用就必須去找到他們的類或者接口,去建立本身的實例。
相關文章
相關標籤/搜索