公司的项目使用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的功能,这样能少引用几个类。
好了要睡觉了,剩下的明天再研究。