J2EE基礎(JSP 篇)
1.程式員在開發過程中發現 servlet 開發介面非常的不方便,於是誕生了 jsp
2.一個公式:
jsp = html + java + jsp 標籤 + js + css
3.jsp + java類(service Javabean)+ servlet 就會構成 mvc 開發模式
4.jsp 是執行在伺服器端的
網路拓撲:
5.jsp 的基礎是 servlet (相當於是對 servlet 的包裝)
二、第一個jsp 程式
示例程式碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Showtime</title> </head> <body> <% out.println("hello,world"); %> </body> </html>
三、伺服器如何處理 jsp
1.那麼伺服器接收到對jsp 檔案的請求以後是怎麼處理的呢?
如果是第一次訪問該jsp 檔案 web 伺服器收到請求以後,會先將這個 jsp 檔案翻譯成一個 servlet檔案,然後在將其編譯成 class 檔案,然後再把 class 檔案載入到記憶體,但是如果是第二次以後就是直接訪問記憶體中的class 檔案了,所以 jsp 是單例(當然,如果某個 jsp 檔案被修改了再訪問就相當於是第一次)
2. jsp 頁面的報錯實際上會轉化成 servlet 的報錯
因此,我們除錯的時候,需要找到那個他轉化好的servlet 檔案才能方便的進行錯誤定位
3.為什麼我們在 jsp 中能直接使用 out
因為 out 是 jsp 的一個內建物件,也就是說,雖然在 jsp 頁面沒有定義,但是在當 jsp 轉化成了 servlet 的時候,在 servlet 中給我們預設定義好了
4.同一個頁面的java 片段中的變數可以互相使用
示例程式碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Showtime</title> </head> <body> <% out.println("hello,world"); %> <% int i = 99; int j = i+1; %> <% out.println("j = " +j); %> </body> </html>
結果:
j = 100
為什麼呢?
要找到原因我們還是要看一下 servlet 檔案
示例程式碼:
package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class showtime_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html;charset=UTF-8"); 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("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("<title>Showtime</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.println("hello,world"); out.write("\r\n"); out.write("\r\n"); int i = 99;//注意這裡 int j = i+1; out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.println("j = " +j);//還有這裡 out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
四、jsp 語法
1.指令元素
用於從 jsp 傳送一個資訊到容器,比如設定全域性變數,設定編碼,引入包等
1.page 指令
page 中的常用屬性:
(1) language = 設定語言
(2) import 引入包
(3) session = true/false 是否在 jsp 頁面獲取 session 物件
(4) errorpage = “相對頁面” 當 jsp 頁面出錯時 跳轉到指定的 jsp 頁面(以 /開頭時 表示相對 web 根目錄,如果不以 / 開頭則表示相對當前目錄)
(5)contentType = “text/html;charset=utf-8” 指定網頁以什麼方式顯示
(6)pageEncoding = “utf-8” 指定 servlet 引擎以什麼方式翻譯 jsp -> servlet ,並指定網頁的顯示方式
2.include 指令
<% @ include file = "filename"%>
該指令用於引入一個 jsp 檔案,並能將 兩個 jsp 檔案翻譯成一個 servlet 檔案,所以也被稱為靜態引入
注意:
被引入的 jsp 頁面只需保留 page 指令即可,其他的 <body>
等 <html>
標籤需要刪除
3.taglib 指令
這個指令允許在 jsp 頁面使用自定義的標籤
2.指令碼元素
指令碼元素就是 java 片段
1.scriplet
<% java 程式碼 %>
比如:
<% int i = 90; %>
注意:
這個裡面定義的是區域性變數,如果想定義成為servlet 的成員變數的話,要使用下面介紹的 declareation
2.表示式
<%=java 表示式 %>
例如:
<%=rs.getString(1) %>
注意:
表示式是沒有分號的,帶了分號的就是語句了
3.delaeration 宣告
<%! 變數宣告 %> <%! 函式宣告 %>
比如:
<%! int i = 900; %>
再比如:
<%! int jisuan(int num){ int result = 0; for(int i =0;i<num;i++){ result = result+i; } } %>
注意:
定義函式的時候,不要使用 public xxx ,因為轉化成 servlet 以後就會在函式內部再建立函式,然而這個是不合規範的
3.動作元素
這個實際上用的不是特別的多
就說幾個:
1. 頁面轉發
<jsp:forward>
實現頁面的轉發
補充:tomcat 的保護機制
我們一般不把jsp 頁面都放在專案的 web 根路徑下,因為這樣所有的jsp 頁面都能被訪問到,這是非常危險的,解決辦法就是將 jsp 頁面放在 WEB-INF 目錄(就類似於 servlet 檔案放在 src 下面一樣),然後通過一個統一的入口訪問,實現的方式就是通過轉發、
2. 頁面包含
<jsp:include>`
這個頁面的包含是動態包含,和上面講過的靜態包含不同的是,動態包含會生成兩個 servlet 檔案,並且包含過程中沒有去除 <body>
等標籤的要求
4.jsp 的註釋
1.HTML 註釋風格
<!-- 註釋的內容 -->
2.jsp 註釋風格
<%-- -->
5.jsp 九大內建物件
1. out 向客戶端輸出資料位元組流
對應這 JspWriter
out.pritlen()
2.request 接受客戶端的http請求
存放的資料在一次 request 請求中有效,對應著 servlet 中的 HttpServletRequest 類
3.response 封裝 jsp 產生的迴應
servlet 中的 HttpServletResponse 類
4.session 用於保護使用者的資訊,跟蹤使用者的行為
存放的資料在一次回話中有效,對應著 HttpSession 這個類
5.application 多個使用者共享該物件,可用作計數器
存放的資料在整個 web 應用執行期間有效
6.pageContext 代表jsp 頁面的上下文
放在 pageContext 的屬性只在本頁面生效,對應 PageContext
示例程式碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Showtime</title> </head> <body> <% pageContext.setAttribute("abc","xxx"); %> <% String val = (String) pageContext.getAttribute("abc"); out.println(val); %> </body> </html>
7.exception 代表執行時的一個異常
使用較少,對應著 Exception
8.page 代表 jsp 這個例項本身
相當於 servlet 的 this 使用較少
9.config 代表 jsp 對應的 servlet 的配置
對應著 ServletConfig