일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- oracle
- Spring
- phonegap
- JDOM
- ibsheet
- MFC
- GPS
- Struts
- dock
- WebLogic
- jsr 296
- Eclipse
- swingx
- Google Map
- 전자정부프레임워크
- JSON
- Android
- MySQL
- Ajax
- tomcat
- iBATIS
- rowspan
- PHP
- node.js
- 가우스
- jQuery
- appspresso
- 선택적조인
- sencha touch
- PLSQL
- Today
- Total
Where The Streets Have No Name
무상태 세션빈 응용예제 본문
▩ 무상태 세션빈 응용예제 - 방명록 만들기, 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=확인> <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 모든작업이 종료 되었습니다.