freemarker使用Java自定义的函数

83 篇文章 0 订阅
7 篇文章 0 订阅


通过定义Java函数

@Component("cleanHtmlMethodModel")
public class CleanHtmlMethodModel implements TemplateMethodModel {


    @Override
    @SuppressWarnings("rawtypes")
    public Object exec(List args) throws TemplateModelException {
        String result = "";
        if ((null != args) && (args.size() > 0)) {
            String str = args.get(0).toString();
            if (null != str) {
                return Jsoup.clean(str, Whitelist.none());
            }
        }
        return result;
    }


}


在dispatcher-servlet.xml 加入如下代码

	<!-- FreeMarker configuration -->
	<bean id="freemarkerConfig"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
		<property name="defaultEncoding" value="UTF-8" />
		<!-- user-defined directives -->
		<property name="freemarkerVariables">
			<map>
				<entry key="schoolDirective" value-ref="schoolDirectiveModel" />
				<entry key="headerNavigationDirective" value-ref="headerNavigationDirectiveModel" />
				<entry key="footerNavigationDirective" value-ref="footerNavigationDirectiveModel" />
				
				<entry key="headerImageDirective" value-ref="headerImageDirectiveModel" />
				<entry key="categoryDirective" value-ref="categoryDirectiveModel" />
				<entry key="announcementDirective" value-ref="announcementDirectiveModel" />
				<entry key="courseDirective" value-ref="courseDirectiveModel" />
				<entry key="latestOrdersDirective" value-ref="latestOrdersDirectiveModel" />
				<entry key="liveCourseDirective" value-ref="liveCourseDirectiveModel" />
				<entry key="newsDirective" value-ref="newsDirectiveModel" />
				<entry key="questionDirective" value-ref="questionDirectiveModel" />
				<entry key="latestReviewDirective" value-ref="latestReviewDirectiveModel" />
				<entry key="latestUserDirective" value-ref="latestUserDirectiveModel" />
				<entry key="columnCourseDirective" value-ref="columnCourseDirectiveModel" />
				<entry key="columnPromoDirective" value-ref="columnPromoDirectiveModel" />
				
				<entry key="prettyTime" value-ref="prettyTimeMethodModel" />
				<entry key="prettyFileSize" value-ref="prettyFileSizeMethodModel" />
				<entry key="progress" value-ref="progressMethodModel" />
				
				<entry key="cleanHtml" value-ref="cleanHtmlMethodModel" />
			</map>
		</property>
		<!-- FreeMarker setting -->
		<property name="freemarkerSettings">
			<props>
				<prop key="number_format">#</prop> <!-- 数字不包含逗号 -->
				<prop key="template_exception_handler">com.school.freemarker.MissingValuesTemplateExceptionHandler
				</prop>
			</props>
		</property>
	</bean>

	<!-- Resolves view names to protected .ftl resources within the /WEB-INF/freemarker 
		directory -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<property name="cache" value="true" />
		<property name="prefix" value="" />
		<property name="suffix" value=".ftl" />
		<property name="contentType" value="text/html;charset=UTF-8" />
		<property name="exposeSpringMacroHelpers" value="true" />
		<property name="exposeRequestAttributes" value="true" />
		<property name="exposeSessionAttributes" value="true" />
	</bean>


freemarker宏定义:

<#-- 根据枚举类型列表输出枚举值的中文描述 -->
<#macro displayText enumItems value defaultOutput="">
<#compress>
  <#assign output=false>
  <#list enumItems as x>
    <#if "${(x.value)!''}" == "${value}" >
      ${(x.text)!''}
      <#assign output=true>
      <#break>
    </#if>
  </#list>
  <#-- 没找到值,输入默认值 -->
  <#if !output>
    ${defaultOutput!''}
  </#if>
</#compress>
</#macro>


<#-- 限制字符串内容输出的最大长度 -->
<#macro limitString string maxLength>
<#compress>
  <#if string?has_content>
    <#if (string?length) gt maxLength>
      ${string?substring(0, maxLength)}...
    <#else>
      ${string!''}
    </#if>
  </#if>
</#compress>
</#macro>

<#-- 判断回复者是否为老师 -->
<#function isTeacher instructors userId>
  <#if instructors?has_content>
    <#list instructors as t>
      <#if t.userId == userId>
         <#return true>
      </#if>
    </#list>
  </#if>
  <#return false>
</#function>



html页面引用

<div class="dl-video-bg"><@limitString "${cleanHtml(item.summary!'')?replace(' ','暂无课程简介')}" 110 /></div>




Freemarker 是一种模板引擎,它可以在 Java 平台中用于生成动态内容。在 Freemarker 中,您可以定义自己的自定义函数来扩展其功能。 要定义自定义函数,您需要执行以下步骤: 1. 创建一个 Java 类,并实现 `freemarker.template.TemplateMethodModelEx` 接口。 2. 在实现类中,覆盖 `exec` 方法来执行自定义函数的逻辑。这个方法接收一个 `List` 参数,其中包含了传递给自定义函数的参数列表。 3. 在 Freemarker 模板中,使用 `<#assign>` 指令将您的自定义函数绑定到一个变量上。 下面是一个示例,展示如何在 Freemarker 中定义和使用自定义函数: 1. 创建一个 `CustomFunctions` 类,实现 `freemarker.template.TemplateMethodModelEx` 接口: ```java import freemarker.template.TemplateMethodModelEx; import freemarker.template.TemplateModelException; import java.util.List; public class CustomFunctions implements TemplateMethodModelEx { @Override public Object exec(List arguments) throws TemplateModelException { // 自定义函数的逻辑 // 参数列表存储在 arguments 中 // 返回自定义函数的结果 return null; } } ``` 2. 在 `exec` 方法中实现您的自定义函数的逻辑。 3. 在 Freemarker 模板中,使用 `<#assign>` 指令将自定义函数绑定到一个变量上: ```ftl <#assign myFunc = "com.example.CustomFunctions"?new()> ${myFunc("argument1", "argument2")} ``` 在上面的示例中,我们将 `CustomFunctions` 类的实例绑定到 `myFunc` 变量上。然后,我们可以在模板中使用 `myFunc` 变量来调用自定义函数,并传递参数。 请注意,根据您的需求,您可能需要使用不同的 `exec` 方法重载版本来处理不同类型的参数,并返回适当的结果。 这只是一个简单的示例,您可以根据自己的需求扩展和修改自定义函数的实现。希望能帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值