javaweb學習總結(十九)——JSP標籤

來源:互聯網
上載者:User

標籤:

javaweb學習總結(十九)——JSP標籤一、JSP標籤介紹

  JSP標籤也稱之為Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供商務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。

二、JSP常用標籤

  jsp的常用標籤有以下三個

  • <jsp:include>標籤  
  • <jsp:forward>標籤  
  • <jsp:param>標籤
2.1、<jsp:include>標籤 

  <jsp:include>標籤用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
文法:
    <jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
  page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個運算式來獲得。
  flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容重新整理到用戶端。 

範例:使用jsp:include標籤引入資源

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4   <head> 5     <title>jsp的jsp:include標籤測試</title> 6   </head> 7  8   <body> 9   <%--使用jsp:include標籤引入其它JSP頁面--%>10   <jsp:include page="/jspfragments/head.jsp"/>11     <h1>網頁主體內容</h1>12     <jsp:include page="/jspfragments/foot.jsp"/>13   </body>14 </html>

運行結果:

  

2.2、<jsp:include>標籤與include指令的區別

  <jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合并。 
  而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源檔案層級進行合并。

  通過下面的例子來說明<jsp:include>標籤與include指令的區別

demo.jsp:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%!3     int i=1000;4 %>5 <h1>demo.jsp中i的值為:<%=i%></h1>

分別使用include指令和<jsp:include>標籤兩種包含語句,包含以上的demo.jsp

範例:使用@include包含內容

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%!3     int i=10;4 %>5 <h1>JspIncludeTagDemo01.jsp中i的值為:<%=i%></h1>6 <h1><%@include file="/jspfragments/demo.jsp"%></h1>

此時在編譯jsp時就已經提示出錯了,如下所示:

  

  這個錯誤說的是變數i已經重複定義了

  運行JspIncludeTagDemo01.jsp,結果如下:

  

  運行後發現出現了重複定義變數i的錯誤提示資訊,因為靜態包含是將全部內容包含進來之後,再進行處理,屬於先包含後處理。由於被包含進來的頁面demo.jsp中定義了一個變數i,而包含頁面JspIncludeTagDemo01.jsp本身又定義了一個變數i,所以伺服器在處理JspIncludeTagDemo01.jsp這個頁面時就會發現裡面有兩個重複定義的變數i,因此就會報錯。

而如果現在使用的是<jsp:include>動態包含的話,觀察以下程式:

範例:使用動態包含

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1>JspIncludeTagDemo02.jsp</h1>3 <%!4     int i=10;5 %>6 7 <h1>JspIncludeTagDemo02.jsp中i的值為:<%=i%></h1>8 <h1><jsp:include page="/jspfragments/demo.jsp" /></h1>

運行結果:

  

  發現結果已經可以正確地顯示,而且不會互相影響,這是因為使用jsp:include屬於動態包含,動態包含就是指先將各個頁面分別處理,處理完之後再將處理後的結果包含進來。
  不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合并輸出,所以這兩個頁面不要出現重複的HTML全域架構標籤,否則輸出給用戶端的內容將會是一個格式混亂的HTML文檔。

2.3、*.jspf副檔名檔案在jsp:include、@include和c:import中的區別

  JSP規範建議使用.jspf(JSP fragments)作為靜態引入檔案的副檔名。今天無意中發現,把一個JSP檔案命名為jspf副檔名,然後include到另一個jsp檔案中的,發現只有用"@include"指令的時候,jspf檔案的內容才會被解析並執行其中的jsp指令和tag,而使用"jsp:include"和JSTL的"c:import"都沒有用,jspf檔案被當作純文字檔案處理了。

比如現在有一個head.jspf頁面和foot.jspf頁面

head.jspf

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1 style="color:red;">網頁頭部</h1>

foot.jspf

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1 style="color:blue;">網頁尾部</h1>

首先使用"@include"指令將"head.jspffoot.jspf" include到IncludeTagTest.jsp頁面,如下所示:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4   <head> 5     <title>jsp的Include指令測試</title> 6   </head> 7  8   <body> 9    <%--使用include標籤引入引入jspf頁面--%>10     <%@include file="/jspfragments/head.jspf" %>11     <h1>網頁主體內容</h1>12     <%@include file="/jspfragments/foot.jspf" %>13   </body>14 </html>

  運行IncludeTagTest.jsp頁面,運行結果如下:

  

  jspf檔案的內容會被解析並執行其中的jsp指令和tag,查看瀏覽器解析JspIncludeTagTest.jsp頁面產生的原始碼,如下所示:

  

  然後再使用<jsp:include>"標籤將"head.jspffoot.jspf" include到JspIncludeTagTest.jsp頁面中,如下所示:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4   <head> 5     <title>jsp的jsp:include標籤測試</title> 6   </head> 7  8   <body> 9   <%--使用jsp:include標籤引入其它JSPf頁面--%>10   <jsp:include page="/jspfragments/head.jspf"/>11     <h1>網頁主體內容</h1>12     <jsp:include page="/jspfragments/foot.jspf"/>13   </body>14 </html>

運行JspIncludeTagTest.jsp頁面,運行結果如下:

  

  查看瀏覽器解析JspIncludeTagTest.jsp頁面產生的原始碼,如下所示:

  

  可以看到,head.jspffoot.jspf中的<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>沒有解析執行,而是原封不動地作為常值內容輸出到頁面上了,在IE下看不到<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>的輸出,在google和Firefox瀏覽器下運行可以看到頁面上輸出<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>,如下所示:

  

  這說明jspf檔案Tomcat伺服器被當作純文字檔案處理了,沒有當作jsp頁面來解析執行,那麼該如何解決這個問題呢?如何讓tomcat伺服器能夠解析執行*.jspf檔案中的java代碼和標籤呢,有如下的幾種解決辦法:

解決辦法一:修改web.xml檔案,添加對副檔名為*.jspf檔案的映射

如下所示:

 1     <!-- 讓jspf副檔名同樣成為JSP Servlet處理的檔案。 --> 2     <servlet-mapping> 3         <servlet-name>jsp</servlet-name> 4         <url-pattern>*.jspf</url-pattern> 5     </servlet-mapping> 6     <!-- 讓jsp副檔名同樣成為JSP Servlet處理的檔案。 --> 7     <servlet-mapping> 8         <servlet-name>jsp</servlet-name> 9         <url-pattern>*.jsp</url-pattern>10     </servlet-mapping>

  上面的配置方式也可以簡寫成這樣:

1     <servlet-mapping>2         <servlet-name>jsp</servlet-name>3         <url-pattern>*.jsp</url-pattern>4         <!-- 讓jspf副檔名同樣成為JSP Servlet處理的檔案。-->5         <url-pattern>*.jspf</url-pattern>6     </servlet-mapping>

  兩種寫法的效果都是一樣的。

添加這樣的配置資訊後,此時tomcat伺服器就可以正常解析執行*.jspf檔案了,如下所示:

  

解決辦法二:修改Tomcat伺服器的web.xml檔案,添加對副檔名為*.jspf檔案的映射

找到tomcat伺服器的web.xml檔案,如下所示:

  

找到名字為jsp的那個Servlet,如下所示:

 1 <servlet> 2         <servlet-name>jsp</servlet-name> 3         <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 4         <init-param> 5             <param-name>fork</param-name> 6             <param-value>false</param-value> 7         </init-param> 8         <init-param> 9             <param-name>xpoweredBy</param-name>10             <param-value>false</param-value>11         </init-param>12         <load-on-startup>3</load-on-startup>13 </servlet>

然後根據Servlet名找到對應的servlet-mapping配置,如下所示:

1     <!-- The mappings for the JSP servlet -->2     <servlet-mapping>3         <servlet-name>jsp</servlet-name>4         <url-pattern>*.jsp</url-pattern>5         <url-pattern>*.jspx</url-pattern>6     </servlet-mapping>

在這裡可以看到,名字為jsp的那個Servlet只支援*.jsp和*.jspx兩種副檔名,因此可以在這個地方添加多一個<url-pattern>*.jspf</url-pattern>,如下所示:

1     <!-- The mappings for the JSP servlet -->2     <servlet-mapping>3         <servlet-name>jsp</servlet-name>4         <url-pattern>*.jsp</url-pattern>5         <url-pattern>*.jspx</url-pattern>6         <url-pattern>*.jspf</url-pattern>7     </servlet-mapping>

  經過這樣的配置之後,Tomcat伺服器就可以正常解析和執行*.jspf檔案了。

2.3、<jsp:forward>標籤

  <jsp:forward>標籤用於把請求轉寄給另外一個資源。
  文法:
      <jsp:forward page="relativeURL | <%=expression%>" /> 
  page屬性用於指定請求轉寄到的資源的相對路徑,它也可以通過執行一個運算式來獲得。

範例:使用<jsp:forward>標籤跳轉頁面

forwarddemo01.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%--使用<jsp:forward>標籤跳轉到forwarddemo02.jsp--%>3 <jsp:forward page="/forwarddemo02.jsp"/>

forwarddemo02.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1>跳轉之後的頁面!!</h1>

運行結果如下:

  

  從頁面的顯示效果來看,頁面已經完成了跳轉,但地址欄沒有變化,地址欄中顯示的地址還是forwarddemo01.jsp,但頁面顯示的內容卻是forwardemo02.jsp中的內容。因為此跳轉屬於伺服器端跳轉。只要是伺服器端跳轉,則地址欄永遠沒有變化。

2.4、<jsp:param>標籤

  當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉寄給其它資源時,可以使用<jsp:param>標籤向這個資源傳遞參數。
  文法1:
    <jsp:include page="relativeURL | <%=expression%>">
        <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
    </jsp:include>
  文法2:
    <jsp:forward page="relativeURL | <%=expression%>">
        <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
    </jsp:include>
  <jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>標籤中可以使用多個<jsp:param>標籤來傳遞多個參數。

範例:使用<jsp:param>標籤向被包含的頁面傳遞參數

JspIncludeTagDemo03.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1>JspIncludeTagDemo03.jsp</h1>3 <hr/>4 <jsp:include page="/jspfragments/Inc.jsp">5     <jsp:param name="parm1" value="hello" />6     <jsp:param name="parm2" value="gacl" />7 </jsp:include>

Inc.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1>接收從JspIncludeTagDemo03.jsp頁面中傳遞過來的參數:</h1>3 <h2><%=request.getParameter("parm1")%></h2>4 <h2><%=request.getParameter("parm2")%></h2>

  在JspIncludeTagDemo03.jsp頁面中使用<jsp:include>標籤將Inc.jsp頁麵包含進來,使用<jsp:param/>標籤向Inc.jsp頁面傳遞了兩個參數parm1和parm2

  JspIncludeTagDemo03.jsp頁面運行結果如下:

  

 範例:使用<jsp:param>標籤向要跳轉的頁面傳遞參數

forwarddemo03.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%--使用<jsp:forward>標籤跳轉到forwarddemo04.jsp--%>3 <%--使用<jsp:param>標籤向forwarddemo04.jsp傳遞參數--%>4 <jsp:forward page="/forwarddemo04.jsp">5     <jsp:param name="ref1" value="hello" />6     <jsp:param name="ref2" value="gacl" />7 </jsp:forward>

forwarddemo04.jsp

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <h1>跳轉之後的頁面!!</h1>3 <h1>接收從forwarddemo03.jsp傳遞過來的參數:</h1>4 <h1>ref1:<%=request.getParameter("ref1")%></h1>5 <h1>ref2:<%=request.getParameter("ref2")%></h1>

運行結果如下:

  

javaweb學習總結(十九)——JSP標籤

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.