JSP 學習記錄

JSP 簡介

全名爲Java Server Pages,其根本是一個簡化的Servlet設計,實現了在Java當中使用HTML標籤。JSP是一種動態網頁技術標準,也是JavaEE的標準,JSP與Servlet同樣,是在服務器端執行的。
軟件開發三大方向:php

  1. 桌面應用程序
  2. Web應用程序
  3. 嵌入式應用程序(手機的APP)

1、Web 開發知識補充

1.1 靜態網頁 VS 動態網頁

1.1.1 靜態網頁

  • 內容固定,不會更新
  • HTML,CSS

1.1.2 動態網頁

  • 經過程序動態顯示,自動更新
  • 所需技術:HTML,CSS,JS,XML,數據庫庫,一門高級語言(Java,C#,PHP)
  • 主流的動態網頁腳本技術:JSP/Asp.net/php

1.2 搭建 Java Web

JDK , Tomcat, IDE
推薦:JDK1.7,Tomcat7.0,MyEclipse10

1.2.1 Tomcat 目錄結構

目錄 說明
/bin 存放各類平臺下用於啓動和中止Tomcat的命令文件
/conf 存放Tomcat服務器的各類配置文件
/lib 存放Tomcat服務器所需的各類JAR文件
/logs 存放Tomcat的日誌文件
/temp Tomcat運行時用於存放臨時文件
/webapps 當發佈Web應用時
/work Tomcat把由JSP生成的Servlet放於此目錄下

1.2.2 WEB-INF 目錄結構

  1. WEB_INF:Java的Web應用的安全(客戶端沒法訪問,只有服務端能夠訪問的)目錄。
  2. web.xml 項目部署文件
  3. classes:放置*.class文件,放在WEB_INF目錄下,IDEA須要手動創建
  4. lib文件夾:放置須要的jar包,放在WEB_INF目錄下,IDEA須要手動創建

1.3 如何修改Tomcat的端口?

修改 Tomcat的conf/server.xml的:html

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

修改Port就能成功修改Tomcat的默認端口java

1.4 常見動態網站開發技術對比

  • JSP:Java平臺,安全性高,適合開發大型的,企業級的Web應用程序
  • Asp.net:.Net平臺,簡單易學,可是安全性以及跨平臺性差
  • PHP:簡單,高效,成本低開發週期短,特別適合中小型企業的Web應用開發(LAMP:Linux+Apache+MySQL+PHP)
JSP 適合分佈式的,Hadoop

2、JSP 基礎語法

頁面元素組成:web

  1. 靜態內容
  2. 指令
  3. 註釋
  4. 腳本
  5. 聲明
  6. 表達式

2.1 JSP指令

指令 說明
page 一般位於JSP頁面的頂端,同一個頁面能夠有多個page指令
include 將一個外部文件嵌入到當前JSP文件中,同時解析這個頁面中的JSP語句
taglib 使用標籤庫定義新的自定義標籤,在JSP頁面中啓用定製行爲

2.1.1 page指令

語法:數據庫

<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2"... 屬性n="屬性值n" %>
屬性 描述 默認值
language 指定JSP頁面使用的腳本語言 Java
import 經過該屬性來引用腳本語言中使用到的類文件
contentType 用來指定JSP頁面所採用的編碼方式 text/html,ISO-8859-1

2.2 JSP 註釋

HTML 註釋express

<!--  HTML 的註釋 -->  //客戶端可見,審查元素時

JSP的註釋:數組

<%-- JSP 的註釋 -- %> //客戶端不可見

JSP 腳本註釋:客戶端不可見瀏覽器

// 單行註釋
/* 多行註釋
*/

2.3 JSP 腳本

語法:緩存

<% Java代碼 %>

2.4 JSP 聲明

在JSP中定義變量或者方法

語法:tomcat

<%! Java代碼%>

例子:

<%!
    String s = "張三";    //聲明瞭一個字符串
    int add(int x, int y){   //聲明瞭一個函數,返回兩個整數的求和
        return x+y
    }
%>

2.5 JSP的表達式

JSP中執行的表達式
<%= 表達式%>  // 注意表達式不以分號結束

3、JSP 內置對象

3.1 內置對象簡介

JSP內置對象是web容器建立的一組對象,不用new關鍵字就可使用的內置對象

<%
    int[] value = {60,70,80}
    for(int i:value){
        out.println(i)
    }
%>

JSP內置對象:

  1. out
  2. request
  3. response
  4. session
  5. application
  6. Page/pageContext/exception/config

3.2 out

JspWriter類的實例,向客戶端(瀏覽器)輸出內容經常使用的對象
經常使用方法以下:

  1. void println()向客戶端打印字符串
  2. void clear() 清除緩衝區的內容,若是在flush以後調用會拋出異常
  3. void clearBuffer() 清除緩衝區的內容,若是在flush以後調用不會拋出異常
  4. void flush() 將緩衝區內容輸出到客戶端
  5. int getBufferSize() 返回緩衝區以字節數的大小,如不設緩衝區則爲0
  6. int getRemaining() 返回緩衝區還剩餘多少可用
  7. boolean isAutoFlush() 返回緩衝區滿時,是自動清空仍是拋出異常
  8. void close() 關閉輸出流

3.3 request/response

客戶端的請求信息被封裝在Request對象中,經過它才能瞭解到客戶的需求,而後作出響應。它是HttpServletRequest類的實例。request對象具備請求域,即完成客戶端的請求以前,該對象一直有效。

3.3.1 補充:get 和 post區別

表單:

<form name=「regForm」 action = 「動做」 method=「提交方式」></from>

表單提交方式:get和post

get:以明文的方式經過URL提交數據數據在URL中能夠看到。提交的數據量最多不超過2KB安全性較低但效率比post方式高。適合提交數據量不大,安全性不高的數據。好比:搜索、查詢等功能。
例如結果以下:

http://localhost:8080/ServletDemo/dologin.jsp?username=12&password=12

post:將用戶提交的信息封裝在HTML HEADER內。適合提交數據量大,安全性高的用戶信息。好比:註冊,修改,上傳等功能

3.3.2 經常使用方法

1. String getParameter(String name) 返回name指定參數的參數值
2. String[] getParameterValues(String name)返回包含參數name的全部值的數據
<h1>request 內置對象</h1>
    <%
        request.setCharacterEncoding("utf-8");
    %>
    用戶名:<%=request.getParameter("username")%><br>
    愛好:<%
        String[] favorites = request.getParameterValues("favorite");
        for (int i = 0; i < favorites.length; i++) {
            out.println(favorites[i]+"&nbsp;&nbsp");
        }
    %>
request.setCharacterEncoding("utf-8」);
避免中文在客戶端顯示亂碼

經過URL提交表單,若是是中文可能還會亂碼

解決方法:配置Tomcat
tomcat的conf目錄下的 server.xml
<connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="88433" URIEncoding="utf-8" />

須要重啓Tomcat生效

3. void setAttribute(String, Object) 存儲此請求中的屬性
4. object getAttribute(String name) 返回指定屬性的屬性值

如咱們在解析request時候,能夠設置默認項(密碼):

request.setAttribute("password", "123456");

而後讀取這個值

密碼:<%=request.getAttribute("password")%>
5. String getContentType() 獲得請求體的MIME類型
6. String getProtocol() 返回請求用的協議類型及版本號
7. String getServerName() 返回接收請求的服務器主機名

3.3.3 其餘方法:

1. int getServerPort() 返回服務器接收此請求所用的端口號
2. String getCharaterEncoding() 返回字符編碼方式
3. void setCharacterEncoding() 設置請求的字符編碼方式
4. int getContentLength() 返回請求體的長度(字節數)
5. String getRemoteAddr() 返回請求的客戶端IP地址
6. String getRealPath(String path) 返回一虛擬路徑的真是路徑

3.4 response 對象

包含了響應客戶端請求的有關信息,可是在JSP中不多使用到它。它是HttpServletResponse類的實例。response對象具備頁面做用域,即訪問一個頁面時,該頁面的response對象只能對此次訪問有效,其餘頁面的response對象對當前頁面無效

3.4.1 經常使用方法:

1. String getCharacterEncoding() 返回響應用的是何種字符編碼
2. void setContentType(String type)設置響應的MIME類型
3. PrintWriter getWriter() 返回能夠向客戶端輸出字符的一個對象(注意比較PrintWriter與內置out對象的區別)

區別:

  1. out和response.getWriter的類不同,一個是JspWriter,另外一個是java.io.PrintWriter。
  2. 執行原理不一樣:JspWriter至關於一個帶緩存功能的printWriter,它不是直接將數據輸出到頁面,而是將數據刷新到response的緩衝區後再輸出,response.getWriter直接輸出數據(response.print()),因此(out.print)只能在其後輸出。 (若是想要out對象強制在前輸出,能夠out以後使用flush()方法)
  3. out爲jsp的內置對象,刷新jsp頁面,自動初始化得到out對象,因此使用out對象是須要刷新頁面的,而response.getWriter()響應信息經過out對象輸出到網頁上,當響應結束時它自動被關閉,與jsp頁面無關,無需刷新頁面。「形象的比喻:當咱們調用response.getWriter()這個對象同時得到了網頁的畫筆,這時你就能夠經過這個畫筆在網頁上畫任何你想要顯示的東西。」
  4. out的print()方法和println()方法在緩衝區溢出而且沒有自動刷新時候會產生ioexception,而response.getWrite()方法的print和println中都是抑制ioexception異常的,不會有ioexception 。
4. sendRedirect(java.lang.String location) 重定向客戶端的請求

請求轉發與請求重定向的區別:

  1. 請求重定向:客戶端行爲,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求對象不會保存,地址欄的URL地址會改變
  2. 請求轉發:服務器行爲,request.getRequestDispatcher().forward(req,resp);是一次請求,轉發後請求對象會保存,地址欄的URL地址不會改變

例子:辦理護照
       重定向:你先去了A局,A局的人說:「這事不歸咱們管,去B局」,而後你從A退了出來,乘車去了B局
       轉發:你去了A局,A局看了之後,知道這個事情應該B局管,沒有退出來,讓你坐了一會,本身倒了後面辦公室聯繫了B的人,讓他們辦好後,送了過來。

3.5 session

  • 表示客戶端與服務器的一次會話
  • Web中的session指的是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過這段時間,也就是用戶瀏覽這個網站所花費的時間
  • 從上述定義能夠看到,session其實是一個特定的時間概念

3.5.1 什麼是Session?

在服務器的內存中保存着不一樣用戶的session,每個用戶一個session。

3.5.2 session 對象

  • JSP內置對象
  • 在第一個JSP頁面被裝載時自動建立,完成會話期管理
  • 從一個客戶打開瀏覽器並鏈接到服務器開始,到客戶端關閉瀏覽器離開這個服務器結束,被稱爲一個會話
  • 當客戶訪問一個服務器時,可能在服務器的幾個頁面之間切換,服務器應當經過某種辦法知道這是一個客戶,就須要session對象
  • session對象是HTTPSession類的實例

3.5.3 經常使用方法:

1. long getCreationTime():返回Session建立時間
2. public String getID(): 返回session建立時JSP引擎爲它設的惟一ID號
3. public Object setAttribute(String name, Object value):使用指定名稱對象綁定此會話
4. public Object getAttribute(String name):返回此會話中的指定名稱綁定在一塊兒時的對象
若是沒有對象綁定在該名稱,返回Null
5. String[] getValueNames():返回一個包含此session中全部可用屬性的數組
6. int getMaxInactiveInterval(): 返回兩次請求間隔多長時間此session被取消(單位秒)

3.5.4 Session 生存週期

  1. 建立
  2. 活動
  3. 銷燬
3.5.4.1 建立:

當客戶端第一次訪問某個JSP或者servlet時候,服務器會爲當前會話建立一個sessionId,每次客戶端向服務器發送請求時,都會將此SessionId攜帶過去,服務端會對此SessionId進行校驗

3.5.4.2 活動:
  • 某次會話當中經過超連接打開的新頁面屬於同一次會話。
  • 只要當前會話頁面沒有所有關閉,從新打開的新瀏覽器窗口訪問同一個項目資源時屬於同一次會話。
  • 除非本次會話的全部頁面都關閉後再從新訪問某個JSP或者Servlet,將會建立新的會話。
注意事項:注意原有會話還存在,只是這個舊的sessionId仍存在服務端,只是再也沒有客戶端會攜帶它而後交於服務端校驗
3.5.4.3 銷燬:

session的銷燬方式只有三種:

  1. 調用session.invalidate()方法
  2. session過時(超時)
  3. 服務器重啓

設置超時時間兩種方式:

  1. session.setMaxInactiveInterval(時間)時間是秒
  2. web.xml配置
<session-config>
<session-timeout>
    10 //分鐘
</session-timeout>
</session-config>

3.6 application

  • 實現了用戶間數據的共享,可存放全局變量
  • 開始於服務器的啓動,終止於服務器的關閉
  • 在用戶的先後鏈接或不一樣用戶之間的鏈接中,能夠對application對象的同一屬性進行操做
  • 在任何地方對application對象屬性的操做,都將影響到其餘用戶對此的訪問
  • 服務器的啓動和關閉決定了application對象的聲明
  • application對象是ServletContext類的實例

經常使用方法:

  • public void serAttribute(String name, Object value)使用指定名稱將對象綁定到此會話
  • public Object getArrtibute(String name) 返回與此會話中的指定名稱綁定在一塊兒的對象,若是沒有對象綁定在此名稱下,則返回null
  • Enumeration getAttributeNames()返回全部可用屬性名的枚舉
  • String getServerInfo()返回JSP(Servlet)引擎名及版本號

3.7 page / pageContext / exception / config

3.7.1 page 對象

指當前JSP頁面自己,有點像類中的this指針,它是Java.long.Object類的實例

經常使用方法(Object類的方法):

  • class getClass() 返回此Object 的類
  • int hashCode() 返回此Object的Hash碼
  • boolean equals(Object obj) 判斷此Object是否與指定的Object對象相等
  • void copy(Object obj)把此Object拷貝到指定的Object對象中
  • Object clone() 克隆此Object對象
  • String toString 把Object對象轉換成String類的對象
  • void notify() 喚醒一個等待的線程
  • void notifyall() 喚醒全部等待的線程
  • void wait(int timeout)使一個線程處於等待直到timeout結束或者被喚醒
  • void wait() 使一個線程處於等待直到被喚醒

3.7.2 pageContext對象

  • 提供了對JSP頁面內全部的對象及名字空間的訪問
  • 能夠訪問到本頁所在的session,也能夠取本頁面所在的application的某一個屬性值
  • 至關於頁面中全部功能的集大成者
  • 本類名也叫pageContext

經常使用方法:

  • JspWriter getOut() 返回當前客戶端響應被使用的JspWriter流(out)
  • HttpSession getSession() 返回當前頁中的HttpSession對象(session)
  • Object getPage() 返回當前頁的Object對象(page)
  • ServletRequest getRequest() 返回當前頁的ServletRequest對象(request)
  • ServletResponse getResponse() 返回當前頁的ServletResponse對象(response)
  • void setAttribute(String name, Object attribute)設置屬性及屬性值
  • Object getAttribute(String name, int scope)在指定範圍內取屬性的值
  • int getAttributeScope(String name) 返回某個屬性的做用範圍
  • void forward(String relativeUrlPath) 使當前頁面重導到另外一頁面
  • void include(String relativeUrlPath)在當前位置包含另外一文件

3.7.3 Exception對象

異常對象,當一個頁面在運行過程當中發生了異常,就產生這個對象。若是一個JSP頁面要應用此對象,就必須把isErrorPage設置爲true,不然沒法編譯。它其實是java.lang.Throwable的對象
經常使用方法:

  • String getMessage() 返回描述異常的消息
  • String toString() 返回關於異常的簡短描述信息
  • void printStackTrace() 顯示異常及其棧軌跡
  • Throwable FillInStackTrace() 重寫異常的執行棧軌跡

須要處理異常的頁面,頁面頭要加上errorPage

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="exception.jsp" %>

Exception頁面要在page中填寫isErrorPage

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>

3.7.4 Config 對象

在Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(經過屬性名和屬性值構成)以及服務器的有關信息(經過傳遞一個ServletContext對象)
經常使用方法以下:

  • ServletContext getServletContext() 返回含有服務器相關信息的 ServletContext 對象
  • String getInitParameter(String name)返回初始化參數的值
  • Enumeration getInitParameterNames() 返回Servlet初始化所需全部參數的枚舉

4、JavaBean

4.1 JavaBean 簡介

就是符合某種特定的規範的Java類。使用Javabeans的好處是解決代碼重複編寫,減小代碼冗餘,功能區分明確,提升了代碼的維護性。

4.2 JavaBean的設計原則

  1. 公有類
  2. 無參的公有構造方法
  3. 屬性私有
  4. getter和setter方法

Javabean 設計原則舉例

//設計學生類
public class Students // 公有類
{
    private String name; //屬性私有
    private int age; //屬性私有
    public Students() //無參的公有構造方法
    {}
    // getter 和 setter 方法
    public void setName(String name){this.name =name;}
    public String getName(){return this.name}
    public void setAge(int age){this.age = age;}
    public int getAge(){return this.age;}
}

什麼是Jsp動做

JSP動做元素(acion elements)爲請求處理階段提供信息。動做元素遵循XML元素的語法,有一個包含元素名的開始標籤,能夠有屬性、可選內容、與開始標籤匹配的結束標籤。

第一類:存取與JavaBean有關「重要」
  • <jsp:useBean>
  • <jsp:setProperty>
  • <jsp:getProperty>
第二類:JSP1.2開始有的基本元素,包含6個動做元素
  1. <jsp:include>
  2. <jsp:forward>
  3. <jsp:param>
  4. <jsp:plugin>
  5. <jsp:params>
  6. <jsp:fallback>
第三類:JSP2.0新增長的元素,主要與JSP Document有關,包含6個元素
  1. <jsp:root>
  2. <jsp:declaration>
  3. <jsp:scriptlet>
  4. <jsp:expression>
  5. <jsp:text>
  6. <jsp:output>
第四類:JSP2.0新增長的動做元素,主要是用來動態生成XML元素標籤的值,包括3個動做
  1. <jsp:attribute>
  2. <jsp:body>
  3. <jsp:element>
第五類:JSP2.0 新增長的動做元素,主要使用在Tag File中,有2個元素
  1. <jsp:invoke>
  2. <jsp:dobody>

4.3 如何在JSP頁面中使用Javabeans?

4.3.1 像使用普通類同樣建立Javabeans實例

<body>
    <%
        Users user = new Users();
        user.setUsername("admin");//設置用戶名
        user.setPassword("123456");  //設置密碼
    %>
    <h1>使用普通方式建立javabean實例</h1>
    <hr>
    用戶名:<%=user.getUsername()%><br>
    密碼:<%=user.getPassword()%><br>
  </body>

4.3.2 JSP頁面中一般使用動做標籤使用javabean

useBeans動做 setProperty動做 getProperty動做

<jsp:useBeans>
做用:在jsp頁面中實例化或者在指定範圍內使用javabean:
<jsp:useBean id="標識符" class="java類名(包括包名.類名)" scope="做用範圍"/>

<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
    <h1>使用useBean動做建立javabean實例</h1>
    <hr>
    用戶名:<%=myUsers.getUsername()%><br>
    密碼:<%=myUsers.getPassword()%><br>
<set:Property>

做用:給已經實例化的JavaBean對象的屬性複製,一共有四種形式
<jsp:setProperty name=「JavaBean實例名」 property = 「*」 /> (與表單關聯)
<jsp:setProperty name=「JavaBean實例名」 property = 「JavaBean屬性名」 /> (與表單關聯)
<jsp:setProperty name=「JavaBean實例名」 property = 「JavaBean屬性名」 value=BeanValue「」 /> (手工設置)
<jsp:setProperty name=「JavaBean實例名」 property = 「propertyName」 param=「request對象中的參數名」 /> (與request參數關聯)

<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
    <h1>setProperty動做元素</h1>
    <hr>
    <!-- 根據表單自動匹配全部的屬性 -->
    <%-- <jsp:setProperty name="myUsers" property="*"/> --%>
    <!-- 根據表單自動匹配部分的屬性 -->
    <%-- <jsp:setProperty name="myUsers" property="username"/> --%>
    <!-- 跟表單無關,經過手動複製給屬性(意味着表單填寫的無任何效果) -->
    <%--
    <jsp:setProperty name="myUsers" property="username" value="xiaoshan"/>
    <jsp:setProperty name="myUsers" property="password" value="520"/>
    --%>
    <jsp:setProperty name="myUsers" property="password" param="mypass"/>

    用戶名:<%=myUsers.getUsername()%><br>
    密碼:<%=myUsers.getPassword()%><br>
第四種:form提交的action中設置了mypass參數
<form name="loginFrom" action="dologin.jsp?mypass=520" method="post">
<get:Property>

做用:獲取指定JavaBean對象的屬性值
<jsp:getProperty name=「JavaBean實例名「 property=「屬性名」/>

<!-- 使用傳統表達式的方式獲取用戶名和密碼 -->
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%><br>
<!-- 使用 getProperty 方式獲取 -->
用戶名:<jsp:getProperty name="myUsers" property="username"/><br>
密碼:<jsp:getProperty name="myUsers" property="password"/><br>
JavaBean的四個做用域範圍

說明:使用useBeans 的scope屬性能夠用來指定JavaBean的做用範圍

  • page //當前頁面有效
  • request //能夠經過HttpRequest.getAttribute()方法獲取JavaBean對象
  • session //能夠經過HttpSession.getAttribute()方法獲取JavaBean對象
  • application // 能夠經過application.getAttribute() 方法獲取JavaBean對象
做用域 描述
存儲在application對象中的屬性 能夠被同一個WEB應用程序中的全部Servlet和JSP頁面訪問
存儲在session對象中的屬性 能夠被屬於同一個會話(瀏覽器打開直到關閉稱爲一次會話,且在此期間會話不失效)的全部Servlet和JSP頁面訪問
存儲在request對象中的屬性 能夠被屬於同一個請求的全部Servlet和JSP頁面訪問(在有轉發的狀況下能夠跨頁面獲取屬性值),例如使用PageContext.forward和PageContext.include方法鏈接起來的多個Servlet和JSP頁面
存儲在pageContext對象中的屬性 僅能夠被當前JSP頁面的當前響應過程當中調用的各個組件訪問,例如,正在響應當前請求的JSP頁面和它調用的各個自定義標籤類
<h1>JavaBean四個做用域範圍</h1>
    <hr>
    <jsp:useBean id="myUsers" class="com.po.Users" scope="request"/>
    <!-- 使用 getProperty 方式獲取 -->
    用戶名:<jsp:getProperty name="myUsers" property="username"/><br>
    密碼:<jsp:getProperty name="myUsers" property="password"/><br>
    <!-- 使用 內置對象application方式獲取 -->
    <%--
    用戶名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br>
    密碼:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br>
    --%>
    <!-- 使用 內置對象方式session獲取 -->
    <%--
    用戶名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br>
    密碼:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br>
    --%>

    用戶名:<%=((Users)request.getAttribute("myUsers")).getUsername()%>><br>
    密碼:<%=((Users)request.getAttribute("myUsers")).getPassword()%>><br>
request 經過請求轉發還能夠獲取到,可是page在其餘頁面沒法獲取到

Model1 簡介

Model 1模型出現前,整個Web應用的狀況:幾乎所有由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求處理後直接做出響應。
弊端:在界面層充斥着大量的業務邏輯的代碼和數據訪問層的代碼,Web程序的可擴展性可維護性很是差。

JavaBean的出現可使JSP頁面中使用JavaBean封裝的數據或者調用JavaBean的業務邏輯代碼,這樣大大提高了程序的可維護性

Model1簡單來講就是JSP+JavaBean的開發模式

5、JSP 狀態管理

5.1 HTTP協議無狀態性

無狀態:瀏覽器發送請求給服務器的時候,服務器響應客戶端請求。可是當同一個瀏覽器再次發送請求給服務器的時候,服務器並不知道它就是剛纔那個服務器。

簡單地說,就是服務器不會記錄你,就是無狀態協議

5.2 保存用戶狀態的兩大機制(session&cookie)

cookie

中文名:「小甜餅」
Web服務器保存在客戶端的一系列文本信息
典型應用一:斷定註冊用戶是否已經登陸網址 (如十天內免登陸…)
典型應用二:「購物車的處理」

Cookie的做用
  • 對特定對象的追蹤
  • 保存用戶網頁瀏覽記錄與習慣
  • 簡化登陸
安全風險:容易泄漏用戶信息
JSP中建立與使用Cookies

建立Cookie對象:

Cookie newCookie = new Cookie(String key, Object value);

寫入Cookie對象:

response.addCookie(newCookie)

讀取Cookie對象:

Cookie[] cookies = request.getCookies();

Cookie經常使用方法:

方法名稱 說明
void setMaxAge(int expiry) 設置cookie的有效期,以秒爲單位
void setValue(String value) 在cookie 建立後,對cookie進行賦值
String getName() 獲取cookie名稱
String getValue() 獲取cookie的值
int getMaxAge() 獲取cookie的有效時間,以秒爲單位
session 和cookie對比
session cookie
服務器端(內存)保存用戶信息 客戶端(文本文件)保存用戶信息
session中保存的是Object類型 cookie 保存的是String類型
隨會話的結束而將其存儲的數據銷燬 cookie能夠長期保存在客戶端
保存重要的信息 保存不重要的用戶信息
安全性 :session 比 cookie要高

6、指令與動做

6.1 include指令

語法:
<%@ include file=「URL」%>

6.2 include動做

語法:
<jsp:include page=「URL」 flush=「true|false」/>
經常使用page和flush:
page:要包含的頁面
flush: 被包含的頁面是否從緩衝區讀取

6.3 include指令和include動做的區別

include 指令 jsp:include 動做
語法格式 <%@ include file= 「…」 %> <jsp:include page=「…」 >
發生做用的時間 頁面轉換期間 請求期間
包含的內容 文件的實際內容(代碼) 頁面的輸出(結果)
轉換成的Servlet 主頁面和包含頁面轉換成一個Servlet 主頁面和包含頁面轉換爲獨立的Servlet
編譯時間 較慢——資源必須被解析 較快
執行時間 稍快 較慢——每次資源必須被解析

6.4 <jsp:forward> 動做

語法:
<jsp:forward page=「URL」/>
等同:
request.getRequestDispatcher(「/url」).forward(request, response);

6.5 <jsp:param>

語法:
<jsp:param name=「URL」 value=「」/>

經常做爲<jsp:forward>的子標籤
案例:

<jsp:forward page="user.jsp"/>  
    <jsp:param value="admin@123.net" name="email"/>
    <jsp:param value="123456" name="password"/> //修改密碼
</jsp:forward>

7、知識點補充

7.1 JSP對象 怎樣得到

JSP 對象 怎麼得到
out resp.getWriter
request servlet 方法的 req參數
response servlet 方法的 resp參數
session req.getSession() 函數
application getServletContext() 函數
exception Throwable
page this
pageContext PageContext
config getServletConfig()
相關文章
相關標籤/搜索