教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

JAVA培訓之include指令與taglib指令

更新時間:2016年09月23日11時06分 來源:傳智播客JAVA培訓學院 瀏覽次數(shù):

1.include指令

1.1 靜態(tài)包含
Jsp頁面中的include指令表示靜態(tài)包含,它與RequestDispatcher接口的include()方法的功能類似,但是RequestrianDispatcher接口的include()方法屬于動態(tài)包含。靜態(tài)包含的目的就是把多個JSP文件合并成一個JSP文件。
靜態(tài)包含語法格式是:<%@include file=”包含資源的路徑”%>,其中include指令只有一個屬性,就是file,它指定要包含的jsp文件路徑。例如:<%@include file=”hello.jsp”%>,這樣寫file屬性中的路徑是相對路徑,相對當前的jsp文件。
靜態(tài)包含和動態(tài)包含有一定的區(qū)別,靜態(tài)包含是運行Java文件之前將JSP文件合并,然后生成一個Java文件,最后生成一個.class文件,如圖1-1所示;而RequestrianDispatcher接口的include()方法,包含與被包含的是兩個Servlet,有兩個.class文件,在運行時將兩個Servlet的響應結果合并。

圖1-1 靜態(tài)包含
1.2 演示靜態(tài)包含
下面我們通過一個小案例來了解靜態(tài)包含,如下所示:
(1)新建一個web工程,名稱為Example3,在該應用下的WebRoot目錄下新建一個jsp文件,名稱為one.jsp,主要代碼如例1-1所示:
例1-1 one.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
  </head>
  <body>
   <%
     String name="zhangsan";
    %>
    <%@include file="/jsps/two.jsp" %>
  </body>
</html>
例1-1中,one.jsp頁面包含的頁面是jsps目錄下的two.jsp,這里使用的是絕對路徑。在one.jsp頁面中定義了一個字符串變量name。
(2)在WebRoot目錄下新建一個jsps目錄,然后在該目錄下新建一個jsp文件,名稱為two.jsp,主要代碼如例1-2所示:
例1-2 two.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
  </head>
  <body>
  <%=name %>
  </body>
</html>
例1-2中,向瀏覽器端輸出name變量的值,該變量在one.jsp頁面中定義了,因為是在翻譯成Java文件之前合并的,所以說這樣寫沒什么問題。
(3)將Example3發(fā)布到服務器中,然后啟動服務器,在瀏覽器端訪問one.jsp,瀏覽器顯示結果如圖1-1所示:

圖1-1 瀏覽器顯示結果
由圖1-1可知,服務器端出現(xiàn)錯誤,是因為什么呢?根據(jù)例1-1和例1-2可知,在one.jsp和two.jsp頁面中都定義名稱為path和basePath的字符串變量,而one.jsp和two.jsp最終會翻譯成一個Java文件中,在一個類的一個方法中定義同名變量必然會報錯,現(xiàn)在我們對two.jsp頁面進行修改,如例1-3所示:
例1-3 two.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>
<%=name %>
</body>
</html>
例1-3中,將two.jsp頁面中的與one.jsp頁面沖突的Java腳本刪除。
(4)重新啟動服務器,在瀏覽器端再次訪問one.jsp,瀏覽器顯示結果如圖1-2所示:

圖1-2 瀏覽器顯示結果
由圖1-2可知,one.jsp和two.jsp頁面合并成功。
我們知道靜態(tài)包含是在翻譯成Java文件之前合并,那么如果在one.jsp中做如下修改:
<body>
   <%
     String name="zhangsan";
     String road="/jsps/two.jsp";
    %>
    <%@include file="<%=road %>" %>
</body>
即定義一個road變量,然后在file屬性上使用Java腳本輸出road變量的值,這種方式是否可行呢?答案是不可以的,因為“<%=road%>”這句代碼只有在程序運行時才輸出“/jsps/two.jsp”,而靜態(tài)包含是在運行之前進行的,這個時候one.jsp頁面就不知道到底要包含誰,因此是不可以的。
1.3靜態(tài)包含的作用
在開發(fā)中,很可能有這樣的情況,一個頁面的頂部,左側以及底部的內容不變,只有右側的內容是變化的,這時候我們就可以將不變的部分分別設計成為各自jsp文件,然后在先前的頁面中包含這些不變化部分對應的jsp頁面,這種設計類似于框架集。那么靜態(tài)包含的作用就是把頁面分解,使用包含的方式組合在一起,這樣一個頁面中不變的部分,就是一個獨立jsp,而我們只需要處理變化的頁面。

2.taglib指令

jsp頁面中taglib指令的作用是導入標簽庫,例如:<%@taglib prefix=”c” uri=”http://java.sun.com/ jsp/jstl/ core”%>,其中prefix與uri都是taglib的屬性,taglib也只有這兩個屬性。
  • prefix:指定標簽庫在本頁面中的前綴,這個前綴可以由我們自己來取,但是建議大家使用官方規(guī)定的;
  • uri:指定標簽庫的位置;
taglib指令的prefix的屬性是為當前標簽庫指定前綴,如果一個頁面中導入了多個標簽庫,而這些標簽庫中有同名的標簽,如果不指定前綴那么就很可能有沖突,例如:<s:text/>標簽指定的是前綴為s的那個標簽庫中的<text>標簽。
由于我們還沒有學習標簽庫,所以這里對taglib指令就介紹這么多,其他知識會在后面的標簽庫中詳細介紹。

本文版權歸傳智播客Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://oisangadgets.com/javaee
0 分享到:
和我們在線交談!