版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、sitemesh 學(xué)習(xí)文檔 sitemesh是opensymphony團(tuán)隊(duì)開發(fā)的j2ee應(yīng)用框架之一,旨在提高頁面的可維護(hù)性和復(fù)用性。opensymphony的另一個廣為人知的框架為webwork是用作web層的表示框架。他們都是開源的,可以在下找到。應(yīng)用于以下大項(xiàng)目的例子: 簡介: sitemesh應(yīng)用Decorator模式,用filter截取request和response,把頁面組件head,content,banner結(jié)合為一個完整的視圖。通常我們都是用include標(biāo)簽在每個jsp頁面中來不斷的包含各種header, stylesheet, scripts
2、and footer,現(xiàn)在,在sitemesh的幫助下,我們可以開心的刪掉他們了。如下圖,你想輕松的達(dá)到復(fù)合視圖模式,那末看完本文吧。 hello sitemesh: 在WEB-INF/web.xml中copy以下filter的定義: class=codeblock<filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class></filter&g
3、t;<filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern></filter-mapping><taglib> <taglib-uri>sitemesh-decorator</taglib-uri> <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location></taglib>
4、;<taglib> <taglib-uri>sitemesh-page</taglib-uri> <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location></taglib>copy所需jar和dtd文件至相應(yīng)目錄,訪問的cvs以獲取sitemesh最新版本。 sitemesh.jarWEB-INF/lib sitemesh-decorator.tldWEB-INF sitemesh-page.tldWEB-INF 建立WEB-INF/decorators.x
5、ml描述各裝飾器頁面(可仿照sitemesh例子)。 <decorators defaultdir="/_decorators"> <decorator name="main" page="main.jsp"> <pattern>*</pattern> </decorator></decorators> 建立裝飾器頁面 /_decorators/main.jsp<% page contentType="text/html; charset=GBK&
6、quot;%><% taglib uri="sitemesh-decorator" prefix="decorator" %><html> <head> <title><decorator:title default="裝飾器頁面." /></title> <decorator:head /> </head> <body> sitemesh的例子<hr> <decorator:body /> <
7、;hr>chen56 </body></html> 建立一個的被裝飾頁面 /index.jsp(內(nèi)容頁面) <% page contentType="text/html; charset=GBK"%><html> <head> <title>Agent Test</title> </head> <body> <p>本頁只有一句,就是本句.</p> </body></html> 最后訪問index.jsp,將生成如下
8、頁面: 而且,所有的頁面也會如同index.jsp一樣,被sitemesh的filter使用裝飾模式修改成如上圖般模樣,卻不用再使用include標(biāo)簽。裝飾器 decorator概念 建立可復(fù)用的web應(yīng)用程序,一個通用的方法是建立一個分層系統(tǒng),如同下面一個普通的web應(yīng)用: 前端,front-end:JSP和Servlets,或jakarta的velocity 控制層框架 Controller : (Struts/Webwork) 業(yè)務(wù)邏輯 Business :主要業(yè)務(wù)邏輯 持久化框架 :hibernate/jdo可糟糕的是前端的頁面邏輯很難被復(fù)用,當(dāng)你在每一個頁面中用數(shù)之不盡的includ
9、e來復(fù)用公共的header, stylesheet, scripts,footer時,一個問題出現(xiàn)了-重復(fù)的代碼,每個頁面必須用copy來復(fù)用頁面結(jié)構(gòu),而當(dāng)你需要創(chuàng)意性的改變頁面結(jié)構(gòu)時,災(zāi)難就愛上了你。sitemesh通過filter截取request和response,并給原始的頁面加入一定的裝飾(可能為header,footer.),然后把結(jié)果返回給客戶端,并且被裝飾的原始頁面并不知道sitemesh的裝飾,這也就達(dá)到了脫耦的目的。據(jù)說即將新出臺的Portlet規(guī)范會幫助我們標(biāo)準(zhǔn)的實(shí)現(xiàn)比這些更多更c(diǎn)ool的想法,但可憐的我還不懂它到底是一個什末東東,有興趣的人可以研究jetspeed,或J
10、SR (Java Specification Request) 168,但我想sitemesh如此簡單,我們不妨先用著。讓我們看看怎樣配置環(huán)境 除了要copy到WEB-INF/lib中的sitemesh.jar, copy到WEB-INF中的sitemesh-decorator.tld,sitemesh-page.tld文件外,還有2個文件要建立到WEB-INF/: sitemesh.xml (可選) decorators.xml sitemesh.xml 可以設(shè)置2種信息: Page Parsers :負(fù)責(zé)讀取stream的數(shù)據(jù)到一個Page對象中以被SiteMesh解析和操作。(不太常用,
11、默認(rèn)即可)Decorator Mappers : 不同的裝飾器種類,我發(fā)現(xiàn)2種比較有用都列在下面。一種通用的mapper,可以指定裝飾器的配置文件名,另一種可打印的裝飾器,可以允許你當(dāng)用http:/localhost/aaa/a.html?printable=true方式訪問時給出原始頁面以供打印(免得把header,footer等的花哨的圖片也搭上)(但一般不用建立它,默認(rèn)設(shè)置足夠了:com/opensymphony/module/sitemesh/factory/sitemesh-default.xml): 范例: <sitemesh> <page-parsers>
12、 <parser default="true" class="com.opensymphony.module.sitemesh.parser.DefaultPageParser" /> <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser" /> <parser content-type="text/html;charset=ISO-8859
13、-1" class="com.opensymphony.module.sitemesh.parser.FastPageParser" /> </page-parsers> <decorator-mappers> <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper"> <param name="config" value="/WEB-INF/decorators.xml
14、" /> </mapper> <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper"> <param name="decorator" value="printable" /> <param name="" value="printable" /> <param name="param
15、eter.value" value="true" /> </mapper> </decorator-mappers></sitemesh> decorators.xml :定義構(gòu)成復(fù)合視圖的所有頁面構(gòu)件的描述(主要結(jié)構(gòu)頁面,header,footer.),如下例:<decorators defaultdir="/_decorators"> <decorator name="main" page="main.jsp"> <pattern
16、>*</pattern> </decorator> <decorator name="printable" page="printable.jsp" role="customer" webapp="aaa" /></decorators> defaultdir: 包含裝飾器頁面的目錄 page : 頁面文件名 name : 別名 role : 角色,用于安全 webapp : 可以另外指定此文件存放目錄 Patterns : 匹配的路徑,可以用*,那些被訪問的頁
17、面需要被裝飾。 最重要的是寫出裝飾器本身(也就是那些要復(fù)用頁面,和結(jié)構(gòu)頁面)。 其實(shí),重要的工作就是制作裝飾器頁面本身(也就是包含結(jié)構(gòu)和規(guī)則的頁面),然后把他們描述到decorators.xml中。 讓我們來先看一看最簡單的用法:其實(shí)最常用也最簡單的用法就是我們的hello例子,面對如此眾多的技術(shù),我想只要達(dá)到功能點(diǎn)到為止即可,沒必要去研究太深(除非您有更深的需求)。<% page contentType="text/html; charset=GBK"%><% taglib uri="sitemesh-decorator" prefi
18、x="decorator" %><html> <head> <title><decorator:title default="裝飾器頁面." /></title> <decorator:head /> </head> <body> sitemesh的例子<hr> <decorator:body /> <hr>chen56 </body></html> 我們在裝飾器頁面只用了2個標(biāo)簽:<de
19、corator:title default="裝飾器頁面." /> : 把請求的原始頁面的title內(nèi)容插入到<title></title>中間。<decorator:body /> : 把請求的原始頁面的body內(nèi)的全部內(nèi)容插入到相應(yīng)位置。然后我們在decorator.xml中加入以下描述即可: <decorator name="main" page="main.jsp"> <pattern>*</pattern></decorator>這樣,
20、請求的所有頁面都會被重新處理,并按照main.jsp的格式重新展現(xiàn)在你面前。 讓我們看看更多的用法。(抄襲sitemesh文檔) 以下列著全部標(biāo)簽: Decorator TagsPage Tags被用于建立裝飾器頁面.被用于從原始內(nèi)容頁面訪問裝飾器.<decorator:head /><decorator:body /><decorator:title /><decorator:getProperty /><decorator:usePage /><page:applyDecorator /><page:param
21、<decorator:head />插入原始頁面(被包裝頁面)的head標(biāo)簽中的內(nèi)容(不包括head標(biāo)簽本身)。<decorator:body /> 插入原始頁面(被包裝頁面)的body標(biāo)簽中的內(nèi)容。<decorator:title default="." />插入原始頁面(被包裝頁面)的title標(biāo)簽中的內(nèi)容,還可以添加一個缺省值。例:/_decorator/main.jsp中 (裝飾器頁面): <title><decorator:title default="卻省title-hello" />
22、; - 附加標(biāo)題</title>/aaa.jsp中 (原始頁面):<title>aaa頁面</title>訪問/aaa.jsp的結(jié)果:<title>aaa頁面 - 附加標(biāo)題</title><decorator:getProperty property="." default="." writeEntireProperty="." />在標(biāo)簽處插入原始頁面(被包裝頁面)的原有的標(biāo)簽的屬性中的內(nèi)容,還可以添加一個缺省值。sitemesh文檔中的例子很好理解:The d
23、ecorator: <body bgcolor="white"<decorator:getProperty property="body.onload" writeEntireProperty="true" />>The undecorated page: <body onload="document.someform.somefield.focus();">The decorated page: <body bgcolor="white" onload
24、="document.someform.somefield.focus();">注意,writeEntireProperty="true"會在插入內(nèi)容前加入一個空格。<decorator:usePage id="." />象jsp頁面中的<jsp:useBean>標(biāo)簽一樣,可以使用被包裝為一個Page對象的頁面。 (懶的用)例:可用<decorator:usePage id="page" /> :<%=page.getTitle()%>達(dá)到<decorat
25、or:title/>的訪問結(jié)果。<page:applyDecorator name="." page="." title="." ><page:param name="."> . </page:param><page:param name="."> . </page:param></page:applyDecorator>應(yīng)用包裝器到指定的頁面上,一般用于被包裝頁面中主動應(yīng)用包裝器。這個標(biāo)簽有點(diǎn)不好理解,我們來看一個例
26、子:包裝器頁面 /_decorators/panel.jsp:<p><decorator:title /></p> . <p><decorator:body /></p> 并且在decorators.xml中有<decorator name="panel" page="panel.jsp"/>一個公共頁面,即將被panel包裝:/_public/date.jsp: . <%=new java.util.Date()%> .<decorator:getPr
27、operty property="myEmail" />被包裝頁面 /page.jsp : <title>page的應(yīng)用</title> . <page:applyDecorator name="panel" page="/_public/date.jsp" > <page:param name="myEmail"> chen_p </page:param> </page:applyDecorator>最后會是什末結(jié)果呢?除了/page.
28、jsp會被默認(rèn)的包裝頁面包裝上header,footer外,page.jsp頁面中還內(nèi)嵌了date.jsp頁面,并且此date.jsp頁面還會被panel.jsp包裝為一個title加body的有2段的頁面,第1段是date.jsp的title,第2段是date.jsp的body內(nèi)容。另外,page:applyDecorator中包含的page:param標(biāo)簽所聲明的屬性值還可以在包裝頁面中用decorator:getProperty標(biāo)簽訪問到。 可打印的界面裝飾 前面說過有1種可打印的裝飾器,可以允許你當(dāng)用http:/localhost/aaa/a.html?printable=true方式
29、訪問時,應(yīng)用其他的裝飾器(自己指定),給出原始頁面以供打印(免得把header,footer等的花哨的圖片也搭上)。 讓我們來看一看怎樣實(shí)現(xiàn)他:1.首先在WEB-INFO/sitemesh.xml中設(shè)置: <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper"> <param name="decorator" value="printable" /> <param name="paramet
30、" value="printable" /> <param name="parameter.value" value="true" /> </mapper>這樣就可以通過?printable=true來使用名為printable的裝飾器,而不是用原來的裝飾器。2.在WEB-INFO/decorators.xml中定義相應(yīng)的printable裝飾器 <decorator name="printable" page="printable.jsp&qu
31、ot;/>3.最后編寫printable裝飾器/decorators/printable.jsp <% taglib uri="sitemesh-decorator" prefix="decorator" %><html><head> <title><decorator:title /></title> <decorator:head /></head><body> <h1><decorator:title /><
32、;/h1> <p align="right"><i>(printable version)</i></p> <decorator:body /></body></html> 這樣就可以讓一個原始頁面通過?printable=true開關(guān)來切換不同的裝飾器頁面。 中文問題由于sitemesh內(nèi)部所使用的缺省字符集為iso-8859-1,直接使用會產(chǎn)生亂碼,我們可以通過以下方法糾正之: 方法1:可以在您所用的application server的配置文件中找一找,有沒有設(shè)置encoding
33、或charset的項(xiàng)目,然后設(shè)成gbk或gb2312即可 方法2:這也是我們一直使用的方法。1.在每一個jsp頁里設(shè)置: <% page contentType="text/html; charset=gbk"%> 來告訴server你所要求的字符集。2.在每個jsp頁的head中定義:<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=gbk"> 來告訴瀏覽器你所用的字符集。 總結(jié):使用sitemesh最通常的途徑:1.配置好環(huán)境, 2.在W
34、EB-INFO/decroators.xml中描述你將建立的包裝器。 3.開發(fā)在decroators.xml中描述的包裝器,最好存放在/_decorators目錄下4.ok ,可以看看辛勤的成果了 : :sitemesh,一個不錯的tiles替代方案,比tiles做的更漂亮優(yōu)雅。本文是sitemesh官方推薦的入門文檔,本來想自己翻譯的,突然發(fā)現(xiàn)有人先行一步了,就轉(zhuǎn)過來看吧。以前我通常使用舊式的方法來建立自己的web應(yīng)用:手工排版,仔細(xì)使用每一個字節(jié)使其工作在Unicode下,同時使用make文件來適應(yīng)不同的CPU或許現(xiàn)在我們可以換一種方式。盡管我從沒有感覺到需要使用assembly (CIS
35、C or RISC)來建立web應(yīng)用,但也會偶爾覺得我的開發(fā)伙伴的工作相當(dāng)繁瑣。特別是我發(fā)現(xiàn)很多的開發(fā)者在痛苦的尋求一種比較好的方式來控制web應(yīng)用的基本模塊:例如那些頁頭、頁尾、導(dǎo)航欄、打印頁面、手持設(shè)備的輕量級頁面,以及其他更多的問題。到了最后,令人驚異的是大部分人都采用了落后的includes和復(fù)制粘貼方式。根據(jù)經(jīng)驗(yàn),我可以采用在上開源的servlet 過濾器SiteMeshn來簡單明了并優(yōu)雅的解決這些問題。作為一種替代新的templating語言(XSLT)或部署您的頁面到新的系統(tǒng)的解決方法,應(yīng)用SiteMesh可以相當(dāng)容易處理你的頁面,這一切只需要普通的HTML,JSP,servle
36、t(包括Struts),以及其他常用的技術(shù)。工作原理SiteMesh利用了一種很少人知道的servlet規(guī)范實(shí)現(xiàn)了一種頁面過濾器。設(shè)想一下,現(xiàn)在有一個簡單的jsp頁面用來返回當(dāng)前的日期和時間。通常這個頁面請求來到應(yīng)用服務(wù)器,頁面被處理,最后處理結(jié)果返回到web瀏覽器。SiteMesh作為一個頁面過濾器,在頁面被處理之后,返回web瀏覽器之前,對頁面做了一些附加的操作。這個變化簡單描述為圖一和圖二所示的附加步驟。圖一:普通頁面處理情況圖二:SiteMesh對頁面處理情況現(xiàn)在看一個簡單的例子。<html><head><title>Simple Document&
37、lt;/title></head><body>Hello World! <br /><%= 1+1 %></body></html>你會發(fā)現(xiàn)這個頁面有一個title和body(類似普通的HTML頁面)。你也會發(fā)現(xiàn)一小段JSP代碼它將會如同你期望的那樣被處理。同時你可以使用任何你想使用的JSP語法和特性來替換這一小段代碼?,F(xiàn)在來看一個簡單的SiteMesh "裝飾(decorator)"頁面。列表2顯示了一個被SiteMesh調(diào)用的JSP頁面。<% taglib uri="sitem
38、esh-decorator"prefix="decorator" %><html><head><title>My Site - <decorator:title default="Welcome!" /></title><decorator:head /></head><body><h1><decorator:title default="Welcome!" /></h1><p>
39、;<decorator:body /></p><p><small>(<ahref="?printable=true">printable version</a></small></p></body></html>查看這個裝飾器(decorator),我們能看到一些有趣的東西。首先,在第一行申明了一個SiteMesh標(biāo)簽庫。這個標(biāo)簽庫包含了與原始頁面一起工作時所需的所有東西。你能看到我們使用了兩個SiteMesh的裝飾標(biāo)簽(declared tags),&l
40、t;decorator:title>和<decorator:body>。不要驚訝于標(biāo)簽<decorator:title>在原始頁面中顯示<title>標(biāo)簽中的內(nèi)容,<decorator:body>中的內(nèi)容也是如此。我們在這個頁面的HEAD和BODY元素都使用了同一個title標(biāo)簽。(We're making a few fairly radical changes to the page, including repeating the title both in theHEADelement as well as theBODY.
41、 )同時,我們還增加了一個到可打印版本頁面的鏈接。作為對照,圖三顯示了原始處理頁面,圖四顯示了被修飾過的處理頁面。留意被裝飾頁面在瀏覽器窗口顯示的標(biāo)題文字和HTML內(nèi)容。同時也可以看到增加了一個可打印頁面的鏈接這個我們回頭再說。圖三:原始未修飾頁面圖四:被修飾頁面很明顯,對比起使用include(例如<jsp:include page="foo.jsp" flush="true" />)來說,以這樣的方式使用頁頭、頁尾系統(tǒng)結(jié)構(gòu)要清晰得多。這種方式更易移植、更易理解,同時也鼓勵了JSP頁面不再使用導(dǎo)航或其他類似的表現(xiàn)層代碼。我發(fā)現(xiàn)在JSP頁面中
42、使用裝飾器和CSS的組合比標(biāo)準(zhǔn)HTML的標(biāo)簽更容易去除格式信息。安裝SiteMesh注意下面的屏幕截圖是基于Windows XP Professional,Tomcat 5.0.19,和Java 2 SDK 1.4.2_03的環(huán)境之上的。在這里我假定你的Tomcat已經(jīng)安裝完畢并且可以正常工作了。你或許會有一些混淆,但我們已經(jīng)成功地在Tomcat 4.1 和 WebLogic 測試過,同時 SiteMesh 也支持大部分的web應(yīng)用服務(wù)器。本文描述的SiteMesh 2.0.1可以在下載到。 在 上SiteMesh's 的項(xiàng)目庫中有四個文件可以下載。sitemesh-2.0.1.jar
43、是其核心 JAR 文件,sitemesh-2.0.1-sources.zip的作用正如同其名字所述,sitemesh-example.war則提供了一個復(fù)雜的例子用來顯示一些SiteMesh的高級特性。為了使描述更加簡單,我們從sitemesh-blank.war文件開始。將該WAR文件放入Tomcat 的webapps目錄,WAR包將自動解壓顯示內(nèi)容(SoSo注:這里的前提是你的tomcat已經(jīng)開始工作),如圖五所示。圖五: SiteMesh_blank.WAR解開后的內(nèi)容我們花點(diǎn)時間描述一下這些文件的作用。web.xml首先,WEB-INF/web.xml文件顯示如列表3,這些語句用來安裝
44、SiteMesh 過濾器和標(biāo)簽庫。如果你決定在一個已有的Web應(yīng)用中使用SiteMesh,你必須把這些語句添加到你的WEB-INF/web.xml文件中。<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-/Sun Microsystems, Inc./DTD Web Application 2.3/EN""<web-app><!- Start of SiteMesh stuff -><fi
45、lter><filter-name>sitemesh</filter-name><filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class></filter><filter-mapping><filter-name>sitemesh</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping><
46、;taglib><taglib-uri>sitemesh-page</taglib-uri><taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location></taglib><taglib><taglib-uri>sitemesh-decorator</taglib-uri><taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location><
47、/taglib><!- End of SiteMesh stuff -></web-app>注意:這里需要注意一下url-pattern的寫法- 如果使用的是Tomcat 5(而不是 Tomcat 4 ),需要將默認(rèn)的*修改如*.jsp的形式。最新的servlet規(guī)范不再支持*樣式。decorators.xmlWEB-INF/decorators.xml文件用來將一個裝飾器名字同一個專門的JSP裝飾文件綁定。作為一個例子,這里將JSP裝飾文件minimal.jsp同一個稱為handheld的裝飾器綁定起來。<decorators defaultdir=&qu
48、ot;/decorators"><decorator name="main" page="main.jsp"><pattern>*</pattern></decorator><decorator name="panel" page="panel.jsp"/><decorator name="printable" page="printable.jsp"/></decorators&g
49、t;正如我們在代碼列表里看到的一樣,我們定義了三個裝飾器,他們分別綁定了三個類似的JSP頁面。我們可以看到一個默認(rèn)裝飾器(main.jsp),它將被默認(rèn)運(yùn)用于所有文件。缺省的,SiteMesh使用下面的邏輯來選擇使用哪一個裝飾器: 這個邏輯在sitemesh-2.0.1.jar包的comopensymphonymodulesitemeshfactorsitemesh-default.xml文件里被描述。你可以針對諸如:客戶端操作系統(tǒng),web瀏覽器,用戶代理等在WEB-INFsitemesh.xml文件里,通過一個變量覆蓋這個行為。(You can override this behavior.
50、 with a wide variety ofbuilt-in mappersfor things like language, client operating system, web browser/user agent, etc. by creating aWEB-INFsitemesh.xmlfile. )可以在sitemesh-example.war找到例子。頁面是否使用meta裝飾器標(biāo)簽(meta. decorator tag)特別指定了一個裝飾器? 頁面是否是一個框架集(是的話則不應(yīng)用裝飾器)? 頁面是否使用了printable=true參數(shù)(是的話則使用打印裝飾器) 頁面時候使
51、用裝飾器文件名特別指定了一個裝飾器? 頁面是否匹配decorators.xml文件里描述的樣式? 通常第一條規(guī)則僅用來確定該裝飾器是否被使用(Conceptually, the first rule that evaluates to true determines the decorator that is used. )在上面的例子中,當(dāng)出現(xiàn)printable=true參數(shù)的時候,裝飾器printable.jsp(規(guī)則 #3)替代了main.jsp(規(guī)則 #5)。在SiteMesh中,這些規(guī)則被描述為mappers。decorators/*.jsp這三個decorators目錄下的文件是d
52、ecorators.xml文件中描述的不同裝飾器JSP文件。上面是一個簡單的裝飾器例子,在后面我們將討論更復(fù)雜的示例。sitemesh-2.0.1.jar這是SiteMesh最主要的二進(jìn)制文件,通常被安裝在WEB-INF/lib目錄下??梢栽?.tldSiteMesh使用兩個標(biāo)簽庫,但大多數(shù)人都只需要sitemesh-decorator.tld。你可以在SiteMesh高級特性SiteMesh的一個重要特性是使用原始HTML的meta標(biāo)簽(例如<meta. name="foo" c>)從基礎(chǔ)頁面?zhèn)鬟f信息到裝飾器。作為一個例子,下面我們使用一個meta標(biāo)簽來定義HTML頁面的作者。<html><meta. name="author" c><head><title>Simple Document</title></head><body>Hello World! <br /><%= 1+1 %></body></html>我們定義一個“smart”裝飾器來研究meta標(biāo)簽,如果出現(xiàn)這個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024個人的簡單借款合同
- 國際貿(mào)易協(xié)議樣本
- 廠房租賃合同范例
- 特色農(nóng)產(chǎn)品胡柚購銷合同法律問題探討
- 共同投資開設(shè)武術(shù)館協(xié)議
- 標(biāo)準(zhǔn)入職協(xié)議書范例
- 旅行社與導(dǎo)游勞動合同范本
- 2023年高考地理第一次模擬考試卷-(湖南A卷)(全解全析)
- 房地產(chǎn)代理合同模板
- 2024年建筑渣土運(yùn)輸合同范文
- 山西省太原市2024-2025學(xué)年高三上學(xué)期期中物理試卷(含答案)
- 酒店崗位招聘面試題與參考回答2025年
- (統(tǒng)編2024版)道德與法治七上10.1愛護(hù)身體 課件
- GB/T 30391-2024花椒
- 供電線路維護(hù)合同
- 胸部術(shù)后護(hù)理科普
- 鞋子工廠供貨合同模板
- 2024碼頭租賃合同范本
- 木材采運(yùn)智能決策支持系統(tǒng)
- 【產(chǎn)業(yè)圖譜】2024年青島市重點(diǎn)產(chǎn)業(yè)規(guī)劃布局全景圖譜(附各地區(qū)重點(diǎn)產(chǎn)業(yè)、產(chǎn)業(yè)體系布局、未來產(chǎn)業(yè)發(fā)展規(guī)劃等)
- 上海市市轄區(qū)(2024年-2025年小學(xué)四年級語文)部編版期末考試(下學(xué)期)試卷及答案
評論
0/150
提交評論