在這一節我們要介紹七個JSP的動作指令,之前我們介紹了三個JSP的編譯指令,編譯指令是用來通知Servlet引擎的處理消息,而動作指令只是運動時的動作。編譯指令在將JSP編譯成Servlet時起作用,而處理指令通常可以替換成JSP腳本,它只是JSP腳本的標準化寫法。
一、JSP的七個動作指令
JSP的動作指令主要有以下七個:
jsp:forward:執行頁面轉向,將請求的處理轉發到下一個頁面。
jsp:param:用於傳遞參數,必須和其他的標籤配合使用。
jsp:include:用於動態引入一個外部JSP頁面。
jsp:plugin:用於下載JavaBean或Applet到客戶端執行。
jsp:useBean:創建一個JavaBean實例的屬性值。
jsp:setProperty:設置JavaBean實例的屬性值。
jsp:getProperty:獲取JavaBean實例的屬性值。
1、forwar指令
forward指令用於將頁面響應轉發到另外的頁面。下面是forward指令的示例:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="b.jsp"></jsp:forward>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
當我們訪問a.jsp的時候,內容顯示的是"Hello World",但是在瀏覽器的地址欄中URL依然顯示的是a.jsp。
2、include指令
include指令是一個動態的include指令,雖然它也用於將一個外部頁面包含進來,但是它不會導入被include頁面的編譯指令,只是把被導入頁面的body內容插入。include代碼示例:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="b.jsp"></jsp:include>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
當我們在瀏覽器中執行a.jsp的時候,顯示的內容會是"Hello World",我們發現它與靜態include運行的結果是一樣的,那它們的區別在哪裏呢?它們的區別主要有三個:
1、靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體Servlet,而動態導入則在Servlet中使用include方法來引入被導入的頁面內容。
2、靜態導入時被導入的編譯指令會起作用,動態導入只導入頁面的body內容。
3、動態包含還可以增加額外的參數,這點我們在param指令中講解。
關於第一點其實我們打開動態導入後編譯生成的Servlet文件可以看到,include指令被下面代碼所替代:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"b.jsp",out,false);
而靜態頁面則是直接將另一個頁面的內容加入到了原頁面的Servlet中。
總結起來,如果我們導入的外部頁面很少改動,我們選擇使用靜態include,如果外部頁面經常變動,我們使用動態include。
3、useBean指令
useBean指令用來創建一個javabean實例,要使用它首先我們要在項目的src目錄下創建一個包,例如abc包,然後在這個包裏創建一個javabean類,接下來我們就可以在JSP代碼中用useBean創建一個實例了。
例如:在abc包中創建一個Person類:
package abc;
public class Person {
private String name;
private int age;
public Person()
{
name="";
age=0;
}
public void setName(String n)
{
name=n;
}
public void setAge(int a)
{
age=a;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="p1" class="abc.Person" scope="page"></jsp:useBean>
</body>
</html>
這樣我們就創建了一個javabean的實例p1,並且可以通過setProperty和getProperty方法來設置和獲取p1的屬性值。在創建的時候id是我們創建的對象名稱,class是我們的javabean類名,scope則是指定了javaBean實例的作用範圍,它有四個選項:
page:只在該頁面有效。
request:只在本次請求中有效。
session:只在本次會話中有效。
application:在本web應用中一直有效。
4、setProperty指令
setProperty指令用來設置javabean實例的屬性值,例如在上個例子中我們可以用以下代碼設置p1屬性:
<jsp:setProperty property="age" name="p1" value="22"/>
<jsp:setProperty property="name" name="p1" value="wang"/>
5、getProperty指令
getproperty指令用來獲取javabean實例的屬性值,例如在上個例子中我們可以用以下代碼獲取p1屬性:
<jsp:getProperty property="name" name="p1"/>
<jsp:getProperty property="age" name="p1"/>
這兩行代碼會獲取p1的屬性值並且將其輸出。
6、plugin指令
plugin指令主要用於下載服務器端的JavaBean或者Applet到客戶端執行,由於程序要在客戶端執行,所以客戶端必須安裝虛擬機。
7、param指令
param指令用來設置參數值,這個指令必須配合include、forward或者plugin指令使用。
配合include指令代碼:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="b.jsp">
<jsp:param value="2017" name="year"/>
</jsp:include>
</body>
</html>
b,jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter("year") %>
</body>
</html>
在上面的例子中,我們在a.jsp中使用include包含b頁面,同時傳遞了一個"year=2017"的參數,然後b頁面通過request.getParameter()方法獲取參數值並使用輸出表達式輸出這個參數值,所以我們在瀏覽器中運行a.jsp會顯示一個數字2017。
配合forward指令:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="b.jsp">
<jsp:param value="2017" name="year"/>
</jsp:forward>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter("year") %>
</body>
</html>
上面的例子同樣在a中使用forward時傳遞了一個“year=2017”的參數,這個參數在b中使用request.getParamter()方法獲取。在瀏覽器中運行以後會顯示數字“2017”。
關於plugin和param指令的配合使用這裏就不舉例說明了。