JavaWeb基礎之JSP初探

JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用于開發動態web資源的技術,jsp文件相當于在html頁面嵌套java代碼,即方便排版又為用戶提供了動態數據。

1. 第一個JSP頁面

如下所示,我們在..WebRoot目錄下面定義firstJSP.jsp并寫下內容,布置到tomcat服務器后我們就可以像訪問靜態html頁面一樣去訪問該頁面。

<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>第一個jsp頁面</title>  
  </head>
  
  <body>
    <%
        //寫java代碼
        //獲取當前時間
        SimpleDateFormat sdf = new SimpleDateFormat();
        String curDate = sdf.format(new Date());
        //輸出內容到瀏覽器
        //response.getWriter().write("");
        out.write("當前時間為:"+curDate);
     %>
  </body>
</html>

效果如下:

2.JSP頁面執行過程

我們接下來看下JSP頁面是如何編繹嵌套在html里面的代碼,并向瀏覽器輸出。
首先,tomcat服務器在瀏覽器每一次訪問時就將jsp文件翻譯成java文件,并把java文件編繹成class字節碼文件,我們在tomcat的work對應項目目錄下可以找到這兩個文件:

然后看一下firstJSP_jsp.java里面的內容:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.57
 * Generated at: 2017-06-07 11:33:50 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import java.text.*;

public final class firstJSP_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 javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head> \r\n");
      out.write("    <title>第一個jsp頁面</title>  \r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("    ");

        //寫java代碼
        //獲取當前時間
        SimpleDateFormat sdf = new SimpleDateFormat();
        String curDate = sdf.format(new Date());
        //輸出內容到瀏覽器
        //response.getWriter().write("");
        out.write("當前時間為:"+curDate);
     
      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);
    }
  }
}

通過上面的源碼知道翻譯成的java文件是一個HttpJspBase類,查看API可知該類繼承于HttpServlet,到此為止我們基本上可以下一個結論:Jsp就是一個servlet程序
當我們每次訪問JSP頁面時就會執行類里面的_jspService方法,可以看到這個方法包含了JSP頁面的所有內容。并且放在一個try代碼塊里面。
同Servlet的生命周期類似,該類的構造方法和_jspInit()方法只在每一次訪問時執行,在tomcat服務器重新布署時執行_jspDestroy()方法。

將JSP頁面的執行過程用流程圖的形式總結如下:

3.JSP語法

3.1 Jsp模板

jsp頁面中的html代碼就是jsp的模板

3.2 Jsp表達式

語法:<%=變量或表達式%>
舉例:
作用: 向瀏覽器輸出變量的值或表達式計算的結果
注意:
1)表達式的原理就是翻譯成out.print(“變量” );通過該方法向瀏覽器寫出內容
2)表達式后面不需要帶分號結束。

3.3 Jsp的腳本

語法:<%java代碼 %>
作用: 執行java代碼
注意:
1)原理把腳本中java代碼原封不動拷貝到_jspService方法中執行。

3.4 Jsp的聲明

語法:<%! 變量或方法 %>
作用: 聲明jsp的變量或方法
注意:
1)變量翻譯成成員變量,方法翻譯成成員方法。

3.5 Jsp的注釋

語法: <%!-- jsp注釋 --%>
注意;
1)html的注釋會被翻譯和執行。而jsp的注釋不能被翻譯和執行。

4 Jsp的三大指令

4.1 include指令

作用: 在當前頁面用于包含其他頁面
語法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,合并成翻譯成一個java源文件,再編譯運行!!,這種包含叫靜態包含(源碼包含)
2)如果使用靜態包含,被包含頁面中不需要出現全局的html標簽了!?。。ㄈ鏷tml、head、 body)

4.2 page指令

作用: 告訴tomcat服務器如何翻譯jsp文件
語法:
<%@ page
language="java" --告訴服務器使用什么動態語言來翻譯jsp文件
import="java.util.*" --告訴服務器java文件使用什么包,導入包,多個包之間用逗號分割
pageEncoding="utf-8" --告訴服務器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務器發送瀏覽器的數據類型和內容編碼
注意:在開發工具中,以后只需要設置pageEncoding即可解決中文亂碼問題
errorPage: 指定當前jsp頁面的錯誤處理頁面。
isErorrPage: 指定當前頁面是否為錯誤處理頁面。false,不是錯誤處理頁面,則不能使用 exception內置對象;true,是錯誤處理頁面,可以使用exception內置對象。
配置全局的錯誤處理頁面可在web.xml添加如下內容:

  <!-- 全局錯誤處理頁面配置 -->
  <error-page>
    <error-code>500</error-code>
    <location>/common/500.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/common/404.html</location>
  </error-page>

session: 是否開啟session功能。false,不能用session內置對象;true,可以使用session內置對象。
buffer: jsp頁面的緩存區大小。
isELIgnore: 是否忽略EL表達式。
%>

4.3 taglib指令

Taglib指令用于在JSP頁面中導入標簽庫,后面再看

5.JSP基本組成語法實例

header.jsp:用于測試include指令

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
   頭部頁面的內容

script.jsp:

<!-- page指令  -->
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>Jsp語法</title>  
  </head>
  
  <body>
    <!-- include指令  -->
    <%@include file="common/header.jsp"%>
    
    <!-- jsp表達式  -->
    <%
        //變量
        String name = "acamy";
        int a = 10;
        int b =20;
     %>
    <%=name %>  
    <br/>
    <%=(a-b) %>  
    <hr/>
    <!-- jsp腳本  -->
    <%
        //生成隨機數
        Random ran = new Random();
        float num = ran.nextFloat();
     %>
     隨機小數:<%=num %>
     <hr/>
     <!-- 穿插html代碼 -->
     <%
        for(int i=1;i<=6;i++){  
      %>
        <h<%=i %>>標題<%=i %></h<%=i %>>
     <%
      }
      %>
      <hr/>
      <!-- 練習: 使用腳本和html代碼顯示99乘法表 -->
     <%
        for(int i=1;i<=9;i++){//行
            for(int j=1;j<=i;j++){//公式
     %>         
            <%=i %> x <%=j %>=<%=(i*j) %> 
        <%          
            }
        %>
           <br/>
        <%  
        }
      %>
      <%
        String age = "20";
        
        /* 腳本中不能聲明方法
        public String getAge(){
            return age;
        }
        */
       %>
      
      
      <!-- jsp聲明 -->
      <%!
       //變量
        String name = "jacky";
        
        public String getName(){
            return name;
        }
        
        /*jsp聲明中不能重復定義翻譯好的一些方法
        public void _jspInit(){
        
        }
        */
       %>
       <!-- html注釋 -->
      <%-- <jsp:forward page="/01.hello.jsp"></jsp:forward> --%>
       <%-- jsp注釋 --%>
       
     
  </body>
</html>

效果如下:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術一樣都是sun公司定...
    yjaal閱讀 3,675評論 5 99
  • 轉自陳明乾的博客,可能有一定更新。 轉原文聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、...
    C86guli閱讀 4,713評論 6 72
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,717評論 18 399
  • 1.學習內容 JSP技術入門和常用指令 JSP的內置對象&標簽介紹 EL表達式&EL的內置對象 2.JSP技術入門...
    WendyVIV閱讀 2,159評論 1 18
  • 親和我一起依窗來聽雨關注我個人公眾微信號326634322xiayufei 原創 文 夏瑜斐 習慣性地拿起筆,就像...
    夏瑜斐的小木屋閱讀 299評論 0 1