程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 深入分析JavaWeb Item15 -- jsp標簽

深入分析JavaWeb Item15 -- jsp標簽

編輯:關於JSP

深入分析JavaWeb Item15 -- jsp標簽


一、JSP標簽介紹

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

二、JSP常用標簽

  jsp的常用標簽有以下三個

標簽 標簽 標簽

2.1、標簽

  標簽用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
語法:

 

  page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
  flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。

范例:使用jsp:include標簽引入資源

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%--使用jsp:include標簽引入其它JSP頁面--%>

網頁主體內容

運行結果:

這裡寫圖片描述  

2.2、標簽與include指令的區別

  標簽是動態引入, 標簽涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合並。
  
  而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合並。

  通過下面的例子來說明標簽與include指令的區別

demo.jsp:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <%!
     int i=1000;
 %>

demo.jsp中i的值為:<%=i%>

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

范例:使用@include包含內容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%!
    int i=10;
%>

JspIncludeTagDemo01.jsp中i的值為:<%=i%>

<%@include file="/jspfragments/demo.jsp"%>

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

  這裡寫圖片描述

  這個錯誤說的是變量i已經重復定義了

  運行JspIncludeTagDemo01.jsp,結果如下:

  這裡寫圖片描述

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

而如果現在使用的是動態包含的話,觀察以下程序:

范例:使用動態包含

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

JspIncludeTagDemo02.jsp

<%! int i=10; %>

JspIncludeTagDemo02.jsp中i的值為:<%=i%>

運行結果:

  這裡寫圖片描述

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

2.3、*.jspf擴展名文件在jsp:include@includec: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

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 

網頁頭部

foot.jspf

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 

網頁尾部

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

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

 <%--使用include標簽引入引入jspf頁面--%> <%@include file="/jspfragments/head.jspf" %>

網頁主體內容

<%@include file="/jspfragments/foot.jspf" %>

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

  這裡寫圖片描述

  jspf文件的內容會被解析並執行其中的jsp指令和tag,查看浏覽器解析JspIncludeTagTest.jsp頁面生成的源代碼,如下所示:

  這裡寫圖片描述

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

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%--使用jsp:include標簽引入其它JSPf頁面--%>

網頁主體內容

運行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和火狐浏覽器下運行可以看到頁面上輸出<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>,如下所示:

  這裡寫圖片描述

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

解決辦法一:修改web.xml文件,添加對擴展名為*.jspf文件的映射

如下所示:


    
        jsp
        *.jspf
    
    
    
        jsp
        *.jsp
    

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


        jsp
        *.jsp
        
        *.jspf
    

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

添加這樣的配置信息後,此時tomcat服務器就可以正常解析執行*.jspf文件了,如下所示:

  這裡寫圖片描述

解決辦法二:修改Tomcat服務器的web.xml文件,添加對擴展名為*.jspf文件的映射

找到tomcat服務器的web.xml文件,如下所示:

  這裡寫圖片描述

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


        jsp
        org.apache.jasper.servlet.JspServlet
        
            fork
            false
        
        
            xpoweredBy
            false
        
        3

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

     
     
         jsp
         *.jsp
         *.jspx
     

在這裡可以看到,名字為jsp的那個Servlet只支持*.jsp*.jspx兩種擴展名,因此可以在這個地方添加多一個*.jspf,如下所示:


    
        jsp
        *.jsp
        *.jspx
        *.jspf
    

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

2.3、標簽

  標簽用於把請求轉發給另外一個資源。
  
  語法:
  

 

  page屬性用於指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得。

范例:使用標簽跳轉頁面

forwarddemo01.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <%--使用標簽跳轉到forwarddemo02.jsp--%>
 

forwarddemo02.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 

跳轉之後的頁面!!

運行結果如下:

  這裡寫圖片描述

  從頁面的顯示效果來看,頁面已經完成了跳轉,但地址欄沒有變化,地址欄中顯示的地址還是fZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcndhcmRkZW1vMDEuanNwPC9jb2RlPqOstavSs8Pmz9TKvrXExNrI3ci0ysc8Y29kZT5mb3J3YXJkZW1vMDIuanNwPC9jb2RlPtbQtcTE2sjdoaPS8s6qtMvM+NeqyvTT2rf+zvHG97bLzPjXqqGj1rvSqsrHt/7O8cb3tsvM+Neqo6zU8rXY1rfAuNPA1LbDu9PQseS7r6GjPC9wPg0KPGg0IGlkPQ=="24jspparam標簽">2.4、標簽

  當使用標簽引入或將請求轉發給其它資源時,可以使用標簽向這個資源傳遞參數。
 
  語法1:

    
        
    

  語法2:

    
        
    

  標簽的name屬性用於指定參數名,value屬性用於指定參數值。在標簽中可以使用多個標簽來傳遞多個參數。

范例:使用標簽向被包含的頁面傳遞參數

JspIncludeTagDemo03.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

JspIncludeTagDemo03.jsp


Inc.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 

接收從JspIncludeTagDemo03.jsp頁面中傳遞過來的參數:

<%=request.getParameter("parm1")%>

<%=request.getParameter("parm2")%>

  在JspIncludeTagDemo03.jsp頁面中使用標簽將Inc.jsp頁面包含進來,使用標簽向Inc.jsp頁面傳遞了兩個參數parm1parm2

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

  這裡寫圖片描述

范例:使用標簽向要跳轉的頁面傳遞參數

forwarddemo03.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用標簽跳轉到forwarddemo04.jsp--%>
<%--使用標簽向forwarddemo04.jsp傳遞參數--%>

    
    

forwarddemo04.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 

跳轉之後的頁面!!

接收從forwarddemo03.jsp傳遞過來的參數:

ref1:<%=request.getParameter("ref1")%>

ref2:<%=request.getParameter("ref2")%>

運行結果如下:

 這裡寫圖片描述 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved