增加 addSharedFunction增加共享模板,并做测试

This commit is contained in:
2026-03-04 14:40:55 +08:00
parent c5a2ac3e24
commit fd7d7c5972
5 changed files with 88 additions and 3 deletions

View File

@@ -110,6 +110,41 @@ class Enjoy:
except Exception as e: except Exception as e:
raise RuntimeError(f"调用失败: {e}") from e raise RuntimeError(f"调用失败: {e}") from e
def addSharedFunction(self, layouts: [str]):
"""添加全局共享函数"""
for layout in layouts:
self._engine.addSharedFunction(layout)
def invoke_engine_method(self, method_name: str, *args, **kwargs) -> Any:
"""
通用方法调用内部_engine的其他可调用方法
:param method_name: 要调用的_engine方法名
:param args: 位置参数
:param kwargs: 关键字参数
:return: 方法调用结果
:raises RuntimeError: 如果Engine未初始化或方法调用失败
"""
if not self._engine:
raise RuntimeError("Engine未初始化请检查Jar包路径")
try:
# 获取_engine的方法
method = getattr(self._engine, method_name)
# 转换Python参数为Java兼容类型
converted_args = [self._convert_python_to_java(arg) for arg in args]
converted_kwargs = {k: self._convert_python_to_java(v) for k, v in kwargs.items()}
# 调用方法并返回结果
return method(*converted_args, **converted_kwargs)
except AttributeError:
raise RuntimeError(f"Engine对象没有方法: {method_name}") from None
except jpype.JException as e:
print(f"\n=== JFinal Enjoy {method_name} 方法调用异常详情 ===")
e.printStackTrace()
raise RuntimeError(f"{method_name}方法调用失败: {e.getMessage()}") from e
except Exception as e:
raise RuntimeError(f"{method_name}方法调用失败: {e}") from e
def close(self): def close(self):
"""关闭JVM释放资源""" """关闭JVM释放资源"""
if self._jvm_started: if self._jvm_started:
@@ -136,6 +171,7 @@ if __name__ == "__main__":
template_base_path=TEMPLATE_BASE_PATH template_base_path=TEMPLATE_BASE_PATH
) )
enjoy.addSharedFunction(['layout.html'])
# 3. 准备模板参数 # 3. 准备模板参数
render_data = { render_data = {
"name": "JFinal Enjoy 5.2.2测试", "name": "JFinal Enjoy 5.2.2测试",
@@ -145,7 +181,7 @@ if __name__ == "__main__":
# 4. 渲染模板tempStr是模板文件名相对于TEMPLATE_BASE_PATH # 4. 渲染模板tempStr是模板文件名相对于TEMPLATE_BASE_PATH
result = enjoy.render( result = enjoy.render(
tempStr="index.html", # 模板文件:./templates/index.html tempStr="layout-test.html", # 模板文件:./templates/index.html
data=render_data # 渲染数据Python字典 data=render_data # 渲染数据Python字典
) )

View File

@@ -0,0 +1,32 @@
#@layout()
### 调用 layout.html 中定义的模板函数 layout()
#define main()
<div>
这里是模板内容部分,相当于传统模板引擎的 nested 的部分
#(name)
<hr>
#for(i : hobbies)
#(i)
#end
<hr>
#for(i : scores)
#(i)
#end
<hr>
#for(i : user)
#(i.key) #(i.value)
#end
</div>
#end
#define css()
这里可以引入额外的 css 内容
#end
#define js()
这里可以引入额外的 js 内容
#end

View File

@@ -0,0 +1,17 @@
#define layout()
<html>
<head>
<link rel="stylesheet" type="text/css" href="/assets/css/jfinal.css">
#@css?()
</head>
<body>
<div class="content">
#@main()
</div>
<script type="text/javascript" src="/assets/js/jfinal.js"></script>
#@js?()
</body>
</html>
#end

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "py-enjoy" name = "py-enjoy"
version = "0.1.2" version = "0.1.3"
authors = [ authors = [
{ name = "mrzhou", email = "mrzhou@miw.cn" } { name = "mrzhou", email = "mrzhou@miw.cn" }
] ]

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name="py-enjoy", name="py-enjoy",
version="0.1.2", version="0.1.3",
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
package_data={ package_data={