2013-09-10 31 views
0

WElcome。我正在創建Web應用程序,堆棧:servlets,freemarker作爲視圖層。我試圖按照MVC模式來做到這一點。我想包括我的所有頁面常見頁面片段ala菜單,其中包含超鏈接到其他servelts /頁面。一個菜單包含在所有頁面中。 我要補充一點,我的一些小服務程序在其他subdirectiories例如映射:
用戶/ editProfile
管理/統計
管理/權限
指數
lastMessages
在freemarker模板中獲取contextPath以鏈接其他servlets

就像我之前我說想要製作一個共同的菜單頁面,其中包含到其他頁面。當hiperlinks在由「index」映射的servlet呈現的模板中正常工作時,但已經從admin/statistics no。我認爲我可以使用contextPath創建其他網站的路徑,但我不能在freemarker中做到這一點;/

回答

3

你絕對可以在FreeMarker中做到這一點,但不。 FreeMarker當然不包含這種功能。與JSP的根本不同之處在於,FreeMarker並沒有規定任何東西(甚至沒有將它與Servlet-s一起使用),所以框架作者完全可以控制模板作者將看到什麼以及如何看待。如果您想公開此類功能,請通過數據模型或通過共享變量(請參閱Configuration.setSharedVariable)或通過調用框架的Java API(Spring執行AFAIR)的調用FTL來完成。從模板作者的角度來看,通常存在一個包含所有Web框架功能的變量,比如說,fw,然後您執行像${fw.url('admin/statistics')}這樣的框架,該框架將擴展爲絕對URL。在示例中請注意,模板作者不必處理插入servlet上下文URL等高度技術性的細節。也是這樣,目標可以只是一些動作標識符,然後你可以有另一層配置將URL-s映射到動作(這種靈活性對於SEO來說很有用),這也意味着你可以自動發現斷開的鏈接。

+0

+1 for ..幫助我 – alexgirao

1

對於那些學習和還在掙扎,像我一樣,我想與大家分享和補充@ ddekany的回答,一個可以做,在servlet:

public class FW { 
    String contextPath0; 
    String contextPath; 
    FW(HttpServletRequest request) { 
     contextPath0 = request.getContextPath(); 
     contextPath = contextPath0 + "/"; 
    } 
    public String getContextPath() { 
     return contextPath0; 
    } 
    public String url(String path) { 
     if (path.startsWith("/")) return contextPath0 + path; 
     return contextPath + path; 
    } 
} 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    request.setAttribute("fw", new FW(request)); 
    request.getRequestDispatcher("/template-00.ftl").forward(request, response); 
} 

,後來在.ftl模板

<pre style="border: 1px solid black; padding: 1em 1em 1em 1em;"> 
fw.context path: "${fw.contextPath}" 
fw.url 1: "${fw.url('/my/safe/absolute/path')}" 
fw.url 2: "${fw.url('my/safe/relative/path')}" 
</pre> 
相關問題