1. 程式人生 > >Java.web筆記一覽

Java.web筆記一覽

字符串切割 ebean 筆記一 quest 取數 tld 頁面 運行 sql數據庫

攻師之路

JSP 技術
掌握:JSP語法 + EL + JSTL

為什麽sun推出 JSP技術 ?
Servlet 生成網頁比較復雜,本身不支持HTML語法,html代碼需要通過response輸出流輸出,JSP支持HTML語法,生成HTML方便。

JSP技術與Servlet 技術區別和關系?
JSP和Servlet技術都是用來動態生成網頁的,Servlet不支持HTML語法,生成網頁麻煩,JSP支持HTML語法,生成網頁方便,JSP運行時翻譯Servlet 執行的。JSP 就是 Servlet 。

JSP運行原理是怎樣的 ?
客戶端訪問編寫JSP文件,服務器讀取JSP文件,根據JSP生成Servlet ,Servlet編譯運行生成網頁。

JSP <%! %> <%= %> <% %>
<%! %> 聲明:定義翻譯後Servlet程序的 全局變量或全局方法、內部類
<%= %> 表達式 輸出內容到瀏覽器 效果out.print
<% %> 腳本代碼塊,嵌入java運行代碼 ---- 不翻譯

JSP翻譯Servlet 存放tomcat/work 目錄
* JSP翻譯Servlet 頁面當前所有HTML 翻譯為 out.write 輸出

JSP的註釋 支持三種註釋
1、JSP註釋: <%-- --%> 只存在JSP文件源碼中,在JSP翻譯Servlet時,這類註釋消失了
* 該類註釋得不到執行

2、Java註釋: /** */文檔註釋、 /* */多行註釋、 // 單行註釋
文檔註釋 /** */ 生成javadoc 主要用來註釋 包、類、成員變量、成員方法 ------ 代碼功能使用者
多行註釋 和 單行註釋 不會生成javadoc,註釋代碼實現邏輯 用於在方法內 ------ 程序員本身,讀懂代碼進行註釋
* Java註釋 在JSP翻譯為Servlet時存在,在Servlet程序執行時,會被忽略,生成HTML網頁源代碼中不存在
* 在Servlet執行過程中被忽略

3、HTML註釋 <!-- -->
* 在JSP翻譯為Servlet時 會被翻譯 out.print 在生成HTML頁面源代碼中該類註釋 也是存在的

結論:JSP註釋在翻譯階段消失,Java註釋在Servlet運行階段消失,HTML註釋不消失

思考題:
<%
String s = "abcd";
%>
<!-- 用HTML註釋 註釋 JSP或者java代碼 <%=s%> -->
在頁面結果中 <!-- 用HTML註釋 註釋 JSP或者java代碼 abcd -->
結論: HTML註釋無法阻止JSP或者 Java代碼執行的

JSP 指令 (JSP Directive)
page指令
include指令
taglib 指令

語法:<%@ 指令名稱 屬性=值 屬性=值 ... %>

page指令用來定義JSP文件的全局屬性 <% page 屬性=值 %>
1、language 只能為java
2、extends JSP翻譯後Servlet 繼承父類,這個屬性一般不設置 ,如果非要設置,繼承類必須是Servlet實現類
3、session 定義JSP中是否可以直接使用Session隱含對象
如果屬性設置為true在JSP翻譯Servlet時 生成以下兩句代碼
HttpSession session = null;
session = pageContext.getSession();
* 如果jsp中想使用HttpSession對象,使用session屬性默認值true
4、import 完成 JSP翻譯後 Servlet 導包
jsp在翻譯為Servlet 默認導包
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
jre默認導入 java.lang
* 在jsp中如果使用類 不屬於以上四個包,需要導包
5、buffer autoFlush 設置 out隱含對象屬性
buffer 設置緩沖區大小
autoFlush 設置當緩沖區滿後,自動刷出
6、isELIgnored 設置JSP是否執行EL表達式
isELIgnored="false" 不忽略---執行解析
isELIgnored="true" 忽略 ---- 不解析
* 一般就是默認值false

7、通過contentType和pageEncoding 設置 JSP頁面編碼
pageEncoding 是 JSP文件源代碼在硬盤上編碼集
contentType 在Servlet生成HTML 傳遞瀏覽器采用編碼

8、通過errorPage 和 isErrorPage 控制 JSP頁面發生錯誤時跳轉
設置錯誤友好頁面 ---- 當頁面發生錯誤,不應該給用戶看到含有代碼錯誤頁面,看到一個友好頁面
通過errorPage指定 在頁面發生錯誤跳轉到哪個頁面
* IE 瀏覽器默認好友頁面 ,如果想看到自己編寫友好頁面,關閉IE默認友好頁面
IE 工具欄 --- Internet選項 ----- 高級 -----顯示友好HTTP錯誤信息 將鉤去掉

在錯誤友好頁面中,可以通過設置isErrorPage屬性,獲得錯誤原因

*在實際開發中,一般不使用上面講解錯誤處理方式

錯誤頁面第二種處理方式: 不僅可以處理500 ,還可以處理404
配置web.xml
<error-page>
<error-code>500</error-code>
<location>/demo5/500.jsp</location>
</error-page>


include指令 ,用來靜態包含頁面 ----- 將頁面公共部分提取出來,通過include完成頁面布局
語法:<%@ include file="文件路徑" %>

include包含目標頁面整個內容,被包含頁面,不需要是一個完整HTML,只要編寫HTML片段就可以了

靜態include 原理
*在 JSP翻譯為Servlet時,完成包含動作,Servlet程序並沒有執行,包含路徑不能用變量、不能含有?拼接參數,目標文件必須存在
* 存在特殊案例:被包含頁面存在錯誤,只要包含後Servlet沒有錯誤,就可以執行

taglib指令 ,用來在jsp頁面引用標簽庫文件
* 定義標簽作用為了簡化 jsp頁面開發
* 通過taglib 指令引入 jstl標簽庫 ,語法: <%taglib uri="" prefix="" %>
uri ---- 定義標簽 唯一命名空間
prefixt ---- 命名空間前綴

引用jstl時,在導入jstl.jar中 META-INF/c.tld
<short-name>c</short-name> -------- 就是prefix屬性
<uri>http://java.sun.com/jsp/jstl/core</uri> ----- 就是uri屬性

JSP的九個內置對象分別是什麽?
什麽是內置對象? JSP翻譯為Servlet代碼時,有些對象默認已經創建好的,這類對象可以直接在jsp中使用,內置對象

page、request、session、application、response、pageContext、out、config、exception
request HttpServletRequest ---- 請求對象
response HttpServletResponse ---- 響應對象
session HttpSession ------- 會話對象
application ServletContext ------ web應用全局唯一對象
config ServletConfig ------ 初始化數據
page this (HttpServlet)
pageContext PageContext
exception Throwable (所有異常父類) ----- 當頁面是一個錯誤頁面,用exception獲得異常信息
* Throwable 是 exception 類 父類
out JspWriter

page 代表當前jsp生成Servlet對象
* page 是 Object類型,只能使用Object中方法 ---- 這個對象在開發中不建議 使用
* 可以將page強制轉換 HttpServlet對象的

Servlet有幾種數據範圍? 三種: request、session、servletcontext
JSP 在 Servlet三種數據範圍基礎上,新添加page數據範圍 ---- JSP 四種數據範圍: page request session application
* page數據範圍存放數據 只在當前jsp內有效

pageContext代表當前頁面上下文
1、向page範圍存取數據
findAttribute 依次在 page 、request 、session 、 application 四個數據範圍進行數據查找
EL 中 ${name} 調用 findAttribute 在四個範圍中依次查找數據

2、pageContext 用來 獲得其它八個隱含對象
* pageContext封裝八個隱含對象意義:框架編寫,得到PageContext對象 相當於得到 JSP九個內置對象

out對象
out功能向瀏覽器輸出信息,是JspWriter類型,內部使用PrintWriter實現,擁有獨立緩沖區。
out創建 ,out對象通過pageContext對象獲得,創建pageContext對象時,指定out緩沖區大小以及是否自動flush
* 通過 page指令 buffer autoFlush 設置out 緩存區大小 以及是否自動 flush

out向瀏覽器輸出內容,response.getWriter 向瀏覽器輸出內容 , 區別?
out.println("aaa");
response.getWriter().println("bbb");
out.print("ccc");
response.getWriter輸出內容,在out輸出內容之前

page request session application response out config pageContext exception


JSP指令和JSP標簽 區分?
JSP 指令 Directive
JSP 標簽 Action

jsp中六個動作標簽
<jsp:useBean> <jsp:setProperty> <jsp:getProperty> ----- 與 JavaBean操作相關 明天學習
<jsp:include> <jsp:forward> <jsp:param >

<jsp:include> 效果 等價於 request.getRequestDispatcher().include
<jsp:forward> 效果 等價於 request.getRequestDispatcher().forward

<jsp:include> 標簽 功能 等價於 <%@ include %>
原理:動態包含
語法:<jsp:include page="文件路徑" />

被包含頁面不需要完整html,只需要編寫html片段

jsp:include 和 @include 區別
@include include指令, 靜態包含,在jsp翻譯為Servlet時,執行包含動作,包含結果是目標頁面翻譯Servlet源代碼 ,翻譯為一個Servlet一起執行
jsp include 標簽,動態包含, 在index servlet執行時 完成包含動作,包含結果是目標jsp翻譯Servlet生成 html頁面結果,每個被包含jsp翻譯單獨Servlet進行執行

<jsp:forward page="/demo11/b.jsp"></jsp:forward> 等價於 request.getRequestDispatcher("/demo11/b.jsp").forward(request,response);

<jsp:forward page="/demo11/b.jsp">
<jsp:param value="itcast" name="name"/>
</jsp:forward>
上面寫法用jsp傳遞一個參數,用jsp如果向傳遞參數,直接通過setAttribute

EL 表達式語言,來自民間 ,Servlet2.4 之後 EL 被納入官方規範
功能:
1、EL 獲得 JSP四個範圍中保存數據 (訪問JavaBean的屬性)
2、EL 表達式支持運算
3、EL 內置 11個對象 --- web開發常用對象
4、EL 調用 java的方法

EL是從javaee1.4版本才被納入規範,javaee1.3 及以前版本,默認對EL不進行解析
* 如果想 javaee1.3 以及之前版本解析 EL ------ 設置 page 屬性 isELIgnored = false

1、使用EL 獲得 jsp四個範圍數據
使用EL指定查找四個範圍數據 ${pageScope.屬性名稱} ${requestScope.屬性名稱} ${sessionScope.屬性名稱} ${applicationScope.屬性名}
如果不執定查找數據範圍 ${屬性名稱} ---- 調用pageContext.findAttribute 在四個範圍依次查找
如果查找屬性不存在,返回是一個 "" 空串,而不是null

獲得數組、List、Map時 有些情況使用 [] 獲得屬性值
. 和 [] 有什麽區別 ?
答案:. 和 [] 都可以用來取得EL 屬性值,.可以實現功能 [] 都可以!
例如: ${pageScope.user.name} 也可以寫為 ${pageScope.user["name"]} (獲得對象後,訪問對象屬性時才可以用 [] 取代.效果 )
[] 可以使用特殊標識信息,但是. 不可以
例如:
pageContext.setAttribute("0","itcast");
pageContext.setAttribute("aa.bb","春生泰克");
只能通過[] 進行訪問 ----- 註意:在使用[] 進行屬性取值時,加"" , 不加"" 認為是一個變量

在使用EL進行取值時,如果含有特使字符屬性,盡量使用[] , 否則都使用. 就可以了

2、在EL 中執行 算術、比較、邏輯運算
在EL 執行運算時,運算語句必須寫入 ${}中
* 在EL 獲得屬性值 執行算術運算,自動類型轉換 ---- 執行算術運算時,進行運算參數,必須都是數字
${"a"+"b"} ---- 發生數字格式化錯誤

empty運算符
1) 判斷一個屬性是否存在 , 通常empty運算符都是結合c:if 一起使用
2) 使用empty 判斷List 或者 Map是否為空 (size==0)

二元表達式:${user!=null?user.name:""} ----- 三元運算符

3、EL 11個內置對象
pageScope requestScope sessionScope applicationScope 四個數據範圍,用來取值

pageContext 當前jsp上下文 ----- ${pageContext.request.contextPath }

${param.name} 等價於 request.getParameter("name")
${paramValues.hobby} 等價於 request.getParameterValues("hobby")
${header.referer} 等價於 request.getHeader("referer")
${headerValues["Accept-Encoding"]} 等價於 request.getHeaders("Accept-Encoding")

${initParam.name} 等價於 getServletContext().getInitParamter("name")

必須掌握cookie隱含對象寫法
Cookie[] cookies = request.getCookies();
if(cookies==null){
out.println("cookie不存在!");
}else{
for(Cookie cookie : cookies){
if(cookie.getName().equals("address")){
out.println(cookie.getValue());
}
}
}

使用EL : ${cookie.address.value }

4、EL獲取數據值,經常需要對取得數據值進行處理 ----- EL函數
步驟:
第一步:編寫java類,提供static方法
第二步:編寫tld文件 ,在tld文件中對函數進行定義描述

sun在jstl中提供一套EL函數庫,這套函數在導入jstl的jar包後,可以直接使用
1) 導入jstl.jar
2) 在JSP頁面內,引入函數庫名稱空間
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
* 在jstl.jar 存在 META-INF/fn.tld 當中定義EL函數庫
3) sun提供EL函數庫主要對字符串進行操作 提供16個函數
語法:${fn:toUpperCase(‘asdasDSFSDF‘)}


外包項目,jsp內部不允許定義腳本元素 <%%> ----- 必須用標簽庫和表達式語言 實現<%%> 代碼效果
使用jstl步驟
1、去官網上下載jstl的jar 1.0 1.1 1.2
1.1和1.2 基本一樣 Servlet2.4(javaee1.4 ) 以後提出的
1.0 在 javaee1.3 之前提出的
* EL 在 javaee1.4 這個版本 納入規範的 , jstl1.0 時 EL還沒有納入規範,所有1.0標簽默認不支持EL 的

2、jar包導入
jstl1.1 兩個jar jstl.jar standard.jar ----- jstl.jar 接口API standard.jar 代碼實現
將兩個jar包 復制工程/WebRoot/WEB-INF/lib 目錄中

3、在jsp頁面內 通過taglib指令 引入jstl 標簽庫對應uri
JSTL分為五類:core核心標簽 fmt國際化標簽 sql數據庫標簽 xml操作xml標簽 fn是EL函數庫
因為數據庫操作和xml操作,都將代碼編寫Servlet中 ,所以 sql標簽庫和xml標簽庫不學習了

每個標簽庫在jar/META-INF/ 對應一個tld文件
例如:c.tld 是jstl1.1版本的 c-1_0.tld 是 jstl1.0 版本標簽庫

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 導入1.1
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %> 導入1.0 不支持EL
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> 導入1.0 支持EL
* /jstl/demo.jsp(15,0) According to TLD or attribute directive in tag file, attribute test does not accept any expressions

12個核心標簽庫標簽
1、c:out 用於將內容輸出到頁面上 ------- 輸出EL值、提供默認值、HTML轉義輸出功能
2、c:set 用於設置一個變量或者屬性 ---- 向四個數據範圍保存一個數據,對四個數據範圍一個已經存在對象修改其屬性值
3、c:remove 用於移除四個數據範圍的數據
4、c:catch 相當於try -- catch代碼塊 ----- 捕獲異常,將異常對象保存page指定屬性中
5、c:if 取代頁面if 條件判斷
6、c:choose c:when c:otherwise 實現if -- else if -- else效果 --- 實現 switch 效果
7、c:forEach 實現 foreach循環效果 ----- 遍歷數組、List、Map、控制指定循環次數求和、在特殊次數進行操作
8、c:forTokens 完成字符串切割
9、c:param 不能單獨使用,通常與url相關標簽一起使用 ,與c:url一起使用完成中文編碼
10、c:import 導入目標頁面,將目標頁面內容保存起來,再進行使用
11、c:url 完成URL重寫 (客戶端禁用cookie ,URL重寫拼接jSessionId),結合param對中文進行url編碼
12 c:redirect 標簽用於實現請求重定向

常用:c:set c:if c:forEach c:url進行中文url編碼 c:redirect

總結:
1、JSP 和Servlet關系
2、JSP運行原理
3、JSP 腳本元素三種 <%! %> <%=%> <% %>
4、JSP三種註釋
5、page指令 contentType和pageEncoding區別
6、錯誤友好頁面 web.xml 配置
7、<%@include %> 與 <jsp:include> 原理區別
8、<jsp:forward>轉發 <c:redirect>重定向
9、EL 獲取數據 . []用法
10、empty not 使用
11、${pageContext.request.contextPath } 取得工程名 /day08 ----- ${cookie.name.value } 快速獲得cookie值
12、EL 使用 JSTL提供EL函數庫
13、JSTL 區分1.0 和 1.1
14、常用core標簽
c:set 、c:if 、c:forEach 、c:url和c:param編碼、 c:redirect

Java.web筆記一覽