比如,想在每增加頁面的地方設(shè)置一下當(dāng)前頁的title,類似于這樣:
這樣就可以定義一個名為title的組件,然后通過參數(shù)傳入標(biāo)題。
Formtitle.ftl代碼:
<#--表單標(biāo)題 -->
<#macro formTitle title="">
<script type="text/javascript" src="platform/js/jquery.corner.js"></script>
<div id="toolbar" class="page_title">
<div id="page_title"style="float:left; margin-top:3px; margin-left:5px;">
<img src="platform/images/ico.png" />${title}</div>
<div align="right" id="btns" style="padding-right:10px">
<#nested/>
</div>
</div>
<div class="clear"/>
<script language="javascript">
$('#page_title').corner("5px");
</script>
</#macro>
其中 <#macro formTitle title=""> 表示定義該組件名為 formTitle ,有一個參數(shù)title默認(rèn)值為"",其他的內(nèi)容就按照美工的設(shè)計寫就要可以了。
<#nested/> 表示可以嵌入代碼,即可以在使用時嵌入其他的內(nèi)容。
使用時:
<@formTitle title="用戶增加">
</@formTitle>
?
<@formTitle title="用戶增加">
????這里是嵌入的內(nèi)容,可以是HTML,也可以是freemarker 的內(nèi)容。
</@formTitle>
看一下實際的效果圖
?
?
freemarker之模板開發(fā)(其它之自定義指令)
----------
自定義指令可以使用macro指令來定義,這是模板設(shè)計者所關(guān)心的內(nèi)容。Java程序員若不想在模板中實現(xiàn)自定義指令,而是在java語言中實現(xiàn)指令的定義,這時可以使用:freemarker.template.TemplateDirectiveModel類來擴(kuò)展。
? ?
宏
宏是有一個變量名的模板片段。你可以在模板中使用宏作為自定義指令,這樣就能進(jìn)行重復(fù)性的工作。
如例:
macro指令自身不打印任何內(nèi)容,它只是用來創(chuàng)建宏變量,所以就會有一個名為greet的變量,在<#macro greet>和</#macro>之間的內(nèi)容(稱為宏定義體)當(dāng)使用它作為指令時將會被執(zhí)行。你可以在FTL標(biāo)記中通過@代替#來使用自定義指令。使用變量名作為指令名。而且,自定義指令的結(jié)束標(biāo)記也是需要的,如:<@greet></@greet>
因為<anything>,/anything>和<anything/>是相同的,你也可以使用:<@greet/>
宏能做的事情還有很多,因為在<#macro...>和</#macro>之間的東西是模板片段,也就是說它可以包含插值(${..})和FTL標(biāo)簽(如:<#if...>...</#if>)。
注意:程序員通常將使用<@...>,這稱為宏調(diào)用。
? ?
參數(shù)
在macro指令中,宏名稱的后面位置是用來定義變量的。如例:?
那么就可以這樣來使用這個宏:
使用預(yù)定義指令時,參數(shù)的值(=號后邊的值)可以是FTL表達(dá)式。這樣,不像HTML,"Fred"的引號就可以不用要了。<@greet person=Fred/>也意味著使用變量的值Fred作為person參數(shù),而不是字符串"Fred"。當(dāng)然參數(shù)值并不一定是字符串類型,也可以是數(shù)字,布爾值,哈希表,序列等...也可以在=號左邊使用復(fù)雜表達(dá)式(比如:someParam=(price+50)*1.25)
自定義指令可以有多個參數(shù),如: ?
那么,這個宏就可以這樣來使用:
同時也必須給出在宏中定義所有參數(shù)的值。如果你嘗試<@greet person="Fred"/>時也會發(fā)生錯誤,因為忘記指定color的值了。?
根據(jù)FTL表達(dá)式規(guī)則,明白下面這一點是至關(guān)重要的,someParam=foo和someParam="${foo}"是不同的。第一種情況,是把變量foo的值作為參數(shù)的值來使用。第二種情況則是使用插值形式的字符串,那么參數(shù)值就是字符串了,這個時候,foo的值呈現(xiàn)為文本,而不管foo是什么類型的。
宏參數(shù)的另外一個重要的方面是它們是局部變量。
? ?
嵌套內(nèi)容
自定義指令可以嵌套內(nèi)容,和預(yù)定義指令相似。如:?
注:<#nested>指令執(zhí)行位于開始和結(jié)束標(biāo)記指令之間的模板代碼段。如果這樣寫:
那么就會輸出:
如果不使用nested指令,那么嵌套的內(nèi)容就不會被執(zhí)行,前面的例子如果這樣寫:
FreeMarker不會把它視為錯誤,只是打印:
嵌套的內(nèi)容被忽略了,因為greet宏沒有使用nested指令。
? ?
宏和循環(huán)變量
像list這樣的預(yù)定義指令可以使用循環(huán)變量,如例:
用戶自定義指令,使用";"代替"as"
將會輸出:
1 Anything.
2 Anything.
3 Anything.
nested指令(當(dāng)然參數(shù)可以是任意的表達(dá)式)的參數(shù),循環(huán)變量的名稱是在自定義指令的開始標(biāo)記(<@...>)的參數(shù)后面通過分號確定的。
以下文章主要以80端口號為例,如果想知道其他的端口號也可以使用該方法..........................
1、在windows下如何查看80端口占用情況?是被哪個進(jìn)程占用?如何終止等.
??????? 這里主要是用到windows下的DOS工具,點擊"開始"--"運行",輸入"cmd"后點擊確定按鈕,進(jìn)入DOS窗口,接下來分別運行以下命令:
??????? >netstat -aon | findstr "80"
??????????????? Proto? Local Address????????? Foreign Address??????? State??????????? PID
??????????????? ====? ============????? ==============? ==========? ======
??????????????? TCP??? 0.0.0.0:80??????????????????? 0.0.0.0:0??????????????? LISTENING????? 1688
可以看出80端口被進(jìn)程號為1688的程序占用.
??????? >tasklist | findstr "1688"
圖像名??????????????????????????????????????????????? PID??????????? 會話名??????????????????? 會話#?????? 內(nèi)存使用
?????????????? ========================= ====== ================ ======== ============
?????????????? inetinfo.exe??????????????????????????????????????? 1688?????????? Console????????????????????? 0????????????? 2,800 K
很明顯,是inetinfo占用了80端口;inetinfo.exe主要用于支持微軟Windows IIS網(wǎng)絡(luò)服務(wù)的除錯,這個程序?qū)δ阆到y(tǒng)的正常運行是非常重要的.
??????? 當(dāng)然,并不是只有inetinfo.exe進(jìn)程會占用80端口,這只是我機器上的情況.如果你并不了解此進(jìn)程是干什么用的,千萬不要盲目地將其kill掉,最好先百度或Google搜索一下;當(dāng)然如果你很了解它,并確定可以終止,那么繼續(xù)下面的命令.
??????? >taskkill /pid 1688 /F
成功: 已終止 PID 為 1688 的進(jìn)程。
如果你很熟悉此進(jìn)程,并確定可以終止,那么就直接使用上面的命令把PID為1688的進(jìn)程終止.(這一步同樣可以在任務(wù)管理器中執(zhí)行,inetinfo.exe就是任務(wù)管理器中的映像名稱,選中它,點擊"結(jié)束進(jìn)程"即可)
??????? >tasklist | findstr "1688"
再次確認(rèn)是否成功終止,如果成功終止此次執(zhí)行命令后應(yīng)返回空.
2、linux下如何查看80端口占用情況?是被哪個進(jìn)程占用?如何終止等
查詢端口是否被占用,被哪個進(jìn)程占用有兩種方式:1、netstat -anl | grep "80" ;2、lsof -i:80
終止進(jìn)程的方式:kill pid
?
?
<action name="xxxAction" class="xxxBean">
<result name="success" >/success.jsp</result>
</action>
?
?xxxBean是在spring中配置的session作用域的bean.
?
@Service(value = "xxxBean")
@Scope(value = "session")
public class XxxAction {
...
}
? ?
?
想把action放到session作用域(因為一些特殊操作傳參等),但所有action都放到session會頭大的!!
?
經(jīng)過測試發(fā)現(xiàn)一個辦法,就是把不用的xxxAction在適當(dāng)?shù)臅r候從session當(dāng)中清除掉,這樣再下次使用(沒有關(guān)閉窗口的情況)的時候會再次創(chuàng)建xxxBean。
?
現(xiàn)在的難點在于什么時候清除比較合適,一般一個action都是負(fù)責(zé)一個功能,比如用戶的增、刪、改查等,不會涉及到其他對象,采購單的增、刪、改、查。這樣就可以在通過菜單切換功能(從用戶界面切到采購單界面)的時候?qū)倓偸褂玫挠脩舻?/span>action從session當(dāng)中清除。
?
基于這樣的思路,使用struts2 的攔截器(Interceptor)來監(jiān)聽特定的action,在菜單切換的時候從session中清除不用的action。
?
?
歡迎提出各種看法!
?
?
最近需要把tomcat下的項目部署到weblogic中,版本在10和12c之間選擇了。
首先來說12c 版本,主要是sfl4j 這個包中有一個錯誤,找不到方法,項目中使用的版本是1.5.8 而weblogic 12c 使用的是 1.6.X log 方法多了一個數(shù)組類型的參數(shù)。
后來降級到10.3.6 版的weblogic 部署時出現(xiàn)一系列的包沖突,主要原因是weblogic 會首先加載它自己的包,這需要在weblogic.xml中加入
<wls:container-descriptor>
????<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
?
這樣的代碼就可以了,但又出現(xiàn)
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [spring-config.xml]; nested exception is java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory
….
Caused By: java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory
….
查了好多解決辦法,主要原因是weblogic 的jar 包與程序中的jar包沖突,prefer-web-inf-classes設(shè)置為true 引起的需要刪除xml-apis-1.0.b2.jar 這個jar包才可以。
但刪除這個jar包后,又不能解析hibernate Queries ,看網(wǎng)上的解決辦法是不使用命名查詢。
因為程序中有很多命名查詢,所以也沒有刪除,最終只好暫時放棄使用weblogic了。
?