https://www.iteye.com/blog/user/yuhuiblog6956676dfdsfs8883568269/blog/2509258
以上是string模板,html模板也有对应的模板框架
用对应的引擎把模板路径,实际内容传入即可--思路一样
1,对应的模板引擎加入模板路径生成对应的模板实例
2,模板实例处理要处理的内容
davinci的邮件模板源码:
MailUtils
inviteOrgMemberTemplate.html
String text = templateEngine.process(template, context);
public final String process(String template, IContext context) {
return this.process(new TemplateSpec(template, (Set)null, (TemplateMode)null, (String)null, (Map)null), context);
}
public final String process(TemplateSpec templateSpec, IContext context) {
FastStringWriter stringWriter = new FastStringWriter(100);
this.process((TemplateSpec)templateSpec, (IContext)context, (Writer)stringWriter);
return stringWriter.toString();
}
davinci的脚本模板源码:
ScriptUtiils
executeParam.js
Constants
public static ScriptEngine getExecuptParamScriptEngine() throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new InputStreamReader(classLoader.getResourceAsStream(Constants.EXECUTE_PARAM_FORMAT_JS)));---模板路径
return engine;
}
WidgetServiceImpl:
ScriptEngine engine = getExecuptParamScriptEngine();
executeParam = getViewExecuteParam((engine), null, widget.getConfig(), null);--通过模板引擎调用js(java调用js)
配置解析成json对象:
function getDashboardItemExecuteParam(dashboardConfigJson, widgetConfigJson, itemId) {
var dashboardConfig = JSON.parse(dashboardConfigJson || '{}')
var widgetConfig = JSON.parse(widgetConfigJson || '{}')
var globalFilters = getGlobalFilters(dashboardConfig, +itemId)
var widgetExecuteParam = getWidgetExecuteParam(widgetConfig)
widgetExecuteParam.filters = widgetExecuteParam.filters.concat(globalFilters.filters)
widgetExecuteParam.filters = widgetExecuteParam.filters.map(function(filter) { return JSON.stringify(filter) })
widgetExecuteParam.params = widgetExecuteParam.params.concat(globalFilters.params)
return widgetExecuteParam
}
function getWidgetExecuteParam(widgetConfig) {
var _widgetConfig = widgetConfig;
var cols = _widgetConfig.cols;
var rows = _widgetConfig.rows;
var metrics = _widgetConfig.metrics;
var filters = _widgetConfig.filters;
var color = _widgetConfig.color;
var label = _widgetConfig.label;
var size = _widgetConfig.size;
var xAxis = _widgetConfig.xAxis;
var tip = _widgetConfig.tip;
var orders = _widgetConfig.orders;
var cache = _widgetConfig.cache;
var expired = _widgetConfig.expired;
var nativeQuery = false
if (_widgetConfig.chartStyles && _widgetConfig.chartStyles.table) {
nativeQuery = _widgetConfig.chartStyles.table.withNoAggregators
}
....
}
public static ViewExecuteParam getViewExecuteParam(ScriptEngine engine, String dashboardConfig, String widgetConfig, Long releationId) {
try {
Invocable invocable = (Invocable) engine;
Object obj = invocable.invokeFunction("getDashboardItemExecuteParam", dashboardConfig, widgetConfig, releationId);
if (obj instanceof ScriptObjectMirror) {
ScriptObjectMirror vsom = (ScriptObjectMirror) obj;
List<String> groups = new ArrayList<>();
List<Aggregator> aggregators = new ArrayList<>();
List<Order> orders = new ArrayList<>();
List<String> filters = new ArrayList<>();
Boolean cache = false;
Boolean nativeQuery = false;
Boolean filterAndFlag = false;
Long expired = 0L;
List<Param> params = new ArrayList<>();
for (String key : vsom.keySet()) {
switch (key) {
case "groups":
ScriptObjectMirror groupMirror = (ScriptObjectMirror) vsom.get(key);
if (groupMirror.isArray()) {
Collection<Object> values = groupMirror.values();
values.forEach(v -> groups.add(String.valueOf(v)));
}
break;
case "aggregators":
ScriptObjectMirror aggregatorsMirror = (ScriptObjectMirror) vsom.get(key);
if (aggregatorsMirror.isArray()) {
Collection<Object> values = aggregatorsMirror.values();
values.forEach(v -> {
ScriptObjectMirror agg = (ScriptObjectMirror) v;
Aggregator aggregator = new Aggregator(String.valueOf(agg.get("column")), String.valueOf(agg.get("func")));
aggregators.add(aggregator);
});
}
break;
case "orders":
ScriptObjectMirror ordersMirror = (ScriptObjectMirror) vsom.get(key);
if (ordersMirror.isArray()) {
Collection<Object> values = ordersMirror.values();
values.forEach(v -> {
ScriptObjectMirror agg = (ScriptObjectMirror) v;
Order order = new Order(String.valueOf(agg.get("column")), String.valueOf(agg.get("direction")));
orders.add(order);
});
}
break;
case "filters":
Object o = vsom.get(key);
if (o instanceof String) {
String filtersJsonStr = (String) o;
if (!StringUtils.isEmpty(filtersJsonStr)) {
filters.add(filtersJsonStr);
}
} else if (o instanceof ScriptObjectMirror) {
ScriptObjectMirror filterMirror = (ScriptObjectMirror) o;
if (filterMirror.isArray() && filterMirror.size() > 0) {
Collection<Object> values = filterMirror.values();
values.forEach(v -> {
filters.add(String.valueOf(v));
});
}
}
break;
case "cache":
cache = (Boolean) vsom.get(key);
break;
case "expired":
expired = Long.parseLong(String.valueOf(vsom.get(key)));
break;
case "params":
ScriptObjectMirror paramsMirror = (ScriptObjectMirror) vsom.get(key);
if (paramsMirror.isArray()) {
Collection<Object> values = paramsMirror.values();
values.forEach(v -> {
ScriptObjectMirror agg = (ScriptObjectMirror) v;
Param param = new Param(String.valueOf(agg.get("name")), String.valueOf(agg.get("value")));
params.add(param);
});
}
break;
case "nativeQuery":
nativeQuery = (Boolean) vsom.get(key);
break;
case "filterAndFlag":
filterAndFlag = (Boolean) vsom.get(key);
break;
}
}
return new ViewExecuteParam(groups, aggregators, orders, filters, params, cache, expired, nativeQuery,filterAndFlag);
}
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
相关推荐
SpringBoot整合Direct Web Remoting (DWR)是一个常见的技术实践,它允许JavaScript在浏览器端直接调用服务器端的Java方法,极大地增强了Web应用的交互性。在这个过程中,我们通常会结合使用FreeMarker或JSP作为视...
中控指纹JAVA JS调用说明文档是一份详细的技术文档,旨在介绍如何在浏览器/服务器(B/S)环境中利用Java与JavaScript来实现指纹识别的功能。该文档不仅涵盖了ZKOnlineSDK的基本描述和架构,还深入介绍了其核心特性...
总的来说,Velocity.js是一个强大且灵活的JavaScript模板引擎,它的设计思想源于Java的Velocity,但在JavaScript环境中提供了更广泛的适用性和卓越的性能表现。无论是在服务器端的Node.js环境还是前端浏览器,...
Beet,或Beetl,是一款高效、强大且易用的Java模板引擎,它的出现为Java开发带来了很多便利。 Beetl的核心设计理念是简洁、快速和易用。它提供了丰富的语法支持,包括表达式、控制结构、函数等,使得模板编写更加...
1. **快速执行**:Nashorn引擎使用了优化的编译器,使其在执行JavaScript代码时具有较高的性能。 2. **互操作性**:Java与JavaScript之间有着良好的互操作性,允许Java对象无缝地在JavaScript环境中使用。例如,Java...
"ricricucit-html5admin-efa485e"这个文件名可能表示这是一个基于HTML5的后台管理模板,可能包含了CSS3、JavaScript(可能包括jQuery、Vue.js或React.js等前端库)以及一些后端接口调用示例。这样的模板通常会提供...
Jade 是一种高性能的模板引擎,它深受 Haml(一种用于 Ruby 的模板引擎)的影响,采用 JavaScript 编写,主要面向 Node.js 开发者提供服务。通过 Jade,开发者能够更加高效、简洁地创建 HTML 文档。 #### 二、特性 ...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Thymeleaf是一款强大的Java模板引擎,主要用于生成HTML5、XML、JavaScript以及CSS等Web内容。它在设计上强调了可读性和易于维护性,使得开发者在编写静态HTML原型时可以无缝过渡到动态生成的页面。Thymeleaf的主要...
Thymeleaf是一款强大的Java模板引擎,主要用于生成HTML5页面,尤其在Web应用程序中表现出色。它以自然的HTML语法为基础,允许开发者在HTML代码中直接编写模板逻辑,而无需离开HTML环境。Thymeleaf的主要特点在于其可...
3. **Applet调用JavaScript**:JavaApplet可以使用`netscape.javascript.JSObject`或`sun.java2d.npsv.NPSVAppletStub`类(取决于浏览器的兼容性)来调用页面上的JavaScript函数。 4. **LiveConnect**:这是早期...
3. **数据绑定**:在Java代码中,创建模板引擎实例,设置数据模型,然后调用渲染方法将数据填充到模板中,生成最终的输出。 4. **模板调试**:Beetl3提供了良好的错误提示和调试机制,便于开发者定位和解决问题。 ...
5. **学习和使用**:要开始使用青翼模板引擎,你需要了解它的基本语法,熟悉如何定义模板、绑定数据以及如何调用引擎来生成HTML。压缩包内的文档和示例将非常有助于这一步骤。 6. **最佳实践**:在实际项目中,合理...
此外,还可以考虑使用第三方库如Jackson或Gson来简化JSON序列化和反序列化过程,或者使用模板引擎(如FreeMarker或Thymeleaf)来动态生成HTML页面,避免直接在JavaScript中拼接JSON字符串。 总的来说,Java和...
在Java开发中,将HTML转换为图片是一种常见的需求,例如用于网页截图、报表生成或邮件模板预览。本文将深入探讨几种不同的方法,分析它们的优缺点,以帮助开发者选择最适合项目需求的解决方案。 1. **Java2DPDF库转...
Beetl是一种新一代模板引擎,它具有强大的功能和优异的性能,易于学习和使用。它支持多种web框架的整合,如SpringMVC、JFinal、Struts、Nutz、Jodd和Servlet等,并能够单独开发和测试模板,无需M和C部分的参与。...
在IT行业中,模板引擎是一种非常重要的工具,尤其在Web开发领域。它允许开发者将静态的HTML模板与动态数据结合,生成最终的HTML页面。这种技术极大地提高了开发效率,减少了重复劳动,同时也使得前后端分离更加明确...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
- 对于动态生成的内容,优先考虑使用safe.js的模板引擎,而不是手动拼接字符串。 - 了解并遵循safe.js的错误处理机制,及时捕获和解决可能出现的安全问题。 6. **学习资源与社区支持**: 通过阅读这份中文文档,...
在Java中调用WORLD模板,可能是指在Java应用中使用JavaScript引擎,如Nashorn或Rhino,来执行JavaScript代码。这种技术被称为JavaScript嵌入,它允许Java开发者利用JavaScript的灵活性和库资源,同时保持Java的系统...