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)重复了。
}
相关推荐
在了解FreeMarker之前,我们需要认识到它不是用Java编程语言来直接创建HTML页面,而是通过编写模板来设计页面布局,然后让FreeMarker根据模板和提供的数据生成最终页面。 在FreeMarker中,一个模板通常是由HTML或...
通过以上内容,你应该对Freemarker的内置函数有了基本的认识。实践是最好的老师,尝试在自己的项目中应用这些函数,你会发现它们大大提升了模板语言的灵活性和功能性。记得查阅官方文档以获取更详细的信息,不断探索...
SpringBoot作为一个开源的Java框架,使得构建Spring应用更为简洁快速,而Freemarker则是一个模板引擎,用于生成文本输出。结合Mysql数据库的强大功能,能够实现一个功能齐全、性能稳定的电商平台。 本项目源码完整...
dalgen开源初级版最初由badqiu放在taocode上,badqiu大神我不认识,mybatis-plus-pagging.jar那个分页器有一个@author badqiu 我对本项目持续开发优化从2015年开始,对生产环境进行改造,特别是支持可迭代开发...
FreeMarker的设计原则之一是与容器无关性,这意味着它不仅可以用于Web应用程序,还能适用于非Web场景。 **2. 相关特性** - **通用性**:支持多种文本格式的生成,易于嵌入到不同的应用程序中。 - **灵活的模板加载...
Spring框架是Java开发中的一个核心框架,以其依赖注入(Dependency Injection, DI)和面向切面...通过这个例子,你可以逐步建立起对Spring开发的整体认识,并且能够独立完成一个从数据库访问到前后端交互的完整应用。
自5月1日加入XXXX科技有限公司以来,我有幸成为研发团队的一员,与优秀的领导和同事共事,让我深感荣幸。在这个过程中,我参与了多个项目,积累了宝贵的经验,同时也认识到自身存在的不足,以下是我对这一年的总结。...
第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使用...
6个SVG文件则是图形化的学习资源,它们可以作为技术文档中的一部分,用来直观展示系统架构图、流程图等,帮助学习者在视觉上构建起对Java后端系统的整体认识。 4个Markdown笔记文件则用简洁的Markdown格式记录了...
1. **模型(Model)**:模型部分通常由业务逻辑代码组成,负责处理数据和业务规则。在Struts中,模型通常是一个JavaBean,它封装了应用的数据和行为。例如,一个用户管理模型可能包含添加、删除和查询用户的方法。 ...
1. **核心概念** - DispatcherServlet:Spring MVC的前端控制器,负责接收请求并分发给相应的处理器。 - HandlerMapping:映射请求到处理器(Controller)。 - HandlerAdapter:适配各种类型的处理器,确保...
在Java Web开发中,Struts2框架提供了良好的架构模式,可以有效地组织代码,提高开发效率,并且它支持多种视图技术,如JSP、FreeMarker等,同时具备强大的拦截器(Interceptor)机制,用于处理请求、验证数据、实现...
【标签】"源码"表明了这是一个可查看和学习的代码资源,开发者或学习者可以深入理解系统的实现机制,对Spring Boot以及后台管理系统的架构有更直观的认识。 【压缩包子文件的文件名称列表】"iHandle_springboot_一...
前三章的学习,将使你对Struts2有一个全面而基础的认识,包括其核心概念、配置机制以及Action和结果的处理方式。这将为后续深入学习Struts2的高级特性,如插件、国际化、AJAX支持等奠定坚实的基础。在实际项目中,...
- **技术栈**:项目中使用的技术包括但不限于Freemarker、iBatis、jQuery、Struts 1、Spring、Boss验证、UMA及WebService等。 - **实践经验**: - 在联通116114门户网站开发项目中,作者学习了Freemarker和iBatis,...
1. **理解MVC设计模式**:首先需要对MVC模式有一个清晰的认识,这有助于更好地理解Struts 2的工作原理。 2. **熟悉Java Web基础知识**:了解Servlet、JSP等相关技术对于学习Struts 2是非常重要的。 3. **掌握Struts ...
1. **Spring Initializr**: 这是开始创建Spring Boot项目的起点,它可以在线生成项目的基本结构,包括pom.xml或build.gradle文件,以及基本的源代码目录结构。 2. **主应用类(Main Application Class)**: 这个类...
总的来说,这个教程旨在帮助初学者建立起对Struts2框架的基本认识,通过实例教学,使他们能快速上手并实际运用到项目开发中。学习者需要掌握Action、配置、拦截器、视图、验证等核心概念,以及如何与Spring等其他...
可是近几年,新的视图技术,如FreeMarker、Velocity技术。还有设计模式的大行其道。开发人员越来越觉得Struts在这些方面有先天的不足。并不能很优雅和优秀的完成Web项目开发工作。原因有很多种,一方面是Struts出现...