0

欢迎。我正在创建 web 应用程序,堆栈:servlet,freemarker 作为视图层。我正在尝试按照 MVC 模式来做。我想在我的所有页面中包含公共页面片段 ala 菜单,其中包含指向其他服务/页面的超链接。所有页面都包含一个菜单。我必须补充一点,我的一些 servlet 映射在其他子目录中,例如:
user/editProfile
admin/statistics
admin/privileges
index
lastMessages

就像我之前说的那样,我想制作一个包含在其他页面中的通用菜单页面。当 hiperlinks 在由映射在“索引”的 servlet 呈现的模板中工作正常但已经从管理/统计号中工作时。我想我可以使用 contextPath 创建到其他网站的路径,但我不能在 freemarker 中这样做;/

4

2 回答 2

4

你绝对可以在 FreeMarker 中做到这一点,但不要这样做。FreeMarker 肯定不包含开箱即用的此类功能。与 JSP 的根本区别在于,FreeMarker 不指定任何内容(即使您将它与 Servlet-s 一起使用也不行),因此框架作者可以完全控制模板作者将看到的内容和方式。如果您想公开此类功能,请通过数据模型或通过共享变量(请参阅参考资料)Configuration.setSharedVariable或通过#import调用框架的 Java API 的 -ed FTL 来实现(Spring 做到了 AFAIR)。从模板作者的角度来看,通常只有一个变量包含所有 Web 框架功能,比如说,,fw然后你做类似的事情${fw.url('admin/statistics')},框架将扩展为绝对 URL。请注意,在示例中,模板作者不必处理高度技术性的细节,例如插入 servlet 上下文 URL。同样通过这种方式,目标可以只是一些动作标识符,然后您可以拥有另一层配置,将 URL-s 映射到动作(例如,这种灵活性对 SEO 很有用),这也意味着您可以自动发现损坏的链接。

于 2013-09-10T22:23:18.187 回答
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>
于 2014-01-20T20:12:58.850 回答