【我的javaEE學習】JSP簡單學習
一、JSP簡介
1、SUN公司推出的開發動態web資源的技術,屬於JavaEE技術之一。由於原理上是Servlet, 所以JSP/Servlet在一起。
二、HTML、Servlet和JSP
1、HTML:靜態頁面,不能包含java程式碼,只能有HTML有關的標記
2、Servlet:寫java程式碼,做頁面的輸出,不是很方便(開發效率很低)
3、JSP:HTML+java
三、輸出當前的時間
四、JSP的原理及生命週期
1、JSP就是Servlet,學習好JSP的關鍵(語法),時刻想到他對應的Servlet。
五、JSP的語法
5.1模板元素
JSP中的那些HTML。開發時先編寫模板元素,因為他們決定頁面的外觀。如
5.2 Java程式片段
語法:<%java程式%>
出現在JSP對應Servlet的service方法中。
<%宣告的變數:區域性變數%>
Jsp中:
Jsp對應的Serclet中:
5.3 Java表示式
語法:<%=表示式%>
5.4 JSP宣告
語法:<%! %>
作用:定義JSP對應Serlvet的成員(變數和方法、靜態方法)(注意這個聲音是全域性的)
注意:開發中很少用。如:
在serlvet的service方法裡找不到,因為service方法裡是區域性,該變數是全域性的。不建議使用,因為有執行緒安全問題。
5.5 JSP註釋
語法:<%--這是註釋--%>
作用:註釋掉的程式碼,JSP引擎不會翻譯到Servlet原始碼中。要注意和HTML註釋的區別。
5.6 JSP指令:
指令是為JSP引擎設計的。而只是告訴引擎如何處理JSP頁面中的其餘部分(非指令部分);一般把指令放在JSP頁面的頂部(不是必須的)。
基本語法格式:<%@指令 屬性1=”值1” ....%>;指令的屬性可以寫在一個指令的中,也可以分開寫,比如:<%@指令 屬性1=”值1” 屬性2=”值2”%>.
等價於:
<%@指令 屬性1=”值1” %>.
<%@指令 屬性2=”值2”%>.
page:定義JSP頁面的各種屬性,作用於整個JSP頁面。
language:告知引擎,指令碼用的是java。預設java,支援java。不寫也行。(瞭解)
extends:告知引擎,JSP對應的Servlet的父類是哪個。不需要寫,也不要改。
import:告知引擎,匯入哪些包。
注意:引擎自動匯入:java.lang.*;javax.servlet.*;javax.servlet.http.*;javax.servlet.jsp.*;
匯入的形式:<%@page import=”java.util.Date,java.util.UUID”%>
等價於
<%@page import=”java.util.Date”%>
<%@page import=”java.util.UUID”%>
session:告知引擎是否產生HttpSession物件,即是否在程式碼中呼叫request.getSession(),預設值true。改成false就不會產生session.
buffer:JspWriter用於輸出JSP的內容到頁面上。告知引擎,設定他的快取大小。預設8Kb。(瞭解)
errorPage:告知引擎,當前頁面出現了異常,應該轉發到哪個頁面上(路徑寫法:/代表著當前應用)
或者配置全域性錯誤頁面:web.xml
isErrorPage:告知引擎,是否抓住異常。預設值為false。如果該屬性為true,頁面中就可以使用exception隱含物件,列印異常的詳細資訊。
contentType:告知引擎,響應正文的MIME型別。
contentType=”text/html;charset=UTF-8” 相當於response.setContentType(“text/html;charset=UTF-8”);
pageEncoding:告知引擎,翻譯JSP時(要從磁碟上讀JSP檔案)所用的碼錶。
pageEncoding=”UTF-8”:相當於,告知了引擎用UTF-8讀jsp,還response.setContentType(“text/html;charset=UTF-8”);
isELIgnored:告知引擎,是否忽略EL表示式。預設值是false,不忽略。
總結:屬性眾多。一般都用的預設值。最簡單的形式:<%@ page pageEncoding="UTF-8"%>
include:
屬性:file,以”/”開頭,就代表著當前應用。<%@ include file="/public/includefiles/allincludefiles.jsp"%>
taglib:引入外部的標籤。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uri:外部的標籤的uri地址,好比名稱空間;prefix:字首。
六、JSP中的轉發和包含
1、轉發:利用JSP的內建標籤來處理(以jsp開頭的標籤)(jsp:forward)
<jsp:forward page="/10forward.jsp"></jsp:forward>
轉發後當前訪問地址不會變
等價於request.getRequestDispatcher(“/10forward.jsp”).forward(request,respone);
引數:不能單獨使用
向目標傳遞請求引數(傳遞請求引數只認jsp:param,別的包含註釋都是不認的)
即地址:當前專案/10forward.jsp/username=abc
2、包含:
靜態包含:<%@include%>
動態包含:<jsp:include page=””/> (不推薦使用)
包含生成的Servlet要注意,A包含B,那就生成A的Servlet,在A的Servlet裡面包含了B的內容在裡面,一共生成了一個Servlet。
七、JSP的九個隱含物件:
JSP對應的Servlet的service方法中的區域性變數
JSP隱含物件名稱 |
型別 |
備註 |
request |
javax.servlet.http.HttpServletRequest |
|
response |
javax.servlet.http.HttpServletResponse |
|
session |
javax.servlet.http.HttpSession |
page指令設定session是否存在 |
application |
javax.servlet.ServletContext |
|
config |
javax.servlet.ServletConfig |
|
page |
javax.servlet.http.HttpServlet |
當前jsp對應Servlet的例項引用 |
exception |
java.lang.Throwable |
page指令設定exception是否存在 |
out |
javax.servlet.jsp.JspWriter |
字元輸出流。相當於PrintWriter |
pageContext |
javax.servlet.jsp.PageContext |
八、JSP中的異常處理
1、執行時異常:找JSP對應的Servlet原始碼。
2、出現的錯誤(語法不對)
直接看頁面的提示
九、四大域物件
實際開發中:存放資料的。
域物件從小到大:
1、PageContext:頁面範圍,最小。開發中很少用。
⑴生命週期:當對JSP的請求開始,當相應結束時銷燬。
⑵作用範圍:整個JSP頁面,是四大作用域中最小的一個。
⑶作用:獲取其他八大隱式物件,可以認為是一個入口物件。
獲取所有域中的資料。
跳轉到其他資源。
PageContext本身是一個域(範圍)物件,還能操作其他3個域物件中的屬性
●頁面範圍:
void setAttribute(String name,Object value);
void removeAttribute(String name);
Object getAttribute(String name);
●操作其他域物件中的屬性:
void setAttribute(String name,Object value,int scope);
void removeAttribute(String name,int scope);
Object getAttribute(String name,int scope);
其中int scope:常量,PageContext的取值:PAGE_SCOPE(頁面)、REQUEST_SCOPE(請求)、SESSION_SCOPE(會話)和APPLICATION_SCOPE(應用)
●在四個範圍中依次查詢指定名稱物件的方法:
PAGE(頁面)、REQUEST(請求)、SESSION(會話)和APPLICATION(應用)
Object findAttribute(String name);
⑷PageContext獲取其他八個JSP隱含物件(自定義標籤時用)
PageContext.getRequest();
getServletContext();
getServletConfig();
getException();
get等等....
⑸PageContext提供轉發和包含的簡易方法
request.getRequestDispatcher(“/10forward.jsp”).forward(request,respone);
等價於PageContext.forward(“/10forward.jsp”);
或者
pageContext.include(String url);
2、ServletRequest:請求範圍。不同的資源,只有用轉發。
⑴生命週期:在Service方法呼叫前由伺服器建立,傳入service發那個發。整個請求結束,request生命結束。
⑵作用範圍:整個請求鏈(請求轉發也存在)(一次請求)
⑶作用:在整個請求鏈中共享資料,經常用到:在servlet中處理好的資料交給JSP顯示,此時引數就可以放在Request域中。
3、HttpSession:會話範圍。多次請求共享資料,但不同的客戶端不能共享。
⑴生命週期:在第一次呼叫request.getSession()方法時,伺服器會檢查是否已經有對應的session,如果沒有就在記憶體中建立一個session並返回。當一段時間內session沒有被使用(預設為30分鐘),則伺服器會銷燬該session。如果伺服器非正常關閉,沒有到期的session也會跟著銷燬。如果呼叫session提供的invalidate(),可以立即銷燬session。
⑵作用範圍:一次會話。
4、ServletContext:應用範圍,最大。儘量少用,用時要做同步處理。
⑴生命週期:當WEB應用被載入進容器建立代表整個WEB應用的ServletContext物件,當伺服器關閉或WEB應用被移除時,ServletContext物件跟著被銷燬。
⑵作用範圍:整個WEB應用。
⑶在不同Servlet之間轉發、讀取資原始檔
十、JSP開發的最佳實踐
Servlet:擅長寫Java程式碼邏輯,不擅長輸出html的內容。開發中作為:控制器。
JSP:不擅長寫Java程式碼邏輯,擅長顯示結果。開發中作為:檢視(顯示結果)