关于weblogic10版本兼容问题

]] Root cause of ServletException.
org.springframework.orm.hibernate3.HibernateQueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select t from cn.com.cis.acic.sales.schema.model.SmcMenu t where t.systemCode =? and t.upperMenuId =? and t.menuLevel = ? and t.validStatus = '1']; nested exception is org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select t from cn.com.cis.acic.sales.schema.model.SmcMenu t where t.systemCode =? and t.upperMenuId =? and t.menuLevel = ? and t.validStatus = '1']
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:649)

我本地使用的是weblogic10部署,而且还使用了hibernate3,然后报这个错误,不知道是什么原因,哪位能给我详细的解决方案吗?

最好的是先学习下OGNL,实在惭愧,说了这么多,我对OGNL也是不了解.

原因:在hibernate3中需要用到antlr,然而这个包在weblogic.jar中已经包含了antrl类库,就会产生一些类加载 的错误,无法找到在war或者ear中的hibernate3.jar。 出现这个错误之后,antlr会调用System.exit(),这样weblogic就会中止服务。

解决方法:在hibernate.properties上,或是在spring的conext xml中,加上一个属性hibernate.query.factory_class,值为org.hibernate.hql.classic.ClassicQueryTranslatorFactory。

这是原文:http://www.iteye.com/topic/176771

[quote]
我用的是struts2,其中有很多像 类似的代码
[/quote]

这是ognl的写法,list里的表达式将解释成成一个Map,实际上是一个LinkedHashMap。

这种写法在2.3版本中是不会报错的,因为servlet 2.3(即jsp 1.2)是不支持EL的,使用Weblogic 9也就不会报错了。Weblogic 10下问题就来了,这里web.xml的version声明为2.4,编译JSP时报表达式错误。这是JSP编译器将OGNL的表达式误认为是EL表达式。

解决办法:
1、禁用EL。
在web.xml上加上


*.jsp
true

2、更改web.xml的version为2.3。

3、如果大量页面用到了EL,如${someValue},所以1和2行不通了,只能从OGNL的表达式入手,最终写成 list='#@java.util.LinkedHashMap@{"1":"Male","2":"FeMale"}', 显式指定使用LinkedHashMap来构建Map。

问题解决。

这些问题LZ应该多去看书和LinkedHashMap实现了,包括一些数据结构和算法方面的书籍.

简单的归纳下,Map常用于存储 键:值 对,根据键得到值,因此键不允许键重复,但允许值重复。如果Map映射比较复杂而又要求高效率的话,最好使用LinkedHashMap.因为LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,可以保持顺序. 此外,可以在构造器中设定LinkedHashMap,使之采用基于访问的最近最少使用(LRU)算法,于是没有被访问过的(可被看作需要删除的)元素就会出现在队列的前面。

这里有篇集合的介绍:
http://blog.csdn.net/MX_LEE/archive/2008/06/27/2591370.aspx

这里有篇关于LinkedHashMap特性的介绍:
http://www.yuanma.org/data/2006/0607/article_688.htm

[quote]
但是为什么要是@java.util.LinkedHashMap@这种写法
[/quote]
这其实与 为什么public static void mian(String[] args)方法是应用程序的入口 是一类问题,去学习下JSP自定义标签你就明白了;

如果要了解 为什么@java.util.LinkedHashMap@这种写法 ,就要去了解struts2中对相应标签的标签处理类,这些规则都是它定义的.

总之,浏览器显示的是xHTML文档,都是服务器响应解析后的结果.