JFinal源码分析------初始化那些事儿2之Render

写过了三篇的JFINAL框架源码的文章,广泛反响都还不错,谢谢各位OSC同仁们的关心和支持,从此我会更加勤奋的更新博文和相关的技术文章,好了闲话不说了,由于OSC上面的同仁们来看博文的基本是带着问题来的,再打广告会出事的!!进入正题! 记得在第一篇博文的时候就讲过一些关于 初始化的事情 主要的操做初始化的操做都在JfinalFiler里面,再次重申一次就是 Jfinal的入口,今天咱们就深刻的继续去聊这个初始化的东西。打开JfinalFilter这个文件,看到这句代码: jfinal.init(jfinalConfig, filterConfig.getServletContext() 就是这一句,咱们的话题就从这里开始,咱们F3走进去看看,能够发现,他从上往下的作了一下的初始化工做:java

<!-- lang: java -->
            boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
	this.servletContext = servletContext;
	this.contextPath = servletContext.getContextPath();
	
	initPathUtil();
	
	Config.configJFinal(jfinalConfig);	// start plugin and init logger factory in this method
	constants = Config.getConstants();
	
	initActionMapping();
	initHandler();
	initRender();
	initActiveRecord();
	initOreillyCos();
	initI18n();
	initTokenManager();
	
	return true;
}

咱们慢慢的解释一下各个的初始化过程: 一、initPathUtil();这个是路径相关的初始化信息程序员

二、Config.configJFinal(jfinalConfig); 这个是加载咱们自定义Config类(也就是咱们在咱们的项目中的继承JFinalConfig的那个类)中的方法的实现,他的执行顺序在JfinalConfig中指定了,其中的原话是这样的: Config order: configConstant(), configRoute(), configPlugin(), configInterceptor(), configHandler()数据结构

你们能够看到,他的顺序就是这样,因此,之后若是亲爱的程序员们还要去想咱们的JFinalConfig这个加载顺序是如何的,这个就是答案!!app

三、constants = Config.getConstants();这个很少说了 配置常量框架

四、initActionMapping();这个是初始化Action映射,底层的数据结构是采用HashMap这种数据集合,经过传入的字符串去找对应的Action,我认为这个是JFinal的一个亮点,真的,不少养分都在这里,有时间咱们好好分析它是如何的有养分jsp

五、initHandler();//这个是处理器的初始化,具体的下次再说 六、initRender();//今天的重点,准备开扒 七、initActiveRecord();//这个是ActiveRecord的初始化,这个是咱们最 八、initOreillyCos();//这个干吗的。还在摸索,据推测,应该与文件上传相关的东西 九、initI18n();//国际化 不用多讲了吧 十、initTokenManager();//这个不知道怎么说....求专业名词this

initRender()编码

咱们F3到initRender()中,咱们能够看到如下的代码: private void initRender() { RenderFactory renderFactory = RenderFactory.me(); renderFactory.init(constants, servletContext); }spa

能够看到,在Jfinal中的Render的产生是经过工厂模式来生成的,第一句就是经过RenderFactory的me方法来生成的,其定义以下: private static final RenderFactory me = new RenderFactory(); 这也就是说在咱们的JFinal框架被加载的时候, 咱们就可以获得一个RenderFactory对象实例,这样的话 咱们就可以使用这个对象实例进行初始化了。code

下面 咱们来看看renderFactory.init(constants, servletContext)中有啥?

public void init(Constants constants, ServletContext servletContext) { this.constants = constants; RenderFactory.servletContext = servletContext;

// init Render
	Render.init(constants.getEncoding(), constants.getDevMode());
	initFreeMarkerRender(servletContext);
	initVelocityRender(servletContext);
	initFileRender(servletContext);
	
	// create mainRenderFactory
	if (mainRenderFactory == null) {
		ViewType defaultViewType = constants.getViewType();
		if (defaultViewType == ViewType.FREE_MARKER)
			mainRenderFactory = new FreeMarkerRenderFactory();
		else if (defaultViewType == ViewType.JSP)
			mainRenderFactory = new JspRenderFactory();
		else if (defaultViewType == ViewType.VELOCITY)
			mainRenderFactory = new VelocityRenderFactory();
		else
			throw new RuntimeException("View Type can not be null.");
	}
	
	// create errorRenderFactory
	if (errorRenderFactory == null) {
		errorRenderFactory = new ErrorRenderFactory();
	}
}

这里面主要有下面的事情发生了: 一、Render.init() 在这里主要是作编码的设置和开发模式的设置 二、初始化Freemark,Velocity,File 三、经过获取视图的值来选择咱们随用的视图种类,如,你是使用Freemark,仍是使用JSP,仍是使用VELOCITY。也能够看出,JFINAL是支持咱们刚刚提到的三种是视图的,至于你喜欢哪一个,能够再Constant里面设置

当咱们或得了我么的视图类型的之后 咱们能够进入到相应的RenderFactory的中去看看他还为咱们作了些啥。已JSPRenderFactory为例: 在RenderFactory中,他定义了一下的代码:

private static final class JspRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new JspRender(view); } public String getViewExtension() { return ".jsp"; } } 能够看到,其中全部的XxxRenderFactory都继承了一个IMainRenderFactory接口,这里面的两个方法都是须要他在被继承的类中作实现的,这两个方法是: Render getRender(String view); String getViewExtension(); 这两个方法的做用是:一个是用来获取Render的实例,一个是用来获取视图的后缀名。 回到咱们的JspRenderFactory 中,咱们能够看到在实现第一个方法的时候,他放回的时候一个JspRender,实现第二个方法的时候,获取的后缀名是.jsp,好了,这样的话就初始化好了咱们Render类型,在调用的时候就可以根据对应的设置来作Render对应的视图类型了

view参数就是Controller中传过来的咱们制定的那个跳转的视图,那么这个view在何时下使用了??这里就简单说一下 在咱们刚刚的JspRender中有一下代码: public void render() { try { if (isSupportActiveRecord) supportActiveRecord(request); request.getRequestDispatcher(view).forward(request, response); } catch (Exception e) { throw new RenderException(e); } }

你们有没有看到熟悉的,大概可以猜到了吧,咱们在咱们出来Action的时候,确定会有一步调用到这个 而后经过 request.getRequestDispatcher(view).forward(request, response); 去跳转,简单的就是这么样的,具体如何工做的 咱们下次再说!!!

Render()就初始化就是大概就是这样....

相关文章
相关标签/搜索