2010年12月1日 星期三

Transaction manager教學

原因:使用OpenSessionInViewFilter時,session被設定為readOnly。

錯誤訊息:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

解決方式:
1. 增加TransactionManager.xml,如下xml。
其中在*ServiceImpl.java中的method名稱開頭為delete, save及merge,才可被與許存取DB。
2. 在web.xml加上TransactionManager.xml路徑

2010年11月18日 星期四

OpenSessionInViewFilter教學

如果沒有使用OpenSessionInViewFilter,Session會在transaction結束後關閉。
若有使用則會把一個Hibernate Session和一次完整的request過程對應的thread相綁定,使session在request的整個期間都可以使用。當View層邏輯完成後(如:在jsp用EL取關聯對象),才會通過Filter的doFilter方法自動關閉session。但是之後每一次request中的所有hibernate操作,都被當成同一個session並且被改成readOnly,所以將無法進行save,merge和delete的動作。這時就需要用transaction manager

2010年11月10日 星期三

struts optionsCollection 整合Spring用法

原因:有些下拉選單的內容是固定,分佈在不同頁面,若增加一個選項,要改很多頁面

解決方式:
1. 將選項內容記錄在DB,server啟動時,在AppListener讀取值

2. 用Spring將選項,直接注入struts提供的LabelValueBean,作法如下

 
  
   
   
  
  
   
   
  
 

在action中,直接將labelValueBeanList set到formbean中
註:一定要用LabelValueBean

在jsp頁面
 
  


或是

在action中,request.setAttribute("labelValueBeanList", labelValueBeanList);
註:可用自定的bean,不一定要用LabelValueBean

在jsp頁面

 

2010年11月9日 星期二

STRUTS 錯誤訊息集

Cannot find bean under name org.apache.struts.taglib.html.BEAN


  1. 在struts form tag 外使用strusts html tag
  2. property 必須和 submit 後,action對應的formbean中,有相同名稱的屬性,並且要有getter和setter

2010年11月5日 星期五

SSH回填至頁面

原因:
通常在做修改這個功能,需要將原有資料回填至欄位中

解決方式:
1. 在action中直接回傳To,jsp用EL回填
程式碼量:中
維護性:高
缺:若有關連的table,用EL取關連表的欄位,會有延遲加載(Lazy Load)的問題

2. 用ajax撈回資料,在用jquery填入欄位中
程式碼量:多
維護性:中
優:不用作form post
缺:要在action組字串、xml或JSON,再用jquery回填至個欄位

3. 在action中set ActionFrom,會自動回填
程式碼量:少
維護性:低

SSH延遲加載(Lazy Load)的問題

錯誤訊息:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session

2010年4月26日 星期一

取消TOMCAT管理頁面或是轉址

TOMCAT管理頁是放在webapps\ROOT\index.jsp下

先將這個檔案換名子或刪除

增加一支新的index.jsp內容為

2010年4月12日 星期一

foreach增加流水號

<c:forEach items="${beanList}" var="searchResult" varStatus="idStatus">
${idStatus.count}
</c:forEach>

2010年4月6日 星期二

Chinese_Taiwan_Stroke_BIN 與 Chinese_Taiwan_Stroke_CI_AS 之間的定序衝突

錯誤訊息:
Chinese_Taiwan_Stroke_BIN 與 Chinese_Taiwan_Stroke_CI_AS 之間的定序衝突
或是
Cannot resolve the collation conflict between "Chinese_Taiwan_Stroke_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation. [SQLSTATE 42000] (Error 468). The step failed