Jfinal中能否render视图到一个变量中?

发布于 2021-12-02 02:34:25 字数 409 浏览 761 评论 14

@JFinal 你好,想跟你请教个问题:

有这样一种情况,在PHP框架ThinkPHP中,关于视图呈现有这样一种用法:

$html = $this->fetch("模板1");

$this->assign("html",$html);

$this->display("模板2");

这里将模板1解析后,赋值到$html,然后将 $html 作为视图的参数,在模板2中,以变量的形式输出。

不知道在Jfinal极速框架中有什么方式可以实现类似的用法吗?


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

网名女生简单气质 2021-12-03 17:55:05

用模板解决的问题,和Jfinal么关系

羁拥 2021-12-03 17:55:05

我这里的用法是将渲染结果传递给页面中作为JS变量,以便于在JS中动态操作html模板。手动构造html模板太痛苦了,而且变化极大,不便于维护,所以直接将模板写在文件中,后台渲染后,传递给JS变量。不知道有什么更优的方式来完成这种应用。

爱你是孤单的心事 2021-12-03 17:54:58

我这里的用法是将渲染结果传递给页面中作为JS变量,以便于在JS中动态操作html模板。手动构造html模板太痛苦了,而且变化极大,不便于维护,所以直接将模板写在文件中,后台渲染后,传递给JS变量。

自此以后,行同陌路 2021-12-03 17:54:27

回复
没让你手动构造什么HTML啊,模板引擎写好HTML,用变量占位不就好了,然后渲染不就得了。。。渲染后的结果作为一个变量,再传给其他模板不就好了。。。听不懂你说什么。。。这些本来就是模板引擎都支持的啊

够钟 2021-12-03 17:54:12

回复
模板中是有可能会使用后台controller传递过来的数据的,所以只用模板就不行了。上一条回复中已经提供代码实现该用法了。

秉烛思 2021-12-03 17:50:58

回复
那你用啊。。。模板里本来就能使用变量。。。真不明白你纠结什么

离去的眼神 2021-12-03 17:44:19

回复
都没明白问题中是什么意思,你回答什么?可以不用回了。我提出的问题JFinal已经做了专业的解答,并且已经做了完成,我也贴出了代码以供参考。回复你的评论完全就是礼貌性的技术探讨了。你自己回头去看看你给别人的回复,有一个是认真帮助别人或真诚的技术讨论的吗?对新手各种打击,各种喷。

猫性小仙女 2021-12-03 17:24:44

这种方式,模板引擎中很常用啊,比如将渲染结果作为报表或邮件来发送。

我用的beetl模板引擎是很方便的

背叛残局 2021-12-03 17:09:52

按照自定义Render的方式,已经完成该用法。解决了不能同时Render多个视图的问题。提供出来供参考。

/***
 * 自定义Render,可以将模板Render到字符串变量
 * 用法:
 * FreeMarkerToVarRender render = new FreeMarkerToVarRender(this, "pm/task/", "task_row.html");
 * String tpl = render.getContent();
 * 
 */
package com.qdg.framework.jfinal;

import java.io.StringWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import com.jfinal.core.Controller;
import com.jfinal.render.FreeMarkerRender;
import com.jfinal.render.RenderException;

import freemarker.template.Template;


public class FreeMarkerToVarRender extends FreeMarkerRender{
	private static final String encoding = getEncoding();
	private static final String contentType = "text/html; charset=" + encoding;

	/**
	 * 接受模板内容的变量
	 */
	private String content;
	
	/**
	 * 获取解析后的模板内容
	 * @return
	 */
	public String getContent(){
		this.render();
		return content;
	}
	
	/**
	 * 
	 * @param ctrl 控制器,调用时传送this
	 * @param viewPath 视图路径
	 * @param view 视图文件
	 */
	public FreeMarkerToVarRender(Controller ctrl, String viewPath, String view) {
		super(view);
		if(!viewPath.endsWith("/")){
			viewPath += "/";
		}
		if(!viewPath.startsWith("/")){
			viewPath = "/" + viewPath;
		}
		this.setContext(ctrl.getRequest(), ctrl.getResponse(), viewPath);
	}
	
	

	@SuppressWarnings({"unchecked", "rawtypes"})
	public void render() {
		response.setContentType(contentType);
        
		Map root = new HashMap();
		for (Enumeration<String> attrs=request.getAttributeNames(); attrs.hasMoreElements();) {
			String attrName = attrs.nextElement();
			root.put(attrName, request.getAttribute(attrName));
		}
		
		StringWriter writer = new StringWriter();
        try {
			Template template = super.getConfiguration().getTemplate(view);			
			template.process(root, writer);		// Merge the data-model and the template
			content = writer.toString();
		} catch (Exception e) {
			throw new RenderException(e);
		}
		finally {
			
		}
	}
	
}

控制器中使用方式(并不影响主视图的呈现):

//自己重写的Render
FreeMarkerToVarRender render = new FreeMarkerToVarRender(this, "pm/task/", "task_row.html");
this.setAttr("num", "01");				//传递个子模板的数据		
this.setAttr("task_row1", render.getContent());	//尝试获取解析到的模板的内容,并赋值给参数
this.setAttr("num", "02");				//传递个子模板的数据		
this.setAttr("task_row2", render.getContent());	//第二行
		
		
//显示主模板
this.render("breakdown.html");

凯凯我们等你回来 2021-12-03 17:09:47

多个模板的话, 你应该按照波总的回复,实现Render接口,在这个接口render方法显示,你自己调用多个freemarker模板

泛滥成性 2021-12-03 16:59:31

回复
@iehyou : 我这里的FreeMarkerToVarRender类的中render方法中将模板解析输出到了变量中的,现在的问题是一个contoller中只能使用一个render。控制器中调用render(),实际上并没有执行到FreeMarkerToVarRender中的render()方法。

裸钻 2021-12-03 16:28:57

引用来自“JFinal”的评论

      只需要通过继承 Render 或者某个具体的 Render,例如 FreemarkerRender,然后在其 render() 方法中,将输出的 Writer 换成你自己的 new StringWriter(),这样就可以将内容输出到 StringWriter 对象中去了。

     使用自定义的 render 这样用:

render(new MyRender());

别再吹冷风 2021-12-03 01:55:48

按照您的方法试过了,但是一个controller只能render一个模板啊,就是以最后的一个为准。我这里想要的用法是,将1-N个模板,输出到变量,这N个变量作为参数传递给主模板,由主模板在适当的位置输出。怎么能够同时使用多个render呢?

绝情姑娘 2021-12-02 12:45:29

      只需要通过继承 Render 或者某个具体的 Render,例如 FreemarkerRender,然后在其 render() 方法中,将输出的 Writer 换成你自己的 new StringWriter(),这样就可以将内容输出到 StringWriter 对象中去了。

     使用自定义的 render 这样用:

render(new MyRender());

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文