확실히 db연동부분은 쉽군요-_-; try catch도 안해도 되고, 커넥션 같은것도 스프링에서 다 알아서 해줘요-_-;
처음 틀만 제대로 만들어놓으면 개발하는데에는 더 속도가 빨라질 것 같아요.









우선 ListController클래스를 봅시다.
[code]
List<GuestbookVO> contentslist = getGuestbookManager().getContents();  
return new ModelAndView("list", "contentslist", contentslist);
[/code]
멤버변수로 있는 guestbookManager는 springapp-servlet.xml에서 알아서 셋팅되니 우리는 그냥 getter만 하면 됩니다. 가져와서 getContents()메소드를 호출하면 List를 다 가져오는 메소드입니다.

자세히 보도록 합시다.
GuestbookManagerDao클래스는 인터페이스입니다. GuestbookManagerDaoJdbc클래스는 저 인터페이스를 구현해 놓은 클래스입니다.
getContents()메소드
[code]
@SuppressWarnings("unchecked")
public List<GuestbookVO> getContents() {
 
  jdbcTemplate = new JdbcTemplate(dataSource);
  String query =
  "SELECT no, name, subject, content, ip, datetime FROM guestbook ORDER BY no DESC";
 
  List<GuestbookVO> contentslist =
                   (List<GuestbookVO>)jdbcTemplate.queryForList(query);
 
  return contentslist;
 }
[/code]
코드를 보니 예전에 스트럿츠에서하던 try-catch-finally는 다 걷어버리고, 딸랑 몇개만 남았어요. 커넥션하는것도 없어요-_-; 매우 간단해요!-_-;
아....참고로 저렇게 해도 나쁜방식입니다. 원래는 하나하나 매핑해줘야한다더군요.(이것도 아이군한테 혼났어요-_-;)
dataSource는 xml에서 다 해주니 새로운 jdbcTemplate을 생성합니다. 이 생성된 jdbcTemplate이 제공하는 메소드중에 queryForList라는게 있는데 query를 주면 자동으로 List형태로 반환해주는 메소드입니다.
저렇게 리스트 형식으로 받게 됩니다. 자동으로 가져오는 것보다 매퍼라는게 있는데 그걸로 매핑해서 하는게 명확한 표현입니다.
아 그리고 저렇게하면 워링이 뜨는데 그건 프레임워크에서 만들어진 List형에 아무것도 안붙어있기때문이죠.
jdk1.5.0이상부터는 List에는 형태를 명시해주기로 되어있어요. ex) List<GuestbookVO>
가볍게 무시를 해줍시다-_-;
이클립스에서 해주는데 @SuppressWarnings("unchecked") 라고하면 워링이 사라집니다.

이제 Controller는 이 List를 받아서 list.jsp을 요청하면 List를 넘겨줍니다.
list.jsp를 봅시다.
[code]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><fmt:message key="title"/></title>
</head>
<body>

<form action="write.do" method="post">

이름 : <input name="name" type="text"/>
제목 : <input name="subject" type="text"/><br />
내용 : <br /><textarea name="content" rows="10" cols="50"></textarea><br />
<br />
<input type="submit" value="글쓰기"/>
<br />
<spring:hasBindErrors name="guestbookWrite">
 <b>필드를 채워주세요!</b>
</spring:hasBindErrors>
<hr />
</form>
<c:forEach var="contentslist" items="${contentslist}">
 <div>
 <p>이름 : ${contentslist.name}</p>
 <p>제목 : ${contentslist.subject}</p>
 <p>내용 : ${contentslist.content}</p>
 <p>아이피 : ${contentslist.ip}</p>
 <p>날짜 : ${contentslist.datetime}</p>
 </div>
 <hr />
</c:forEach>

</body>
</html>
[/code]
spring태그는 우선 가볍게 무시합시다. 위에 쓰기위한 폼이 있고, 아래에는 forEach를 통해 반복하고 있군요.
list.jsp에 딸려온 contentslist에 있는 것을 반복해서 출력해줍니다.
저거 el표기법인데 구글에서 가볍게 검색해서 공부해봅시다(사실 저도 잘 모릅니다-_-;)
jstl도 가볍게 검색해주고-_-;

방명록소스
http://mudchobo.tomeii.com/tt/120
 
Posted by 머드초보

댓글을 달아 주세요

 

아....-_-;

우선 소스부분
com.mudchobo.guestbook.common - 공통부분이라는 뜻인데 뭐 그냥 인코딩필터밖에 없어요. UTF-8로 인코딩한다 뭐 그런내용밖에-_-; 저도 친구가 쓰는거 가져다가 그냥 썼습니다.

com.mudchobo.guestbook.controller - 말그대로 MVC 중에 Controller에 관련된 클래스가 있습니다.

com.mudchobo.guestbook.db - db와 연동하는 dao클래스가 있습니다.

com.mudchobo.guestbook.logic - 로직과 폼에 관련된 클래스가 있습니다.

com.mudchobo.guestbook.vo - Value Object 클래스가 있습니다.

WEB-INF에는 web.xml과 springapp-servlet.xml, spring.tld가 있습니다.

WEB-INF/jsp에는 jsp 가 있습니다-_-;

우선 web.xml을 봅시다.
[code]
<servlet>
   <servlet-name>springapp</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
   <servlet-name>springapp</servlet-name>
   <url-pattern>*.do</url-pattern>
</servlet-mapping>
[/code]
서블릿을 스프링프레임워크에서 제공하는 DispatcherServlet을 사용합니다. 이것은 *.do으로 들어오는 요청에 대해서는 이 서블릿으로 처리한다는 뜻입니다.

자 이제 가장 중요한 bean들을 모아둔 springapp-servlet.xml을 보도록 합시다.
(파일이름이 서블릿이름-servlet.xml으로 짓는걸 권장하는데 요즘에는 이렇게 안쓰는거 같아요. xml도 분할하고 그러는 것 같습니다.)
[code]
<beans>

 <bean id="springappController"
   class="com.mudchobo.guestbook.controller.SpringappController" />
 
 <bean id="listController"
   class="com.mudchobo.guestbook.controller.ListController">
  <property name="guestbookManager">
   <ref bean="guestbookMan" />
  </property>
 </bean>
 
 <bean id="guestbookWriteValidator"
  class="com.mudchobo.guestbook.logic.GuestbookWriteValidator" />
 
 <bean id="writeController"
  class="com.mudchobo.guestbook.controller.WriteController">
  <property name="sessionForm" value="true" />
  <property name="commandName" value="guestbookWrite" />
  <property name="commandClass"
    value="com.mudchobo.guestbook.logic.GuestbookWrite" />
  <property name="validator" ref="guestbookWriteValidator" />
  <property name="formView" value="list" />
  <property name="successView" value="list.do" />
  <property name="guestbookManager">
   <ref bean="guestbookMan" />
  </property>
 </bean>
 
 <bean id="dataSource"
   class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
<value>com.mysql.jdbc.Driver</value></property>
  <property name="url">
   <value>db주소</value>
  </property>
  <property name="username"><value>dbid</value></property>
  <property name="password"><value>dbpw</value></property>
 </bean>
 
 <bean id="guestbookManDao"
   class="com.mudchobo.guestbook.db.GuestbookManagerDaoJdbc">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
 </bean>
 
 <bean id="guestbookMan"
   class="com.mudchobo.guestbook.logic.GuestbookManager">
  <property name="guestbookManagerDao">
   <ref bean="guestbookManDao" />
  </property>
 </bean>
 
 <bean id="urlMapping"
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/index.do">springappController</prop>
    <prop key="/list.do">listController</prop>
    <prop key="/write.do">writeController</prop>
    <!--
    <prop key="/delete.htm">DeleteFormController</prop>
     -->
   </props>
  </property>
 </bean>
 
 <bean id="viewResolver"
   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass">
   <value>org.springframework.web.servlet.view.JstlView</value>
  </property>  
  <property name="prefix">
   <value>/WEB-INF/jsp/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
 </bean>
 
 <bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename"><value>messages</value></property>
 </bean>
</beans>
[/code]
우선 urlMapping bean을 봅시다. list.do 요청이 들어오면 listController빈을 수행합니다. listController는 ListController클래스입니다. 이 클래스의 property는 guestbookManager입니다. 이것은 ListController클래스의 멤버변수를 의미합니다. 이 xml에서 이 해당 멤버변수값을 참조할 수 있습니다. 보시면 알겠지만, ref태그를 통해서 bean을 참조합니다. guestbookMan 빈을 가져올 수 있는 것입니다.
뭐 이런식으로 구조가 되어있어요. ListController는 GuestbookManager클래스를 가져와서 저 Manager클래스는 getContents()등 실제 로직이 있는 클래스이므로 저 메소드를 호출해서 List를 가져올 수 있는 것입니다.
Manager클래스는 Dao를 참조해서 데이터를 가져옵니다.

이런식의 구조로 되어있습니다-_-;

db테이블은
[code]
CREATE TABLE `guestbook` (
  `no` int(11) NOT NULL auto_increment,
  `name` varchar(250) default NULL,
  `subject` varchar(2000) default NULL,
  `content` text,
  `ip` varchar(15) default NULL,
  `datetime` datetime default NULL,
  PRIMARY KEY  (`no`)
) ENGINE=MyISAM  DEFAULT CHARSET=euckr AUTO_INCREMENT=23 ;
[/code]
입니다.

방명록소스
http://mudchobo.tomeii.com/tt/120
 
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon Mesothelioma Lawyer 2011.08.10 13:37  댓글주소  수정/삭제  댓글쓰기

    Your blog is very useful. Thank you so much for providing plenty of useful content. I have bookmarked your blog site and will be without doubt coming back. Once again, I appreciate all your work and also providing a lot vital tricks for your readers.

 
초를 5개 붙인 이유는 오로지 글쓰기랑 리스트보기밖에 안돼요-_-;
최근 귀차니즘의 향상으로-_-; 스프링의 동작원리를 파악하기 위해 제작했는데 이정도로 대충만들줄은...-_-;

TEXTAREA에서 줄바꿈도 안되고요-_-; 이거 메소드만 하나 넣어주면 되는데 ^^

뭐 가장 중요한건 뭐 어떻게 돌아가는냐가 중요하니 ^^ 공부하다가 삽질한거 올려요
ORM같은거는 뭐 사용할 줄 몰라서 스프링에 있는거 그냥 썼는데 제대로 쓴건지 모르겠어요.

아.....옛날 문서보고 하다가 친구한테 또 욕먹었어요-_-;
뭐 어쨌든 DB연동 부분에서는 스프링이 확실히 편한 거 같군요.

예제 주소입니다.
http://mudchobo.tomeii.com/SpringGuestBook/

설명은 나중에-_-; 일해야해요-_-;


SpringGuestBook.war

방명록아닌방명록 소스(war)

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 아이 2007.10.02 13:53  댓글주소  수정/삭제  댓글쓰기

    ㅊㅋㅊㅋ

 

이번엔 DataGrid를 이용해봅시다!-_-;

예약 리스트를 받아와야하기 때문에 더 쉽습니다-_-; 이 DataGrid라는 놈이 너무 강력해서-_-; 자바Bean이랑 매우 잘 맞아요!

자바측에서 List형태로 리턴하게 되면 DataGrid의 dataProvider가 알아서 다 해줍니다.
우선 자바측의 예약 취소하기 메소드를 보도록 합시다.





[code]
public int BookCancel(int[] seatnum) {
  Connection con = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;

  try {
   String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
         con = DriverManager.getConnection(jdbcDriver);
   // 현재 요청된 변호레코드의 ID와 좌석번호, ID와 맞는 비번을 추출
   for (int i=0; i<seatnum.length; i++) {
    pstmt = con.prepareStatement("DELETE FROM bs_Book WHERE seatnum = ?");
    pstmt.setInt(1, seatnum[i]);
    pstmt.executeUpdate();
   
    pstmt = con.prepareStatement(
                "UPDATE bs_Seat SET isbooked='X' WHERE seatnum = ?");
    pstmt.setInt(1, seatnum[i]);
    pstmt.executeUpdate();
   }
   return 1;
  } catch (SQLException e) {
   e.printStackTrace();
   return 0;
  } finally {
   if (rs != null) try { rs.close(); } catch(SQLException ex) {}
   if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
   if (con != null) try { con.close(); } catch(SQLException ex) {}
  }
 }
[/code]
아 이거 배열로 처리하려고 했는데 DataGrid에서 다중선택을 할 줄 모르겠어요-_- 아는 사람 좀 가르쳐주세요!

어쨌든-_-; 한개만 넘겼다고 치고 해봅시다. 해당 좌석번호를 찾아서 bs_Book테이블에서 삭제를 하고 bs_Seat테이블에는 예약여부(isbooked)에 X로 바꿔주면 끝납니다.

이제 플렉스로 가봅시다.

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
  width="100%" height="100%" title="예약취소하기">
 <mx:Script>
  <![CDATA[
   import mx.rpc.events.ResultEvent;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.remoting.RemoteObject;
   import mx.controls.Alert;
   
   private function bookCancel():void {
    var cancellist:Array = new Array();
    var srv:RemoteObject = new RemoteObject();
    var i:int;
    srv.destination = "booksystem";
   
    if (dg.selectedItem == null){
     Alert.show("좌석을 선택하세요!");
     return;
    }
    cancellist.push(int(dg.selectedItem.seatnum));
   
    srv.BookCancel(cancellist);
   
    srv.addEventListener("result", resultHandler);
    srv.addEventListener("fault", faultHandler);
   }
   
   // Result Handler
   private function resultHandler(event:ResultEvent):void {
    var result:int = int(event.result);
   
    switch (result) {
     case 0 :
      Alert.show("DB오류입니다.");
      break;
     case 1 :
      Alert.show("예약취소가 완료되었습니다.");
      parentApplication.viewstack.selectedChild = parentApplication.ViewHome;
      break;
    }
   }
   private function faultHandler(event:FaultEvent):void {
    mx.controls.Alert.show("실패 메세지: " + event.fault.message);
   }
   
   public function UpdateBookcancel():void {
    var srv:RemoteObject = new RemoteObject();
    srv.destination = "booksystem";
    srv.addEventListener("result", bookresultHandler);
    srv.addEventListener("fault", bookfaultHandler);
    srv.getBook(parentApplication.loginid);
   }
   private function bookresultHandler(event:ResultEvent):void {
    dg.dataProvider = event.result;
    parentApplication.viewstack.selectedChild=parentApplication.ViewBookCancel;
   }
   private function bookfaultHandler(event:FaultEvent):void {
    mx.controls.Alert.show("실패 메세지: " + event.fault.message);
   }
  ]]>
 </mx:Script>
 
 <mx:DataGrid id="dg" width="100%" height="100%" />
 <mx:ControlBar horizontalAlign="center">
  <mx:Button label="예약취소하기" click="bookCancel()"/>
 </mx:ControlBar>
</mx:Panel>

[/code]
우선 UpdateBookcancel을 실행하게 되면 getBook함수를 호출하는데 이 함수는 예약리스트를 List객체에 받아오는 역할을 합니다.

dg.dataProvider = event.result; (dg는 DataGrid의 id)

이 결과를 그냥 dg.dataProvider에 처 넣으면 됩니다-_-; 그러면 알아서 테이블로 표시가 됩니다.

그리고 해당줄을 선택하고, 예약취소버튼을 누르면 bookCancel함수를 호출하는데 여기서 자바클래스에 있는 BookCancel함수를 호출하게 됩니다.

선택된 좌석은 dg.selectedItem.seatnum 이렇게 하면 알 수 있습니다.

예매시스템 소스파일입니다.
http://mudchobo.tomeii.com/tt/108

 
Posted by 머드초보

댓글을 달아 주세요

 

예약하기부분... 머리가 딸려서 좀 고생했습니다-_-;

아....mxml에서는 반복문 못 쓰는 건가요? 버튼을 90개 만들고 싶은데 다 적을 수도 없고 해서-_-;
as에서 구현을 했습니다 ^^

우선 예약하기부분의 자바클래스를 보도록 합시다.
아 우선 DB구조를 보도록 합시다.


사용자 삽입 이미지

bs는 Booksystem의 약자고요-_-;
bs_Book은 예약리스트입니다. 3개의 필드로 되어있는데요. booknum, id, seatnum으로 되어있구요.
bs_Seat은 seatnum, grade, isbooked로 되어있어요.

예약을 하게 되면 bs_Seat에서 isbooked를 O로 바꾸고 bs_Book에 그 해당 번호와 예약한 id를 저장합니다. booknum은 오토인크리스먼트입니다.

간단한건데 왜이렇게 복잡하게 설명해놨지-_-; 뭐 어쨌든--; 간단합니다-_-;

[code]
public int BookSeat(String id, int[] seatnum) {
  Connection con = null;
  PreparedStatement pstmt = null;

  try {
   String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
         con = DriverManager.getConnection(jdbcDriver);
   // 요청한 좌석이 예약된 좌석인지 확인을 위해 IsBooked를 추출
   
   for (int i=0; i<seatnum.length; i++) {
    pstmt = con.prepareStatement(
       "UPDATE bs_Seat SET isbooked='O' WHERE bs_Seat.seatnum = ?");
    pstmt.setInt(1, seatnum[i]);
    pstmt.executeUpdate();
    pstmt = con.prepareStatement(
       "INSERT INTO bs_Book (id, seatnum) " + "VALUES (?, ?)");
    pstmt.setString(1, id);
    pstmt.setInt(2, seatnum[i]);
    pstmt.executeUpdate();
   }
   return 1;
  } catch (SQLException e) {
   e.printStackTrace();
   return 0;
  } finally {
   if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
   if (con != null) try { con.close(); } catch(SQLException ex) {}
  }
 }
[/code]
int형배열로 받습니다. 다중선택으로 올 수 있기 때문에-_-; 받아서 for문으로 개수만큼 실행합니다. 우선 bs_Seat테이블에서 예약여부필드에서 예약이 됐다는 의미에서 O로 바꾼 뒤에 bs_Book테이블 예약리스트테이블에 해당 id와 좌석번호(seatnum)을 집어 넣습니다. 예약요청하는 수만큼 반복합니다.

플렉스로 가봅시다-_-;

[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
  width="100%" height="100%"
 creationComplete="CreateButton()" title="좌석 예약하기">
 <mx:Script>
  <![CDATA[
   import mx.containers.ControlBar;
   import mx.controls.Button;
   import mx.rpc.events.ResultEvent;
   import mx.rpc.events.FaultEvent;
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
   import mx.rpc.remoting.RemoteObject;
   
   public var seatlistAC:ArrayCollection;
   public var bookseatAC:ArrayCollection = new ArrayCollection();
   public var count:int = 0;
   
   // 처음 Panel이 생성될 때 실행되는 버튼생성함수
   public function CreateButton():void {
    var i:int;
    var j:int;
    var space:int;
   
    for (i = 0; i < 9; i++) {
     for (j = 0; j < 10; j++) {
      var btn:Button = new Button();
     
      if (i < 3) {
       btn.label = "R" + (i*10+j+1);
       space = 0;
      } else if (i < 6) {
       btn.label = "S" + (i*10+j+1);
       space = 30;
      } else {
       btn.label = "A" + (i*10+j+1);
       space = 60;
      }
      btn.id = String(i*10+j+1);
      btn.name = "btn" + String(i*10+j+1);
      btn.x = j * 50;
      btn.y = i * 30 + space + 10;
      btn.width = 35;
      btn.height = 20;
      btn.setStyle("fillColors", ["#000000","#000000"]);
      btn.addEventListener(MouseEvent.CLICK, btnclickEvent);
      addChild(btn);
     }
    }
   }
   
   // 버튼클릭시 이벤트
   private function btnclickEvent(e:Event):void {
    var btn:Button = Button(e.currentTarget);
    var i:int;
    for (i = 0; i < bookseatAC.length; i++){
     if (bookseatAC.getItemAt(i) == btn.id){
      bookseatAC.removeItemAt(i);
      btn.setStyle("fillColors", ["#000000","#000000"]);
      count--;
      return;
     }
    }
   
    if (count == 4) {
     Alert.show("더이상 선택할 수 없습니다.");
     return;
    }
    count++;
   
    bookseatAC.addItem(btn.id);
    btn.setStyle("fillColors", ["#ff0000","#ff0000"]);
   }
   
   // 예약하기버튼 클릭시 발생하는 이벤트
   private function bookseatEvent():void {
    if (count == 0) {
     Alert.show("좌석을 선택하세요!");
     return;
    }
    var bookseatlist:Array = [];
    var srv:RemoteObject = new RemoteObject();
    var i:int;
    srv.destination = "booksystem";
   
    for (i=0; i<bookseatAC.length; i++) {
     bookseatlist.push(int(bookseatAC.getItemAt(i)));
    }
    srv.BookSeat(parentApplication.loginid, bookseatlist);
   
    srv.addEventListener("result", resultHandler);
    srv.addEventListener("fault", faultHandler);
   }
   
   // 예약하기 버튼 클릭시 실행하는 RemoteObject에 대한 이벤트핸들러
   private function resultHandler(event:ResultEvent):void {
    var result:int = int(event.result);
   
    switch (result) {
     case 0 :
      Alert.show("DB오류입니다.");
      break;
     case 1 :
      Alert.show("예약에 성공했습니다.");
      bookseatAC.removeAll();
      parentApplication.viewstack.selectedChild = parentApplication.ViewHome;
      count = 0;
      break;
    }
   }  
   private function faultHandler(event:FaultEvent):void {
    mx.controls.Alert.show("실패 메세지: " + event.fault.message);
   }
   
   // 예약여부확인 후 버튼업데이트
   public function UpdateBookseat():void {
    var srv:RemoteObject = new RemoteObject();
    srv.destination = "booksystem";
    srv.addEventListener("result", seatresultHandler);
    srv.addEventListener("fault", seatfaultHandler);
    srv.getSeat();
   }
   private function seatresultHandler(event:ResultEvent):void {
    var i:int;
    var btn:Button;
   
    seatlistAC = ArrayCollection(event.result);
       
    for (i = 0; i < seatlistAC.length; i++){
     btn = Button(this.getChildByName("btn" + String(i+1)));
     btn.setStyle("fillColors", ["#000000","#000000"]);
     if (seatlistAC[i].isbooked == "O") {
      btn.enabled = false;
     } else {
      btn.enabled = true;
     }
    }
    parentApplication.viewstack.selectedChild=parentApplication.ViewBookSeat;
   }
   private function seatfaultHandler(event:FaultEvent):void {
    mx.controls.Alert.show("실패 메세지: " + event.fault.message);
   }
  ]]>
 </mx:Script>
 
 <mx:ControlBar id="ctrbar" horizontalAlign="center">
  <mx:Button id="bookbtn" label="예약하기" click="bookseatEvent();"/>
 </mx:ControlBar>
</mx:Panel>
[/code]
아 길군요-_-; 우선 컴포넌트가 생성이 되면 CreateButton함수를 호출하게 되어있습니다. 이것이 패널에다가 90개의 버튼을 만들어주는 함수입니다. 각각 구별할 수 있게 id와 name을 주고 각 버튼마다 이벤트를 등록했습니다. 그리고 addChild라는 함수는 Panel에 자식으로 붙이겠다는 얘깁니다.

버튼이 생성되면 이미 예약되어있는 좌석은 비활성화 해야합니다. getSeat을 호출하면 좌석정보를 List객체에 담아오는데 이것을 ArrayCollection으로 받습니다.

seatlistAC = ArrayCollection(event.result); 이런식으로 받아오면 됩니다.

해당 되는 버튼은 enable = false로 해서 비활성화시킵니다.

버튼을 생성하고 그 해당 버튼을 클릭하게 되면 이벤트로 등록한 함수를 호출하게 되는데 btnclickEvent 이 함수를 호출하게 됩니다. 클릭할 때마다 ArrayCollection에다가 집어넣습니다-_-; 아..쓰면서 느낀건데 ArrayCollection할 필요 없을 꺼 같은데-_-; 그냥 Array로 해도 될 듯싶습니다. 아 삽질했습니다.

어쨌든 집어 넣어서 이미 클릭이 된거면 삭제를 시키고, 클릭이 안된거면 추가를 하게 되어있습니다.

그렇게 해서 예약하기 버튼을 클릭하면 bookseatEvent함수를 호출합니다. 이 함수를 호출하게 되면 자바클래스에 있는 BookSeat함수를 호출하게 됩니다-_-; 간단해요!

예매시스템 소스파일입니다.
http://mudchobo.tomeii.com/tt/108
 
Posted by 머드초보

댓글을 달아 주세요

  1. kedem 2008.11.21 01:52  댓글주소  수정/삭제  댓글쓰기

    잘보고 많이 배워갑니다
    하나 궁금한게 있는데
    다른건 다 잘되는데 예약이 안되네요

    저는 오라클을 써서 시퀀스를 사용했는데
    이부분이 계속 오류가 뜨네요
    어떻게 해야 좋을까요

    pstmt = con.prepareStatement("INSERT INTO bs_Book VALUES (booknum_seq.NEXTVAL,?, ?)";);
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);
    pstmt.executeUpdate();

    • 머드초보 2008.11.21 16:28  댓글주소  수정/삭제

      음....
      저도 1년전에 짠거라....-_-;
      게다가 시퀀스를 안써봐서 ㅠ
      문법상은 문제가 없어보이네요.
      어떤 에러가 뜨나요?

  2. kedem 2008.11.21 18:22  댓글주소  수정/삭제  댓글쓰기

    해결했습니다.
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);

    이부분 2, 3이 아니라 1, 2네요
    어제는 밤새봐도 모르겠던데
    오늘은 그냥 보니깐 알겠네요ㅜㅜ

    • 머드초보 2008.11.21 23:29  댓글주소  수정/삭제

      헉 그렇군요 ㅠㅠ
      그런문제였군요 ㅠ
      해결하셨다니 다행이네요 ^^

  3. BlogIcon 양파링 2010.02.02 13:10  댓글주소  수정/삭제  댓글쓰기

    오라클이라 윗분처럼 insert문에서 걸리던데...열명이 부적합 하다고...ㅡ_ㅡ;
    예약이 되는데요~ 예약 리스트에는 아무것도 없고 db에는 자료는 잘 인서트 되는데 뭐가 문제인지
    ㅜ_ㅠ; 참 db구조 연관관계 해 놓은게 이해가 안가는데 ~ 자세히 설명좀 해주시면 감사할게요~

    • 머드초보 2010.02.05 10:14  댓글주소  수정/삭제

      아...이거 저도 간만에 보니까 이해가 안되네-_-
      아....bs_Book테이블이 예약정보가 들어간 테이블이네요^^
      Member테이블이 있고, Seat은 자리테이블이고
      자리아이디와 멤버아이디를 함께 book테이블에 저장을 해요^^
      열명이 부적합한 것은 db생성이나 쿼리를 잘 확인해보시면.....ㅠ