2007年5月7日
錯誤信息如下:
java.lang.NoClassDefFoundError: sun.management.ManagementFactory
處理:
把sun.management.ManagementFactory替換成java.lang.management.ManagementFactory
因為ibm的jdk沒有sun.management.ManagementFactory這個對象
錯誤信息如下:
超過最大長度限制
處理:
只能插入666個中文字符。
或者更新到最新的oracle驅動包
1:derby.jar包可能沖突,需刪除項目中的該包
2:MBean調用問題
Websphere的MBean注冊路徑包括cell,nodeName和processName,具體可以銅鼓jconsole連接來查看MBean注冊的全路徑。這三個值可以通過Websphere的com.ibm.websphere.management.AdminServiceFactory這個對象來獲取,spring中的配置如下:
<!--
用于獲取websphere的MBean名稱的cell,node,process -->
<bean id="adminService" class="com.ibm.websphere.management.AdminServiceFactory" factory-method="getAdminService"/>
<bean id="adminService.cellName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
<bean id="adminService.nodeName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
<bean id="adminService.processName" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
<bean id="websphereNamingStrategy" class="com.des.engine.mbean.WebsphereNamingStrategy">
<property name="cellName" ref="adminService.cellName"/>
<property name="nodeName" ref="adminService.nodeName"/>
<property name="processName" ref="adminService.processName"/>
</bean>
WebsphereNamingStrategy為自己創建的對象就包括那三個屬性
3:安全問題
出現如下錯誤,Caused by: javax.management.JMRuntimeException: ADMN0022E: 由于憑證不足或憑證為空,無法對 org.apache.servicemix:Name=ServiceMgtImpl,cell=dvpbNode02Cell,Type=SystemService,ContainerName=ServiceMix,node=dvpbNode02,process=server1 MBean 的 retrieveServiceList 操作進行訪問。
該問題是因為設置了安全控制,把控制臺的【安全性->安全管理、應用程序和基礎結構】里面的所以安全配置都去掉,然后重新啟動服務器主機(注意是重啟主機,不然安全設置不起作用),再啟動websphere服務應該就可以了,還有就是servicemix的應用要跟websphere一起啟動,不要等websphere啟動后再到控制臺啟動
錯誤信息如下:
jdbc在操作oracle海量數據的時候用ResultSet獲取所有的返回數據出現內存溢出
處理:
出錯的原因是ResultSet用的是可滾動結果集,正常情況下ResultSet是指針指向數據庫的數據,本身是不存儲數據庫的數據的,默認情況下就算是提交的sql能查詢處上億條的數據也是不消耗內存的,但是如果用的是可滾動結果集的ResultSet情況就不一樣了,ORACLE 是不支持可滾動結果集的,那么我們用JDBC得到一個可滾動的結果集就是由JDBC自己支持的,也就是說結果集是要存放在內存中的,所以在海量數據的情況下也就是要消耗大量內存的,因此造成內存溢出也就是正常的了,所以如果是海量數據的話就不要用可滾動結果集就可以了。
錯誤信息如下:
com.ibm.websphere.ce.cm.StaleConnectionException: [ibm][db2][jcc][t4][2030][11211]
檢測到了通信錯誤。所使用的通信協議:TCP/IP。"n所使用的通信 API:SOCKETS。
檢測到錯誤的位置:Reply.fill()。"n用于檢測錯誤的通信功能:InputStream.read()。
特定于協議的錯誤代碼數據不足、* 和 0。消息:null"n
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)"n
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67)"n at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance
(DelegatingConstructorAccessorImpl.java:45)"n
at java.lang.reflect.Constructor.newInstance(Constructor.java:522)"n
at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapExceptionHelper
(GenericDataStoreHelper.java:523)"n
at com.ibm.websphere.rsadapter.GenericDataStoreHelper.mapException(GenericDataStoreHelper.java:578)"n
at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.mapException(WSJdbcUtil.java:909)"n
at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeQuery(WSJdbcStatement.java:898)"n
at com.newland.bi.util.db.DBUtil.executeQuery(Unknown Source)"n
at com.newland.bi.util.db.DBUtil.executeSql(Unknown Source)"n
at com.newland.bi.dao.jdbc.DaoImpl.executeQuery(DaoImpl.java:64)"n
at com.newland.bi.service.report.exp.dao.ReportExpDao.getExpList(ReportExpDao.java:72)"n
at com.newland.bi.service.report.exp.manage.ReportExpMgt.runExport(ReportExpMgt.java:91)"n
at com.newland.bi.service.report.exp.servlet.ReportExp1Servlet$1.run(ReportExp1Servlet.java:97)"n
at java.util.TimerThread.mainLoop(Timer.java:537)"n at java.util.TimerThread.run(Timer.java:487)"n
處理:
出錯的原因可能是防火墻問題,在websphere應用服務器和數據庫服務器之間是否存在防火墻
防火墻是否會設置多久沒活動的連接就自動斷開掉,如果是這樣的話就會有問題,因為websphere上面的數據庫連接池可能有一段時間沒連接而被防火墻斷掉了
但對于連接池本身根本就不知道該連接是否還可用,所以web應用從連接池獲取的連接可能就是已經斷開的了,所以就可能會出現日記中的錯誤問題
schedule和scheduleAtFixedRate的區別在于,如果指定開始執行的時間在當前系統運行時間之前,scheduleAtFixedRate會把已經過去的時間也作為周期執行,而schedule不會把過去的時間算上。
錯誤信息如下:
Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)
... 10 more
處理:
原因是調用了axis的 soap.MessageFactoryImpl,cxf應該用的是sun的
在注冊安全攔截器之前執行下面代碼就可以了
System.setProperty("javax.xml.soap.MessageFactory", "com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
我們寫程序的時候可能會想用open或者<a>來下載一個txt文件,但我們會發現我們用瀏覽器下載這個txt文件的時候老是在瀏覽器里面直接打開了,而不是提示下載,這樣的話如果txt文件的內容非常多的話肯定是不行的,可能就會導致瀏覽器掛掉,客戶機器死機的問題
現整理了個解決辦法,代碼如下:
1.下載頁面
open(action執行頁面,'iframeName','');
2.action執行頁面
<a id="tempB" style="display:none" href="#" onclick=""> </a>
<iframe width=0 height=0 id="hideIframe" name="hideIframe"></iframe>

<script>
var n=0;

function go(url)
{
n==0?new function()

{
frames("hideIframe").location=url,n=1
}:null;
document.all("hideIframe").readyState!="complete"?setTimeout(go,10):so();
function so()

{
frames("hideIframe").document.execCommand("SaveAs"),n=0
};
}
var tempB = document.getElementById("tempB");
<%

if(path.toLowerCase().indexOf(".txt")>=0)
{
%>

tempB.attachEvent('onclick',function()
{go('<%=request.getContextPath()+"/tempfile/1.txt">');});
<%

}else
{
%>

tempB.attachEvent('onclick',function()
{open('<%=request.getContextPath()+"/tempfile/1.xls">','','');});
<%
}
%>
tempB.click();
</script>
websphere部署war應用失敗正常原因是web.xml的節點定義循序問題,或者一些空格,字符原因造成的
可能先定義完所有的servlet后再定義所有的servlet mapping就沒問題了
那個轉向后的頁面已經有用gb2312的編碼了
可能原因是在java類里面調用了((HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse()).getWriter().write("");
然后再轉向某個頁面,這樣可能導致編碼格式沖突,導致亂碼
可以先給resonse設置下編碼格式,然后在write
HttpServletResponse httpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setContentType("text/html; charset=gb2312");
httpServletResponse.setCharacterEncoding("gb2312");
httpServletResponse.getWriter().write("");
這樣應該就可以解決了
C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\app-bi2Node01Cell\applications\appname.ear\deployments\appname\appname.war\WEB-INF\web.xml 該目錄下的web.xml的修改才是有效
應用程序發布的目錄下的那個web.xml添加的servlet配置是無效的
可能原因:
1: form表單中的控件沒有定義name屬性
2: form表單中的控件被設置成disabled
3: form表單的enctype="multipart/form-data"是一種用于上傳文件的表單
|
解決方法:
對于第三種情況我們直接request.getParameter來取參數值是取不到的
我們可以借用apache的上傳組件來解決
用到jar包commons-fileupload-1.1.1.jar
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import
org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
*獲取各種類型表單的表單參數
*@paramrequest HttpServletRequest請求對像
* @paramparamName 參數名
*@return
*@throwsFileUploadException
*/
publicstatic String
getParameterValue(HttpServletRequest request,String paramName) throws
FileUploadException{
boolean
isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart==true){
FileItemFactory
factory = new DiskFileItemFactory();
ServletFileUpload
upload = new ServletFileUpload(factory);
List
fileItemList = upload.parseRequest(request);
if(fileItemList!=null){
for(Iterator itr=fileItemList.iterator();itr.hasNext();){
FileItem fileItem = (FileItem)itr.next();
if(fileItem.getFieldName().equalsIgnoreCase(paramName)){
return new
String(fileItem.getString().getBytes("ISO8859-1"))//中文轉碼
}
}
}
}else{
return new String(request.getParameter(paramName).getBytes("ISO8859-1"))//中文轉碼
}
return"";
}
|
1.定義一個標簽要用到兩個java類,這個跟jsp的自定義標簽有點不一樣
第一個類繼承UIComponentTag, 用于定義標簽的屬性和設置標簽的所有屬性值到控件的map屬性attributes或valueBinding中
第二個類繼承UIInput或者UIOutput,用于渲染標簽的內容,真正打印標簽內容的地方就在這里
2.這兩個類是怎么聯系的
我們需要像定義jsf的bean的影射文件一樣,在faces-config.xml或者自己定義的xml文件里面定義第二個類
如:
<faces-config>
<!--分頁標簽-->
<component>
<component-type>pageTag</component-type>
<component-class>com.jsf.PageComponent</component-class>
</component>
</faces-config>
然后第一個類要實現父類的一個方法 public String getComponentType();從這里返回一個字符串pageTag,這樣就跟第二個類聯系起來了

3.標簽屬性的定義
標簽屬性的定義一般都是可轉化為字符串的類型的,除非你還是用<%=rowList%>這種jsp賦值的方式
別以為你定義的一個List類型的屬性可以用jsf的EL表達式可以直接賦值進來,EL表達式傳進來以后屬性接收的就是這一串EL表達式
所以就是說你的屬性就是要字符串類型的

4.那么jsf自定義標簽是怎么接收EL表達式綁定的列表的
先通過父類的isValueReference(屬性值),來判斷該屬性的值是否是一個EL的表達式
如果是則通過獲取綁定值得方式把真正的屬性的值設置到標簽父類的valueBinding對像中
否則直接把屬性的值添加到標簽父類的attributes對像中
if (isValueReference(屬性值)) {
javax.faces.el.ValueBinding vb = Util.getValueBinding(value.toString());
component.setValueBinding(name, vb); //component就是標簽對像,name就是標簽的屬性名稱
} else {
component.getAttributes().put(name, 屬性值);
}
這就是個設置屬性值的過程,可以在第1點說的第一個類里面的protected void setProperties(UIComponent component)方法
5.現在知道標簽屬性值的作用了嗎
是的標簽屬性值只不過是起個作用而已,而不是我們真正所要的值
也就是說我們是不能從這些屬性中直接取值的
6.那么我們怎么取屬性的真正的值呢
可以先從第4點說的標簽父類的attributes對像中取值
如果取不到值那就到標簽父類的valueBinding對像中取值
說白了就是,通過第4步我們屬性的真正的值不是放在attributes就是在valueBinding中
Object obj = component.getAttributes().get(name); //component就是標簽對像,name就是標簽的屬性名稱
if (obj == null) {
ValueBinding vb = component.getValueBinding(name);
if (vb != null) {
return vb.getValue(context);
} else {
return null;
}
}
這個過程就是取屬性值的過程,在第1點說的第二個類里面進行
7.現在屬性值也可以取到了,那么我們要怎么打印標簽的內容呢
我們可以在第二個類的encodeBegin或者encodeEnd中進行
public void encodeBegin(FacesContext context) throws IOException
public void encodeEnd(FacesContext context) throws IOException
取屬性值的過程也可以在這里進行,取完值后就是把值組裝到標簽內容的相應位置中就完了
基本上就是這幾點

在本地tomcat5中這樣沒問題
request.getRealPath("/")+"report/config/configFile/"+priv_id+".xml"
但是發布到websphere6后就出問題了
要改成
request.getRealPath("/")+"/report/config/configFile/"+priv_id+".xml"
就是report前要加個"/" 斜杠,加了后tomcat5下也是正確的
1.jdk環境問題
jdk環境要改為ibm 的jdk 5.0, 不然連接不上數據庫, 數據庫連接池的連接失敗,c3p0連接池的連接失敗,目前還是默認的方式采用應用服務器的連接池,像tomcat就采用tomcat配置的連接池
eclipse 的開發時用的jre如果修改為ibm的以后,有可能會導致編譯不了,這要修改編輯器java類型的編碼為gb2312就可以了,genaral->content type –java file
2. 程序中編寫sql時的用戶模式問題
用戶模式要用公共常量,以便修改
不同用戶模式之間的表的訪問通過授權來解決
3. db2數據庫的函數問題
程序中的添加和修改時間的地方的日期函數都要修改成
Date(“2007-01-01”)就是字符串中間有帶中杠的
日期轉字符串要把原先的to_char改成char(int(2007-01-01))
Kpi的消息串在配置中在取權限priv_id的字符串要加上char(int(priv_id)),如果直接char(priv_id)會多出一個點號
4. oracle樹形結構的查詢移植到db2存在問題
菜單查詢中,有存在層次level的沒實現,目前我先通過自己寫的函數實現,但存在問題跟沒有層次的實現方式一樣存在問題
因為通過in的方式,in的存在字段是有限的到時候數據量變多了,sql就會執行失敗,可以考慮臨時表來解決
5. 序列表seq的長度問題
所有的序列表的序列長度db2是有限制的,好像不能大于8位,這樣序列的字段都要做修改,而且不能重復,要進一步確認修改
7. 系統權限移植問題
地區編碼的字段從數值型改為字符串類型,很辛苦,建議以后程序的bean的屬性都用字符串來定義,避免程序移植的類型修改的問題
8. erwin數據模型問題
數據模型中的部分表沒有及時更新,跟開發時用的表有出入,以后數據模型要及時更新
9. 建表的sql語句問題
建表的sql中
number(12) 這樣的都要改成decimal(12,0)
varchar2都要改成varchar
有時候我們在表單提交后卻獲取不到控件的值
可能原因:
1. 控件少了name屬性
2.控件被設置成disabled
后臺數據處理完成的時候設置一個處理完成的session標志
前臺通過發送ajax請求設置成功標志的session的頁面,如果session的成功標志為true則數據處理完成,關閉正在處理的進度條圖片,否則繼續發送ajax請求,顯示正在處理的進度條圖片,當然也可以通過后臺返回數據處理完成的百分比,來制作精確的進度條
當我們在做動態生成checkbox和動態設置checkbox的checked屬性的時候要注意
只有checkbox在頁面生成以后設置checkbox的checked屬性才有效,否則是無效的
也就是說不要在create checkbox后就設置checked屬性,要等到該checkbox已經append到頁面中了在來設置checked屬性這樣才可以
1) 使用response.sendredirect重定向是沒辦法通過request.setAttribute來傳遞對象到另外一個頁面的
但我們可以通過轉發的方式來實現request.getRequestDispatcher("test2.jsp").forward(request,response)
這也是struts默認的頁面跳轉方式,這就是為什么我們可以在action里面request.setAttribute然后在頁面里request.getAttribute
2) 使用response.sendredirect重定向要記得在后面加上return不然后面的語句還是會繼續往下執行的,還有就是response.sendredirect之前最好不要有任何的輸出語句包括html不然可能會重定向失敗
最近我還遇到一個比較奇怪的問題就是response.sendredirect失敗,因為我的端口是通過交換機來轉換的所以可能就是在這里重定向不過去了,所以建議以后大家都使用request.getRequestDispatcher("test2.jsp").forward(request,response)這種方式就不會錯了,當然也可以用jsp標簽的forward