01_JSP的概述&入門案例
JSP概述全稱是Java Server Pages,他和Servlet一樣,也是Java所提供的一門用於開發動態WEB資源的技術,
JSP也是JavaEE的規範之一,JSP的底層其實就是Servlet。
JSP的特點
編寫JSP就像編寫HTML一樣
JSP和HTML的區別
HTML只能向客戶端提供靜態數據
JSP技術允許我們在頁面中嵌套Java代碼,從而可以向客戶端提供動態的數據
Servlet本身的缺點
1,每一個Servlet都需在web.xml進行配置
2,顯示html元素的時候非常麻煩
jsp = html + java + jsp自身的東西 本質Servlet
02-08年 基本上開發全部都是用jsp 可讀性非常(html裏面加了java代碼)
單純的jsp頁面不適合做這種大型項目
02_JSP的原理
一個JSP文件第一次被客戶端訪問時(也包括JSP文件修改後的第一次被訪問),WEB服務器會把JSP文件翻譯成一個Servlet,客戶端訪問JSP文件,其實訪問的就是JSP文件翻譯後的Servlet,
JSP的底層原理其實就是Servlet。
談談你對Servlet和jsp理解jsp本質是一個Servlet,他的運行也需要容器(tomcat)支持
在jsp和Servlet文件中都可以編寫java和html代碼,不同的是
Servlet雖然可以動態的生成頁面內容,但是更加偏向於邏輯的控制
jsp最終被轉換成 Servlet 在jvm裏面執行,在jsp裏面雖然可以編寫java代碼,但是他更加偏向於頁面內容的展示
在MVC架構模式中,C通常是由Servlet充當,V通常是由jsp充當
03_JSP默認編碼設置
window - preference -搜索jsp 把Encoding改成UTF-8<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
是jsp本身的編碼設置,contentType服務器端發給客戶端的內容編碼的設置(與response.setContentType("")作用是相同)
pageEncoding 當前jsp頁面本身的編碼
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
是告訴瀏覽器 生成的頁面(這個頁面是用來展示服務器發來的數據) 所使用的格式和編碼,瀏覽器會根據此來調用相應的
字符集來顯示網頁內容
http-equiv類似我們http的頭部協議,他迴應瀏覽器一些有用的信息,以幫助瀏覽器正確和精確的顯示網頁內容
建議: 工作空間 項目 外加jsp頁面 都設置成UTF-8
04_模版元素&腳本片段
模版元素JSP頁面中的HTML標籤,CSS樣式,以及JS都稱之爲JSP的模版元素,模版元素定義了頁面的結構和外觀,
JSP翻譯後的Servlet中,模版元素會被輸出流對象直接發送到客戶端。
腳本片段
JSP頁面中可以嵌套Java代碼,Java代碼要定義在JSP的腳本片段中,也就是<%%>裏面,
JSP頁面中可以有多個腳本片段,
多個腳本片段之間,可以嵌套文本,嵌套HTML的標籤,嵌套其他的JSP元素
注意: 不能在腳本片段裏面定義方法,因爲方法不能嵌套定義
模板元素其實就是頁面上一堆的html代碼
在html中添加java代碼,java代碼就是腳本片段
//兩種方式
if(4>0){
<form>
用戶名:<input type="text"/>
密碼:<input type="password"/>
</form>
}
頁面輸出一個99乘法表快捷鍵:
Ctrl+Shift+L 顯示所有快捷鍵
Ctrl+K 參照選中的詞(Word)快速定位到下一個
Ctrl+Shift+K 參照選中的詞(Word)快速定位到上一個
Ctrl+O 快速顯示OutLine
Ctrl+T 快速顯示當前類的繼承結構
Ctrl+Shift+X 把選中文本全部改爲大寫
Ctrl+Shift+Y 把選中文本全部改爲小寫
Ctrl+Shift+F 按照當前的配置文件格式化源代碼
Ctrl+L 彈出行定位框以便定位到某一行
Ctrl+Numpad_Divide Ctrl+/(小鍵盤) 使代碼摺疊可用
Ctrl+Numpad_Multify Ctrl+*(小鍵盤) 展開當前類中的所有代碼
Ctrl+Shift+Numpad_Divide Ctrl+Shift+/(小鍵盤) 摺疊所有,如果不能全部成功摺疊, 將光標移到文檔最後試着或多按幾次 摺疊當前類中的所有代碼
Ctrl+1 快速修正,需要導包的時候出現導包提示界面, Ctrl+Q 定位到最後編輯的地方
Ctrl+Shift+m 導入當前行上需要的包
05_聲明
在JSP頁面裏定義方法,定義成員變量等,<%! %>注意:不能在聲明裏面寫語句
平時也很少去定義成員變量 ,他是有線程安全問題 用處不大
06_腳本表達式
在JSP頁面中將數據發送到客戶端,替代JSP頁面裏的輸出語句,格式:<%=變量/常量/表達式%> //1 + 1
注意:在腳本表達式中不可以寫分號
總結: 用syso輸出的語句,都可以用腳本表達式輸出
07_註釋
HTML的註釋:<!-- -->Java代碼的註釋://,/**/
腳本片段的註釋:<%-- --%>
注意:
HTML的註釋:被註釋的文本和代碼,會翻譯到Servlet中,然後發送到客戶端
java的註釋:被註釋的文本和代碼,會翻譯到Servlet中,不會發送到客戶端
jsp的註釋: 被註釋的文本和代碼,不會翻譯到Servlet中,不會發送到客戶端
建議使用第三個 功能最強大 什麼都可以註釋,也不會翻譯最後html中
語法:
模板元素: Html + css + js 對於模板元素,會被翻譯到out.println(參數);
腳本片段;java 原樣複製到翻譯後的java文件裏面,複製到service方法 <% %>
java聲明;翻譯到類中,方法外,成員的位置上,可以用來定義成員變量,成員方法<%! %>
腳本表達式:翻譯到out.println(參數),注意不能有分號 <%= %>
註釋:HTML的註釋 java的註釋 jsp的註釋 <%-- --%>
08_指令的概述
指令概念指令並不會直接產生任何可見的輸出,作用是告訴WEB服務器如何處理JSP頁面的其他部分。
指令的分類
page include taglib
基本格式
<%@ 指令名稱 屬性="值" %>分類
<%@ page contentType="text/html;charset=UTF-8" %>
如果一個指令有多個屬性,可以把多個屬性寫在同一個指令中,也可以把多個屬性分開來寫
<%@ page contentType="text/html;charset=UTF-8" import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.Date" %>
09_page指令的屬性
page用於定義JSP頁面的各種屬性,無論定義在JSP頁面的哪個位置,所影響的都是整個JSP頁面,
建議:將page指令定義在JSP頁面的起始位置
屬性:
contentType:設置響應的類型和編碼
pageEncoding:設置JSP頁面的編碼,也設置JSP頁面翻譯成Servlet源文件的編碼
import:導入JSP頁面所需要使用的Java類
默認已經導入的類
java.lang.*;
javax.servlet.*;
javax.servlet.jsp.*;
javax.servlet.http.*;
導包 Alt + / 用 ctrl + shift + O 沒有用的
10_page指令的其他屬性
session:設置是否自動創建內置對象session,默認值是truebuffer:設置內置對象out的緩衝區大小,默認值是8k
autoFlush:設置內置對象out是否會自動刷新,默認值是true
extends:設置JSP翻譯後的Servlet要繼承哪個類,默認值是HttpJspBase
language:設置腳本語言,只有一個值就是java,java也是默認值
isThreadSafe:設置JSP是否是多線程,默認值是true SingleThreadModel
一個軟件的默認值的設置,考經驗得來的
剛開始,靠項目經理的經驗設置
之後,通過壓力測試,試運行,通過真實的用戶數據 分析之後再做出優化 纔去調整
貿然去改 會對系統造成很大的影響
頁面輸出4-5k
緩衝區設置成64K 佔用的內存多,浪費資源
緩衝區設置成1k 一次緩衝不夠存,就會頻繁的刷新,效率比較低
注意:
默認是多線程 也就是jsp可以同時被多個客戶端訪問
11_JSP的異常處理機制
分類設置<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.jsp</location>
</error-page>
統一設置 <error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
第一步: 在web.xml下增加一個error-page標籤第二步: 創建錯誤提示頁面
404-我們正在加緊建設中!
500-服務器忙,請稍後再試!
12_include指令&taglib指令
include (靜態包含指令)用於在JSP頁面中包含其他的WEB資源,把多個WEB資源一起翻譯到了一個Servlet中
屬性:
file:設置要包含的WEB資源的路徑
taglib
引入標籤庫
屬性:
uri:設置引入標籤庫的路徑
prefix:設置引入標籤庫的別名
13_JSP的九大內置對象
HttpServletRequest request 請求對象
HttpServletResponse response 響應對象
JspWriter out 輸出流對象
HttpSession session 會話對象
Throwable exception 異常對象
ServletContext application 代表了整個WEB應用
ServletConfig config 配置參數,用於獲取Servlet的配置參數
Object page Servlet的對象,方法中的this對象
PageContext pageContext JSP頁面的上下文對象
好處:提高開發效率14_PageContext的概述和測試
PageContext是JSP技術中最重要的一個對象,他代表了JSP頁面的運行環境,PageContext封裝了其他八個內置對象,
PageContext也是一個域對象,可以用來保存數據,範圍是當前頁面,
PageContext提供了一些WEB開發的常用功能,比如轉發和包含,還可以操作檢索其他域對象中的數據。
注意:
一定要放對位置,把對象放到session裏面 在 Context裏面是找不到的
pageContext.findAttribute("username");會在4個域對象當中查找數據,順序pageContext,request,session,application
pageContext 頁面上下文 他其實就是相當於大管家
他包含所有的對象,但是他自己功能很弱
1,獲取其他八個對象(用的很少,但是重要)
2,作爲域對象存儲數據(雞肋)
setAttribute(key,value);
getAttribute();
removeAttribute();
3,進行轉發和包含(用的不多)4,獲取所有的4個域對象的數據(重要)
setAttribute(key,value,int scope);
getAttribute(key,int scope);
removeAttribute(key,int scope);
findAttribute(key )
依次 pageContext,request,session,application查找
15_JSP的四大域對象
pageContext 當前頁面
request 當前請求
session 整個會話
application 整個應用
------補充-----16_jsp的動作標籤
作用: 簡化<% %>的寫法常用的動作標籤
<jsp:forward />:請求轉發
<jsp:include />:頁面包含(動態包含)
區別
動態包含是兩個文件先編譯執行,然後把執行結果包含在一起
靜態包含是先將2個文件合併成爲一個java文件,然後在編譯,執行
動態包含只能包含jsp文件,靜態包含可以包含任何文件(html,txt)