일대다(1:n) 관계 설정하기

Posted at 2009. 8. 31. 16:22 | Posted in Framework/Hibernate
반응형
전 포스핑에서 1:1 관계를 설정해봤습니다.

테스트 업무는 고객(cutomer)이 문의(support)를 올리고, 관리자가 그 문의에 답변(reply)을 다는 업무입니다.

고객은 문의를 여러번 할 수 있고, 관리자는 그 문의에 여러번 답변할  수 있습니다.


Java 1.6.0_15
Eclipse 3.5
Hibernate 3.3.2.GA
Apache Tomcat 6.0.18
MySQL 5.1 (HSQLDB 1.9.0 rc4)



먼저 아무 관계가 없는 매핑을 만들어 봅시다.

Customer.java
package com.tistory.antop;

public class Customer {

    private String id;
    private String name;
    private String pwd;
    private String tel;

    // construct, getter, setter
}

Customer.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Customer" table="tbl_customers">
        <id name="id" length="20" />
        <property name="pwd" column="password" length="20" not-null="true" />
        <property name="name" length="30" not-null="true" />
        <property name="tel" length="13" not-null="false" />
    </class>
</hibernate-mapping>


Support.java
package com.tistory.antop;

public class Support {

    private int id;
    private String title;
    private String contents;

    // construct, getter, setter (private setter id)
}

Support.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Support" table="tbl_supprots">
        <id name="id" column="support_id">
            <generator class="native" />
        </id>
        <property name="title" length="255" not-null="true" />
        <property name="contents" type="text" />
    </class>
</hibernate-mapping>


Reply.java
package com.tistory.antop;

public class Reply {

    private int seq;
    private String reply;
 
    // construct, getter, setter (private setter seq)
}

Reply.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Reply" table="tbl_replays">
        <id name="seq">
            <generator class="native" />
        </id>
        <property name="reply" type="text" not-null="true" />
    </class>
</hibernate-mapping>


hibernate.cfg.xml
<hibernate-configuration>
    <session-factory>
        ...

        <!-- Mapping -->
        <mapping resource="com/tistory/antop/Customer.hbm.xml" />
        <mapping resource="com/tistory/antop/Support.hbm.xml" />
        <mapping resource="com/tistory/antop/Reply.hbm.xml" />

    </session-factory>
</hibernate-configuration>



아무런 관계(릴레이션)가 없는 테이블 3개가 매핑 되었습니다.



이제 1:n 관계를 설정 합시다.

1:1에서와 마찬가지로 서로 참조를 시켜야 합니다.
 
db 에서는 1:n 관계를 1이 되는쪽의 PK 와 n 이 되는쪽의 FK를 지정하여 관계를 설정해주고,
 
클래스로 구현하면 1이 되는 클래스 필드가 n이 되는 클래스를 n개 만큼 참조하고 있어야 합니다.

반대로 n쪽의 클래스는 1이 되는 클래스를 참조하고 있어야겠죠?


먼저 고객(customer)과 문의(support)의 1:n 관계를 설정 해봅시다.


관계를 맺을 수 있는 필드와 사용할 적절한 메소드를 추가합니다.

Customer.java
public class Customer {
    ...

    // customer 1:n support 관계를 가지는 필드
    private Set<Support> supports = new HashSet<Support>();

    public Set<Reply> getReplys() {
        return replys;
    }

    private void setReplys(Set<Reply> replys) {
        this.replys = replys;
    }

    // 문의 추가
    public void addSupport(Support support) {
        if(getSupports() == null) {
            setSupports(new HashSet<Support>());
        }
        // customer -> support 참조
        getSupports().add(support);
        // support -> customer 참조
        support.setCustomer(this);
    }
 
    // 문의 삭제
    public void delSupport(Support support) {
        getSupports().remove(support);
    }
 
    // 문의 비우기
    public void clearSupports() {
        getSupports().clear();
    }
}

Customer.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Customer" table="tbl_customers">
        ...

        <!-- customer 1:n support -->
        <set name="supports" inverse="true" cascade="all-delete-orphan">
            <key column="customer_id" />
            <one-to-many class="com.tistory.antop.Support" />
        </set>
    </class>
}

Customer 와 Support 의 1:n 관계에서 Support는 콜랙션(Collection) 형태로 참조됩니다.

Set, List, Bag, Map 등등 있는데 자세한건 여기에서 확인을... -0-

 -= <set></set> : java.util.Set 타입으로 정의합니다.
   - name : java.util.Set 타입의 필드명입니다. (Customer.java의 "private Set<Support> supports")
   - inverse : 객체간 관계의 책임을 어디에 둘지에 대한 옵션을 정의하기 위한 속성입니다.
                   즉, 한 쪽은 owner의 역할을 맡기고, 다른 한 쪽에는 sub의 역할을 맡기기 위함입니다.
   - cascade : 부모 객체에 대한 CUD를 자식 객체에도 전이할지에 대한 옵션을 정의하기 위한 속성입니다.
 -= <key column="..." /> : FK(Foreign Key)를 명시합니다. (Support 쪽의 FK)
 -= <on-to-many class="..." /> : 관계를 맺는 클래스명(패키지명포함)을 명시합니다.


Support.java
public class Support {
    ...
    // customer 1:n support 관계를 가지는 필드
    private Customer customer;
   
    public Customer getCustomer() {
        return customer;
    }

    private void setCustomer(Customer customer) {
        this.customer = customer;
    }

    // 답변 추가
    public void addReply(Reply reply) {
        if(getReplys() == null) {
            setReplys(new HashSet<Reply>());
        }
        // support -> reply 참조
        getReplys().add(reply);
        // reply -> support 참조
        reply.setSupport(this);
    }
 
    // 답변 삭제
    public void delReply(Reply reply) {
        getReplys().remove(reply);
    }
 
    // 답변 비우기
    public void clear() {
        getReplys().clear();
    }
}

Support.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Support" table="tbl_supprots">
         ...

        <!-- customer 1:n support -->
        <many-to-one name="customer" column="customer_id" class="com.tistory.antop.Customer" />
    </class>
</hibernate-mapping>

Support 쪽에서는 그냥 customer 하나만 참조하면 됩니다.


이제 문의(support)와 답변(reply)도 1:n 관계를 설정합시다! +_+/

Support.java
public class Support {
    ...

    // support 1:n reply 관계를 가지는 필드
    private Set<Reply> replys = new HashSet<Reply>();

    public Set<Reply> getReplys() {
        return replys;
    }

    private void setReplys(Set<Reply> replys) {
        this.replys = replys;
    }
}

Support.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Support" table="tbl_supprots">
        ...

        <!-- support 1:n reply -->
        <set name="replys" inverse="true" cascade="all-delete-orphan">
            <key column="support_id" />
            <one-to-many class="com.tistory.antop.Reply" />
        </set>
    </class>
</hibernate-mapping>


Reply.java
public class Reply {
    ...

    // support 1:n reply 관계를 가지는 필드
    private Support support;

    public Support getSupport() {
        return support;
    }

    public void setSupport(Support support) {
        this.support = support;
    }
}

Reply.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Reply" table="tbl_replays">
        ...

        <!-- support 1:n reply -->
        <many-to-one name="support" column="support_id" class="com.tistory.antop.Support" />
    </class>
</hibernate-mapping>


이제 문의(support)와 답변(reply)의 1:n 관계도 설정 되었습니다.




이제 CRUD 해야졍.... 배보다 배꼽이 더 크네여 아오~

이번에는 조금 제대로 만들어 보았습니다... (아주 조금입니다... 조ㄱㅡ..)

진짜 배보다 배꼽이 더 켜졌네요;;;





참고 사이트
http://docs.jboss.org/hibernate/stable/core/reference/en/html/associations.html
http://dev.anyframejava.org/anyframe/doc/core/3.1.0/corefw/guide/hibernate-persistence-mapping-association.html
http://javacan.tistory.com/entry/106


반응형

'Framework > Hibernate' 카테고리의 다른 글

PK 두개 이상시 매핑  (2) 2009.12.24
Reverse Engineering  (0) 2009.12.24
Hibernate 시작하기  (0) 2009.12.23
Criteria 사용하여 질의 하기 #2  (1) 2009.10.03
Criteria 사용하여 질의 하기 #1  (4) 2009.09.10
다대다(n:m) 관계 설정하기  (0) 2009.09.02
일대일(1:1) 관계 설정하기  (0) 2009.08.27
하이버네이트(Hibernate) 사용하기  (6) 2009.08.24
//

일대일(1:1) 관계 설정하기

Posted at 2009. 8. 27. 16:58 | Posted in Framework/Hibernate
반응형

바로전 포스트에서 아주 기본적인 하이버네이트 매핑하는 걸 했었는데...

이번에는 이 매핑된 클래스끼리 관계 설정하는 것을 해보겠습니다!!

두개의 테이블이 PK(Primary Key)와 FK(Foreign Key)로 관계(Relation)가 형성되어 있는데 ORM(Object-Relational Mapping) 이랍시고 클래스와 매핑 시켰는데 테이블간의 관계를 클래스에서 제대로 사용할 수 없다면 쓰나 마나겠죠... -_-/

먼저 일대일(1:1) 관계를 해봅시다.


Java 1.6.0_15
Eclipse 3.5
Hibernate 3.3.2.GA
Apache Tomcat 6.0.18
MySQL 5.1 (HSQLDB 1.9.0 rc4)



먼저 일단 기본적인 클래스와 매핑 XML 을 만듭니다.(1:1관계가 설정 안된 상태)

Board.java
package com.tistory.antop;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Board {

    private int boardId;
    private String title;
    private String userName;
    private Date writeDate = new Date();

    public Board() { }

    // getter and setter (private setter boardId)
}

Board.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Board" table="tbl_board">
        <id name="boardId" column="board_id" length="11">
            <generator class="native" />
        </id>
        <property name="title" length="255" not-null="true" />
        <property name="userName" column="user_name" length="30" not-null="true" />
        <property name="writeDate" column="write_date" type="timestamp" not-null="true" />
    </class>
</hibernate-mapping>

※ 매핑 XML 에 대한 설명은 여기(또는 한글번역본)를 봐주세요~ ㅠ_ㅠ 결고 설명하기 귀찮아서 그러는게 아닝미...


BoardDetail.java
package com.tistory.antop;

public class BoardDetail {

    private int boardId;
    private String email;
    private String contents;
    private Board board;
 
    public BoardDetail() { }

    // getter and setter (private setter boardId)
}

BoardDetail.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="BoardDetail" table="tbl_board_detail">
        <id name="boardId" column="board_id" type="integer" length="11"></id>
        <property name="email" type="string" length="50" not-null="false" />
        <property name="contents" type="text" not-null="false" />
    </class>
</hibernate-mapping>


hibernate.cfg.xml
<hibernate-configuration>
    <session-factory>
        ...
        ...

        <!-- Mapping -->
        <mapping resource="com/tistory/antop/Board.hbm.xml" />
        <mapping resource="com/tistory/antop/BoardDetail.hbm.xml" />
    </session-factory>
</hibernate-configuration>


따로따로 쓰면 아주 잘 되는 매핑입니다. 현재 상태에서의 테이블은 아래와 같습니다.



1:1 관계를 설정해봅시다.

Board.java 와 BoardDetail.java 에 서로를 참조하는 필드를 만듭니다.

Board.java
public class Board {
    ...
   
    private BoardDetail boardDetail;

    // getter and setter
}

BoardDetail.java
public class BoardDetail {
    ....

    private Board board;

    // getter and setter
}


매핑 XML 에서 Board와 BoardDetail 의 1:1 관계를 설정합니다.

Board.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="Board" table="tbl_board">
        ...
        
        <!-- name: 관계를 맺을 클래스를 참조하는 필드 이름 -->
        <!-- class: 관계를 맺을 클래스 이름(패키지 포함) -->
        <!-- cascade: 삭제나 업데이트 시 관계가 맺어진(?) 테이블도 적용할지 하는 설정 -->
        <one-to-one name="boardDetail" class="com.tistory.antop.BoardDetail" cascade="all" />
     </class>
</hibernate-mapping>

BoardDetail.hbm.xml
<hibernate-mapping package="com.tistory.antop">
    <class name="BoardDetail" table="tbl_board_detail">
        <!-- Board 의 pk 번호를 따라가게 설정 -->
        <id name="boardId" column="board_id" type="integer" length="11">
            <generator class="foreign">
                <param name="property">board</param>
            </generator>
        </id>

        ...
  
        <!-- name: 관계를 맺을 클래스를 참조하는 필드 이름 -->
        <!-- class : 관계를 맺을 클래스 이름(패키지 포함) -->
        <!-- constrained: 매핑된 테이블의 PK에 대한 FK constraint가 연관된 클래스의 테이블을 참조하는지 여부를 지정 -->
        <one-to-one name="board" class="com.tistory.antop.Board" constrained="true" />
    </class>
</hibernate-mapping>


보면 알겠지만... 속성들이 DDL에 나오는 것들이랑 거의 비슷 합니다. 촉이 좋으면 금방 알 것입니다. +_+;

hibernate.cfg.xml 에서 hbm2ddl.auto을 설정해서 만들어진 DDL 을 보면 PK, FK 로 1:1 관계가 생성된걸 볼 수 있습니다.

hibernate.cfg.xml
<hibernate-configuration>
    <session-factory>
        ...

        <!-- 최초 시작(startup) 시 테이블을 새로 생성(drop and re-create database schema) -->
        <property name="hbm2ddl.auto">create</property>

        ...

    </session-factory>
</hibernate-configuration>


DDL(Data Definition Language) - MySQL 5.1 기준
CREATE TABLE `tbl_board` (
  `board_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(255) COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `user_name` VARCHAR(30) COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `write_date` DATETIME NOT NULL,
  PRIMARY KEY (`board_id`)

)ENGINE=InnoDB
AUTO_INCREMENT=1 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

--

CREATE TABLE `tbl_board_detail` (
  `board_id` INTEGER(11) NOT NULL,
  `email` VARCHAR(50) COLLATE utf8_general_ci DEFAULT NULL,
  `contents` LONGTEXT,
  PRIMARY KEY (`board_id`),
  KEY `FK658F66AB607D6F39` (`board_id`),
  CONSTRAINT `FK658F66AB607D6F39` FOREIGN KEY (`board_id`) REFERENCES `tbl_board` (`board_id`)

)ENGINE=InnoDB
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';




간단하게 CRUD 를 만들었습니다.




※ _mysql 과 _hsqldb 는 hibernate.cfg.xml 의 jdbc 설정과 lib 의 jdbc 라이브러만 다릅니다. 소스는 똑같습니다.

MySQL 도 귀찮다! 하시면 hsqldb 로 만들걸 해보세요~ +_+


중요한 부분은 저장할 때 서로를 참조 시켜주는 겁니다.

proc.jsp
...

Session sess = HibernateUtil.getCurrentSession();
Transaction tx = sess.beginTransaction();

// 등록
if("write".equals(query)) {
    String title = request.getParameter("title");
    String userName = request.getParameter("userName");
    String email = request.getParameter("email");
    String contents = request.getParameter("contents");

    Board board = new Board();
    board.setTitle(title);
    board.setUserName(userName);
 
    BoardDetail boardDetail = new BoardDetail();
    boardDetail.setEmail(email);
    boardDetail.setContents(contents);
 
    // 게시물과 게시물상세의 1:1 관계 설정
    board.setBoardDetail(boardDetail);
    boardDetail.setBoard(board);
 
    sess.save(board);        // Board 저장 (insert 쿼리)
}

...

tx.commit();        // BoardDetail 저장 (insert 쿼리)
HibernateUtil.closeSession();


Board는 sess.save(baord); 에서 저장 하는데, BoardDetail은 tx.commit(); 에서 저장을 하네요... 음... ^O^




참고 사이트
http://javacan.tistory.com/entry/102
http://javacan.tistory.com/entry/103
http://javacan.tistory.com/entry/104
http://javacan.tistory.com/entry/105

반응형

'Framework > Hibernate' 카테고리의 다른 글

PK 두개 이상시 매핑  (2) 2009.12.24
Reverse Engineering  (0) 2009.12.24
Hibernate 시작하기  (0) 2009.12.23
Criteria 사용하여 질의 하기 #2  (1) 2009.10.03
Criteria 사용하여 질의 하기 #1  (4) 2009.09.10
다대다(n:m) 관계 설정하기  (0) 2009.09.02
일대다(1:n) 관계 설정하기  (1) 2009.08.31
하이버네이트(Hibernate) 사용하기  (6) 2009.08.24
//

하이버네이트(Hibernate) 사용하기

Posted at 2009. 8. 24. 17:09 | Posted in Framework/Hibernate
반응형

Hibernate는 객체 모델링(Object Oriented Modeling)과 관계형 데이터 모델링(Relational Data Modeling) 사이의 불일치를 해결해 주는 ORM(Object Relation Mapping) 도구입니다.

Hiberbate Architecture


잘 사용하면 쿼리(sql) 하나 안쓰고 클래스의 set, get 같은것으로만 DB를 조종(?)할 수 있습니다.

하이버네이트를 이용하여 아주 간단한 CRUD[각주:1] 만 해봅시다!

Java 1.6.0_13
Hibernate 3.3.2.GA
Apache Tomcat 6.0.18
HSQLDB 1.9.0 rc4
Eclipse 3.5 + Habernate Tools


- 하이버네이트 라이브러리와 log4j 사용을 위한 properties 파일을 세팅합니다.(아래 war 파일에서 확인해주세요)


- 하이버네이트 실행에 관련된 속성 정보를 가지고 있는 hibernate.cfg.xml 파일을 만듭니다.




- hibernate.cfg.xml 파일을 저장할 위치를 설정합니다. (기본 src)



- Database 정보를 입력합니다.



- hibernate.cfg.xml 파일을 열어서 몇가지를 더 추가해줍니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
      <property name="hibernate.connection.url">jdbc:hsqldb:hsql/antop</property>
      <property name="hibernate.connection.username">sa</property>
      <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>

      <!-- JDBC connection pool (use the built-in) -->
      <property name="connection.pool_size">1</property>

      <!-- For a HSQL 1.8 in-memory database, this is required -->
      <property name="connection.shutdown">true</property>
        
      <!-- Drop and re-create the database schema on startup -->
      <property name="hbm2ddl.auto">create</property>

      <!-- Echo all executed SQL to stdout -->
      <property name="show_sql">true</property>
  
      <!-- Mapping -->

   </session-factory>
</hibernate-configuration>

show_sql 프로퍼티를 true로 하면 콘솔에서 쿼리를 확인할 수 있습니다.
hbm2ddl.auto 프로퍼티는 hbm.xml 이 바뀌면 디비 테이블을 드랍시키고 다시 생성하니 주의하세요!

- 간단한 고객테이블(customer)를 매핑시켜보겠습니다. (각 컬럼의 속성은 다를겁니다... MySQL 툴로 디자인한거라...)



- Customer 클래스를 작성합니다.
package com.tistory.antop;

public class Customer {
   private int seq;
   private String id;
   private String password;
   private String name;

   public Customer() { }

   public int getSeq() {
      return seq;
   }

   // 자동으로 생성되는 번호이므로 set 금지
   private void setSeq(int seq) {
      this.seq = seq;
   }
   // getter, setter, toString()
}


customer 테이블의 seq 칼럼은 자동증가이므로 클래스에서 setter를 private으로 선언한 것을 볼 수 있습니다. +_+/


- Customer 클래스에 대해 Mapping XML 파일을 작성합니다.

해당 클래스파일(.java)에서 마우스 오른쪽버튼 클릭 → New → Other...




이렇게 파일을 만들면 쵸큼 더 쉽게 작성할 수 있습니다.

Customer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.tistory.antop">
   <class name="Customer" table="customer">
      <!-- 기본키가 되는 필드 -->
      <id name="seq" column="SEQ">
         <!-- 자동 증가 -->
         <generator class="increment" />
      </id>
      <property name="id" column="ID" />
      <property name="password" column="PWD" />
      <property name="name" column="NAME" />
   </class>
</hibernate-mapping>

각 태그에 대한 성명은 여기를 봐주세요.


- 마지막으로 hibernate.cfg.xml 에다가 Customer.hbm.xml을 추가해줘야합니다.
...
<hibernate-configuration>
   ...

      <!-- Mapping -->
      <mapping resource="com/tistory/antop/Customer.hbm.xml"/>
  
   </session-factory>
</hibernate-configuration>


- 간단하게 customer에 관한 예제를 만들어보았습니다. 배보다 배꼽이 더 크군염 ㅠ_ㅠ



테스트는 용자만 할 수 있습니다.! +_+/




참조 사이트
http://docs.jboss.org/hibernate/stable/core/reference/en/html/
http://dev.anyframejava.org/anyframe/doc/core/3.1.0/corefw/guide/hibernate-introduction.html
http://javacan.tistory.com/entry/101


참조 문서

출처: http://cafe.naver.com/deve.cafe (문제가 된다면 삭제하겠습니다. ㅠ_ㅠ)



  1. CRUD : Create, Retrieve, Update, Delete [본문으로]
반응형

'Framework > Hibernate' 카테고리의 다른 글

PK 두개 이상시 매핑  (2) 2009.12.24
Reverse Engineering  (0) 2009.12.24
Hibernate 시작하기  (0) 2009.12.23
Criteria 사용하여 질의 하기 #2  (1) 2009.10.03
Criteria 사용하여 질의 하기 #1  (4) 2009.09.10
다대다(n:m) 관계 설정하기  (0) 2009.09.02
일대다(1:n) 관계 설정하기  (1) 2009.08.31
일대일(1:1) 관계 설정하기  (0) 2009.08.27
//

썸네일(Thumbnail) 만들기

Posted at 2009. 8. 9. 00:01 | Posted in Java+
반응형
이미지를 목록으로 표시할 경우 원래의 이미지 대신 작은 크기의 이미지를 표시하는데 이것을 '썸네일'이라고 합니다.

이전 버전의 자바에서는 이미지 처리를 위해서 JAI(Java Advanced Imaging) 라이브러리를 이용했어야 했지만, JAVA 1.5부터는 ImageIO가 자바의 기본 패키지내에 포함된 것 같습니다.

테스트 환경
- Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
- Oracle Weblogic Server 10gR3
- Eclipse 3.5

700x525 → 100x100 썸네일 비교

ImageIO 가 JAI 보다 용량은 작은데 화질이 좋군요...(메타데이터가 안들어가서 그런듯?)

Tulips.jpg(700 x 525) - 107KB


JAI(Java Advanced Imaging) Thumbnail : 4.16KB
JAI


ImageIO Thumbnail : 3.65KB

반응형

'Java+' 카테고리의 다른 글

Find class in jar files  (0) 2018.02.19
web.xml 서블릿 버전별 DTD  (1) 2013.03.03
Maven Repository for Oracle Library  (0) 2012.12.18
<jsp:forward page="url" /><jsp:include /> <%@ include %>  (0) 2010.04.25
TortoiseSVN 사용하기  (2) 2009.11.16
Java2Html  (0) 2009.07.19
Jad + JadClipse  (6) 2009.07.11
Java with SQLite  (1) 2009.06.29
Java Database Connectivity  (0) 2009.02.25
//

Java2Html

Posted at 2009. 7. 19. 15:52 | Posted in Java+
반응형
http://www.java2html.de/

.java 파일을 html 이나 다른 포멧들로 변환히켜주는 플러그인 입니다.





- 이클립스에 적절히 설치합니다.




- Project Explorer 탭에서 아무 java 파일에서 마우스 오른쪽 버튼 클릭 → Java2Html




- 출력 포멧과 어떻게 저장할 것인지(파일/클립보드) 선택합니다.



출력 포멧은 입맛에 맞게 고르고 OK 누르면 끝!

XHTML 1.0 Transitional (inlined fonts)
XHTML 1.1 (with stylesheet)
XHTML 1.0 transitional (with stylesheet)
TeX
RTF (Rich Text Format)

Convert to file : 파일로 저장
Convert to clipboard : 클립보드로 저장(Ctrl+C)



 XHTML 1.0 transitional (with stylesheet) / Convert to file 로 저장 해보겠습니다.



- 어따가 저장할지 선택



- 파일을 열어봅시다. +_+;



반응형

'Java+' 카테고리의 다른 글

Find class in jar files  (0) 2018.02.19
web.xml 서블릿 버전별 DTD  (1) 2013.03.03
Maven Repository for Oracle Library  (0) 2012.12.18
<jsp:forward page="url" /><jsp:include /> <%@ include %>  (0) 2010.04.25
TortoiseSVN 사용하기  (2) 2009.11.16
썸네일(Thumbnail) 만들기  (1) 2009.08.09
Jad + JadClipse  (6) 2009.07.11
Java with SQLite  (1) 2009.06.29
Java Database Connectivity  (0) 2009.02.25
//

Jad + JadClipse

Posted at 2009. 7. 11. 18:32 | Posted in Java+
반응형
http://www.kpdus.com/jad.html
http://www.varaneckas.com/jad
http://sourceforge.net/projects/jadclipse/

클래스 파일을 디컴파일 해주는 프로그램입니다.

: class 파일을 디컴파일 하는 파일

: 이클립스 플러그인

공식 간단한 설명서 -_-




콘솔에서의 사용법은 'jad.exe 파일이름.class' 하면 됩니다.

> jad.exe StringBuffer.class
Parsing StringBuffer.class... Generating StringBuffer.jad

StringBuffer.class 를 디컴파일하니 StringBuffer.jad  파일이 생성 되었습니다.

열어보면 디컴파일이 되어 있네요~






이클립스에서 사용하는 방법입니다(eclipse galileo 테스트).

- jad.exe 파일은 이클립스의 폴더에 넣습니다.




- net.sf.jadclipse_3.3.0.jar 파일은 이클립스의 plugins 폴더에 넣습니다.




- 이클립스를 실행시켜 플러그인 목록을 확인해보면 플러그인이 설치된것을 확인할 수 있습니다.





- 옵션(Windows → Preferences) 에 들어가셔서, Java → JadClipse 부분에서 설정을 합시다.

- jad.exe 파일 위치와 임시파일 디렉토리를 설정 해주시구요~(안건들여도 됨)




- 한글 깨짐 방지 처리를 해줍니다~




이제 이클립스에서 아무 class 파일을 열어보면 자동으로 디컴파일해서 읽기전용으로 보여줍니다.

String.class 파일을 열어보았습니다. 첫줄에 jad 관련 주석이 달리네요.




맨 아래에는 디컴파일 결과가 주석으로 나옵니다.



디컴파일이 잘 안되는 class 파일도 있으니 참고하세요~ 특히 어노테이션 같은거 -_-...

반응형

'Java+' 카테고리의 다른 글

Find class in jar files  (0) 2018.02.19
web.xml 서블릿 버전별 DTD  (1) 2013.03.03
Maven Repository for Oracle Library  (0) 2012.12.18
<jsp:forward page="url" /><jsp:include /> <%@ include %>  (0) 2010.04.25
TortoiseSVN 사용하기  (2) 2009.11.16
썸네일(Thumbnail) 만들기  (1) 2009.08.09
Java2Html  (0) 2009.07.19
Java with SQLite  (1) 2009.06.29
Java Database Connectivity  (0) 2009.02.25
//

Java with SQLite

Posted at 2009. 6. 29. 17:27 | Posted in Java+
반응형
예전에 PHP로 일할적에 알았던 SQLlite.. 아주 간단한 DB를 이용한 테스트에 잠깐 잠깐 썻었는데

이제는 JAVA 로 갈아타면서 기억속에 잊혀져버렸죠...

어느날 문득! +_+ 생각나서 찾아보니 이건 뭐 jdbc 만 해주면 바로 ㅇㅋㅂㄹ!



Sqlite란? http://www.sqlite.org/

PHP 5 웹 프로그래밍 가이드
카테고리 컴퓨터/IT
지은이 이승혁 (비비컴, 2006년)
상세보기

SQLite는 그 이름이 갖는 의미에서도 짐작할 수 있듯이 비교적 가벼운 경량급 데이터베이스이다.

- 텍스트 파일 기반의 데이터베이스이다.
- 파일 시스템에 의한 방법 외에는 데이터베이스에 대한 접근을 제어할 수 있는 방법이 없다.
- 다른 서버로의 이식성이 뛰어나다.
- 표준  SQL 규약인 SQL92의 거의 대부분을 지원한다.
- 기존의 전통적인 데이터베이스 시스템에 비해 처리 속도가 빠르다.
- 트래픽이 많지 않은 중소교모의 사이트에서 주로 검색을 위한 프로그램을 개발할 때 적합하다.



이제 한번 해봅시다.

http://www.zentus.com/sqlitejdbc/

사용법(주의사항) : http://www.zentus.com/sqlitejdbc/usage.html


위 사이트에서 jdbc 드라이버를 다운로드해서 Build Path하든지 lib에 넣어뻐리든지 어떻게든 import 되게 합니다. -_-;

공식 예제를 돌려봅시다. +_+/

커넥션 설정만 틀리고 나머지는 평소 쓰던대로 쓰면 되네요 ㅎㅎ

import java.sql.*;

public class Test {
   public static void main(String[] args) throws Exception {
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
      Statement stat = conn.createStatement();
      stat.executeUpdate("drop table if exists people;");
      stat.executeUpdate("create table people (name, occupation);");
      PreparedStatement prep = conn.prepareStatement(
          "insert into people values (?, ?);");

      prep.setString(1, "Gandhi");
      prep.setString(2, "politics");
      prep.addBatch();
      prep.setString(1, "Turing");
      prep.setString(2, "computers");
      prep.addBatch();
      prep.setString(1, "Wittgenstein");
      prep.setString(2, "smartypants");
      prep.addBatch();

      conn.setAutoCommit(false);
      prep.executeBatch();
      conn.setAutoCommit(true);

      ResultSet rs = stat.executeQuery("select * from people;");
      while (rs.next()) {
          System.out.println("name = " + rs.getString("name"));
          System.out.println("job = " + rs.getString("occupation"));
      }
      rs.close();
      conn.close();
   }
}


DriverManager.getConnecion(".......") 부분은 여러가지가 가능합니다.

jdbc:sqlite://dirA/dirB/dbfile
jdbc:sqlite:/DRIVE:/dirA/dirB/dbfile
jdbc:sqlite:///COMPUTERNAME/shareA/dirB/dbfile
jdbc:sqlite:/D:/eclipse34/workspace/project/WebRoot/WEB-INF/classes/sqlite/db/dbfile.db
반응형

'Java+' 카테고리의 다른 글

Find class in jar files  (0) 2018.02.19
web.xml 서블릿 버전별 DTD  (1) 2013.03.03
Maven Repository for Oracle Library  (0) 2012.12.18
<jsp:forward page="url" /><jsp:include /> <%@ include %>  (0) 2010.04.25
TortoiseSVN 사용하기  (2) 2009.11.16
썸네일(Thumbnail) 만들기  (1) 2009.08.09
Java2Html  (0) 2009.07.19
Jad + JadClipse  (6) 2009.07.11
Java Database Connectivity  (0) 2009.02.25
//

스트러츠(Struts) 기본 세팅

Posted at 2009. 6. 22. 22:10 | Posted in Framework/Struts
반응형
이클립스에서 스트러츠를 시작하기 위한 아주아주 기본적인 세팅입니다.

이걸 해야 스트러츠를 시작할 수 있죠!! >,.<

- Eclipse Ganymede 3.4.2
- Apache Tomcat 6.0.18
- Apache Struts 1.3.10
- Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
- 텍스트 인코딩 : 글로벌 시대에 맞게 UTF-8




- File → New → Dynamic Web Project




- 스트러츠 라이브러리를 다운로드받습니다.



- WEB-INF/lib 폴더에 다 때려넣습니다.




- web.xml 을 수정합니다. 주석달린 두 부분(?)을 추가합니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">

  <display-name>BaseStruts</display-name>

  <!-- Standard Action Servlet Configuration -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <!-- Standard Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>


- WEB-INF 폴더에 struts-config.xml 파일을 만듭니다. (web.xml 파일의 init-param 의 경로와 일치해야함!)

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

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
    <!--  Form Bean Definitions -->
    <form-beans>

    </form-beans>

    <!--  Global Exception Definitions -->
    <global-exceptions>

    </global-exceptions>

    <!-- Global Forward Definitions -->
    <global-forwards>

    </global-forwards>

    <!-- Action Mapping Definitions -->
    <action-mappings>

    </action-mappings>

    <!-- Message Resources Definitions -->
    <!-- Plug Ins Configuration -->

</struts-config>


스트러츠를 사용하기 위한 완전 아무것도 없는 프로젝트를 만들었습니다... 자! 이제 쓰세요 -_-;;




... 뭐 간단한거라도 만들어볼까요?;; 로그인 하는거 만들어봅시다 >,.<

위에서 만들었던 BaseStruts 를 Import 해서 기본 스트러츠를 세팅합시다!


- File → Import : Web → WAR File




- 프로젝트 이름 변경 하시구!




- 소스 줄줄이 작성! (너무 간단한 예제라 다 펼쳐놓기가 부끄럽군요! ㅠ_ㅠ)

뭐.. UML 은 당연히 틀렸겠죠 +_+;

클래스 다이어그램(Class Diagram)


시퀀스 다이어그램(Sequence Diagram) 


struts-config.xml


    <form-beans>
        <form-bean name="JFLogin" type="com.tistory.antop.forms.JFLogin" />
    </form-beans>

    <action-mappings>
        <action path="/JALogin" type="com.tistory.antop.actions.JALogin"
            name="JFLogin" scope="request" validate="true">
            <forward name="result" path="/result.jsp" />
        </action>
    </action-mappings>




실행은 의지를 가진 용자들은 알아서 하실꺼....



2010.01.26 - 한글 파라미터 처리를 위한 플러그인 클래스 추가
반응형

'Framework > Struts' 카테고리의 다른 글

*.jsp 접근 막기  (0) 2009.09.03
Struts 파일 업로드  (2) 2009.05.05
//