-
2021-03-05 21:13:35
目前功能已经全部完成了,暂定名字为ayada.
Ayada是一个java版的模板引擎, 支持jstl语法, 支持el表达式. 支持自定义标签.
1. 基本使用
// webapp代表应用根目录
// 如果页面使用了t:include指令, 则根目录必须指定
// TemplateContext对模板进行管理, 默认情况下模板在修改5分钟之后重新编译,
// 因此TemplateContext对象在应用中应该是单粒.
TemplateContext templateContext = new TemplateContext("webapp");
Template template = templateContext.getTemplate("/user/userList.tml");
StringWriter writer = new StringWriter();
PageContext pageContext = JspFactory.getPageContext(writer);
List
userList = UserHandler.getUserList(16);
pageContext.setAttribute("userList", userList);
DefaultExecutor.execute(template, pageContext);
System.out.println(writer.toString());
2. 自定义标签
在classes目录下建taglib.tld文件, 内容如下:
## ---- compile tag ----
t:taglib com.skin.ayada.jstl.core.LibTag
## ---- jstl.core ----
## default tag support
c:if com.skin.ayada.jstl.core.IfTag
c:set com.skin.ayada.jstl.core.SetTag
c:out com.skin.ayada.jstl.core.OutTag
c:each com.skin.ayada.jstl.core.ForEachTag
c:forEach com.skin.ayada.jstl.core.ForEachTag
c:choose com.skin.ayada.jstl.core.ChooseTag
c:when com.skin.ayada.jstl.core.WhenTag
c:otherwise com.skin.ayada.jstl.core.OtherwiseTag
c:comment com.skin.ayada.jstl.core.CommentTag按照该格式添加自定义标签即可.
自定义标签支持两种引入方式.
全局引入: 在taglib.tld文件中定义的都是全局标签
局部引入: 在页面中引入, 使用
局部引入的方式要求必须全局引入t:taglib(t:taglib可以在taglib.tld文件中修改为其他名字)
建议使用全局引入的方式.
3. el表达式
el表达式解析采用的是ognl, ognl在对不存在的对象进行解析的时候会抛异常, 为了避免在页面中有过多的null检查
因此对这种异常进行了屏蔽, 屏蔽的方式请参看ExpressionContext:
// 此处覆盖了OgnlContext的get方法
@Override
public Object get(Object key)
{
Object value = this.pageContext.getAttribute(key.toString());
// 如果此处拿到的对象为空, 则返回一个空的Map对象
if(value == null)
{
return new HashMap();
}
return value;
}
4. 模板页面示例
------------------------------------------------------------
testc:cout test
${user.userName}c:if test
1 == 1
c:each test
${varValue}
my:hello test
新添加了filter支持,这样不需要把模板渲染的代码写到servlet了,只需要配置一个filter即可
TemplateFilter
com.skin.ayada.filter.TemplateFilter
home
/template
TemplateFilter
/template/*
FORWARD
servlet示例
public class HelloServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
List userList = null; // userManager.getUserList();
request.setAttribute("userList", userList);
// forward之后会被TemplateFilter拦截进行模板渲染
request.getRequestDispatcher("/template/user/userList.html").forward(request, response);
}
}
下载地址: https://code.google.com/p/ayada/
更多相关内容 -
Java实现简单的模板渲染
2020-08-28 11:52:38主要为大家详细介绍了Java实现简单的模板渲染的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java后端模板引擎对比
2021-03-15 11:45:02其工作模式如下: 二、java常用的模板引擎有哪些jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。Velocity:不仅可以用于...模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的。他可以生成特定格式的文档,常用的如格式如HTML、xml以及其他格式的文本格式。其工作模式如下:
二、java常用的模板引擎有哪些
jsp:是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。
Thymeleaf : 主要渲染xml,HTML,HTML5而且与springboot整合。
Velocity:不仅可以用于界面展示(HTML.xml等)还可以生成输入java代码,SQL语句等文本格式。
FreeMarker:功能与Velocity差不多,但是语法更加强大,使用方便。
三、常用模板引擎对比
由于jsp与thymeleaf主要偏向于网页展示,而我们的需求是生成java代码与mybatis配置文件xml。顾这里只对Velocity与FreeMarker进行对比。
示例:1万次调用动态生成大小为25kb左右的mybatisxml文件
1、Velocity 模板文件
#foreach($map in $methodList)
#if(${map.sqlType} == "select")
${map.desc}
#elseif(${map.sqlType} == "insert")
${map.desc}
#else
#end
#end
2、Velocity java执行代码
public class VelocityTest {
public static void main(String[] args) {
//得到VelocityEngine
VelocityEngine ve = new VelocityEngine();
//得到模板文件
ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, "/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources");
ve.init();
Template template = ve.getTemplate("velocity.vm", "UTF-8");
VelocityContext data = new VelocityContext();
// Map data = new HashMap<>();
data.put("mapperName", "com.xxx.mapperName");
List methodList = DataUtils.createData(200);
data.put("methodList", methodList);
//
try {
//生成xml
//调用merge方法传入context
int num = 1;
int total=10000;
for (int i=0;i
StringWriter stringWriter = new StringWriter();
long curr = System.currentTimeMillis();
template.merge(data, stringWriter);
long end = System.currentTimeMillis();
// stringWriter.flush();
total+=(end-curr);
}
System.out.println("total="+total+",vag="+(total*1f/num));
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、FreeMarker 模板文件
${method.desc}
${method.desc}
#if>
#list>
4、FreeMarker 执行代码
public class FreeMTest {
public static Template getDefinedTemplate(String templateName) throws Exception{
//配置类
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg.setDirectoryForTemplateLoading(new File("/Users/huhaiquan/project/database-proxy/database-proxy-server/src/test/resources/"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
return cfg.getTemplate(templateName);
}
public static void main(String[] args){
Map data = new HashMap<>();
data.put("mapperName", "com.xxx.mapperName");
List methodList =DataUtils.createData(200);
data.put("methodList", methodList);
try {
Template template = getDefinedTemplate("freemarker.ftl");
long total = 0;
int num = 10000;
for (int i=0;i
StringWriter stringWriter = new StringWriter();
long curr = System.currentTimeMillis();
template.process(data,stringWriter);
long end = System.currentTimeMillis();
total+=(end-curr);
// stringWriter.flush();
// System.out.println(stringWriter.toString());
}
System.out.println("total="+total+",vag="+(total/num));
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、特性对比
项目名称版本10000次执行耗时社区支持文件语法功能Velocity2.112833ms较差较少简单,接近java一般FreeMarker2.3.284599ms较好较多简单强大,在日期、数字,国际化方面有健全的处理机制。
结果:虽然网上对比结果一致为Velocity的性能高于FreeMarker,但是我的测试结果却完全相反,可能跟版本有关。语法方面,Velocity更接近java语法,学习成本低,FreeMarker本身提供的语法也相对简单。FreeMarker在社区支持,功能方面要比Velocity强大的多。
-
java 替换字符串模板(模板渲染)
2021-02-12 15:15:56java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:1、使用内置String.formatString message = String.format("您好%s,晚上...java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:
1、使用内置String.format
String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d", "张三", 10.155, 10);
System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10
2、使用内置MessageFormat
String message = MessageFormat.format("您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}", "张三", 10.155, 10);
System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10
3、使用自定义封装
。。。。。
private static Matcher m = Pattern.compile("\\$\\{\\w+\\}").matcher(template);
。。。。。
public static String processTemplate(String template, Mapparams){
StringBuffer sb= newStringBuffer();while(m.find()) {
String param=m.group();
Object value= params.get(param.substring(2, param.length() - 1));
m.appendReplacement(sb, value==null ? "": value.toString());
}
m.appendTail(sb);returnsb.toString();
}public static voidmain(String[] args){
Map map= newHashMap();
map.put("name", "张三");
map.put("money", String.format("%.2f", 10.155));
map.put("point", 10);
message= processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map);
System.out.println(message);//您好张三,晚上好!您目前余额:10.16元,积分:10
}
4、使用模板引擎freemarker
首先引入freemarker.jar,这里以2.3.23版本为例,如果使用maven的配置pom.xml
org.freemarker
freemarker
2.3.23
try{
map= newHashMap();
map.put("name", "张三");
map.put("money", 10.155);
map.put("point", 10);
Template template= new Template("strTpl", "您好${name},晚上好!您目前余额:${money?string(\"#.##\")}元,积分:${point}", new Configuration(new Version("2.3.23")));
StringWriter result= newStringWriter();
template.process(map, result);
System.out.println(result.toString());//您好张三,晚上好!您目前余额:10.16元,积分:10
}catch(Exception e){
e.printStackTrace();
}
importfreemarker.template.Configuration;importfreemarker.template.Template;importfreemarker.template.Version;importjava.io.StringWriter;importjava.text.MessageFormat;importjava.util.HashMap;importjava.util.Map;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/*** Created by cxq on 2018-01-07.*/
public classTpl {public staticConfiguration cfg;static{
cfg= new Configuration(new Version("2.3.23"));
}public static voidmain(String[] args) {
Object[] obj= new Object[]{"张三", String.format("%.2f", 10.155), 10};
System.out.println(processFormat("您好%s,晚上好!您目前余额:%s元,积分:%d", obj));
System.out.println(processMessage("您好{0},晚上好!您目前余额:{1}元,积分:{2}", obj));
Map map= newHashMap();
map.put("name", "张三");
map.put("money", String.format("%.2f", 10.155));
map.put("point", 10);
System.out.println(processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));
System.out.println(processFreemarker("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));
}/*** String.format渲染模板
*@paramtemplate 模版
*@paramparams 参数
*@return
*/
public staticString processFormat(String template, Object... params) {if (template == null || params == null)return null;returnString.format(template, params);
}/*** MessageFormat渲染模板
*@paramtemplate 模版
*@paramparams 参数
*@return
*/
public staticString processMessage(String template, Object... params) {if (template == null || params == null)return null;returnMessageFormat.format(template, params);
}/*** 自定义渲染模板
*@paramtemplate 模版
*@paramparams 参数
*@return
*/
public static String processTemplate(String template, Mapparams) {if (template == null || params == null)return null;
StringBuffer sb= newStringBuffer();
Matcher m= Pattern.compile("\\$\\{\\w+\\}").matcher(template);while(m.find()) {
String param=m.group();
Object value= params.get(param.substring(2, param.length() - 1));
m.appendReplacement(sb, value== null ? "": value.toString());
}
m.appendTail(sb);returnsb.toString();
}/*** Freemarker渲染模板
*@paramtemplate 模版
*@paramparams 参数
*@return
*/
public static String processFreemarker(String template, Mapparams) {if (template == null || params == null)return null;try{
StringWriter result= newStringWriter();
Template tpl= new Template("strTpl", template, cfg);
tpl.process(params, result);returnresult.toString();
}catch(Exception e) {return null;
}
}
}
综合,完整示例:
http://www.weizhixi.com/user/index/article/id/53.html
/*** 简单实现${}模板功能
* 如${aa} cc ${bb} 其中 ${aa}, ${bb} 为占位符. 可用相关变量进行替换
*@paramtemplateStr 模板字符串
*@paramdata 替换的变量值
*@paramdefaultNullReplaceVals 默认null值替换字符, 如果不提供, 则为字符串""
*@return返回替换后的字符串, 如果模板字符串为null, 则返回null*/@SuppressWarnings("unchecked")public static String simpleTemplate(String templateStr, Mapdata, String... defaultNullReplaceVals) {if(templateStr == null) return null;if(data == null) data =Collections.EMPTY_MAP;
String nullReplaceVal= defaultNullReplaceVals.length > 0 ? defaultNullReplaceVals[0] : "";
Pattern pattern= Pattern.compile("\\$\\{([^}]+)}");
StringBuffer newValue= newStringBuffer(templateStr.length());
Matcher matcher=pattern.matcher(templateStr);while(matcher.find()) {
String key= matcher.group(1);
String r= data.get(key) != null ?data.get(key).toString() : nullReplaceVal;
matcher.appendReplacement(newValue, r.replaceAll("\\\\", "\\\\\\\\")); //这个是为了替换windows下的文件目录在java里用\\表示
}
matcher.appendTail(newValue);returnnewValue.toString();
}//测试方法
public static voidmain(String[] args) {
String tmpLine= "简历:\n 姓名: ${姓} ${名} \n 性别: ${性别}\n 年龄: ${年龄} \n";
Map data = new HashMap();
data.put("姓", "wen");
data.put("名", "66");
data.put("性别", "man");
data.put("年龄", "222");
System.out.println(simpleTemplate(tmpLine,null, "--"));
}
http://wen66.iteye.com/blog/830526
static final String jsonStr = "{\"name\":\"11\",\"time\":\"2014-10-21\"}";static final String template = "亲爱的用户${name},你好,上次登录时间为${time}";staticString generateWelcome(String jsonStr,String template){
Gson gson= newGson();
HashMap jsonMap= gson.fromJson(jsonStr, HashMap.class);for(Object s : jsonMap.keySet()) {
template= template.replaceAll("\\$\\{".concat(s.toString()).concat("\\}")
, jsonMap.get(s.toString()).toString());
}returntemplate;
}public static void main(String[] args) throwsIOException {
System.out.println(generateWelcome(jsonStr,template));
}
https://segmentfault.com/q/1010000002484866
在开发中类似站内信的需求时,我们经常要使用字符串模板,比如
尊敬的用户${name}。。。。
里面的${name}就可以替换为用户的用户名。
下面使用正则表达式简单实现一下这个功能:
/*** 根据键值对填充字符串,如("hello ${name}",{name:"xiaoming"})
* 输出:
*@paramcontent
*@parammap
*@return
*/
public static String renderString(String content, Mapmap){
Set> sets =map.entrySet();for(Entryentry : sets) {
String regex= "\\$\\{" + entry.getKey() + "\\}";
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(content);
content=matcher.replaceAll(entry.getValue());
}returncontent;
}
在map里存储了键值对,然后获取键值对的集合,遍历集合进行对字符串的渲染
测试:
@Testpublic voidrenderString() {
String content= "hello ${name}, 1 2 3 4 5 ${six} 7, again ${name}. ";
Map map = new HashMap<>();
map.put("name", "java");
map.put("six", "6");
content=StringHelper.renderString(content, map);
System.out.println(content);
}
有两个变量需要替换,name和six,对应的值分别为java和6,同时name调用了两次。
结果:
hello java, 1 2 3 4 5 6 7, again java.
http://www.zgljl2012.com/javazheng-ze-biao-da-shi-shi-xian-name-xing-shi-de-zi-fu-chuan-mo-ban/
-
thymeleaf框架通过java渲染html生成pdf
2017-10-08 23:06:56java工程中将word格式模板类型在浏览器中以pdf格式下载或预览,使用thymeleaf前端框架,maven工程的demo。 -
使用java Apache poi 根据word模板生成word报表例子
2018-03-24 16:34:02使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701 -
Java中使用velocity实现模板渲染
2021-02-12 13:06:25一、引言展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。...源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。自动 Email:很多软件的用户注册、密码提醒...一、引言
展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。
Velocity 主要使用场景如下:
Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。
源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。
自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。
转换 xml。
二、入门
velocity是一个基于java的模板引擎,与freemarker齐名,下面写一个velocity的hello world的demo。
maven依赖
org.apache.velocity
velocity
${velocity.version}
测试servelt
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/**
* ==Velocity之Hello Wordld入门程序==
*
* 首先,我们在代码中初始化了VelocityEngine这个模板引擎,对其设置参数进行初始化,
* 指定使用ClasspathResourceLoader来加载vm文件。然后我们就可以往VelocityContext这个Velocity
* 容器中存放对象了,在vm文件中我们可以取出这些变量,从而进行模板输出。
*/
public class VelocityTest {
private static final String VM_PATH = "template/velocity/helloworld.vm";
public static void main(String[] args) {
// 初始化模板引擎
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate(VM_PATH);
// 设置变量,velocityContext是一个类似map的结构
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("name", "world");
List list = new ArrayList();
list.add("jack");
list.add("kitty");
velocityContext.put("list", list);
// 输出渲染后的结果
StringWriter stringWriter = new StringWriter();
template.merge(velocityContext, stringWriter);
System.out.println(stringWriter.toString());
}
}
测试结果
hello world
1: This is jack
2: This is kitty
二、语法
2.1 变量
和我们所熟知的其他编程语言一样,Velocity 也可以在模板文件中有变量的概念。
变量定义
#set($name =“velocity”)
等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。
#set($hello =“hello $name”)
上面的这个等式将会给 $hello 赋值为“hello velocity”
变量的使用
在模板文件中使用
{name} 来使用定义的变量。推荐使用
name 和
names 这个变量。
#set($name =“ricky”)
Welcome $name to velocity.com
2.2 循环
在 Velocity 中循环语句的语法结构如下:
#foreach($element in $list)
This is $element
$velocityCount
#end
Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个 $velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.
2.3 条件语句
条件语句的语法如下:
#if(condition)
#elseif(condition)
#else
#end
2.4 关系操作符
Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应&&、||和! 例如:
#if($foo && $bar)
#end
2.5 宏
Velocity 中的宏可以理解为函数定义。定义的语法如下:
#macro(macroName arg1 arg2 …)
#end
调用这个宏的语法是:
#macroName(arg1 arg2 …)
这里的参数之间使用空格隔开,下面是定义和使用 Velocity 宏的例子:
#macro(sayHello $name)
hello $name
#end
#sayHello(“velocity”)
输出的结果为 hello velocity
2.6 内嵌和引用
#parse 和 #include 指令的功能都是在外部引用文件,二者的区别是:
#parse会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析
#include是将引入文件当成资源文件,会将引入内容原封不动地以文本输出
下面分别看两个例子:
案例1:
## foo.vm 文件:
#set($name =“velocity”)
## parse.vm文件:
#parse(“foo.vm”)
输出结果为:
velocity
案例2:
## foo.vm 文件:
#set($name =“velocity”)
## include.vm:
#include(“foo.vm”)
输出结果为:
#set($name =“velocity”)
三、Spring整合velocity进行页面展示
3.1 初步整合
添加依赖
org.apache.velocity
velocity
1.6.2
org.apache.velocity
velocity-tools
2.0
web.xml
mvc-dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springMVC.xml
1
mvc-dispatcher
/
编写/resources/spring-mvc.xml
UTF-8
UTF-8
添加resources/velocity.properties
## 设置模板文件加载器,webapp从应用根目录加载
resource.loader = webapp
webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
## 模板路径,根目录下的vm文件夹,比如访问http://localhost:8080/velocity/t.htm,则选中的模板路径是webapp/vm/t.htm,如果没配置,默认是模板路径是webapp/t.htm
webapp.resource.loader.path = /vm
## 设置编码,不设置会中文乱码
input.encoding = UTF-8
output.encoding = UTF-8
tools.view.servlet.layout.default.template=default.vm
# 默认的布局文件位置
tools.view.servlet.layout.directory=/WEB-INF/layout/
编写webapp/vm/layout/layout.vm
header$screen_content
footer编写webapp/vm/test/index.vm
hello world!${name}
编写测试Controller
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* velocity与Spring MVC集成作为展示页面Demo
*/
@Controller
@RequestMapping(value = "/velocity")
public class MyVelocityTestController {
/**
* 模拟首页
*
* @param model
* @return
*/
@RequestMapping(value = "/index")
public String index(Model model) {
String name = "tester";
model.addAttribute("name", name);
return "test/index";
}
3.2 velocity选择不同的模板
系统中的登录页面所使用的模板与其他普通页面使用的模板不同,或者是某些页面需要引用不同的模板。
先按照上节velocity(4) 的步骤配置好,通过以上配置后普通页面velocity会自动套用layout/default.vm模板。如果登录页面需套用自己独特的模板则如下可以在登录页面中添加:#set($layout="login_layout.vm"),则登录页面将套用"login_layout.vm"模板。
编写webapp/vm/layout/empty.vm
$screen_content
webapp/test/login.vm
#set($layout="layout/empty.vm")
This is the login page
完善测试controller
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* velocity与Spring MVC集成作为展示页面Demo
*/
@Controller
@RequestMapping(value = "/velocity")
public class MyVelocityTestController {
/**
* 模拟首页
*
* @param model
* @return
*/
@RequestMapping(value = "/index")
public String index(Model model) {
String name = "tester";
model.addAttribute("name", name);
return "test/index";
}
/**
* 模拟使用不一样模板的登录页
*
* @param model
* @return
*/
@RequestMapping(value = "/login")
public String login(Model model) {
return "test/login";
}
}
测试
测试1:访问localhost:8080/velocity/index
test1
测试2:访问localhost:8080/velocity/login
test2
可以看到,成功实现了不同页面引用和不引用公共模板的功能。
四、参考资料
-
java根据模板使用框架生成Excel
2018-05-31 14:31:59使用jxls框架生成Excel,简单易懂。内含所使用的引用jar包版本。 -
java根据模板导出PDF详细教程(包含统计图)
2018-07-09 10:27:22根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。此文的测试是在客户端通过java程序的测试,直接运行java类获得成功! -
java-根据word模板生成word-freemarker-完整示例
2018-12-03 13:10:49template文件夹下放入xml模板, 运行Test.java文件, 可以生成word文档 -
Word 模板渲染引擎-Poi-tl
2022-03-13 12:43:35poi-tl 的工作模式为: Template + data-model = output 1.1 为什么选用 poi-tl poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的... -
模板引擎 Thymeleaf 动态渲染 HTML
2021-02-27 14:44:50file1、添加依赖org.thymeleafthymeleaf3.0.9.RELEASE2、编码工具类 HTMLTemplateUtils.javaimport org.thymeleaf.TemplateEngine;import org.thymeleaf.context.Context;.../*** HTML模板渲染工具类*/public class ... -
json-template-renderer:基于json的模板模板渲染器,用于敏捷Web开发
2021-05-13 19:33:32演示版 ...cd json-template-renderer mvn clean package java -Durl.rem=url.rem -jar target/jtr-*.jar src/test/resources/webapp ... 有时一个模板可以由多个模型文件渲染。 请使用查询参数来选择应使用模板呈现的模 -
java 生成Excel,可根据模板格式生成 Excel打印专用 报表
2017-10-27 13:52:16java 生成Excel,可根据模板格式生成 Excel打印专用 报表 这个是旧版本的 ,需要新版本的 可以联系我 -
java后端thymeleaf 通过将数据渲染到html邮件模板
2020-09-07 18:22:14String template:resources下面的html模板名称,如magazine.html ,只要写magazine就可 String variableName 参数...通过springtemplateEngine将数据通过thymeleaf渲染到模板上去,并获取到对应html源码: @Autowired . -
java字符串模板渲染(freemarker,正则)
2018-12-08 10:01:02当我传递一个map,指定上述参数的值后, 需要对字符串模板进行渲染 此类需求常见于短信模板 一、使用freemarker进行处理 FreeMarker是一款模板引擎 模板和数据是FreeMarker来生成输出所必须的组成部分:模板 + ... -
在任何Java程序(访问渲染的DOM树)中渲染JavaScript和HTML?
2021-02-26 15:52:37我知道这个问题一定在这里被问到,但是通过搜索我没有找到解决方案:我的问题是:什么是最好的Java库,“完全下载任何渗透和渲染内置的JavaScript,然后以编程方式访问渲染网页(即DOM-Tree!),并将DOM树作为”HTML -... -
使用freemarker对模板进行渲染
2021-02-26 10:51:45最近项目中使用到了,对word模板进行编辑和渲染,所以使用到了模板引擎技术。在项目中,我们前端使用的富文本编辑器,进行展示和保存(和word格式一致),后端采用了freemarker进行数据的渲染。前端,就不多说了,处理... -
自己写的一个Java渲染模板引擎:SimpleV
2016-12-30 10:07:21Java渲染模板框架有很多,著名的有Velocity等。鉴于最近在学习java,所以自己实现了一个。 -
Java通过word模板导出word
2021-03-11 16:55:30Java通过word模板导出word1.创建word模板文件,注意调整好格式,后期修改较为麻烦2.打开创建好的word模板,点击文件另存为,选择xml格式3.将生成的模板xml文件后缀改成ftl,例如:模板.xml-->模板.ftl4.在项目中... -
vuejs的服务器端渲染和java的服务器端渲染有什么区别吗?
2021-02-26 13:05:29在刚工作做java开发的时候, 全都...java的服务器端渲染以使用Spring为例, 就是写个 Controller, 然后 return 一个模板引擎页面, 同时需要往模板页面中的变量设置值vue的服务器端渲染看官网是结合Express这个web框架... -
java 中根据html模板生成新的html
2013-10-16 14:56:14根据html模板生成新的html,很简单可以运行 -
JAVA后台数据使用thymeleaf渲染html页面
2022-04-08 10:46:12本篇介绍如何使用thymeleaf从后台获取数据后渲染至html页面上。 -
Java开源模板引擎
2017-12-29 11:59:02它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计... -
Springboot 模板渲染
2019-10-24 15:08:05Springboot模板渲染 在之前所见到的信息显示发现都是以Rest风格进行显示,但是在实际开发之中, 所有数据的显示最终都应该交由页面去处理完成。在Springboot中这个页面并不是我之前的jsp ,FM这些而是普通的html... -
Java中模板引擎的使用
2022-04-17 21:38:24Java 中的模板引擎的使用