11. JSP(我的JavaEE筆記)

1.什么是JSP

(1)jsp全稱是Java Server Pages,它和Servlet技術一樣都是sun公司定義的一種用于開發動態web資源的技術。
(2)jsp這門技術的最大的特點在于,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態數據,而jsp技術允許在頁面中嵌套java代碼,為用戶提供動態數據。

2. jsp原理

其原理就是jsp引擎將jsp文件翻譯成一個servlet,而其中的java代碼將原封不動的復制到新的servlet中。其執行起來也和servlet一樣。

3. jsp的最佳實踐

不管是jsp還是servlet,雖然都可以用于開發動態web資源。但由于這兩門技術各自的特點,在長期的軟件實踐中,人們逐漸把servlet作為web應用中的控制組件來使用,而把jsp技術作為數據顯示模板來使用。

其原因是,程序的數據通常要美化后再輸出
(1)讓jsp即用java代碼產生動態數據,又做美化會導致頁面難以維護。
(2)讓servlet即產生數據,又在里面嵌套html代碼美化數據,同樣也會導致程序可讀性差,難以維護。

4. jsp語法

(1)jsp模板元素

Jsp頁面中的html內容稱之為jsp模板元素。Jsp模板元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。

(2)jsp腳本表達式

Jsp腳本表達式用于將程序數據輸出到客戶端:
語法:<%=x%>
舉例:當前時間:<%=new java.util.Date()%>

Jsp引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然后在相應位置用out.print(...)將數據輸出給客戶端。

注意:jsp腳本表達式中的變量或表達式后面一定不能有分號!

(3)jsp腳本片斷

Jsp腳本片斷用于在jsp頁面中編寫多行java代碼。
語法:

<%
    多行java代碼
%>

注意:jsp腳本片斷只能出現java代碼,不能出現其它模板元素,jsp引擎在翻譯jsp頁面中,會將jsp腳本片斷中的java代碼將被原封不動地放到servlet中的_jspServlet方法中。Jsp腳本片斷中的java代碼必須嚴格遵循java代碼,例如,每執行語句后面必須用分號結束。

在一個jsp頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、html標記和其他jsp元素。多個腳本片斷的代碼可以相互訪問,就像將所有的代碼放在一對<%%>之中的情況。

單個腳本片斷中的java語句可以是不完整的,但是,多個腳本片斷組合后的結果必須是完整的java語句,例如:

<%
    for(int i = 0; i < 5; i++)
    {
%>
    <H1>www.itcast.org</H1>
<%
    }
%>

(4)jsp聲明

Jsp頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中,而jsp聲明中的java代碼會被翻譯到 _jspService 方法的外面。語法:

<%!
    Java代碼
%>

所以,jsp聲明可以用于定義jsp頁面轉換成的servlet程序的靜態代碼塊、成員變量和方法。多個靜態代碼塊、變量和函數可以定義在一個jsp聲明中,也可以分別單獨定義在多個jsp聲明中。Jsp隱式對象的作用范圍僅限于servlet的 _jspServeice 方法,所以在jsp聲明中不能使用這些隱式對象。

注意:不能在jsp中定義名字為 jspInit 或 jspDestroy 的方法,這樣在將jsp翻譯成servlet時會將原帶的相關方法覆蓋掉。

(5)jsp注釋

Jsp中使用<%--注釋信息--%>格式添加注釋,但是注意:這個和html頁面中的****不同的是,jsp中的注釋信息不會被翻譯到servlet中,這樣就不會被顯示在頁面上,但是html中的注釋是會被發送到瀏覽器中的。

5. jsp指令

(1)Jsp指令是為jsp引擎而設計的,它們并不直接產生任何可見輸出,而只是告訴引擎如何處理jsp頁面中的其余部分。一共有三個指令:page指令、include指令、taglib指令。這里只講前兩個,最后一個是用于自定義標簽上的,以后會講。

(2)jsp指令簡介

Jsp指令的基本語法格式:

<%@ 指令 屬性值="值"%>

例如:

<%@ page contentType="text/html;charset=gb2312"%>

如果一個指令有多個屬性,可以寫在一個指令中,也可以分開寫。如:

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>

也可以寫成:

<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

(3)page指令

  1. page指令用于定義jsp頁面的各種屬性,無論page指令出現在jsp頁面中的什么地方,它作用的都是整個jsp頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好放在整個jsp頁面的起始位置。
2. jsp2.0規范中定義的page指令完整語法:

language="java" 指定嵌入的語言

extends="package.class" 指明編譯該jsp文件時繼承哪個類。Jsp為servlet,因此當指明繼承普通類時需要實現的servlet的init、destroy等方法。

Import="java.servlet.http" 指明需要導入的包,可以在一條指令的import屬性中引入多個類或包,使用逗號分隔。也可以分開使用指令寫。其中java.lang包,java.servlet包不需要導入。

session="true|false" 指明生成(true)或不生成(false)session,默認是生成,但是一般我們會將其置為false。

buffer="none|8kb|sizekb" 指明緩存的大小,設為none表明無緩存,默認是8kb緩存,可以自己設置大小,比如64kb。但是必須在autoFlush設為true時有效。

autoFlush="true|false" 是否運行緩存。默認為true(運行緩存)。

isThreadSafe="true|false" 指定是否線程安全。默認是false(非線程安全)。

info="text" 指明jsp的信息。該信息可以通過Servlet.getServletInfo()方法取到。

errorPage="relative_url" 指定某個jsp頁面的相對路徑。用于指明一個錯誤顯示頁面,然后我們在此頁面碰到相關的異常時進行跳轉。此屬性指定的頁面通常isErrorPage屬性為true,且內置的exception對象為未捕捉的異常。注意:必須使用相對路徑,如果以“/”斜杠開頭,表示相對于當前web應用程序的根目錄(注意:不是站點根目錄),否則表示相對于當前頁面。當然有時候我們的錯誤顯示頁面會有很多,所以我們一般在web.xml文件中使用<error-page>元素為整個web應用程序設置錯誤處理頁面,其中的<exception-type>子元素指定異常類的完全限定名(java.lang.NoFoundException),而<error-code>指定出現什么錯誤,** <location>**元素指定以”/”開頭的錯誤處理頁面的路徑。如果設置了某個jsp頁面的errorPage屬性,那么在web.xml文件中設置的錯誤處理將不對該頁面起作用。例如一般我們會將所有的錯誤頁面放在一個文件夾中,如下面的errors:

<error-page>
    <error-code>500</error-code>
    <location>/errors/500.jsp</location>
</error-page>

注意:在錯誤顯示頁面中輸出的錯誤信息一定要大于1kb,不然瀏覽器不會顯示出來。

isErrorPage="true|false" 指定該頁面是否為錯誤處理頁面,如果為true,則該jsp內置有一個Exception對象exception,可直接使用,否則沒有。默認為false。注意:jsp中有九大隱式對象,其中有八個是默認會生成的。但是如果我們沒有將此屬性設置為true,那么exception隱式對象將看不到,可以通過exception.getCause()方法得到此隱式對象。

contentType="text/html;charset=UTF-8" 指明有效的文檔類型。如html格式為text/html;純文本格式為text/plain;JPG圖像為image/jpeg;GIF圖像為image/gif。Jsp引擎會根據page指令的此屬性生成相應的調用ServletResponse.setContentType方法的語句。還具有說明jsp源文件的字符編碼的作用。

pageEncoding="characterSet|ISO8859-1" 指定jsp引擎使用哪張碼表。

isELIgnored="true|false" 指明是否支持EL表達式。true為不支持。一般都需要設置為false。

注意:默認是有緩存的,這就是jsp中的out.write()方法和Servlet中的write方法的區別,當我們在jsp中有如下內容:

out.write(“aaa”);
response.getWriter().write(“bbb”);

時bbb會先輸出,因為aaa會先存在out對象的緩沖區中,當滿足一些條件時才能將此緩沖區中的內容寫到servlet的緩沖區,這樣才能輸出。而response.getWriter().write(“bbb”);會直接將bbb存在servlet的緩沖區中,于是可以直接輸出。

使用page指令解決jsp中文亂碼問題(在tomcat5.0中存在,高版本不存在了,同時在MyEclipse中也不存在此問題)
(1)jsp程序存在有與Servlet程序完全相同的中文亂碼問題

輸出響應正文時出現的中文亂碼問題
讀取瀏覽器傳遞的參數信息時出現中文亂碼問題。

(2)jsp引擎將jsp頁面翻譯成Servlet源文件時也可能導致中文亂碼問題

Jsp引擎將jsp源文件翻譯成Servlet源文件默認采用UTF-8編碼,而jsp開發人員可以采用各種字符集編碼來編寫jsp源文件,這樣就會造成亂碼。如果jsp文件中沒有說明它采用的字符集編碼,jsp引擎將把它當作默認的ISO8859-1字符集編碼處理。

亂碼產生過程:
在tomcat5.0中,若我們使用記事本編寫jsp程序,若jsp程序中有漢字,此時在中文環境下會使用gb2312保存,但是在將其翻譯成Servlet程序時會,jsp引擎會使用ISO8859-1進行翻譯,這時就會出現亂碼,如果我們在Servlet中不對編碼作任何設置,那么Response對象也將會使用ISO8859-1將亂碼顯示在瀏覽器中,而此時瀏覽器會使用ISO8859-1進行顯示,這樣我們看到的就是亂碼,但是如果我們在瀏覽器中選擇使用bg2312顯示還是可以將亂碼轉換成正確的漢字。但是如果我們在Servlet中對編碼進行設置,只要設置的不是ISO8859-1,那么我們在瀏覽器中就不能將亂碼還原成正確的漢字了,即使我們最好使用bg2312進行顯示。但是我們不能讓用戶每次都這樣選擇,所以我們使用pageEncoding進行設置,比如設置為UTF-8,這樣就改變了引擎將jsp程序翻譯成Servlet時使用的碼表。但是如果是使用記事本寫的jsp程序,還是會出現亂碼,因為記事本在中文環境下是使用gb2312保存的,這里我們需要手工改變保存時使用的碼表。但是在MyEclipse中不需要,它會根據pageEncoding設置的碼表保存相關的jsp程序。

注意:tomcat5.0中還有一個問題是,在高版本的tomcat中會將webapps中的工程自動發布成web應用,但是5.0不會,在文件夾中必須要有一個WEB-INF的文件夾,同時還必須要有web.xml文件才行。

如何解決
通過page指令的contentType屬性說明jsp源文件的字符集編碼。
page指令的pageEncoding屬性說明jsp源文件的字符集編碼

(4) include指令

  1. include指令用于引入其他jsp頁面,如果使用include指令引入了其它jsp頁面,那么jsp引擎將把這兩個jsp翻頁成一個Servlet。所以include指令引入通常稱為靜態導入。

語法:

<%@ include file="relativeURL"%>

其中的file屬性用于指定被引入文件的路徑。路徑以”/”開頭,表示當前web應用。

細節:
被引入的文件必須遵循jsp語法。被引入的文件可以使用任意的擴展名是html,jsp引擎也會按照處理jsp頁面的方式處理它里面的內容,為了見名知意,jsp規范建議使用.jsp作為靜態引入文件的擴展名。

由于使用include指令將會涉及到2個頁面,并會把jsp翻譯成一個Servlet,所以這2個jsp頁面的指令不能沖突。同時多個jsp程序中最好只有一個jsp程序里面帶有html這類全局標簽,但是不能將標識jsp文件的頭刪掉。
例:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    這是網頁頭

但是有些指令可以沖突,比如pageEncoding、import。

以上是靜態包含,也可以使用動態包含:

<%
    Request.getRequestDispatcher("/public/head.jsp").include(request,response);
%>

這就是動態包含,但是這種包含效率較低,因為它會將多個jsp翻譯成多個servlet。

6. jsp運行原理和九大隱式對象

(1)每個jsp頁面在第一次被訪問時,web容器都會把請求交給jsp引擎(一個java程序)去處理。Jsp引擎先將jsp翻譯成一個_jspServlet(實質上也是一個Servlet),然后按照Servlet的調用方式進行調用。

(2)由于jsp第一次訪問時會翻譯成Servlet,所以第一次訪問通常會比較慢,但后面的訪問時,jsp引擎如果發現jsp沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會收到影響。

(3)jsp引擎在調用jsp對應的_jspServlet時,會傳遞或創建九個與web開發相關的對象供_jspServlet使用。Jsp技術的設計者為了便于開發人員在編寫jsp頁面時獲得這些web對象的引用,特意定義了九個相應的變量,開發人員在jsp頁面中通過這些變量就可以快速獲得這九個對象的引用。

(4)九個隱式對象

Request、Response、session、Application(servletContext)、config(servletConfig)、page(this)、exception、out(jspWriter)、pageContext。其中只有最后一個是jsp獨有的,其余的都是在servlet中學過的。

1.out隱式對象

Out隱式對象用于向客戶端發送文本數據。Out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與servletResponse.getWriter方法返回的PrintWriter對象非常相似,但是不同。

Jsp頁面中的out隱式對象的類型為jspWriter,jspWriter相當于一種帶緩存功能的PrintWriter,設置jsp頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存。

只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用servletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區中的內容真正寫到servlet引擎提供的緩沖區中:

  1. 設置page指令的buffer屬性關閉了out對象的緩存功能;
  2. out對象的緩沖區已滿
  3. 整個jsp頁面結束
    注意:這里有兩個緩沖區。

2.用jsp實現文件下載

<%@page import="java.io.OutputStream"%><%@page import="java.io.FileInputStream"%><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%
    String path = application.getRealPath("1.jpg");
    String filename = path.substring(path.lastIndexOf("\\") + 1);
    response.setHeader("content-disposition", "attachment;filename="+filename);
    FileInputStream in = new FileInputStream(path);
    int len = 0;
    byte[] buffer = new byte[1024];
    OutputStream sout = response.getOutputStream();
    while((len = in.read(buffer)) > 0){
        sout.write(buffer, 0, len);
    }
    in.close();
 %>


注意:這里我們必須將所有的模板內容都刪除干凈,因為只要有模板內容那么就會生成out對象,但是我們可以看到java代碼中我們自己創建了一個字節流,那如果服務器又生成一個out的字符流就會產生異常,字符流是不能輸出圖片的。只有當模板代碼沒有時才不會生成out隱式對象,即使生成了也不會輸出。而刪除模板代碼要將空格都刪除干凈,每個<% %>之間不能有空格,而最后的%>后面也不能有空格。我們可以看到,這和我們在servlet中寫是一樣的。

3. pageContext對象

(1)pageContext對象是jsp技術中最重要的一個對象,它代表jsp頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,自身還是一個域對象,可以用來保存數據。并且,這個對象還封裝了web開發中常常涉及到的一些常用操作,例如,引入和跳轉到其他資源、檢索其它域對象中的屬性等。

getException方法返回exception隱式對象
getPage方法返回page隱式對象
getRequest方法返回request隱式對象
getResponse方法返回Response隱式對象
getServletConfig方法返回config隱式對象
getServletContext方法返回Application隱式對象
getSession方法返回session隱式對象
getOut方法返回out隱式對象

既然pageContext內置其他八大對象,那么如果將此對象傳遞給一個普通的java對象,那么這個java對象就相當于一個servlet。

(2)pageContext作為域對象

pageContext對象的方法
public abstract void setAttribute(String name,Object value)
public abstract Object getAttribute(String name)
public abstract void removeAttribute(String name)

pageContext對象中還封裝了訪問其它域的方法
public abstract Object getAttribute(String name,int scope)
public abstract void setAttribute(String name,
Object value,int scope)
public abstract void removeAttribute(String name, int scope)

代表各個域的常量
PageContext. APPLICATION_SCOPE
PageContext. SESSION_SCOPE
PageContext. REQUEST_SCOPE
PageContext. PAGE_SCOPE

例子:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '2.jsp' starting page</title>
  </head>
  <body>
    <%  
        //往session中存入一個數據
        pageContext.setAttribute("data", "xxx", PageContext.SESSION_SCOPE);
        //從session中取數據
        /* String data = (String)session.getAttribute("data");
        String data = (String)pageContext.getAttribute("data"); */
        
        String data = (String)pageContext.findAttribute("data");
     %>
     <%=data %>
  </body>
</html>

注意:findAttribute這個方法重點掌握,用于查找各個域中的屬性。

(3)引入和跳轉到其他資源

pageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。方法接收的資源如果以“/”開頭,“/”表示當前的web應用。當然這都是動態引用。

(4)jsp標簽

jsp標簽也稱之為Jsp Action(jsp動作)元素,它用于在jsp頁面中提供業務邏輯功能,避免在jsp頁面中直接編寫java代碼,造成jsp頁面難以維護。

(5)jsp常用標簽

<jsp:include>動態包含標簽:

<jsp:include page="<%=url%>"/>

<jsp:forward><jsp:param>跳轉標簽:

<jsp:forward page="1.jsp">
  <jsp:param name="xxx" value="yyy">
</jsp:forward>

相當于:

<jsp:forward page="1.jsp?xxx=yyy"/>

語法:

<jsp:include page="1.jsp|<%=url%>" flush="true|false"/>

Page屬性用于指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得;flush屬性指定在插入其他資源的輸出內容時,是否先將當前jsp頁面的已輸出的內容刷新到客戶端。

<jsp:include>與include指令的比較
(1) <jsp:include>標簽是動態引入,涉及到兩個jsp頁面會被翻譯成2個servlet,這兩個servlet的內容在執行時進行合并。

(2) 而include指令是靜態引入,涉及到的2個jsp頁面會被翻譯成一個servlet,其內容是在源文件級別進行合并。

(3) 都會把兩個jsp頁面的內容合并輸出,所以這兩個頁面不要出現重復非html全局架構標簽,否則輸出給客戶端的內容將會是一個格式混亂的html文檔。

<jsp:forward>標簽
page屬性用于指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得。

<jsp:param>標簽
用于傳入參數。可以將多個參數寫在一個標簽中,也可以分開寫。

映射jsp

<servlet>
    <servlet-name></servlet-name>
    <jsp-file>/jsp/simple.jsp</jsp-file>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>SimpleJspServlet</servlet-name>
    <url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>

這是我們如果直接訪問yyy.html就相當于訪問simple.jsp。

如何查找jsp頁面中的錯誤
(1) jsp頁面中的jsp語法格式有問題,導致其不能被翻譯成servlet源文件,jsp引擎將提示這類錯誤發生在jsp頁面中的位置以及相關信息。

(2) jsp頁面中的jsp語法格式沒有問題,但被翻譯成的servlet源文件中出現了java語法問題,導致jsp頁面翻譯成的servlet不能通過編譯,jsp引擎也將提示這類錯誤發生在jsp頁面中的位置以及相關信息。

(3) jsp頁面翻譯成的servlet在運行時出現異常,這與普通的java錯誤一樣,會提示相關信息。

(4) 一個難以理解的錯誤:有時候訪問jsp正確,之后訪問又出現錯誤,也就是時好時壞。這是因為如果第一次訪問時正確,那么就有一個正確的servlet存在硬盤中了,如果這時jsp發生改動產生了錯誤,那么第二次訪問會出錯,而第三次訪問時服務器發現剛才編譯過,此時不會再次編譯,會直接從硬盤中取得之前正確的文件,這時就正確了。但是如果間隔時間長了,那么又會再次編譯。

(6)三個容器

request:客戶機像服務器發出請求,用戶看完之后就沒用了,比如新聞,這種數據一般存在此容器中。

session:客戶機像服務器發出請求,用戶看完之后,“過一會兒”之后還有用,比如購物,這種數據一般存在此容器中。

servletContext:客戶機像服務器發出請求,產生的數據用戶看完之后還要給其它用戶使用,比如聊天數據。這類數據一般存在此容器中。
最后,如果使用較小的容器能完成的任務就不要使用較大的容器。

補:九大隱式對象和四大作用域總結

名稱 描述 作用域
request 請求對象 request
response 響應對象 Page
pageContext 頁面上下文對象 Page
session 會話對象 Session
application(servletContext) 應用程序對象 Application
out(jspWriter) 輸出對象 Page
config(servletConfig) 配置對象 Page
page(this) 頁面對象 Page
exception 異常對象 Page

詳細說明:

  • 1.request 對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等,是最常用的對象;

  • 2.response 對象代表的是對客戶端的響應,也就是說可以通過response 對象來組織發送到客戶端的數據。但是由于組織方式比較底層,所以不建議普通讀者使用;

  • 3.pageContext 對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性;

  • 4.session 對象代表服務器與客戶端所建立的會話,當需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物、客戶軌跡跟蹤等。“session” 對象建立在cookie的基礎上,所以使用時應注意判斷一下客戶端是否打開了cookie;

  • 5.application 對象負責提供應用程序在服務器中運行時的一些全局信息;

  • 6.out 對象代表了向客戶端發送數據的對象,與“response” 對象不同,通過“out” 對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out” 對象直接向客戶端寫一個由程序動態生成HTML文件;

  • 7.config對象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數;

  • 8.page 對象代表了正在運行的由JSP文件產生的類對象,不建議一般讀者使用;

  • 9.exception對象則代表了JSP文件運行時所產生的例外對象,此對象不能在一般JSP文件中直接使用,而只能在使用了<%@ page isErrorPage="true "%>的JSP文件中使用。

  • 一般使用最多的也就是request、session、application和pageContext這四個隱式對象。

四大作用域的區別:

  • 1.page里的變量沒法從001.jsp傳遞到002.jsp。只要頁面跳轉了,它們就不見了。

  • 2.request里的變量可以跨越forward前后的兩頁。但是只要刷新頁面,它們就重新計算了。

  • 3.session和application里的變量一直在累加,開始還看不出區別,只要關閉瀏覽器,再次重啟瀏覽器訪問這頁,session里的變量就重新計算了。

  • 4.application里的變量一直在累加,除非你重啟tomcat,否則它會一直變大。

最后:上面的作用域依次增大。

  • 如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當前jsp頁面里。從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。

  • 如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當前請求周期。所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使用forward的方式跳轉了多個jsp頁面,在這些頁面里你都可以使用這個變量。

  • 如果把變量放到session里,就說明它的作用域是session,它的有效范圍是當前會話。所謂當前會話,就是指從用戶打開瀏覽器開始,到用戶關閉瀏覽器這中間的過程。這個過程可能包含多個請求響應。也就是說,只要用戶不關瀏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被稱為一個會話(session),而放到會話中的變量,就可以在當前會話的所有請求里使用。

  • 如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個應用。整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”,是因為一個服務器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。application作用域里的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。與上述三個不同的是,application里的變量可以被所有用戶共用。如果用戶甲的操作修改了application中的變量,用戶乙訪問時得到的是修改后的值。這在其他scope中都是不會發生的,page, request,session都是完全隔離的,無論如何修改都不會影響其他人的數據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.學習內容 JSP技術入門和常用指令 JSP的內置對象&標簽介紹 EL表達式&EL的內置對象 2.JSP技術入門...
    WendyVIV閱讀 2,172評論 1 18
  • 一、JSP基礎 1.1什么是JSP JSP(Java ServerPage)是Java服務器端動態頁面技術。是su...
    晨星資源閱讀 1,175評論 0 6
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,764評論 18 399
  • 這部分主要是與Java Web和Web Service相關的面試題。 96、闡述Servlet和CGI的區別? 答...
    雜貨鋪老板閱讀 1,425評論 0 10
  • 前面講了servlet入門實踐現在開始介紹jsp入門實踐,開發環境的搭建請參考我前面的tomcat的文章,jsp入...
    伊豚wall閱讀 3,384評論 2 56