freemarker特殊字符用noparse转义#{}

本文介绍在使用Freemarker生成代码时,如何正确处理特殊字符以避免语法错误。通过示例展示了如何使用<#noparse>指令来确保代码片段能够被正确解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动生成mapper的时候遇到特殊字符需要转义,特此记录一下

如:

<#list mapperDataList as data>
    #{it.${data.columnName}},
</#list>

这样会报错

Caused by: freemarker.core.ParseException: Syntax error in template "mapper.ftl" in line 12, column 6:
You can't use "${" here as you are already in FreeMarker-expression-mode. Thus, instead of ${myExpression}, just write myExpression. (${...} is only needed where otherwise static text is expected, i.e, outside FreeMarker tags and ${...}-s.)
    at freemarker.core.TokenMgrError.toParseException(TokenMgrError.java:247)
    at freemarker.template.Template.<init>(Template.java:215)
    at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:495)
    at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:409)
    at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:261)
    at freemarker.template.Configuration.getTemplate(Configuration.java:1786)
    at freemarker.template.Configuration.getTemplate(Configuration.java:1646)
    at com.code.generator.CodeGenerator.genMapperSql(CodeGenerator.java:292)
    ... 2 more

应该写成

<#list mapperDataList as data>
    <#noparse>#{</#noparse>it.${data.columnName}<#noparse>}</#noparse>,
</#list>

这样就能正确生成了。

<#noparse>的作用:

FreeMarker 不会在这个指令体中间寻找FTL标签, 插值和其他特殊的字符序列,除了noparse的结束标记。

 

### 解决Freemarker特殊字符导致input显示错乱的问题 当在Freemarker模板中遇到特殊字符时,这些字符可能会干扰HTML标签的正常解析,从而造成输入框内容混乱等问题。为了防止这种情况发生,在将数据传递给模板之前或在模板内部处理这些特殊字符是非常重要的。 #### 数据预处理方法 一种常见的做法是在Java代码中对字符串进行转义处理后再传入模板。可以利用Apache Commons Lang库中的`StringEscapeUtils.escapeHtml4()`函数来完成这一操作[^1]: ```java import org.apache.commons.lang3.StringEscapeUtils; public class DataPreprocessor { public static String escapeForHtml(String input) { return StringEscapeUtils.escapeHtml4(input); } } ``` 这样可以在控制器层面对所有可能含有特殊字符的数据项做统一转换。 #### 模板内处理方式 另一种更为灵活的方式是直接在Freemarker模板文件里定义宏(macro),用于即时转义特定变量值。下面是一个简单的例子说明如何创建并应用这样的宏[^2]: ```ftl <#-- 定义一个名为escapeHtml的宏 --> <#macro escapeHtml value> ${value?html} <!-- 使用内置过滤器自动转义HTML实体 --> </#macro> <!-- 应用该宏到表单字段上 --> <input type="text" name="exampleInput" value="<@escapeHtml exampleValue />"> ``` 这里使用了Freemarker自带的`${...?html}`语法来进行基本的安全编码,它会把尖括号、引号等转化为对应的HTML实体表示形式,有效避免XSS攻击风险的同时也解决了因未正确闭合属性而引起的布局问题。 另外还可以考虑自定义设置全局默认输出模式为HTML安全模式,这可以通过修改Spring Boot应用程序配置文件application.properties实现[^3]: ```properties spring.freemarker.settings.default_encoding=UTF-8 spring.freemarker.expose_request_attributes=true spring.freemarker.allow_session_attribute_access=false spring.freemarker.cache=false spring.freemarker.request_context_attribute=rc spring.freemarker.template_update_delay=-1 spring.freemarker.content_type=text/html;charset=UTF-8 spring.freemarker.charset=UTF-8 spring.freemarker.reactive.enabled=false spring.freemarker.suffix=.ftlh spring.freemarker.check_template_location=true spring.freemarker.prefer_file_system_access=false spring.freemarker.settings.auto_esc=true # 开启此选项可使所有输出都经过HTML转义 ``` 以上措施能够有效地帮助开发者应对由特殊字符引发的各种潜在问题,并确保最终呈现出来的网页既美观又安全可靠。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值