2011年3月31日 星期四

Spring 教學 - Cannot find class [org.apache.commons.dbcp.BasicDataSource]

以上一篇的 DBCP 連接池配置,如果發生以下問題

Exception in thread "main" org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.apache.commons.dbcp.BasicDataSource] for bean with name 'dataSource' defined in class path resource [applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1141)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:524)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1177)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:758)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:422)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
at org.database.shopCarDao.main(shopCarDao.java:20)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:211)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:385)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1138)

2011年3月29日 星期二

Spring 教學 - 配置 DBCP 連接池

Spring 集合了很多的資料庫連接池,DBCP 即是其中之一了

開發者只要透過一些簡單的配置即可使用 DBCP,以下以一個範例來介紹如何使用

下面的範例我是以 Java Web 的專案測試,並非一般的 Java Application

所以 如果到最後程式沒錯但是出現一堆 bug 的問題,我之後再撰文一一說明

如果是以 Java Web 為專案的,請先檢查該專案下是否已經存在了

Spring-2.5.6、commons-dbcp-1.4、commons-pool-1.5.5 否則會跑不起來唷!!

首先在 Spring 框架中有一部份即是整合了 DAO、ORM.....等

其中以下以一個 Good (商品) 和 GoodDao 為例,來看看Spring 如何整合 DAO 和連接池

GoodDao.java
package org.database;
import java.util.List;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class GoodDao extends JdbcDaoSupport //自定義的 DAO 必須繼承 JdbcDaoSupport 
{
    public List getAll(){
         List list = (List)getJdbcTemplate().queryForList("SELECT * FROM goods");
         return list;
    }

    //another method....
}

2011年3月28日 星期一

研究所考試

忍了好幾個月      研究所終於都考完啦

成績都出來了      不過蠻出乎我預料的

從暑期班開始      唸書也只是唸書而已

唸書在喘在累      一定要花時間寫程式

我不在乎結果      對我來說也是種舒壓

我所期待的是      把書唸完對得起自己

我在乎的事情      是要把程式寫好罷了

我從不覺得說      考的好人生會很輝煌

研究所是條路      但他並不是唯一的路

有專長最重要      千萬不要什麼都不會

對於考試結果      我起碼對得起自己了

我的成績 :

國立成功大學 資訊管理研究所                 乙組          備取10
國立高雄大學 資訊管理學系                     乙組          正取3
國立中山大學 資訊管理學系碩士班         乙組          正取2
國立中央大學 資訊管理學系碩士班         丙組          備取2
國立交通大學 資訊管理研究所                 甲組          備取30

有人想學 Java 或是 Java WEb 的嗎 或是有問題的 想要一起學習的 歡迎加我 MSN

ayu780129@hotmail.com << 親切 合善 包您滿意

2011年3月23日 星期三

Hibernate 教學 - Lazy 延遲加載

Lazy,稱為延遲加載 (或稱懶加載),通常多用於集合的抓取策略

簡言之就是在需要的情況下才會發出 SQL 語句,將所需的資料取出。

在說到延遲加載時,會加減牽涉到快取的問題,以下再一一說明

首先以集合的 set 為例,其 lazy 屬性預設為 true,以提高較好的效能

如下所示  :

<set name="assets" order-by="id desc" lazy="false">
          <key column="assettype_id" />
          <one-to-many class="org.pojo.Asset" />
</set>

以下先以一個簡短的程式來介紹 Session 的 get() 和 load() 方法

首先以一個多對一的範例為主 Assettype 為一,Asset 為多 底下先看看他們的映射文件

Asset.hbm.xml

<hibernate-mapping>
  <class name="org.pojo.Asset" table="t_asset" >
      <id name="id">
          <generator class="native" />

2011年3月15日 星期二

Java 網路程式 - 網路對播

透過 Java Socket 的 Client/Server 的實作來達成 雙方間一對一的通訊

但是同一時間只能有一方傳送資料,且 Server 端只能同時服務一個 Client

這樣的對播較容易實作,如需服務多個 Client 實則需透過執行緒去處理

這個之後我在發文吧,先來看看以下簡易的網路對播程式 在 Server/Client 的作法都類似

透過 flag 變數去控制目前是該等待接收資料 還是 輸入傳送資料

end 變數則是控制目前對話的狀態,true 為中止。以下片斷程式以 Client 為例

while(!end)
{
          while(flag == 0){       //傳送
                  //.....
                  if(message.equals("@"))    //遇到 @ 時,轉換 flag
           }
           while(flag ==1){     //接收
                 //.....
                 if(message.equals("@"))    //遇到 @ 時,轉換 flag
           }
}

2011年3月9日 星期三

Hibernate 教學 - org.hibernate.TransientObjectException: object references an unsaved transient instance

以下介紹一下在寫 Hibernate 時常見的例外情況,以下 PO 出完整的訊息

Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.pojo.Group
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:242)
at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:597)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3123)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:479)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:204)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:127)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.control.AccountTest.main(AccountTest.java:37)

2011年3月5日 星期六

JSP 教學 - 運用 Javabean 製作分頁功能

一般在製作 JSP 的分頁功能時,最簡單的想法應該是直接寫一些 Scriptlet

並透過參數的方式達到分頁以及由資料表中選取所需的資料

不過往往會在 JSP 裡產生過多的 Java 程式碼,所以可以透過 JavaBean 的特性

並透過 EL 和 JSTL 的運用來減少 JSP 裡的過多的 Java 程式,簡單說就是以 JavaBean 當作一個工具

首先以下範例為一個購物網站,假設在資料庫中有 20 筆資料,而網站內容是每頁展示9筆

程式的主要架構是將先是商品的網頁嵌入在一個 iframe,且此網頁必由 servlet 轉送而來

為什麼一定要從 servlet 轉送過來,因為我需要在 Servlet 內執行一些 SQL 語句和 javabean 的處理

以下來看看這個 Servlet 程式 listgoods.java
package org.controller;
import org.tool.Pagebean;
import org.model.Good;
import org.dao.GoodDAO;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class listgoods extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
    {
        request.setCharacterEncoding("UTF-8");
        int nowPageNumber = 1;  //目前頁數

        if(request.getParameter("nowP") != null){  //檢查看看是否有 nowP 參數
            nowPageNumber = Integer.parseInt(request.getParameter("nowP"));
        }else{
            nowPageNumber = 1; //代表目前請求的是第一頁
        }
        Pagebean pagebean = new Pagebean();   //Pagebean 為產生分頁程式碼的 JavaBean 
        pagebean.setPageLink(nowPageNumber);   //產生分頁功能的程式碼
        //查詢當前頁面所需的資料,透過 GoodDAO 實現
        ArrayList goods = new GoodDAO().getAllGoods(nowPageNumber);  

        request.setAttribute("goods", goods);   //設定屬性,方便在JSP 顯示商品
        request.setAttribute("pagebean", pagebean);   //設定屬性,方便在JSP 顯示分頁功能
        //重新導向到 listgoods.jsp 以顯示商品內容
        request.getRequestDispatcher("listgoods.jsp").forward(request, response);
    }
}

2011年3月4日 星期五

Java 網路程式 - Client/Server 通訊實作

本篇介紹以 Java Socket 實做 Client/Server 的簡單通訊實做

主要以 Socket 實現一個Server 端來接收 Client 的連線  往後在介紹更多的 Client/Server 的通訊方法

首先先說明常用於網路串流的 DataInputStream 和 DataOutputStream

不過你也是可以利用其他的串流類別,如: PrintWriter

通常再某一端(Client) 如要讀取Server的資料或是傳送資料給Server 時

都需要取得串流在能夠讀取或是寫入,而都是以

java.net.SocketgetInputStream()getOutputStream() 這兩個方法來取得串流

並加載於 DataInputStream 或是 DataOutputStream 上,例如以下所示

DataInputStream datain = new DataInputStream(socket.getInputStream());

2011年3月3日 星期四

Hibernate 教學 - hibernate 的物件生命週期

Hibernate 的物件生命週期可分為三大類

  • Transition (暫態) : 
          簡單說即是透過 new 產生的實體,尚未在資料庫有相對應的資料
          故還沒有被 Hibernate 納管
  • Persistent (持久) : 
          持久狀態即是已經被 Hibernate 所納管,即已被 Session 所管理,在持久狀態下的物件
          任何的更動都會被寫回資料庫,而持久狀態下的物件可由暫態並經由 save() 等方法
          使得該物件受 Session 所管納而形成持久狀態的物件,或是透過游離狀態並經過
          update() 或 saveOrUpdate() 讓離線狀態的物件再次受到 Session 所管納
           最後可以透過 get() 或 load() 直接取得資料庫的資料以形成持久狀態
  • Detached (游離或離線)
          指位於持久狀態下的物件,當所管納的 Session 執行 close() 或是 clear() 時
          則該物件就不被 Session 所納管,而形成了一種遊離或稱離線的狀態
          而游離狀態通常會再資料庫後方對應到一筆資料,除非你把它刪除
          此也是 Detached 和 Transition 最大的差別