weblogic10.3+sitemesh全方位部署

    转载自 lontoo
spingframework-2.5.5
struts-2.0.11
sitemesh-2.4.1
hibernate-3.2.6(antlr-2.7.7.jar)
weblogic server 10.3.1(多语言版本—中文版)【java version "1.6.0_11"】

1、包antlr冲突问题

org.hibernate.queryexception:
classnotfoundexception: org.hibernate.hql.ast.hqltoken
引起这个问题的原因是包antlr2.6.1.jar在weblogic10.3中与项目中hibernate3.x用来解析sql语句的包antlr-2.7.7.jar冲突了。

大致有3种方式可以解决这类问题:
1)在启动weblogic时,优先启动项目中使用到的antlr-2.7.7.jar的文件。在weblogic启动文件 的 classpath上优先增加antlr-2.7.7.jar 文件。如下:
set save_classpath=.; d:\antlr-2.7.7.jar;%classpath%
注意:
你必须把antlr-2.7.7.jar 拷贝到 d:目录下或者其他你自己设定的目录名。

2)在hibernate.properties或者hibernate-cfg.xml,或者 db-jdbc.properties中设置一个属性hibernate.query.factory_class的值为
org.hibernate.hql.classic.classicquerytranslatorfactory
注意:
●选择hibernate3.x的查询翻译器:
org.hibernate.hql.ast.astquerytranslatorfactory
●选择hibernate2.x的查询翻译器
org.hibernate.hql.classic.classicquerytranslatorfactory

3)在/web-inf 目录下增加或者修改 weblogic.xml文件。
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
注意:
●这个方法不是推荐的,因为这个设置可能会引起jstl的设置冲突。

2、servlet2.5规范问题
如果使用servlet2.5规范来配置web.xml文件。在系统启动时出现以下错误:
java.lang.illegalargumentexception: illeagal combination - mode.payload and provider<javax.xml.soap.soapmessage>
at com.sun.xml.ws.server.provider.providerendpointmodel.<init>(providerendpointmodel.java:111)
at com.sun.xml.ws.server.provider.providerinvokertube.create(providerinvokertube.java:63)

解决的方法
1)使用 web.xml 2.4 的规范 而不是使用 web.xml 2.5 规范;
2)在weblogic.xml中设置(参见上面的说明):
<prefer-web-inf-classes>true</prefer-web-inf-classes>;

3、装饰器无法正常工作
装饰器无法正常工作,只能返回请求页面,不会对页面进行任何装饰。比如提交一个struts2请求 /portal/abc.do,同时也设置了sitemesh过滤器映射这个请求,以及在decorators.xml中也设置了装饰器,比如:
<decorator name="foredecorator" page="template.jsp">
<pattern>/portal/abc.do</pattern>
</decorator>
现在假设struts2请求 /portal/abc.do将会返回到一个页面 abc.jsp页面。结果,页面只返回了abc.jsp页面上的数据,而没有被template.jsp页面进行装饰。通过查看源代码发现。在准备装饰之时,weblogic的 request.getservletpath()得到是 abc.jsp,而不是/portal/abc.do。
因此在decorators.xml并不能找到需要装饰的mapping。除非将<pattern>/portal/abc.do</pattern>修改为:
<pattern>/abc.jsp</pattern>
是可以被映射并装饰了。

解决的方法
修改sitemesh的对应的decorator mapping源代码。在这里这个文件是:
com\opensymphony\module\sitemesh\mapper\configdecoratormapper.java
修改这个文件。使用 request.getrequesturi() 代替 request.getservletpath()来获得待匹配的url。

4、sitemesh乱码问题
关于sitemesh乱码问题,除了与tomcat环境下的设置以外。比如:
通过过滤器设置:
request.setcharacterencoding(encoding);
response.setcharacterencoding(encoding);

jsp文件设置:
<%@page contenttype="text/html; charset=utf-8" pageencoding="utf-8"%>

weblogic针对sitemesh方面还有3个地方出现乱码:
1)在装饰器文件中使用 <decorator:body /> 乱码。这个是最常用的,也就是最常见的乱码问题。
2)page:applydecorator,指定了待装饰的jsp文件,比如:t1.jsp:
<page:applydecorator page="t1.jsp" name="t1decorator"/>
这样t1.jsp渲染后出现乱码。
3)一个请求通过了sitemesh过滤器,但同时又没有找到对应的装饰器(同时并不在excludes中指定),这样就是使用默认的装饰器(nodecorator)进行直接输出。
com.opensymphony.sitemesh.webapp.decorator.nodecorator

虽然是各种不同的情况,但原因都有些类似,就是在weblogic环境下,sitemesh在装饰页面时,如果response的contenttype为null,则使用java虚拟机属性值"file.encoding",而该值与操作系统相关,在windows系统下,该值=gbk.由于页面本身是utf-8编码的,经过sitemesh装饰后,使用gbk编码转换,产生乱码。

解决的方法
既然跟file.encoding有关系,那么就直接设置这个系统属性可以解决上面的全部问题。解决如下:在weblogic启动文件 的 启动参数上增加-dfile.encoding。如下:
set save_java_options=%java_options% -dfile.encoding=utf-8
注意:
●这个方法简单明了,而且不用修改其他方面;
●但是,如果这样设置的话,weblogic本身的启动等相关信息就乱码了。

因此,在下面使用其他的方式来解决上面的3个问题:
1)通过查看源代码,发现进行内容装饰之前需要进行对内容字节转换成字符串,在转换的时候,如果没有获得编码,那么就是用file.encoding。因此,可以修改这个文件,使默认使用的编码为”utf-8”.
com.opensymphony.module.sitemesh.filter.textencoder

2)page:applydecorator,指定了待装饰的jsp文件,那么,同时需要指定这个文件使用的编码。如下:
<page:applydecorator page="t1.jsp" name="t1decorator" encoding="utf-8"/>

3)针对第3个乱码问题,可以通过修改如下文件:
com.opensymphony.sitemesh.webapp.decorator.nodecorator
让输出的字符串作为 utf-8的方式直接输出到response中。

5、<c:import…>乱码问题
所包含的文件需要使用charencoding="utf-8"进行限定。
<c:import url="/portal/block/userblock11.jsp" charencoding="utf-8"/>
 

猜你喜欢

转载自hsyzijvaa.iteye.com/blog/1188374