今天我一直在努力从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)
但是这个解决方案有点臭 - 如果我在我的业务控制器中向模型中添加一些东西,我必须在这里添加它.
我的问题有一个优雅的解决方案吗?
我们正在尝试在freemarker中构建一个系统,其中可以选择添加扩展文件来替换标准模板的块.
我们已经到了这一步
<#attempt>
<#include "extension.ftl">
<#recover>
Standard output
</#attempt>
Run Code Online (Sandbox Code Playgroud)
所以 - 如果extension.ftl文件存在,它将被使用,否则将输出recover块内的部分.
这个问题是freemarker总是记录导致恢复块触发的错误.
所以我们需要两件事之一:
-要么-
当我使用FreeMarker读取UTF-8编码模板时,在浏览器中正确呈现特殊字符,但freeMarkerConfig.getDefaultEncoding()返回"Cp1252".如果我设置freeMarkerConfig.setDefaultEncoding("UTF-8"),我只在浏览器中看到问号,尽管"UTF-8"是模板文件的实际编码.在每种情况下,都会发送http标头"Content-Type:text/html; charset = UTF-8".
知道什么是错的吗?
我正在使用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
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(如何字节大小转换为人类可读的格式在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创建模板方法的唯一选择.
我有以下代码,其中包含大约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) 我在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) 我正在阅读https://jersey.github.io/documentation/latest/filters-and-interceptors.html和http://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来自动设置它.
freemarker ×10
java ×5
dropwizard ×1
format ×1
funnelback ×1
html ×1
itext ×1
jersey ×1
liferay ×1
liferay-7 ×1
multilingual ×1
numbers ×1
pdf ×1
spring ×1
string ×1
tiles ×1
tiles2 ×1