1. 程式人生 > >Java EE入門教程系列第二章JSP(三)——JSP指令與動作元件

Java EE入門教程系列第二章JSP(三)——JSP指令與動作元件

2.3 指令與動作元件

2.3.1 page指令

page指令的基本語法為:

<%@ page 屬性1="屬性1的值" 屬性2="屬性2的值"···%>

屬性值記得用“”或者‘’括起來,這樣寫比較規範,不易出錯。

舉例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

這個指令是用來設定整個JSP頁面的相關屬性和功能的,作用於整個JSP頁面,包括使用include指令而包含在該JSP頁面中的其他檔案,但是不能作用於動態的包含檔案,比如對使用<jsp:include>包含的檔案就是無效的。(兩個include語法是不同的,後面會介紹)

合法的page屬性有:import,contentType,pageEncoding,session,buffer,autoFlush,info,errorPage,isErrorPage,isThreadSafe,language,extends等,下面重點介紹幾個常用的:

1)language屬性:定義JSP頁面的指令碼語言,目前屬性值只能是java

舉例:

<%@ page language="java" %>

2)import屬性:為JSP頁面引入java核心包中的類,JSP預設import屬性已經有:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*

舉例:
 

<%@ page import="java.io.*","java.util.Date" %>

3)contentType屬性:定義頁面響應的MIME型別和頁面字元的編碼,屬性值一般為“MIME型別”或者“MIME型別;charset="編碼”,預設值是"text/html;charset=ISO-8859-1"。補充知識:charset和pagecoding的區別。

舉例:

<%@ page contentType="text/html;charset=GB2312" %>

4)session屬性:用於設定是否需要使用內建的session物件,屬性值true或false,預設前者。(這個後面會專門介紹,這裡知道屬性值即可)

舉例:

5)buffer屬性:內建輸出流out負責將伺服器的某些資訊或執行結果傳送到客戶端顯示,buffer用來指定out設定的緩衝區大小或者不使用緩衝區(取值為none),預設值是8kb.

舉例:

<%@ page buffer="24kb" %>

6)autoFlush屬性:用於指定當out的緩衝區被填滿時,緩衝區是否自動重新整理,可以取值true或false,預設前者。當屬性值設定為false時,如果緩衝區填滿,就會出現快取溢位異常(這時可以採用手動方式重新整理,即out.flush()方法),當buffer設定為none時,autoFlush不能設定為false。

7)isThreadSafe屬性:用來設定JSP頁面是否可多執行緒訪問。

8)info屬性:為頁面準備一個字串,可以在頁面中用getServletInfo()方法(當JSP被轉譯成java檔案時,轉譯成的類是Servlet的一個子類)獲得這個字串。

舉例:

<%@ page info="Hedy" %>

9)errorPage屬性:當這個屬性頁面產生異常時,系統會重定位到它屬性值的那個頁面進行異常處理。(這一塊我看別的部落格有不同的說法,但是照書上的能執行,別的部落格會出錯,不知道是伺服器版本的原因還是什麼)

舉例:

處理錯誤的proExcp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center><h1>出錯了!</h1></center>
<blockquote>您訪問的頁面正在維護中···</blockquote>
</body>
</html>

產生錯誤的errorPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page errorPage="proExcp.jsp" %>
   
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%! int i=0; %>
<%=2/i %>
errorPage.jsp:
   <%@ page isErrorPage="true" %>
   <%= exception %>
</body>
</html>

2.3.2 include指令

include指令會在JSP頁面被編譯成Servlet時引入其中包含的檔案,包含的過程是靜態的,也就是說包含的檔案會插入到<%@ include %>的地方,但是被包含的檔案既可以是靜態的HTML檔案,也可以是動態的JSP檔案,如果是後者的話,會先執行被包含的檔案,然後才執行主JSP檔案。基本語法為:

<%@ include file="relative URL" %>

注意是相對路徑,如果路徑以“/”開頭,那麼該路徑等同於參照JSP應用的上下關係路徑,如果路徑以檔名或者目錄開頭,那麼路徑就是當前JSP所在的路徑。

舉例:在include.jsp中插入computer.jsp檔案

include.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>請輸入一個正數,單擊按鈕求這個數的平方根。
<%@ include file="computer.jsp" %>

</body>
</html>

computer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page errorPage="proExcp.jsp" %>
   
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post" name="form">
<input type="text" name="ok"><br>
<input type="submit" name="submit" value="計算">
</form>
<%
String a=request.getParameter("ok");
if(a==null)
{
	a="1";
}
try{
	double number=Integer.parseInt(a);
	out.println("計算結果:"+Math.sqrt(number));
}catch(NumberFormatException e){
	out.println("請輸入數字");
}
%>
</body>
</html>

結果為:

2.3.3 taglib動作元件

後面會詳細介紹,這裡只需要知道它也是指令之一即可。

2.3.4 動作元件

動作元件是以XML語法格式出現的,所以更加符合頁面與業務邏輯分離的程式設計理念。(這一塊不需要你再去學一下XML再回來,你對HTML有一點了解這裡就能看懂了)。常見動作元件有:(動作元件標籤也要成對出現,下面都只是寫的一半,看看給的程式碼例項就能知道了)

<jsp:include>:也是引入其他檔案,但是和前面介紹的實現方法完全不同。

<jsp:forward>:從當前頁面轉向另一個頁面。

<jsp:param>:在前兩個動作元件之間傳遞引數資訊。

<jsp:plugin>:在當前頁面插入一個特定程式。

<jsp:useBean>:在當前頁面例項化一個JavaBean的類。

<jsp:setProperty>/<jsp:getProperty>::設定/獲取JavaBean物件的成員屬性。

先介紹幾個,沒介紹的後面還會專門介紹。

1、include動作元件

它是在執行時才對包含的檔案進行處理,所以引入的檔案都是最新的,是一個包含動態物件的操作,可以翻看一下前面的include體會一下不同,語法格式為:
 

<jsp:include page="filename" flush="true">

舉例:在include2.jsp中引入copyright.jsp

include2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>include動作元件舉例</h2>
<br>
<jsp:include page="copyright.jsp" flush="true"/>

</body>
</html>

copyright.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
   
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3><font color="pink">Hedy Fighting!</font></h3>
</body>
</html>

結果為:

2、forward動作元件

和include不同的是forward動作會讓當前頁面完全顯示引入的頁面,自己的不顯示,可以把上面的程式碼修改對應的那一行看看結果,語法格式為:

<jsp:forward page="filename">

3、param動作元件

不能單獨使用,語法格式為:

<jsp:include page="path" flush="true">
<jsp:param name="paramName" value="值"/>
</jsp:include>

或者

<jsp:forward page="filename">
<jsp:param name="paramName" value="值"/>
</jsp:forward>

舉例:用sendpara.jsp傳遞引數;用procpara.jsp接收引數

sendpara.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
   
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h4>帶引數的載入檔案效果:</h4>
<jsp:include page="procpara.jsp">
<jsp:param name="start" value="1"/>
<jsp:param name="end" value="100"/>
</jsp:include>
</center>

</body>
</html>

procpara.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<% 
String start=request.getParameter("start");
String end=request.getParameter("end");
int s=Integer.parseInt(start);
int e=Integer.parseInt(end);
int sum=0;
for(int i=s;i<=e;i++)
	sum+=i;
%>
<p>從<%=s %>~<%=e %>的連續和是:<%=sum %>
</body>
</html>

結果:

4、plugin動作元件

語法格式為:

<jsp:plugin
type="bean|applet" code="classFileName codebase="classFileDirectoryName"
</jsp:plugin>

type用來指定引入的物件是什麼型別的檔案,code指定類檔案的名稱,必須是以.class結尾的檔案,codebase指定這個類存在的路徑位置,如果把這個類和JSP檔案放在一起可以不寫codebase屬性。

舉例:建立一個名為Clock.java的Applet小程式,這個程式可以實時顯示時間。建立完畢後便以這個檔案,生成Clock.class檔案,然後把這個檔案複製到專案的Web資料夾。建立頁面檔案showclock.jsp,在其中使用plugin元件加入Applet小程式。

Clock.java

import java.applet.*;
import java.awt.*;
import java.util.*;
public class Clock extends Applet implements Runnable{
Thread t1,t2;
public void start() {
	t1=new Thread(this);
	t1.start();
}
	public void run() {
		t2=Thread.currentThread();
		while(t2==t1) {
			repaint();
			try {
				t2.sleep(1000);
			}
			catch(InterruptedException e) {}
		}
	}
	public void paint(Graphics g) {
		Calendar cal=new GregorianCalendar();
		String hour=String.valueOf(cal.get(Calendar.HOUR));
		String minute=String.valueOf(cal.get(Calendar.MINUTE));
		String second=String.valueOf(cal.get(Calendar.SECOND));
		g.drawString(hour+":"+minute+":"+second,20,30);
	}
}

showclock.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
   
<!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=UTF-8">
<title>Insert title here</title>
</head>
<h4>顯示系統時間</h4>
<jsp:plugin type="applet" code="Clock.class" codebase="Clock">
<jsp:fallback>
如果外掛在客戶端不能正常顯示,你就會看見我
</jsp:fallback>
</jsp:plugin>
</body>
</html>

感覺寫了一天???黑人問號,開始懷疑這個進度什麼時候能寫完這個系列了,溜了溜了~~~