Jfinal+weblogic,EL取值问题

Deng小尧 发布于 2015/01/09 17:38
阅读 2K+
收藏 5


    Weblogic10.3 搭配 Jfinal 1.9

加载中
0
JFinal
JFinal

     很奇怪的问题,跟踪一下程序是否执行到了 com.jfinal.plugin.activerecord.ModelRecordElResolver.java 的第 49 行,这行是让 jstl 取数据的关键。

    另外,可以试试在 YourJFinalConfig 中调用一下: JspRender.setSupportActiveRecord(true) 改用另一种 jstl 增强方案。

JFinal
JFinal
回复 @Deng小尧 : 感谢支持
Deng小尧
Deng小尧
回复 @JFinal : OK,我今天调试下
JFinal
JFinal
回复 @Deng小尧 : 看一下 com.jfinal.plugin.activerecord.ModelRecordElResolver.java 这个文件,有可能是在 WebLogic 之下,init 方法中的东东执行不了,麻烦你帮忙在 WebLogic 之下调试一下,看有什么解决办法
Deng小尧
Deng小尧
我晕,按照你的方法,加了JspRender.setSupportActiveRecord(true);,就可以了,这是为什么?
0
Deng小尧
Deng小尧
回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 
0
JFinal
JFinal

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 
weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键
0
Deng小尧
Deng小尧

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 

引用来自“JFinal”的评论

weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键

weblogic 初始化的时候,可以进入下面的方法.ModelRecordElResolver里面的init


public synchronized static void init(ServletContext servletContext) {
	    JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
	    if (jspApplicationContext != jac) {
	    	jspApplicationContext = jac;
	    	jspApplicationContext.addELResolver(new ModelRecordElResolver());
	    }
	}


但是if 里面 判断是不成立的,意思是,不知道在什么位置,已经初始化了

jspApplicationContext = jac

所以导致 jspApplicationContext设置不了 ModelRecordElResolver.默认就使用了CompositeELResolver


解决办法,就是在init方法里面判断jspApplicationContext的ELResolver是否等于ModelRecordElResolver,如果不等于,就设置成ModelRecordElResolver





0
JFinal
JFinal

引用来自“Deng小尧”的评论

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 

引用来自“JFinal”的评论

weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键

weblogic 初始化的时候,可以进入下面的方法.ModelRecordElResolver里面的init


public synchronized static void init(ServletContext servletContext) {
	    JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
	    if (jspApplicationContext != jac) {
	    	jspApplicationContext = jac;
	    	jspApplicationContext.addELResolver(new ModelRecordElResolver());
	    }
	}


但是if 里面 判断是不成立的,意思是,不知道在什么位置,已经初始化了

jspApplicationContext = jac

所以导致 jspApplicationContext设置不了 ModelRecordElResolver.默认就使用了CompositeELResolver


解决办法,就是在init方法里面判断jspApplicationContext的ELResolver是否等于ModelRecordElResolver,如果不等于,就设置成ModelRecordElResolver





RenderFactory 与 JspRender 两处会对这个 init 方法进行调用。 if 判断不成立是在第二次调用这个 init 方法时不会造成重复注入 ModelRecordElResolver 对象,所以,楼主观测到的是第二次调用,能监测下第一次调用不? 第一次调用会在系统启动时由 RenderFactory 调用
0
Deng小尧
Deng小尧

引用来自“Deng小尧”的评论

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 

引用来自“JFinal”的评论

weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键

weblogic 初始化的时候,可以进入下面的方法.ModelRecordElResolver里面的init


public synchronized static void init(ServletContext servletContext) {
	    JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
	    if (jspApplicationContext != jac) {
	    	jspApplicationContext = jac;
	    	jspApplicationContext.addELResolver(new ModelRecordElResolver());
	    }
	}


但是if 里面 判断是不成立的,意思是,不知道在什么位置,已经初始化了

jspApplicationContext = jac

所以导致 jspApplicationContext设置不了 ModelRecordElResolver.默认就使用了CompositeELResolver


解决办法,就是在init方法里面判断jspApplicationContext的ELResolver是否等于ModelRecordElResolver,如果不等于,就设置成ModelRecordElResolver





引用来自“JFinal”的评论

RenderFactory 与 JspRender 两处会对这个 init 方法进行调用。 if 判断不成立是在第二次调用这个 init 方法时不会造成重复注入 ModelRecordElResolver 对象,所以,楼主观测到的是第二次调用,能监测下第一次调用不? 第一次调用会在系统启动时由 RenderFactory 调用


按照你的方式,我跟踪RenderFactory 

发现Weblogic在 

jspApplicationContext.addELResolver(new ModelRecordElResolver());

设置的时候会报错,我打印并且捕获了该异常。

问题找到了,但是找不到解决办法,得你指点了


0
JFinal
JFinal

引用来自“Deng小尧”的评论

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 

引用来自“JFinal”的评论

weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键

weblogic 初始化的时候,可以进入下面的方法.ModelRecordElResolver里面的init


public synchronized static void init(ServletContext servletContext) {
	    JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
	    if (jspApplicationContext != jac) {
	    	jspApplicationContext = jac;
	    	jspApplicationContext.addELResolver(new ModelRecordElResolver());
	    }
	}


但是if 里面 判断是不成立的,意思是,不知道在什么位置,已经初始化了

jspApplicationContext = jac

所以导致 jspApplicationContext设置不了 ModelRecordElResolver.默认就使用了CompositeELResolver


解决办法,就是在init方法里面判断jspApplicationContext的ELResolver是否等于ModelRecordElResolver,如果不等于,就设置成ModelRecordElResolver





引用来自“JFinal”的评论

RenderFactory 与 JspRender 两处会对这个 init 方法进行调用。 if 判断不成立是在第二次调用这个 init 方法时不会造成重复注入 ModelRecordElResolver 对象,所以,楼主观测到的是第二次调用,能监测下第一次调用不? 第一次调用会在系统启动时由 RenderFactory 调用

引用来自“Deng小尧”的评论


按照你的方式,我跟踪RenderFactory 

发现Weblogic在 

jspApplicationContext.addELResolver(new ModelRecordElResolver());

设置的时候会报错,我打印并且捕获了该异常。

问题找到了,但是找不到解决办法,得你指点了


    根据错误提示表明,在 ServletContextListeners 已经初始化完毕后无法再注册 ELResolver 实现类,所以让注册的时机再提早试试,以下代码创建了一个 ServletContextListener 接口的实现类:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspFactory;
import com.jfinal.plugin.activerecord.ModelRecordElResolver;

public class ElResolverServletContextListener implements ServletContextListener {
 public void contextInitialized(ServletContextEvent sce) {
  ServletContext sc = sce.getServletContext();
  JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(sc);
  jac.addELResolver(new ModelRecordElResolver());
 }

 public void contextDestroyed(ServletContextEvent sce) {
 }
}



  以上创建的这个 ElResolverServletContextListener在 web.xml 中配置一下,试试能否解决这个问题,反馈结果给我

0
Deng小尧
Deng小尧

引用来自“Deng小尧”的评论

引用来自“Deng小尧”的评论

回复 @JFinal : 问题出现在weblogic不支持el取model类型。model类型到了jsp,变成    com.vo.agent@21fs84cd {id:1,type:2}.要利用你的JspRender.setSupportActiveRecord(true);把 Model类型转换成Map类型。那么model转换成map到了jsp,变成{id:1,type:2}, Map类型比agent类型少了前面的  com.vo.agent@21fs84cd 

引用来自“JFinal”的评论

weblogic 为何没有让 jfinal 提供的 ModelRecordElResolver 增强生效? 这个才是关键

weblogic 初始化的时候,可以进入下面的方法.ModelRecordElResolver里面的init


public synchronized static void init(ServletContext servletContext) {
	    JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(servletContext);
	    if (jspApplicationContext != jac) {
	    	jspApplicationContext = jac;
	    	jspApplicationContext.addELResolver(new ModelRecordElResolver());
	    }
	}


但是if 里面 判断是不成立的,意思是,不知道在什么位置,已经初始化了

jspApplicationContext = jac

所以导致 jspApplicationContext设置不了 ModelRecordElResolver.默认就使用了CompositeELResolver


解决办法,就是在init方法里面判断jspApplicationContext的ELResolver是否等于ModelRecordElResolver,如果不等于,就设置成ModelRecordElResolver





引用来自“JFinal”的评论

RenderFactory 与 JspRender 两处会对这个 init 方法进行调用。 if 判断不成立是在第二次调用这个 init 方法时不会造成重复注入 ModelRecordElResolver 对象,所以,楼主观测到的是第二次调用,能监测下第一次调用不? 第一次调用会在系统启动时由 RenderFactory 调用

引用来自“Deng小尧”的评论


按照你的方式,我跟踪RenderFactory 

发现Weblogic在 

jspApplicationContext.addELResolver(new ModelRecordElResolver());

设置的时候会报错,我打印并且捕获了该异常。

问题找到了,但是找不到解决办法,得你指点了


引用来自“JFinal”的评论

    根据错误提示表明,在 ServletContextListeners 已经初始化完毕后无法再注册 ELResolver 实现类,所以让注册的时机再提早试试,以下代码创建了一个 ServletContextListener 接口的实现类:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspFactory;
import com.jfinal.plugin.activerecord.ModelRecordElResolver;

public class ElResolverServletContextListener implements ServletContextListener {
 public void contextInitialized(ServletContextEvent sce) {
  ServletContext sc = sce.getServletContext();
  JspApplicationContext jac = JspFactory.getDefaultFactory().getJspApplicationContext(sc);
  jac.addELResolver(new ModelRecordElResolver());
 }

 public void contextDestroyed(ServletContextEvent sce) {
 }
}



  以上创建的这个 ElResolverServletContextListener在 web.xml 中配置一下,试试能否解决这个问题,反馈结果给我

OK了,照你的办法,添加了个监听器,问题解决了!!!!!!!下个jfinal版本把这个bug修复下,谢谢你热心的帮助!
0
Deng小尧
Deng小尧
我发现论坛里面很多人都有这个问题。希望他们能看到这个帖子,把这个问题解决。
0
JFinal
JFinal

引用来自“Deng小尧”的评论

我发现论坛里面很多人都有这个问题。希望他们能看到这个帖子,把这个问题解决。

    这个问题只在 weblogic 下出现,jfinal 目前在 RenderFactory 中调用的 ELResolver 注入,可以使开发者完全不需要干预,避免了在 web.xml 中配置的事情,以及避免了开发者需要知道这个 Listener 存在的事情。

   jfinal 下一版将这个 Listener 放在 ext 中供 weblogic 开发者按需使用

返回顶部
顶部