新人求帮助--那你能帮帮我吗?

① _layout中的#@main()是调用layout函数的页面本身吗?因为有好几个#define main()


②jfinal_demo中的blog.html的分页:

#@paginate(blogPage.pageNumber, blogPage.totalPage, "/blog/")

与_paginate.html中的代码看不太懂,有没有大佬帮帮我,稍微解释一下精髓

#define paginate(currentPage, totalPage, link)

#if(totalPage <= 0 || currentPage > totalPage) #return #end

#setLocal(startPage = currentPage - 4)

#if (startPage < 1) #setLocal(startPage = 1) #end

#setLocal(endPage = currentPage + 4)

#if (endPage > totalPage) #setLocal(endPage = totalPage) #end

<div class="pagination">

#if (currentPage <= 8)

#setLocal(startPage = 1)

#end

#if ((totalPage - currentPage) < 8)

#setLocal(endPage = totalPage)

#end

#if (currentPage == 1)

<span class="disabled prev_page">上页</span>

#else

<a href="#(link)#(currentPage - 1)#(append)" class="prev_page">上页</a>

#end

#if (currentPage > 8)

<a href="#(link)#(1)#(append)">#(1)</a>

<a href="#(link)#(2)#(append)">#(2)</a>

<span class="gap">…</span>

#end

#for(i : [startPage..endPage])

#if (currentPage == i)

<span class="current">#(i)</span>

#else

<a href="#(link)#(i)#(append)">#(i)</a>

#end

#end

#if ((totalPage - currentPage) >= 8)

<span class="gap">…</span>

<a href="#(link)#(totalPage - 1)#(append)">#(totalPage - 1)</a>

<a href="#(link)#(totalPage)#(append)">#(totalPage)</a>

#end

#if (currentPage == totalPage)

<span class="disabled next_page">下页</span>

#else

<a href="#(link)#(currentPage + 1)#(append)" class="next_page" rel="next">下页</a>

#end

</div>

#end


评论区

JFinal

2019-07-23 09:38

关键在于 DemoConfig.java 中的下面代码:
public void configEngine(Engine me) {
me.addSharedFunction("/common/_layout.html");
me.addSharedFunction("/common/_paginate.html");
}

me.addSharedFunction(...) 方法会将 .html 中的所有 #define xxx() 定义的模板函数给 "搞成" 全局的

所以你在任意页面都可以调用 _layout.htm 中的 #define layout() , 在任意页面都可以调用 _paginate.html 的 #define paginate(...)

目光回到你的 controller 中的 render("blog.html"),在 blog.html 中你会看到 #@layout() 这类调用,就是在调用前面提到的全局模板函数

这个逻辑并不复杂,就是先添加全局函数,然后任何地方调用

JFinal

2019-07-23 09:39

强调一下,这个在文档中有详细说明,一定要先看文档,不要猜谜式的使用

瑟瑟发抖的小菜鸟

2019-07-23 09:43

@JFinal #define main()不是_layout.html中定义的吧,_layout.html中只是调用了一下

JFinal

2019-07-23 10:54

@瑟瑟发抖的小菜鸟 笔误, #define layout() 是 _layout.html 中定义的,在 blog.html 中调用的是 #@layout()

笔误已在回复中更正

瑟瑟发抖的小菜鸟

2019-07-23 11:41

@JFinal 嗯嗯,不过对不起啊,我的问题我没有描述清楚,我的第一个问题是:在index.html中#@layout()
#define main()调用了layout,然后又定义了一个main(),_layout.htm中又调用了#@main(),接着blog.html也是这样调用layout,定义main(),那么这个layout中的main()是不是就是谁调用layout,这个layout中的main()就是谁定义的那个-------刚学没几天,波总能耐心回答我的问题,真的很激动哈哈

JFinal

2019-07-23 12:12

@瑟瑟发抖的小菜鸟 以 jfinal 官方的 jfinal_demo_for_maven 为例,用下面的方式来理解,以免绕远了:
1:下面两行代码会将 _layout.html、_paginate.html 中定义的 #define layout()、#define paginate() 这两个模板函数给 "搞成" 全局的
me.addSharedFunction("/common/_layout.html");
me.addSharedFunction("/common/_paginate.html");

2:你的 render("blog.html") 调用中的 blog.html 中的第一行代码是:
#@layout()

上面这行代码调用了前面提到的被 "搞成" 全局的 #define layout() 模板函数

3:现在程序走到了 _layout.html 中的 #define layout() 中,继续往下走,会走到:
#@main()

上面的代码会调用你在 blog.html 中定义的 #define main() 模板函数

其实整个流程,你就当成 java 里头的方法定义与方法调用

JFinal

2019-07-23 12:15

如果你还是无法理解的话,你可以将 _layout.html、_paginate.html 这两个文件中的所有 #define 定义的模板函数代码全部复制到 blog.html 中来理解,结构如下:

#define layout()
...
#@main()
...
#end

#define paginate()
...
#end

#@layout()

#define main()
...
#end

注意:上面所有代码全在 blog.html 之中,其中有三个模板函数定义 #define xxx() , 一个模板函数调用 #@layout()

如果你还是觉得有点不完美,将 #@layout() 这个调用挪到最后一行, 让三个 #define xxx() 放在最前面

JFinal

2019-07-23 12:19

说白了 me.addSharedFunction("/common/_layout.html") 这种用法, 仅仅只是将原本应该在 blog.html 中写的代码,挪到一个独立的地方去,例如挪到 _layout.html 中去

挪到一个独立的文件中去的好处是方便在多个地方都去重用它

瑟瑟发抖的小菜鸟

2019-07-23 12:30

@JFinal 这个就已经明白了,谢谢波总

热门反馈

扫码入社