`
wangliang_gz
  • 浏览: 3310 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类

freemarker认识一

阅读更多

1、freemarker分离模板和数据

2、freemarker通过插值和调用指令来完成数据和模板的合并

插值通过${xxx}

通过标签tag <#调用预定义指令,如<#include "header.tpl"/>

或者<@调用用户自定义指令,如<@myTag  />


3、freemarker对象缺失值(null)的挑剔特性

freemarker对null值尤其挑剔,出现null后马上会终止后续的模板解释,官方解释是说为了避免程序员出现马虎大意的问题。

插值使用!给初始值,或使用<#if指令进行判断

如 ${xxx!}、${xxx!""}、<#if xxx?exists && xxx!=null ><#else></#if>、<#if xxx!=null></#if>

!号对key值是否存在和空值都有判断


4、s2中使用freemarker实现表现层模板

1)尽量保持原型,模板所见即所得原则。

2)不用s2标签。

3)少用freemarker的标签指令

4)将ccs,js,image等网站静态资源和jee web应用分离,在webapp中使用绝对路径的引入。

5)页面传参尽量使用String,传到后台自己格式化。

6)模板尽量不使用<#assign指令,保持模板的被动特性。将数据封装到java中去。



5、s2中使用自定义模板方法

可使用自定义函数进行插值打印或使用自定义指令

UrlMethod.java

 

package app.web.struts2.views.freemarker;

import java.util.List;

import freemarker.template.TemplateMethodModel;

import freemarker.template.TemplateModelException;

public class UrlMethod implements TemplateMethodModel {

@SuppressWarnings("unchecked")

public Object exec(List arg0) throws TemplateModelException {

if(arg0==null) return null;

if(arg0.size()==0) return null;

if(arg0.size()>=1){

String l = arg0.get(0).toString()+".do";

if(arg0.size()>=2){

l= l+"?"+arg0.get(1);

}

return l;

}

return null;

}

}

 

 

FreemarkerManagerEx.java

 

package app.web.struts2.views.freemarker;

import javax.servlet.ServletContext;

import org.apache.struts2.views.freemarker.FreemarkerManager;

import freemarker.template.Configuration;

import freemarker.template.TemplateException;

public class FreemarkerManagerEx extends FreemarkerManager {

@Override

protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {

Configuration configuration = super.createConfiguration(servletContext);

configuration.setSharedVariable("url",new UrlMethod());

return configuration;

}

}

 

 

struts.properties

struts.freemarker.manager.classname=app.web.struts2.views.freemarker.FreemarkerManagerEx


demo.ftl


<a href="${url(base+'/Home')}">Home</a>

产出html<a href="/Home.do">Home</a>

<a href="${url(base+'/Home','action=doIndex&pageNo=1')}">Home</a>

产出html<a href="/Home.do?action=doIndex&pageNo=1">Home</a>


5、s2中使用自定义指令

 

package app.web.struts2.views.freemarker;

import java.io.IOException;

import java.io.Writer;

import java.util.Map;

import freemarker.core.Environment;

import freemarker.template.TemplateDirectiveBody;

import freemarker.template.TemplateDirectiveModel;

import freemarker.template.TemplateException;

import freemarker.template.TemplateModel;




public class UrlDirectiveModel implements  TemplateDirectiveModel{




public void execute(Environment env, Map arg1, TemplateModel[] arg2,TemplateDirectiveBody arg3) throws TemplateException, IOException {

freemarker.template.SimpleScalar urlx = (freemarker.template.SimpleScalar)arg1.get("action");

String pa=null;

if(arg1.containsKey("parameters")){

freemarker.template.SimpleScalar parameters = (freemarker.template.SimpleScalar)arg1.get("parameters");

pa = parameters.getAsString();

}

        String url = urlx.getAsString();;

        Writer writer = env.getOut();

        writer.write("<a href=\""+url+".do"+(pa!=null?"?"+pa:"" )+"\">");

        if(arg3!=null){

        arg3.render(writer);

        }

        writer.write("</a>");

writer.flush();

}

}

 
 

 

FreemarkerManagerEx.java

package app.web.struts2.views.freemarker;

import javax.servlet.ServletContext;

import org.apache.struts2.views.freemarker.FreemarkerManager;

import freemarker.template.Configuration;

import freemarker.template.TemplateException;

public class FreemarkerManagerEx extends FreemarkerManager {

@Override

protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {

Configuration configuration = super.createConfiguration(servletContext);

configuration.setSharedVariable("urlTag",new UrlDirectiveModel());

return configuration;

}

}

 

demo.ftl


<@urlTag action="${base+'/Home'}" parameters="action=doIndex">Home</@urlTag>

产出html<a href="/Home.do?action=doIndex">Home</a>


6、宏macro的使用

macro可以在模板中预定义模板,感觉跟自定义指令类似

demo.tpl


<#macro myTag arg0 arg1>

helloworld ${arg0!}

<#nested>

</#macro>


<@myTag arg0="xxx" arg1="">

ok,bye~

</@myTag>



7、<#include和<#import

<#import 可以以别名的形式引入宏库

<#import "/libs/mylib.ftl" as my>

<@my.copyright date="1999-2002"/>


include插入另外一个模板

<#include "/common/navbar.html" parse=false encoding="UTF-8">


8、Expecting a string, date or number here, Expression xxxBean.yyyBean.initialPageSize is instead a freemarker.ext.beans.SimpleMethodModel

在tpl中 ${xxxBean.yyyBean.initialPageSize}

可以确认xxxBean.yyyBean.initialPageSize不等于空,就是无法显示。几经调试终于发现问题,yyyBean中的initialPageSize属性不能和方法名重复,即

yyyBean{

private String initialPageSize; //(1)

public void setInitialPageSize(String s){this.initialPageSize=s;}

public String getInitialPageSize(){return this.initialPageSize;}

public void initialPageSize(String xxx){}//(2)此方法不能存在,方法名和类成员(1)重复了。

}

 

 

分享到:
评论
14 楼 wslfh2008 2010-12-17  
可以确认xxxBean.yyyBean.initialPageSize不等于空,就是无法显示。几经调试终于发现问题,yyyBean中的initialPageSize属性不能和方法名重复,
-------------------
请问您解决方面和属性同名的问题了吗?怎么才能可以同名呢?
13 楼 coldsummerwei 2010-11-03  
8、Expecting a string, date or number here, Expression xxxBean.yyyBean.initialPageSize is instead a freemarker.ext.beans.SimpleMethodModel

在tpl中 ${xxxBean.yyyBean.initialPageSize}

可以确认xxxBean.yyyBean.initialPageSize不等于空,就是无法显示。几经调试终于发现问题,yyyBean中的initialPageSize属性不能和方法名重复,


这个很好,帮我解决了一个问题。
12 楼 cheng5259 2010-04-16  
收藏了~~谢谢提供
11 楼 qiren83 2010-04-15  
宏最强大
10 楼 axhack 2010-04-15  
不错,楼主的这些资料对我帮助很大。
9 楼 wangliang_gz 2010-04-14  
zcq100 写道
代码格式化下嘛

多谢提醒,已经格式化之!
8 楼 zcq100 2010-04-14  
代码格式化下嘛
7 楼 whaosoft 2010-04-14  
我喜欢用这个 只是不能直接取session里的东西 郁闷
6 楼 hollywu 2010-04-14  
october731 写道
当Struts和Freemarker都存在的时候,优先选择什么来做页面表现层呢?



freemarker
5 楼 october731 2010-04-14  
当Struts和Freemarker都存在的时候,优先选择什么来做页面表现层呢?
4 楼 parwin2 2010-04-14  
写的很好,收藏了。谢谢分享~~
3 楼 GlennZhou 2010-04-14  
牛人出现,前排瞻仰,顶礼膜拜
2 楼 wangliang_gz 2010-04-14  
walle1027 写道
总结的不错,学习了。

谢谢你的鼓励,互相学习。
1 楼 walle1027 2010-04-14  
总结的不错,学习了。

相关推荐

    FreeMarker手册(中文版)

    在了解FreeMarker之前,我们需要认识到它不是用Java编程语言来直接创建HTML页面,而是通过编写模板来设计页面布局,然后让FreeMarker根据模板和提供的数据生成最终页面。 在FreeMarker中,一个模板通常是由HTML或...

    freemarker内置函数

    通过以上内容,你应该对Freemarker的内置函数有了基本的认识。实践是最好的老师,尝试在自己的项目中应用这些函数,你会发现它们大大提升了模板语言的灵活性和功能性。记得查阅官方文档以获取更详细的信息,不断探索...

    java基于SpringBoot+freemarker 水果超市商城系统(源码+sql+论文报告)

    SpringBoot作为一个开源的Java框架,使得构建Spring应用更为简洁快速,而Freemarker则是一个模板引擎,用于生成文本输出。结合Mysql数据库的强大功能,能够实现一个功能齐全、性能稳定的电商平台。 本项目源码完整...

    dalgenx:dalgenX是对支付宝dalgen代码生成器的开源实现,freemarker版,可迭代开发生成器,同时支持ibatis和mybatis

    dalgen开源初级版最初由badqiu放在taocode上,badqiu大神我不认识,mybatis-plus-pagging.jar那个分页器有一个@author badqiu 我对本项目持续开发优化从2015年开始,对生产环境进行改造,特别是支持可迭代开发...

    工作上的收获

    FreeMarker的设计原则之一是与容器无关性,这意味着它不仅可以用于Web应用程序,还能适用于非Web场景。 **2. 相关特性** - **通用性**:支持多种文本格式的生成,易于嵌入到不同的应用程序中。 - **灵活的模板加载...

    第一个spring例子

    Spring框架是Java开发中的一个核心框架,以其依赖注入(Dependency Injection, DI)和面向切面...通过这个例子,你可以逐步建立起对Spring开发的整体认识,并且能够独立完成一个从数据库访问到前后端交互的完整应用。

    年终工作总结.docx

    自5月1日加入XXXX科技有限公司以来,我有幸成为研发团队的一员,与优秀的领导和同事共事,让我深感荣幸。在这个过程中,我参与了多个项目,积累了宝贵的经验,同时也认识到自身存在的不足,以下是我对这一年的总结。...

    Java Web程序设计教程

    第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象的编程语言 3 1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用...

    基于Java语言的后端开发学习笔记汇总与更新

    6个SVG文件则是图形化的学习资源,它们可以作为技术文档中的一部分,用来直观展示系统架构图、流程图等,帮助学习者在视觉上构建起对Java后端系统的整体认识。 4个Markdown笔记文件则用简洁的Markdown格式记录了...

    自己写的一个struts的超简单例子

    1. **模型(Model)**:模型部分通常由业务逻辑代码组成,负责处理数据和业务规则。在Struts中,模型通常是一个JavaBean,它封装了应用的数据和行为。例如,一个用户管理模型可能包含添加、删除和查询用户的方法。 ...

    一个项目 了解springMVC 基本用法

    1. **核心概念** - DispatcherServlet:Spring MVC的前端控制器,负责接收请求并分发给相应的处理器。 - HandlerMapping:映射请求到处理器(Controller)。 - HandlerAdapter:适配各种类型的处理器,确保...

    struts2--1.入门程序

    在Java Web开发中,Struts2框架提供了良好的架构模式,可以有效地组织代码,提高开发效率,并且它支持多种视图技术,如JSP、FreeMarker等,同时具备强大的拦截器(Interceptor)机制,用于处理请求、验证数据、实现...

    iHandle_springboot_一个后台管理系统_living3me.zip

    【标签】"源码"表明了这是一个可查看和学习的代码资源,开发者或学习者可以深入理解系统的实现机制,对Spring Boot以及后台管理系统的架构有更直观的认识。 【压缩包子文件的文件名称列表】"iHandle_springboot_一...

    struts2权威指南前三章

    前三章的学习,将使你对Struts2有一个全面而基础的认识,包括其核心概念、配置机制以及Action和结果的处理方式。这将为后续深入学习Struts2的高级特性,如插件、国际化、AJAX支持等奠定坚实的基础。在实际项目中,...

    java个人总结模板.docx

    - **技术栈**:项目中使用的技术包括但不限于Freemarker、iBatis、jQuery、Struts 1、Spring、Boss验证、UMA及WebService等。 - **实践经验**: - 在联通116114门户网站开发项目中,作者学习了Freemarker和iBatis,...

    struts 2完全学习手册

    1. **理解MVC设计模式**:首先需要对MVC模式有一个清晰的认识,这有助于更好地理解Struts 2的工作原理。 2. **熟悉Java Web基础知识**:了解Servlet、JSP等相关技术对于学习Struts 2是非常重要的。 3. **掌握Struts ...

    springbootdemo

    1. **Spring Initializr**: 这是开始创建Spring Boot项目的起点,它可以在线生成项目的基本结构,包括pom.xml或build.gradle文件,以及基本的源代码目录结构。 2. **主应用类(Main Application Class)**: 这个类...

    struts2 轻松入门教程

    总的来说,这个教程旨在帮助初学者建立起对Struts2框架的基本认识,通过实例教学,使他们能快速上手并实际运用到项目开发中。学习者需要掌握Action、配置、拦截器、视图、验证等核心概念,以及如何与Spring等其他...

    struts2讲义.doc

    可是近几年,新的视图技术,如FreeMarker、Velocity技术。还有设计模式的大行其道。开发人员越来越觉得Struts在这些方面有先天的不足。并不能很优雅和优秀的完成Web项目开发工作。原因有很多种,一方面是Struts出现...

Global site tag (gtag.js) - Google Analytics