Jsp技術詳解

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,默認值是true
buffer:設置內置對象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)


17_Jsp原理圖


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章