今天想要在Freemarker模版文件里使用HttpServletResponse对象的encodeURL方法,对页面链接的URL进行Encode。据我所知,在Freemarker模版文件里是可以使用scriptlet和其他第三方标签的,可是当我直接在<%%>里书写scriptlet时,却被原封不动地输了出来,于是就尝试引入JSTL,以便使用其中的<c:url value=""/>标签来达到同样目的:
<#assing c=JspTaglibs["http://java.sun.com/jsp/jstl/core"]>
<@c.out value="url"/>
同时将JSTL所需.jar文件都放置在/WEB-INF/lib目录下以及将c.tld文件放置在/WEB-INF目录下,结果却一直报错。在网上到处搜索,包括国外的论坛,发现这个问题一直普遍存在,用了许多别人给出的方法都依然无法解决。正当我苦恼不己时,突然想到上次曾经使用过Freemarker的自定义方法,而我这次只不过是需要使用一个简单的方法而已,自己封装一下使之成为Freemarker支持的方法不就行了,何必大费周折呢?
要想使用Freemarker支持的自定义方法,需要实现freemarker.template.TemplateMethodModel接口,然后将方法对象放入到Freemarker的数据模型中,这样在ftl文件中便可以像使用Freemarker内置方法一样使用该方法了。
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;
/**
* Freemarker自定义方法
* 实现response.encodeURL(url)功能
*/
public class EncodeURLMethod implements TemplateMethodModel {
private HttpServletResponse response;
/**
* 带参数的构造函数
* @param response HttpServletResponse对象
*/
public EncodeURLMethod(HttpServletResponse response)
{
this.response=response;
}
/**
* 执行方法
* @param argList 方法参数列表
* @return Object 方法返回值
* @throws TemplateModelException
*/
public Object exec(List argList) throws TemplateModelException {
if(argList.size()!=1) //限定方法中必须且只能传递一个参数
{
throw new TemplateModelException("Wrong arguments!");
}
//返回response.encodeURL执行结果
return response.encodeURL((String)argList.get(0));
}
}
输出模版数据模型时,将EncodeURLMethod的实例对象放入模型中:
dataMap.put("encodeURL", new EncodeURLMethod(context.getResponse()));
在Freemarker模版文件中这样使用:
${encodeURL("/news/showNews.sf?id=123456")}
输出结果实际就是使用response.encodeURL输出的结果。
分享到:
相关推荐
Freemarker 是一款基于模板的文本生成工具,使用纯 Java 编写而成。它主要应用于 Web 开发领域,尤其适用于 MVC(Model-View-Controller)架构中的视图层。尽管 Freemarker 具备一定的编程能力,但它更多地依赖于 ...
FreeMarker的使用可以将视图与业务逻辑分离,提高代码可读性和可维护性。 4. **Commons-Update Decoration**:这可能是一个定制的装饰器模式实现,用于更新处理或者增强库中的某些功能。装饰器模式允许在运行时给...
此外,afterJFinalStart()与beforeJFinalStop()方法则提供了在JFinal启动前后执行自定义代码的能力。 Controller是MVC架构中的“C”,负责处理用户请求并返回响应。在JFinal中,Controller是由Action类来实现的,...
- **FreeMarker 示例**:演示如何使用 FreeMarker 渲染视图。 #### 十一、JFinal 架构及扩展 - **概述**:深入理解 JFinal 的整体架构设计,探讨如何进行扩展。 综上所述,JFinal 以其独特的设计理念和技术特点,...
Controller章节讲解了控制器的使用,Action的定义,参数获取方法,文件上传处理,属性设置以及视图渲染方法等。 Interceptor章节则介绍了拦截器的应用场景和配置方法,以及ActionInvocation和InterceptorStack的...
8. **模板引擎**:Struts2默认使用FreeMarker作为模板引擎,渲染视图。在登录成功或失败的页面,我们可以使用FreeMarker语法来动态展示数据。 9. **Action上下文**:Struts2的ActionContext封装了请求、响应、...
10. **JSP和FreeMarker视图**:Stripes可以与JSP或FreeMarker模板引擎配合使用,方便地生成动态视图。开发者可以根据喜好选择合适的视图技术。 综上所述,Stripes 1.4.3作为一款高效的Java Web框架,它以简洁、灵活...
- **扩展控制器**:开发者可以通过继承Tiny提供的BaseController基类,或者使用@Controller注解自定义控制器,添加新的业务处理逻辑。 - **定制拦截器**:创建自己的Interceptor类,实现特定的拦截逻辑,然后在...
通过Freemarker,你可以定义如何布局PDF页面,或者在生成SWF时添加自定义的交互逻辑。 5. **标签详解**: - **freemaker**: Freemarker模板引擎,用于动态生成文本内容,包括可能在转换过程中用到的配置文件。 - *...
定义Interceptor类,实现Interceptor接口,覆盖其中的方法以执行自定义的逻辑。 #### Interceptor配置 在JFinalConfig类中配置Interceptor,指定其在请求处理链中的位置和作用范围。 #### ActionInvocation ...
- 官方文档:JFinal 的官方文档详细介绍了框架的使用方法和插件功能,是学习 JFinal 的重要参考资料。 - 社区交流:JFinal 社区活跃,开发者可以在论坛中提问、分享经验,获取帮助。 - 示例项目:通过分析 `...
Servlet生命周期包括加载、初始化、服务、销毁四个阶段,开发者可以通过重写相应的方法实现自定义逻辑。 2. JSP(JavaServer Pages):JSP是Java Servlet的一种简化方式,它允许开发者在HTML页面中嵌入Java代码,...
4. **灵活**:JFinal允许自定义配置,支持热加载,便于在开发过程中实时调整和测试。 在压缩包中的“lbkx”文件可能包含了以下几个方面的代码示例: 1. **路由配置**:JFinal通过`config`文件进行路由规则设置,...
Handler提供了灵活的扩展机制,可以自定义处理逻辑。 - **Action(动作)**:Action 是业务逻辑的载体,通常对应一个或多个HTTP请求,它包含了具体的业务处理代码。开发者可以在此定义控制器方法,响应前端请求。 ...
本项目中,可能会使用第三方库如JCaptcha或者自定义生成算法来生成图片验证码,并将其显示在登录/注册界面。用户输入验证码后,后台会进行比对,只有正确时才会继续处理登录或注册请求。 4. **JFinal的验证机制** ...
3. View:视图层负责渲染并展示数据,JFinal支持FreeMarker和Velocity两种模板引擎。 4. Plugin:插件机制是JFinal的一大特色,可以方便地扩展功能,如数据库连接池Druid、缓存插件、日志插件等。 5. Filter:过滤器...
4. **灵活性**:JFinal支持多种模板引擎,如FreeMarker、Beetl等,同时提供了自定义渲染方式,满足不同需求。 5. **Plugin机制**:JFinal的Plugin设计允许开发者方便地扩展功能,例如数据库操作、缓存管理、日志...
开发者可以通过编写自定义中间件或插件来增加新功能。同时,开源社区的支持使得框架不断进化和完善,问题和建议可以通过GitHub上的项目仓库提交。 6. **与其它框架的比较** 相较于Spring Boot、Play Framework等...