JavaWeb:JSP

JavaWeb:JSP,JSP入門

1、JSP概述

1.1 什麼是JSP

JSP(Java Server Pages)是JavaWeb服務器端的動態資源。它與html頁面的作用是相同的,顯示數據和獲取數據。

這裡寫圖片描述

JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。

JSP這門技術的最大的特點在於,寫jsp就像在寫html,但它相比html而言,html隻能為用戶提供靜態數據,而Jsp技術允許在頁面中嵌套java代碼,為用戶提供動態數據。

為什麼JSP技術也是一種動態web資源的開發技術?

因為JSP技術允許在頁面中嵌套java代碼,以產生動態數據,並且web服務器在執行jsp時,web服務器會傳遞web開發相關的對象給jsp,jsp通過這些對象,可以與瀏覽器進行交互,所以jsp當然也是一種動態web資源開發技術。

強調一個概念:對現在的用戶而言,認為通過瀏覽器看到的東西都是網頁。但我們程序員心裡要清楚,開一個瀏覽器訪問網頁,這些網頁有可能是一個html頁面(即靜態web資源),也有可能是一個動態web資源(即servlet或jsp程序輸出的)。

1.2 JSP的組成

JSP = html + Java腳本(代碼片段) + JSP動態標簽

這裡寫圖片描述

JSP原理

Web服務器是如何調用並執行一個jsp頁面的?
Jsp頁面中的html排版標簽是如何被發送到客戶端的?
Jsp頁面中的java代碼服務器是如何執行的?
Web服務器在調用jsp時,會給jsp提供一些什麼java對象?

這裡寫圖片描述

JSP 的執行過程:
(1) 客戶端發出Request (請求);
(2) JSP Container 將JSP 翻譯成Servlet 的源代碼;
(3) 將產生的Servlet 的源代碼經過編譯後,加載到內存執行;
(4) 把結果Response (響應)發送至客戶端。

JSP和Servlet的執行效率相差不大,隻是第一次執行JSP頁面時需要進行編譯。

一般人都會以為JSP 的執行性能會和Servlet 相差很多,其實執行性能上的差別隻在第一次的執行。因為JSP 在執行第一次後,會被編譯成Servlet 的類文件,即為XXX.class,當再重復調用執行時,就直接執行第一次所產生的Servlet,而不用再重新把JSP編譯成Servlet。因此,除瞭第一次的編譯會花較久的時間之外,之後JSP 和Servlet 的執行速度就幾乎相同瞭。

在執行JSP 網頁時,通常可分為兩個時期:轉譯時期(Translation Time)和請求時期(Request Time) 。

JSP文件先要被服務器翻譯成Java文件(Servlet),在tomcat中翻譯後的Java文件在tomcat下的 work/Catalina /localhost 中相應名字的應用目錄裡。 編譯成Java(Servlet)文件 運行.class文件

2、JSP語法

2.1 JSP腳本

JSP腳本就是Java代碼片段,它分為三種:

<%…%>:Java語句; <%=…%>:Java表達式; <%!…%>:Java定義類成員;

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

JSP演示

<% // Java語句 String s1 = "hello jsp"; // 不會輸出到客戶端,而是在服務器端的控制臺打印 System.out.println(s1); %> 輸出變量:<%=s1 %>
輸出int類型常量:<%=100 %>
輸出String類型常量:<%="你好" %>

使用表達式輸出常量是很傻的一件事,因為可以直接使用html即可,下面是輸出上面的常量:
100
你好

2.2 內置對象out

out對象在JSP頁面中無需創建就可以使用,它的作用是用來向客戶端輸出

 

out.jsp

<% //向客戶端輸出 out.print("你好!"); %>

其中<%=…%>與out.print()功能是相同的!它們都是向客戶端輸出,例如:
<%=s1%>等同於<% out.print(s1); %>
<%=”hello”%>等同於<% out.print(“hello”); %>,也等同於直接在頁面中寫hello一樣。

2.3 多個<%…%>可以通用

在一個JSP中多個<%…%>是相通的。例如:

  

out.jsp

<% String s = "hello"; %> <% out.print(s); %>

循環打印表格:

  

表格

<% for(int i = 0; i < 10; i++) { %> <% } %>

序號 用戶名 密碼
<%=i+1 %> user<%=i %> <%=100 + 1 %>

3、JSP的原理

3.1 JSP是特殊的Servlet

JSP是一種特殊的Servlet,當JSP頁面首次被訪問時,容器(Tomcat)會先把JSP編譯成Servlet,然後再去執行Servlet。所以JSP其實就是一個Servlet!

這裡寫圖片描述

3.2 JSP真身存放目錄

JSP生成的Servlet存放在${CATALANA}/work目錄下,我經常開玩笑的說,它是JSP的“真身”。我們打開看看其中的內容,瞭解一下JSP的“真身”。

你會發現,在JSP中的靜態信息(例如等)在“真身”中都是使用out.write()完成打印!這些靜態信息都是作為字符串輸出給瞭客戶端。

JSP的整篇內容都會放到名為_jspService的方法中!你可能會說<@page>不在“真身”中,<%@page>我們明天再講。

a_jsp.java的_jspService()方法:

  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;

…
}

4、再論JSP腳本

JSP腳本一共三種形式:

<%…%>:內容會直接放到“真身”中 <%=…%>:內容會放到out.print()中,作為out.print()的參數 <%!…%>:內容會放到_jspService()方法之外,被類直接包含

前面已經講解瞭<%…%>和<%=…%>,但還沒有講解<%!…%>的作用!

現在我們已經知道瞭,JSP其實就是一個類,一個Servlet類。<%!…%>的作用是在類中添加方法或成員的,所以<%!…%>中的內容不會出現在_jspService()中

 <%!
        private String name;
        public String hello() {
            return "hello JSP!";
        }
    %>

5、JSP註釋

我們現在已經知道JSP是需要先編譯成.java,再編譯成.class的。其中<%– … –%>中的內容在JSP編譯成.java時會被忽略的,即JSP註釋。

也可以在JSP頁面中使用html註釋:,但這個註釋在JSP編譯成的.java中是存在的,它不會被忽略,而且會被發送到客戶端瀏覽器。但是在瀏覽器顯示服務器發送過來的html時,因為是html的註釋,所以瀏覽器是不會顯示它的

這裡寫圖片描述

發佈留言