레이블이 JAVA WEB PARSING인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA WEB PARSING인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 11일 금요일

스프링3.X 게시판 (DI설정을 애노테이션으로 변경), XML설정-->Annotation으로... 지금까지 구현한 게시판의 기본 기능은 다음과

스프링3.X 게시판 (DI설정을 애노테이션으로 변경), XML설정-->Annotation으로...
 
지금까지 구현한 게시판의 기본 기능은 다음과 같다.
 
스프링게시판 현재 1차 버전까지의 기능(게시판 리스트보기 + 게시물 본문내용 미리 보기 + 게시 글 상세보기 + 커멘트(댓글)기능 + 글쓰기 + 글 수정하기 + 글 삭제하기 + 답변 글)
(http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSpring&wr_id=261&page=2)
 
그리고 마지막으로 Controller를 @Controller, @RequestMapping을 이용하여 변경 하였다.
(http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSpring&wr_id=261&page=2)
 
이번 강좌에서는 이 소스를 기본으로 스프링 주입(DI)을 애노테이션으로 변경해 보자. Spring Framework XML설정 파일이 깔끔해 진다.
 
그리고 다음 강좌에서 진행될 DAO단 Spring AOP를 적용하여 로깅하기를 위해 미라 SqlProvider를 구현하자. (jdbcTemplate에서 실행 sql문을 받아 내기 위해)
 

1. BoardDAO.java
 
package onj.board.dao;
import java.util.List;
import onj.board.model.BoardDTO;
import onj.board.model.CommentDTO;
import org.springframework.dao.DataAccessException;

public interface BoardDAO {
 //게시물 리스트 보기
 public List<BoardDTO> boardList() throws DataAccessException;

 //게시물 본문 미리보기
 public String preView(String seq) throws DataAccessException;

 //게시물 본문 읽기
 public BoardDTO readContent(String seq) throws DataAccessException;

 //읽은 글의 조회수 1증가
 public int updateReadCount(String seq) throws DataAccessException;

 //Comment저장
 public int insertComment(CommentDTO commentDTO) throws DataAccessException ;

 //Comment조회
 public List<CommentDTO> commentList(String seq) throws DataAccessException;

 //게시글 입력
 public int insertBoard(BoardDTO board) throws DataAccessException;

 //글 수정
 public int updateBoard(BoardDTO board) throws DataAccessException;

 //글 삭제
 public int deleteBoard(String sid , String password) throws DataAccessException;

 //답글 달기
 public int replyBoard(BoardDTO board) throws DataAccessException;

 //SQL리턴용
 public String getSql();


 
}
 
 

2. onj.board.dao.SpringBoardDAO.java
 
package onj.board.dao;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import onj.board.model.BoardDTO;
import onj.board.model.CommentDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlProvider;
import org.springframework.stereotype.Component;
 
//아래 SqlProvider는 jdbcTemplate이 실행될 때의 SQL문장을 받아내기 위하여 구현, getSql()
@Component("boardDAO")
public class SpringBoardDAO implements BoardDAO, SqlProvider {
 private JdbcTemplate jdbcTemplate = null;
 String sql = "";
 @Autowired
 private DataSource dataSource;
 
 public JdbcTemplate getTemplate() {
  if (jdbcTemplate == null) {
   this.jdbcTemplate = new JdbcTemplate(dataSource);
  }
  return jdbcTemplate;
 }
 
@Override
 public String getSql() {
  // TODO Auto-generated method stub
  return sql;
 }

 // /게시판 전체 리스트 보기(list.html)
 public List<BoardDTO> boardList() throws DataAccessException {
  List<BoardDTO> boardList = null;
  // String sql = "select * from board";
 
  sql = " select * from  (select seq, name , passwd, "
    + "                        title, content, filename, regdate, "
    + "                        readcount, reply, reply_step, "
    + "                        reply_level , rownum r "
    + "                   from board "
    + "                  order by reply desc , reply_step asc)";
  boardList = getTemplate().query(sql, new RowMapper() {
   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    BoardDTO board = new BoardDTO();
    board.setSeq(rs.getInt("seq"));
    board.setName(rs.getString("name"));
    board.setPasswd(rs.getString("passwd"));
    board.setTitle(rs.getString("title"));
    board.setContent(rs.getString("content"));
    board.setFileName(rs.getString("filename"));
    board.setRegDate(rs.getString("regdate"));
    board.setReadCount(rs.getInt("readcount"));
    board.setReply(rs.getInt("reply"));
    board.setReply_step(rs.getInt("reply_step"));
    board.setReply_level(rs.getInt("reply_level"));
    return board;
   }
  });
  return boardList;
 }
 // 게시물 본문내용 미리보기(/preView)
 public String preView(String seq) throws DataAccessException {
  sql = "select * from board where seq = ?";
  String preContent = (String) getTemplate().queryForObject(sql,
    new Object[] { seq }, new RowMapper() {
     public Object mapRow(ResultSet rs, int rowNum)
       throws SQLException {
      return rs.getString("content");
     }
    });
  return preContent;
 }
 // 게시판 상세보기, 게시글 읽기
 public BoardDTO readContent(String seq) throws DataAccessException {
  sql = "select * from board where seq = ?";
  BoardDTO boardDTO = (BoardDTO) getTemplate().queryForObject(sql,
    new Object[] { seq }, new RowMapper() {
     public Object mapRow(ResultSet rs, int rowNum)
       throws SQLException {
      BoardDTO board = new BoardDTO();
      board.setSeq(rs.getInt("seq"));
      board.setName(rs.getString("name"));
      board.setPasswd(rs.getString("passwd"));
      board.setTitle(rs.getString("title"));
      board.setContent(rs.getString("content"));
      board.setFileName(rs.getString("filename"));
      board.setRegDate(rs.getString("regdate"));
      board.setReadCount(rs.getInt("readcount"));
      board.setReply(rs.getInt("reply"));
      board.setReply_step(rs.getInt("reply_step"));
      board.setReply_level(rs.getInt("reply_level"));
      return board;
     }
    });
  // 글 조회수 1증가
  this.updateReadCount(new Integer(boardDTO.getSeq()).toString());
  return boardDTO;
 }
 // 읽은 글의 조회수를 1증가
 public int updateReadCount(String seq) throws DataAccessException {
  sql = "update board set readcount = nvl(readcount,0) + 1 where seq = ?";
  Object[] obj = { seq };
  return getTemplate().update(sql, obj);
 }
 // 커맨트 입력
 public int insertComment(CommentDTO commentDTO) throws DataAccessException {
  sql = "insert into comment_t(seq, name, comm) values (?, ?, ?)";
  Object[] obj = { commentDTO.getSeq(), // 게시글순번
    commentDTO.getName(), // 작성자
    commentDTO.getComment() }; // 커맨트
  return getTemplate().update(sql, obj);
 }
 // 커맨트 조회
 public List<CommentDTO> commentList(String seq) throws DataAccessException {
  sql = "select * from comment_t where seq = ?";
  List<CommentDTO> commentList = getTemplate().query(sql,
    new Object[] { seq }, new RowMapper() {
     public Object mapRow(ResultSet rs, int rowNum)
       throws SQLException {
      CommentDTO commentDTO = new CommentDTO();
      commentDTO.setName(rs.getString("name"));
      commentDTO.setComment(rs.getString("comm"));
      return commentDTO;
     }
    });
  return commentList;
 }
 // 글쓰기
 public int insertBoard(BoardDTO board) throws DataAccessException {
  sql = "insert into board values(board_seq.nextval , ? , ? , ? , ? , ? , sysdate , 0 , board_seq.currval , 0 , 0)";
  if (board.getFileName() == null) {
   Object[] obj = { board.getName(), board.getPasswd(),
     board.getTitle(), board.getContent(), "" };
   return getTemplate().update(sql, obj);
  } else {
   Object[] obj = { board.getName(), board.getPasswd(),
     board.getTitle(), board.getContent(), board.getFileName() };
   return getTemplate().update(sql, obj);
  }
 }
 // 게시글 수정
 public int updateBoard(BoardDTO board) throws DataAccessException {
  sql = "update board set  title = ? , content = ? where seq = ?";
  Object[] obj = { board.getTitle(), board.getContent(), board.getSeq() };
  return getTemplate().update(sql, obj);
 }
 // 게시글 삭제
 public int deleteBoard(String seq, String passwd)
   throws DataAccessException {
  int result = 0;
  String sql = "delete from board where seq = ? and passwd = ?";
  result = getTemplate().update(sql, new Object[] { seq, passwd });
  return result;
 }
 // 답글달기
 public int replyBoard(BoardDTO boardDTO) throws DataAccessException {
  int result = 0;
  String name = boardDTO.getName();
  String passwd = boardDTO.getPasswd();
  String title = boardDTO.getTitle();
  String content = boardDTO.getContent();
  String fileName = boardDTO.getFileName();
  int reply = boardDTO.getReply();
  int reply_step = boardDTO.getReply_step();
  int reply_level = boardDTO.getReply_level();
  // 현재 답변을 단 게시물 보다 더 높은 스텝의 게시물이 있다면 스텝을 하나씩 상승시킴
  sql = "update board set reply_step = reply_step + 1 "
    + "where reply = " + reply + " and reply_step > " + reply_step;
  getTemplate().update(sql);
  sql = "insert into board values(board_seq.nextval , ? , ? , ? , ? , ? , sysdate , 0 , ? , ? , ?)";
  // reply_step과 reply_level을 1씩 증가시킨 후 내용을 저장
  Object[] obj2 = { name, passwd, title, content, fileName, reply,
    reply_step + 1, reply_level + 1 };
  result = getTemplate().update(sql, obj2);
  return 0;
 }
}
 

3. BoardServiceImpl.java
 
package onj.board.service;
 
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import onj.board.dao.BoardDAO;
import onj.board.model.BoardDTO;
import onj.board.model.CommentDTO;
 
@Component("boardService")
public class BoardServiceImpl implements BoardService {
    @Autowired
    private BoardDAO boardDAO;

   
    //게시물 리스트 보기
    public List<BoardDTO> boardList() {
     return boardDAO.boardList();
    }
   
    //게시물 본문 내용 미리보기
    public String preView(String seq) {
     return boardDAO.preView(seq);
    }
    //게시글 읽기
 public BoardDTO readContent(String seq) {
  return boardDAO.readContent(seq);
 }
 //커맨트 입력
 public int insertComment(CommentDTO commentDTO) {
  return boardDAO.insertComment(commentDTO);
 }
 //커맨트 조회
 public List<CommentDTO> commentList(String seq) {
  return boardDAO.commentList(seq);
 }   

 //게시글 입력
 public int insertBoard(BoardDTO board) {
  return boardDAO.insertBoard(board);
 }

 //게시글 수정
 public int updateBoard(BoardDTO board) {
  return boardDAO.updateBoard(board);
 }

 //게시글 삭제
 public int deleteBoard(String seq, String passwd) {
  return boardDAO.deleteBoard(seq, passwd);
 }

 //답글 등록
 public int replyBoard(BoardDTO board){
  return boardDAO.replyBoard(board);
 }

}
 
 

4. /WEB-INF/boardConfig.xml
 <aop:aspectj-autoproxy/>
 <context:component-scan base-package="onj.board.dao"/>
 <context:component-scan base-package="onj.board.service"/> 

</beans> 

2013년 8월 9일 금요일

[ORACLEJAVA커뮤니티,강좌,oracle char]Char와 VarChar2 Type의 비교분석, 오엔제이프로그래밍

Char, Varchar type비교

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


A. CHAR Type

- 고정 길이 문자열을 저장한다. 사용자가 고정길이 보다 짧은 값을 저장하면 나머지 공
간은 Space로 체원진다.
- 1~255까지의 문자를 저장.
- 사용자가 후행 공백을 포함하여 고정길이 보다 큰 값을 입력하면 고정 길이에 맞게 값에서
공백이 잘린다.
- 값이 너무크면 Oracle Error발생
- 공백채움비교(blank-padded comparison semantics)를 사용한다.[비교문자열 둘다가
CHAR인경우]
a. 비교하는 두변수의 값이 길이가 다른 경우 짧은쪽을 공백으로 채운다는 것을 의미함

예) ‘a ‘ = ‘a’(우측의 갑은 1 Byte이므로 1 Byte를 공백으로 채워 2 Byte를 만든후 비교한다.)

- 데이타의 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘어 확정된 크기에 대한 사용
비율이 높은 고정 길이인 경우 사용된다. 예를 들면 사번, 각 바이트가 의미가 있는 코드 등에
사용된다.

- 가변 길이로 지정할 경우 사이즈 증가로 인한 많은 체인 발생이 우려되는 경우
- 초기에는 데이타가 입력 되어 있지 않지만 일정 시간이 지나면 데이타가 입력 되어 지는 경우
- 오라클에서 권장하기는 CHAR보다는 VARCHAR2을 사용하는 것이 효과적임

B. VARCHAR2
- 가변길이 문자열을 저장한다. 1 ~2000 Byte 저장가능함.
- 최대 50자를 저장할수 있는 VARCHAR2 TYpe의변수에 10자를 저장한다면 실제 저장공간에 10자만을
저장한다.
- 공백채우지 않음 비교(non-padded comparison semantics)를 사용한다.[비교값 둘다 또는 한쪽
이라도 VARCHAR2 Type인 경우]

예)’a ‘ > ‘a’(우측의 값이 길이가 짧아도 공백으로 채우지 않으니까 왼쪽의 값이 큰 것은 당근)

- 처음 테이블 생성시 해당 블럭에 데이타 증분치를 고려하여 PCTFREE(디폴트 10)라는 파라메터를
지정하게 되는데 데이타 증분이 많이 발생하게 되면 이영역이 모두 소모 되어 체인이 발생하여
원하는 로우를 검색하고자 할때 필요없는 I/O를 발생 시킨다. 하지만 대개 테이블을 생성하게 되는
개발자는 테이블의 증분 가능성및 수치에 대해 예상하여 적절한 PCTFREE 값을 사전에 적절이
지정할 수 있을 뿐만 아니라, USER_TABLES라는 딕션널리 정보를 검색하여 발생한 체인 발생정도를
파악할 수 있다. 만일 심하게 체인이 발생할 경우 EXP/IMP 유틸리티를 이용하여 체인을 제거할
수 있으며 설령 약간의 체인이 존재할 경우라도 해당 테이블을 사용하는데 많은 제약이 되지 않는다.
또한 VARCHAR2 타입을 사용할때 DEFAULT라는 사용자 제약 조건에 의해 사전에 공간을 확보할 수 있다
- VARCHAR2 타입을 사용한다 할지라고 예견 못할 체인 발생에 대해 전혀 문제점이 없다는 것을
알수 있고, VARCHAR2 타입을 사용함으로서 보다 효과적으로 저장 공간을 이용할 수 있으며 이는
긍국적으로 수행 속도의 향상을 의미하게 된다.

------------------------------
적절한 문자 Data Type 선택방법
------------------------------
1. 비교의미 에서 ANSI 호환성이 필요한 경우 , 즉 후행공백이 중요하지 않으면 CHAR유형을
사용하고 중요하다면 VARCHAR2 Type을 사용한다.
2. 저장공간의 효율적 사용을 위해서는 VARCHAR2 Type을 사용한다.(char type 은 고정길이)
3.전체 테이블을 스캔할 경우 CHAR 형태로 저장된 테이블이 VARCHAR2 형태로 저장된 데이타 보다
많은 블럭 입출력을 발생시켜 속도가 느려질 수 있다. 반면 VARCHAR2 형태의 데이타가 증가 될때는
블럭 내 PCTFREE 영역을 사용하게 되고 만일 이 영역이 모자라는 경우 블럭 체인이 발생하여
원하는 데이타를 검색하고자 할 때 하나 이상의 블럭을 검색하게 되어 오히려 수행 속도에 악영향을
미칠 수 있다.

4.VARCHAR2 타입은 가능한 충분히 최대치를 부여하는 것이 효과적이다. 왜냐하면 실지 크기만
저장되지 컬럼 선언시 지정한 사이즈가 실지로 내부 블럭에 저장되지 않는다 따라서 되도록 큰
사이즈를 지정함으로서 길이 부족으로 인한 에러는 방지 할 수 있다. 흔히 현업에서 성명 타입의
사이즈를 결정할때 8 바이트 10바이트 12 바이트등 여러가지 논란이 있어 왔으나 오라클을
사용하는 경우 VARCHAR2 타입으로 넉넉히 확정하더라도 공간이용 측면에서 전혀 불이익이 없이
가변적인 성명(외국인 성명 포함) 길이를 수용할 수 있다.

5.CHAR 타입은 한 바이트라도 값이 들어간다면 지정된 크기 만큼 내부적으로 크기가 확정됨므로
가능한한 최소 길이로 확정하는 것이 효과적이다. 충분히 해당 크기를 예상할 수 있는 컬럼, 즉 사
번, 코드 등등 확정된 컬럼에만 지정하는 것이 효과적이다. 만일 매우 가변적인(컬럼내에 입력되는
데이타의 길이 편차가 클때) 경우 필요없는 공간 낭비를 가져올 수 있다는 사실을 명심해야 한다

(java array)자바에서의 배열에 대해 알아 보기로 하겠습니다. ORACLEJAVANEW.KR

자바에서의 배열에 대해 알아 보기로 하겠습니다.  자바에서의 배열을 잘 공부해 두시면 닷넷등에서도 비슷하게 사용 되니 닷넷을 공부 할때 도움이 되실 겁니다.  열공!!


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


 

배열이란? 배열도 객체 이며 ,,, 그래서 Memory Heap에 메모리가 할당 됩니다. 동일한 자료형을 갖는 자료의 배열이며, 배열 선언은 선언할때 크기 명시 안 한다는곳 기억 하시구요..

int[] a; ( 혹은 int a[];)

배열에 Access 하기 위한 첨자는 int 형 이며 long 인 경우에는 Type Casting을 해야 합니다.

배열 생성
a = new int[3];
int[] a = {1, 2, 3};
int[] a; a = new int[] {1, 2, 3};

배열 길이
a.length

배열의 재사용
int[] a = {1, 2, 3};
a = new int[50]; //이때 이전의 배열a의 내용은 버려지며 새로운 메모리 공간이 할당 됩니다.

[예제]

class ArrayTest {
public static void main( String[] args ) {
int[] a = {1, 2, 3}; // int형 배열 선언 및 값 할당
int a2[]; // int형 배열 선언
a2 = new int[] {7, 8, 9, 10, 11}; // 이름 없는 배열 생성
System.arraycopy(a, 0, a2, 3, 2); //배열을 복사(a라는 배열의 0번째를 a2라는 배열의 3번째 인덱스 부터
//2개 복사하라는 의미 입니다. a2는 7,8,9,1,2가 되겟네요...
System.out.println( a.length ); // 3
for(int i = 0; i < a.length; ++i) >
System.out.print( a[i] + " "); // array

// 스트링 객체의 참조값의 배열 생성
String[] as = { "i", "am", "boy", };
String[] as2 = { "me", "to", };

System.out.println("\n" + as.length ); // 3
for(int i = 0; i < as.length; ++i) >
System.out.print( as[i] + " "); //i am boy

as = as2;

System.out.println("\n" + as.length ); // 2
for(int i = 0; i < as.length; ++i) >
System.out.print( as[i] + " " ); //me to
as2 = null;
}
}


[결과]
3
1 2 3
3
i am boy
2
me to



배열의 배열 ( 다차원 배열 ) 

배열은 또 다른 배열을 포함 할 수 있으며 하위 배열은 모두 다른 크기를 가질 수 있습니다. 이를 자바에서는 배열의배열의 형태로 다룰 수 있습니다. 예를들면 1행은 열이 2개, 2행은 열이 3개,,, 이런게 가능하다는 이야기죠^^;;;

[예제]

class MultiArrays {
public static void main(String[] args) {
String[][] 자동차 = {
{"그랜져","소나타","아반테"},
{"매그너스","누비라"},
{"카니발","세피아"}
};

for(int i=0; i<자동차.length; i++) { >
System.out.print(자동차[i].length + ":");
for(int j=0; j<자동차[i].length; j++) { >
System.out.print(자동차[i][j] + " ");
}
System.out.print("\n");
//System.out.println();
}
}
}


[결과]
3:그랜져 소나타 아반테
2:매그너스 누비라
2:카니발 세피아




배열의 예외 

NegativeArraySizeException : 음수크기를 갖는 배열 객체를 만들고자 할때 발생 합니다.
ArrayStoreException : 배열의 자료형과 틀린 자료값을 저장 할려고 하는 경우에 발생 합니다. 예를들면 int형 배열을 선언하고 3.3 이라는 값등을 넣을때 나는 오류 입니다.
ArrayIndexOutOfBoundsException : 배열의 첨자 범위를 벗어 났을때 발생 합니다. A라는 배열을 방2개짜리로 만들면 인덱스는 0, 1을 가질수 있는데 A[2]라는 형태로 사용하는 경우 나는 오류 입니다.
NullPointException : null 값을 갖는 배열 객체 참조 변수를 참조하려고 할때 발생 합니다.

2013년 8월 8일 목요일

[ORACLEJAVA COMMUNITY, ORACLEJAVANEW.KR]자바, 식별자,자료형,주석

이번 강좌 부터는 기본적인 자바의 문법을 공부해 보도록 하겠습니다. 쉬운것이니 천천히 읽고 실습하시기 바랍니다. 먼저 주석에 대해 보자구요~


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




주석 (comment)
Line comment : //
Block comment :

식별자
변수, 메쏘드, 클래스, 패키지 이름을 정하는데 사용합니다.
유니코드 자바 문자 또는 유니코드 숫자
A-Z a-z _ $ 혹은 다양한 국가의 문자 사용 가능 합니다.
길이에 제한이 없으며, 대소문자 구분 합니다.
시작은 반드시 유니코드 자바 문자로 시작 해야 합니다.

[원칙]
대소문자 구별
클래스 및 인터페이스의 이름은 대문자로 시작
변수 및 메소드의 이름은 소문자로 시작
두 단어 이상으로 구성 시 각 단어의 시작은 대문자

리터럴 (Literals)
리터럴이란 원시타입, 스트링 타입, 널 타입을 나타내는 소스 코드를 의미 합니다.
Integer Literal, Floating Point Literal
Boolean Literal, Character Literal, String Literal
Null Literal

흔히 수식에서 사용하는 “34”라는 값을 프로그램 내에서 그대로 표현하는 것을 말합니다.
String s = "korea" --> 문자 리터럴
int i=10; --> 숫자 리터럴

자바에서의 자료형


기본자료형
기본 자료형(원시자료형)
byte : 8비트, 2의 보수 (-128 ~ 127)
short : 16비트 (-32768 ~ 32767)
char : 16비트, 유니코드 (0 ~ 65535)
int : 32비트 (-2147483648 ~ 2147483647)
long : 64비트 (-9223372036854775808 ~ 9223372036854775807)
float : 32비트
double : 64비트
boolean : true, false
종류
void 자료형(원시자료형) --> 아무런 값도 반환하지 않는 메소드 정의에 사용
참조형--> 객체의 참조 값을 나타내는 자료형(포인터와 유사)
배열 참조형,클래스 참조형,인터페이스 참조형
변수 --> 해당 자료형의 값을 기억할 수 있는 기억 장소
참고 : 닷넷에서는 자바의 기본자료형을 Value-Type, 참조형을 Reference-Type이라고 부릅니다.
[예제 -- 기본자료형과 참조형의 차이]
//기본자료형과 참조형의 차이
public class Sample1 {
static int a=10, b=10; //a와 b는 기본자료형 이다.(스택에 저장)
public static void main(String[] args) {
System.out.println("초기상태 : a="+a+", b="+b); //여기서는 각각 10으로 나온다.
a=1; //a를 1로...
b=a; //a의 값을 b로 복사해서 넣는다. 즉 b가 1이됨
a=2; //다시 a를 2로...
System.out.println("b="+b); //b는 1
Sample1 s1, s2; //s1과 s2는 객체 참조형으로 메모리힙에 있는 개체를 참조하고(쳐다보고) 있는 것이다.
s1 = new Sample1(); //메모리 힙에 Sample1의 인스턴스를 생성하고 s1이라는 변수가 처다보고 있슴...(포인터 변수 처럼)
s2 = s1; //s1이 쳐다보는 것을 s2도 쳐다 봄(s1이 실제 가지고 있는 값은 주소이다.. 그 주소를 s2에 넣은니 이제부터
//s1과 s2는 같은 곳을 쳐다 보고 있는 것이다. 그림으로 그려보라~
s1.a = 10; //s1에 있는 a라는 변수를 10으로 값을 바꾸었으니 당연히 s1의 a도 값이 바뀌어져 있는 것이다.
System.out.println("s2.a="+s2.a);
}
}

[결과]
초기상태 : a=0, b=0
b=1
s2.a=10



[오라클자바커뮤니티]java awt Window,Frame,Font,Color

-------------------------

java.awt.Window

-------------------------


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  






경계바, 타이틀바, 메뉴바가 없는 컴포넌트, 거의 직접 사용되지 않습니다.

그다지 유용하지 않으며 확장하여 사용하거나, ToolTip, PopUp메뉴와 같은 특수한 용도로 사용 합니다.

Window및 그 하위컴포넌트는 다른 컴포넌트에 포함되지않는 최상위 Component

Window및 Dialog 컴포넌트는 부모 컴포넌트로 Frame 컴포넌트를 지정해야만 그 객체를 생성할 수 있습니다.

Window객체를 사용해서 팝업 메뉴를 구현할 수 있으며 창의 기본 배치 관리자는 BorderLayout

WindowOpened나 WindowClosed와 같은 창 이벤트를 생성할 수 있습니다.



생성자 : Window(Frame owner), Window(Window owner), Window(Window owner, GraphicConfiguration gc)

메소드

addNotify() : Window의 피어(peer)를 작성.

addWindowListener(WindowListener) : 지정된 Window 수신기(listener)를 추가하여 Window으로부터 Window 이벤트를 수신.

dispose() :Window에 사용한 자원을 해제 할 때 사용

getFocusOwner() : Window가 활성화된 경우에만 Focus가 있는 창의 하위 컴포넌트를 Return

getOwner() : Window의 Owner를 Return

getOwnedWindows() : 현재 Window를 소유하고 있는 Window 배열을 Return

isShowing() : Windwo가 화면에 나타나 있는지 여부를 점검 합니다.

pack() : Window의 하위 컴포넌트를 환경설정된 크기로 배치 합니다. (최적크기)

processEvent(AWTEvent) : window에 대한 이벤트를 처리 합니다.

processWindowEvent(WindowEvent) : Window에서 발생하는 Window 이벤트를 등록된 WindowListener 객체로 보내 처리 합니다.

removeWindowListener(WindowListener) : Window Event Listener를 제거

show() : Window를 표시하고 앞으로 가져 옵니다.

toBack() : Window를 뒤로 보냅니다.

toFront() : Window를 앞으로 가져 옵니다.





------------------------

java.awt.Frame

--------------------

메소드

Frame() : 초기에는 보이지 않는 Frame의 새로운 인스턴스를 구성

Frame(String) : 지정된 제목으로 초기에는 보이지 않는 새로운 Frame 객체를 구성

getTitle() : 프레임의 제목을 가져옴

setTitle(String) : 프레임의 제목을 Set

isResizable() : 프레임 크기를 재조정할 수 있는지를 표시

getIconImage() : 프레임의 아이콘 이미지를 가져 옵니다.

setIconImage(Image) : 프레임이 아이콘으로 될 때 이미지가 표시되도록 설정

getMenuBar() : 프레임의 메뉴 막대를 가져 옵니다.

setMenuBar(MenuBar) : 지정된 메뉴 막대로 프레임의 Menu component를 설정 합니다.


remove(MenuComponent) : 프레임에서 지정된 Menu Component를 제거





-----------------------

java.awt.Color

-----------------------

java.awt.Object --> java.awt.Color

Paint Interface 구현한 글래스, RGB형식을 사용하여 색을 캡슐화 --> (0,0,0) 검정, (255,255,255) 흰색

색의비교 equals(), Color객체의 getRGB()를 이용


생성자

Color(float, float, float) : 지정된 빨강, 초록, 파랑 값을 사용하여 색상을 만들며, 각 값의 범위는 0.0-1.0

Color(float, float, float, float) : 지정된 빨강, 초록, 파랑 값을 사용하여 색상을 만들며, 불투명도 추가(0.0~1.0)

Color(int) : 지정된 RGB 값으로 색을 만든다. 빨강 컴포넌트는 16-23 비트 인수, 초록 컴포넌트는 8-15 비트 인수, 파랑 컴포넌트는 0-7 비트 인수.

Color(int, int) : ,RGB색상, 불투명도를 정수(0~255)로 나타냄

Color(int, int, int) : 지정된 빨강, 초록, 파랑 컴포넌트로 색을 만듬. (0~255)

Color(int, int, int, int) : 지정된 빨강, 초록, 파랑 컴포넌트로 색을 만듬, 마지막 인자는 불투명도를 나타내는 값(0~255)

Color(ColorSpace, float[], float) : 지정된 ColorSpace, color components float배열,불투명도를 이용해 색을 만듬.



메소드

brighter() : 색을 더 밝게

darker() : 색을 더 어둡게

equals(Object) : 다른 객체가 이 색과 같은지를 결정. 색의 비교시 사용

getBlue() : 색의 파랑 컴포넌트를 가져옴. (0~255)

getColor(String) : 시스템 특성에서 색을 찾는다. String은 시스템 특성

getColor(String, Color) : 시스템 특성에서 색을 찻는다. 지정된 특성이 없거나 정수로 분석될 수 없으면, 두 번째 인수가 지정한 색상이 대신 리턴 됩니다.

getColor(String, int) : 시스템 특성에서 색을 찾습니다. 지정된 특성이 없거나 정수로 분석될 수 없으면, 정수값(int)이 대신 사용되고 색으로 변환

getGreen() : 색의 초록 컴포넌트를 가져온다. (0~255)

getRed() : 색의 빨강 컴포넌트를 가져온다. (0~255)

getRGB() : 기본 RGB ColorModel에 있는 색을 표시하는 RGB 값을 가져옵니다. 리턴되는 정수의 24-31 비트는 0xff를, 16-23 비트는 빨강 값을, 8-15 비트는 초록 값을, 0-7 비트는 파랑 값을 나타 냅니다.




--------------------------------

java.awt.Font - 사용방법

----------------------------

버튼을 생성한 후에 버튼의 라벨을 TimesRoman 형 폰트에 진한 글씨로 크기를 20으로 하고자 할 경우 다음과 같이 설정할 수 있습니다.

Button btn = new Button("확인"); Font font = new Font("TimesRoman", Font.BOLD, 20); btn.setFont(font);

그래픽 컨텍스트에 그려지는?글자에 폰트를 지정하는 방법은 다음과 같습니다.

public void paint(Graphics g) {

Font f = new Font("TimesRoman", Font.BOLD, 20);

g.setFont(f);

g.drawString("Hello, World!", 10, 10);

}


자바 폰트 이름 X 윈도우 폰트 이름 윈도우즈 폰트 이름

Helvetica adobe-hevetica Arial

TimesRoman adobe-times Times New Roman

Courier adobe-courier Courier New

Dialog b&h-lucida MS Sans Serif

DialogInput b&h-lucidatypewriter MS Sans Serif

ZapfDingbats itc-zapfdingbats WingDings

default misc-fixed Arial



[예제] // 폰트 패밀리, 논리폰트명 출력

import java.awt.*;
class FontSample {
static Font font1 = new Font("TimesRoman", Font.ITALIC, 45);
static Font font2 = new Font("Helvetica", Font.BOLD, 12);
static Font font3 = new Font("Verdana", Font.PLAIN, 16);
public static void main(String args[]) {
System.out.println("family name of font1 : " + font1.getFamily());
System.out.println("family name of font2 : " + font2.getFamily());
System.out.println("family name of font3 : " + font3.getFamily());
System.out.println("name of font1 : " + font1.getName());
System.out.println("name of font2 : " + font2.getName());
System.out.println("name of font3 : " + font3.getName());
System.out.println("style of font1 : " + font1.getStyle());
System.out.println("style of font2 : " + font2.getStyle());
System.out.println("style of font3 : " + font3.getStyle());
System.out.println("size of font1 : " + font1.getSize());
System.out.println("size of font2 : " + font2.getSize());
System.out.println("size of font3 : " + font3.getSize());
} }



[예제] // 논리 Font명 및 시스템속성

import java.awt.*;
import java.util.*;
public class SysInfo {
public static void main(String[] args) {
Toolkit thekit = Toolkit.getDefaultToolkit();
System.out.println("\n Screen Resolution : " + thekit.getScreenResolution() + "dots per inch");
Dimension screenDim = thekit.getScreenSize();
System.out.println("Screen Size : " + screenDim.width + " by "+screenDim.height + " pixels");
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontnames = e.getAvailableFontFamilyNames();
System.out.println("\n----- fonts available on this flatform ----");
for(int i=0; i<fontnames.length; i++) { System.out.println(fontnames[i]); }
//System Properties
System.out.println("---- System Properties...... ----");
Properties p = System.getProperties();
p.list(System.out);
}
}



[예제] // CharaterIterator/StringIterator

import java.text.*;

class CharacterIteratorSample
{ public static void main(String[] args) {
//begin index:1, end index=4-1, current:1
CharacterIterator iter= new StringCharacterIterator("abcde", 1, 4, 1);
System.out.println("CharacterIterator iter --> "+iter);
iterateBackward( iter );
}

public static void iterateBackward(CharacterIterator iter) {
for (char ch = iter.last(); ch != CharacterIterator.DONE; ch = iter.previous())
System.out.print(ch);
}
}

java.awt.Container(Abstract) , ORACLEJAVA 프로그래밍

java.awt.Container(Abstract) 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


java.lang.Object --> java.awt.Component --> java.awt.Container

자신의 영역안에 다른 Component를 포함할수 있는 Component

Container도 Component Class의 하위Class 이므로 그 자체도 Component로 취급되며 다른 Container에 부착될 수 있습니다.

일반적으로 GUI를 만들때는 Component를 Container에 배치하고, 그런 작은 Container를 더 큰 Container에 포함시켜서 GUI를 구성 합니다.

Frame과 Applet은 대표적인 최상위 Container이다. 최상위 Container란 다른 Container를 포함하여 맨 바깥쪽 Container로 사용되는 컨테이너를 지칭 합니다. 이에 비해 Panel은 다른 Container에 부착되어 일부 영역을 Control하는 경우에 사용 됩니다. Window는 많이 사용되지 않으며 하위 Class인 Frame이 많이 사용 됩니다.

Dialog와 FileDialog Container는 대화창에서 주로 사용 됩니다.

컴포넌트를 컨테이너에 추가할 때 색인이 지정되지 않을 경우, 목록 끝(즉, 스택 순서 아래)에 추가 됩니다.

Panel, ScollPane, Window의 상위 클래스


Window클래스나 Window 클래스의 파생클래스(Frame등)는 포함 할 수 없습니다.



Container – component 추가/제거/추출 메소드

add(Component) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, int) : 해당 위치에 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(Component, Object) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, Object, int) : 지정된 색인에서 지정된 제약 조건이 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(String, Component) : 컨테이너에 지정된 컴포넌트를 추가 합니다.

remove(Component) : 컨테이너에서 지정된 컴포넌트를 제거 합니다.

remove(int) : 컨테이너에서 index에 의해 지정된 컴포넌트를 제거 합니다.

remove() : 컨테이너에서 모든 컴포넌트를 제거합니다.

getcomponent(int) : 컨테이너에 있는 n번째 컴포넌트를 가져 옵니다.

getcomponentAt(int, int) : x,y 위치가 포함된 컴포넌트 위치를 찾습니다.

getcomponentAt(Point) : 지정된 지점이 포함된 컴포넌트를 가져 옵니다.

getcomponentCount() : 패널에 있는 컴포넌트의 수를 가져 옵니다.

getComponents() : 컴포넌트에 있는 모든 컴포넌트를 가져 옵니다.

isAncestorOf(Component) : 컨테이너의 컴포넌트 계층구조에 컴포넌트가 포함되어 있는지 확인 합니다.



Container – 그래픽/이벤트와 관련된 메소드

update(Graphics) : 컨테이너를 갱신 합니다.

paint(Graphics) : 컨테이너의 색상을 표시 합니다.

paintComponents(Graphics) : 컨테이너에 있는 각 컴포넌트의 색상을 표시 합니다.

print(Graphics) : 컨테이너를 인쇄합니다.

printComponents(Graphics) : 컨테이너의 각 컴포넌트를 인쇄 합니다.

addContainerListener(ContainerListener) : 컨테이너로부터 컨테이너 이벤트를 수신하기 위해 지정된 컨테이너 수신기(listener)를 추가 합니다.

processContainerEvent(ContainerEvent) : 등록된 ContainerListener 객체로 보내어 컨테이너에서 발생하는 컨테이너 이벤트를 처리 합니다.

processEvent(AWTEvent) : 컨테이너의 이벤트를 처리 합니다.

doLayout() : 컨테이너가 컴포넌트를 배치하도록 합니다.

getLayout() : 컨테이너의 배치 관리 프로그램을 가져 옵니다.

setLayout(LayoutManager) :컨테이너에 대한 배치 관리 프로그램을 설정 합니다.

validate() : 컨테이너와 모든 부속 컴포넌트를 확인합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.

invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시 합니다.



Container – 기타 메소드

addNotify() : 컨테이너가 피어(peer)를 작성하도록 통지 합니다.

getAlignmentX() : x축을 따라 정렬 합니다.

getAlignmentY() : y축을 따라 정렬 합니다.

getInsets() : 컨테이너의 경계 크기를 표시하는 컨테이너의 인세트(inset)를 결정 합니다.

getMaximumSize() : 컨테이너의 최대 크기를 리턴 합니다.

getMinimumSize() : 컨테이너의 최소 크기를 리턴 합니다.

getPreferredSize() : 컨테이너의 선호 크기를 리턴 합니다.

invalidate() : 컨테이너를 무효로 합니다.

list(PrintStream, int) : 지정된 출력 스트림에 컨테이너 목록을 인쇄 합니다.

list(PrintWriter, int) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.

removeNotify() : 컨테이너와 모든 부속 컴포넌트가 피어를 제거하도록 통지 합니다.





------------------------------

java.awt.Panel

--------------------------

다른 Component나 그하위 Component들이 표시될수 있는 장소를 제공하나 , 스스로 화면에 그릴수는 업습니다.

자기를 스스로 그릴수 있는 다른 Window나 그하위의 Frame, Dialog 와 같은 Component에 포함시켜서 사용해야 합니다.

Panel Class에서만 제공하는 주요한 메소드 특별히 없습니다. 결국 다른 Component를 포함할수 있다는 점을 제외하면 Canvas와 별차이가 없다고 할수 있습니다.

Applet Class가 Panel Class를 상속합니다.

Applet은 브라우저창에서 실행되므로 자신을 그릴수 있는 기능을 제공하지 않는 Panel을 상속한다고 볼 수 있습니다.



[예제]

/* 프레임에 Panel을 올리는 예제 */
import java.awt.*;
public class PanelTest extends Frame{
public PanelTest(String s) {
super(s);
}
public static void main(String[] args) {
PanelTest f = new PanelTest("Frame에 Pamel을 넣는예제");
Panel p = new Panel();
f.setSize(300,300);
f.setLayout(null);
p.setSize(150,150);
p.setBackground(Color.blue);
f.add(p);
f.setVisible(true);
}

java awt Container, Panel [오라클커뮤니티, 자바교육, 오라클자바커뮤니티]

-------------------------------------

java.awt.Container(Abstract)

------------------------------------- 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


java.lang.Object --> java.awt.Component --> java.awt.Container

자신의 영역안에 다른 Component를 포함할수 있는 Component

Container도 Component Class의 하위Class 이므로 그 자체도 Component로 취급되며 다른 Container에 부착될 수 있습니다.

일반적으로 GUI를 만들때는 Component를 Container에 배치하고, 그런 작은 Container를 더 큰 Container에 포함시켜서 GUI를 구성 합니다.

Frame과 Applet은 대표적인 최상위 Container이다. 최상위 Container란 다른 Container를 포함하여 맨 바깥쪽 Container로 사용되는 컨테이너를 지칭 합니다. 이에 비해 Panel은 다른 Container에 부착되어 일부 영역을 Control하는 경우에 사용 됩니다. Window는 많이 사용되지 않으며 하위 Class인 Frame이 많이 사용 됩니다.

Dialog와 FileDialog Container는 대화창에서 주로 사용 됩니다.

컴포넌트를 컨테이너에 추가할 때 색인이 지정되지 않을 경우, 목록 끝(즉, 스택 순서 아래)에 추가 됩니다.

Panel, ScollPane, Window의 상위 클래스


Window클래스나 Window 클래스의 파생클래스(Frame등)는 포함 할 수 없습니다.



Container – component 추가/제거/추출 메소드

add(Component) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, int) : 해당 위치에 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(Component, Object) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, Object, int) : 지정된 색인에서 지정된 제약 조건이 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(String, Component) : 컨테이너에 지정된 컴포넌트를 추가 합니다.

remove(Component) : 컨테이너에서 지정된 컴포넌트를 제거 합니다.

remove(int) : 컨테이너에서 index에 의해 지정된 컴포넌트를 제거 합니다.

remove() : 컨테이너에서 모든 컴포넌트를 제거합니다.

getcomponent(int) : 컨테이너에 있는 n번째 컴포넌트를 가져 옵니다.

getcomponentAt(int, int) : x,y 위치가 포함된 컴포넌트 위치를 찾습니다.

getcomponentAt(Point) : 지정된 지점이 포함된 컴포넌트를 가져 옵니다.

getcomponentCount() : 패널에 있는 컴포넌트의 수를 가져 옵니다.

getComponents() : 컴포넌트에 있는 모든 컴포넌트를 가져 옵니다.

isAncestorOf(Component) : 컨테이너의 컴포넌트 계층구조에 컴포넌트가 포함되어 있는지 확인 합니다.



Container – 그래픽/이벤트와 관련된 메소드

update(Graphics) : 컨테이너를 갱신 합니다.

paint(Graphics) : 컨테이너의 색상을 표시 합니다.

paintComponents(Graphics) : 컨테이너에 있는 각 컴포넌트의 색상을 표시 합니다.

print(Graphics) : 컨테이너를 인쇄합니다.

printComponents(Graphics) : 컨테이너의 각 컴포넌트를 인쇄 합니다.

addContainerListener(ContainerListener) : 컨테이너로부터 컨테이너 이벤트를 수신하기 위해 지정된 컨테이너 수신기(listener)를 추가 합니다.

processContainerEvent(ContainerEvent) : 등록된 ContainerListener 객체로 보내어 컨테이너에서 발생하는 컨테이너 이벤트를 처리 합니다.

processEvent(AWTEvent) : 컨테이너의 이벤트를 처리 합니다.

doLayout() : 컨테이너가 컴포넌트를 배치하도록 합니다.

getLayout() : 컨테이너의 배치 관리 프로그램을 가져 옵니다.

setLayout(LayoutManager) :컨테이너에 대한 배치 관리 프로그램을 설정 합니다.

validate() : 컨테이너와 모든 부속 컴포넌트를 확인합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.

invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시 합니다.



Container – 기타 메소드

addNotify() : 컨테이너가 피어(peer)를 작성하도록 통지 합니다.

getAlignmentX() : x축을 따라 정렬 합니다.

getAlignmentY() : y축을 따라 정렬 합니다.

getInsets() : 컨테이너의 경계 크기를 표시하는 컨테이너의 인세트(inset)를 결정 합니다.

getMaximumSize() : 컨테이너의 최대 크기를 리턴 합니다.

getMinimumSize() : 컨테이너의 최소 크기를 리턴 합니다.

getPreferredSize() : 컨테이너의 선호 크기를 리턴 합니다.

invalidate() : 컨테이너를 무효로 합니다.

list(PrintStream, int) : 지정된 출력 스트림에 컨테이너 목록을 인쇄 합니다.

list(PrintWriter, int) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.

removeNotify() : 컨테이너와 모든 부속 컴포넌트가 피어를 제거하도록 통지 합니다.





------------------------------

java.awt.Panel

--------------------------

다른 Component나 그하위 Component들이 표시될수 있는 장소를 제공하나 , 스스로 화면에 그릴수는 업습니다.

자기를 스스로 그릴수 있는 다른 Window나 그하위의 Frame, Dialog 와 같은 Component에 포함시켜서 사용해야 합니다.

Panel Class에서만 제공하는 주요한 메소드 특별히 없습니다. 결국 다른 Component를 포함할수 있다는 점을 제외하면 Canvas와 별차이가 없다고 할수 있습니다.

Applet Class가 Panel Class를 상속합니다.

Applet은 브라우저창에서 실행되므로 자신을 그릴수 있는 기능을 제공하지 않는 Panel을 상속한다고 볼 수 있습니다.



[예제]

/* 프레임에 Panel을 올리는 예제 */
import java.awt.*;
public class PanelTest extends Frame{
public PanelTest(String s) {
super(s);
}
public static void main(String[] args) {
PanelTest f = new PanelTest("Frame에 Pamel을 넣는예제");
Panel p = new Panel();
f.setSize(300,300);
f.setLayout(null);
p.setSize(150,150);
p.setBackground(Color.blue);
f.add(p);
f.setVisible(true);
}

[ORACLEJAVA커뮤니티]struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법

struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


1.        새로운 ActionServlet을 하나 만듭니다.

package yfarm;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

//struts-config.xml과 메시지 Resource 파일을 수정 했을 때 자동으로 인식할 수 있게...
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class NewActionServlet extends ActionServlet {
       
    protected void Process (HttpServletRequest request, HttpServletResponse response)
                                  throws IOException, ServletException {
        String uri = request.getRequestURI();
       
        if(uri.indexOf("reload.do") != -1) {
            init();
           
            RequestUtils.selectModule(request, getServletContext());
           
            ModuleConfig config = getModuleConfig(request);
           
            getRequestProcessor(config).init(this, config);
           
            RequestDispatcher dispatcher = request.getRequestDispatcher("/reload.jsp");
           
            dispatcher.forward(request, response);           
        }
        else {
            super.process(request, response);
        }
    }
}
                       
위의 NewActionServlet은 URL에 reload.do가 포함되어 있는 경우 초기화를 수행 하도록 합니다. 초기화는 두 단계로 진행하는데 첫째 ActionServlet의 init() 호출하여 struts-config.xml을 초기화 하며 둘째 RequestProcessor 클래스를 초기화 합니다. RequestProcessor 클래스가 초기화 되지 않으면 struts-config.xml이 수정되기 전에 사용된 Action 클래스들이 재사용 되므로 수정된 내용이 반영되지 않을 수도 있습니다.

2.        web.xml을 수정 합니다.
(사용자의 요청을 NewActionServlet이 수행하도록 수정 합니다.)

<servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>yfarm.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>

3.        ReloadStrutsConfigAction 클래스를 만듭니다. ( 이 클래스가 reload action인 reload.do에 대해 대응을 하는데 아무 일도 하지 않습니다.)

/*
 * Created on 2005. 5. 6.
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package oraclejava;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

public class ReloadAction extends Action {
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest  request,
        HttpServletResponse response) throws Exception {
        return null;     
    }
}

4.        struts-config.xml에 아래를 추가 합니다. (action-mappings에 추가)

<action
            path="/reload"
            type="oraclejava.ReloadAction"   
    />


5.        XML파일이나 메시지 리소스 등을 수정 후 URL에서 /reload.do를 불러주면 웹 서버를 재시작 하지 않더라도 수정 사항이 반영 됩니다.

2013년 8월 6일 화요일

[오라클자바닷넷교육강좌]웹애플리케이션에서의 로깅 , Web Application Logging

웹애플리케이션에서의 로깅 

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



로그를 남겨 프로그램을 디버깅 하는 일은 대단히 중요한 일입니다. 웹 애플리케이션에서의 로깅은 크게 시스템 로깅과 애플리케이션 로깅으로 나누어 볼 수 있는데 시스템 로깅은 사용자의 데이터 보다 애플리케이션의 내부적인 동작에 대한 기록 입니다. 예를 들면 컨테이너가 시작했을 때의 시스템적인 오류 정보 등을 기록하는 것들이 해당 되며 애플리케이션의 로그는 사용자가 로그인을 하는 경우 인증을 한 정보 등을 기록하는 것이 해당 됩니다.

시스템의 오류는 error로 표현되는 반면에 애플리케이션의 에러는 info로 정의가 가능합니다.

--------------------------------------
서블릿 컨테이너를 이용한 로깅
--------------------------------------

서블릿의 스펙에서 개발자들이 컨테이너의 로그 파일에 이벤트 정보를 로깅 할 수 있도록 지원 합니다. 로그파일의 이름이나 위치는 어떤 컨테이너를 사용 하느냐에 따라 다르지만 기록이 된다는 것은 사실 입니다.

java.servlet.ServletContext는 로그를 남기기 위한 두개의 메소드를 제공 합니다.

ppublic void log(Stirng msg);
public void log(String msg, Throwable throwable);

아래는 이 메소드를 Struts의 Action에서 사용 한 예입니다.

[이전의 DB를 이용한 인증 예제의 LoginAction 입니다.]

//로그를 남기자.
                StringBuffer buf = new StringBuffer("LoginAction : User --> ");
                buf.append(id + " logged in session");
                servlet.log(buf.toString());

위의 소스 코딩에 위해 Tomcat의 Console창에 다음과 같은 기록이 남습니다…

정보: action: LoginAction : User --> jcleelogged in session



------------------------
필터사용
-----------------------

필터는 서블릿2.3에 새로 추가된 기능 입니다. 서블릿의 필터를 이용하면 HTTP요청과 응답객체의 Contents를 검사 할 수 있으며 정적인 Contents뿐 아니라 동적인 Contents에 대해서도 필터기능을 이용하는 것이 가능 합니다.

필터링 기능을 이용하여 아래와 같은 일들이 가능 합니다.

- 클라이언트의 요청이 도달하기 전에 웹 리소스에 대해 접근 가능 합니다.
- 클라이언트의 요청이 리소스에 도달하기 전 요청을 처리 할 수 있습니다.
- 요청헤더나 데이터에 대한 수정이 가능
- 응답헤더나 데이터에 대한 수정 가능
- 어떤 리소스를 수행 한 후 리소스에 대한 메소드 호출을 가로챌 수 있습니다.

이 필터 기능을 로깅만을 위해 쓰기에는 아까운 면도 있지만 시스템에서 사용자의 행위를 추적하기에는 적합한 기술 입니다. 필터를 이용해 암호화, URL 및 기타정보에 대한 캐시, 인증,XML Contents를 변환하기 위한 XSLT 변환 등 다양한 일들을 할 수 있습니다.

필터를 생성 하기 위해서는 세 단계를 거쳐야 합니다.

1.        javax.servlt.Filter 인터페이스를 구현하는 자바 클래스를 만듭니다.
2.        web.xml에 filter 요소를 선언 합니다.
3.        웹애플리케이션의 리소스와 함께 filter class를 packaging 합니다.

Javax.servlet.Filter 인터페이스를 구현하는 클래스에서 반드시 구현해야 하는 세가지 메소드는 다음과 같습니다.

public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public void destroy( );

[필터 예]


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletContext;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;

public class LoggingFilter implements Filter{
        public final static String LOG_FILE_PARAM = "Login.log";
        private FilterConfig filterConfig = null;
        private ServletContext servletContext = null;

        public void init( FilterConfig config ) throws        ServletException {
                // Initialize any neccessary resources here
                this.filterConfig = config;
                this.servletContext = config.getServletContext( );

                // You can get access to initialization parameters from        web.xml
                // although this example doesn't really use it
                String logFileName = config.getInitParameter( LOG_FILE_PARAM );

                // You can log messages to the servlet log like this
                log( "Logging to file " + logFileName );

                // Maybe initialize a third-party logging framework        like log4j
        }

        public void doFilter( ServletRequest request,ServletResponse response,FilterChain filterChain )       
                              throws IOException, ServletException {
                // Log a message here using the request data
                log( "doFilter called on LoggingFilter" );

                // All request and response headers are available to the filter
                log( "Request received from " +        request.getRemoteHost( ) );

                // Call the next filter in the chain
                filterChain.doFilter( request, response );
        }

        public void destroy( ){
                // Remove any resources to the logging framework here
                log( "LoggingFilter destroyed" );
        }

        protected void log( String message ) {
                getServletContext( ).log("LoggingFilter: " + message );
        }

        protected ServletContext getServletContext( ){
                return this.servletContext;
        }
}


[web.xml]

<filter>
                <filter-name>MyLoggingFilter</filter-name>
                <filter-class>LoggingFilter</filter-class>
                <init-param>
                        <param-name>log_file_name</param-name>
                        <param-value>log.out</param-value>
                </init-param>
        </filter>

        <filter-mapping>
                <filter-name>MyLoggingFilter</filter-name>
                <servlet-name>MyExampleServlet</servlet-name>
        </filter-mapping>

        <filter-mapping>
                <filter-name>MyLoggingFilter</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>



다음은 필터 기능을 이용하여 스트럿츠에서 한글 문제를 해결 한 경우 입니다.

[SetCharacterEncodingFilter.java]

package filters;


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;



public class SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;

    protected FilterConfig filterConfig = null;


    /**
    * Should a character encoding specified by the client be ignored?
    */
    protected boolean ignore = true;


    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain)
        throws IOException, ServletException {

        // Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

        // Pass control on to the next filter
        chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }


    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }
}


[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>

<!-- Example filter to set character encoding on each request -->
<filter>
 <filter-name>Set Character Encoding</filter-name>
 <filter-class>filters.SetCharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>EUC-KR</param-value>
 </init-param>
</filter>

<!-- Define filter mappings for the defined filters -->
<filter-mapping>
 <filter-name>Set Character Encoding</filter-name>
 <servlet-name>action</servlet-name>
</filter-mapping>

    <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>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
</web-app> 

2013년 8월 2일 금요일

JAVA DataInputStream/DataOutputStream – 예제

import java.io.*;

class InputStreamTest {
  public static void main(String[] args) throws IOException {
    FileInputStream fis=new FileInputStream(args[0]);
    DataInputStream dis=new DataInputStream(fis);
    //BufferedReader dis = new BufferedReader(new InputStreamReader(fis));

    String s;
    while( (s=dis.readLine()) !=null) {  //readLine은 Deprecated 된 Method
                                //ReadLine을 사용하기 위해선 위의 주석된것을 사용
                                //하는것이 바람직하다.
System.out.println(s);
}
    fis.close();
  }
}




===================



import java.io.*;

class OutputStreamTest {
  public static void main(String[] args) throws IOException  {
FileOutputStream fos = new FileOutputStream("test.txt");
DataOutputStream dos=new DataOutputStream(fos);

dos.writeChars("하하하");
//dos.write("홍길동".getBytes()); //Default문자인코디을 따라 byte[]로 만듬
dos.writeUTF("256-1234");
os.writeInt(30);

dos.close();

  }

2013년 7월 29일 월요일

자바 스윙(JAVA Swing)의 HTMLEditorKit을 이용한 웹 페이지 파싱

Swing을 이용한 웹페이지 파싱



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



JDK의 swing 패키지에는 html을 파싱 하는 기능이 포함되어 있는데 이기능을 적절히 이용하면 웹 페이지에서 원하는 내용을 추출 할 수 있을 것입니다.

 다음의 예제를 보시면 html Tag중에서 원하는 태그의 내용을 간단히 파싱하는 것을 확인 할 수 있으니 참고 하시기 바랍니다

[OnjWebParser .java]

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.HttpURLConnection;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;
/**
 *
 * @author 이종철(오라클자바커뮤니티, 오엔제이프로그래밍 실무학원) * TODO To change the template for this generated type comment go to
 *
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class OnjWebParser {
 // 파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
 private class CallbackHandler extends HTMLEditorKit.ParserCallback {
  // 태그가 시작할 때 호출 되는 메소드
  public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos) {
   // <A href 인 경우... A태그를 찾는다...
   if (tag == HTML.Tag.A) {
    System.out
      .println(a
        .getAttribute(javax.swing.text.html.HTML.Attribute.HREF));
   }
  }
  // 텍스트가 들어올때 호출되는 메소드
  public void handleText(char[] data, int pos) {
   System.out.println(data);
  }
 }
 public void parse(String str) {
  String content = null;
  try {
   // 입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
   URL url = new URL(str);
   HttpURLConnection con = (HttpURLConnection) url.openConnection();
   InputStreamReader reader = new InputStreamReader(
     con.getInputStream(), "euc-kr");
   new ParserDelegator().parse(reader, new CallbackHandler(), true);
   con.disconnect();
  }
  catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {

  OnjWebParser parser = new OnjWebParser();
 }
}

[결과]
오엔제이프로그래밍실무학원
./
javascript:goMenu01();
ㆍHOMEㆍ

mailto:webmaster@onjprogramming.co.kr
COMTACT USㆍ

javascript:goMenu63();
SITEMAP
javascript:fn_loginok()

ID저장
javascript:fn_loginok()
javascript:fn_loginok()
../member/mem-join.html
../member/mem-idpw.html
today Hit
126
교육센터회원
5919
커뮤니티회원
9433
/onj/curri/curri-master.html?command=1625
#tabs-1
JAVA
#tabs-2
ORACLE
#tabs-3
iPhone/Android
#tabs-4
.NET
#tabs-5
표준웹/HTML5
#tabs-6
채용/취업무료교육
#tabs-7
초보자(재학생)코스
../curri/curri-master.html?command=1645
JAVA&WEB프레임워크실무과정

14일
98시간

08-09
../curri/curri-master.html?command=1673
Spring3.X, MyBatis, Hibernate실무과정

5일
35시간

08-09
../curri/curri-master.html?command=1677
JAVA,JSP 초보에서 실무까지


18일
56시간

07-31
../curri/curri-master.html?command=1626
자바초보에서안드로이드까지

18일
54시간

08-01
../curri/curri-master.html?command=1667
JAVA&WEB프레임워크실무과정

33일
99시간

08-08
../curri/curri-master.html?command=1674
Spring3.X, MyBatis, Hibernate실무과정

12일
36시간

08-08
../curri/curri-master.html?command=1676
(개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정

14일
42시간

08-09
../curri/curri-master.html?command=1627
자바초보에서안드로이드까지

8일
56시간

08-03
../curri/curri-master.html?command=1646
JAVA&WEB프레임워크실무과정

14일
98시간

08-03
../curri/curri-master.html?command=1661
Spring3.X, MyBatis, Hibernate실무과정

5일
35시간

08-10
../curri/curri-master.html?command=1662
MiPlatform, XPlatform 실무강좌

5일
35시간

08-10
../curri/curri-master.html?command=1675
(개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정

6일
42시간

08-10
../curri/curri-master.html?command=1379
SQL초보에서실전전문가까지


8일
56시간

07-31
../curri/curri-master.html?command=1642
오라클 마스터


18일
54시간

07-29
../curri/curri-master.html?command=1583
SQL초보에서실전전문가까지

18일
54시간

08-07
../curri/curri-master.html?command=1666
SQL초보에서실전전문가까지

8일
56시간

08-03
../curri/curri-master.html?command=1637
오라클 마스터

8일
56시간

08-10
../curri/curri-master.html?command=1640
Android Developer 코스

5일
40시간

08-09
../curri/curri-master.html?command=1638
Android Developer 코스


14일
42시간

07-31
../curri/curri-master.html?command=1626
자바초보에서안드로이드까지

18일
54시간

08-01
../curri/curri-master.html?command=1332
iPhone 하이브리드 앱 개발 실무과정

14일
42시간

08-09
../curri/curri-master.html?command=1627
자바초보에서안드로이드까지

8일
56시간

08-03
../curri/curri-master.html?command=1216
iPhone 하이브리드 앱 개발 실무과정

6일
42시간

08-10
../curri/curri-master.html?command=1639
Android Developer 코스

6일
42시간

08-10
../curri/curri-master.html?command=1547
C#,ASP.NET마스터

8일
56시간

08-08
../curri/curri-master.html?command=1671
C#,ASP.NET마스터

18일
56시간

08-08
../curri/curri-master.html?command=1650
C#,ASP.NET마스터

8일
56시간

08-03
../curri/curri-master.html?command=1635
웹퍼블리싱 마스터

5일
40시간

08-09
../curri/curri-master.html?command=1625
[채용확정교육]오라클자바개발자4개월과정

80일
560시간

08-16
../curri/curri-master.html?command=1632
웹퍼블리싱 마스터

14일
42시간

08-08
../curri/curri-master.html?command=1630
HTML5, CSS3,Ajax, jQuery마스터과정

14일
42시간

08-09
../curri/curri-master.html?command=1631
HTML5, CSS3,Ajax, jQuery마스터과정


6일
42시간

00-00
../curri/curri-master.html?command=1633
웹퍼블리싱 마스터

6일
42시간

08-03
../curri/curri-master.html?command=1662
MiPlatform, XPlatform 실무강좌

5일
35시간

08-10
../curri/curri-master.html?command=1625
[채용확정교육]오라클자바개발자4개월과정

80일
560시간

08-16
../curri/curri-master.html?command=1547
C#,ASP.NET마스터

8일
56시간

08-08
../curri/curri-master.html?command=1671
C#,ASP.NET마스터

18일
56시간

08-08
../curri/curri-master.html?command=1650
C#,ASP.NET마스터

8일
56시간

08-03
../curri/curri-master.html?command=1642
 오라클 마스터

07-29
../curri/curri-master.html?command=1677
 JAVA,JSP 초보에서 실무까


07-31
../curri/curri-master.html?command=1626
 자바초보에서안드로이드까


08-01
../curri/curri-master.html?command=1650
 C#,ASP.NET마스터

08-03
../curri/curri-master.html?command=1646
 JAVA&WEB프레임워크실무과


08-03
../curri/curri-master.html?command=1583
 SQL초보에서실전전문가까지

08-07
/onj/curri/m-curri-master.html
../curri/curri-master.html?command=1631
 HTML5, CSS3,Ajax, jQuery


00-00
../curri/curri-master.html?command=1379
 SQL초보에서실전전문가까지

07-31
../curri/curri-master.html?command=1638
 Android Developer 코스

07-31
../curri/curri-master.html?command=1627
 자바초보에서안드로이드까


08-03
../curri/curri-master.html?command=1633
 웹퍼블리싱 마스터

08-03
../curri/curri-master.html?command=1547
 C#,ASP.NET마스터

08-08
#tabsub-1
NOTICE
#tabsub-2
구인구직
../notice/notice-content.html?num=1221&page=
오엔제이 프로그래밍 실무학원 소개
2013-07-20
../notice/notice-content.html?num=1064&page=
(전액무료)개발잘하는 신입 무료로 뽑기 프로젝트(미취업자취업무료교육)

2013-06-15
../notice/notice-content.html?num=1233&page=
[평일주간개강확정 7월15일] 채용확정자교육 16기
2013-07-12
../notice/notice-content.html?num=1232&page=
[평일야간개강확정7월19일] iPhone 하이브리드 앱 개발 실무과정
2013-07-08
../notice/notice-content.html?num=1230&page=
[평일주간개강확정] 7/8]Spring3.X, MyBatis, Hibernate실무과정
2013-06-27
../notice/notice-content.html?num=1229&page=
[평일야간개강확정 7/11]SQL초보에서실전전문가까지
2013-07-01
../notice/notice-content.html?num=1228&page=
[평일야간개강확정 6/25] C#,ASP.NET마스터
2013-06-20
../recruit/recruit-view.html?num=330&page=
2013-07-18
../recruit/recruit-view.html?num=329&page=
2013-07-13
../recruit/recruit-view.html?num=328&page=
2013-06-23
../recruit/recruit-view.html?num=327&page=
2013-06-12
../recruit/recruit-view.html?num=326&page=
2013-06-11
../recruit/recruit-view.html?num=325&page=
[오엔제이시스템즈]정규직 구인
2013-06-01
../recruit/recruit-view.html?num=316&page=
LG U+ 업무시스템개발
2013-04-22
사업자등록번호 :144-90-00505
통신판매업신고번호
 :2013-서울구로-0458
대표이사 :이종철
주소
 :서울 구로구 구로3동 222-8 코오롱디지털타워빌란트2차 803호 오엔제이 프로그래밍실무학원
전화 :02)851-4790
SI사업관련
 :02)851-4790
팩스
 :0505-719-4790
Copyright ⓒ

#
onjprogramming.co.kr

All Rights Reserved.

http://cafe.daum.net/fordeveloper2
../curri/m-curri-calendar.html
../recruit/recruit-01.html
javascript:window.external.AddFavorite('http://www.onjprogramming.co.kr/' ,
'오엔제이 프로그래밍실무학원');

[출처]오라클자바커뮤니티
www.oraclejavacommunity.co.kr