- 浏览: 28286 次
- 性别:
- 来自: 广州
-
最新评论
- import java.io.IOException;
- import java.io.Writer;
- import java.util.Iterator;
- import java.util.Map;
- import freemarker .core.Environment;
- import freemarker .template.SimpleNumber;
- import freemarker .template.TemplateBooleanModel;
- import freemarker .template.TemplateDirectiveBody;
- import freemarker .template.TemplateDirectiveModel ;
- import freemarker .template.TemplateException;
- import freemarker .template.TemplateModel;
- import freemarker .template.TemplateModelException;
- import freemarker .template.TemplateNumberModel;
- /**
- * FreeMarker 自定义标签实现重复输出内容体。
- *
- *
- * 参数:
- * count: 重复的次数,必须的且非负整数。
- * hr: 设置是否输出HTML标签 "hr" 元素. Boolean. 可选的默认为fals.
- *
- *
- * 循环变量: 只有一个,可选的. 从1开始。
- *
- *
- */
- public class RepeatDirective implements TemplateDirectiveModel {
- private static final String PARAM_NAME_COUNT = "count" ;
- private static final String PARAM_NAME_HR = "hr" ;
- public void execute(Environment env, Map params, TemplateModel[] loopVars,
- TemplateDirectiveBody body) throws TemplateException, IOException {
- // ---------------------------------------------------------------------
- // 处理参数
- int countParam = 0 ;
- boolean countParamSet = false ;
- boolean hrParam = false ;
- Iterator paramIter = params.entrySet().iterator();
- while (paramIter.hasNext()) {
- Map.Entry ent = (Map.Entry) paramIter.next();
- String paramName = (String) ent.getKey();
- TemplateModel paramValue = (TemplateModel) ent.getValue();
- if (paramName.equals(PARAM_NAME_COUNT)) {
- if (!(paramValue instanceof TemplateNumberModel)) {
- throw new TemplateModelException( "The \"" + PARAM_NAME_HR
- + "\" parameter " + "must be a number." );
- }
- countParam = ((TemplateNumberModel) paramValue).getAsNumber()
- .intValue();
- countParamSet = true ;
- if (countParam < 0 ) {
- throw new TemplateModelException( "The \"" + PARAM_NAME_HR
- + "\" parameter " + "can't be negative." );
- }
- } else if (paramName.equals(PARAM_NAME_HR)) {
- if (!(paramValue instanceof TemplateBooleanModel)) {
- throw new TemplateModelException( "The \"" + PARAM_NAME_HR
- + "\" parameter " + "must be a boolean." );
- }
- hrParam = ((TemplateBooleanModel) paramValue).getAsBoolean();
- } else {
- throw new TemplateModelException( "Unsupported parameter: "
- + paramName);
- }
- }
- if (!countParamSet) {
- throw new TemplateModelException( "The required \""
- + PARAM_NAME_COUNT + "\" paramter" + "is missing." );
- }
- if (loopVars.length > 1 ) {
- throw new TemplateModelException(
- "At most one loop variable is allowed." );
- }
- // Yeah, it was long and boring...
- // ---------------------------------------------------------------------
- // 真正开始处理输出内容
- Writer out = env.getOut();
- if (body != null ) {
- for ( int i = 0 ; i < countParam; i++) {
- // 输出 <hr> 如果 参数hr 设置为true
- if (hrParam && i != 0 ) {
- out.write( "<hr>" );
- }
- // 设置循环变量
- if (loopVars.length > 0 ) {
- loopVars[ 0 ] = new SimpleNumber(i + 1 );
- }
- // 执行标签内容(same as <#nested> in FTL).
- body.render(env.getOut());
- }
- }
- }
- }
import java.io.IOException; import java.io.Writer; import java.util.Iterator; import java.util.Map;
import freemarker .core.Environment; import freemarker .template.SimpleNumber; import freemarker .template.TemplateBooleanModel; import freemarker .template.TemplateDirectiveBody; import freemarker .template.TemplateDirectiveModel ; import freemarker .template.TemplateException; import freemarker .template.TemplateModel; import freemarker .template.TemplateModelException; import freemarker .template.TemplateNumberModel;
/** * FreeMarker 自定义标签实现重复输出内容体。 * * * 参数: * count: 重复的次数,必须的且非负整数。 * hr: 设置是否输出HTML标签 "hr" 元素. Boolean. 可选的默认为fals. * * * 循环变量: 只有一个,可选的. 从1开始。 * * */ public class RepeatDirective implements TemplateDirectiveModel {
private static final String PARAM_NAME_COUNT = "count"; private static final String PARAM_NAME_HR = "hr";
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
// --------------------------------------------------------------------- // 处理参数
int countParam = 0; boolean countParamSet = false; boolean hrParam = false;
Iterator paramIter = params.entrySet().iterator(); while (paramIter.hasNext()) { Map.Entry ent = (Map.Entry) paramIter.next();
String paramName = (String) ent.getKey(); TemplateModel paramValue = (TemplateModel) ent.getValue();
if (paramName.equals(PARAM_NAME_COUNT)) { if (!(paramValue instanceof TemplateNumberModel)) { throw new TemplateModelException("The \"" + PARAM_NAME_HR + "\" parameter " + "must be a number."); } countParam = ((TemplateNumberModel) paramValue).getAsNumber() .intValue(); countParamSet = true; if (countParam < 0) { throw new TemplateModelException("The \"" + PARAM_NAME_HR + "\" parameter " + "can't be negative."); } } else if (paramName.equals(PARAM_NAME_HR)) { if (!(paramValue instanceof TemplateBooleanModel)) { throw new TemplateModelException("The \"" + PARAM_NAME_HR + "\" parameter " + "must be a boolean."); } hrParam = ((TemplateBooleanModel) paramValue).getAsBoolean(); } else { throw new TemplateModelException("Unsupported parameter: " + paramName); } } if (!countParamSet) { throw new TemplateModelException("The required \"" + PARAM_NAME_COUNT + "\" paramter" + "is missing."); }
if (loopVars.length > 1) { throw new TemplateModelException( "At most one loop variable is allowed."); }
// Yeah, it was long and boring...
// --------------------------------------------------------------------- // 真正开始处理输出内容
Writer out = env.getOut(); if (body != null) { for (int i = 0; i < countParam; i++) { // 输出 <hr> 如果 参数hr 设置为true if (hrParam && i != 0) { out.write("<hr>"); }
// 设置循环变量 if (loopVars.length > 0) { loopVars[0] = new SimpleNumber(i + 1); }
// 执行标签内容(same as <#nested> in FTL). body.render(env.getOut()); } } }
}
- import java.io.File;
- import java.io.IOException;
- import java.io.Writer;
- import java.util.Map;
- import freemarker .template.Configuration;
- import freemarker .template.DefaultObjectWrapper;
- import freemarker .template.Template;
- import freemarker .template.TemplateException;
- /**
- *
- * 模板工具类
- */
- public class FreeMarkertUtil {
- /**
- * @param templatePath 模板文件存放目录
- * @param templateName 模板文件名称
- * @param root 数据模型根对象
- * @param templateEncoding 模板文件的编码方式
- * @param out 输出流
- */
- public static void processTemplate(String templatePath, String templateName, String templateEncoding, Map<?,?> root, Writer out){
- try {
- Configuration config= new Configuration();
- File file= new File(templatePath);
- //设置要解析的模板所在的目录,并加载模板文件
- config.setDirectoryForTemplateLoading(file);
- //设置包装器,并将对象包装为数据模型
- config.setObjectWrapper( new DefaultObjectWrapper());
- //获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
- Template template=config.getTemplate(templateName,templateEncoding);
- //合并数据模型与模板
- template.process(root, out);
- out.flush();
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (TemplateException e) {
- e.printStackTrace();
- }
- }
- }
import java.io.File; import java.io.IOException; import java.io.Writer; import java.util.Map;
import freemarker .template.Configuration; import freemarker .template.DefaultObjectWrapper; import freemarker .template.Template; import freemarker .template.TemplateException;
/** * * 模板工具类 */ public class FreeMarkertUtil { /** * @param templatePath 模板文件存放目录 * @param templateName 模板文件名称 * @param root 数据模型根对象 * @param templateEncoding 模板文件的编码方式 * @param out 输出流 */ public static void processTemplate(String templatePath, String templateName, String templateEncoding, Map<?,?> root, Writer out){ try { Configuration config=new Configuration(); File file=new File(templatePath); //设置要解析的模板所在的目录,并加载模板文件 config.setDirectoryForTemplateLoading(file); //设置包装器,并将对象包装为数据模型 config.setObjectWrapper(new DefaultObjectWrapper());
//获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致 Template template=config.getTemplate(templateName,templateEncoding); //合并数据模型与模板
template.process(root, out); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); }catch (TemplateException e) { e.printStackTrace(); }
} }
- import java.io.OutputStreamWriter;
- import java.util.HashMap;
- import java.util.Map;
- /**
- *
- * 客户端测试模板输入类
- */
- public class RepeatTest {
- public static void main(String[] args) {
- Map<String,Object> root= new HashMap<String, Object>();
- root.put( "repeat" , new RepeatDirective());
- FreeMarkertUtil.processTemplate( "src/templates" , "repeat.ftl" , "UTF-8" , root, new OutputStreamWriter(System.out));
- }
- }
import java.io.OutputStreamWriter; import java.util.HashMap; import java.util.Map;
/** * * 客户端测试模板输入类 */ public class RepeatTest { public static void main(String[] args) { Map<String,Object> root=new HashMap<String, Object>();
root.put("repeat", new RepeatDirective());
FreeMarkertUtil.processTemplate("src/templates","repeat.ftl", "UTF-8", root, new OutputStreamWriter(System.out));
} }
模板文件repeat.ftl如下:
- <#assign x = 1 >
- 一个参数:
- < @repeat count= 4 >
- Test ${x}
- <#assign x = x + 1 >
- </ @repeat >
- 二个参数:
- < @repeat count= 3 hr= true >
- Test
- </ @repeat >
- 循环变量:
- < @repeat count= 3 ; cnt>
- ${cnt}. Test
- </ @repeat >
<#assign x = 1>
一个参数: <@repeat count=4> Test ${x} <#assign x = x + 1> </@repeat>
二个参数: <@repeat count=3 hr=true> Test </@repeat>
循环变量: <@repeat count=3; cnt> ${cnt}. Test </@repeat>
输出结果:
- 一个参数:
- Test 1
- Test 2
- Test 3
- Test 4
- 二个参数:
- Test
- <hr> Test
- <hr> Test
- 循环变量:
- 1 . Test
- 2 . Test
- 3 . Test
相关推荐
最后,关于标签的性能考虑,应避免在自定义标签中执行耗时操作,因为这会影响模板的渲染速度。尽可能地将计算和逻辑操作交给后端处理,只在标签中处理简单的数据转换和呈现。 总的来说,自定义FreeMarker标签是提高...
在提供的"TestFreemarkerDiy"示例中,可能包含了一个简单的自定义标签实现以及一个演示如何使用该标签的Freemarker模板文件。通过分析这个示例,我们可以学习如何在实际项目中应用自定义标签,以提高模板的可维护性...
// 在这里实现自定义标签的逻辑 env.getOut().write("Hello, World!"); } } ``` 然后,你需要在Spring配置中注册这个自定义标签。在`WebMvcConfigurer`的实现中,添加`freemarkerConfiguration` bean,并使用`...
要实现自定义标签的自动扫描和注册,你需要做以下几步: 1. **创建自定义标签库**:定义一个Java类作为自定义标签的处理器,继承自`freemarker.template.TemplateDirectiveModel`接口,并实现其方法。在这个类中,...
自定义标签在Freemarker中被称为`Custom Tags`,它们通过`<@...>`语法来调用。这些标签通常是由Java代码实现的,它们可以处理复杂的逻辑,如数据库查询、业务处理等,然后返回一个可渲染的字符串给Freemarker模板。...
在FreeMarker中,我们可以利用宏(Macro)这一功能来实现自定义的分页逻辑。宏是可重用的模板片段,可以作为函数来调用,具有参数,可以封装复杂的模板代码。 1. **宏定义**: 在`pager.html`模板文件中,我们可以...
在Struts2中,可以通过实现`com.opensymphony.xwork2.util.ValueStackAware`接口创建自定义标签,让标签能够访问值栈中的数据。Spring框架也有自己的标签库,如Spring Taglib,可以简化JSP页面中的Spring Bean引用。...
除了自定义标签外,JSP还提供了JSTL (JavaServer Pages Standard Tag Library) 和Freemarker等其他模板引擎作为选择。 **1. JSTL** - **优点:** - 标准化的标签集,便于学习和使用。 - 提供了丰富的功能,如...
2. **实现标签类**: 创建一个Java类来实现自定义标签,例如`AmHtml`,并继承自Struts2的标签基类。 3. **定义标签行为**: 在标签类中,你需要覆盖`doStartTag()`和`doEndTag()`方法,以及其他可能需要的方法,来定义...
4. **兼容性**:作为一个好用的自定义标签,它应该与各种视图技术(如JSP、FreeMarker、Thymeleaf等)兼容,并且适应不同的前端样式。 5. **易用性**:使用简单是这个组件的一大优点,意味着只需将`kevinb.jar`引入...
- **自定义函数和标签**:通过`TemplateMethodModelEx`接口实现自定义方法,`TemplateDirectiveModel`接口实现自定义标签。 - **模板缓存**:提高性能,减少不必要的模板编译。 3. **Jeecms标签使用** - **...
8. **自定义标签**:除了内置的Shiro标签,开发者还可以根据项目需求自定义FreeMarker标签,扩展Shiro的功能,实现更具体的权限控制逻辑。 9. **错误处理**:在模板中使用Shiro标签时,要注意异常处理。当用户权限...
在这个示例中,我们将介绍如何将 Shiro 集成到 Spring Boot 项目中,并实现自定义密码验证和 Freemarker 标签根据权限渲染不同页面。 首先,需要在 pom.xml 文件中添加 Shiro 的依赖项: ```xml <groupId>org....
自定义标签是JSP中的一种特性,允许开发者创建自己的标签库,以提高代码的可读性和复用性。这里提到的分页标签可能是基于JSTL (JavaServer Pages Standard Tag Library) 或 Struts1 的自定义标签实现。开发者可以...
本文将深入探讨如何在Struts2中创建自定义标签,特别是基于`UITag`的实现方法,以及其背后的原理和步骤。 #### 二、Struts2自定义标签的构成 Struts2的自定义`UITag`由三部分组成: 1. **UIBean**:用于定义标签...
众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...
freemarker实现自动补齐字符串。通过ftl模版文件(ftl文件为freemarker模版文件)的自定义标签实现自动补齐字符串。代码稍作修改便可左补齐右补齐左右补齐,可自定义设置补齐的字符串。测试通过java文件调用ftl文件...
6. **自定义标签(Custom Tags)**:扩展Freemarker功能的一种方式,允许开发者创建自己的模板语言元素。 7. **缓存机制**:了解如何配置和利用Freemarker的缓存,提高生成静态页面的效率。 8. **模板配置**:如...
- **数据模型**:Freemarker模板与应用程序的数据模型进行绑定,模型中的数据可以在模板中被引用和展示。 - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护...
2. 自定义指令:可以扩展Freemarker的功能,实现自定义的逻辑。 3. 数组和集合处理:Freemarker支持对数组和集合进行遍历、索引等操作。 4. 日期和数字格式化:通过`?date`、`?number`等后缀进行格式化。 5. I18N...