标签: freemarker

Spring + Tiles2 + Freemarker - 通过Freemarker Servlet或Spring的FreeMarkerViewResolver集成?

今天我一直在努力从Freemarker迁移到Tiles2 + Freemarker.

我的freemarker模板使用来自spring.ftl的宏.

如果我在web.xml中提供fremarker servlet,我的模型对于freemarker是可见的,但是特定的spring变量(自然地)不会填充到模型中,因为FreemarkerView对它负责.

如果我为特定的url配置一个单独的DispatcherServlet(比如"/ tpl/*")并将freemarker解析器配置为该servlet的默认视图解析器并提供UrlFilenameViewController作为默认控制器,那么特殊的spring变量会填充到模型中,但是我自己的模型是不可见:它被绑定为请求属性.我可以通过$ {Request.mymodel.myvar}访问我的模型,但这样我必须更改所有的freemarker模板,我发现这个想法有些臭.

现在我的解决方案是扩展UrlFilenameViewController并将我的模型从请求添加到ModelAndView:

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  {
        ModelAndView mav = super.handleRequestInternal(request, response);

        HashMap<String, Object> map = new HashMap<String, Object>();

        Enumeration<String> attributes = request.getAttributeNames();

        while(attributes.hasMoreElements()) {
            String attribute = attributes.nextElement();

            if("model".equals(attribute)) {
                logger.debug("FreemarkerViewController.handleRequestInternal: putting attribute to model: " + attribute + "=" + request.getAttribute(attribute));
                map.put(attribute, request.getAttribute(attribute));
            }
        }
        logger.debug("FreemarkerViewController.handleRequestInternal: VIEW: " + mav.getViewName());
        return new ModelAndView(mav.getViewName(), map);
    }
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案有点臭 - 如果我在我的业务控制器中向模型中添加一些东西,我必须在这里添加它.

我的问题有一个优雅的解决方案吗?

java spring freemarker tiles tiles2

7
推荐指数
1
解决办法
3265
查看次数

在freemarker中,是否可以在包含文件之前检查文件是否存在?

我们正在尝试在freemarker中构建一个系统,其中可以选择添加扩展文件来替换标准模板的块.

我们已经到了这一步

<#attempt>
    <#include "extension.ftl">
<#recover>
    Standard output
</#attempt>
Run Code Online (Sandbox Code Playgroud)

所以 - 如果extension.ftl文件存在,它将被使用,否则将输出recover块内的部分.

这个问题是freemarker总是记录导致恢复块触发的错误.

所以我们需要两件事之一:

  1. 如果文件不存在,请不要调用include - 因此需要检查文件是否存在.

-要么-

  1. 一种防止在恢复块内记录错误而不更改日志记录以防止出现所有freemarker错误的方法.

freemarker

7
推荐指数
1
解决办法
6090
查看次数

FreeMarker编码混乱

当我使用FreeMarker读取UTF-8编码模板时,在浏览器中正确呈现特殊字符,但freeMarkerConfig.getDefaultEncoding()返回"Cp1252".如果我设置freeMarkerConfig.setDefaultEncoding("UTF-8"),我只在浏览器中看到问号,尽管"UTF-8"是模板文件的实际编码.在每种情况下,都会发送http标头"Content-Type:text/html; charset = UTF-8".

知道什么是错的吗?

java freemarker character-encoding

7
推荐指数
2
解决办法
6652
查看次数

将Freemarker转换为PDF

我正在使用freemarker设计报告,我有一个问题,我需要PDF格式的处理输出.

我想要做的是将HTML + CSS fremarker模板传递给freemarker引擎,并将处理后的HTML作为PDF输出.我目前遇到的问题是如何将已处理的freemarker转换为PDF

    try {
        Configuration cfg = new Configuration();
        Template tpl = cfg.getTemplate("example.ftl");
        OutputStreamWriter output = new OutputStreamWriter(System.out);

        Map testHashMap = new HashMap();
        testHashMap.put("test", "testValue");

        tpl.process(testHashMap, output);

    } catch (Exception e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

在互联网上搜索时,我无法找到有关此主题的任何信息,但我发现了iText框架

try {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(doc, null);
    renderer.layout();
    OutputStream os = response.getOutputStream();
    renderer.createPDF(os);
    os.close();
} catch (Exception ex) {
    ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何将这两个代码片段组合起来生成pdf?

所有帮助都非常感谢

此致,MilindaD

java pdf template-engine freemarker itext

7
推荐指数
2
解决办法
1万
查看次数

在Freemarker中使用Java属性

HI,

messages.properties我的应用程序中有一个典型的文件.我正在尝试使用Freemarker生成电子邮件.

Freemarker模板应生成a String,之后我将String通过电子邮件发送给用户.但是,我们需要多语言.所以Properties想到了.

我的属性文件如下所示:

mail.layout.contactus=Contacteer ons
mail.layout.greeting=Hoi
Run Code Online (Sandbox Code Playgroud)

在Java中,我输入我的Properties文件HashMap:

rootMap.put("lang", (mail.getLanguage().equals(Language.FRENCH) ? langFR : langNL));
Run Code Online (Sandbox Code Playgroud)

并尝试在FreeMarker中阅读它:

<p>${lang.mail.layout.greeting} ${user.firstname},</p>
Run Code Online (Sandbox Code Playgroud)

但得到以下异常:

freemarker.core.InvalidReferenceException: Expression lang.mail is undefined on line 10, column 116 in layout/email.ftl.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它只是说lang.mail而不是lang.mail.layout.greeting

编辑: 我尝试像这样定义我的键:

mail_layout_contactus=Contacteer ons
mail_layout_greeting=Hoi
Run Code Online (Sandbox Code Playgroud)

哪个确实有效

java multilingual freemarker

7
推荐指数
1
解决办法
5596
查看次数

如何在freemarker中访问本机java?

例如,我想使用Math本机java类进行一些操作和方法.

我怎么能获得这个?

freemarker

7
推荐指数
1
解决办法
9100
查看次数

有没有一种方便的方法来格式化Freemarker中人类可读的字节大小字符串?

有很多的答案对这个问题的Java(如何字节大小转换为人类可读的格式在Java?格式文件大小为MB,GB等)和甚至对Groovy/Grails的,更何况PHP,但有一个内置或方便的方法在FreeMarker中执行此操作?

为清楚起见,我采用通用SI方法,而不是2的二进制幂.例如

      1 ? 1B
    123 ? 123B
   1000 ? 1KB
   1728 ? 1.7KB
7077888 ? 7.1MB
Run Code Online (Sandbox Code Playgroud)

等等.

鉴于FreeMarker似乎没有对数函数,有没有办法在纯FreeMarker中执行此操作,或者是我用Java创建模板方法的唯一选择.

string format freemarker numbers funnelback

7
推荐指数
2
解决办法
999
查看次数

如何使用免费标记获取列表中的第一项?

我有以下代码,其中包含大约12项,但我只需要检索第一项.如何显示列表中的第一项?

我的代码是:

<#list analysttest.rss.channel.item as item>
          <div>
                  <h3 class="bstitle">${item.title}</h3>
                  <span class="bsauthor">${item.author}</span> 
                  <span>${item.pubDate}</span>
                  <p>${item.description}</p>

          </div>
      </#list>
Run Code Online (Sandbox Code Playgroud)

html freemarker

7
推荐指数
1
解决办法
6562
查看次数

Freemarker不分配staticUtil

我在liferay 6.2上工作了应用程序显示模板,我使用freemarker帮助分页liferay的动态数据列表.当我升级到liferay 7时,这是一个问题.Liferay 7使用代码<#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)>获取记录.

旧代码:

<#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) >

它不起作用.

所以我尝试<#assign serviceLocator = staticUtil["com.liferay.portal.template.ServiceLocator"]>staticUtil得到一个错误.

以下评估为null或缺失:==> staticUtil [在模板"20115#20159#21387"第9行,第27列]提示:如果已知失败的表达式合法地引用有时为null或缺失的内容

在portal-ext.properties中我添加了:

freemarker.engine.restricted.classes=
freemarker.engine.restricted.packages=
freemarker.engine.restricted.variables= 
Run Code Online (Sandbox Code Playgroud)

freemarker liferay display-templates liferay-7

7
推荐指数
2
解决办法
4527
查看次数

Dropwizard中的Jersey过滤器设置一些全局FreeMarker变量

我正在阅读https://jersey.github.io/documentation/latest/filters-and-interceptors.htmlhttp://www.dropwizard.io/1.1.4/docs/manual/core.html#jersey-过滤器尝试使这个:

@CookieParam("User-Data") userData: String,
@HeaderParam("User-Agent") userAgent: String,
Run Code Online (Sandbox Code Playgroud)

我的网络应用程序的每个资源GET方法都不需要.userData是来自cookie的json数据,其中包含"name"和"id"等字段,并且userAgent是标题中的完整User-Agent字符串.对于我传入的每个视图:

AppUser.getName(userData), AppUser.isMobile(userAgent)
Run Code Online (Sandbox Code Playgroud)

getName函数解析json并仅返回name字段,isMobile如果找到字符串"mobile" ,函数将返回true布尔值.

我在FreeMarker中的应用程序的每个视图中使用它来显示用户的名字,并在移动设备为真时更改一些布局内容.

有没有办法减少重复次数?我宁愿每次都使用BeforeFilter来自动设置它.

java freemarker jersey dropwizard

7
推荐指数
1
解决办法
663
查看次数