1. 程式人生 > >JSP基本的語法、3個編譯指令、7個動作指令、9個內置對象

JSP基本的語法、3個編譯指令、7個動作指令、9個內置對象

sun request方法 賦值 date() fadein word struts標簽 異常機制 ava

一、jsp概述


JSP是java server page的縮寫,其本質是一個簡化的servlet,是一種動態網頁技術標準。jsp頁面是在HTML頁面中嵌入java程序段。使用jsp開發的應用程序能夠跨平臺。

二、jsp基本的語法


2.1 jsp表達式

jsp表達式用於向頁面輸出信息。語法格式例如以下:

<%= 表達式 %>

如:<%= 5+6 %>
<%與=之間不能有空格,=與後面的表達式之間能夠有空格。

2.2 jsp聲明標識

聲明標識用語在jsp頁面中定義全局的變量或者方法,通過聲明標識定義的變量和方法能夠被整個jsp頁面訪問。語法格式例如以下:

<%!聲明變量或者方法的代碼%>

<%!String str = "test";%>
<%與!之間不能有空格,!與其後面的代碼之間能夠有空格。

2.3 jsp代碼段

代碼片段就是嵌在jsp頁面中的java代碼或腳本代碼。會在頁面請求的處理期間被運行,java代碼能夠實現定義變量、流程控制等功能。腳本代碼能夠通過使用jsp內置對象在jsp頁面輸出內容、處理請求和響應、訪問session等,代碼片段的語法格式例如以下:

<% java代碼或者腳本代碼 %>

2.4 jsp凝視

2.4.1 HTML凝視

HTML凝視格式:

    <!--  html凝視-->

html凝視不會顯示在網頁中。在瀏覽器中查看源代碼的時候能夠看到凝視信息。

2.4.2 代碼片段凝視

由於代碼片段即為java代碼或者腳本代碼,代碼片段的凝視和java語法一樣。單行凝視寫在//之後,多行凝視寫在/* */ 之間,文檔提示凝視寫在/***/之間。

//單行凝視

/*
  多行凝視第一行
  多行凝視第二行
*/

/**
  文檔凝視    
*/

2.4.3 隱藏凝視

html凝視在查看網頁源代碼的時候能夠看到,所以嚴格來說這樣的凝視並不安全,jsp提供的隱藏凝視在瀏覽器和查看源代碼的時候都看不到。安全性更高。


隱藏凝視寫在<%–與%>之間:

<%--jsp註隱藏釋 --%>

2.4.4 動態凝視

在html凝視中嵌入jsp代碼片段能夠構成動態的html凝視文本。
演示樣例:

<!-- tody is <%=new Date()%>.動態凝視 -->

演示樣例代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello world</title>
</head>
<body>
    <h1>jsp基本的語法</h1>
    <!--  html凝視-->
    <!-- tody is <%=new Date()%>.動態凝視 -->
    <%--jsp註隱藏釋 --%>
    <%!String str = "test"; //jsp聲明%>
    <%
        /**
          文檔凝視
        */
        //單行凝視

        /*
          多行凝視1
          多行凝視2
        */
        String hello = "hello world";
        out.println(hello + "<br>");
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                out.println(i + "*" + j + "=" + j * i + "&nbsp;&nbsp;&nbsp;&nbsp;");
            }
            out.println("</br>");
        }
        out.println(str);
    %>
</body>
</html>

瀏覽器訪問:
技術分享

三、jsp的3個編譯指令


jsp編譯指令是通知jsp引擎的消息,它不直接生成輸出,編譯指令有默認值。常見的編譯指令有3個:

  • page指令:該指令是針對當前頁面的指令。
  • include指令:用於指定包括還有一個頁面。

  • taglib指令:用於定義和訪問自己定義標簽。
    編譯指令的語法格式例如以下:
<%@ 編譯指令名 屬性名1="屬性值" 屬性名2"屬性值" ...  %>

3.1 page指令

pag指令經常使用屬性

屬性 定義
language =“語言” 主要指定JSP 容器 要用什麽語言來編譯JSP頁。JSP 1.2 規範中指出,眼下僅僅能夠使用Java 語言。只是未來不排除添加其他語言。如C、C++、Perl 等等。默認值為Java語言
extends = “基類名” 主要定義此JSP 網頁產生的Servlet 是繼承哪個父類
import= “包名” 定義此JSP 網頁能夠使用哪些Java類庫
session=”true或false” 決定此JSP 網頁能否夠使用session 對象。

默認值為true

buffer=”none或size in kb” 決定輸出流(output stream) 是否有緩沖區。默認值為8KB 的緩沖區
autoFlush=”true 或false” 決定輸出流的緩沖區是否要自己主動清除,緩沖區滿了會產生異常(Exception)。默認值為true
isThreadSafe=”true 或 false” 告訴JSP 容器,此JSP 網頁能否同一時候處理多個請求。默認值為true。假設此值設為false。 轉義生成的Servlet會實現SingleThreadModel接口。
info =”text” 表示此JSP 網頁的相關信息
errorPage=”error_url” 表示假設發生異常錯誤時。網頁會被又一次指向指定的URL
isErrorPage=”true或false” 表示此JSP Page 是否為專門處理錯誤和異常的網頁
contentType = “ctinfo” 表示MIME 類型和JSP 網頁的編碼方式,其作用相當於HttpServletResponse接口的setContentType()方法

3.2 include指令

include指令能夠將一個外部文件嵌入到當前jsp文件裏,同一時候解析這個頁面中的jsp語句。include命令既能夠包括jsp頁面也能夠包括靜態文本。編譯指令語法例如以下:

<%@ include file="要導入的jsp頁面或文本文件" %>

如:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include</title>
</head>
<body>
    <%@ include file="header.jsp"%>
    <%@ include file="text.txt"%>
    <%@ include file="footer.jsp"%>
</body>
</html>

使用include指令註意事項:
1.file名不能為依變量。以下的樣例是錯誤的

<%! String url="header.jsp" %>
<%@ include="<%=url %>"

2.file名後面不能傳入參數。以下的樣例是錯誤的

<%@ include file="header.jsp?username=abc" %>

3.file的路徑是相對於此jsp的路徑。

3.3 taglib指令

taglib指令用於引入一些特定的標簽庫,語法格式:

<%@ taglib prefix="tagPrefix" uri="tagLibraryURI" %>

如使用struts標簽庫:

<%@ taglib prefix="s" taglib="/struts-tags" %>

prefix=”tagPrefix “用於定制標記的前綴,jsp, jspx, java, javax, servlet, sun, 和sunw已被sun公司保留。uri=”tagLibraryURI”統一資源標記庫,制定一個特定的標記庫,能夠是相對路徑,也能夠是絕對路徑。

四、jsp的7個動作指令

4.1forward指令

forward指令用於將頁面轉發到另外的頁面,能夠是html頁面、jsp頁面、容器中的servlet.
語法例如以下:

<jsp:forward page="目標頁面地址"></jsp:forward>

假設轉發的時候須要傳遞參數能夠使用<jsp:param></jsp:param>指令進行設置。


比方,訪問index.jsp頁面時自己主動轉發至login.jsp,須要把username和password傳遞過去:
index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:forward page="login.jsp">
    <jsp:param value="yaopan" name="username" />
    <jsp:param value="123456" name="password" />
</jsp:forward>
<%--mac上按住comment鍵(windows下按住ctrl鍵),再點擊login.jsp  forword以下的代碼不會被運行 --%>
站點主頁

在login.jsp中能夠使用getParameter方法獲取傳入的參數值:

<%
  String name=request.getParameter("username");
  String pwd=request.getParameter("password");
  out.println(name);
  out.println("<br>");
  out.println(pwd);
%>

運行forword指令時用戶請求的地址沒有發生變化。頁面內容被forward目標替代。

4.2 include指令

include指令用於包括某個頁面。但不會導入被include頁面的編譯指令。能夠通過param指令傳遞參數:
新建一個index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<jsp:include page="head.html"></jsp:include>
<jsp:include page="body.jsp">
   <jsp:param value="#1d99f6" name="bgcolor"/>
</jsp:include>
</html>

body.jsp

<body bgcolor="<%=request.getParameter("bgcolor")%>">
</body>

4.3useBean、setProperty、getProperty指令

這三個指令與javaBean相關,useBean用於在jsp頁面中初始化一個Java實例;setProperty為javaBean實例的屬性賦值;getProperty屬性用於輸出javaBean實例的屬性。


假設jsp頁面中須要反復使用某段代碼,能夠把這段代碼定義成java方法,然後多個jsp頁面調用該方法達到頁面復用的效果。


useBean的語法格式例如以下:

<jsp:useBean id="beanID" class="java包名.類名" scope="page|request|session|application"></jsp:useBean>

如:在ucas.ac.cn.jspstudy包下創建一個Student類,有name、age、stuId三個屬性和對應的setter和getter方法。在jsp頁面中創建javaBean實例:

<%--創建Student對象,對象名為stu1 --%>
<jsp:useBean id="stu1" class="ucas.ac.cn.jspstudy.Student" scope="page"></jsp:useBean>

setProperty方法用於為javaBean實例的屬性賦值:

<%--給stu1的name屬性賦值 --%>
<jsp:setProperty property="name" name="stu1" value="張三"/>
<%--給stu1的age屬性賦值 --%>
<jsp:setProperty property="age" name="stu1" value="20"/>

getProperty用於輸出javaBean實例的屬性值:

<%--輸出stu1的name值 --%>
<jsp:getProperty property="name" name="stu1"/>
<%--輸出stu1的age值 --%>
<jsp:getProperty property="age" name="stu1"/>

4.4plugin指令

plugin主要用於下載server端的javaBean或applet到client運行。如今非常少使用。

4.5param指令

param指令用於設置參數值,該指令本身不能單獨使用,單獨的param指令沒有意義,配合以下三個指令使用:

  • jsp:include
  • jsp:forward
  • jsp:plugin

五、jsp腳本中的9個內置對象

5.1 application對象

jsp、servlet之間不能相互調用。為了解決jsp和servlet之間數據交換的問題,webserver提供了四個對象,各自是application、session、request、page。

放入application對象中的數據對整個Web應用有效,一旦jsp、servlet將數據放入application對象之中,該數據能夠被該應用下其他jsp、servlet訪問。

5.2 config對象

config對象代表當前jsp配置信息,但jsp頁面通常無需配置,該對象在jsp頁面中較少使用。在servlet中使用較多。

5.3 exception對象

exception對象是Throwable的實例。代表jsp腳本中產生的錯誤和異常,是jsp頁面異常機制的一部分。把page指令的isErrowPage屬性設置為true時能夠訪問exception內置對象。

5.4 out對象

out對象是javax.servlet.jsp.JspWriter的實例,代表jsp的輸出流,永於輸出內容形成html頁面。
out對象一些方法:

  • out.println():輸出完畢後會換行,換行效果在頁面中不顯示僅僅在源代碼中顯示
  • out.print():輸出後不換行
  • out.getBufferSize() :輸出緩沖區大小
  • out.getRemaining() :輸出剩余緩沖區大小
  • out.clear():清空緩沖區,不將數據發送至client
  • out.clearBuffer():將數據發送至client,再清空緩沖區
  • out.flush():輸出緩沖區內容
  • out.close():關閉輸出流

5.5page對象

代表該頁面本身。通常沒有太大用處。

5.6 pageContext對象

代表頁面上下文,主要用於jsp之間的共享數據,使用pageContext對象能夠訪問page、request、session、application範圍的變量。

5.7 request對象

request對象是jsp中的重要對象,每一個對象封裝著一次用戶請求。而且所有對請求參數都被封裝在request對象中,request對象是獲取用戶請求參數的重要途徑。request對象的一些方法:

  • request.getMethod():獲取請求的方法名。如get,post.
  • request.getRequestURI():獲取請求資源名.如請求訪問:/jspstudy/08/request.jsp
  • request.getProtocol():獲取請求使用的協議.如:HTTP/1.1
  • request.getServerName():獲取請求使用的server,如:localhost.
  • request.getServerPort():獲取請求使用的serverport。如:8080
  • request.getRemoteAddr():獲取client的ip地址.
  • request.getRemoteHost():獲取client主機.
  • request.getParameter():獲取傳遞過來的參數值.
  • request.getParameterValues():請求參數有多個值時。該方法返回多個值組成的數組.
  • request.setAttribute():

測試代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request方法</title>
</head>
<body>

<form action="" method="post">
  username:<input type="text" name="username"><br/>
  <input type="submit">
  請求方法名:<%=request.getMethod() %><br/>
  請求的資源:<%=request.getRequestURI() %><br/>
  請求使用的協議:<%=request.getProtocol() %><br/>
  請求使用的server:<%=request.getServerName() %><br/>
  請求使用的serverport:<%=request.getServerPort() %><br/>
  client的IP地址:<%=request.getRemoteAddr() %><br/>
  client主機:<%=request.getRemoteHost() %><br/>
  表單提交過來的值:<%=request.getParameter("username") %><br/> 
</form>
</body>
</html>

輸出:

請求方法名:POST
請求的資源:/jspstudy/08/request.jsp
請求使用的協議:HTTP/1.1
請求使用的server:localhost
請求使用的serverport:8080
client的IP地址:0:0:0:0:0:0:0:1
client主機:0:0:0:0:0:0:0:1
表單提交過來的值:test

5.8 response對象

response對象用於server對client的響應,大部分時候使用out對象向頁面輸出。可是out對象時JspWriter對象的實例,JapWriter時Writer的字類。Writer是字符流,因此out對象無法輸出非字符內容。jsp頁面須要輸出圖片、pdf文檔、excel等非字符對象時須要使用response作為響應輸出.response還能夠用於重定向。向client添加cookie.

5.9 session對象

session對象代表一次用戶會話。一次用戶會話的含義是:從client連接server開始。到client與server斷開為止,這個過程就是一次會話。
session通經常使用於跟蹤用戶的會話信息,如推斷用戶是否登錄。購物車中跟蹤用戶購買的商品。
session範圍的屬性能夠在多個頁面點跳轉之間共享。一旦關閉瀏覽器,session結束。session範圍內的屬性就會所有丟失。

JSP基本的語法、3個編譯指令、7個動作指令、9個內置對象