1. 程式人生 > >利用SSH框架開發時遇到的各種Bug及解決方法

利用SSH框架開發時遇到的各種Bug及解決方法

for manage unmap 獲取 extension cfg.xml request rem soci

1、hibernate自動生成的配置文件 hibernate.cfg.xml 有時候是有問題的,會出現

org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml

原因是自動生成的hibernate.cfg.xml第二個標簽引號內容的最末尾有一個空格,刪掉即可

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd ">

2、使用spring 3.x的時候最好使用hibernate3.x版本,不要使用4.1,否則可能也會出現下面的錯誤。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory‘ defined in file [E:\Workspaces\MyEclipse 10\Spring&Hibernate\src\applicationContext.xml]: Invocation of init method failed; nested exception is Java.lang.ExceptionInInitializerError

3、Exception starting filter struts2
Unable to load configuration. - bean - jar:file:/D:/Tomcat 5.5/webapps/LoginWeb/WEB-INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
....形如這樣的一個錯誤,提示找不到struts-default.xml文件

原因是

<action name="login.action" class="org.action.LoginAction">中之前是class=”login”,本想通過spring註入的。但是這裏報錯了。 問題是沒有導入struts支持Spring的庫,Struts 2 Spring Libraries

4

Messages:

· antlr.collections.AST.getLine()I

File:

org/hibernate/hql/ast/HqlSqlWalker.java

Line number:

876

Stacktraces

java.lang.reflect.InvocationTargetException

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

java.lang.reflect.Method.invoke(Method.java:597)

問題出在struts包裏面有也有個antlr_XXX.jar,與hibernate包裏面的沖突了,我是用myclipse自帶的類庫,要把struts中低版本的antlr刪掉

選擇windows---preferences---在文本框中搜索struts 2(中間有空格)---選擇struts 2---選擇antlr-2.7.2.jar---Remove---OK

5、No result defined for action org.action.LoginAction and result success

把<action name="login.action" class="loginAction"> 和jsp裏面的action

的name都改為login就好了, 真是坑爹。

6

Exception starting filter Struts2
Caught exception while loading file struts-default.xml - [unknown location]
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:130)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)

嚴重: Exception starting filter struts2

Caught exception while loading file struts-default.xml - [unknown location]

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839)

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)

那基本可斷定是其他jar包有沖突, 應該是XML解析包有沖突.
檢查發布後的WEB-INF/lib有兩個XML解析包: xml-apis.jar和xerces-2.6.2.jar
這種錯誤真正原因不是JDK 6和Struts 2沖突, 而是 MyEclipse Hibernate 類庫中多了兩個包: xml-apis.jar和xerces-2.6.2.jar, 這兩個包的功能和JDK的沖突了.

解決:刪除 hibernate3.2 中的xerces-2.6.2.jar包,

選擇windows---preferences---在文本框中搜索struts 2(中間有空格)---選擇struts 2---hibernate---選擇hibernate3.2---------刪除xerces-2.3.2.jar------移除tomcat中的部署------重新部署——ok

7

 hibernate反向工程生成的實體類就不能正確放在指定的包路徑下

  描述:

  使用hibernate反向工程生成實體類時,類文件可以正確生成在src的一級目錄下但在二級或多級目錄時就會生成在src的默認包下.例如:表 User,它有倆個字段username和password.在src下的一級目錄為hibernate,存放User由反向工程生成的實體類User和 UserDao,這時是正確的.但是當存放位置為二級或多級目錄時,反向工程生成的實體類就不能正確放在指定的包路徑下:例如,在src下存在包 cn.com.test.hibernate 如果我想把生成的實體類放在此包下,當導入時已經指定了該包,可單擊確定按鈕後,生成的實體類卻在src的default包下.

  源文檔 <;

  解決:

  在反向生成的最後一步,讓你填寫類名的時候,你需要把你的包名也包含進去。這樣就可以在兩層或者以上層存放了。

  或者最後一步時,類名使用默認值,不做任何更改。

如果手動移動的話,會報Association references unmapped class錯

8、type Exception report

message Could not execute JDBC batch update; SQL [insert into SCOTT.TEST (Value, Id) values (?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch update; SQL [insert into SCOTT.TEST (Value, Id) values (?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:635)

org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)

org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)

org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)

org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)

java.sql.BatchUpdateException: ORA-00904: "ID": 標識符無效

Jsp 中獲取requets、session、application 中的值,在Action則使用IoC實現接口比較常用

${requestScope.xx}

${sessionScope.xxx}

${applicationScope.xxx}

<%=request.getAttribute(“xxx”)%>

<%=session.getAttribute(“xxx”)%>

<%=application.getAttribute(“xxx”)%>

在struts標簽中這樣用也可以

Value=“%{#request.xxx}”

工作空間編碼不能影響JSP文件的編碼,必須單獨設置,

Window-->Preferences-->MyEclipse-->Files and Editors-->JSP

Encoding下拉列表中選擇ISO10646/Unicode(UTF-8)

Struts.i18n.encoding=UTF-8 指定Struts2 Web應用的默認編碼集 ,可在struts.xml中用

<constant name=”xxx”, value=”xx”> 或web.xml中

<init-param>

<param-name>xxx</param-name>

<param-value>xxx</param-value>

<init-param>

取代

<!-- 指定默認編碼集,作用於HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的輸出 -->

<constant name="struts.i18n.encoding" value="UTF-8"/>

<!-- 該屬性指定需要Struts 2處理的請求後綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts2處理。如果用戶需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開-->

<constant name="struts.action.extension" value="do"/>

<!-- 設置瀏覽器是否緩存靜態內容,默認值為true-->

<constant name="struts.serve.static.browserCache" value="false"/>

<!-- 當struts的配置文件修改後,系統是否自動重新加載該文件,默認值為false,開發階段最好打開 -->

<constant name="struts.configuration.xml.reload" value="true"/>

<!-- 開發模式下使用,這樣可以打印出更詳細的錯誤信息 -->

<constant name="struts.devMode" value="true" />

<!-- 默認的視圖主題 -->

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

<!– 與spring集成時,指定由spring負責action對象的創建 -->

<constant name="struts.objectFactory" value="spring" />

<!–該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性為false-->

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

<!--上傳文件的大小限制-->

<constant name="struts.multipart.maxSize" value=“10701096"/>

為action取名時,名字中盡量不要使用點號(.)和連接字符(_),否則會出現一些莫名其妙的問題。

可以使用!+方法名調用指定方法,可以這樣調用:

/struts/test/helloworld!other.action

在result映射的配置中,在指定實際資源的位置時,可以使用絕對路徑也可以使用相對路徑。絕對路徑是以斜杠(/)開頭,相對於當前web項目的上下文路徑,相對路徑不以斜杠(/)開頭,相對於當前執行的action路徑。

由於處於chain中的action屬於同一個http請求,共享一個ActionContext,故可以在上下文中獲取,在頁面上可以直接使用。

更新數據庫是可以用chain

利用SSH框架開發時遇到的各種Bug及解決方法