公司的项目使用struts1,这时我接触到了tiles,这个页面增强布局框架,使用了将近半年,感觉良好。最近有一个个人项目我采用nutz,感到只用jsp太麻烦,于是想将tiles整合进来。tiles一般是和struts这样的框架整合的例子多,单独用的几乎没有。于是狠下心去看tiles的主页,终于有了收获,用了一下午加一晚上终于跑通了例子,并将nutzView写好了
首先我使用了tiles2.2,去官网下载 bin包。
解压后,选取 tiles-jsp,tiles-core,tiles-servlet,tiles-api,
slf4j-api,slf4j-log4j12,conmmons-beanutils,commons-digester,commons-logging,jcl-over-slf4j,log4j这些jar,copy到 lib下。
然后
public class TestTileFactory extends BasicTilesContainerFactory {
@Override
protected List<URL> getSourceURLs(TilesApplicationContext applicationContext,
TilesRequestContextFactory contextFactory) {
List<URL> urls = new ArrayList<URL>();
try {
urls.add(applicationContext.getResource("/WEB-INF/tiles-defs.xml"));
} catch (IOException e) {
throw new DefinitionsFactoryException(
"Cannot load definition URLs", e);
}
return urls;
}
}
再添加 类
public class TestTilesListener extends AbstractTilesListener {
@Override
protected TilesInitializer createTilesInitializer() {
return new TestTilesListenerInitializer();
}
private static class TestTilesListenerInitializer extends AbstractTilesInitializer {
@Override
protected AbstractTilesContainerFactory createContainerFactory(
TilesApplicationContext context) {
return new TestTileFactory();
}
}
}
在web.xml中添加配置
<listener>
<listener-class>com.sh169.util.TestTilesListener</listener-class>
</listener>
然后是,添加nutz的view
下面是代码
public class TilesView implements View{
private String viewName;
public TilesView(){}
public TilesView(String viewName){
this.viewName = viewName;
}
@SuppressWarnings("deprecation")
@Override
public void render(HttpServletRequest req, HttpServletResponse resp,
Object obj) throws Throwable {
req.setAttribute("obj", obj);
TilesContainer tc = TilesAccess.getContainer(req.getSession().getServletContext());
tc.render(viewName, req,resp);
}
}
public TilesViewMaker(){}
@Override
public View make(Ioc ioc, String type, String value) {
if("tiles".equalsIgnoreCase(type))
return new TilesView(value);
return null;
}
使用时添加 @ok("tiles:yourdefname")即可
使用感受:引用的jar包太多了,精简到4个比较能接受,还有这是2.1中的例子,在2.2中tilesAccess中的 getContainer方法被提示不可用,应该有其他方法可以替代,以后有时间研究下 tiles的源码,自己整理成一个jar包,这样引用比较方便
我感觉包这样划分比较好,tile-core,tile-jsp,tile-freemarker,依次类推。这样使用起来将会很方便,而且logger也应该写一个logger类,替代common-logging的功能,这样能少引用几个类。
好了要睡觉了,剩下的明天再研究。