Where The Streets Have No Name

무상태 세션빈 응용예제 본문

Developement/Java

무상태 세션빈 응용예제

highheat 2006. 4. 27. 19:48

▩ 무상태 세션빈 응용예제 - 방명록 만들기, Java Client

1. 오라클에 방명록 테이블 생성하기

create table guestbook(
   seq number primary key,           --글번호
   name varchar2(50) not null,       --글쓴이
   content varchar2(4000) not null); --방명록내용


create sequence guestbook_seq;        --글번호 생성

 

 

2. 하나의 레코드를 저장하는 DTO 객체,GuestbookDataBean.java

 - DTD(data Transfer Object):하나의 레코드를 저장하는 클래스

 - 사용되는 영역은  java, jsp,jsp beans, ejb beans등 모든 영역에 걸쳐서 사용됨

 - DBMS에 insert시 추가할 레코드 자료를 가지고 있읍니다.

 - DBMS에 update시 수정할 레코드 자료를 가지고 있읍니다.

 - DBMS에  select시 이 클래스 객체에 레코드를 저장합니다., 하나 이상의 레코드가 SELECT 될   때에는 Vector, ArrayList등의 클래스에 DTO 객체를  누적하여 사용합니다.

 - setter , getter로 이루어져 있음

 - 칼럼의 값은 인스턴스변수(전역변수)에 저장됨 

 - 원격으로 전송되기 때문에 무조건 implements java.io.Serializable 해야한다.

 

이클립스에서 project 생성

패키지 생성 ejb.session.stateless.guestbook
패키지 안에 빈즈클래스생성 GuestbookDataBean.java

 

>>>>> GuestbookDataBean.java
package ejb.session.stateless.guestbook;

public class GuestbookDataBean implements java.io.Serializable{
//인스턴스 변수, 전역변수
private int seq;      //글번호
private String name;  //이름
private String content; //방명록내용

//생성자(리턴 타입이 없음)
public GuestbookDataBean(){
seq = 0;
name = "";
content = "";
}

//setter
public void setSeq(int seq){
this.seq = seq;
}
public void setName(String name){
this.name = name;
}
public void setContent(String content){
this.content = content;
}

//getter
public int getSeq(){
return seq;
}

 public String getName(){
return name;
}

 public String getContent(){
return content;
}
}

 

>>>>> Remote Interface, Guestbook.java

package ejb.session.stateless.guestbook;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;
import java.util.*;

public interface Guestbook extends EJBObject{
   /**
    * 데이터베이스에 하나의 레코드를 추가합니다.
    * @param gb 하나의 레코드에 저장하는DTO객체
    * @throws RemoteException  발생할 수 있는 에러목록
    */
  
public void addGuestbookBean(GuestbookDataBean gb) throws RemoteException;
   /**
    * 방명록 목록을 가져옵니다.
    * @return ArrayList DTO 객체
    * @throws RemoteException
    */
public ArrayList getGuestbookBean() throws RemoteException;
   /**
    * 방명록 삭제
    * @param seq 글 번호
    * @throws RemoteException
    */
public void deleteGuestbookBean(int seq) throws RemoteException;
}

 

4. Home interface  

>>>>> Home Interface, GuestbookHome.java
package ejb.session.stateless.guestbook;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface GuestbookHome extends EJBHome{
   public Guestbook create() throws CreateException, RemoteException;
}

 

>>>>> 빈 클래스, GuestbookBean.java
package ejb.session.stateless.guestbook;

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class GuestbookBean implements SessionBean{
private Context ctx = null;
private DataSource ds = null;

 public void addGuestbookBean(GuestbookDataBean gb){

  Connection con = null;
 PreparedStatement stmt = null;

  String sql = "insert into guestbook values(guestbook_seq.NEXTVAL, ?, ?)";

  try{
  con = ds.getConnection();
  con.setAutoCommit(false);
  stmt = con.prepareStatement(sql);
  stmt.setString(1, gb.getName());
  stmt.setString(2, gb.getContent());
  stmt.executeUpdate();
  con.commit();
 }catch(Exception e){
  System.out.println("방명록 저장시 오류 :" + e.toString());
 }finally{
  if(stmt != null){
   try{
    stmt.close();
   }catch(SQLException ex){}
  }
  if(con != null){
   try{
    con.close();
   }catch(SQLException ex){}
  }
 } // finally
}

 public ArrayList getGuestbookBean(){
 Connection con = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;
 ArrayList list = new ArrayList();

  String sql = "select seq, name, content from guestbook order by seq desc";

  try{
  con = ds.getConnection();
  con.setAutoCommit(false);
  stmt = con.prepareStatement(sql);
  rs = stmt.executeQuery();
  while(rs.next()){
   GuestbookDataBean gdb = new GuestbookDataBean();
   gdb.setSeq(rs.getInt(1));
   gdb.setName(rs.getString(2));
   gdb.setContent(rs.getString(3));
   list.add(gdb);
  }
 }catch(Exception e){
  System.out.println("리스트 생성시 오류 :" + e.toString());
 }finally{
  if(rs != null){
   try{
    rs.close();
   }catch(SQLException ex){}
  }
  if(stmt != null){
   try{
    stmt.close();
   }catch(SQLException ex){}
  }
  if(con != null){
   try{
    con.close();
   }catch(SQLException ex){}
  }
 } // finally
 return list;
}

 public void deleteGuestbookBean(int seq){
 Connection con = null;
 PreparedStatement stmt = null;

  String sql = "delete from guestbook where seq = ?";

  try{
  con = ds.getConnection();
  con.setAutoCommit(false);
  stmt = con.prepareStatement(sql);
  stmt.setInt(1, seq);
  stmt.executeUpdate();
  con.commit();
 }catch(Exception e){
  System.out.println("삭제시 오류:" + e.toString());
 }finally{
  if(stmt != null){
   try{
    stmt.close();
   }catch(SQLException ex){}
  }
  if(con != null){
   try{
    con.close();
   }catch(SQLException ex){}
  }
 } // finally
}


public void ejbCreate(){
 try{
  ctx = new InitialContext();
  ds = (javax.sql.DataSource)ctx.lookup("ora9");
 }catch(Exception ex){}
}

 public void setSessionContext(SessionContext c){}

 public void ejbRemove(){
 ctx = null;
 ds = null;
}

 public void ejbActivate(){
 try{
  ctx = new InitialContext();
  ds = (javax.sql.DataSource)ctx.lookup("ora9");
 }catch(Exception ex){} 
}

 public void ejbPassivate(){ 
 ctx = null;
 ds = null;
}
}

 

 

3. Weblogic상에 ConnectionPool, DataSource 설정

 

 

4. Weblogic Builder에서 빌드하기
  - Transaction Type: Bean
  - JNDI Name: GuestbookBean
  - Enable call by reference Check
  - Oracle Resource Setting
    . Resource reference name: ora9
    . Resource Type: javax.sql.DataSource 
    . Resource authority: Container
    . JNDI Name: ora9
    . Sharing scope: Shareable

 

4-1. 배치파일 작성, guestbook.bat

ECHO OFF
c:
cd C:ejbeclipseworkspaceguestbookclasses

REM 빈을 jar파일로 압축합니다.
jar cvf Guestbook.jar ejb META-INF

REM 빈을 EJB서버로 이동시킵니다.
copy /Y Guestbook.jar C:eauser_projectsdomainsitwillapplications
copy /Y Guestbook.jar C:eauser_projectsdomainsitwillapplicationssessionWEB-INFlib

REM weblogic 서버를 실행합니다.
cd C:eauser_projectsdomainsmydomain
start startWeblogic.cmd

echo 모든작업이 종료 되었습니다.


5. Bean Test Logic의 구현
//insert를 테스트하는 파일
import java.util.*;
import javax.rmi.*;
import javax.naming.*;
import ejb.session.stateless.guestbook.*;

public class GuestbookTest{
   public static void main(String args[]){
       Context ctx=null;
       try{
           GuestbookDataBean gdb = new GuestbookDataBean();
           gdb.setName("왕눈이");
           gdb.setContent("안녕하세요");

            java.util.Properties p = new java.util.Properties();
           p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
           p.put(Context.PROVIDER_URL, "t3://127.0.0.1:7001");
           ctx=new InitialContext(p);
      
           Object h=ctx.lookup("GuestbookBean");
           GuestbookHome home = (GuestbookHome)PortableRemoteObject.narrow(h, GuestbookHome.class);
           //리모트 인터페이스 객체 생성
           Guestbook guestbook = home.create();
           guestbook.addGuestbookBean(gdb);

            //레코드를 전부 가져온다.
           ArrayList list = guestbook.getGuestbookBean();
           for(int i=0; i< list.size(); i++){
               gdb = (GuestbookDataBean)list.get(i);
               System.out.println("순번: " + gdb.getSeq());
               System.out.println("이름: " +gdb.getName());
               System.out.println("내용:" +gdb.getContent());
           }
       }catch(Exception e){
           System.out.println(e.toString());
       }
   }
}

 

 ▩ 무상태 세션빈 응용예제 - 방명록 만들기, Web Client
  - "guestbook.jar"파일을 "WEB-INF/lib" 폴더안으로 복사합니다.
  - http://127.0.0.1:7001/session/guestbook/writeform.html

1. writeform.html
<html>
<head><title>방명록 글쓰기 폼</title></head>
<body>
<form method=post action=write.jsp>
이름 : <input type=text name=name><br>
내용 : <textarea name=content cols=50 rows=4></textarea><br>
<input type=submit value=확인>&nbsp;&nbsp;&nbsp;<a href=list.jsp>리스트로 돌아가기</a>
</form>
</body>
</html>

 

 

2. write.jsp
<%@ page contentType="text/html;charset=EUC-KR"%>

<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.rmi.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.transaction.*"%>
<%@ page import="ejb.session.stateless.guestbook.*"%>

<html>
<head>
<title>방명록 글쓰기</title>
</head>
<body>
<h3>저장되었습니다.</h3><br>
<%
GuestbookDataBean gdb = new GuestbookDataBean();
gdb.setName(request.getParameter("name"));
gdb.setContent(request.getParameter("content"));

 Context ctx = null;

 try{
 ctx = new InitialContext();
 Object h = ctx.lookup("GuestbookBean");
 GuestbookHome home = (GuestbookHome)PortableRemoteObject.narrow(h, GuestbookHome.class);
 Guestbook guestbook = home.create();
 guestbook.addGuestbookBean(gdb);
}catch(Exception e){
 out.println(e.toString());
}
%>
<a href=list.jsp>방명록 리스트 보기</a>
</body>
</html>

 

 

3. list.jsp
<%@ page contentType="text/html;charset=EUC-KR"%>

<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.rmi.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.transaction.*"%>
<%@ page import="ejb.session.stateless.guestbook.*"%>

<html>
<head>
<title>방명록 리스트</title>
</head>
<body>
<h3>방명록 리스트</h3><br>
<%
Context ctx = null;

 try{
 ctx = new InitialContext();
 Object h = ctx.lookup("GuestbookBean");
 GuestbookHome home = (GuestbookHome)PortableRemoteObject.narrow(h, GuestbookHome.class);
 Guestbook guestbook = home.create();

  ArrayList list = guestbook.getGuestbookBean();
  
       for(int i = 0; i < list.size(); i++){
  GuestbookDataBean gdb = (GuestbookDataBean)list.get(i);
%>
 순번 : <%=gdb.getSeq()%><br>
 이름 : <%=gdb.getName()%><br>
 내용 : <pre> <%=gdb.getContent()%> </pre><br>
 <hr><br>
<%
 }
}catch(Exception e){
 out.println(e.toString());
}
%>
<a href=writeform.html>방명록 글쓰기</a>
</body>
</html>

 

 

4. C:eauser_projectsdomainsmydomainapplicationswebtestWEB-INFlib 폴더에 Guestbook.jar파일을 복사합니다.

 

 

5. Execution
  - http://127.0.0.1:7001/session/guestbook/writeform.html

 

 


▩ Delete 기능의 추가

 

▩  과제

 위의 방목록을 JSP + JSP Beans 형으로 변환하여 제출하셈 


▩ 빈 내용 수정시는 배치파일을 작성하여 작업하면 편합니다.
  - guestbook.bat


ECHO OFF
c:
cd C:eclipseworkspaceguestbookclasses

REM 빈을 jar파일로 압축합니다.
jar cvf Guestbook.jar it META-INF

REM 빈을 EJB서버로 이동시킵니다.
copy /Y Guestbook.jar C:eauser_projectsdomainsmydomainapplications

REM weblogic 서버를 실행합니다.
cd C:eauser_projectsdomainsmydomain
start startWeblogic.cmd

echo 모든작업이 종료 되었습니다.