JavaWeb基礎(chǔ)之JSP初探

JSP全稱是Java Server Pages东臀,它和servle技術(shù)一樣超升,都是SUN公司定義的一種用于開發(fā)動(dòng)態(tài)web資源的技術(shù)涣易,jsp文件相當(dāng)于在html頁面嵌套java代碼雏亚,即方便排版又為用戶提供了動(dòng)態(tài)數(shù)據(jù)摊沉。

1. 第一個(gè)JSP頁面

如下所示厂财,我們?cè)?.WebRoot目錄下面定義firstJSP.jsp并寫下內(nèi)容芋簿,布置到tomcat服務(wù)器后我們就可以像訪問靜態(tài)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>第一個(gè)jsp頁面</title>  
  </head>
  
  <body>
    <%
        //寫java代碼
        //獲取當(dāng)前時(shí)間
        SimpleDateFormat sdf = new SimpleDateFormat();
        String curDate = sdf.format(new Date());
        //輸出內(nèi)容到瀏覽器
        //response.getWriter().write("");
        out.write("當(dāng)前時(shí)間為:"+curDate);
     %>
  </body>
</html>

效果如下:

2.JSP頁面執(zhí)行過程

我們接下來看下JSP頁面是如何編繹嵌套在html里面的代碼璃饱,并向?yàn)g覽器輸出与斤。
首先,tomcat服務(wù)器在瀏覽器每一次訪問時(shí)就將jsp文件翻譯成java文件,并把java文件編繹成class字節(jié)碼文件撩穿,我們?cè)趖omcat的work對(duì)應(yīng)項(xiàng)目目錄下可以找到這兩個(gè)文件:

然后看一下firstJSP_jsp.java里面的內(nèi)容:

/*
 * 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>第一個(gè)jsp頁面</title>  \r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("    ");

        //寫java代碼
        //獲取當(dāng)前時(shí)間
        SimpleDateFormat sdf = new SimpleDateFormat();
        String curDate = sdf.format(new Date());
        //輸出內(nèi)容到瀏覽器
        //response.getWriter().write("");
        out.write("當(dāng)前時(shí)間為:"+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文件是一個(gè)HttpJspBase類磷支,查看API可知該類繼承于HttpServlet,到此為止我們基本上可以下一個(gè)結(jié)論:Jsp就是一個(gè)servlet程序
當(dāng)我們每次訪問JSP頁面時(shí)就會(huì)執(zhí)行類里面的_jspService方法食寡,可以看到這個(gè)方法包含了JSP頁面的所有內(nèi)容齐唆。并且放在一個(gè)try代碼塊里面。
同Servlet的生命周期類似冻河,該類的構(gòu)造方法和_jspInit()方法只在每一次訪問時(shí)執(zhí)行箍邮,在tomcat服務(wù)器重新布署時(shí)執(zhí)行_jspDestroy()方法。

將JSP頁面的執(zhí)行過程用流程圖的形式總結(jié)如下:

3.JSP語法

3.1 Jsp模板

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

3.2 Jsp表達(dá)式

語法:<%=變量或表達(dá)式%>
舉例:
作用: 向?yàn)g覽器輸出變量的值或表達(dá)式計(jì)算的結(jié)果
注意:
1)表達(dá)式的原理就是翻譯成out.print(“變量” );通過該方法向?yàn)g覽器寫出內(nèi)容
2)表達(dá)式后面不需要帶分號(hào)結(jié)束叨叙。

3.3 Jsp的腳本

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

3.4 Jsp的聲明

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

3.5 Jsp的注釋

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

4 Jsp的三大指令

4.1 include指令

作用: 在當(dāng)前頁面用于包含其他頁面
語法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的頁面(header.jsp)的內(nèi)容翻譯到包含頁面(index.jsp)中,合并成翻譯成一個(gè)java源文件钮呀,再編譯運(yùn)行=0啊!爽醋,這種包含叫靜態(tài)包含(源碼包含)
2)如果使用靜態(tài)包含蚁署,被包含頁面中不需要出現(xiàn)全局的html標(biāo)簽了!B焖摹9飧辍(如html、head遂赠、 body)

4.2 page指令

作用: 告訴tomcat服務(wù)器如何翻譯jsp文件
語法:
<%@ page
language="java" --告訴服務(wù)器使用什么動(dòng)態(tài)語言來翻譯jsp文件
import="java.util.*" --告訴服務(wù)器java文件使用什么包,導(dǎo)入包久妆,多個(gè)包之間用逗號(hào)分割
pageEncoding="utf-8" --告訴服務(wù)器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務(wù)器發(fā)送瀏覽器的數(shù)據(jù)類型和內(nèi)容編碼
注意:在開發(fā)工具中,以后只需要設(shè)置pageEncoding即可解決中文亂碼問題
errorPage: 指定當(dāng)前jsp頁面的錯(cuò)誤處理頁面跷睦。
isErorrPage: 指定當(dāng)前頁面是否為錯(cuò)誤處理頁面筷弦。false,不是錯(cuò)誤處理頁面抑诸,則不能使用 exception內(nèi)置對(duì)象烂琴;true,是錯(cuò)誤處理頁面哼鬓,可以使用exception內(nèi)置對(duì)象监右。
配置全局的錯(cuò)誤處理頁面可在web.xml添加如下內(nèi)容:

  <!-- 全局錯(cuò)誤處理頁面配置 -->
  <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內(nèi)置對(duì)象;true,可以使用session內(nèi)置對(duì)象称簿。
buffer: jsp頁面的緩存區(qū)大小扣癣。
isELIgnore: 是否忽略EL表達(dá)式。
%>

4.3 taglib指令

Taglib指令用于在JSP頁面中導(dǎo)入標(biāo)簽庫,后面再看

5.JSP基本組成語法實(shí)例

header.jsp:用于測(cè)試include指令

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

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表達(dá)式  -->
    <%
        //變量
        String name = "acamy";
        int a = 10;
        int b =20;
     %>
    <%=name %>  
    <br/>
    <%=(a-b) %>  
    <hr/>
    <!-- jsp腳本  -->
    <%
        //生成隨機(jī)數(shù)
        Random ran = new Random();
        float num = ran.nextFloat();
     %>
     隨機(jī)小數(shù):<%=num %>
     <hr/>
     <!-- 穿插html代碼 -->
     <%
        for(int i=1;i<=6;i++){  
      %>
        <h<%=i %>>標(biāo)題<%=i %></h<%=i %>>
     <%
      }
      %>
      <hr/>
      <!-- 練習(xí): 使用腳本和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聲明中不能重復(fù)定義翻譯好的一些方法
        public void _jspInit(){
        
        }
        */
       %>
       <!-- html注釋 -->
      <%-- <jsp:forward page="/01.hello.jsp"></jsp:forward> --%>
       <%-- jsp注釋 --%>
       
     
  </body>
</html>

效果如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末憨降,一起剝皮案震驚了整個(gè)濱河市父虑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌授药,老刑警劉巖士嚎,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異悔叽,居然都是意外死亡莱衩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門娇澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笨蚁,“玉大人,你說我怎么就攤上這事趟庄±ㄏ福” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵戚啥,是天一觀的道長奋单。 經(jīng)常有香客問我,道長猫十,這世上最難降的妖魔是什么辱匿? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮炫彩,結(jié)果婚禮上匾七,老公的妹妹穿的比我還像新娘。我一直安慰自己江兢,他們只是感情好昨忆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杉允,像睡著了一般邑贴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叔磷,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天拢驾,我揣著相機(jī)與錄音,去河邊找鬼改基。 笑死繁疤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稠腊,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躁染,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了架忌?” 一聲冷哼從身側(cè)響起吞彤,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叹放,沒想到半個(gè)月后饰恕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井仰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年埋嵌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕档。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莉恼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出速那,到底是詐尸還是另有隱情俐银,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布端仰,位于F島的核電站捶惜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荔烧。R本人自食惡果不足惜吱七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹤竭。 院中可真熱鬧踊餐,春花似錦、人聲如沸臀稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧寺。三九已至窜管,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稚机,已是汗流浹背幕帆。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赖条,地道東北人失乾。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓常熙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仗扬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子症概,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.什么是JSP (1)jsp全稱是Java Server Pages蕾额,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,650評(píng)論 5 99
  • 轉(zhuǎn)自陳明乾的博客早芭,可能有一定更新。 轉(zhuǎn)原文聲明:原創(chuàng)作品诅蝶,允許轉(zhuǎn)載退个,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、...
    C86guli閱讀 4,684評(píng)論 6 72
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法调炬,類相關(guān)的語法语盈,內(nèi)部類的語法,繼承相關(guān)的語法缰泡,異常的語法刀荒,線程的語...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對(duì)象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對(duì)象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,136評(píng)論 1 18
  • 親和我一起依窗來聽雨關(guān)注我個(gè)人公眾微信號(hào)326634322xiayufei 原創(chuàng) 文 夏瑜斐 習(xí)慣性地拿起筆,就像...
    夏瑜斐的小木屋閱讀 297評(píng)論 0 1