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>
有幾點需要說明一下,
<jsp:forward>
動作指令之後的代碼是不會執行的(可以試一下)。- 使用動作指令跳轉的頁面,瀏覽器的地址還是跳轉之前的頁面地址
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(空).