struts 2008. 7. 30. 10:35

struts2] struts2 + ibatis 활용한 게시판1-1

           struts2 + ibatis 를 활용한 게시판


사용자 삽입 이미지

- struts2 framework 와 ibatis를 연동한 게시판 구축
- struts2 action클래스와 paging처리하는부분은 2페이지에 걸쳐 작성



1. 환경설정
    - struts2,ibatis,oracle library 등록(web-inf/lib)

2. struts.xml
    - aciton 등록

3. web.xml
   - struts환경에서는 사용자가 action요청시 가장 먼저 FilterDispatcher가 호출되고 위에 그림처럼
      배치관리자로 인해 struts.xml 파일과 struts.properties 파일이 자동으로 호출되게 된다

    <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
   </filter>
   
   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

4. DaoService.java
    - 데이타베이스 접속하기위한 DaoManager 를 반환하는 DaoService클래스 작성
    - 싱글턴패턴으로 만들어서 하나의 DaoManager를 공유



* struts.xml
     - 반드시 src 기본경로에 존재하여야 struts에서 인식할수있다.
     - web.xml에서 등록한 필터가 읽혀진후 해당 xml문서가 읽혀진다.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC '-//Apache Software Foundation//DTD Struts Configuration 2.0//EN'
'http://struts.apache.org/dtds/struts-2.0.dtd'>
<struts>
    <package name="defalut" extends="struts-default" namespace="">
      <action name="list" class="action.ListAction">
       <result>/list.jsp</result>
      </action>
    </package>
</struts>


* DaoService.java
          - DaoService는 한번만 읽혀져서 하나만 생성되어 DaoManager는 한개만 생성된다.


package dao;

import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.dao.client.Dao;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.DaoManagerBuilder;

public class DaoService {
  private static DaoManager daoManager;
 
  private static DaoManager getDaoManager(){
   String daoXmlResouce  = "dao.xml";  //src폴더에 dao.xml
   Reader reader = null;
   
   if(daoManager ==null)  //static으로 선언되어있기때문에 null 체크를 해서 null일경우만 생성
    try {
      reader = Resources.getResourceAsReader(daoXmlResouce);     //dao.xml파일로부터 읽음
      daoManager = DaoManagerBuilder.buildDaoManager(reader);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return daoManager;
  } 
 
  //실제 서버에서 dao객체가 필요할 경우 호출하는 메서드
  public static Dao getDao(Class inter){
   return getDaoManager().getDao(inter);
  }
}



* dao.xml
     - 사용하고자하는 dao interface 및  dao를 구현하고 있는 dao 를 명시

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE daoConfig PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN" "http://ibatis.apache.org/dtd/dao-2.dtd">

<daoConfig>
 <context id="sqlMap">
  <transactionManager type="SQLMAP">
   <property name="SqlMapConfigResource" value="config/SqlMapConfig.xml"/> 
  </transactionManager>
  <dao interface="dao.Bbs" implementation="dao.BbsImpl"/>
 </context>
</daoConfig>



* SqlMapConfig.xml
     - 사용하는 database 환경설정이 필요한 파일이다(여기서는 oracle을 사용)

<!DOCTYPE sqlMapConfig PUBLIC '-//ibatis.apache.org/DTD SQL Map Config 2.0//EN'
'http://ibatis.apache.org/dtd/sql-map-config-2.dtd'>
<sqlMapConfig>
    <properties resource="config/sqlMapConfig.properties" />
    <transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="${driver}" />  //라이브러리(odbc14.jar)파일이 필요
            <property name="JDBC.ConnectionURL" value="${url}" />
            <property name="JDBC.Username" value="${user}" />
            <property name="JDBC.Password" value="${pwd}" />
        </dataSource>
    </transactionManager>
 <sqlMap resource="config/bbs.xml" />
</sqlMapConfig>



* SqlMapConfig.properties
     - 보안을 위해 db접속정보를 따로 파일로 만들어둠

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:ORCL
user=SCOTT
pwd=TIGER


* Bbs.java(Interface)
     - 사용자가 호출할수 있는 기능적요소들을 명시

package dao;

import java.util.ArrayList;

import vo.BbsVO;

public interface Bbs {
  public ArrayList<BbsVO> getAllBbs();
}


* BbsImpl.java
     - 위의 인터페이스를 구현하고 SqlMapDaoTemplate 를 상속받는 클래스
     - 반드시 디폴트 생성자만 있으면 안되고 반드시 SqlMapDaoTemplate를 상속받고
        DaoManager를 인자로 받는 생성자를  만들어야 한다.
     - struts환경에서 여기에 정의된 메소드를 호출하게되면 결과를 받을수 있게 된다.
         ex> getAllBbs()
    
* BbsVO.java
     - DataBase에 있는 컬럼명과 동일한이름으로 멤버 변수로 정의
     - 정의된 멤버변수의 setter/getter 메서드를 정의


* bbs.xml
     - SqlMapConifg.xml 안에 <sqlMap>에 정의된 xml문서
     - 이 안에 정의된 <select> 요소의 속성 id는 값은 BbsImple.java클래스의 queryForList("") 이안에
       들어가는 인자값(String)과 동일해야 한다.  ex> select id="selectAllBbs"

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC '-//ibatis.apache.org//DTD SQL Map 2.0//EN' 'http://ibatis.apache.org/dtd/sql-map-2.dtd'>

<sqlMap namespace="memo">
     <typeAlias alias="bbsvo" type="vo.BbsVO"/>
    
     <select id="selectAllBbs" resultClass="bbsvo">
           select * from bbs_t order by idx desc
     </select>
</sqlMap>


* ListAction.java
     - struts 액션 클래스로서 ActionSupport를 상속
     - pojo기반으로 사용하게되면 session처리하는데 어려움이 있기때문에 ActionSupport를 상속
     - ListAction에서 ibatis DaoService에 정의된 메소드를 호출하게되면 해당 객체를 얻어낼수있다.
          ex>  Bbs bbs = (Bbs)DaoService.getDao(Bbs.class);