1. 程式人生 > 其它 >[Javaweb 04] JSP原理分析及簡單瞭解

[Javaweb 04] JSP原理分析及簡單瞭解

JSP瞭解

Java Server Pages:java伺服器端頁面,用於動態web技術

早期沒有jsp,前端需要在servlet中用out.print("<h1>123123</h1>");一行一行展示(jsp就是將這個步驟封裝起來了)

jsp頁面可以嵌入java程式碼,為使用者提供動態資料


1. JSP原理

1. index.jsp檔案分析

  1. 檔案:和html一樣,沒有區別

  2. 伺服器內部: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()程式碼

  1. JSP的方法 :初始化,銷燬,jspservice

    public void _jspInit(){}
    public void _jspDestroy(){}
    public void _jspService(req, resp){
        請求判斷
        內建物件
        輸出頁面的程式碼
    }
    
  2. JSP的_jspService方法在java檔案中的原始碼:

    1. 判斷請求,

    2. 內建一些物件

      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
      
    3. 輸出頁面前的程式碼:

      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>");
      ...
      
  3. JSP就是一種裝飾器,用於把.jsp檔案轉換為.java檔案,再返回給伺服器中的tomcat,tomcat跑在JVM上。

XXX.js檔案到XXX_jsp.java`檔案時,

  1. java程式碼被原封不動的輸出
  2. 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. 跳轉到錯誤頁面的方法:

  1. 在web.xml中配置標籤:

    <error-page>
    	<error-code>404</error-code>
    	<location>${pageContext.request.contextPaht}/img/404.jsp</location>
    </error-page>
    
  2. 在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在外面

  1. include(在生成的java檔案中,直接將header.jsp 和 footer.jsp 頁面out.println()出來,

    所以名稱空間為同一個,三個頁面的程式碼中不能使用同樣的變數名

    <%@ include file = "common/header.jsp" %>
    自己的頁面主體
    <%@ include file = "common/footer.jsp" %>
    
  2. 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表示式

  1. 獲取資料,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 儲存資料.