由于操作系统、浏览器、数据库、
JVM采用的字符集都不一样,基于WeblogicServer开发的应用经常出现中文显示乱码问题,其实在WeblogicServer上运行的WEB应用有很多与字符集有关的设置,下面做一个总结,为了正确处理中文,最好把这些设置都设上。
1. 在
JSP文件头加入
<%@pagecontentType=“
text/html;charset=GBK“%>
指定该
JSP采用的字符集。只是提示浏览器使用什么编码解析html,不是根本的乱码问题,也就是客户端可以直接习惯浏览器编码方式
2.在
Weblogic.xml文件的<jsp-descriptor>中加入:
<jsp-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</jsp-param>
指定
JSP文件中采用的字符集,在JSP文件中的<%@pagecontentType=“text/html;charset=GBK“%>会覆盖该设置
3.在
Weblogic.xml文件的<jsp-descriptor>中加入
<jsp-param>
<param-name>compilerSupportsEncoding</param-name>
<param-value>true</param-value>
</jsp-param>
如果为
TRUE,指定在编译JSP文件时,采用在JSP文件中定义的
<%@pagecontentType=“
text/html;charset=GBK“%>或<jsp-descriptor>中定义的encoding参数中定义的字符集进行编码,如果为
FALSE,则采用JVM中默认指定的字符集进行编码。
4. 需要把HTTPrequest(GET和POST)中的数据从它的原始编码转化为Unicode,以便JavaservletAPI进行处理,为了做这种转换,WeblogicServer需要知道HPPTrequest中的数据的编码方式。这可以通过在Weblogic.xml的<context-param>中设置.WeblogicServer
<input-charset>
<resource-path>/</resource-path>
<java-charset-name>GBK</java-charset-name>
</input-charset>
5. 从
ORACLE数据库中检索出来的中文显示不正确时,在这种情况下,如果数据库使用的是中文字符集,并使用的是Type2JdbcDriver时,可加入Weblogic.codeset=GBK的属性来解决这个问题。最好在配置POOL时直接指定。
代码如下:
java.util.Propertiesprops=newjava.util.Properties();
props.put("Weblogic.codeset","GBK");
props.put("user","scott");
props.put("password","tiger");
StringconnectUrl="jdbc:Weblogic:oracle";
DrivermyDriver=(Driver)
Class.forName("Weblogic.jdbc.oci.Driver").newInstance();
Connectionconn=
myDriver.connect(connectUrl,props);
6.如果是采用
WTC调用Tuxedo中的服务,在JSP页面中无法正确显示中文,必须使安装Tuxedo的服务器上的NLS_LANG环境变量与数据库中的字符集的设置一样。如后台Oracle数据库中的字符集设置为SIMPLIFIEDCHINESE_CHINA.ZHS16GBK,那么Tuxedo应用服务器上的NLS_LANG环境变量应设置为:export NLS_LANG="SIMPLIFIEDCHINESE_CHINA.ZHS16GBK"
7. 在
SUN 操作系统上
在
SUN 操作系统上,如果在启动机器的时候选择ENGLISH环境,那么在JSP等中会出现乱码。可以在启动机器的时候选择中文环境。或者,在WLS的启动脚本中设置下面的环境变量:
LANG=zh_CN.GBK
export LANG
8. 从客户端语言地区设置-weblogic所在操作系统语言地区设置-java编译选项-数据库语言地区设置,这些设置要完全一致,你才能正确看到中文。
客户端语言地区设置:客户端主要使用windows平台,一般应该没有问题。我只在别人的案例里看见过有修改客户端语言地区设置,如果你实在穷途末路,再考虑这个。
weblogic所在操作系统语言地区设置:如果是中文windows,应该也没有什么问题。如果是unix/linux,那么要在启动weblogic的用户的profile里加上LANG=zh,具体的语言,要看你的操作系统而定。注意你如果是su切换用户,一定要su - xxx,不然也会乱码。
java编译选项:这个我一般都会加上,在我的系统里使用ant,我会在build.xml里加上encoding,一般指示javac -encoding GB2312。
数据库语言环境设置:这个我不是特别熟悉,一般你用pl/sql能正确往数据库插入中文记录,那么你就别期望指责数据库了。
最后给一个救命绝招,request.setCharaterEncoding("GB2312")。在你实在没辙的时候,试试这个。但是这个使用起来要谨慎,它如果执行1次以上,也会出现乱码。而且不一定适应所有平台环境,想想你的系统写好了一堆jsp,结果跑到客户那里安装不正确,难道你要修改所有的页面吗?
客户端语言地区设置:客户端主要使用windows平台,一般应该没有问题。我只在别人的案例里看见过有修改客户端语言地区设置,如果你实在穷途末路,再考虑这个。
weblogic所在操作系统语言地区设置:如果是中文windows,应该也没有什么问题。如果是unix/linux,那么要在启动weblogic的用户的profile里加上LANG=zh,具体的语言,要看你的操作系统而定。注意你如果是su切换用户,一定要su - xxx,不然也会乱码。
java编译选项:这个我一般都会加上,在我的系统里使用ant,我会在build.xml里加上encoding,一般指示javac -encoding GB2312。
数据库语言环境设置:这个我不是特别熟悉,一般你用pl/sql能正确往数据库插入中文记录,那么你就别期望指责数据库了。
最后给一个救命绝招,request.setCharaterEncoding("GB2312")。在你实在没辙的时候,试试这个。但是这个使用起来要谨慎,它如果执行1次以上,也会出现乱码。而且不一定适应所有平台环境,想想你的系统写好了一堆jsp,结果跑到客户那里安装不正确,难道你要修改所有的页面吗?
WeblogicServer7.0在安全方面与
WeblogicServer6.1相比有很大的变化,在WeblogicServer7.0中默认采用LDAPServer:embeddedLDAPserver来保存用户、组、认证、授权等信息。在WeblogicServer6.1中默认是采用文件系统俩保存用户、组、认证、授权等信息。
embeddedLDAPserver是
WeblogicServer7.0自带的一个LDAPserver。如果要对embeddedLDAPserver进行写操作,先在Adminserver上的embeddedLDAPserver进行,然后复制到managedserver上。如果是读操作。直接从本地的managedserver上读取。
在
WeblogicConsole中可直接对embeddedLDAPserver进行配置,直接进行用户、组的增、删、改或权限设置等。也可以在程序中通过JMX进行这些操作。如在Weblogic7.0中用编徎的方法增加一个用户的方法如下:
importjava.util.*;
importjavax.management.*;
importWeblogic.management.*;
importWeblogic.security.providers.authentication.*;
importWeblogic.management.security.authentication.AuthenticationProviderMBean;
importWeblogic.management.security.authentication.*;
publicclasstest2
{
publicstaticvoidmain(String[]args)
{
MBeanHomeadminHome;
Stringurl=“t3://127.0.0.1:7001“;
adminHome=(MBeanHome)Helper.getAdminMBeanHome(“username“,“password“,url);
AuthenticationProviderMBean[]providers=adminHome.getActiveDomain().getSecurityConfiguration().findDefaultRealm().getAuthenticationProviders();
for(inti=0;providers!=null&&i<providers.length;i++)
{
if(providers[i]instanceofUserEditorMBean)
{
UserEditorMBeaneditor=(UserEditorMBean)providers[i];
try
{
editor.createUser(“username“,“password“,“description“);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
}
}
}
DataSource是一种非事务性的数据源,它以自动提交事务的方式工作,所以即使采用
CMP,它也会在插入或者更新记录时立即提交事务。这样在EJB-JAR部署描述符中的事务描述符就失去了意义。而TxDataSource则是一种事务性的数据源,当采用CMP时,容器会根据部署描述符接管对事务的控制,所以如果你需要用CMP开发企业应用,请务必使用TxDataSource
在下面的应用情形中必须使用
TxDataSource,不能使用DataSource:
采用
JTA(JavaTransactionAPI)进行事务处理
采用
EJBcontainer进行事务处理,如
CMP方式的ENTITYEJB
在一个事务中涉及对多个数据库的更新操作
在一个事务中涉及到多种资源,如数据库,
JMS
多个
SERVER使用同一个数据库连接池
WeblogicServer应用服务器做为电子商务的基础平台,经常需要与其他系统进行集成,如与
MQSeries或其他消息中间件进行通讯,从WeblogicSever6.0开始,WeblogicSever通过WeblogicMessagingBridge使你可以在两个消息系统之间进行消息转发。采用WeblogicMessagingBridge,使你可以:
1. 在两个
WeblogicServer应用系统之间进行消息转发,这两个WeblogicServer的版本可以不同,如WeblogicServer7.0与WeblogicServer6.1之间。
2. 在
WeblogicJMS与其他的JMSServer之间进行消息转发,如:WeblogicServer与之间。
3. 在
WeblogicJMS与其他的非JMS的消息中间件之间进行消息转发。
通过
WeblogicMessagingBridge,WeblogicServer可以和IBMMQSeries、ProgressSonicMQ、FioranoJMS、IBusMessageServer等第三方的消息产品进行连接。还可以和其他符合JMS标准的JMSServer进行连接。
WeblogicJMS支持
XA,通过WeblogicMessagingBridge,其他支持XA的消息产品可以与WeblogicJMS一起参与分布式事务。
通过
WeblogicMessagingBridge,其他的消息产品之间给WeblogicServer上的MDB发送请求。
4. WeblogicMessagingBridge包括一个消息源和消息目的地,如果是
WeblogicJMS与其他的JMS产品之间进行消息转发,消息源和消息目的地之间通过WeblogicServer本身提供的ADAPTER进行通讯,如果是WeblogicJMS与其他非JMS的消息系统进行通讯,则需要通过专门的Adapter.WeblogicServer本身不提供这些Adapter。可通过BEA的PS部门或其他厂家得到这些Adapter。
消息源和消息目的地可以是队列或主题(
queuesortopics),你还可以指定消息的确认方式,或对消息进行过滤。进行连接管理,安全管理,和事务控制。
在控制台中对
WeblogicMessagingBridge进行配置,还可以对它的状态进行监控。
如果是一个ZIP文件:
java –cp
tuxedo80.zip install
在AIX上的安装方式与别的操作系统不一样
j
ava -Djdk.check.override=true -classpath pj_platform701_generic.jar com.bea.i
nstaller.BEAInstallController -mode=console
如果是光盘上的文件显示为pj_ser1.jar. 那么
pj_platform701_generic.jar
要改为pj_ser1.jar
注意,在AIX上如果JDK为1.3.0会抛出EXCEPTION:CLASSNOTFOUND。
<%@pageimport="weblogic.kernel.Kernel"%>
<%!
publicvoiderrlog(Strings)
{
weblogic.logging.LogManagerlogmanager=Kernel.getLogManager();
logmanager.log(128,"xcj***",s);
}
%>
####<2003-2-24 下午
10时41分51秒> <Critical> <WebLogicServer>
<app_server1> <myserver> <ListenThread> <system> <> <000204> <Failed
to listen on port 7001, failure count: 2, failing for 1,046,097,710
seconds, java.net.SocketException: Too many open files>
<app_server1> <myserver> <ListenThread> <system> <> <000204> <Failed
to listen on port 7001, failure count: 2, failing for 1,046,097,710
seconds, java.net.SocketException: Too many open files>
导致
WEBLOGIC SERVER 死掉:
在
UNIX系统上,每一个SOCKET连接要占用一个文件句柄,而每个进程能打开的句柄数是有限制的,如果一个进程能打开文件句柄的最大数太小,就会出现上面的错误,要修改系统的内核才行。
在
LIUNX系统上修改方法如下:
在
Linux内核2.4.x中需要修改源代码,然后重新编译内核才生效。编
辑Linux内核源代码中的 include/linux/fs.h文件,将 NR_FILE 由8192改为
65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将
MAX_INODE 由16384改为262144。一般情况下,系统最大打开文件数比较合理的 设置为每4M物理内存256,比如256M内存可以设为16384,而最大的使用的i节点 的数目应该是最大打开文件数目的3倍到4倍。
另外,对每个进程的设置:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数
辑Linux内核源代码中的 include/linux/fs.h文件,将 NR_FILE 由8192改为
65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将
MAX_INODE 由16384改为262144。一般情况下,系统最大打开文件数比较合理的 设置为每4M物理内存256,比如256M内存可以设为16384,而最大的使用的i节点 的数目应该是最大打开文件数目的3倍到4倍。
另外,对每个进程的设置:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数
每个进行能使用的内存也是有限制的。同样要做调整。
不要把SERVLET的类文件放到系统的CLASSPATH中,否则它不能动态加载
一个WAR文件如果时只读的,发布会不成功,应该把只读属性去掉
<jsp-param> <param-name>workingDir</param-name> <param-value>adirectoryname</param-value> </jsp-param>
具体可以拿到系统线程池当前指标的接口
WEBLOGIC提供MBEAN,可从MBEAN中得到系统的运行、配置信息,从ExecuteQueueRuntimeMBean中可以得到并发线程数等消息。具体请参考:http://e-docs.bea.com/wls/docs70/javadocs/index.html
设置virtual-directory-mapping
weblogic.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 7.0//EN"
"http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd" >
<weblogic-web-app>
<virtual-directory-mapping>
<local-path>C:/</local-path>
<url-pattern>images/*</url-pattern>
<url-pattern>*.jpg</url-pattern>
</virtual-directory-mapping>
</weblogic-web-app>
WEB APPLICATION的的目录名为tornadoAdmin
把6.jpg放到c:/images目录下
通过如下方式访问:
注意:要把目录的最后一层配置成<url-pattern>, 目录的其他部分配置成<local-path>