JSP:
什麼是JSP:Java Server Pages (Java伺服器端頁面.)
為什麼出現JSP:拟補Servlet自身的缺陷.
JSP = HTML + Java + 自身的指令 标簽...`
JSP的執行原理:
JSP也會被翻譯成Servlet 解析執行.
JSP的運作腳本:
<%! %> :定義 變量 方法 和 類. 翻譯成全局變量、全局方法、内部類. 很少使用.
<%= %> :表達式.不需要寫; 翻譯成out.println( );中的内容.
<% %> :定義 變量 不能定義方法. 翻譯成service方法内部的代碼.
下面的JSP的代碼,在JSP中運作會輸出( C )
<%=x %>
<% x=; %>
<% int x = ; %>
<% this.x = ; %>
<%=x %>
<%! int x = ; %>
A.編譯錯誤 B.10 0 C.0 10 D.0 20
<%! int x = ; %> ---- 定義一個全局變量x = 0; 優先翻譯.
<%=x %> ---- 輸出x 全局變量x 輸出0
<% x=; %> ---- 将全局變量指派為 x = 5;
<% int x = ; %> ---- 定義局部變量 x = 10;
<% this.x = ; %> ---- 全局變量x的值修改為了20;
<%=x %> ---- 輸出x是局部變量
JSP的注釋:
支援HTML文法:
* HTML的注釋: <!-- 注釋 -->
支援Java代碼 :
* Java的注釋:
// 單行注釋
/* */ 多行注釋
/** */ 文檔注釋
本身JSP注釋:
* JSP注釋:
<%-- JSP注釋 --%>
注釋的差別:
JSP注釋: 隻會存在于源代碼階段(JSP階段).翻譯成Servlet執行的時候 注釋消失了.
Java注釋: 會存在于源代碼及Servlet代碼接到 當由Servlet生成HTML輸出的時候 注釋消失了.
HTML注釋: 會存在源代碼 及 Servlet的代碼 及 生成的HTML頁面 都會存在.
JSP的指令:JSP指令用于提供整個JSP頁面的相關資訊以及用于JSP頁面與容器之間的通信。
指令:page include taglib.
文法:<%@ 指令名稱 屬性名稱="屬性值" %>
page指令:
language: 用于指定在JSP頁面中可以使用的語言.目前來講隻能是java.
extends: 用于指定JSP最終翻譯成Servlet 繼承的類.
* 預設繼承:org.apache.jasper.runtime.HttpJspBase 可以修改 但是這個類必須是Servlet
session: 用于指定JSP是否可以在頁面中直接使用session對象.
* session預設為true在頁面中預設可以直接使用session對象
生成的servlet中 可以看到有一下兩句:
HttpSession session = null;
session = pageContext.getSession();
* session值改為false 在頁面中不能直接使用session.
import: 用于指定JSP中 導入的Java類的包.(import屬性 在page指令中 可以出現多次的.)
* 預設導入的包:
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
buffer和autoFlush: buffer用于指定JSP向頁面輸出的時候緩沖區的大小.預設 8kb.
autoFlush:用于指定超出緩沖區 預設是true 正常輸出 如果值改為了false 出現異常
errorPage和isErrorPage:errorPage:用于指定JSP頁面出錯了.轉向到一個錯誤提示頁面.
isErrorPage:在錯誤頁面中 檢視錯誤資訊. 預設值是false 将其值改為true.将在代碼中生成以下代碼:
Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
在頁面中可以直接使用exception對象.
企業中配置全局錯誤頁面:(*****)
在項目的web.xml中
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
contentType和pageEncoding:contentType:用于指定JSP 浏覽器預設采用的編碼.
pageEncoding:檔案儲存的時候 檔案被翻譯成Servlet的時候采用的字元集編碼
isELIgnored:用于指定JSP頁面是否忽略EL表達式. 預設:false 預設不忽略.
如果将該值改為true 。 不能在頁面中使用EL了.
重點:import contentType和pageEncoding
include指令:用于頁面的包含.(靜态包含.)
<%@ include file=""%>
file:被包含的頁面的路徑.
在包含的時候 被包含的頁面 不需要寫html的結構.
file:代表是被包含頁面的路徑
* file的值不能是變量.
* file的值不能傳遞參數.
原理:
相當于代碼的拷貝.最後翻譯成一個servlet 由該Servlet執行.
taglib指令: 用于頁面引入标簽庫. 标簽庫 主要用于替換頁面中<%%>
<%@ taglib uri="" prefix=""%>
uri:标簽庫路徑.
prefix:标簽庫的小名.
JSP的三大指令:page include taglib.
(*****)JSP的内置對象:(面試:JSP中内置對象有哪些?常用方法有什麼?對象代表的含義?)
内置對象:在JSP中直接可以使用的對象.
九個内置對象:
pageContext、request、response、session、application、out、page、exception、config
request:HttpServletRequest 代表客戶的請求
response:HttpServletResponse 代表伺服器的響應
session:HttpSession 代表一次回話
application:ServletContext 針對一個web項目、伺服器的一個對象
exception:Throwable 異常資訊
config:ServletConfig 獲得Servlet配置資訊 getInitParameter(); getServletName();
page:Object 代表jsp翻譯成Servlet類的對象
pageContext:PageContext 代表一個域對象,隻能在目前頁面使用
out:jspWrite 輸出對象
***** out對象 和 response.getWriter(); 是不是一個對象?
肯定不是.out是JspWriter 而response.getWriter()獲得PrintWriter.
JSP的四個作用範圍:
pageContext:page範圍.
request:請求範圍.
session:會話範圍.
application:應用範圍.
***** page指令 page對象 page範圍.
JSP的标簽:(JSP的動作) JSP Action
文法:
<jsp:forward> :轉發.
<jsp:include> :包含.(動态包含)
* 動态包含 和 靜态包含的差別?
動态包含:包含運作結果、編譯多次
靜态包含:相當于直接代碼拷貝、編譯一次
<jsp:param> :傳遞參數. (一般不用.)
以下3個标簽與JavaBean有關.
<jsp:useBean> :
<jsp:setProperty>
<jsp:getProperty>
什麼叫做JavaBean: 作用封裝資料. JavaBean:就是一個滿足了某種特定格式的Java類.
格式:
這個Java類必須具有一個無參的構造函數
屬性必須私有化。
私有化的屬性必須通過public類型的方法暴露給其它程式,并且方法的命名也必須遵守一定的命名規範。
setXxxx getXxxx
JavaBean的屬性:
* JavaBean的屬性是由誰決定的? 由get 或 set方法決定.
<jsp:useBean>
id:對目前類 取的唯一辨別 .
class:JavaBean類的全路徑 。
scope:page request session application 建立一個對象 對象放在某個域中.
<jsp:useBean id="p" class="cn.itcast.bean.Person" scope="page"></jsp:useBean> 翻譯後 生成以下的代碼.
cn.itcast.bean.Person p = null;
synchronized (_jspx_page_context) {
p = (cn.itcast.bean.Person) _jspx_page_context.getAttribute("p", PageContext.PAGE_SCOPE);
if (p == null){
p = new cn.itcast.bean.Person();
_jspx_page_context.setAttribute("p", p, PageContext.PAGE_SCOPE);
}
}
<jsp:setProperty property="id" name="p"/>
<jsp:setProperty property="name" name="p"/>
<jsp:setProperty property="sex" name="p"/>
簡寫:
<jsp:setProperty property="*" name="p"/>
前提:表單中的name的值 于 JavaBean的setXxx滿足一緻.
内省:獲得JavaBean的屬性.及對應屬性的讀和寫的方法.(了解.)
沒有反射底層.
java.beans.Introspector
* static BeanInfo getBeanInfo(Class<?> beanClass) --- 獲得類的資訊.
java.beans.BeanInfo
* PropertyDescriptor[] getPropertyDescriptors() --- 獲得類的屬性描述.
java.beans.PropertyDescriptor
* String getName();
* Method getReadMethod()
* Method getWriteMethod()
BeanUtils:Apache下的一個開源免費的類庫. *****會用.
完成JavaBean的封裝.
核心類:
BeanUtils
static void populate(Object bean, Map properties)
ConvertUtils
static void register(Converter converter, Class clazz)
EL:結合JSTL的标簽庫 替換 頁面中的<%%>
文法:${ EL表達式. }
* 獲得域對象值.
* 傳統方式取值.
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
* 使用EL取值
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
* EL的簡寫
${name} :預設從小的範圍中找name的值 有沒有.
EL比傳統方式好:如果名稱寫錯了 EL 傳回一個 "" 空的字元串 而 傳統方式 傳回null.
* 獲得域對象中存的數組的值.
${ 數組名稱[下标] }
* 獲得域對象的List集合的值 .
${ list名稱[下标]}
* 獲得域對象的Map集合的值 .
${ map的名稱.key }
* 獲得域對象的對象屬性的值 .
${ 對象名稱.屬性名}
[] 和 . 索引值 使用[] . 一般是帶有屬性.(對象中的屬性.)
如果map集合的key中有特殊符号 不能使用. 必須是用[] 如 ${ map["ddd.eee"] }
* 執行運算.
算數運算:
${ n1 + n2 }
邏輯運作:
關系運算:
* 操作web開發常用的對象.
個.
param :相當于request.getParameter();
paramValues :相當于request.getParameterValues();
* 這兩個用來接收參數的.
header :獲得請求的頭資訊 request.getHeader("");
headerValues :獲得一個key對應多個value的情況.
* 這兩個用來獲得請求的頭資訊.
cookie :獲得Cookie的資訊.
* 之前擷取Cookie request.getCookies(); 傳回一個Cookie的數組.在數組中查找指定名稱的Cookie.
${ cookie.history.value } // 獲得了名稱是history的Cookie的value的值.
initParam :獲得全局初始化參數.
pageContext :就是PageContext内置對象.
* 調用Java的方法
總結:
JSP的腳本
可以寫入java代碼<% %> <%! %> <%= %>
JSP的注釋
jsp注釋:<%-- --%>:隻存在就jsp中
java注釋:<%// /* */ /** */>%:能存到編譯後的servlet中,倒也html頁面上就沒了
html注釋:<!-- -->:一直都會存在
JSP的指令
<%@ 指令名稱 %>
三大指令:page include taglib
JSP的内置對象
九大内置對象:pageContext request response session application out exception page config
JSP的動作标簽
<jsp:标簽 >
forward
include
param
userBean
setProperty
getProperty
**** 動态包含與靜态包含
靜态包含代碼 動态包含結果
JSP的四個作用範圍
pageContext
request
session
application
JavaBean:java類
BeanUtils
導包
自定義類型轉換器
BeanUtils.populate(Object obj, Map map);
EL表達式:
擷取值
擷取四個域對象的值
**** 擷取域對象村的值 數組List Map
執行運算
*算術運算
*關系運算
*邏輯運算
*三元運算
EL中操作web常用的對象
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
pageContext