freemaker 自定义标签 和函数的使用

项目中需要使用原始的静态资源来搜寻到最新的静态资源文件,初步设想采用的是自定义freemaker函数来进行查询转换,网上搜索资料整理了一下

首先定义自定义函数类 需要继承TemplateMethodModelEx 参数的话 就是页面传入的参数列表

public class ChangeUriFunction implements TemplateMethodModelEx{
public Logger loger = LoggerFactory.getLogger(ChangeUriFunction.class);

private ServiceStaticResource staticResourceService = (ServiceStaticResource) ToolSpring.getBean("staticResourceService");



@SuppressWarnings("rawtypes")
@Override
public Object exec(List arg0) throws TemplateModelException {


String fileuri =  arg0.get(0).toString();//页面去除的静态资源路径(文件名)
String isOnline = PropertiesUtil.getValue(PropertiesUtil.CURRENT_CONTENT);
try {
if ("true".equals(isOnline) && fileuri != null && fileuri.length() != 0) {


System.err.println("fileuri :"+fileuri);

StaticResource staticResource = staticResourceService.getResourceByUri(null, fileuri);
//如果未查询到记录 则返回原路径
return staticResource == null ? fileuri : staticResource.getNewFileUrl();
}


} catch (Exception e) {
loger.info("调用freemaker自动以函数查询静态资源路径时发生异常!"+e.getMessage());
return fileuri;
}
return fileuri;
}


}

写完自定义标签 肯定需要在页面生效的,如果采用的是spring来管理的话,那么只需要在spring配置文件中试图解析配置上加一段配置即可

   <!-- freemarker的配置 -->  
    <bean id="freemarkerConfigurer"  
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
        <property name="templateLoaderPath" value="/" />  
        <property name="defaultEncoding" value="UTF-8" />  
        <property name="freemarkerSettings">  
            <props>  
                <prop key="template_update_delay">10</prop>  
                <prop key="locale">zh_CN</prop>  
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>  
                <prop key="date_format">yyyy-MM-dd</prop>  
                <prop key="number_format">#.##</prop>  
            </props>  
        </property> 
        
               <!-- freemaker自定义函数配置 -->
        <property name="freemarkerVariables">
        <map>
        <description>配置前端使用更改静态文件路径</description>
        <entry key="changeUrl" value-ref="changeUrl"></entry>
        </map>
        </property> 
    </bean>  
    <!--  自定义的freemaker函数-->
    <bean id="changeUrl" class="jootun.platform.business.impl.ChangeUriMethod"></bean>

当然如果你不是采用spring 来进行试图解析的,也完全可以将自定义函数设置到全局进行使用的,

Configuration cfg = new Configuration();
cfg.setEncoding(Locale.CHINA, "UTF-8");
cfg.setSharedVariable("block", new BlockDirective());  

//添加变更静态资源url的自定义函数
cfg.setSharedVariable("loadstatic", new ChangeUriFunction());

cfg.setServletContextForTemplateLoading(servletContext, "/WEB_INF/templates";

 

将自定义标签或者是函数设置到root下 ,这样即可在所有该Configuration 管理下的页面使用了;

 

另外,自定义标签对freemaker的页面继承效果也是很好的,对页面的扩展以及公共资源的维护上可以简化很多,开发起来简单快捷

具体高级使用 还是参考api进行学习。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在自定义标签中设置一个对象值,可以通过以下步骤完成: 1. 在自定义标签的类中,定义一个方法,该方法用于设置对象值。例如: ``` public void setObjectValue(Environment env, ObjectWrapper wrapper, TemplateModel[] args) throws TemplateModelException { // 获取参数 String name = ((SimpleScalar) args[0]).getAsString(); Object value = wrapper.unwrap(args[1]); // 设置对象值 env.setVariable(name, wrapper.wrap(value)); } ``` 2. 在自定义标签类的构造函数中,将该方法注册到 Freemarker 中。例如: ``` public MyTag() { // 注册 setObjectValue 方法 setTagName("setObjectValue"); registerMethod("setObjectValue", new Method() { public Object exec(List arguments) throws TemplateModelException { setObjectValue((Environment) arguments.get(0), (ObjectWrapper) arguments.get(1), (TemplateModel[]) arguments.get(2)); return null; } }); } ``` 3. 在模板中使用自定义标签,并调用 setObjectValue 方法设置对象值。例如: ``` <@myTag.setObjectValue name="myObject" value=myValue /> ``` 其中,myTag 是自定义标签的名称,setObjectValue 是注册的方法名称,name 是变量名,value 是对象值。 ### 回答2: 在Spring Boot中,可以使用FreeMarker模板引擎来进行页面的渲染,而在使用FreeMarker模板引擎的过程中,env.setVariable方法可用于在自定义标签中设置一个对象值。 具体的操作步骤如下: 1. 首先,在Spring Boot项目中引入FreeMarker的依赖。在pom.xml文件中添加以下代码: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> ``` 2. 创建一个自定义标签的Java类,该类需要继承TemplateDirectiveModel接口,并重写其中的execute方法。在该方法中,使用env.setVariable方法来设置对象值。例如: ``` public class MyCustomTag implements TemplateDirectiveModel { @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 设置一个对象值 YourObject obj = new YourObject(); env.setVariable("obj", ObjectWrapper.DEFAULT_WRAPPER.wrap(obj)); // 其他操作... } } ``` 3. 在FreeMarker的模板文件中使用自定义标签,并获取设置的对象值。例如: ``` <@myCustomTag> <p>${obj.property}</p> </@myCustomTag> ``` 在上述代码中,<@myCustomTag>为自定义标签标签名,可以根据需要进行更改。`${obj.property}`表示获取设置的对象值的某个属性。 通过以上步骤,我们可以在自定义标签使用env.setVariable方法来设置一个对象值,并在模板文件中获取该对象值进行渲染。 ### 回答3: 在Spring Boot中使用Freemarker,可以通过env.setVariable方法在自定义标签中设置一个对象的值。 首先,在自定义标签的实现类中,定义一个方法,用于获取并设置对象的值。例如: public class MyCustomTag extends TemplateDirectiveModel { @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 获取对象值 Object value = getValueFromSomewhere(); // 设置对象值 env.setVariable("myObject", ObjectWrapper.DEFAULT_WRAPPER.wrap(value)); // 执行自定义标签的内容 body.render(env.getOut()); } private Object getValueFromSomewhere() { // 获取对象值的逻辑 // ... return value; } } 然后,在模板中使用自定义标签,并使用"${myObject}"获取对象的值。例如: <@myCustomTag></@myCustomTag> ${myObject} 以上代码中,在执行自定义标签的execute方法时,会调用getValueFromSomewhere方法获取对象的值,并使用env.setVariable方法将获取的值设置到环境变量"myObject"中。在模板中可以通过"${myObject}"来获取这个对象的值,并进行显示等操作。 总结:通过env.setVariable方法可以在自定义标签中设置一个对象的值,然后在模板中使用该对象的值进行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值