jsp 的 7 個動作指令
動作指令與編譯指令不同,編譯指令是通知 Servlet 引擎的處理消息,而動作指令只是運行時的動作。編譯指令在將 JSP 編譯成 Servlet 時起作用;而處理指令通常可替換成 JSP 腳本,它只是 JSP 腳本的標準化寫法。
JSP 動作指令主要有如下 7 個:
1、jsp:forward:執行頁面轉向,將請求的處理轉發到下一個頁面。
2、jsp:param:用於傳遞參數,必須與其他支持參數的標簽一起使用。
3、jsp:include:用於動態引入一個 JSP 頁面
4、jsp:plugin:用於下載 JavaBean 或 Applet 到客戶端執行
5、jsp:useBean:創建一個 JavaBean 的實例
6、jsp:setProperty: 設置 JavaBean 實例的屬性值
7、jsp:getProperty: 獲取 JavaBean 實例的屬性值
forward 指令
forward 指令用於將頁面響應轉發到另外的頁面。既可以轉發到靜態的 HTML 頁面,也可以轉發到動態的 JSP 頁面,或者轉發到容器中的 Servlet。
forward 指令格式如下:
<jsp:forward page="{relativeURL | <%=expression%>}" />
對於 JSP1.1 以上規範,可以使用如下形式:
<jsp:forward page="{relativeURL | <%=expression%>}" > {<jsp:param ... />} </jsp:forward>
第二種語法可以添加額外的參數,增加的參數可通過 HttpServletRequest 實例的 getParameter() 方法獲取。
例子:
<jsp:forward page="form.jsp"> <jsp:param name="age" value="29" /> </jsp:forward>
獲取參數:
<input type="hidden" name="age" value="<%=request.getParameter("age")%>">
使用 forward 指令轉發請求時,用戶請求的地址不會改變,客戶端的請求參數也不會丟失。
從表面上看,<jsp:forward ... /> 指令似乎將用戶請求轉發到了一個新頁面,但實際上只是采用了新頁面來對用戶請求生成響應 -- 請求依然是一次請求,所以請求參數、請求屬性都不會丟失。
include 指令
include 指令是一個動態 include 指令,也用於包含某個頁面,它不會導入被 include 頁面的編譯指令,僅僅將被導入頁面的 body 內容插入本頁面。
語法格式:
<jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
或者:
<jsp:include page="{relativeURL | <%=expression%>}" flush="true"> <jsp:param name="parameterName" value="parameterValue" /> </jsp:include>
flush 屬性用於指定輸出緩存是否轉移到被導入文件中。如果指定為 true,則包含在被導入文件中;如果指定為 false,則包含在原文件中。
表明上看,該頁面的執行效果與使用靜態 include 導入的頁面沒有什麽不同。但查看生成的源碼,可以發現:動態導入只是使用一個 include 方法來插入目標頁面的內容,而不是將目標頁面完全融入本頁面中。
歸納起來,靜態導入和動態導入有如下三點區別:
1、靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體 Servlet;而動態導入則在 Servlet 中使用 include 方法來引入被導入頁面的內容
2、靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用,只是插入被導入頁面的 body 內容
3、動態包含還可以增加額外的參數。
useBean、setProperty、getProperty 指令
這三個指令都是與 JavaBean 相關的指令,其中 useBean 指令用於在 JSP 頁面中初始化一個 Java 實例;setProperty 指令用於為 JavaBean 實例的屬性設置值;getProperty 指令用於輸出 JavaBean 實例的屬性。
useBean 的語法格式如下:
<jsp:useBean id="name" class="classname" scope="page | request | session | application" />
其中,id 屬性是 JavaBean 的實例名,class 屬性確定 JavaBean 的實現類。scope 屬性用於指定 JavaBean 實例的作用範圍,該範圍有以下 4 個值:
page:該 JavaBean 實例僅在該頁面有效。
request:該 JavaBean 實例在本次請求有效。
session:該 JavaBean 實例在本次 session 內有效。
application:該 JavaBean 實例在本應用內一直有效。
setProperty 語法格式如下:
<jsp:setProperty name="BeanName" property="propertyName" value="value" />
其中,name 屬性確定需要設定 JavaBean 的實例名;property 屬性確定需要設置的屬性名;value 屬性則確定需要設置的屬性值。
getProperty 語法格式如下:
<jsp:getProperty id="BeanName" property="propertyName" />
其中,name 屬性確定需要輸出的 JavaBean 的實例名;property 屬性確定需要輸出的屬性名。
例子:
<jsp:useBean id="person" class="com.baiguiren.Person" scope="page" /> <jsp:setProperty name="person" property="name" value="baiguiren" /> <jsp:setProperty name="person" property="age" value="24" /> <jsp:getProperty name="person" property="name" /><br/> <jsp:getProperty name="person" property="age" />
以上三個指令可以完全不使用,我們可以換成以下寫法,其內部執行是完全一致的:
<% // 實例化 JavaBean 實例,實現類為 com.baiguiren.Person,該實例的實例名為 person Person person = new Person(); // 將 person 放入 page 範圍中 pageContext.setAttribute("person", person); // 設置 person 的 name 屬性值 person.setName("baiguiren"); // 設置 person 的 age 屬性值 person.setAge(23); %> <!-- 輸出 person 的 name 屬性值 --> <%=person.getName()%> <br/> <!-- 輸出 person 的 age 屬性值 --> <%=person.getAge()%>
使用 useBean 標簽時,除在頁面腳本中創建了 JavaBean 實例之外,該標簽還會將該 JavaBean 實例放入指定的 scope 中,所以通常還需要在腳本中將該 JavaBean 放入指定 scope 中,如下面的代碼片段所示:
// 將 p1 放入 page 的生存範圍中 pageContext.setAttribute("p1", p1); // 將 p1 放入 request 的生存範圍中 request.setAttribute("p1", p1); // 將 p1 放入 session 的生存範圍中 session.setAttribute("p1", p1); // 將 p1 放入 application 的生存範圍中 application.setAttribute("p1", p1);
param 指令
param 指令用於設置參數值,這個指令本身不能單獨使用,因為單獨的 param 指令沒有任何實際意義。
param 指令可以與以下三個指令結合使用。
jsp:include
jsp:forward
jsp:plugin
當與 include 指令結合使用時,param 指令用於將參數值傳入被導入的頁面;當與 forward 指令結合使用時,param 指令用於將參數值傳入被轉向的頁面
param 指令的語法格式:
<jsp:param name="paramName" value="paramValue" />
jsp 的 7 個動作指令