레이블이 java OBJECT Serialize인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java OBJECT Serialize인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 11일 금요일

[야간,Spring3.x]스프링게시판,Spring DI설정을 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년 9월 9일 월요일

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)


FTP를 위한 컴포넌트는 http://www.savarese.org/downloads/NetComponents/ 에서 다운 받으시구요...

/**------------------------------------------------------------------------------------
  * 시스템명 : FTP Client
  * 작 성 자 :
  * 수 정 자 : 이종철(오엔제이프로그래밍실무교육센터,오라클자바커뮤니티)
  * 파 일 명 : OracleJavaFtpClient.java
  * 버    전 : 1.3
  * 개    요 :파일을 FTP서버의 Log 폴더에 저장한다.
   *-----------------------------------------------------------------------------------*/


package new_OracleJava.util;

import java.io.*;
import new_OracleJava.engine.OracleJavaConfig;
import com.oroinc.net.ftp.*;


public class OracleJavaFtpClient{
    static String server = "xxx.xxx.xxx.xxx";
    static int port = 21;
    public static String id = "id"
    public static String password = "pwd"
   
    FTPClient ftpClient = null;

    public OracleJavaFtpClient() {     
            ftpClient = new FTPClient();
    }

    public void sendFile() {
           
            try {                                                 
                    boolean res = false;
            String MyFile = "/use/local/logs/a.log";         
               
            File f = new File(MyFile);

            BufferedInputStream bi = new BufferedInputStream(new FileInputStream(f.getPath()));
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
           
            //FTP 서버의 폴더...
            ftpClient.changeWorkingDirectory("/ftpserver/usr/local");
           
            if (bi != null) {
              res = ftpClient.storeFile(OracleJavaConfig.libSystemChkFileName, bi);
            }         
            else {
                    System.out.println("FileStrema 생성 오류!!!");
            }
           
            bi.close();
                       
            //ftpClient.storeFile(OracleJavaConfig.libWAS2FTPPath, new FileInputStream(new File(MyFile)));
            if (res) {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 OK~~~");
                    System.out.println("FTP 전송 OK~~~");
            }
            else {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 실패~~~");
                    System.out.println("FTP 전송 실패~~~");
            }
                //ftp.logout();
                //ftp.disconnect(); 
                //ftp = null;
            }
            catch(Exception e) {
                Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", "******************************** Exception FTP Send****************************");
          Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", e.toString() + "\n");
            }
    }

    // 계정과 패스워드로 로그인
    public boolean login(String user, String password) {
        try {
            //this.connect();
            return ftpClient.login(user, password);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로부터 로그아웃
    public boolean logout() {
        try {
            return ftpClient.logout();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로 연결
    public void connect() {
        try {
           
            ftpClient.connect(server, port);           
            int reply;
            // 연결 시도후, 성공했는지 응답 코드 확인
            reply = ftpClient.getReplyCode();
       
            if(!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();               
                Log.println("OracleJavaSystemChkThread", "*************************************************");
                Log.println("OracleJavaSystemChkThread", "서버로부터 연결을 거부당했습니다\n");
                Log.println("OracleJavaSystemChkThread", "************************************************");
                System.exit(1);
            }
        }
        catch (IOException ioe) {
            if(ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch(IOException f) {
                    //
                }
            }
            Log.println("OracleJavaSystemChkThread", "*************************************************");
            Log.println("OracleJavaSystemChkThread", "서버 연결 불가!!\n");
            Log.println("OracleJavaSystemChkThread", "************************************************");           
        }

// FTP의 ls 명령, 모든 파일 리스트를 가져온다
    public FTPFile[] list() {
        FTPFile[] files = null;
        try {
            files = this.ftpClient.listFiles();
            return files;
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }

    // 파일을 전송 받는다
    public File get(String source, String target) {
        OutputStream output = null;
        try {
            File local = new File(source);
            output = new FileOutputStream(local);
        }
        catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        }
        File file = new File(source);
        try {
            if (ftpClient.retrieveFile(source, output)) {
                return file;
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }


    }

    // 서버로부터 연결을 닫는다
    public void disconnect() {
        try {
            ftpClient.disconnect();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

}




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

다른 자바 프로그램에서... 다음과 같이 호출하여 이용했습니다.

                OracleJavaFtpClient ftpClient = new OracleJavaFtpClient();               
                ftpClient.connect();
                ftpClient.login(OracleJavaFtpClient.id, OracleJavaFtpClient.password);
                ftpClient.sendFile();
                ftpClient.logout();
                ftpClient.disconnect();



오라클자바커뮤니티 실전 개발 교육 - 개인80% 환급

Spring3.X, MyBatis, Hibernate실무과정

강좌명 Spring3.X, MyBatis, Hibernate실무과정(평일야간)
오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌
교재 자체교재 or PDF 파일 제공
강좌 일정 09월12일(목) ~ 10월04일(금)((평일야간) 19:00~22:00, 12일) 총 36시간
강의 장소 [C강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 590,000원
[고용주환급]대기업:14만원 전후, 중소기업:187,047 원환급

[개인수강지원(개인환급)]정규직 472,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)


* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다.

[특징]
- 실무/실습에 근거한 이론 취득
- 단기간에 스프링 개발자로 양성
- 문답씩 수업으로 수강 효과 극대화
- 이론/실습 과제로 인한 개발력 UP
교육목표 - Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)의 이해
(실습을 통한 setter,getter,constructor injection의 이해)
- Spring AOP의 이해
(실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다)
- AspectJ Annotation에 대한 이해
(Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습)
- Spring Web MVC, JDBC의 이해
(실습을 통한 Spring MVC, JDBC의 이해)
- Spring Controller에 대한 이해
(간단한 Controller의 구현을 통한 MVC Font Contrller의 이해)
- Spring Web Flow에 대한 이해
(실습을 통한 Spring Web Flow 및 JSF에 대한 이해)
- SpEL에 대한 이해
(실습을 통한 Spring SpEL의 이해)
- Servlet3 비동기 요청에 대해 이해한다.
(실습을 통한 비동기 서블릿에 대한 이해)
- MyBatis Mapper에 대해 이해한다.
(실습을 통한 MyBatis 구성, 작동원리 이해)
- Hibernate Mapper에 대해 이해한다.
(실습을 통한 Hibernate 구성, 작동원리 이해)
- 실무 개발 환경에 적응력 UP
(Spring, MyBATIS 기반 게시판 작성)
교육대상 - JAVA, JSP 개발자
- 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자
- 단기간에 스프링을 박살 내고 싶은 개발자.
(스프링 혼자 공부하기는 어렵습니다!!)
선수학습 - JAVA, JSP
 

Spring3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.3 KEPLER, Tomcat7, Spring3.2 다운로드 및 설치)
Maven, STS 플러그인 설치
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Mathod Injection
Spring 설정
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
기타 Spring의 선언적 AOP 선언
Spring JDBC
Spring MVC
Spring Controller
Spring Webflow, JSF
Spring 표현언어 SpEL
Servlet3 비동기 요청처리
Spring3.2 Transaction 관리
Spring MVC TEST Framework
MyBatis/hibernate [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성

2013년 8월 9일 금요일

(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일 목요일

[오라클자바커뮤니티, ORACLEJAVANEW.KRstruts file upload DynaValidatorForm

Struts  ActionForm에서 구현한 형태입니다. 


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


이번엔 DynaValidatorForm에서 구현한 형태입니다.


======================================================================
============== struts-config.xml ============================================================================================================



name="applicationForm"
type="org.apache.struts.validator.DynaValidatorForm">


name="file"
type="org.apache.struts.upload.FormFile"/>


=============================================================================================== file_upload.jsp ==============================
======================================================================






======================================================================
======================= FileUploadAction ==============================
======================================================================

action class (though it's not getting this far using IE):
FormFile file= (FormFile)dForm.get("file");

2013년 8월 6일 화요일

(오라클자바커뮤니티, 자바교육, 오라클교육)Struts Exception Handler

ㅍException Handler

Action은 검사를 마친 예외들의 전부 혹은 일부를 ActionServlet으로 돌려 보내며 예외들을 처리하게 됩니다.

만약 ActionServlet이 예외를 처리 한다면 서블릿은 예외의 타입이나 상위 타입을 위한 Handler가 등록되었는지 검사 합니다.

ActionMapping 클래스의 지역 Exception Handler를 먼저 확인하고 그 다음 전역(global) 예외들을 검색 합니다.

ExceptionHandler는 exception 요소를 사용하여 다음과 같이 등록 합니다.

<exception
        type = “org.apache.struts.webapps.example.ExpiredPasswordException”
        key = “expired.password”
        path = “/changePWD.jsp” />

만약 ExpiredPasswordException이 발생 한다면 디폴트 핸들러는 특정 키와 특정 경로의 ActionForward를 사용하여 ActionError를 생성 합니다. 그러면 모듈안의 / changePWD.jsp로 포워드 됩니다.

이 순간 JSP는 메시지 리소스 번들로부터 expired.password라는 키에 해당 하는 메시지를 출력 할 것입니다. 만약 path 속성을 생략하게 되면 디폴트 핸들러는 ActionMapping의 input 속성을 이용 합니다.

ExceptionHandler 클래스는 반드시 org.apache.struts.action.ExceptionHandler의 하위 클래스이어야 합니다. 처음 실행되는 메소드는 execute() 메소드 입니다.

Action의 execute() 메소드처럼 작업이 끝나면 ActionForward를 반환하면 됩니다.

org.apache.struts.config.ExceptionConfig 빈은 struts-config.xml에서 exception 요소를 나타내며 특별한 프로퍼티 집합이 필요하면 ExceptionConfig의 서브 클래스를 만든 다음 <set-property> 요소를 사용하여 설정 파일로부터 속성을 초기화 하면 됩니다. 

[ORACLE SGA TUNING, 오라클교육,자바교육, 오라클자바]Literal SQL & Bind Variable

Literal SQL Statement와  Bind Variable 


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




 Literal SQL문을 많이 사용하면 Hard Parsing의 빈도를 높이게 되어 Library Cache내에서 Cache되는 SQL문들이 자주 age out 하게 되므로 주기를 빠르게 하고 Dictionary Cache의 사용율을 높이게 됩니다. 이러한 이유로 OLTP DB환경에서는 Shared SQL문중에서 Literal SQL 문들을 찾아내어 Bind Variable을 이용한 방법을 사용하도록 해야 합니다. 즉 OLTP 환경에서 가급적 Literal SQL Statement의 사용은 줄이라는 이야깁니다.

아래의 내용을 참고 하시구요…

Eg 1: SELECT * FROM emp WHERE ename='CLARK';

 is used by the application instead of SELECT * FROM emp WHERE ename=:bind1;

Eg 2: SELECT sysdate FROM dual;

does not use bind variables but would not be considered as a literal SQL statement for this article as it can be shared.

Eg 3: SELECT version FROM app_version WHERE version>2.0;

If this same statement was used for checking the 'version' throughout the application then the literal value '2.0' is always the same so this statement can be considered sharable.

자 그럼 이젠 Hard Parsing과 Soft Parsing에 대해 정리 해보도록 하겠습니다.

Hard Parse

하드파싱이란 새 SQL문장이 실행 되는 경우엔 Shared Pool에는 없으므로 완전히 전부 새로 파싱을 한다는 의미 입니다. 오라클은 Shared Pool에 새로운 SQL문장을 할당 하며 SQL 문장이 문법은 맞는지등을 검사 하게 됩니다. 이 경우 CPU 사용이 매우 많아 지게 되는거죠, 물론 Latch의 사용도 증가 하게 됩니다.

Soft Parse

소프트 파싱이란 스행하고자 하는 SQL 문장이 이미 Shared Pool에 있어 이미 존재하는 SQL에 관련된 정보를 그대로 이용하는 겁니다.

그럼 Soft Parse가 되기 위해서는 가능 하면 동일한 SQL 문장을 구사해야 하겠죠? (당근이죠^^)

동일한 SQL 문장이란 무엇인지 알아 보도록 하겠습니다. 우선 하드 파싱의 대상에는 어떤 것이 있는지 알아 보기로 하겠습니다.

우선 같은 테이블을 질의 하더라도 사용자 계정이 다른 경우 동일한 SQL 문장으로 간주 되지 않으므로, 또 SQL문장의 공백이 다른 경우, (select * from emp와 select    *    from    emp는 다릅니다.) 음 그리고 Bind Variable을 사용하는 경우 변수명 이나 타입이 다른 경우에도 그렇구요, 동일한 질의라도 SQL문장의 대소문자 역시 다르면 이것 역시 하드 파싱의 대상이므로 삼가 해야 합니다. 마지막으로 SQL문장의 라인이 달라두 역시..
같은 SQL 문장을 한라인에 쓰는 경우와 여러 라인에 나누어 쓰는 것은 다르게 인식 되는 것 입니다.

select substr(sql_text,1,40) "SQL", count(*),
      sum(executions) "총 실행 횟수"
from v$sqlarea
group by substr(sql_text,1,40)
having count(*) > 5
order by 2;

다음의 예문을 잘 이해하도록 하자구요~

SQL> conn / as sysdba
연결되었습니다.

공유 영역을 클리어 합니다.
SQL> alter system flush shared_pool;

시스템이 변경되었습니다.

SQL> conn scott/tiger
연결되었습니다.
SQL> select count(*) from emp;

  COUNT(*)
----------
        14

Emp 테이블의 개수를 얻기 위한걸 한번 수행 했습니다.

그런 다은 v$SQLAREA 뷰에서 확인 해 봅니다.
SQL> conn / as sysdba

SQL> select substr(sql_text,1,40) "SQL", count(*),
  2        sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%emp%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;


 SQL                    COUNT(*)      총 실행 횟수
---------- ----------------------------------
select count(*) from emp        1            1
이하 생략

SQL> conn scott/tiger
연결되었습니다.
SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

그런 다음 다시 v$SQLAREA에서 확인 하죠^^

SQL> select substr(sql_text,1,40) "SQL", count(*),
  2        sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%emp%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;

SQL
---------------------------------------------------------------------

  SQL                    COUNT(*)  총 실행 횟수
---------- -----------------------------
select count(*) from emp        1            3

자 그럼 이번에는 동일한 SQL 문장인데 공백을 더 넣어서 Hard Parsing이 일어나게 해 볼까요…

SQL> conn scott/tiger
연결되었습니다.
SQL> select count(*) from    emp;

  COUNT(*)
----------
        14

V$sqlarea를 조회해 보죠…

SQL> select substr(sql_text,1,40) "SQL", count(*),
  2        sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%emp%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;

SQL                            COUNT(*)    총 실행 횟수
---------- ---------------------------------------
select count(*) from    emp        1            1
select count(*) from emp              1            3

이해 되시죠… 공백 뿐 아니라 대소문자등도 주의 해야 합니다.

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년 8월 1일 목요일

자바의 OutputStream (JAVA OutputStream)

OutputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 쓴다. 
  public abstract void write(int b): 정수 b를 byte로 변환하여 출력한다.
  public void write(byte b[]): 배열 b의 모든 바이트를 쓴다.
  public void write(byte b[], int off, int len): b의 off 위치로부터 len만큼 쓴다. 
  public void close(): 출력 스트림을 닫는다.
  public void flush(): 버퍼에 남겨진 모든 데이터를 목적지에 보낸다.
  InputStream과 OutputStream은 추상 메소드를 포함하여 바이트들과 바이트 배열들을 읽고 쓰기 위하여 read()와 write()를 사용하는데 실제로 바이트 스트림을 읽고 쓰는 경우가 드물기 때문에 이 메소드는 거이 이용하지 않는다. 왜냐하면 자바에서 문자열은 바이트가 아니라 유니코드로서 일반적으로 숫자, 문자열, 객체형태로 입출력되기 때문이다. 


public class Iotest { //입력 문자열을 그대로 출력 
      public static void main(String []args) throws java.io.IOException {
            int i;
            while ((i=System.in.read())!=-1)
                System.out.write(i); // 정수 i를 문자로 바꾸어 출력한다.
      }
 }

java.util.HashSet 클래스 – 예제

import java.util.*; 
public class SetTest { 
 public static void main (String  args[]) { 
  String  names[] = {"홍명보", "안정환", "차두리","히딩크", "황선홍", "이운재", "설기현", "황선홍"}; 
  Set koreaTeam = new HashSet(); 
  int namesLen = names.length; 
  int index; 
  for (int i=0; i < 100; i++) { 
index =  (int)(Math.random()*namesLen); 
koreaTeam.add (names[index]); 
  } 
  Iterator it = koreaTeam.iterator(); 
  while (it.hasNext()) { 
    System.out.println (it.next()); 
  } 
 } } 

(JAVA OBJECT Serialize,Object Serializing)자바 객체직렬화

객체는 클래스를 통해 팔요한 시기에  생성되며 프로그램이 종료하지 않더라도  소멸된다. 물론 프로그램이 종료하면 사라진다. 실행시간에 유지하고 있던 객체 내부의 정보와 객체 자신의 정보를 어디엔가 기록해 놓고 나중에 필요한 시기에 다시 볼수 있는 방법을 제공하는것이 객체직렬화 이다.
 정보를 연속된 바이트 단위로 기록하는데 이를 객체 직렬화라고 한다.
 직렬화의 과정은 인스턴스 변수의 값을 저장하는 일인데 만약 인스턴스 변수가 다른 객체를 참조하고 있는 참조형의 변수일 경우 그 변수가 가리키는 객체 또한 직렬화 되어야 한다. 이렇게 직렬화는 복잡한 Tree형태로 계속 진행된다.
 (만약 참조형 변수가 가리키는 객체가 Serializable, Externalizable을 구현 하지 않았다면 직렬화가 되지 않으므로 이경우에는 readObject 메소드및 writeObject를 적절히 프로그램 내부에 기록해 줌으로서 제한적이지만 가능한 방법을 제시한다.)
 Static 필드, transient로 명시적으로 직렬화 하지 말라고 선언된 변수등은 직렬화 되지 않는다.
 직렬화를 담당하는 클래스는 java.io.ObjectInputStream, java.io.ObjectOutputStream
 적절히 writeObject, readObejct 메소드를 구현한다.

 객체를 생성한후 그 인스턴스를 a.dat 파일에 쓰는 경우
  FileOutputStream fos = new FileOutputStream(“”a.dat);
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(“MyString…”);
  oos.writeObject(new Date());
  oos.flush(); 
 복구하는 방법
  FileInputStream fis = new FileInputStream(“”a.dat);
  ObjectInputStream ois = new ObjectInputStream(fis);
  String myString = (String)ois.readObejct();
  //return형이 Object이므로 타입캐스팅이 필요
  Date d = (Date)ois.readObject();


 
// MySerializationWrite.java
import java.io.*;
public class MySerializationWrite extends MySuperClass implements Serializable {
int i;
public MySerializationWrite(int i) {
this.i = i;
j=i*2;
}
          public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("imsi.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new MySerializationWrite(2000));
oos.close();
System.out.println("객체 쓰기 완료...");
}
}
class MySuperClass implements Serializable {
int j;
}




객체직렬화(Object Serializing) –예제(복원하기)

import java.io.*;

public class MySerializationRead implements Serializable{
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("imsi.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
MySerializationWrite m = (MySerializationWrite)ois.readObject();
ois.close();

System.out.println("읽은후 MySerializationWrite(i) :" + m.i);
System.out.println("읽은후 MySerializationWrite(j) :" + m.j);
}
}