FreeMarker是一个基于Java的模板引擎,是一个基于模板生成文本输出(从HTML到自动生成的源代码)的通用工具。它是一个Java包,是Java程序员的类库。它本身并不是最终用户的应用程序,而是程序员可以嵌入到他们的产品中的东西。
Liferay Freemaker:如何在模板中获取Request对象?
我正在使用 Liferay 6.2 和 freemaker 作为网页内容模板。我需要在模板中获取请求对象。当我尝试使用 ${Request.getRequest()} 时,它会抛出错误“表达式请求未定义”....
我已经设置了一个带有我自己主题的Keycloak服务器。 Keycloak 应该支持多种语言,但我不想显示选择器。 相反,Keycloak 应该回退到默认浏览器
在 freemarker 中格式化 Duration 对象的好方法是什么?
我有一个 java Duration 对象,其格式应为 xml 中的 hh:mm:ss。 ${持续时间} 但它是用标准格式呈现的。 PT30S 我有一个 java Duration 对象,其格式应为 xml 中的 hh:mm:ss。 <Duration>${duration}</Duration> 但它是用标准格式渲染的。 <Duration>PT30S</Duration> 我在java中有一个可以格式化持续时间的方法,它目前用于json映射。 public static String format(Duration value) { long hours = value.toHours(); int minutes = value.toMinutesPart(); int seconds = value.toSecondsPart(); int millis = value.toMillisPart(); return millis == 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, millis); } 我还需要在 freemarker 中渲染 Duration。是否可以在 freemarker 中使用相同的方法? 从 FreeMarker 2.3.32 开始,任何 Java 8 时态类都没有内置格式。 (虽然有一个开发分支具有半完成的实现,但甚至还没有解决Duration。) 但是,您当然可以从 FreeMarker 调用静态实用方法。您必须将其值放入数据模型(模板上下文)中,并使用您喜欢的名称(如本例中的 MyUtils)((BeansWrapper) cfg.getObjectWrapper()).getStaticModels().get(MyUtils.class.getName()),其中 cfg 是 FreeMarker Configuration 单例。
如何正确折叠 NetSuite 高级 PDF/HTML 模板单元格之间的边框?
我希望在 NetSuite 中使用高级 PDF/HTML 模板时折叠单元格之间的边框。 电流输出示例 所需输出的示例 我尝试过添加边框领子...
数据通过 API 传入,有效负载包含作为具有多个属性(例如名称、数量、大小、颜色)的字段的项目。 这是使用 List 指令的电子邮件块: 姓名:${
这里是字符串数组,myArray = ["green","blue","red"],我想在 html 页面的下一行显示每个值 “绿色的” “蓝色的” “红色的” 我...
如何从 liferay 7.4 中的菜单和面包屑中获取 instance_id
我正在尝试在主题中插入带有模板的自定义菜单,但我没有足够的信息。我有这个代码<@liferay.navigation_menu instance_id="XXX" />,但我不知道怎么...
我是 ftl 的新手,我有一个由 ftlh 文件读取的下面的 json。我正在尝试创建一个表,我需要将同一个月的列组合在一起。为此,我需要计算相同的 m...
抱歉,如果这个问题看起来有点愚蠢,我正在为一个项目发现 Maven 和 Freemarker,在浏览 Freemarker 的文档时,我看到了要放入 pom.xml 文件以包含 freem 的 xml 代码...
Netsuite 高级 PDF/模板 - 仅显示项目组 - 无套件项目
我们目前将我们的装箱单从基本的 PDF 版本移动到高级 PDF/HTML 模板,并遇到了在装箱单上显示项目组的问题。 Item 上的 XML 数据
如何得到InputStream作为FreeMarker处理的结果?
我有一个界面: 公共接口资源{ 输入流是(); } 我想编写一个提供 Freemarker 处理结果的实现: 公共类 FreemarkerResource 实现
我使用 Apache Freemarker 作为我的模板引擎。 我有一个安全问题,我不确定如何处理: 管理员用户能够修改模板,但万一他们将设置输入...
Freemarker 模板:调用 java 方法并将返回的字符串用作 html
我有一个 ftl freemarker 模板文件,我将一些对象(包含所需元素的列表)传递给它并尝试处理 html 输出页面。问题是我需要实施一些补偿......
Freemarker ftl 模板调用 java 方法并使用返回的 html 字符串
我有一个 ftl freemarker 模板文件,我将一些对象(包含所需元素的列表)传递给它并尝试处理 html 输出页面。问题是我需要实施一些补偿......
如何以 FreeMarker 形式发送浮点值(type number 只允许整数)
美好的一天。你能帮我解决我的问题吗。我正在努力以 Apache Free Marker 形式发送浮点值。我有 type=number,但它只允许整数。如果我将类型更改为文本,我将丢失 ch ...
Keycloak 添加自定义 Freemarker 页面并访问它
Keycloak有问题(我是新手): 我们设置并运行了 Keycloak,定义了一个使用的自定义主题。当应用程序中的特定事件发生时,我希望用户登录...
得到这样一个数据: { “key1” : [ “value1”, “value2” ], “key2”:[“value3”,“value4”], “key3”:[“value5”,“
两个页脚具有相同的 fo:retrieve-marker、retrieve-class-name 和 retrieve-boundary,如果我用 fo:mar 调用标记类名称,现在唯一不同的是检索位置。 .
在 spring boot 中从 freemaker 获取“以下已评估为空或缺失”
我有以下 pom.xml 文件。 我有以下 pom.xml 文件。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.2</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.chat</groupId> <artifactId>app</artifactId> <version>0.0.1-SNAPSHOT</version> <name>app</name> <description>A chat application written in spring boot</description> <properties> <java.version>17</java.version> <spring-boot-admin.version>3.0.0-M4</spring-boot-admin.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.32</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-mockmvc</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-dependencies</artifactId> <version>${spring-boot-admin.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.asciidoctor</groupId> <artifactId>asciidoctor-maven-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>generate-docs</id> <phase>prepare-package</phase> <goals> <goal>process-asciidoc</goal> </goals> <configuration> <backend>html</backend> <doctype>book</doctype> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-asciidoctor</artifactId> <version>${spring-restdocs.version}</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 我有以下控制器类。 package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestParam; @Controller public class Controllers { @GetMapping("/signup") public String getSignUpPage(@RequestParam String name, @ModelAttribute ModelMap modelMap) { System.out.println("Name is: " + name); modelMap.addAttribute("name", name); return "signup"; } } 我有以下 freemaker 模板文件。 <html> <head></head> <body> <h1>Hello, ${name}</h1> </body> </html> 当我访问 http://localhost:8080/signup?name=rahul 时,出现以下错误。 Hello, FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> name [in template "signup.ftlh" at line 6, column 22] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${name} [in template "signup.ftlh" at line 6, column 20] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:481) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:401) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:370) at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104) at freemarker.core.DollarVariable.accept(DollarVariable.java:63) at freemarker.core.Environment.visit(Environment.java:335) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.process(Environment.java:314) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:329) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:264) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:215) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:179) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1414) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1158) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1097) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833) 为什么会出现这个问题? 我的目录结构 我认为你不应该在那里使用@ModelAttribute。试试这个: @GetMapping("/signup") public String getSignUpPage(@RequestParam String name, Model model) { 我还将 ModelMap 更改为 org.springframework.ui.Model 作为更通用的方法。 根据 https://freemarker.apache.org/docs/pgui_misc_servlet.html Freemarker 还会自动将请求参数放入 RequestParameters 哈希变量中。所以你甚至不需要自己将参数放入模型中,这个 freemarker 代码就足够了: <h1>Hello, ${RequestParameters.name}</h1> 看起来 freemarker 2.3.32 不能使用 spring boot 3。 例如,以下代码适用于 spring boot 2.6.7、freemarker 2.3.31,但不适用于 spring boot 3.0.4 <h1>Hello, ${RequestParameters.name}</h1> 你会得到这样的异常: Hello, FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> RequestParameters [in template "main.ftl" at line 24, column 18] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${RequestParameters.name} [in template "main.ftl" at line 24, column 16] ---- Java stack trace (for programmers): ---- 我认为 Freemarker 仍然使用旧的 java ee 包,如 javax.servlet 而不是 jakarta.servlet