NutzCN Logo
精华 nutz-plugins-multiview 多视图插件
发布于 3169天前 作者 邓华锋 3303 次浏览 复制 上一个帖子 下一个帖子
标签: 视图 mvc

原链接:http://www.denghuafeng.com/post-303.html
QQ截图20160314091010_png
针对https://github.com/nutzam/nutz/issues/603#issuecomment-35709620上提出的问题,开发了此插件。
使用步骤:

1.引用nutz-plugins-multiview.jar插件

2.配置MainModule的视图为ResourceBundleViewResolver 

```

@Views({ResourceBundleViewResolver.class})
```
3.配置json文件,创建view.js文件,内容如下:

jsp : { type : "org.nutz.mvc.view.JspExtView", fields : { name : "JSP", prefix : "/WEB-INF/templates/jsp", suffix : ".jsp" } }, btl : { type : "org.nutz.mvc.view.BeetlView", fields : { name : "Beetl", prefix : "/templates/btl", suffix : ".html" } }, jetx : { type : "org.nutz.mvc.view.JetTemplateView", fields : { name : "JetTemplate", prefix : "/WEB-INF/templates/jetx", suffix : ".html" } }, ftl : { type : "org.nutz.mvc.view.FreemarkerView", fields : { name : "Freemarker", prefix : "/WEB-INF/templates/ftl", suffix : ".html" } }, multiViewResover : { type : "org.nutz.mvc.view.MultiViewResover", fields : { resolvers : { "jsp" : { refer : "jsp" }, "btl" : { refer : "btl" }, "jetx" : { refer : "jetx" }, "ftl" : { refer : "ftl" } } } }
创建对应目录

4.在module的方法里返回相应的视图,当然要创建相应的视图文件,如下: 

```

import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;

@At("/beetl")
@IocBean
public class BeetlModule {
@At
@Ok("btl:index")
public void index() {

}

@At
@Ok("btl:test")
public void test() {

}

}
```

 @At("/ftl")
@IocBean
public class FreemarkerModule {
	@At
	@Ok("ftl:index")
	public void index() {

	}
} 
 @At("/jetx")
@IocBean
public class JetTemplateModule {
	@At
	@Ok("jetx:index")
	public void index() {

	}
} 
 @At("/jsp")
@IocBean
public class JspModule {
	@At
	@Ok("jsp:index")
	public void index() {

	}
} 

访问相应的链接,就会找到相应的视图,

注意的地方:1.如果beetl.properties里设置了RESOURCE.root=WEB-INF ,则view.js配置的beetl视图的路径则在WEB-INF下面。例如

#默认配置
#ENGINE=org.beetl.core.FastRuntimeEngine
DELIMITER_PLACEHOLDER_START=${
DELIMITER_PLACEHOLDER_END=}
DELIMITER_STATEMENT_START=<!--#
DELIMITER_STATEMENT_END=-->
DIRECT_BYTE_OUTPUT = FALSE
HTML_TAG_SUPPORT = true
HTML_TAG_FLAG = #
NATIVE_CALL = TRUE
TEMPLATE_CHARSET = UTF-8
ERROR_HANDLER = org.beetl.core.ConsoleErrorHandler
NATIVE_SECUARTY_MANAGER= org.beetl.core.DefaultNativeSecurityManager
RESOURCE_LOADER=org.beetl.core.resource.ClasspathResourceLoader
MVC_STRICT = FALSE
#资源配置,resource后的属性只限于特定ResourceLoader
#classpath 根路径
RESOURCE.root= WEB-INF
#是否检测文件变化
RESOURCE.autoCheck=true

2.jetbrick-template.properties里配置的路径被view.js配置的路径给覆盖。

 template.loader = $loader

$loader = jetbrick.template.loader.ResourceLoader
$loader.root = /WEB-INF
$loader.reloadable =false

既这时候的root路径不起作用。

开发此插件有啥优点了:

1.配置视图的路径可以在配置文件中实现

2.配置视图扩展名也可在配置文件中实现

插件中包含了对beetl、freemarker、JetTemplate和jsp的视图实现,其实把这些代码抽离出来,按需使用可让插件体积更小。

插件的核心类,包括ResourceBundleViewResolver(接口 ViewMaker2的实现,用于从 IOC 容器配置文件中查找视图。)、

AbstractTemplateViewResolver、AbstractUrlBasedView、MultiViewResover和ViewResolver

view.js配置文件中,multiViewResover是约定的名称。

以下是在此插件下对应beetl模板视图的实现,继承于AbstractTemplateViewResolver,实现init和render方法:

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.beetl.core.Configuration;
import org.beetl.core.GroupTemplate;
import org.beetl.core.resource.WebAppResourceLoader;
import org.beetl.ext.web.WebRender;

public class BeetlView extends AbstractTemplateViewResolver {
	public GroupTemplate groupTemplate;

	@Override
	protected void init(String appRoot,ServletContext sc) {
		Configuration cfg = null;
		try {
			cfg = Configuration.defaultConfiguration();
		} catch (IOException e) {
			throw new RuntimeException("加载GroupTemplate失败", e);
		}
		WebAppResourceLoader resourceLoader = new WebAppResourceLoader();
		resourceLoader.setRoot(appRoot);
		groupTemplate = new GroupTemplate(resourceLoader, cfg);
	}

	@Override
	public void render(HttpServletRequest req, HttpServletResponse resp,
			String evalPath, Map<String, Object> sharedVars) throws Throwable {
		groupTemplate.setSharedVars(sharedVars);
		WebRender render = new WebRender(groupTemplate);
		render.render(evalPath, req, resp);
	}

} 

如果配置文件中增加如下代码:
// 读取配置文件
config : {
type : "org.nutz.ioc.impl.PropertiesProxy",
fields : { paths : ["SystemGlobals.properties"] }
}

SystemGlobals.properties属性文件中,可配置如下: 
 # If you change this value, is necessary to edit WEB-INF/web.xml as well
servlet.extension=
resource.dir=resources

ResourceBundleViewResolver源码片段

`````````
String resDir = config.get(RESOURCE_DIR);
if (Strings.isBlank(resDir)) {
resDir = "";
}
String path = req.getContextPath();
int serverPort = req.getServerPort();
String basePath = req.getScheme() + "://" + req.getServerName()
+ (serverPort != 80 ? ":" + serverPort : "")
+ path + "/";
sv.put(PATH, path);
sv.put(BASE_PATH, basePath);
sv.put(SERVLET_EXTENSION, config.get(SERVLET_EXTENSION_KEY));
sv.put(TPL_DIR, tplDir);
sv.put(RES_PATH, path + "/" + resDir);//资源路径
sv.put(TPL_RES_PATH, path + "/" + resDir
+ tplDir + "/");//模板对应的资源路径
vr.render(req, resp, evalPath, sv);

```
共享的变量有
path,
完整的项目连接路径basePath,
请求连接的后缀servletExtension,
模板所在目录tplDir,
资源根路径resPath,
模板对应的资源路径tplResPath,
这几个变量对于做博客论坛等可更换模板的程序很有用。
以上文章很乱,先发布一下,让大家体验一番,我再慢慢细细整理文章,整理代码。
nutz-plugins-multiview 多视图插件大小:15KB | 来源:百度网盘
nutz-plugins-multiview 多视图插件源码大小:9KB | 来源:百度网盘

8 回复

建议
1. 代码托管在 github或 git@osc 貌似网盘地址不可用了
2. 因为看不到源码,只能推测没有maven的pom.xml, 建议添加, 并发布到中央库. (若托管到nutzam/nutzmore项目下, 我们可代发布).

@wendal 你把源码代发布到nutzmore项目吧

https://github.com/nutzam/nutzmore 已为你的github账号添加权限, 建个文件夹放进去即可.

@wendal nutz多视图插件已提交

添加回复
请先登陆
回到顶部