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

2013년 9월 26일 목요일

[스프링3.2강좌,스프링프레임워크DIDL,스프링DL,DI]룩업이냐 주입이냐?DL(Dependecy Lookup), DI(Dependency Injection)

[스프링3.2강좌,스프링프레임워크DIDL,스프링DL,DI]룩업이냐 주입이냐?DL(Dependecy Lookup), DI(Dependency Injection)
 
1. DL(Dependecy Lookup) 
 
JNDI 같은 저장소에 의하여 관리되고 있는 bean을 개발자들이 직접 container에서 제공하는 API를 이용하여 lookup하는 것(컨테이너가 callback을 통해 lookup context를 제공, 공된 context를 이용해서 필요한 resouce나 object를 얻는 방식)을 말한다. 따라서 container와의 종속성이 생긴다.

오브젝트간에 Decoupling을 해주는 면에서 장점이 있기는 하다. 하지만 이렇게 만들어진 오브젝트는 컨테이너 밖에서 실행 할 수 없고 JNDI외의 방법을 사용할 경우 JNDI관련 코드를 오브젝트내에 일일히 변경해 줘야 하며 테스트하기 매우 어렵고 코드양이 매우 증가하고 매번 Casting해야 하고  NamingException같은 checked exception을 처리하기 위해서 exception처리구조가 매우 복잡해지는 단점이 있다.

EJB container, Spring container 에서 지원한다.  대부분의 환경에서 DI를 사용해서 모든 객체를 연결할 수는 없으며 초기 컴포넌트에 접근시 DL을 사용하야 하는 경우가 많다.
 
 
 
2. DI (Dependecy Injection)
 
각 class/객체 사이의 의존관계를 빈 설정 정보를 바탕으로 container가 자동적으로 연결해 주는 것을 말한다. 따라서 lookup과 관련된 코드들이 오브젝트 내에서 완전히 사라지고 컨테이너에 의존적이지 않은 코드를 작성할 수 있다. 단지 빈 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 된다.

Spring container 에서 지원한다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성이 항상 Injection 형태의 IoC를 사용하게 된다.
 
결론

어떤 IoC 방식을 사용할지는 별로 어렵지 않다.  예를 들어 일반 자바APP에서는 main에서 스프링 컨테이너를 부트스트랩하고 ApplicationContext인터페이스를 통해 의존객체를 가져와야 한다. 즉 스프링에서는 DI를 사용할 수 있으면 사용하고 그렇지 못한 경우라면 DL을 사용하면 된다.
의존성 풀 방식의 코드는 레지스트리에 대한 참조를 가지고 있어야 하고 레지스트리와 연동해서 의존성 객체를 가지고 와야 한다. 또한 CDL을 사용시 특정 인터페이스를 구현해야 하고 모든 의존성을 직접 가지고 와야 한다. 하지만 의존성 주입(Dependency Injection)을 사용하면 적절한 생성자, 메소드, 세터등을 통해 의존성을 주입 받기만 하면 된다.


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


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일 화요일

[오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]JAVA Template Method 패턴 예제

상위클래스 쪽에 템플릿이 되는 메소드가 정의되어 있고 , 그 메소드의 정의내에는 추상메소드가 사용되너 상위클래스만 보면 추상메소드가 어떤식으로 호출되는지 알수있지만 최종적으로 어떤 처리를 하는지 모른다.
 하위클래스에서 어떠한 처리를 하는지에 관계없이 큰 틀은 상위클래스가 결정한데로 처리된다. 실제로 어떤일을 하는지는 하위클래스의 구현된 내용을 봐야 한다.
 상위클래스의 템플릿 메소드에 알고리즘이 기술되어 있으므로 하위클래스에서는 알고리즘을 일일이 기술할 필요가 없다. (개개의 하위클래스에 일일이 알고리즘을 기술한다면 수정사항이 발생되면 일일이 개별 하위클래스를 수정해야 한다.)


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


// AbstractDisplay.java
public abstract class AbstractDisplay { 
    public abstract void open();       
    public abstract void print();       
    public abstract void close();       
    public final void display() {     
        open();                           
        for (int i = 0; i < 5; i++) {     
            print();                   
        }
        close();                           
    }
}

// GreetingDisplay.java
public class GreetingDisplay extends AbstractDisplay { 
    private String s;                               
    public GreetingDisplay(String s) {    this.s =s;              }
    public void open() {                         
        System.out.println("hello " + s);                 
    }
    public void print() {                           
        System.out.println("your name is " + s);                     
    }
    public void close() {                         
        System.out.println("bye~ " + s);               
    }
}
// StringDisplay.java
public class StringDisplay extends AbstractDisplay {   
    private String string;                             
    private int width;                                 
    public StringDisplay(String string) {             
        this.string = string;                         
        this.width = string.getBytes().length;         
    }
    public void open() {    printLine();    }
    public void print() {  System.out.println("|" + string + "|");    }
    public void close() {  printLine();      }
    private void printLine() {                   
        System.out.print("+");                   
        for (int i = 0; i < width; i++) {  System.out.print("-");      }
        System.out.println("+");               
    }
}
// Main.java
public class Main {
    public static void main(String[] args) {
        AbstractDisplay d1 = new GreetingDisplay("이종철");                 
        AbstractDisplay d2 = new StringDisplay("Hello, world.");   
        AbstractDisplay d3 = new StringDisplay("안녕하세요~");   
        d1.display();                                               
        d2.display();                                               
        d3.display();                                               
    }
}

2013년 8월 13일 화요일

ASP에서SSI를 이용한 XML 문서 다루기

** SSI는 XML문서를 그대로 ASP 페이지안에 포함시키는 것으로 HTML로 나타나기에 
    한글 태그는 인식하지 못한다. 이것은 XML이 아니라 HTML이기 때문이다. 

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


---------------
asptest3.xml
---------------
<?xml version="1.0" encoding="euc-kr" ?>
<includea>
<includeb>
음,,, 이것은 인클루드된 파일입니다...
여러분들, 뵙게되어 영광입니다... 우리의 시작은 비록
미약하나 우리들의 노력은 헛되지 않을겁니다.
자그마한것부터 일구어 창대한 나를 만들어 봅시다...
</includeb>
<eng>여긴 영문 태그안입니다...</eng>
<한글>여긴 한글태그 안입니다...</한글>
</includea>

---------------
asptest3.asp
---------------
<%@ language=VBScript %>
<html>
<head><title>asptest3.asp</title></head>
<body>
<h1>Include 예제<h1>
<% response.write "지금 시각은 " & now() & "<br/>" %>
<!-- #include file="asptest3.xml" -->
<body>
</html>

ASP와 XML을 이용한 초 미니사이트 구축하기

----------------
필요한 파일들
----------------


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


main.asp (메인)
book.asp
book_table.xsl
book_desc.xsl
book.css
default.gif
book.xml
asptest4.html, asptest4.asp, asptest4.xml, asptest4.css, 
      result.xml(이 파일은 미리 만들어둔다.)
asptest5.asp asptest5.xsl, asptest5-1.xsl, asptest5.xml

같은 book.xml을 이용하여 다른 XSL을 통해 
table형태와 description형태로 도서 목록을 나열하며
설문조사, 연락처변경하기 등을 ASP와 XML을 이용하여
구현한 예제 입니다...




------------
main.asp
------------
<html><head><title>ASP & XMLL 예제</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr"></head>
<body><table>
<tr valign="top"> 
  <td width="163" bgcolor="#006699"> 
    <table width="864" border="0" cellspacing="0" cellpadding="0" height="455">
      <tr valign="top"> 
        <td width="165" height="53">
<img src="http://www.oraclejava.co.kr/images/owd.gif" width="164" height="69"></td>
        <td width="699" height="53" bgcolor="#000000" align="center" valign="middle">
<font size="+4" color="#FFFF00">ASP와  XML을 이용한 예제</font></td></tr>
      <tr valign="top"> 
        <td width="165" height="558" bgcolor="#000000"> 
          <p> </p>
          <p><a href="main.asp?Type=Table"><font color="#99FF00">* 
            Table 형태</font></a></font></p>
          <p><a href="main.asp?Type=Desc"><font color="#99FF00">* 
            Description 형태</font></a></font></p>
          <p><a href="asptest4.html" target=_blank><font color="#99FF00">* 설문조사</a></font></p>
  <p><a href="asptest5.asp" target=_blank><font color="#99FF00">* 
  연락처 정보 변경예제</a></font></p>
        </td>
        <td width="699" height="558">
<iframe src=book.asp?Type=<%=request("Type")%> width="699" height="558"></iframe>
        </td>
      </tr>
    </table>  </td> </tr></table></body></html>


------------
book.asp
------------
<%@ language=VBScript %>
<%
 Dim myType
 
 myType = request("Type")
response.write "<?xml version='1.0' encoding='euc-kr' ?>" & chr(13)

 if myType = "Table" then
 response.write "<?xml-stylesheet type='text/xsl' href='book_table.xsl'?>"
 else
 response.write "<?xml-stylesheet type='text/xsl' href='book_desc.xsl'?>"
 end if
 response.write chr(13)
%>
<!-- #include file="book.xml" -->



------------
book.css
-------------
body {
background:#FFffFF;
}
h1 {
font-size:14pt;
font-weight:bold;
}

th {
font-size:10pt;
font-weight:bold;
background:#00ccff;
line-height:150%;
}
td {
font-size:9pt;
font-weight:normal;
background:#ffffcc;
line-height:150%;
}

-------------
book.xml
-------------
<books>
<book isbn="89-314-1826-5">
<name>Oracle정복</name>
<publisher>영진.com</publisher>
<price>15000</price>
<url>http://www.oraclejava.co.kr</url>
<published>2002.09.01</published>
<desc>
<keyword>XML</keyword>
이번기회에 Oracle을 완전히 정복합시다~ 여러분,, 
기회는 자주 오는것이 아닙니다.
<ref url="http://www.Oraclejava.co.kr">Oracle교육사이트</ref>에 가시면 
다양한 예제들을 보실수 있습니다.

from jclee...
</desc>
</book>
<book isbn="02-3143-1826-7">
<name>Visual Basic 정복하기</name>
<publisher>삼양사</publisher>
<price>12000</price>
<url>http://www.microsoft.co.kr</url>
<published>2002.10.01</published>
<desc>
<keyword>VB</keyword>
VB는 상당히 Powerful한 언어입니다...
꾸준히,,, 공부하세요.

from jclee...
</desc>
</book>
<book isbn="02-3143-1826-8">
<name>MobileJava</name>
<publisher>영진.com</publisher>
<price>15000</price>
<url>http://www.mobilejava.co.kr</url>
<published>2002.09.01</published>
<desc>
<keyword>Mobie Java</keyword>
Wireless는 향후 대세 입니다... 
어떤 환경이 되었든 공부해 두시면 좋을것 같습니다.
<ref url="http://www.mobilejava.co.kr">MobileJava 사이트</ref>에 가시면 
            기초부터 차근차근 접근할수 있는 예제들이 있습니다.

from jclee...
</desc>
</book>
</books>


--------------
book_desc.xsl
--------------
<?xml version="1.0" encoding="euc-kr" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.0" encoding="euc-kr"/>
<xsl:attribute-set name="imageSize">
<xsl:attribute name="width">120</xsl:attribute>
<xsl:attribute name="height">120</xsl:attribute>
</xsl:attribute-set>

<xsl:template match="/">
<html>
<head>
<title>
<xsl:text disable-output-escaping="no">상세정보</xsl:text>
</title>
<link rel="stylesheet" type="text/css" href="book2.css"/>
</head>
<body>
<xsl:apply-templates select="books"/>
</body>
</html>
</xsl:template>
<xsl:template match="books">
<xsl:for-each select="book">
<xsl:sort select="date" data-type="text" order="descending"/>
<table border="0">
<tr><td>
<a>
<xsl:attribute name="href"><xsl:value-of select="url"/>
</xsl:attribute>
<img xsl:use-attribute-sets="imageSize">
<xsl:attribute name="src">
<xsl:choose>
<xsl:when test="image"><xsl:value-of select="image"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>default.gif</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</img>
</a>
</td>
<td valign="bottom">
<dl><dt>
<xsl:number value="position()" format="1. "/>
<xsl:value-of select="name" />
    </dt>
<dd><xsl:apply-templates select="desc"/></dd>
</dl>
</td></tr></table> <hr/>
</xsl:for-each>
</xsl:template>

<xsl:template match="ref">
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="keyword">
<span style="font-weight:bold;">
<xsl:value-of select="."/>
</span>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>


------------------
book_table.xsl
------------------
<?xml version="1.0" encoding="euc-kr"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.0" encoding="euc-kr"/>
<xsl:decimal-format NaN = "미정" />
<xsl:template match="/">
<html><head>
<link rel="stylesheet" type="text/css" href="book.css"/>
</head>
<h1>도서목록</h1>
<table border="1">
<tr>
<th>No.</th>
<th>ISBN Code</th>
<th>도서명</th>
<th>출판사</th>
<th>가격</th>
<th>발행일</th>
</tr>
<xsl:apply-templates select="books"/>
</table>
</html>
</xsl:template>
<xsl:template match="books">
<xsl:for-each select="book">
<xsl:sort select="date" data-type="text" order="descending"/>
<xsl:sort select="price" data-type="number" order="ascending"/>
<tr>
<td>
<xsl:number value="position()" format="i"/>
</td>
<td>
<xsl:value-of select="@isbn"/>
</td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="url"/>
</xsl:attribute>
<xsl:value-of select="name"/>
</xsl:element>
</td>
<td>
<xsl:value-of select="publisher"/>
</td>
<td>
<xsl:value-of select="format-number(price, '0,000')"/>
<xsl:if test="price[. != '']">원</xsl:if>
</td>
<td>
<xsl:value-of select="published"/>
</td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>



-----------------------
asptest4.html
-----------------------
<html>
<head> <title>설문조사</title></head>
<body>
 <form action="asptest4.asp" method="post">
  <h3>당신의 소중한 의견을 적어주세요~</h3><hr>
  XML강의시 좋았던 부분: <br>
  <textarea align=left cols="60" rows="10" id="firstName" name="좋았던점">
  </textarea><br><br>
  XML강의시 아쉬웠던 부분: <br>
  <textarea align=left cols="60" rows="10"  id="lastName" name="아쉬웠던점">
  </textarea><br><br>
  연락처: <input type="text" id="phone" name="연락처"><br><br>
  메일: <input type="text" id="email" name="메일"><br><br>
  <input type="submit" id="btnSub" name="btnSub" value="Send"><br><br>
 </form>
</body>
</html>

-----------------
asptest4.asp
-----------------
<%
'------------------------------------------
Function ConvertFormtoXML(strXMLFilePath, strFileName)
 Dim objDom, rootElement, objChild, objField, x

 'Microsoft XMLDOM을 초기화
 Set objDom = server.CreateObject("Microsoft.XMLDOM") 
 objDom.async=false
 objDom.load Server.MapPath("result.xml")
 Set rootElement = objDom.documentElement

 Set objChild= objDom.createElement("설문내용")
 rootElement.appendChild objChild

Set objField = objDom.createElement("번호")
 objField.Text = rootElement.ChildNodes.Length
    objChild.appendChild objField


Set objField = objDom.createElement("작성일시")
 objField.Text = now
    objChild.appendChild objField

 'Request Object의 컬렉션에서 루프를 돌자
 For x = 1 To Request.Form.Count
  If instr(1,Request.Form.Key(x),"btn") = 0 Then
  'html에서 넘어오는 값의 name으로 요소를 하나 만든다.
  Set objField = objDom.createElement(Request.Form.Key(x))

'html에서 넘어오는 값을 XML Tag의 Content로 저장
  objField.Text = Request.Form(x)

  '<설문내용>이라는 루트요소에 요소를 추가
  objChild.appendChild objField
  End If
 Next 

 'XML document를 저장하자...
 objDom.save strXMLFilePath & strFileName

 '참조를 Release 
 Set objDom = Nothing
 Set rootElement = Nothing
 Set objField = Nothing
 Set objChild = Nothing

End Function
'----------------------------------

'Function Call
ConvertFormtoXML "c:\inetpub\wwwroot","result.xml"

If err.number <> 0 then
 Response.write("Errors occurred while saving your form submission.")
 response.write err.description
Else
 Response.write("Your form submission has been saved.")
End If
%>

--------------
asptest4.xsl
--------------
<?xml version="1.0" encoding="euc-kr" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" version="4.0" encoding="euc-kr" />
<xsl:template match="/">
<html><head>
<title><xsl:text>설문목록</xsl:text></title>
<link rel="stylesheet" type="text/css" href="asptest4.css" /></head>
<h1><xsl:text>설문목록</xsl:text></h1>
<table border="1">
<tr><th>번호</th><th>작성일시</th><th>좋았던점</th> <th>아쉬운점</th>
      <th>연락처</th> <th>메일주소</th></tr>
<xsl:apply-templates select="설문리스트" />
</table>
</html>
</xsl:template>


<xsl:template match="설문리스트">
<xsl:for-each select="설문내용">
<xsl:sort select="작성일시" data-type="text" order="descending" />
<tr>
<td><xsl:value-of select="번호"/></td>
<td><xsl:value-of select="작성일시"/></td> 
<td><xsl:value-of select="좋았던점"/></td>
<td><xsl:value-of select="아쉬웠던점"/></td>
<td><xsl:value-of select="연락처"/></td>
<td><xsl:value-of select="메일"/></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


------------------
asptest4.css
------------------
body{background:#FFffFF;}
h1{font-size:14pt;font-weight:bold;}
th{font-size:10pt;font-weight:bold;background:#00ccff;line-height:150%;}
td{font-size:9pt;font-weight:normal;background:#ffffcc;line-height:150%;}


-------------------
result.xml
-------------------
<?xml version="1.0" encoding="euc-kr"?>
<?xml-stylesheet type="text/xsl" href="asptest4.xsl" ?>
<설문리스트>
</설문리스트>




-----------------
asptest5.xml
-----------------
<?xml version="1.0" encoding="euc-kr"?>
<연락처>
<field id="이름" taborder="1">
<field_value>이종철</field_value>
</field>
<field id="나이" taborder="2">
<field_value>35</field_value>
</field>
<field id="주소1" taborder="3">
<field_value>경기도 수원시 장안구 조원동</field_value>
</field>
<field id="주소2" taborder="4">
<field_value>벽산A</field_value>
</field>
<field id="phone" taborder="5">
<field_value>016-766-5919</field_value>
</field>
<field id="E-Mail" taborder="6">
<field_value>mylife688@hanmail.net</field_value>
</field>
</연락처>

-------------
asptest5.xsl
-------------
<?xml version="1.0" encoding="euc-kr"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 <xsl:template match="/">
 <html>
 <body>
 <form method="post" action="asptest5.asp">
 <h1>연락처</h1>
 <table border="1" cellpadding="2">
 <xsl:for-each select="연락처/field">
  <tr>
  <td>
<xsl:value-of select="@id"/>
  </td>
  <td>
  <input type="text"> 
<xsl:attribute name="id"> 
<xsl:value-of select="@id" /> 
</xsl:attribute> 
<xsl:attribute name="name">
<xsl:value-of select="@id" />
 </xsl:attribute> 
 <xsl:attribute name="value">
  <xsl:value-of select="field_value" /> 
  </xsl:attribute>
  </input> 
  </td>
  </tr>
 </xsl:for-each>
 </table>
 <br/>
 <input type="submit" id="btnSubmit" name="btnSubmit“
                      value="변경하기" />
 </form>
 </body>
 </html>
 </xsl:template>
</xsl:stylesheet>


--------------
asptest5-1.xsl
---------------
<?xml version="1.0" encoding="euc-kr"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 <xsl:template match="/">
 <html> <body>
 <h1>변경된 연락처 정보:</h1>
 <table border="1" cellpadding="2">
 <xsl:for-each select="연락처/field">
  <tr>
  <td>
  <xsl:value-of select="@id" />
  </td>
  <td>
  <xsl:value-of select="field_value" />
  </td>
  </tr>
 </xsl:for-each>
 </table> <br/>
 <input type="button" onClick="javascript:self.close();" value="닫기"/>
 </body> </html>
 </xsl:template>
</xsl:stylesheet>


----------------
asptest5.asp
----------------
<%
Function loadXMLFile(strXMLFile, strXSLFile)
 Dim objXML, objXSL
 set objXML = Server.CreateObject("Microsoft.XMLDOM")
 objXML.async = false
 objXML.load(strXMLFile)

 set objXSL = Server.CreateObject("Microsoft.XMLDOM")
 objXSL.async = false
 objXSL.load(strXSLFile)

'XML문서와 XSL문서를 대응시킴
 Response.Write(objXML.transformNode(objXSL))
End Function

Function updateXML(strXMLFile)
 Dim objDom, objRoot, objField, x
 set objDOM = Server.CreateObject("Microsoft.XMLDOM")
 objDOM.async = false
 objDOM.load strXMLFile
 Set objRoot = objDom.documentElement
For x = 1 to Request.Form.Count
  If instr(1,Request.Form.Key(x),"btn") = 0 Then   
  Set objField = objRoot.selectSingleNode("field[@id='" & _
Request.Form.Key(x) & "']/field_value")
  objField.Text = Request.Form(x)
  End If
 Next

 objDom.save strXMLFile
 Set objDom = Nothing
 Set objRoot = Nothing
 Set objField = Nothing

 loadXMLFile strXMLFile,server.MapPath("asptest5-1.xsl")
End Function

If Request("btnSubmit") = "" Then
  loadXMLFile server.MapPath("asptest5.xml"), server.MapPath("asptest5.xsl")
Else
  updateXML server.MapPath("asptest5.xml")
End If
%>