成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JSP第一篇【JSP介紹、工作原理、生命周期、語(yǔ)法、指令、行為】

cyqian / 1032人閱讀

摘要:現(xiàn)在先知道一下即可生命周期也是,運(yùn)行時(shí)只有一個(gè)實(shí)例,初始化和銷毀時(shí)也會(huì)調(diào)用的和方法。指令就是用來(lái)指明頁(yè)面內(nèi)使用標(biāo)簽庫(kù)技術(shù)。我個(gè)人喜歡把這些內(nèi)置標(biāo)簽稱之為行為。行為上面已經(jīng)提及到了,指令是靜態(tài)包含,行為是動(dòng)態(tài)包含。

什么是JSP

JSP全名為Java Server Pages,java服務(wù)器頁(yè)面。JSP是一種基于文本的程序,其特點(diǎn)就是HTML和Java代碼共同存在!

為什么需要JSP

JSP是為了簡(jiǎn)化Servlet的工作出現(xiàn)的替代品,Servlet輸出HTML非常困難,JSP就是替代Servlet輸出HTML的。

簡(jiǎn)單使用一下JSP

在idea下生成一個(gè)JSP,我們來(lái)看一下JSP長(zhǎng)什么樣子

        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        
        
            簡(jiǎn)單使用JSP
        
        
        
        
        

看起來(lái)就像一個(gè)HTML頁(yè)面,前面也說(shuō)了:JSP的特點(diǎn)就是HTML和Java代碼共同存在

我們向?yàn)g覽器輸出一句HelloWorld,至于<%%>這個(gè)東西,我先不解釋!

        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        
        
            簡(jiǎn)單使用JSP
        
        
        <%
            String s = "HelloWorld";
            out.println(s);
        %>
        
        


JSP的工作原理

在Tomcat博客中我提到過(guò):Tomcat訪問(wèn)任何的資源都是在訪問(wèn)Servlet!,當(dāng)然了,JSP也不例外!JSP本身就是一種Servlet。為什么我說(shuō)JSP本身就是一種Servlet呢?其實(shí)JSP在第一次被訪問(wèn)的時(shí)候會(huì)被編譯為HttpJspPage類(該類是HttpServlet的一個(gè)子類)

剛才我簡(jiǎn)單使用了一下JSP,它被編譯成了這么一個(gè)Servlet:


package org.apache.jsp;

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

public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.List 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 HttpServletRequest request, final HttpServletResponse response)
        throws java.io.IOException, ServletException {

    final PageContext pageContext;
    HttpSession session = null;
    final ServletContext application;
    final ServletConfig config;
    JspWriter out = null;
    final Object page = this;
    JspWriter _jspx_out = null;
    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("
");
      out.write("
");
      out.write("
");
      out.write("
");
      out.write("    簡(jiǎn)單使用JSP
");
      out.write("
");
      out.write("
");

    String s = "HelloWorda";
    out.println(s);

      out.write("
");
      out.write("
");
      out.write("
");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

編譯過(guò)程是這樣子的:瀏覽器第一次請(qǐng)求1.jsp時(shí),Tomcat會(huì)將1.jsp轉(zhuǎn)化成1_jsp.java這么一個(gè)類,并將該文件編譯成class文件。編譯完畢后再運(yùn)行class文件來(lái)響應(yīng)瀏覽器的請(qǐng)求。

以后訪問(wèn)1.jsp就不再重新編譯jsp文件了,直接調(diào)用class文件來(lái)響應(yīng)瀏覽器。當(dāng)然了,如果Tomcat檢測(cè)到JSP頁(yè)面改動(dòng)了的話,會(huì)重新編譯的。

既然JSP是一個(gè)Servlet,那JSP頁(yè)面中的HTML排版標(biāo)簽是怎么樣被發(fā)送到瀏覽器的?我們來(lái)看下上面1_jsp.java的源碼就知道了。原來(lái)就是用write()出去的罷了。說(shuō)到底,JSP就是封裝了Servlet的java程序罷了。

      out.write("
");
      out.write("
");
      out.write("
");
      out.write("
");
      out.write("    簡(jiǎn)單使用JSP
");
      out.write("
");
      out.write("
");

有人可能也會(huì)問(wèn):JSP頁(yè)面的代碼服務(wù)器是怎么執(zhí)行的?再看回1_jsp.java文件,java代碼就直接在類中的service()中。

    String s = "HelloWorda";
    out.println(s);

JSP比Servlet更方便更簡(jiǎn)單的一個(gè)重要原因就是:內(nèi)置了9個(gè)對(duì)象!內(nèi)置對(duì)象有:out、session、response、request、config、page、application、pageContext、exception,這幾個(gè)內(nèi)置對(duì)象不在這里講。現(xiàn)在先知道一下即可!

JSP生命周期

JSP也是Servlet,運(yùn)行時(shí)只有一個(gè)實(shí)例,JSP初始化和銷毀時(shí)也會(huì)調(diào)用Servlet的init()和destroy()方法。另外,JSP還有自己初始化和銷毀的方法

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

  public void _jspDestroy() {
  }
JSP的語(yǔ)法

JSP代碼可以分為兩部分:

模板數(shù)據(jù):就是HTML代碼

元素:JSP頁(yè)面中的java代碼、JSP指令、JSP標(biāo)簽

JSP腳本

JSP的腳本就是JSP頁(yè)面中的java代碼,也叫做scriptlet。JSP的腳本必須使用<%%>括起來(lái),不然會(huì)被當(dāng)成是模板數(shù)據(jù)的!

JSP腳本有三種方式:

<%%>【定義局部變量,編寫(xiě)語(yǔ)句】

<%!%>【定義類或方法,但是沒(méi)人這樣用!

<%=%>(也稱之為表達(dá)式輸出)【輸出各種類型的變量,int、double、String、Object等】

如果過(guò)多地使用<%%>會(huì)導(dǎo)致代碼混亂,JSP還提供了一種scriptlet標(biāo)簽,使用此標(biāo)簽和<%%>有相同的功能,只不過(guò)它更美觀了一些

    
    
        String s = "HelloWorld";
        out.println(s);
    
    

JSP注釋
    
    <%--這是JSP注釋--%>
    <%--%>

    //這是java的當(dāng)行注釋
    //

    
    /*這是java的多行注釋*/
    /**/
    
JSP指令

JSP指令用來(lái)聲明JSP頁(yè)面的相關(guān)屬性,例如編碼方式、文檔類型等等

JSP指令的語(yǔ)法:

    <%@指令  屬性名="值"  %>
page指令

我在idea生成的JSP頁(yè)面就有page指令了。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>

page指令常見(jiàn)屬性:

language="java"

extends="package.class"

import="{package.class | package.*}, ..."

session="true | false"

buffer="none | 8kb | sizekb"

autoFlush="true | false"

isThreadSafe="true | false"

info="text"

errorPage="relative_url"

isErrorPage="true | false"

contentType="mimeType ;charset=characterSet " | "text/html ; charset=ISO-8859-1"

pageEncoding="characterSet | ISO-8859-1"

isELIgnored="true | false"

一般地,在eclipse或idea這些高級(jí)開(kāi)發(fā)工具上開(kāi)發(fā),我們只需要在page指令中指定contentType="text/html;charset=UTF-8",就不會(huì)出現(xiàn)中文亂碼問(wèn)題!

當(dāng)然了contentType 不僅僅可以指定以text/html的方式顯示,還可以使用其他的形式顯示出來(lái)。在conf/web.xml文件中可以查詢出來(lái)

比如,我以doc形式顯示jsp的數(shù)據(jù)

    <%@ page contentType="application/msword;charset=UTF-8" language="java" %>
    
    
        簡(jiǎn)單使用JSP
    
    
    
        1111
    
    

效果是這樣子的:

我們上網(wǎng)的時(shí)候,如果我們操作不當(dāng),或者服務(wù)器出錯(cuò)了,頁(yè)面都是會(huì)出現(xiàn)友好提示的!這個(gè)也能通過(guò)page指令來(lái)實(shí)現(xiàn)跳轉(zhuǎn)到友好提示頁(yè)面上

page指令errorPage=和isErrorPage這兩個(gè)屬性,下面我們來(lái)看一下怎么使用!

1.jsp出現(xiàn)了錯(cuò)誤,通過(guò)page指令的errorPage屬性跳轉(zhuǎn)到error.jsp頁(yè)面

    <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
    
    
        該頁(yè)面出錯(cuò)了!
    
    
        <%--模擬頁(yè)面出錯(cuò)了?。。?-%>
        <%
            int result = 2 / 0;
        %>
        你好呀
    
    

error.jsp頁(yè)面要通過(guò)page指令的isErrorPage屬性設(shè)置頁(yè)面就是錯(cuò)誤頁(yè)面

    <%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true"   %>
    
        
            友好提示頁(yè)面
        
        
            服務(wù)器正忙著呢!
        
    

下面是效果:

當(dāng)然了,細(xì)心的朋友可以發(fā)現(xiàn)地址欄是沒(méi)有變化的,所以屬于是服務(wù)器跳轉(zhuǎn)。以上的做法是單個(gè)頁(yè)面設(shè)置的,如果我會(huì)有很多錯(cuò)誤(JSP多的情況下,錯(cuò)誤就會(huì)多),單個(gè)設(shè)置太麻煩了!

我們可以在web.xml文件中全局設(shè)置錯(cuò)誤頁(yè),只要發(fā)生了404錯(cuò)誤或者空指針異常的錯(cuò)誤都會(huì)跳轉(zhuǎn)到error.jsp頁(yè)面上

    
        404
        /error.jsp
    

    
        java.lang.NullPointerException
        /error.jsp
    

隨便輸個(gè)資源進(jìn)行,會(huì)發(fā)生發(fā)404錯(cuò)誤的,跳轉(zhuǎn)到錯(cuò)誤頁(yè)面。下面是效果:

include指令

在講解request對(duì)象的時(shí)候,我們?cè)?jīng)使用過(guò)request.getRequestDispatcher(String url).include(request,response)來(lái)對(duì)頁(yè)頭和頁(yè)尾面進(jìn)行包含

inclue指令也是做這樣的事情,我們來(lái)試驗(yàn)一下吧!

這是頁(yè)頭

    <%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    
        
            頁(yè)頭
        
        
        我是頁(yè)頭
        


這是頁(yè)尾

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        頁(yè)尾
    
    
    
    我是頁(yè)尾
    
    
    

在1.jsp中把頁(yè)頭和頁(yè)尾包含進(jìn)來(lái)


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁(yè)頭和頁(yè)尾進(jìn)來(lái)
    
    
    
    
    <%@include file="head.jsp" %>
    <%@include file="foot.jsp" %>
    
    

訪問(wèn)1.jsp

include指令是靜態(tài)包含。靜態(tài)包含的意思就是:把文件的代碼內(nèi)容都包含進(jìn)來(lái),再編譯!,看一下jsp的源代碼就知道了!

jsp還提供另一種包含文件的方式:JSP行為---動(dòng)態(tài)包含。jsp行為在下面會(huì)講到!

taglib指令

JSP支持標(biāo)簽技術(shù),要使用標(biāo)簽技術(shù)就先得聲明標(biāo)簽庫(kù)和標(biāo)簽前綴。taglib指令就是用來(lái)指明JSP頁(yè)面內(nèi)使用標(biāo)簽庫(kù)技術(shù)。

這里就不詳細(xì)說(shuō)明了,等到學(xué)習(xí)JSP標(biāo)簽的時(shí)候再使用吧!現(xiàn)在記住有這個(gè)指令即可。

JSP行為
JSP行為(JSP Actions)是一組JSP內(nèi)置的標(biāo)簽,只書(shū)寫(xiě)少量的標(biāo)記代碼就能夠使用JSP提供豐富的功能,JSP行為是對(duì)常用的JSP功能的抽象和封裝。

為什么我不把它直接稱為JSP標(biāo)簽?zāi)兀?strong>我把這些JSP內(nèi)置的標(biāo)簽稱之為JSP行為,能夠和JSTL標(biāo)簽區(qū)分開(kāi)來(lái)。當(dāng)然了,你也可以把它稱之為JSP標(biāo)簽,你不要搞混就行了。我個(gè)人喜歡把這些JSP內(nèi)置標(biāo)簽稱之為JSP行為。

include行為

上面已經(jīng)提及到了,include指令是靜態(tài)包含,include行為是動(dòng)態(tài)包含。其實(shí)include行為就是封裝了request.getRequestDispatcher(String url).include(request,response)

include行為語(yǔ)法是這個(gè)樣子的

    

我們先來(lái)使用一下把,在1.jsp頁(yè)面中也將頁(yè)頭和頁(yè)尾包含進(jìn)來(lái)。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁(yè)頭和頁(yè)尾進(jìn)來(lái)
    
    
        
        
    
    

訪問(wèn)1.jsp頁(yè)面看一下效果:

使用jsp行為來(lái)包含文件,jsp源文件是這樣子的:

jsp行為包含文件就是先編譯被包含的頁(yè)面,再將頁(yè)面的結(jié)果寫(xiě)入到包含的頁(yè)面中(1.jsp)

當(dāng)然了,現(xiàn)在有靜態(tài)包含和動(dòng)態(tài)包含,使用哪一個(gè)更好呢?答案是:動(dòng)態(tài)包含。

動(dòng)態(tài)包含可以向被包含的頁(yè)面?zhèn)鬟f參數(shù)(用處不大),并且是分別處理包含頁(yè)面的(將被包含頁(yè)面編譯后得出的結(jié)果再寫(xiě)進(jìn)包含頁(yè)面)【如果有相同名稱的參數(shù),使用靜態(tài)包含就會(huì)報(bào)錯(cuò)!】!

模擬一下場(chǎng)景吧,現(xiàn)在我的頭頁(yè)面有個(gè)名為s的字符串變量

    <%@ page contentType="text/html;charset=UTF-8" language="java"   %>
    
        
            頁(yè)頭
        
        
        
        <%
            String s = "zhongfucheng";
        %>
        我是頁(yè)頭呀
        


我的頁(yè)尾也有個(gè)名為s的字符串變量

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        頁(yè)尾
    
    
    <%
        String s = "zhongfucheng";
    %>
    
    我是頁(yè)尾呀
    
    
    

現(xiàn)在我使用靜態(tài)包含看看會(huì)發(fā)生什么,出現(xiàn)異常了。

出現(xiàn)異常的原因很簡(jiǎn)單,就是同一個(gè)文件中有兩個(gè)相同的變量s

使用動(dòng)態(tài)包含就可以避免這種情況

param行為

當(dāng)使用行為引入或?qū)⒄?qǐng)求轉(zhuǎn)發(fā)給其它資源時(shí),可以使用行為向這個(gè)資源傳遞參數(shù)。

forward行為

在講解request對(duì)象的時(shí)候,我們使用request.getRequestDispatcher(String url).forward(request,response)進(jìn)行跳轉(zhuǎn)。其實(shí)forward行為就是對(duì)其封裝

我們來(lái)看一下forward的語(yǔ)法:

    

好的,我們來(lái)使用一下吧。訪問(wèn)1.jsp頁(yè)面就跳轉(zhuǎn)到head.jsp頁(yè)面中

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        訪問(wèn)1.jsp就跳轉(zhuǎn)到head.jsp
    
    
    
    
    
    
    
    

看一下效果

如果我要傳遞參數(shù),就要在forward行為嵌套param行為

在跳轉(zhuǎn)到head.jsp時(shí)傳入?yún)?shù)username值為zhongfucheng

    
        
    

在head.jsp頁(yè)面中獲取到傳遞過(guò)來(lái)的參數(shù)

        <%
            String ss = request.getParameter("username");
        %>
    
        獲取到的參數(shù)是:
        <%=ss%>

效果如下圖所示

directive行為

directive的中文意思就是指令。該行為就是替代指令<%@%>的語(yǔ)法的

相當(dāng)于<%@include file="" %>

相當(dāng)于<%@page %>

相當(dāng)于<%@taglib %>

我們來(lái)試一下能不能用的

    
    

看下效果,正??梢园?yè)面:

使用該指令可以讓JSP頁(yè)面更加美觀

使用scriptlet行為替代<%%>是同樣一個(gè)道理

javaBean行為

JSP還提供了操作javaBean對(duì)象的行為,在這里就不詳細(xì)說(shuō)明了,后面會(huì)講到的!現(xiàn)在記住JSP提供了javaBean行為來(lái)操作簡(jiǎn)單類即可!

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68450.html

相關(guān)文章

  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0
  • 超詳細(xì)的Java面試題總結(jié)(四 )之JavaWeb基礎(chǔ)知識(shí)總結(jié)

    摘要:系列文章請(qǐng)查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)三之集合篇常見(jiàn)問(wèn)題下面的都是自己之前在學(xué)習(xí)的時(shí)候總結(jié)的,對(duì)于鞏固的基礎(chǔ)知識(shí)應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫(xiě)類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。 系列文章請(qǐng)查看: 超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(...

    Leo_chen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<