程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> struts2.1.8+hibernate2.5.6+spring3.0常見異常原因和解決方案

struts2.1.8+hibernate2.5.6+spring3.0常見異常原因和解決方案

編輯:關於JAVA

經過暑期兩個月對ssh2的學習和OA項目的實戰訓練,我對J2EE技術中著名的三大框架ssh2已漸漸有所理解和掌握。從搭建ssh2框架環境開始到寫出第一個簡單的ssh2登陸程序,到最後整個OA項目的實戰, 期間遇到了重重困難和阻礙, 就連搭建環境就花了整整一天的功夫,而成功運行第一個ssh2程序更花了好幾天,當然我相信這是大部分學習ssh2這門技術都會經歷的過程,相信也是每個程序員學習任何一門新的技術都會走的路程。如今,項目已成功收尾,在這欣喜之余,我也願意將我學習ssh2中遇到的一些常見異常問題總結如下,希望大家可以少走一些彎路,或者在遇到問題時可以及時解決。

PS:我的編程運行環境是MyEclipse8.6 + Tomcat6.1.3 + MySql

問題一:出現異常 java.lang.NoSuchMethodError: antlr.collections.AST.getLine()問題

原因:是JAR包的沖突,包 antlr2.7.2 與 antlr2.7.6 沖突(一個是tomcat下的包,一個是自己引入ssh2的包)

解決方案:刪除包antlr2.7.2 即可,具體方法:

在MyEclipse下,windows-->preferences-->在文本框中搜索struts2-->選擇antlr2.7.2-->remove

或者直接在tomcat該應用的目錄WEB-INF\lib 刪除 antlr2.7.2.jar

問題二:異常java.lang.NullPointerException

原因:空指針異常產生的主要原因如下:

(1) 當一個對象不存在時又調用其方法會產生異常

obj.method() // obj對象不存在

(2) 當訪問或修改一個對象不存在的字段時會產生異常

obj.method()  // method方法不存在

解決方案:調試,找出異常產生的具體原因,再根據具體原因具體解決

問題三:異常The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]

原因:struts2的過濾器映射路徑寫錯

解決方案:在web.xml中配置struts2的過濾器如下:

<filter-mapping>

   <filter-name>struts2</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

注意:<url-pattern>這裡一定要是 /*

問題四:org.hibernate.util.JDBCExceptionReporterorg.hibernate.util.JDBCExceptionReporter.logExceptions

(JDBCExceptionReporter.java:101) - Unknown type '246 in column 2 of 6 in binary-encoded result set.

原因:用mysql數據庫時,某些字段值使用類型decimal、bigint等

解決方案:用mysql數據庫時,避免字段值用decimal、bigint等,否則用hibernate執行hql語句時就會出現上面的異常

問題五:經過action跳轉後得到的頁面中css和js的樣式引入不能應用

原因:經過action跳轉後頁面的路徑改變了,不是你頁面存放路徑

解決方案:最好用絕對路徑來引入css和js,如引入css可用

<link href="${pageContext.request.contextPath}/css/css.css" rel="stylesheet" type="text/css" />

PS:也可使用項目名稱來作為絕對路徑,如項目名稱為OA,則上面引入也可如下:

<link href="/OA/css/css.css" rel="stylesheet" type="text/css" />

似乎更簡介,但個人不推薦使用,因為一旦你的項目名更換後,所有頁面中的OA都要跟著替換,十分繁瑣。

問題六:使用struts2的標簽<s:textfield />時,不能在一行顯示多個文本框(一個textfield占一行)

原因:初學struts2,在頭腦中一直在想一個問題,就是對於struts2 ,當應用其自身的標簽時,例如:

<s:form>

<s:textfield name="a"></s:textfield>

</s:form>

當查看源代碼時為:

<form>

<table>

 <tr><td><input type="text" name=a /></td></tr>

</table>

</form>

自動添加了table tr td 標簽,所有不能一行顯示多個文本框。

解決方案:在struts2中加入了theme(主題)的概念,通過設置不同的主題,可以讓struts的代碼輸出不同的html代碼,你也就相應得到不同的布局效果。

疑問1、Struts2有哪些主題?

Struts2提供了三種主題,ajax, simple, xhtml,它默認的是xhtml主題,當然你可以寫任意個你自己的主題,我們稱之為自定義主題

疑問2、Struts2主題怎麼改?

有兩種方法可以解決.

1.簡單的方法(也很實用)

在Struts.xml中,加上下一行代碼就可以了

<constant name="struts.ui.theme" value="simple" />

代表所有的頁面采用的都是 simple主題了,這時它輸出的頁面,不回添加任何多余的代碼,比如 table tr td 等,我們就可以像其他編輯頁面的方式編輯頁面的風格。

或者 在 <s:form 中添加 theme

<s:form theme="simple"></s:form>

struts2每個標簽都有theme屬性

2.自定義 theme,還未研究》。。。。

問題七:通過頁面表單提交一些要修改數據庫中數據的操作,表單提交之後,程序運行一切正常,而且,後台也打印出了sql語句,例如:insert into SYS.HNCITEM05 (SNAME, BATE, SONO, SDATE, SNO) values (?, ?, ?, ?, ?),但是,數據庫中卻查不到剛才插入的數據。就是說:數據並沒有真正寫入數據庫。

原因:hibernate配置錯誤

解決方案:Hibernate中設置事務自動提交

即在Hibernate配置文件中進行如下設置 :

<property name="connection.autocommit">true</property>

(<!-- 設置事務自動提交(默認為false,false的話,程序對數據庫的操作都不會作為事務提交) -->)

一切就OK了。

問題八:異常Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userDao' must be of type [com.changetech.dao.impl.UserDaoImpl], but was actually of type [$Proxy16]

原因如下:

@Resource(name="userDao")

protected UserDaoImpl userDao;

public void setUserDao(UserDaoImpl userDao) {

        this.userDao = userDao;

}

原來在定義Dao時,沒有用接口,而直接使用的是Dao的實現類

解決方案:改為如下:

@Resource(name="userDao")

protected UserDao userDao;

public void setUserDao(IUserDao userDao) {

        this.userDao = userDao;

}

問題得到了解決

問題九:更新時報錯 (The given object has a null identifier)

原因:對於自增字段的主鍵通常不能自動將值傳遞到頁面,即在更新時缺少主鍵,需要手動設置

解決方案:在頁面中加上下面這句即可:

<s:hidden name="book.bookId"></s:hidden>(不會在頁面顯示出來,但值傳遞過來了)

問題十:js實現圖片不能顯示時使用替換圖片顯示

解決方案:使用img標簽的onerror屬性來處理默認圖片,示例如下:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>替換示例</title>

</head>

<body>

<img id="img" src="001.jpg" onerror="showerrimg(this);" >

<script language="JavaScript">

function showerrimg(obj){

var errorimg = "error.jpg";//替換圖片地址

obj.src = errorimg;

}

</script>

</body>

</html>

問題十一:MyEclipse中修改項目名稱後,如何重新部署到 tomcat?

解決方案:首先修改工程名(直接按F2即可),然後選擇工程名--右鍵--Properties--MyEclipse--Web--把Web Context-root的名字改成新的項目名稱, 再把tomcat的工程刪除了,最後重新部署下即可。

問題十二:在jsp頁面中用request方式向struts的action中傳遞不了中文參數,例如下面代碼:

<silver;mso-highlight:silver;mso-font-kerning:0pt;" >  
a href="findBooksByConditionAction.action?page=<s:property value="%{pageBean.currentPage+1}" />  
&property=0pt;" ><%=session.getAttribute(0pt;" >"property")mso-font-kerning:0pt;" >%>&condition=mso-font-kerning:0pt;" >  
<%=session.getAttribute(mso-font-kerning:0pt;" >"condition")color:#BF5F3F;mso-font-kerning:0pt;" >%>  
&category=0pt;"  ><%=session.getAttribute(0pt;"  >"category")mso-font-kerning:0pt;"  >%>&subCategory=mso-font-kerning:0pt;"  >  
<%=session.getAttribute(mso-font-kerning:0pt;"  >"subCategory")color:#BF5F3F;mso-font-kerning:0pt;"  >%>0pt;"  >"    
class="right-font08">下一頁</background:silver;mso-highlight:silver;mso-font-kerning:0pt;"  >amso-font-kerning:0pt;"  >>

這樣傳遞過去的中文是亂碼。

解決方案:放在input文本域裡面傳遞過去,即

<input type="hidden" name="condition" value="<%=session.getAttribute("condition")%>" />  
<input type="hidden" name="category" value="<%=session.getAttribute("category")%>" />  
<input type="hidden" name="subCategory" value="<%=session.getAttribute("subCategory")%>" />  
<input type="hidden" name="property" value="<%=session.getAttribute("property")%>" />

然後直接

<a href="findBooksByConditionAction.action?page=<s:property value="%{pageBean.currentPage+1}" />"class="right-font08">下一頁</a>

但發現值竟然沒有傳過去(空指針報錯),經問同事後知道,要想input裡的值傳過去必須提交表單才可,僅采用這種超鏈接方式進行跳轉的值是傳不過去的,於是將超鏈接換為

<a href="javascript:queryByConn('<s:property value="%{pageBean.currentPage+1}" />');" class="right-font08">下一頁</a>

js中相應加上該函數的實現:

function queryByConn(page) {  
      
document.bookForm.action="findBooksByConditionAction.action?page="+page;  
      
    document.bookForm.submit();  
      
}

在js中將表單提交即可,這樣亂碼問題就解決了。

問題十三:hibernate中出現異常:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)

at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)

原因:hibernate配置中 many-to-one的默認選項是 lazy = "proxy"

解決方法:<many-to-one>  及 <set> 中設置 lazy="false"即可

問題十四:如何建立svn服務器

解決方案:首先當然要安裝客戶端svn(小烏龜TortoiseSVN )和服務器端svn(Subversion),然後在命令行下輸入以下命令:

1、svnadmin oa(oa是存放各個版本信息的文件夾名稱,自定義)

2、svnserve  –d –r oa(打開svn服務器)

PS:可能遇到的問題

authorized failed(權限認證失敗)

解決方案:在oa目錄下找到passwd文件,在裡面加上幾個用戶

用戶名=密碼(自己定義用戶名和密碼)

並將svnserve.conf裡的password-db = passwd這句前面的#去掉即可(前面不能留有空格)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved