国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

cyqian / 997人閱讀

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

什么是JSP

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

為什么需要JSP

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

簡單使用一下JSP

在idea下生成一個JSP,我們來看一下JSP長什么樣子

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

看起來就像一個HTML頁面,前面也說了:JSP的特點就是HTML和Java代碼共同存在

我們向瀏覽器輸出一句HelloWorld,至于<%%>這個東西,我先不解釋!

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


JSP的工作原理

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

剛才我簡單使用了一下JSP,它被編譯成了這么一個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("    簡單使用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);
    }
  }
}

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

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

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

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

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

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

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

JSP生命周期

JSP也是Servlet,運行時只有一個實例,JSP初始化和銷毀時也會調(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的語法

JSP代碼可以分為兩部分:

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

元素:JSP頁面中的java代碼、JSP指令、JSP標簽

JSP腳本

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

JSP腳本有三種方式:

<%%>【定義局部變量,編寫語句】

<%!%>【定義類或方法,但是沒人這樣用!

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

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

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

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

    //這是java的當行注釋
    //

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

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

JSP指令的語法:

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

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

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

page指令常見屬性:

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這些高級開發(fā)工具上開發(fā),我們只需要在page指令中指定contentType="text/html;charset=UTF-8",就不會出現(xiàn)中文亂碼問題!

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

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

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

效果是這樣子的:

我們上網(wǎng)的時候,如果我們操作不當,或者服務(wù)器出錯了,頁面都是會出現(xiàn)友好提示的!這個也能通過page指令來實現(xiàn)跳轉(zhuǎn)到友好提示頁面上

page指令errorPage=和isErrorPage這兩個屬性,下面我們來看一下怎么使用!

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

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

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

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

下面是效果:

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

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

    
        404
        /error.jsp
    

    
        java.lang.NullPointerException
        /error.jsp
    

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

include指令

在講解request對象的時候,我們曾經(jīng)使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含

inclue指令也是做這樣的事情,我們來試驗一下吧!

這是頁頭

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


這是頁尾

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

在1.jsp中把頁頭和頁尾包含進來


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁頭和頁尾進來
    
    
    
    
    <%@include file="head.jsp" %>
    <%@include file="foot.jsp" %>
    
    

訪問1.jsp

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

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

taglib指令

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

這里就不詳細說明了,等到學習JSP標簽的時候再使用吧!現(xiàn)在記住有這個指令即可。

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

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

include行為

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

include行為語法是這個樣子的

    

我們先來使用一下把,在1.jsp頁面中也將頁頭和頁尾包含進來

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        包含頁頭和頁尾進來
    
    
        
        
    
    

訪問1.jsp頁面看一下效果:

使用jsp行為來包含文件,jsp源文件是這樣子的:

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

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

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

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

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


我的頁尾也有個名為s的字符串變量

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

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

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

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

param行為

當使用行為引入或?qū)⒄埱筠D(zhuǎn)發(fā)給其它資源時,可以使用行為向這個資源傳遞參數(shù)。

forward行為

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

我們來看一下forward的語法:

    

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

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

看一下效果

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

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

    
        
    

在head.jsp頁面中獲取到傳遞過來的參數(shù)

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

效果如下圖所示

directive行為

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

相當于<%@include file="" %>

相當于<%@page %>

相當于<%@taglib %>

我們來試一下能不能用的

    
    

看下效果,正常可以包含頁面:

使用該指令可以讓JSP頁面更加美觀

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

javaBean行為

JSP還提供了操作javaBean對象的行為在這里就不詳細說明了,后面會講到的!現(xiàn)在記住JSP提供了javaBean行為來操作簡單類即可!

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68450.html

相關(guān)文章

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

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

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

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

    Leo_chen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<