JSP 編譯指令和動作指令



jsp中的指令分爲兩大類,編譯指令和動作指令。

編制指令 <%@ inlcude file=” “%>和 <%@ page 屬性1 屬性2 %>  和<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>
動作指令 <jsp:include><jsp:forward><jsp:useBean>

一、JSP編譯指令

(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()方法

 (2)include

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

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

     

    使用include指令注意事項: 
          (1)file名不能爲依變量,下面的例子是錯誤的

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

           (2)file名後面不能傳入參數,下面的例子是錯誤的

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

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

(3)taglib指令

     taglib指令允許頁面使用用戶定製的標籤。
     taglib指令的語法如下:
    <%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>

taglib指令有三個屬性:

  • uri

    :該屬性唯一地標識和前綴(prefix)相關的標籤庫描述符,可以是絕對或者相對的URI。這個URI被用於定位標籤庫描述符的位置。

  • tagdir

    :該屬性指示前綴(prefix)將被用於標識安裝在/WEB-INF/tags/目錄或其子目錄下的標籤文件,一個隱含的標籤庫描述符被使用。
    下面三種情況將發生轉換(translation)錯誤:
    屬性的值不是以/WEB-INF/tags/開始。
    屬性的值沒有指向一個已經存在的目錄。
    該屬性與uri屬性一起使用。

  • prefix

    :定義一個prefix:tagname形式的字符串前綴,用於區分多個自定義標籤。以jsp:,jspx:,java:,javax:,servlet:,sun:和sunw:開始的前綴被保留。前綴的命名必須遵循XML名稱空間的命名約定。在JSP 2.0規範中,空前綴是非法的

   編譯指令的語法格式如下:

<%@ 編譯指令名 屬性名1="屬性值" 屬性名2="屬性值" ...  %>

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

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

eg:使用struts標籤庫

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

 


JSP動作指令

 

1、forward

     使用<jsp:forward>的格式爲 <jsp:forward page="filename">

  舉個例子:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="UTF-8"%>
   
<jsp:forward page = "login.jsp">
	<jsp:param value = "zoeng" name = "userName"/>
	<jsp:param value = "jikexueyuan" name = "password"/>
</jsp:forward>

login.jsp的源碼如下所示:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<%
	String userName = request.getParameter("userName");
	String password = request.getParameter("password");
	out.print(userName);
	out.print("<br/>");
	out.print(password);
%>

</body>
</html>

有幾點需要說明一下,

  1. <jsp:forward>動作指令之後的代碼是不會執行的(可以試一下)。
  2. 使用動作指令跳轉的頁面,瀏覽器的地址還是跳轉之前的頁面地址

2、include

<jsp:include> :動態包含

舉個例子:


index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>

<jsp:include page = "header.html"></jsp:include>
<jsp:include page = "body.jsp">
	<jsp:param value = "red"  name = "bgcolor" />
</jsp:include>
</html>

header.html:

<head>
<meta charset="UTF-8">
<title>include</title>
</head>

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

<%@include%>:靜態包含

                 靜態和動態include詳細解釋:https://blog.csdn.net/zfl589778/article/details/56494523

        由上可以總結出:

       對於靜態包含,<%@include%>,中包含的文件,只是簡單的嵌入到主文件中,就是在jsp頁面轉化成Servlet時才嵌入到主文件中,因爲運行的結果是隻生成了一個Servlet。

       而對於動態包含<jsp:incude>,如果被包含文件是動態的,那麼就會生成兩個Servlet,也就是被包含文件也要經過jsp引擎編譯執行生成一個Servlet,兩個Servlet通過request和reponse進行通信。如果被包含的文件是靜態的,那麼這種情況和<%@include>就很相似,只生成了一個Servlet,但是他們之間沒有進行簡單的嵌入,而依然是通過request和reponse進行的通信。

3、useBean

參考博客:https://blog.csdn.net/qq_26525215/article/details/52072428

JavaBean其實就是一個遵循特定寫法的java類,但是必須具有如下特點

      1.這個java類必須具有一個公開的無參構造函數

      2.屬性必須私有化,類必須公開

      3.私有化的屬性必須通過public類型的方法暴露給其他程序,並且方法的命名也必須遵守一定的命名規範---getXxx和setXxx方法。

     把一個擁有對屬性進行set和get方法的類,我們就可以稱之爲JavaBean。實際上JavaBean就是一個java類,在這個java類中就默認形成了一種規則——對屬性進行設置和獲得。而反之將說ava類就是一個JavaBean,這種說法是錯誤的,因爲一個java類中不一定有對屬性的設置和獲得的方法(也就是不一定有set和get方法)。

在JSP中訪問JavaBean的語法:

       1、聲明JavaBean對像-必須使用完整類名:

     <jsp:useBean id=“someBean” class=“package.SomeBean” scope=“page”/>

       以上聲明相當於: SomeBean someBean = new SomeBean(); pageContext.setAttribute(“someBean”,someBean);

      scope的可選值爲:page|request|session|application

     需要說明的是:一般情況下,我們保留<jsp:useBean/>的body部分爲空,如果不爲空,則只有初始化此Bean時執行,如:         <jsp:useBean id=“person” class=“cn.Person”> 這是body部分,只會在初始化時執行一次 </jsp:userBean>

   <jsp:useBean>標記:

    <jsp:useBean id="name" class="classname" scope="page|request|session|application"/>

     id:代表jsp頁面中的實例對象 通過這個對象引用類中的成員,如,id="wq", wq.成員();

     class: 代表JavaBean類,如: class="com.Test",引用com包中的Test類

     scope:指明瞭javabean的生存時間。默認爲page範圍。 當聲明瞭一個Bean並將它放到某個範疇之後,在同一個範圍內再次使用<jsp:useBean../>將不再創建。而是直接給你返回已經創建過的Bean的實例。此過程可以通過查看容器翻譯的源代碼得知。

      2、訪問JavaBean的屬性:

    <jsp:setProperty name=“someBean” property=“name” value=“Tom”/>

    <jsp:getProperty name=“someBean” property=“name”/>

   也可以在頁面上使用Java代碼直接訪問它的屬性和其他方法。

舉個例子:

register.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>錄入註冊信息</title>
</head>
<body>
	<form action = "do_register.jsp"  method = "post">
	用戶名:<input type = "text" name = "userName" />
	password:<input type = "text" name = "password" />
	<input type = "submit" value = "submit" />
	</form>
</body>
</html>

do_register.jsp:

<html>
<head>
<meta charset="UTF-8">
<title>處理提交的內容</title>
</head>
<body>
<jsp:useBean id = "user" class = "com.jikexue.jsp.UserEntity" ></jsp:useBean>
<jsp:setProperty property = "userName" name = "user" />
<jsp:setProperty property = "password" name = "user" />
<%	
	String userName = request.getParameter("userName");
	String password = request.getParameter("password");
	out.print(userName);
	out.print("<br/>");
	out.print(password);
%>
<br/>
<jsp:getProperty property="userName" name = "user" />
<jsp:getProperty property="password" name = "user" />
</body>
</html>

<jsp:setproperty>詳解

轉載自:https://blog.csdn.net/IT_COOKIE_SAM/article/details/55518753?locationNum=6&fps=1

jsp:setProperty動作有下面四個屬性,如下表:

屬性 描述
name name屬性是必需的。它表示要設置屬性的是哪個Bean。
property property屬性是必需的。它表示要設置哪個屬性。有一個特殊用法:如果property的值是"*",表示所有名字和Bean屬性名字匹配的請求參數都將被傳遞給相應的屬性set方法。
value value 屬性是可選的。該屬性用來指定Bean屬性的值。字符串數據會在目標類中通過標準的valueOf方法自動轉換成數字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如"true")通過 Boolean.valueOf轉換,int和Integer類型的屬性值(比如"42")通過Integer.valueOf轉換。   value和param不能同時使用,但可以使用其中任意一個。
param param 是可選的。它指定用哪個請求參數作爲Bean屬性的值。如果當前請求沒有參數,則什麼事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認屬性值,只有當請求參數明確指定了新值時才修改默認屬性值。

    getProperty:獲取Bean的屬性的值並將之轉化爲一個字符串,將其插入到頁面中。

   Jsp:getproperty有兩個必須屬性:

   Name:表示Bean的名字

   Property:表示提取哪一個屬性的值。

      在sun的JSP參考中提到,如果你使用<jsp:getProperty>來檢索的值是空值,那麼NullPointerException將會出現,同時如果使用程序段或表達式來檢索其值,那麼在瀏覽器上出現的是null(空).

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章