1. 程式人生 > >整合ssh專案時所遇到的問題總結

整合ssh專案時所遇到的問題總結

1.異常:/hibernate.cfg.xml not found

使用spring整合hibernate之後,sessionFactory由spring管理,所以再用hibernate的Configuration conf = new Configuration().configure();就會找不到配置檔案,這時候必須用spring的sessionFactory或者使用spring提供的hibernateTemplate,用sessionFactory不能管理事務,用hibernateTemplate能管理事務。

2.hibernate.dialect' must be set when no Connection available錯誤

Java程式碼   收藏程式碼
  1. cfg=new AnnotationConfiguration();  
  2. sf=cfg.buildSessionFactory();  

 

在這裡沒有寫

 

Java程式碼   收藏程式碼
  1. cfg=new AnnotationConfiguration().configure();  

       缺少的是configure();

 新增這句話之後程式OK.

 

 new Configuration()預設是讀取hibernate.properties

 所以使用new Configuration().configure()來讀取hibernate.cfg.xml檔案


3.java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL,spring獲取context


今天學習spring專案的時候出現了下面的錯誤資訊:

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4854)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

    雖然問題一眼就知道是這句話:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener


  但是還是有點迷糊,因為以前練習spring的時候,是把jar包都複製到WEB-INF/Lib目錄下的,但是最近練習專案的時候都是自己建立自己不同的User libaraies,很明顯我已經匯入了這些jar包,但是卻提示這樣的資訊..............

看來自己對於JVM是如何引入我們所需要的第三方jar包的機制,後來去網上仔細搜了以下,才明白其原理,下面不廢話,直接重點:

  1. ava虛擬機器是根據Java ClassLoader(類載入器)決定如何載入Class。  
  2. 系統預設提供了3個ClassLoader    
  3. Root ClassLoader,ClassPath Loader,Ext ClassLoader  
  4. 我們也可以編寫自己的ClassLoader,去載入特定環境下的Jar檔案。    
  5. 能不能載入Jar,載入哪裡的Jar,是由ClassLoader決定的。    
  6.   
  7. 樓主的問題可能是 匯入的僅僅是jar包的引用,例如在eclipse中通過build path加進user lib……(類似快捷方式)  
  8. 這種在Java Application中沒問題,但在web Application中可能會出現找不到類的異常。  
  9. 在WEB Application中jar包最好放在webroot或webcontent下的lib資料夾內,特別是xml中用到的jar包。

原來是我們自使用類似於Ant來獲取類的時候是不能象UserLibaray來使用的,因為我們建立的是一個web app,而web app使用的是自定義的ClassLoader,而非JVM中的存在的三種ClassLoader(如上面所說),因此它無法識別出我們寫在xml檔案中的第三方類庫的class檔案,而只有我們寫在src目錄下的java檔案才能使用,因此,我們必須要把第三方的類庫放入到lib目錄下,web app 才會識別我們定義在xml中的類了  .

    通這個錯誤,也讓我對classloader的認識也進了一步.雖然以前看過周志明的深入JVM一書中關於類載入器分派體系的介紹,但是不太理解,這樣一來,自己也多了一些體會.


 

4.jquery和struts的結合

1.在 $("#myform").validate({}); 其中#myform這裡指的是id為myform的表單 

2.rules: {title: {}} 其中的title指的是name為title的input等表單的相關項

3.當input中name使用sort.name這樣的命名方式時, 則rules: {"sort.title": {}} 要加上又引號