国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JSP > 正文

include與jsp:include與s:action與s:include與iframe用法匯總

2019-11-08 02:59:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

include與jsp:include與s:action與s:include與iframe用法匯總

1.<%@ include file="../top/top.jsp"%> 2.<jsp:include page="coupon.jsp"/> 3.<iframe src="" width="100%" height="200" ></iframe> 4.<s:include value="/CMS/headers/wrap/header.jsp"/> 5.<s:action name="cmsPoint" namespace="/include"/> jsp開(kāi)發(fā)時(shí),這五種常用的頁(yè)面引入標(biāo)簽,到底有什么區(qū)別,各自適應(yīng)場(chǎng)合是什么,相信很多人都不陌生,但又感覺(jué)莫林兩可的,本文將做一個(gè)全面的匯總。 注:本文雖然各方面都涉及到了,但是很多細(xì)節(jié)還沒(méi)列出來(lái),后續(xù)在開(kāi)發(fā)中還會(huì)不斷總結(jié)不斷完善,希望與廣大it從業(yè)的朋友們多交流,共同進(jìn)步。 ------------------------------------------------------------------------------ 首先看include和jsp:include <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 前者是指令元素、后者是行為元素。具體它們將在何處用?如何用及它們有什么區(qū)別?這該是很多人看到它都會(huì)想到的問(wèn)題。下面一起來(lái)看看吧。 通常當(dāng)應(yīng)用程序中所有的頁(yè)面的某些部分(例如標(biāo)題、頁(yè)腳和導(dǎo)航欄)都相同的時(shí)候,我們 就可以考慮用include。具體在哪些時(shí)候用<%@ include file=” ”%>,哪些時(shí)候用 <jsp:include page=” ” flush=”true”/>.這種形式。首先要明白的是它們之間的區(qū)別 。只有了解了它們用法的不同才理解該在何時(shí)去用以及如何選擇。 <%@ include file=” ”%>,jsp的include指令元素讀入指定頁(yè)面的內(nèi)容。并把這些內(nèi)容和原來(lái)的頁(yè)面融合到一起。(這個(gè)過(guò)程是在翻譯階段:也就是jsp被轉(zhuǎn)化成servlet的階段進(jìn)行的 。) 這里對(duì)翻譯階段進(jìn)行一下說(shuō)明:我們知道,jsp頁(yè)面不能原封不動(dòng)地被傳送給瀏覽器,所有的 jsp元素都必須首先由服務(wù)器進(jìn)行處理。這是通過(guò)將jsp頁(yè)面轉(zhuǎn)達(dá)化成servlet,然后執(zhí)行這個(gè)servlet來(lái)完成的。服務(wù)器需要一個(gè)jsp容器來(lái)處理jsp頁(yè)面。jsp容器通常以servlet的形式來(lái)實(shí)現(xiàn),這個(gè)servlet經(jīng)過(guò)配置,可以處理對(duì)jsp頁(yè)面的所有請(qǐng)求。 Jsp容器負(fù)責(zé)將jsp頁(yè)面轉(zhuǎn)化成servlet(稱(chēng)為jsp頁(yè)面實(shí)現(xiàn)類(lèi)?JSP Page implementation class),并編譯這個(gè)servlet。這兩步就構(gòu)成了翻譯階段. 由此我們就會(huì)知道:jsp頁(yè)面是把include指令元素所指定的頁(yè)面的實(shí)際內(nèi)容(也就是代碼段 )加入到引入它的jsp頁(yè)面中,合成一個(gè)文件后被jsp容器將它轉(zhuǎn)化成servlet。可以看到這時(shí) 會(huì)產(chǎn)生一個(gè)臨時(shí)class文件和一個(gè)java文件。下面舉個(gè)例子。 服務(wù)器用tomcat,引入頁(yè)面的jsp文件叫test.jsp。被引入的頁(yè)面叫date.jsp.這個(gè)jsp文件 里存放的是一個(gè)有關(guān)時(shí)間的jsp代碼,當(dāng)前的上下文根設(shè)為test //======date.jsp的源文件=====// Html代碼  收藏代碼<%@ page language=”java” c%>   <%   java.util.Date date=new java.util.Date();   String date_cn ="";   String dateStr = "";   switch(date.getDay())   {   case 0:date_cn ="日"; break;   case 1:date_cn ="一"; break;   case 2:date_cn ="二"; break;   case 3:date_cn ="三"; break;   case 4:date_cn ="四"; break;   case 5:date_cn ="五"; break;   case 6:date_cn ="六"; break;   }   dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" +     date.getDate() + "日(星期" + date_cn + ")";   %>   document.write("<%=dateStr%>");   //======以下是test.jsp的源文件=============// Html代碼  收藏代碼<%@ page language=”java” contentType=”text/html;charset=gb2312”%>   <html>   <head>   <title>include的兩種用法</title>   <jsp:include page=”date.jsp” flush=”true”/>   <%--@ include file=”date.jsp” %-->   //我們?cè)谶@里用include的兩種不同形式來(lái)引入date.jsp這個(gè)文件.   <head>   <body>   <table><tr><td>   有關(guān)jsp中include的兩種用法.敬請(qǐng)關(guān)注。   </td></tr></table>   </body>   </html>   在test.jsp 文件中,我們只輸出了一行文本“ 有關(guān)jsp中include的兩種用法.敬請(qǐng)關(guān)注。 ”,現(xiàn)在讓我們先用<%@ include file=”date.jsp” %>這種形式引入date.jsp這個(gè)文件。 你想會(huì)出現(xiàn)什么問(wèn)題了嗎?此時(shí)出現(xiàn)了錯(cuò)誤提示: HTTP Status 500 ? org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType 以下還有一堆錯(cuò)誤,但我們只要看這里就知道問(wèn)題的所在了。狀態(tài)碼為http 500服務(wù)器內(nèi)部 錯(cuò)誤。再看下面的提示。在date.jsp頁(yè)面中不能指定多個(gè)contentType. 原因就在這里了。 是因?yàn)樵诜g階段,date.jsp文件的代碼被原封不動(dòng)地加入到了test.jsp頁(yè)面從而合成一個(gè) 文件。合成后的文件中就會(huì)相同的: <%@ page language=”java” contentType=”text/html;charset=gb2312”%> 這句代碼。解決的辦法是把date.jsp文件中的這句刪掉。刷新后再請(qǐng)求test.jsp頁(yè)面 請(qǐng)求test.jsp在頁(yè)面顯示如下 2003年12月10日 13:12:40 這時(shí)我們還不能發(fā)現(xiàn)什么。還是去查看tomcat下的臨時(shí)文件吧。到那里去看看date.jsp文件 的內(nèi)容是否已被加入到了test.jsp文件中。 在目錄下會(huì)看到test_jsp.java和test_jsp.class兩個(gè)文件. 這里的java文件就是jsp容器將jsp轉(zhuǎn)化成了servlet而得到的test_jsp.java這個(gè)文件。相對(duì) 應(yīng)的test_jsp.class這 個(gè)文件就是編譯test_jsp.java這個(gè)servlet文件產(chǎn)生的類(lèi)文件了。 打開(kāi)所產(chǎn)生的servlet文件(test_jsp.java),此時(shí) 我們會(huì)發(fā)現(xiàn),在test.jsp 文件被轉(zhuǎn)化 成servlet文件時(shí),在輸出的<haed>之間加入了一些不是test.jsp頁(yè)面里面的代碼,新加入的 內(nèi)容就是 date.jsp里面的代碼: 新加入了哪些內(nèi)容或是否真的加入了新的內(nèi)容請(qǐng)自己測(cè)試 去看一下就會(huì)一目了然了.在這里不再詳述. 以上就是我們用<%@ include file=”date.jsp”%>這種形式得到的結(jié)果. 下面我們換用<jsp:include page=”dae.jsp” flush=”true”/>也就是將 <%@ include file=”date.jsp”%>換成<jsp:include page=”dae.jsp” flush=”true”/>,然后請(qǐng)求test.jsp. 2003? ê 12??10?? 13:30:13 此時(shí)會(huì)在頁(yè)面上看見(jiàn).我們所引入date.jsp輸出的日期中中文出現(xiàn)了亂碼.什么原因?是因?yàn)?nbsp;include行為元素是在請(qǐng)求處理階段執(zhí)行的(此處要對(duì) 請(qǐng)求處理階段進(jìn)行說(shuō)明一下,Jsp容器 除了上面提到的負(fù)責(zé)將jsp頁(yè)面轉(zhuǎn)化成servlet外,還負(fù)責(zé)調(diào)用jsp頁(yè)面實(shí)現(xiàn)類(lèi)以處理每個(gè)請(qǐng)求 并產(chǎn)生應(yīng)答.這 個(gè)階段我們就稱(chēng)為請(qǐng)求處理階段.請(qǐng)求處理階段僅執(zhí)行類(lèi)文件)。 所以在我們作include行為元素引入頁(yè)面時(shí),實(shí)際只是引用了date.jsp這個(gè)文件被轉(zhuǎn)化并被編 譯后產(chǎn)生的servlet類(lèi)文件.既如此, date.jsp就是作為一個(gè)單獨(dú)的文件在執(zhí)行后才被 test.jsp文件運(yùn)行時(shí)調(diào)用.由于date.jsp文件中沒(méi)有指定字符編碼.所以出現(xiàn)了亂碼.解 決辦 法是在date.jsp文件中重新把剛才去掉的 <%@ page language=”java” contentType=”text/html;charset=gb2312”%> 這行語(yǔ)句加入后刷新重新運(yùn)行.此時(shí)頁(yè)面顯示正確,并跟用include指令正常運(yùn)行時(shí)一樣.再查 看tomcat下的臨時(shí)文件會(huì)發(fā)現(xiàn).此時(shí)多出了一個(gè) date_jsp.java文件和一個(gè)date_jsp.class 文件.這兩個(gè)文件得來(lái)的方式跟test_jsp.java和 test_jsp.class文件得來(lái)的方式一樣.再查 看一下此時(shí)test_jsp.java文件的代碼會(huì)發(fā)現(xiàn).此時(shí)只新增加了一句代碼: JsPRuntimeLibrary.include(request, response, "date.jsp", out, true); 它并沒(méi)有把date.jsp文件的代碼加入到test.jsp.只是在運(yùn)行時(shí)引入了date.jsp頁(yè)面執(zhí)行后 所產(chǎn)生的應(yīng)答.這意味著我們可以指定任何能 夠產(chǎn)生應(yīng)答的Web資源,(例如一個(gè)servlet或一 個(gè)jsp頁(yè)面),只要這些資源所產(chǎn)生的類(lèi)型和jsp頁(yè)面產(chǎn)生的內(nèi)容類(lèi)型相同.JSP容器將通過(guò)一個(gè) 內(nèi)部的函數(shù)調(diào)用來(lái)執(zhí)行指定的資源.因此,這些被引入的資源可以幫助處理原來(lái)的請(qǐng)求,所以 這些資源可以訪(fǎng)問(wèn)請(qǐng)求作用域內(nèi)的所有對(duì)象.以及所有原來(lái)的請(qǐng)求參 數(shù). 由于在主頁(yè)面被請(qǐng)求時(shí),這些頁(yè)面還沒(méi)有被引入到主頁(yè)面中,所以你可以對(duì)page屬性使用一個(gè) 請(qǐng)求時(shí)屬性值,以便根據(jù)運(yùn)行時(shí)的情況來(lái)決定要引入哪一個(gè)頁(yè)面.還可以添加一些將被引入的 頁(yè)面讀取的請(qǐng)求參數(shù). <jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” > <jsp:param name=”fitstParamer” value=”firstValue”> <jsp:param name=”lastParamer” value=”lastValue”> </jsp:include> 如果修改了被引入的jsp頁(yè)面,那么可以立刻使用該頁(yè)面的最新版本,這是因?yàn)閷?duì)待被引入的 頁(yè)面的方式與對(duì)待由瀏覽器直接調(diào)用的jsp頁(yè)面的方式完全相同.即容器檢測(cè)頁(yè)面的變化,并 自動(dòng)進(jìn)入翻譯階段,以得到頁(yè)面的最新版本. (注意,include行為元素同jsp其它元素一樣,沒(méi)有行為體時(shí)要以”/”結(jié)束.就像下面這樣. <jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” />) 以下是對(duì)include 兩種用法的區(qū)別 主要有兩個(gè)方面的不同; 一:執(zhí)行時(shí)間上: <%@ include file=”relativeURI”%> 是在翻譯階段執(zhí)行 <jsp:include page=”relativeURI” flush=”true” /> 在請(qǐng)求處理階段執(zhí)行. 二:引入內(nèi)容的不同: <%@ include file=”relativeURI”%> 引入靜態(tài)文本(html,jsp),在JSP頁(yè)面被轉(zhuǎn)化成servlet之前和它融和到一起. <jsp:include page=”relativeURI” flush=”true” />引入執(zhí)行頁(yè)面或servlet所生成的 應(yīng)答文本. 另外在兩種用法中file和page屬性都被解釋為一個(gè)相對(duì)的URI.如果它以斜杠開(kāi)頭,那么它就 是一個(gè)環(huán)境相關(guān)的路徑.將根據(jù)賦給應(yīng)用程序的URI的前綴進(jìn)行解釋,如果它不是以斜杠開(kāi)頭, 那么就是頁(yè)面相關(guān)的路徑,就根據(jù)引入這個(gè)文件的頁(yè)面所在的路徑進(jìn)行解釋. ------------------------------------------------------------------------- 如果用了struts2框架,則還有以下的用法。 <s:include value="/header.jsp"> <s:param name="mKeyWords"> <s:property value="couponDetailVO.storeName"/>團(tuán)購(gòu)</s:param> </s:include> <s:action name="cmsPoint" namespace="/include" executeResult="true" ignoreContextParams="true"> <s:param name="type" value="'headers/new/include'"></s:param> <s:param name="match" value="'footer_950'"></s:param> <s:param name="query" value="'city='+oldCity"></s:param> </s:action> 使用action標(biāo)簽,可以允許在jsp頁(yè)面中直接調(diào)用Action,在調(diào)用Action時(shí)候,可以指定需要被 調(diào)用的Action的name和namespace.如果指定了executeResult參數(shù)的屬性值為true,該標(biāo)簽會(huì) 把Action的處理結(jié)果(視圖資源)包含到本頁(yè)面中. 使用action標(biāo)簽指定屬性有: id: 可選屬性,作為該Action的引用ID    name:必選屬性,指定調(diào)用Action    namespace:可選屬性,指定該標(biāo)簽調(diào)用Action所屬namespace    executeResult:必選屬性,指定是否將Action的處理結(jié)果包含到本頁(yè)面中.默認(rèn)值為false,不 包含.    ignoreContextParam:可選參數(shù),指定該頁(yè)面的請(qǐng)求參數(shù)是否需要傳入調(diào)用的Action中,默認(rèn) 值是false,即傳入?yún)?shù).  下面看一個(gè)完整的調(diào)用示例: Html代碼  收藏代碼<%@ page language="java" contentType="text/html; charset=utf-8"      pageEncoding="utf-8"%>      <%@taglib prefix="s" uri="/struts-tags" %>  <!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>  <s:action name="head!toHead" executeResult="true">  <s:param name="headName">s.action測(cè)試</s:param>  </s:action>  </body>  </html>  struts.xml Xml代碼  收藏代碼<!--測(cè)試一些頁(yè)面引入標(biāo)簽 -->  <action name="head" class="com.SactionIncludeTest">    <result name="head">/head.jsp</result>  </action>  </package>  Java代碼  收藏代碼package com;    import javax.servlet.ServletContext;  import javax.servlet.http.HttpServletRequest;    import org.apache.struts2.ServletActionContext;    import com.opensymphony.xwork2.ActionSupport;    public class SactionIncludeTest extends ActionSupport  {      private String headName;                  public String getHeadName() {          return headName;      }          public void setHeadName(String headName) {          this.headName = headName;      }          public String toHead(){          HttpServletRequest request=ServletActionContext.getRequest();          String attrHeadName=(String)request.getAttribute("headName");          System.out.println("attrHeadName:"+attrHeadName);          System.out.println("headName:"+this.getHeadName());          //可以通過(guò)以上兩種方式獲取到s.param的傳值,而下面的方法是接收不    到值的。                    String paramHeadName=request.getParameter("headName");          System.out.println("paramHeadName:"+paramHeadName);          return "head";                }  }  head.jsp Html代碼  收藏代碼<%@ page language="java" contentType="text/html; charset=utf-8"      pageEncoding="utf-8"%>  <%@ taglib prefix="s" uri="/struts-tags" %>  this is head content!  this is head content!  this is head content!  this is head content!  this is head content!  this is head content!<br/>  <s:property value="#request.headName" />  ----------------------------------- s:include的用法 s:include的效果與jsp:include效果是一樣的,一般我習(xí)慣用jsp:include 下面給一個(gè)完整示例: s-include.jsp Html代碼  收藏代碼<%@ page language="java" contentType="text/html; charset=utf-8"      pageEncoding="utf-8"%>  <%@ taglib prefix="s" uri="/struts-tags" %>  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  <title>Insert title here</title>  </head>  <body>  <s:include value="/foot.jsp">  <s:param name="footName">test footName!</s:param>  </s:include>  </body>  </html>  foot.jsp Jsp代碼  收藏代碼<%@ page language="java" contentType="text/html; charset=utf-8"      pageEncoding="utf-8"%>  <%@ taglib prefix="s" uri="/struts-tags" %>  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  <title>Insert title here</title>  </head>  <body>  This is foot!<br/>  可行的:<%=request.getParameter("footName") %>  可行的:${param.footName }<br/>  //寫(xiě)面幾種方式都是錯(cuò)誤的<br/>  requset.footName:<s:property value="#requset.footName" /><br/>  s-param.type:<s:property value="param.footName"/> <br/>  parameters.type:<s:property value="#parameters.footName"/><br/>  </body>  </html>  ------------------------------------------------------------------- iframe用法 iframe的src可以指向任何地址,它加載的是一個(gè)完整的dom模型。 include與jsp:include的歸納參考了一個(gè)兄弟的博客,他總結(jié)的非常清晰: http://www.cnblogs.com/Ghost-Draw-Sign/articles/1835974.html 總的來(lái)說(shuō): include與jsp:include用的比較多,基本可以滿(mǎn)足要求了. s:action在與s:include用的相對(duì)少一點(diǎn)。 iframe也很常用,不過(guò)據(jù)說(shuō)它不利于搜索引擎。 
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 墨玉县| 郎溪县| 县级市| 关岭| 湘乡市| 彝良县| 广南县| 霍山县| 钟祥市| 田林县| 丹巴县| 榆中县| 宁南县| 临朐县| 芮城县| 龙里县| 安义县| 马边| 开封市| 买车| 江阴市| 新津县| 安图县| 攀枝花市| 陵水| 松原市| 万载县| 荆门市| 甘南县| 荥阳市| 土默特左旗| 平定县| 顺平县| 布尔津县| 新巴尔虎左旗| 永宁县| 固安县| 和田市| 佛山市| 临桂县| 嫩江县|