tokuhirom's blog

Spring の Freemarker で参照可能な変数について

Spring で freemarker を利用している場合、いくつかの変数がデフォルトで利用可能になっている。

    protected SimpleHash buildTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
        AllHttpScopesHashModel fmModel = new AllHttpScopesHashModel(getObjectWrapper(), getServletContext(), request);
        fmModel.put(FreemarkerServlet.KEY_JSP_TAGLIBS, this.taglibFactory);
        fmModel.put(FreemarkerServlet.KEY_APPLICATION, this.servletContextHashModel);
        fmModel.put(FreemarkerServlet.KEY_SESSION, buildSessionModel(request, response));
        fmModel.put(FreemarkerServlet.KEY_REQUEST, new HttpRequestHashModel(request, response, getObjectWrapper()));
        fmModel.put(FreemarkerServlet.KEY_REQUEST_PARAMETERS, new HttpRequestParametersHashModel(request));
        fmModel.putAll(model);
        return fmModel;
    }

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java#L295-L304

これはつまり、Freemarker がデフォルトで提供している Servlet と同等の変数を埋めているということになる。 参考: http://freemarker.incubator.apache.org/docs/pgui_misc_servlet.html

  • JspTaglibs
  • Application
  • Session
  • Request
  • RequestParameters

といった値が利用可能なので、場合によったら利用してもよい。(controller できちんと処理したほうがよいケースも多いので、乱用しないように気をつけるべし)

たとえば、Spring Security の login form などは以下のように書けばよいってなわけ。(というか spring security のサンプルコードが thymeleaf だったので悩んでて見つけた)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
>
<head>
    <title>Spring Security Example </title>
</head>
<body>
<#if RequestParameters.error??>
Invalid username and password.
</#if>
<#if RequestParameters.logout??>
You have been logged out.
</#if>
<form action="/login" method="post">
    <div><label> User Name : <input type="text" name="username"/> </label></div>
    <div><label> Password: <input type="password" name="password"/> </label></div>
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
    <div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>
Created: 2016-05-02 14:24:54 +0900
Updated: 2016-05-02 14:24:54 +0900