【IT168 技术文章】
由于很多人都是在tomcat 下面开发的系统,然后才迁移到WAS上面去,所以就会出现这样那样的问题,导致很多代码因为不兼容又得做大量的修改。
根据我在工作的过程中总结了一些开发和部署的过程中碰见的一些WAS的问题。这些问题主要是解决WAS不兼容上面的一些经验,另外还有一些常见的开发部署中碰到的一些问题的解决方法,总结了一下,希望对各位开发同仁有用。
1、在was中基础数据类型和他的对象之间不能被隐式转换。如: 一个int类型的变量被赋值成一个Integer对象或者一个一个Integer直接对象和一个int类型的变量或常量进行比较等。
解决方法:在对象的后面显示的调用相应的转换方法。如Integer对象intValue()方法。
2、was中对三目运算符号?:的应用也不能被隐式转换,必须保证在:的两边的数据类型一致。如:true?"":Long 这种写法was不会给Long类型的对象自动加上toString()方法进行隐式转换。
解决方法:在对象Long的后面加上toString()方法。
3、was自带的1.5的jdk不能解析范型,jsp页面不能用任何范型。但是在java类中用范型然后用sun的1.5以上的jdk编译以后was是可以执行的。
4、was中对jsp标签的属性用常量赋值时不能用<%=常量%>的方式而应该去掉<%=%>。如:
index="center" maxPageItems="<%= pageInfo.getPageSize() %>" maxIndexPages="10" isOffset="<%= true %>" url="<%="/approve/print!list.action"%>" export="offset,currentPageNumber=pageNumber" scope="request"> 上面这段代码中url="<%="/approve/print!list.action"%>" 这行的代码会出错;页面异常:找不到标记属性 ×× 的标记属性信息。 解决办法: 应该写成url="/approve/print!list.action" 。 5、was中对jsp标签的属性用变量赋值时不能用<%=变量1+变量2%>的方式而应该定义新的变量来赋值。 页面异常:找不到标记属性 ×× 的标记属性信息。 解决办法: 将需要运算的变量采用一个临时变量运算完赋值之后,再进行输出。例如 <% 变量3=变量1+变量2%> <%=变量3%> 6、was字符集的设置 进入控制台的:服务器-》应用程序服务器-》运行的应用如:server1 -》Java 和进程管理 -》进程定义-》Java 虚拟机页面中的“通用jvm参数”的值设成“-Dfile.encoding=GBK -Ddefault.client.encoding=GBK”。 7.WebSphere升级到6.1.0.17所有struts2的程序都会发生Action找不到的情况。 解决方法如下,服务器>应用程序服务器>[选择所使用的服务器]>Web 容器设置>Web 容器>定制属性,增加名称为“com.ibm.ws.webcontainer.invokefilterscompatibility”的定制属性,值为true。 8、WAS 出现如下异常: WARNING: Cannot set status. Response already committed. WARNING: Cannot set header. Response already committed. 解决办法:was升级到6.1.0.17版本可以解决。 9、修改was的jsp编译jdk版本可以解决1、2、3类似的问题。 修改方法,找到发布之后的应用目录,修改对应的配置文件: \IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\zd-44bca248e33bNode01Cell\applications\web_war.ear\deployments\web_war\web.war\WEB-INF\ibm-web-ext.xmi文件中 加上 10、myeclipse 配置websphere 调试环境 · a. 下载下websphere6.1安装,在安装的过程中要记住自己设置的node name和cell name. · b. 启动eclipse,在window->preperences->myeclipse->application servers->websphere6.1 点Browse...选择你eclipse的安装目录. 我是安装在D:\webshpere6.1 ,之后myeclipse会自动的将Profile Root Directory,Node name,cell name设置好。你需要确认一下Profile Root Directory就是你的安装目录下Profiles目录下的一个文件夹。 我的是D:\webshpere6.0\profiles\AppSrv01 。 而node name和cell name它会设成以你的机器名命名的名字,应该将cell name改为Profiles RootDirectory下的installedApps目录(D:\webshpere6.0\profiles\AppSrv01\installedApps)下的文件夹的名字我的是就是localhostNode01Cell,将node name改为cell name去掉后面的cell的名字。选中enable项。点Apply保存。 · c 展开websphere6.1,选JDK,将JDK设置为webshpere6.1安装目录下的JDK(D:\webshpere6.0\java)。一定要设置成IBM的JDK要不websphere是不能运行的。 · d 启动websphere(不是用eclipse,而是用websphere的启动服务器),选管理控制台,点服务器->应用服务器,选一个服务,一般为server1。在故障诊断中选记录和跟踪->JVM 日志,修改两个文件名为console。保存,注销,停止服务。 · e 在eclipse中新建自己的企业工程(一定要是企业工程)如果之前有web工程可以将该企业工程的web modle设置为该web project如没有就自己新建一个。 · f 发布企业工程(不是web project)在第一次发布时要选Packaged Archive · g 用eclipse或websphere工具启动websphere,进入控制台,应用程序->安装新的应用程序,点浏览在 \webshpere6.0\profiles\AppServ01\installableApps 下选自己发布的工程名的ear文件(你可能不是AppServ01) 然后next下去就可以了,唯一要注意的就是要设置web模块上下文根和要选上class 类文件和jsp的修改自动装载。 · h 退到控制台首页,应用程序->企业应用程序,选择自己发布的工程,点启动。注销,停止websphere。 · I 在eclipse中再点发布,删除刚发布的工程,再点add。。。选择企业工程,Exploded Archive。选Delete Remote。。。项。然后发布。以后就可以实时调试了。 注:要在websphere中调试一定要建企业工程,一般的web工程是不能的 我们在J2EE的开发过程中还会遇到很多问题,尤其是我们开发的产品需要考虑在不同的平台和中间件上运行的时候,所需要注意的东西就更多。WAS相对于其他中间件来说,针对配置文件和代码的写法要更严格的检查,如果写法不符合规范,就会出现错误。本文中提到的一些问题的解决办法以及一些开发方法,是我在开发应用的时候碰到过的一些问题,经过一段时间的沉淀也积累了一些经验,希望对各位同仁在处理类似问题的时候能有所帮助。在下只是抛砖引玉、班门弄斧,希望大家踊跃发言,批评指正。