레이블이 iBATIS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 iBATIS인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 31일 토요일

20. 스프링 게시판(@Controller, @RequestMapping을 이용하여 Controller변경)

20. 스프링 게시판(@Controller, @RequestMapping을 이용하여 Controller변경)


구로디지털단지역 오엔제이프로그래밍 실무교육센터 

(Java , Oracle, SQL, Oracle Tuning, BackUP& Recovery, ASP.NET, C#, C#Network ,채용확정 무상교육) 
www.onjprogramming.co.kr 



Spring 게시판 구현(게시판 컨트롤러 변경, @Controller, @RequestMapping)
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
1.     시작하기
 
지금까지 우리가 사용했던 BoardMultiActionController Spring2.5이상에서 지원하는 @Controller, @RequestMapping, @RequestParam을 이용하여 변경하자.
 
2, 4번과 같이 두 개의 파일을 수정하자.
 
1. 기존 BoardMultiController.java
2. 새로 작성할 BoardMultiController.java
3. 기존 action-servlet.xml
4. 새로 작성할 action-servlet.xml
 
 
 
1. 기존 BoardMultiController.java
 
package onj.board.controller;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import onj.board.model.BoardDTO;
import onj.board.model.CommentDTO;
import onj.board.service.BoardService;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class BoardMultiController extends MultiActionController {
 private BoardService boardService;
 public void setBoardService(BoardService boardService) {
  this.boardService = boardService;
 }
 // 게시판 리스트 보기, 페이징 기능은 구현 안함
 public ModelAndView list(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  ModelAndView mv = new ModelAndView("list", "list",
    boardService.boardList());
  return mv;
 }
 // 게시글 읽기
 public ModelAndView read(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  String seq = req.getParameter("seq");
  ModelAndView mav = new ModelAndView("read", "read",
    boardService.readContent(seq));
  //
해당 글의 커맨트도 함께 내려 보내자
.
  mav.addObject("comments", boardService.commentList(seq));
  return mav;
 }
 // 커맨트쓰기
 public ModelAndView comment(HttpServletRequest req, HttpServletResponse res) {
  String seq = req.getParameter("seq");
  CommentDTO commentDTO = new CommentDTO();
  
commentDTO.setSeq(seq);
  commentDTO.setName(req.getParameter("name"));
  commentDTO.setComment(req.getParameter("comment"));
  boardService.insertComment(commentDTO);
  return new ModelAndView("redirect:/read.html?seq=" + seq);
 }
 // 새글(게시글) 입력
 public ModelAndView write(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  MultipartRequest multi = new MultipartRequest(req,
    "c:\\java\\project\\onjboard1\\upload", 5 * 1024 * 1024,
    "euc-kr", new DefaultFileRenamePolicy());
  Enumeration formNames = multi.getFileNames();
  String formName = (String) formNames.nextElement();
  String fileName = multi.getFilesystemName(formName);
  String name = multi.getParameter("name");
  String passwd = multi.getParameter("passwd");
  String title = multi.getParameter("title");
  String content = multi.getParameter("content");
  BoardDTO board = new BoardDTO(name, passwd, title, content, fileName);
  boardService.insertBoard(board);
  return new ModelAndView("redirect:/list.html");
 }
 // 게시글 수정
 public ModelAndView update(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  String seq = req.getParameter("seq");
  String name = req.getParameter("name");
  String passwd = req.getParameter("passwd");
  String title = req.getParameter("title");
  String content = req.getParameter("content");
  BoardDTO board = new BoardDTO(name, passwd, title, content, "");
  board.setSeq(Integer.parseInt(seq));
  boardService.updateBoard(board);
  return new ModelAndView("redirect:/read.html?seq="
    + req.getParameter("seq"));
 }
 // 게시글 삭제
 public ModelAndView delete(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  
String seq = req.getParameter("seq");
  String passwd = req.getParameter("passwd");
  int result = boardService.deleteBoard(seq, passwd);
  if (result != 1) {
   PrintWriter out = res.getWriter();
   out.println("<script>alert('password not correct');</script>");
   out.println("<script>history.go(-1);</script>");
   return null;
  } else {
   return new ModelAndView("redirect:/list.html");
  }
 }
 // 게시물상세보기에서 답변 클릭시 호출되어 답변달 reply.jsp로 연결
 public ModelAndView reply(HttpServletRequest req, HttpServletResponse res) throws Exception {
  String seq = req.getParameter("seq");
  // 답변달 게시물 내용을 reply.jsp 넘긴다.
  ModelAndView mav = new ModelAndView("reply",   //view
이름

                                "reply",   //readContent
가 넘기는 boardDTO의 이름, reply.jsp에서 사용
                                boardService.readContent(seq));
 
  return mav;
 }
 // 답글 저장
 public ModelAndView replyok(HttpServletRequest req, HttpServletResponse res)
   throws Exception
{
String seq = req.getParameter("seq");
  String name = req.getParameter("name");
  String passwd = req.getParameter("passwd");
  String title = req.getParameter("title");
  String content = req.getParameter("content");
  String fileName = "";
  String reply = req.getParameter("reply");
  String reply_step = req.getParameter("reply_step");
  String reply_level = req.getParameter("reply_level");
 
BoardDTO boardDTO = new BoardDTO(name, passwd, title, content, fileName);
 
  boardDTO.setSeq(Integer.parseInt(seq));
  boardDTO.setReply(Integer.parseInt(reply));
  boardDTO.setReply_level(Integer.parseInt(reply_level));
  boardDTO.setReply_step(Integer.parseInt(reply_step));
  boardService.replyBoard(boardDTO);
  return new ModelAndView("redirect:/list.html");
 }
}
 
 
2. 새로 작성할 BoardMultiController.java
 
package onj.board.controller;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import onj.board.model.BoardDTO;
import onj.board.model.CommentDTO;
import onj.board.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@Controllerpublic class BoardMultiController  { @Autowired private BoardService boardService;
 // 게시판 리스트 보기, 페이징 기능은 구현 안함
 @RequestMapping("/list") public ModelAndView list() {
  ModelAndView mv = new ModelAndView("list", "list",
    boardService.boardList());
  return mv;
 }
 // 게시글 읽기
 @RequestMapping("/read") public ModelAndView read(@RequestParam("seq") String seq) {

  ModelAndView mav = new ModelAndView("read", "read",
    boardService.readContent(seq));
  //
해당 글의 커맨트도 함께 내려 보내자.
  mav.addObject("comments", boardService.commentList(seq));
  return mav;
 }
 // 커맨트쓰기
 @RequestMapping("/comment") public ModelAndView comment(
        @RequestParam("seq") String seq,
        @RequestParam("name") String name,
        @RequestParam("comment") String comment
   ) {
  CommentDTO commentDTO = new CommentDTO();
  commentDTO.setSeq(seq);
  commentDTO.setName(name);
  commentDTO.setComment(comment);
  boardService.insertComment(commentDTO);
  return new ModelAndView("redirect:/read.html?seq=" + seq);
 }
 // 새글(게시글) 입력
 @RequestMapping("/write") public ModelAndView write(HttpServletRequest req, HttpServletResponse res)
   throws Exception {
  MultipartRequest multi = new MultipartRequest(req,
    "c:\\java\\project\\onjboard1\\upload", 5 * 1024 * 1024,
    "euc-kr", new DefaultFileRenamePolicy());
  Enumeration formNames = multi.getFileNames();
  String formName = (String) formNames.nextElement();
  String fileName = multi.getFilesystemName(formName);
  String name = multi.getParameter("name");
  String passwd = multi.getParameter("passwd");
  String title = multi.getParameter("title");
  String content = multi.getParameter("content");
  BoardDTO board = new BoardDTO(name, passwd, title, content, fileName);
  boardService.insertBoard(board);
  return new ModelAndView("redirect:/list.html");
 }
 // 게시글 수정
 @RequestMapping("/update") public ModelAndView update(
      
@RequestParam("seq") String seq,
      @RequestParam("name") String name,
      @RequestParam("passwd") String passwd,
      @RequestParam("title") String title,
      @RequestParam("content") String content
   ) {
  
  BoardDTO board = new BoardDTO(name, passwd, title, content, "");
  board.setSeq(Integer.parseInt(seq));
  boardService.updateBoard(board);
  return new ModelAndView("redirect:/read.html?seq=" + seq);
 }
 // 게시글 삭제
 @RequestMapping("/delete") public ModelAndView delete(
     
 @RequestParam("seq") String seq,
      @RequestParam("passwd") String passwd,
      HttpServletResponse res
     ) throws Exception{
  int result = boardService.deleteBoard(seq, passwd);
  if (result != 1) {
   PrintWriter out = res.getWriter();
   out.println("<script>alert('password not correct');</script>");
   out.println("<script>history.go(-1);</script>");
   return null;
  } else {
   return new ModelAndView("redirect:/list.html");
  }
 }
 // 게시물상세보기에서 답변 클릭시 호출되어 답변달 reply.jsp로 연결
 @RequestMapping("/reply") public ModelAndView reply(@RequestParam("seq") String seq) {
  // 답변달 게시물 내용을 reply.jsp 넘긴다.
  ModelAndView mav = new ModelAndView("reply",   //view
이름

                                "reply",   //readContent
가 넘기는 boardDTO의 이름, reply.jsp에서 사용
                                boardService.readContent(seq));
 
  return mav;
 }
 // 답글 저장
 @RequestMapping("/replyok") public ModelAndView replyok(
            
@RequestParam("seq") String seq,
             @RequestParam("name") String name,
             @RequestParam("passwd") String passwd,
             @RequestParam("title") String title,
             @RequestParam("content") String content,
             @RequestParam("reply") String reply,
             @RequestParam("reply_step") String reply_step,
             @RequestParam("reply_level") String reply_level
    ) {
  BoardDTO boardDTO = new BoardDTO(name, passwd, title, content, "");
  boardDTO.setSeq(Integer.parseInt(seq));
  boardDTO.setReply(Integer.parseInt(reply));
  boardDTO.setReply_level(Integer.parseInt(reply_level));
  boardDTO.setReply_step(Integer.parseInt(reply_step));
  boardService.replyBoard(boardDTO);
  return new ModelAndView("redirect:/list.html");
 }
}
 
 
 
3. 기존 action-servlet.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "
http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
   <value>oracle.jdbc.driver.OracleDriver</value>
  </property>
  <property name="url">
   <value>jdbc:oracle:thin:@127.0.0.1:1521:onj</value>
  </property>
  <property name="username">
   <value>scott</value>
  </property>
  <property name="password">
   <value>tiger</value>
  </property>
 </bean>
 <!-- 넘어오는 URL에 따라 컨트롤러에서 실행될 메소드 매핑 -->
 <!-- PropertiesMethodNameResolver
prop key로 넘어오는 url에 대해 실행할 컨트롤러의 메소드

  
정의
-->
 <bean id="userControllerMethodNameResolver"
  class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
  <property name="mappings">
   <props>
    <!-- list.html
요청이 오면 컨트롤러의 list 메소드 실행
-->
    <prop key="/list.html">list</prop>
   
    <!-- read.html
요청이 오면 컨트롤러의 read 메소드 실행
-->
    <prop key="/read.html">read</prop>
   
    <!-- comment.html
요청이 오면 컨트롤러의 comment 메소드 실행
-->
    <prop key="/comment.html">comment</prop>
   
    <!-- write.html
요청이 오면 컨트롤러의 write 메소드 실행
-->
    <prop key="/write.html">write</prop>
   
    <!-- update.html
요청이 오면 컨트롤러의 update 메소드 실행
-->
    <prop key="/update.html">update</prop>     
   
    <!-- delete.html
요청이 오면 컨트롤러의 delete 메소드 실행
-->
    <prop key="/delete.html">delete</prop>
   
    <!-- reply.html
요청이 오면 컨트롤러의 reply 메소드 실행
-->
    <prop key="/reply.html">reply</prop>
   
    <!-- replyok.html
요청이 오면 컨트롤러의 replyok 메소드 실행
-->
    <prop key="/replyok.html">replyok</prop>
   </props>
  </property>
 </bean>
 <!-- 뷰 리졸버 -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix">
   <value>/jsp/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
 </bean>
 <!-- 컨트롤러 매핑 -->
 <bean name="/list.html /read.html /comment.html /write.html
             /update.html /delete.html /reply.html /replyok.html"
      class="onj.board.controller.BoardMultiController">
  <property name="methodNameResolver">
   <ref local="userControllerMethodNameResolver" />
  </property>
  <property name="boardService">
   <ref bean="boardService" />
  </property>
 </bean>

</beans>
 
 
 
 
4. 새로 작성할 action-servlet.xml
 
   
<context:component-scan base-package="onj.board.controller"/>
 
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
   <value>oracle.jdbc.driver.OracleDriver</value>
  </property>
  <property name="url">
   <value>jdbc:oracle:thin:@192.168.0.7:1521:orcl</value>
  </property>
  <property name="username">
   <value>scott</value>
  </property>
  <property name="password">
   <value>tiger</value>
  </property>
 </bean>

 <!--
뷰 리졸버
-->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix">
   <value>/jsp/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
 </bean>

 
 

</beans>
 


오라클자바커뮤니티 추천강좌-JAVA&WEB프레임워크실무과정
(8/31온라인 지원가능!! 홈페이지에서 지원신청 바랍니다.)

강좌명 JAVA&WEB프레임워크실무과정(주말주간(토/일))
교재 자체교재 무료제공
강좌 일정 09월01일(일) ~ 10월26일(토)((주말주간(토/일)) 10:00~18:00, 14일) 총 98시간 
강의 장소 [B강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 1,200,000원
[고용주환급]대기업:40만원 전후,중소기업:48만원 전후 환급
[개인수강지원(개인환급)]정규직960,000원 ,비정규직:전액환급

대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

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



* 휴강 :법정공휴일 / 추석 연휴 9월17일 휴강
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 프로그래밍 언어의 경험이 있는 분이지만 자바를 처음하시는 분들을 위해
현장에서 필요로 하는 기술들을 최적화된 커리큘럼 및 강사를 통해 배울 수 있도록 하는 과정 입니다.

자바의 기본적인 사항부터 JDBC 프로그래밍, 모든 개발의 근간이 되는 자바네트워크 프로그래밍(이거 안하시면 2~3년지나서 UI개발자의 틀을 벗어 날 수 없습니다), 자바웹의 기본이되는 JSP, 그리고 최근 가장널리 사용되는 Ajax, jQuery를 통해 화면 깜박임없이 웹페이지를 역동적으로 구성할 수 있도록 배우고 최근 가장 많이 사용되는 JAVA기반의 프레임워크인 Spring Framework, SQL Data Mapper인 MyBatis까지 배울 수 있는 과정으로 자바 웹 개발자로 가시고자 하는 분들을 위한 최적의 과정 입니다.

본과정을 통해 기초부터 하나씩 배우신다면 내공 있는 자바 개발자가 되실것을 확신합니다!
교육목표 - 자바 기본문법의 이해
- 자바 네트워크 프로그래밍에 대한 이해
- JDBC 개발에 대한 이해
- 자바 웹개발에 대한 이해
- JSP의 작동원리 및 기본문법의 이해
- Ajax 및 jQuery에 대한 이해
- WAS(Web Application Server) 및 Web Server에 대한 이해
- 자바기반 프레임워크에 대한 이해(Spring3.X)
- SQL Mapper(MyBatis)에 대한 이해
- 실무 자바기술의 전반적인 이해 및 활용
교육대상 - 자바 초보 개발자
- 신입개발자
- 다른 언어를 사용하다가 자바쪽으로 전향을 원하는 개발자
- 자바를 배우고자 하는 학생
선수학습 - 프로그래밍에 대한 이해
 




Java Fundamental 자바 언어 소개,기본 문법
Virtual Machine 소개/메모리 영역
클래스 패스(Class Path) 개요
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type, 상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread Joining/Interrupt
Java Network URL/HTTP URL, URLConnection, HttpURLConnection, URLEncoding, URLDecoding 클래스 개요
URL을 다루는 예제 실습(Get/Post)

Client Socket과 Server Socket의 개요
MultiThread EchoServer
Socket을 이용한 예제 구현

UDP Programming(Multicasting programming)
UDP/Datagram 개요
DatagramSocket, DatagramPacket 소개
UDP를 이용한 예제 구현
Multicast 소개
Multicast Client/Server 구현
Distributed Computing(java RMI)
Distributed Computing, Object 소개
Java RMI를 이용한 “Hello World” 제작
RMI 응용예제 실습
JDBC Programming JDBC Driver 소개
JDBC 연결방법
Connection, Statement, ResultSet, PreparedStatement
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
JSP(Java Server Page) JSP 기본문법, 작동원리
JSP 내장 객체,Java Beans
JSP에서의 Session, Cookie 다루기
Custom Tag
MVC Model(Model2)의 이해 및 활용
Ajax/jQuery Ajax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC
jQuery 소개, 개요
jQuery 응용 예제
Spring Framework3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
DL. DI 예제를 통한 이해
Spring 설정 상세
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
Spring JDBC
Spring Web MVC
Sprint Web Flow
Spring Controller
Spring MVC TEST Framework
Spring3.2 New Feature
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 예제 프로그램 작성
Mini Project Spring 게시판 작성 실습
-- 게시판 구현에 대해 철저하게 이해한다면 실무에서의 개발도 충분히 가능 합니다.

2013년 8월 27일 화요일

자바 상속과 컴포지션

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr

상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 
 - 상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
 - 컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
 - 컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
 - 상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.

Composition Exam

class Soap {
  private String s;
  Soap() {
    System.out.println("Soap()");
    s = new String("Constructed");
  }
  public String toString() { return s; }
}

public class Bath {
  private String 
    // Initializing at point of definition:
    s1 = new String("Happy"), 
    s2 = "Happy", 
    s3, s4;
  Soap castille;
  int i;
  float toy;
  Bath() {
    System.out.println("Inside Bath()");
    s3 = new String("Joy");
    i = 47;
    toy = 3.14f;
    castille = new Soap();
  }
  void print() {
    // Delayed initialization:
    if(s4 == null)
      s4 = new String("Joy");
    System.out.println("s1 = " + s1);
    System.out.println("s2 = " + s2);
    System.out.println("s3 = " + s3);
    System.out.println("s4 = " + s4);
    System.out.println("i = " + i);
    System.out.println("toy = " + toy);
    System.out.println("castille = " + castille);
  }

  public static void main(String[] args) {
    Bath b = new Bath();
    b.print();
  }
}


BufferedReader/BufferedWriter – 예제

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr

import java.io.*;
public class BufferedWriterSample {
public static void main(String[] args) throws Exception {
File imsiFile = File.createTempFile("imsi",".tmp");
imsiFile.deleteOnExit();
FileWriter fw = new FileWriter(imsiFile);
BufferedWriter bw = new BufferedWriter(fw);
for(int i=0; i<args.length; i++) {
bw.write(args[i]);
bw.newLine();    }
bw.close();
System.out.println(imsiFile+" 에 썼습니다...");
FileReader fr = new FileReader(imsiFile);
BufferedReader br = new BufferedReader(fr);
System.out.println(imsiFile+"에서 읽습니다...");
for(String readLine;(readLine=br.readLine())!=null;) {
System.out.println(readLine);
}
br.close();
}
}

2013년 8월 11일 일요일

[ORACLEJAVA Community, 스프링교육, Spring Framework 3.2 강좌]Spring Framework 3.x Module(스프링 모듈)

스프링을 배우기 전에 전체 스프링에 대한 그림을 그려봅니다. 각 모듈이 이해는 되지 않더라도 저체틀을 이해 하도록 하세요~~

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

Spring Framework 3.x Module(스프링 모듈) 그림...

 
 

Core Container
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
spring framework의 가장 핵심 모듈 입니다.
Core Container Core, Beans, Context, EL(__EXPRESSION__ Language) 모듈들로 구성되어 있다.
Core 모듈과 Beans 모듈은 프레임웍의 기반이 되는 부분들로, IoC DI(Dependency Injection, 의존성주입) 기능을 제공한다. 주요컴포넌트인 BeanFactory는 팩토리 패턴을 철학적으로 구현해놓은 것으로, 프로그램에서 직접 싱글톤을 생성하지 않을 수 있게 해주며, 객체간의 의존관계를 실제 프로그램 로직에서부터 설정파일로 분리해낼 수 있게 해준다.(IoC 패턴을 사용하여 애플리케이션의 설정 및 의존성을 에플리케이션에서 분리한다)
Context 모듈은 Core 모듈과 Beans 모듈의 실체화된 부분을 제공하며, 객체에 대한 접근 방법을 JNDI 레지스트리와 유사하게 프레임웍 형식으로 제공한다. Beans 모듈의 기능을 상속받고, 이에 추가적으로 국제화(리소스 번들의 사용과 같은), JNDI, EJB, 이벤트 전이(event-propagation), 리소스 로딩, 서블릿 컨테이너와 같은 컨텍스트의 생성 기능들을 함께 제공한다
__EXPRESSION__ Language 모듈은 객체 그래프를 런타임시에 조회하고 조작할 수 있는 강력한 표현 언어 기능을 제공하며, JSP 2.1 스펙에서 사용하는 통합표현언어(unified EL)를 확장하고 있다
 
2. Data Access/Integration
JDBC, ORM, OXM, JMS, 트랜잭션 모듈들로 구성되어 있다.
JDBC 모듈은 JDBC개발을 위한 추상 레이어를 제공하여 데이터베이스의 종류에 따른 JDBC 구현코드와 에러 코드를 대신 다루어준다.(JDBC 템플릿을 제공함으로써 간결한 코드로 JDBC 프로그래밍을 할 수 있도록 돕는다)
ORM 모듈은 JPA, JDO, 하이버네이트(Hibernate), iBatis와 같이 잘 알려진 객체-관계매핑(object-relational mapping, ORM) API들에 대한 인티그레이션 레이어를 제공한다. ( 스프링이 제공하는 트랜잭션 관리와의 연동을 지원한다)
OXM 모듈은 JAXB, Castor, XMLBeans, JiBX, XStream과 같은 객체/XML 매핑(Object/XML mapping) 구현체에 대한 추상 레이어를 제공한다. 즉 객체와 XML 사이의 매핑을 처리하기 위한 추상 레이어를 제공한다.
JMS(Java Messaging Service) 모듈은 메시지의 생성과 소비 기능을 제공하며, Transaction 모듈은 프로그램적(programmatic) 또는 선언적(declarative) 트랜잭션 관리 기능을 제공한다
 
3. Web
웹레이어는 Web, Web-Servlet, Web-Struts, Web-Portlet 모듈들로 구성되어 있다.
스프링의 Web 모듈은 multipart 파일업로드, Locale처리, 서블릿 리스너를 사용한 IoC 컨테이너와 웹-애플리케이션 컨텍스트를 초기화 등의 기본적인 웹 관련 인티그레이션 기능들을 제공한다.
Web-Servlet 모듈은 웹 애플리케이션에 필요한 Spring MVC(model-view-controller) 구현체를 제공하며 JSP, Velocity에 대한 뷰연동을 지원한다.
Web-Struts 모듈은 스프링과 스트럿츠의 연동 기능을 제공하며 Web-Portlet 모듈은 포틀릿 환경에서 사용되는 MVC 구현을 제공한다.
 
4. AOP and Instrumentation
스프링의 AOP 모듈은 AOP Alliance의 규약에 호환되는 관점-지향 프로그래밍(aspect-oriented programming) 구현체를 제공하며, 메서드 인터셉터와 포인트컷을 사용해 코드를 기능별로 깔끔하게 분리될 수 있게 도와준다
Aspects 모듈은 AspectJ와의 인티그레이션을 제공하며, Instrumentation 모듈은 특정 애플리케이션 서버에서 사용되는 클래스로더(classloader) 구현체와 인스트루먼테이션(instrumentation) 기능을 제공한다.
 
5. Test
JUnit이나 TestNG를 이용한 스프링 컴포넌트의 테스트를 지원한다

[spring Framework AOP, DI, DL]Spring 2.0 AOP Simple 예제(XML 파일을 이용한 aspect 설정)

1.     필요한 파일을 클래스 패스에 추가한다.



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

        C:\java\spring-framework-2.5.3\dist\spring.jar
        common-logging.jar파일을 다운로드(http://commons.apache.org/logging/)
commons-logging-1.1.1.jar
파일을 클래스패스에 추가
        AOP를 위해 C:\java\spring-framework-2.5.3\\lib\aspectJ 아래 aspectjrt.jar aspectjrt.jar 파일을 클래스 패스에 추가
 
2.     Springaop2라는 자바프로젝트를 작성 후 Animal.java 인터페이스를 작성
 
[Animal.java]
package springaop2;
 
public interface Animal {
    public void walwal();
}
 
3.     Tomdog.java 인터페이스 구현 클래스 제공
 
        [TomDog.java]
package springaop2;
 
public class TomDog implements Animal {
    public void walwal() {
        System.out.println("I'm Tomdog...");
    }
}
 
4.     Aspect 작성
 
[AnimalAOP.java]
package springaop2;
 
public class AnimalAOP {
    public void beforeWalwal() {
        System.out.println("Hi~ Dog...");
    }
   
    public void afterWalwal() {
        System.out.println("Good Bye Dog...");
    }
}
 
5.     Application-Context.xml 작성
 
[application-context.xml]
<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xsi:schemaLocation=
           "http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
 
         <!-- this is the object that will be proxied by Spring's AOP infrastructure -->
       <bean id="tomdog" class="springaop2.TomDog" />
      
       <!--  <aop:aspectj-autoproxy /> -->
      
       <aop:config>
          <aop:aspect ref="animalAOP">
              <aop:pointcut id="greeting"  __EXPRESSION__="execution(public * springaop2.Animal.walwal(..))" />
              <aop:before pointcut-ref="greeting" method="beforeWalwal" />
              <aop:after-returning pointcut-ref="greeting" method="afterWalwal" />
          </aop:aspect>
       </aop:config>
      
      
       <!-- this is the actual advice itself -->
       <bean id="animalAOP" class="springaop2.AnimalAOP" />
 
 
</beans>
 
6.     TestClient 작성
 
[TestClient.java]
package springaop;
 
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.FileSystemXmlApplicationContext;;
 
public class TestClient {
    public static void main(String[] args) {
        BeanFactory bean = new FileSystemXmlApplicationContext("C:\\java\\Tomcat 5.5\\webapps\\SpringAOP\\springaop2\\application-context.xml");
       
        Animal tomdog = (Animal)bean.getBean("tomdog");
        tomdog.walwal();
    }
}
 
 
7.     실행결과
 
[결과]
2008. 5. 6 오전 1:47:46 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@18558d2: display name [org.springframework.context.support.FileSystemXmlApplicationContext@18558d2]; startup date [Tue May 06 01:47:46 KST 2008]; root of context hierarchy
2008. 5. 6 오전 1:47:47 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
정보: Loading XML bean definitions from file [C:\java\Tomcat 5.5\webapps\SpringAOP\springaop2\application-context.xml]

2008. 5. 6 오전 1:47:47 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory