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")%>