JSP標簽也稱之為Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。
jsp的常用標簽有以下三個
標簽 標簽 標簽
標簽 標簽用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
語法:
page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
范例:使用jsp:include標簽引入資源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用jsp:include標簽引入其它JSP頁面--%>
網頁主體內容
運行結果:
標簽與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文檔。
*.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
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
網頁頭部foot.jspf
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
網頁尾部首先使用”@include“指令將”head.jspf和foot.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.jspf和foot.jspf” include到JspIncludeTagTest.jsp頁面中,如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用jsp:include標簽引入其它JSPf頁面--%>
網頁主體內容
運行JspIncludeTagTest.jsp頁面,運行結果如下:

查看浏覽器解析JspIncludeTagTest.jsp頁面生成的源代碼,如下所示:

可以看到,head.jspf和foot.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兩種擴展名,因此可以在這個地方添加多一個,如下所示:
jsp
*.jsp
*.jspx
*.jspf
經過這樣的配置之後,Tomcat服務器就可以正常解析和執行*.jspf文件了。
標簽 標簽用於把請求轉發給另外一個資源。
語法:
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"%>
跳轉之後的頁面!!運行結果如下:

從頁面的顯示效果來看,頁面已經完成了跳轉,但地址欄沒有變化,地址欄中顯示的地址還是 當使用 語法2: 范例:使用 JspIncludeTagDemo03.jsp Inc.jsp 在 JspIncludeTagDemo03.jsp頁面運行結果如下: 范例:使用 forwarddemo03.jsp forwarddemo04.jsp 運行結果如下: fZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcndhcmRkZW1vMDEuanNwPC9jb2RlPqOstavSs8Pmz9TKvrXExNrI3ci0ysc8Y29kZT5mb3J3YXJkZW1vMDIuanNwPC9jb2RlPtbQtcTE2sjdoaPS8s6qtMvM+NeqyvTT2rf+zvHG97bLzPjXqqGj1rvSqsrHt/7O8cb3tsvM+Neqo6zU8rXY1rfAuNPA1LbDu9PQseS7r6GjPC9wPg0KPGg0IGlkPQ=="24jspparam標簽">2.4、標簽
和標簽引入或將請求轉發給其它資源時,可以使用標簽向這個資源傳遞參數。
語法1:
標簽的name屬性用於指定參數名,value屬性用於指定參數值。在和標簽中可以使用多個標簽來傳遞多個參數。標簽向被包含的頁面傳遞參數
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JspIncludeTagDemo03.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
接收從JspIncludeTagDemo03.jsp頁面中傳遞過來的參數:<%=request.getParameter("parm1")%><%=request.getParameter("parm2")%>JspIncludeTagDemo03.jsp頁面中使用標簽將Inc.jsp頁面包含進來,使用標簽向Inc.jsp頁面傳遞了兩個參數parm1和parm2
標簽向要跳轉的頁面傳遞參數
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--使用
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
跳轉之後的頁面!!接收從forwarddemo03.jsp傳遞過來的參數:ref1:<%=request.getParameter("ref1")%>ref2:<%=request.getParameter("ref2")%>