1. 程式人生 > >JAVA網際網路架構學習之jsp基礎

JAVA網際網路架構學習之jsp基礎

1.JSP

[1] 簡介
> HTML
- HTML擅長顯示一個靜態的網頁,但是不能呼叫Java程式。
> Servlet
- Servlet擅長呼叫Java程式和後臺進行互動,但是它不擅長顯示一個完整的HTML頁面。
> 我們希望建立一個新的技術 HTML + Servlet 強強聯合
> JSP全稱Java Server Pages,顧名思義就是執行中java伺服器中頁面,也就是在我們JavaWeb中的動態頁面,其本質就是一個Servlet。
> JSP不能脫離伺服器執行。
> JSP = HTML + JAVA程式碼
> 平常開發中Servlet負責處理請求,JSP負責顯示頁面


注意:對於頁面的編碼問題,可以通過在Eclipse.ini檔案的最後新增-Dfile.encoding=utf-8來解決!
 
 
[2] 執行原理
> JSP的本質就是一個Servlet
> JSP的執行之前會先被Tomcat伺服器翻譯為.java檔案,然後在將.java文字編譯為.class檔案
而我們在訪問jsp時,處理請求的就是那個翻譯後的類。

jsp --翻譯--> java --編譯--> class

> 我們需要去到映象伺服器中去尋找結果。
> 實際上最終翻譯為的java檔案就是一個Servlet。
1.繼承HttpJspBase這個類,而該類又繼承了HttpServlet
2.在總的web.xml檔案中,同樣發現了jsp相關的配置
由此證明jsp確實是一個Servlet。
 
[3] 基本語法
> 學習jsp的基本語法主要就是學習伺服器是如何將一個JSP檔案翻譯為一個java檔案

> 模板元素
就是JSP中html程式碼
模板元素的內容最終會作為out.write()的引數,最終在頁面中輸出
在HTML頁面中怎麼寫網頁,在JSP中就怎麼寫

> 指令碼片段
<% %>
- 在指令碼片段中可以直接來編寫Java程式碼
- 指令碼片段中的程式碼會原封不動的複製到java檔案的service方法中的指定的位j置
- 在service方法中可以寫什麼在指令碼片段中就可以寫什麼
- 在jsp頁面可以有多個指令碼片段,但是多個指令碼片段之間要保證結構完整

> 表示式
<%= %>
- jsp表示式用來向頁面中輸出一個物件
- jsp表示式中的內容最終會作為out.print()的引數輸出到頁面中
- out.print()方法能接收什麼樣的引數,表示式中就可以寫什麼
而out.print()可以接收任意型別的引數,所以表示式中可以傳任意物件。


> 註釋
<%-- --%>
- jsp註釋中的內容不會被翻譯到jsp對應java檔案中

- 在JSP中可以使用三種註釋
- html註釋           java註釋                 jsp註釋
 <!-- 片段 -->      //java註釋!             <%-- --%>
 
- 三種註釋的可見範圍

jsp原始碼 java原始檔 網頁的原始碼
html註釋 可見 可見 可見
java註釋 可見 可見 不可見
jsp註釋 可見 不可見 不可見



> 宣告
<%! %>
- JSP宣告中的內容會直接寫到jsp對應的java類中。
- 在類中可以寫什麼在宣告就可以寫什麼。可以定義屬性,可以定義方法。。
- 一般情況我們不會在jsp對應的類中寫東西,所以宣告基本不用,知道就行。

[4] JSP指令
> 格式:<%@指令名 屬性名1=”屬性值1” 屬性名2=”屬性值2”  %>

> page指令
- page 指令主要是告訴jsp引擎如何解析jsp檔案。
- 可能會用到的屬性
- import 用來導包
- language指定jsp檔案被翻譯為哪種語言
該屬性只有一個值就是 java
- contentType 指定當前網頁的編碼
response.setContentType("text/html;charset=utf-8");
- 給瀏覽器看的
- pageEncoding 指定當前頁面的編碼,jsp引擎會根據該編碼解析jsp檔案
- 給伺服器看的
- errorPage 指定頁面出現錯誤以後轉發到的頁面,這個屬性的地址不加專案名。
- isErrorPage 當前頁面是否為一個錯誤頁面,如果為true則可以在頁面中使用exception物件。


- 基本不使用的屬性
- autoFlush 是否自動重新整理快取,預設值是true,一般不去修改這個屬性
- buffer 快取的大小 預設8kb 一般不修改
- extends 指定jsp對應的java類所要基礎的父類。根本不用
- info 設定當前jsp的資訊,沒用
- isELIgnored 是否自動忽略EL表示式,預設為false,不忽略,一般不修改
- session 是否可以直接使用session物件,預設值為true,一般不修改


> include指令
- <%@ include file="" %>
- 靜態包含指令
- include指令主要用來將其他網頁包含進當前JSP頁面
- 他會將被包含頁面原封不動複製到目標頁面的指定位置。
- 它只會翻譯目標頁面,而不會翻譯被包含頁面
- 比如 1.jsp include 2.jsp
相當於將2.jsp複製進1.jsp的指定位置
只會翻譯1.jsp,而不會翻譯2.jsp


[5] JSP動作標籤
> JSP動作標籤最終都會被翻譯為一套java程式碼,在程式中執行。

<jsp:標籤名 屬性名="屬性值"></jsp:標籤名>

<jsp:forward page="target.jsp">
<jsp:param value="paramValue" name="paramName"/>
</jsp:forward>
> jsp:forward標籤作用就是轉發請求!
> 如果標籤中沒有子標籤,那麼標籤體不能出現任何內容
> 可以標籤中使用jsp:param標籤向目標頁面傳遞請求引數。

<jsp:include page="target.jsp"></jsp:include>
> jsp:include 動態包含
> 動態包含會為所有網頁都生成一個java檔案
> 動態包含並不是直接將被包含頁面直接複製進目標頁面,而是通過如下程式碼,將頁面包含進當前頁
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/include/2.jsp", out, false);

[6] 隱含物件
> 在JSP中一共有9個隱含物件,這個9個物件我可以在JSP中直接使用。
> 因為在service方法已經對這個九個隱含物件進行宣告及賦值,所以可以在JSP中直接使用。
- pageContext
型別:PageContext
代表:當前頁面的上下文
作用:可以獲取到頁面中的其他隱含物件,同時它還是一個域物件。

- request
型別:HttpServletRequest
代表:請求
作用:可以獲取使用者傳送的請求資訊,它也是一個域物件。

- session
型別:HttpSession
代表:當前會話
作用:可以作為域物件,用來共享資料。

- application
型別:ServletContext
代表:代表整個WEB應用
作用:是JavaWeb中最大的域物件。

- response
型別:HttpServletResponse
代表:響應
作用:向瀏覽器傳送響應資訊

- out
型別:JspWriter
代表:輸出流
作用:可以向頁面輸出內容

- config
型別:ServletConfig
代表:當前JSP的配置資訊
作用:可以獲取到Servlet標籤中初始化引數

- page
型別:Object 在service方法中有如下程式碼 Object page = this;
代表:代表當前JSP的物件
作用:

- exception
型別:Throwable
代表:異常資訊
作用:獲取頁面中的異常



[6] JSP與Servlet分工
> JSP本質就是一個Servlet!!!
> 曾經在Model1這個年代,在我們的專案中已經看不見Servlet,JSP已經完全代替了Servlet。
> JSP擅長顯示一個頁面,不擅長編寫Java程式碼
> Servlet擅長編寫java程式碼,而不擅長顯示頁面
> 我們使用Servlet處理程式,而使用JSP顯示頁面。
> 將servlet處理後的結果放入進域中,然後交給JSP顯示。

>練習:
通過Servlet去資料庫中查詢一組學生列表,然後交給JSP顯示列表。
1.使用者先要訪問ListServlet
2.ListServlet去資料庫查詢學生列表
- 直接在Servlet建立一個List
3.將列表放入域物件中
4.通過JSP顯示列表

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

今日所做
1.將昨日的登入註冊頁面中所有的statement替換為了preparestatement及相關程式碼; 2.對"jsp是一個servlet"有了更深刻的瞭解; 3.學會了將jsp生成的java檔案在根目錄中找出並檢視相關程式碼,通過檢視jsp編譯後的結果,瞭解相關程式碼在java檔案中的表現方式; 4.將昨日的註冊登入介面改為了jsp-servlet連用
今日問題

jsp中既可以寫html也可以寫java,並呼叫servlet,這就產生了新的疑惑,在寫程式碼有時會考慮,這段是放進jsp中還是放進servlet中好,

這段是用js寫好還是用java寫好,對於分層解耦尚不入門;在寫完註冊登入頁面後,我試圖讓登入成功頁面自動重定向至首頁,在首頁中顯

示另一個表的資料項,但登陸成功頁面沒有form表單,無法通過post方式傳至servlet,我又檢視讓登入頁面轉發至servlet,並在servlet

的service方法重定向至主頁,但也未成功,後來查閱到傳參必須使用轉發,如下

jsp → servlet → request.setAttribute → foward → jsp

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

身體是學習的本錢,尼采說過,每一段不努力的時光,都是對生命的辜負。今日學習了jsp,對於jsp本身有些疑惑,這個東西非常不方便,對於前端和後臺分離似乎也不太好,But anything existed is reasonable,jsp已存在至今並仍在活躍就一定有它存在的道理,如今的技術也一定在不停的將其更新,事非經過不知難,書到用時方恨少,學習不是為了以後用不用,我們人生中學了很多無用的知識,但是他們充實了自己的知識庫,武裝了自己的思想,讓自己在各種場合逐漸變得遊刃有餘,學習不是為了使用而學習,而是為了有朝一日需要它的時候不會手足無措,可以沉著應對。