为nutz添加tiles视图

公司的项目使用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的功能,这样能少引用几个类。

好了要睡觉了,剩下的明天再研究。

你可能感兴趣的:(freemarker,框架,jsp,log4j,IOC)