[Javaweb 04] JSP原理分析及簡單瞭解
JSP瞭解
Java Server Pages:java伺服器端頁面,用於動態web技術
早期沒有jsp,前端需要在servlet中用out.print("<h1>123123</h1>");
一行一行展示(jsp就是將這個步驟封裝起來了)
jsp頁面可以嵌入java程式碼,為使用者提供動態資料
1. JSP原理
1. index.jsp檔案分析
-
檔案:和html一樣,沒有區別
-
伺服器內部:tomcat中有一個work目錄,可以發現jsp頁面轉換為了index_jsp.java檔案
IDEA的工作資料夾中找到Tomcat目錄 ,也有work目錄 IDEA的tomcat路徑:使用者/AppDate/JetBrains/tomcat/....
所以JSP檔案最後也會被轉換為一個jave類, 繼承了HttpJspBase類,這個類繼承HttpServlet類
所以JSP本質就是一個Servlet類
2. xxx_jsp.java分析:
.java檔案中有:方法、內建物件、內建物件的賦值、列印前端頁面的out.write()程式碼
-
JSP的方法 :初始化,銷燬,jspservice
public void _jspInit(){} public void _jspDestroy(){} public void _jspService(req, resp){ 請求判斷 內建物件 輸出頁面的程式碼 }
-
JSP的_jspService方法在java檔案中的原始碼:
-
判斷請求,
-
內建一些物件
final javax.servlet.jsp.PageContext pageContext;//頁面上下問 javax.servlet.http.HttpSession session = null;//Session final javax.servlet.ServletContext application;//ApplicationContext final javax.servlet.ServletConfig config;//配置 javax.servlet.jsp.JspWriter out = null;//輸出的out物件,(jspWriter) final java.lang.Object page = this;//page:代表當前頁 req resp
-
輸出頁面前的程式碼:
pageContext, application, config, session, out物件都可以直接使用!
response.setContentType("text/html");//設定前端頁面的展示方式 pageContext = _jspxFactory.getPageContext(this, request, response,//這幾個物件都可以直接使用!!!!!! null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; //介面輸出程式碼: out.write("<h1>.....</h1>"); ...
-
-
JSP就是一種裝飾器,用於把.jsp檔案轉換為.java檔案,再返回給伺服器中的tomcat,tomcat跑在JVM上。
XXX.js檔案到
XXX_jsp.java`檔案時,
- java程式碼被原封不動的輸出
- html程式碼被轉換為out.write("
....")輸出
2. JSP基本語法
1. jsp中寫java程式:
1. 作用域都在_jspService()方法中
-
jsp表示式:
<%--將程式結果輸出到客戶端 --%> <%= 變數或表示式%> <%=new java.util.Date()%> 或者: ${=i}//EL,express language表示式
-
jsp指令碼片段
<% 程式碼片段; %>
輸出呼叫out.println("");
-
巢狀:jsp介面直接理解為java檔案,下面的程式碼輸出4次hello
所有的程式碼都在_jspService()方法中,輸出
<% for(i=1;i<5;i++) { >% <h1> hello <%=i%> </h1> <% } >%
2. 作用域在xxx_jsp.java的類中:
此時,生成的.java檔案中,程式碼在類中,不在_jspService()方法中。
<%!
中的程式碼稱為JSP宣告。
<%!
static{
System.out.println("static code");
}
private int age = 10;
%>
3. 總結:
<%= 表示式/變數 %>
${= 變數}
<% java片段 %>
<%! 全域性變數宣告 %>
<!-- HTML的註釋在前端頁面(客戶端)中顯示 -->
<%-- JSP的註釋在前端頁面中不顯示(客戶端看不到) --%>
2. jsp指令集
1. 跳轉到錯誤頁面的方法:
-
在web.xml中配置標籤:
<error-page> <error-code>404</error-code> <location>${pageContext.request.contextPaht}/img/404.jsp</location> </error-page>
-
在jsp頁面中用指令表示:
<%@ page errorPage="${pageContext.request.contextPath}/img/404.jsp" %>
2. 其他指令:
匯入包
<%@ page import=java.util.Date %>
其他設定:都在page的空格後面
在頁面中新增公用的頭部和尾部:
web目錄通常放置如下:(common放置共同部分,error放置錯誤頁面)
web工程目錄說明:(一般情況,main中有三個檔案:java, resource, web),這裡web在外面
-
include(在生成的java檔案中,直接將header.jsp 和 footer.jsp 頁面out.println()出來,
所以名稱空間為同一個,三個頁面的程式碼中不能使用同樣的變數名
<%@ include file = "common/header.jsp" %> 自己的頁面主體 <%@ include file = "common/footer.jsp" %>
-
jsp標籤(生成的java檔案中,依然時引入兩個頁面,所以依然相當於三個頁面
分別有自己的名稱空間
<jsp:include page= "/common/header.jsp" /> 自己的頁面主體 <jsp:include page= "/common/footer.jsp" />
3. jsp 9大內建物件
jsp頁面在轉為.java檔案時的9個內建物件:
- pageContext, 傳入的兩個引數: req, resp
- Session
- Application就是 ServletContext
- config, ServletConfig
- out
- page = this
- Exception(之前沒有看到的)
存東西的四個物件:
pageContext, req, Session , Application
//存東西進去
pageContext.setAttribute("name1", "名字1");//一個頁面中有效
request.setAttribute("name2", "名字2");//一次請求中有效
session.setAttribute("name3", "名字3");//一次會話中有效
application.setAttribute("name4", "名字4");//從伺服器開啟到伺服器關閉都有效
//取東西出來(可以使用pageContext都取出)
String name1 = (String) pageContext.findAttribute("name1");
String name5 = (String) pageContext.findAttribute("name5");
可以使用pageContext取出的原因: 四個物件的作用域不同
作用域從低到高為:
pageContext ---- request ----session ----application, 如果找不到,
${name1}
: 沒有的值不顯示,
<%=name1%>
: 顯示為null, 所以多用EL表示式
轉發頁面:
pageContext.forward("/index.jsp");
//實際操作為:
req.getRequestDispatcy("/index.jsp").forward();
所以,轉發後的頁面可以取到request,session, application中的值
而如果沒有頁面轉發,則新頁面只能取到session和application的值!!!
3. JSP標籤,JSTL標籤,EL表示式
1. EL表示式
- 獲取資料,2. 執行運算 3. 獲取web開發的常用物件
檔案中不能使用EL表示式的解決:
注意:不能使用EL表示式,則是因為web的版本太低,可能為1.0, 需要設定jsp檔案頭的版本為4.0(直接去複製tomcat中的)或者,在檔案中新增<%@ page isELIgnored = "false" %>
2. JSP標籤
<jsp:forward page="index.jsp">
<jsp:param name="name1" value="value1"/>
</jsp:forward>
3. JSTL標籤
JSTL標籤是為了彌補html標籤的不足;標籤的功能和java程式碼一樣。(可以用標籤實現java程式碼)
使用必須引入頭,只需要瞭解核心標籤(去菜鳥教程學就可以)
eg: if的實現,<c:set 儲存資料.