自定义DatabaseSource,模板放在数据库里

1 定义DatabaseSource

public class DatabaseSource implements ISource {
	
	private String tableName;
	private String keyFieldName;
	private String contentFieldName;
	private String keyValue;
	
	public DatabaseSource(String tableName, String keyFieldName, String contentFieldName, String keyValue) {
		if (StrKit.isBlank(tableName)) {
			throw new IllegalArgumentException("tableName can not be blank");
		}
		if (StrKit.isBlank(keyFieldName)) {
			throw new IllegalArgumentException("keyFieldName can not be blank");
		}
		if (StrKit.isBlank(contentFieldName)) {
			throw new IllegalArgumentException("contentFieldName can not be blank");
		}
		if (StrKit.isBlank(keyValue)) {
			throw new IllegalArgumentException("keyValue can not be blank");
		}
		
		this.tableName = tableName;
		this.keyFieldName = keyFieldName;
		this.contentFieldName = contentFieldName;
		this.keyValue = keyValue;
	}

	@Override
	public boolean isModified() {
		return false;
	}

	@Override
	public String getKey() {
		return keyValue;
	}

	@Override
	public StringBuilder getContent() {
		Record record = Db.findFirst("SELECT * FROM " + tableName + " WHERE " + keyFieldName + "=? LIMIT 1", keyValue);
		if(null == record || StrKit.isBlank(record.getStr(contentFieldName))) {
			throw new NullPointerException("content can not be null: keyValue=" + keyValue);
		}
		return new StringBuilder(record.getStr(contentFieldName));
	}

	@Override
	public String getEncoding() {
		return EngineConfig.DEFAULT_ENCODING;
	}
	
	public void setTableName(String tableName) {
		this.tableName = tableName;
	}
	
	public void setKeyFieldName(String keyFieldName) {
		this.keyFieldName = keyFieldName;
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("Table Name: ").append(tableName).append("\n");
		sb.append("Key Field Name: ").append(keyFieldName).append("\n");
		sb.append("Content Field Name: ").append(contentFieldName).append("\n");
		sb.append("Key Value: ").append(keyValue).append("\n");
		return sb.toString();
	}
}

2 定义DatabaseSourceFactory

public class DatabaseSourceFactory implements ISourceFactory {
	
	private String tableName;
	private String keyFieldName;
	private String contentFieldName;
	
	public DatabaseSourceFactory(String tableName, String keyFieldName, String contentFieldName) {
		this.tableName = tableName;
		this.keyFieldName = keyFieldName;
		this.contentFieldName = contentFieldName;
	}

	@Override
	public ISource getSource(String baseTemplatePath, String fileName, String encoding) {
		return new DatabaseSource(tableName, keyFieldName, contentFieldName, fileName);
	}

}

3 测试请求

public void test() {
		Engine engine = Engine.use("database");
		if(null == engine) {
			engine = Engine.create("database");
			engine.setBaseTemplatePath(null);
			engine.setSourceFactory(new DatabaseSourceFactory("t_template", "template_key", "template_content"));
		}
		engine.setDevMode(true);
		
		//com.jfinal.template.Template template = engine.getTemplate(new DatabaseSource("t_template", "template_key", "template_content", "/index"));
		com.jfinal.template.Template template = engine.getTemplate("/index");
		
		String result = template.renderToString(Kv.by("name", "Adam"));
		
		renderHtml(result);
	}

4 测试数据模板/layout

#define layout()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>佰亿互联管理系统 - tbynet.com</title>
<link rel="stylesheet" type="text/css" href="/UI-INF/layui/css/layui.css">
<link rel="stylesheet" type="text/css" href="/UI-INF/admin/css/admin.css">
</head>
<body>
 #@content()
</body>
</html>
#end

5 测试数据模板/index

#include("/layout")
#@layout()
#define content()
my name is #(name)!
#end


评论区

Adam

2017-08-20 19:33

有点限制,就是engine.getTemplate("/index")这里的参数值前缀必须以“/”开头,jfinal框架在这块做了判断,如果不是“/”开头的,则自动加上“/”.

JFinal

2017-08-21 11:13

@Adam jfinal 自动添加 "/" ,那么你在程序中就可以不用处理这个参数了

热门分享

扫码入社