달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'JSP & Servlet 교육'에 해당되는 글 5

  1. 2007.10.26 JSP & Servlet 교육 Day 5th.
  2. 2007.10.25 JSP & Servlet 교육 Day 4th.
  3. 2007.10.24 JSP & Servlet 교육 Day 3rd.
  4. 2007.10.23 JSP & Servlet 교육 Day 2nd.
  5. 2007.10.22 JSP & Servlet 교육 Day 1st.
2007. 10. 26. 11:30

JSP & Servlet 교육 Day 5th. 그거/Seminar2007. 10. 26. 11:30

장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies


# Day 5

Session Bean 과 Entity Bean(BMP)을 이용해서 게시판 작성

DTO (Data Transfer Object)
  - BoardData.java
    Board Table의 각 column에 대응하는 변수에 대한 getter/setter 정의

Entity Bean(BMP)
  - Board.java
    실제 client(jsp)가 호출할 method들 정의
  - BoardBean.java
    Board Table의 한 row에 대한 CRUD 로직 정의
  - BoardHome.java
    Board 객체 생성을 위한 method 정의

Session Bean
  - BoardManager.java
    client(jsp)가 호출하여 사용할 BoardData 객체를 사용하는 method 정의
  - BoardManagerBean.java
    BoardData 객체를 사용하여 Board Table에 CURD 하는 로직 정의
  - BoardManagerHome.java
    BoardManager 객체 생성을 위한 method 정의

Client(JSP)
  - delete.jsp
    BoardManager.isWriter(int, String), BoardManager.deleteBoardData(int) 사용
  - deleteform.jsp
    삭제위한 비밀번호 입력
  - list.jsp
    BoardManager.getBoardDataList(int) 사용하여 BoardData 객체의 Collection 얻어와서 화면에 Display
  - read.jsp
    BoardManager.updateReadCount(int), BoardManager.getBoardData(int) 사용
  - update.jsp
    BoardManager.isWriter(int, String), BoardManager.updateBoardData(int) 사용
  - updateform.jsp
    BoardManager.getBoardData(int) 사용하여 화면에 정보 보여주고, 수정 정보 입력
  - write.jsp
    BoardManager.addBoardData(BoardData) 사용
  - writeform.html
    글 입력

  * DTO에 값을 설정하고, 해당 DTO를 Session Bean을 이용해서 넘기면
    Session Bean 에서는 DTO의 각 값들을 이용해서 Entity Bean 을 호출한다.

'그거 > Seminar' 카테고리의 다른 글

제 10회 한국 자바 개발자 컨퍼런스  (2) 2009.02.18
제9회 한국 Java 개발자 컨퍼런스  (0) 2008.01.22
JSP & Servlet 교육 Day 4th.  (0) 2007.10.25
JSP & Servlet 교육 Day 3rd.  (0) 2007.10.24
JSP & Servlet 교육 Day 2nd.  (0) 2007.10.23
:
Posted by 뽀기
2007. 10. 25. 09:55

JSP & Servlet 교육 Day 4th. 그거/Seminar2007. 10. 25. 09:55


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 4

# Web Application 에서 EJB 사용하기

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="javax.rmi.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.transaction.*" %>
<%@ page import="kr.co.ejb.examples.*" %>

<%
 Context ctx = null;

 try {
  ctx = new InitialContext();
  Object h = ctx.lookup("HelloWorldBean");
  HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h, HelloWorldHome.class);
  HelloWorld helloWorld = home.create();

  out.println(helloWorld.helloWorld());
 } catch(Exception e) {
  out.println(e);
 }
%>


1. 위 내용의 jsp 파일을 생성하여 web application 디렉토리 위치(C:\bea\user_projects\domains\mydomain\applications\webtest)에 복사한다.
2. jsp 페이지에서 helloworld.jar 내용을 import하여 사용하기 위해서
   helloworld.jar 파일을 C:\bea\user_projects\domains\mydomain\applications\webtest\WEB-INF\lib 에 복사한다.
   (classpath 잡아주기 귀찮으니까 WebLogic 서버가 시작하면서 알아서 jar 파일 물고 올라오도록 설정한 것이다.)


## 엔티티 빈
  Home Interface
    javax.ejb.EJBHome 또는 javax.ejb.EJBLocalHome 를 상속받는다.
    빈 클래스를 생성, 검색, 삭제할 수 있는 메소드를 선언한다.

    public interface XXX extends EJBHome {
      // insert 담당
      public XXX create(xx) throws CreateException, RemoteException;  
      // PK를 이용하여 table에서 한 row 가져옴
      public XXX findByPrimaryKey(xx) throws FinderException, RemoteException;
    }


  Remote Interface
    javax.ejb.EJBObject 또는 javax.ejb.EJBLocalObject를 상속받는다.
    클라이언트가 호출할 비즈니스 메소드를 정의하고 있다.

    public interface XXX extends EJBObject {
      // Table의 특정 column에 대해 접근할 수 있도록 하는 getter/setter
      public XXX getXX() throws RemoteException;
      public void setXX(xx) throws RemoteException;
    }


  Bean class
    javax.ejb.SessionBean 인터페이스를 구현한다.
    원격 인터페이스에서 선언한 비즈니스 메소드를 구현해야 한다.
    (EJB 클래스는 원격 인터페이스를 구현하지 않는다.)

    public abstract class XXX implements EntityBean {
      private EntityContext context;
      // Home Interface에 있는 getter/setter method 추상화 선언
      public abstract XXX getXX() throws RemoteException;
      public abstract void setXX(xx) throws RemoteException;

      // Table에 한 row를 insert 하는 역할을 담당
      public String ejbCreate(xx) throws CreateException {
        setXX(xx);
      }

      // CMP 에서는 method의 몸체 없이 정의, BMP 에서는 각 method 몸체 구현
      // ejbCreate, ejbPostCreate -> insert 구현
      // ejbRemove -> delete 구현
      // ejbStore -> update 구현
      // ejbLoad -> where 조건을 이용한 특정 한 row select 구현
      // ejbFindByPrimaryKey -> PK를 이용한 특정 한 row select 구현
      public void ejbPostCreate(XX) throws CreateException {}
      public void ejbStore() {}
      public void ejbLoad() {}
      public void ejbRemove() {}

      public void ejbActivate() {}
      public void ejbPassivate() {}
      public void setEntityContext(EntityContext ctx) { context = ctx; }
      public void unsetEntityContext() { context = null; }
    }


  CMP 개발 (Container Managed Persistence)
    Source에 SQL 이 보이지 않는다.
    create(), findByPrimaryKey() method 등 Spec에 정의된 사항을 이용하여 DB 작업을 한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
           이유....는 나도 모른다 -_-;
           물어보니... 소스에 해당 resource에 대해서 lookup이 박혀있음 안해도 된단다.
           그래도 모르겠다 ㅜㅜ.
      )
      3. 저장하여 descriptor 파일 생성
      4. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축

  BMP 개발 (Bean Managed persistence)
    Source(Bean)에 SQL을 직접 사용한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
        이유....는 나도 모른다 -_-; )
      3. 저장하여 descriptor 파일 생성
      4. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축


  * EntityBean 에는 Persistence Data 그 자체에 대해서만 구현
    SessionBean 에는 EntityBean에서의 Data에대한 가공 및
    각종 Business Logic 을 구현
  * EJB 는 MVC 패턴에서 Model 이다.
    Model 은 Data와 Business Logic 역할로 구성되어 있다.

## 메세지 드리븐 빈
    Source(Bean)에 SQL을 직접 사용한다.
    WebLogic Builder에서의 설정
      1. Persistence 설정
      2. CMP fields 각각에 대해서 type 설정
      ( 3. Resources -> Resource References에 Add를 해줘야 한다는데, 안해도 잘된다.
        이유....는 나도 모른다 -_-; )
      3. MessageDrivenBean에 대해서 Destination Type & JNDI Name을 설정한다.
      4. MessageDrivenBean에 대해서 Resource -> EJB Refs 설정
      5. 저장하여 descriptor 파일 생성
      6. jar cvf xxxx.jar * 해서 class 파일과 META-INF 디렉토리를 jar로 압축
   
   


EJB 복잡하다.. 헷갈린다..  해야 될 것들이 너무 많다..
SessionBean, EntityBean, MessageDrivenBean
대체 이런건 왜 만든거여. -_-; ㅜㅜ
어흑. 먼 Spec이 이모양이야!!!!!!!!!!!!!!!!!
메세지 드리븐 빈은 더 복잡하네 -_-;

'그거 > Seminar' 카테고리의 다른 글

제9회 한국 Java 개발자 컨퍼런스  (0) 2008.01.22
JSP & Servlet 교육 Day 5th.  (0) 2007.10.26
JSP & Servlet 교육 Day 3rd.  (0) 2007.10.24
JSP & Servlet 교육 Day 2nd.  (0) 2007.10.23
JSP & Servlet 교육 Day 1st.  (0) 2007.10.22
:
Posted by 뽀기
2007. 10. 24. 14:22

JSP & Servlet 교육 Day 3rd. 그거/Seminar2007. 10. 24. 14:22


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 3


## EJB
  SessionBean -+- Stateful, Stateless
               |
  EntityBean  -+- CMP(Container Managed Persistence) -+- CMR
               |                                      |
               |                                      +- EJB-QL
               +- BMP(Bean Managed Persistence)
  Message Driven Bean


## JMS (Java Message Service)
  : 비동기 메시지 처리
  : Mail, Log 기록에서 유용
  : P2P(Peer-to-Peer)
    message 생산자 여러개, message 소비자 한개
  : pub/sub (publisher/subscriber)
    message 생산자 한개, message 소비자 여러개

   * 동기 메시지 처리
     메세지 생산자가 메시지 소비자의 응답을 기다린다.
     ex) HTTP 웹 프로그램
   * 비동기 메시지 처리
     메시지 생산자가 메시지 소비자의 응답을 기다리지 않는다.
     ex) AJAX

운영도구
  : WebLogic 콘솔 관리자

Connection Factory
  : P2P => javax.jms.QueueConnectionFactory
  : pub/sub => javax.jms.TopicConnectionFactory

목적지
  메세지를 처리하기 위한 자원
  : P2P -> Queue
  : pub/sub -> Topic

Connection
  : P2P -> QueueConnection
  : pub/sub -> TopicConnection

Session(통신 라인)
  메시지를 생성하고 소비하기 위한 단일 스레드 환경
  : P2P -> QueueSession
  : pub/sub -> TopicSession

메시지 생산자
  : P2P -> QueueSender.send()
  : pub/sub -> TopicPublisher.publish()

메시지 소비자
  : P2P -> QueueReceiver.receive()
  : pub/sub -> TopicSubscriber.setMessageListener()

메시지
  Header, Porperty, Body
  TextMessage
  MapMessage
  ByteMessage
  StreamMessage
  ObjectMessage
  Message


## JMS 서비스 설정
 
  Store 설정
    WebLogic 콘솔 -> Services -> JMS -> Stores -> create new File Store
    디렉토리명 : myjmsfilestore
    위치       : C:\bea\user_projects\domains\mydomain\myjmsfilestore
    store name : MyJMSFileStore
  Server 설정
    WebLogic 콘솔 -> Services -> JMS -> Servers -> create new server
    Persistence Store : 위에서 생성한 Store 명 지정
    server name : MyJMSServer
  Server에 목적지(Destination - queue/topic) 설정
    WebLogic 콘솔 -> Services -> JMS -> Servers -> 위에서 생성한 Server -> Destination -> configure new JMS Queue
    queue name : MyJMSQueue
    WebLogic 콘솔 -> Services -> JMS -> Servers -> 위에서 생성한 Server -> Destination -> configure new JMS Topic
    topic name : MyJMSTopic


    * JMS Server -> Destination (queue/topic) -> File Store -> myjmsfilestore(C:\bea\user_projects\domains\mydomain\myjmsfilestore)
    * 생산자 --> JMS Server
                    |
                    +---> Destination ( queue / topic )
                             |
                             +---> File Store
                                     |
                                     +---> myjmsfilestore
                                              |
                                              +---> 소비자


## Queue에 메세지 보내기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageQueueSender {
 public static void main(String[] args) {
  if( args.length != 1 ) {
   System.out.println("Usage : java MessageQueueSender [Message]");
   System.exit(0);
  }

  try {
    // HTTP protocol을 이용하여 WegLogic에 접근하는 것이 아니기 때문에
    // java application에서 WegLogic을 사용하기 위해 설정하는 부분

   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);

   QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Queue queue = (Queue)ctx.lookup("jmsqueue");
   QueueConnection con = factory.createQueueConnection();
   QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
   QueueSender qsender = session.createSender(queue);

   TextMessage message = session.createTextMessage();
   message.setText(args[0]);
   qsender.send(message);
   qsender.send(session.createMessage());

   con.close();
  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}


# Queue에서 메세지 읽어오기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageQueueReceiver {
 public static void main(String[] args) {
   Queue queue = null;
   QueueConnection con = null;
   QueueSession session = null;
   QueueReceiver qreceiver = null;
   
  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);

   QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   queue = (Queue)ctx.lookup("jmsqueue");
   con = factory.createQueueConnection();
   session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
   qreceiver = session.createReceiver(queue);
   
   con.start();
   
   while(true) {
    Message msg = qreceiver.receive(1);
   
    if( msg != null ) {
     if( msg instanceof TextMessage ) {
      TextMessage tmpMsg = (TextMessage)msg;
      System.out.println("읽어온 메시지 : " + tmpMsg.getText());

      if( "exit".equals(tmpMsg.getText()) ) {
       break;
      }
     }
    } else {
     Thread.sleep(500);
    }
   }
  } catch(Exception e) {
   e.printStackTrace();
  } finally {
   try {
    con.close();
   } catch(Exception e) {
   }
  }
 }
}


# Topic 에 발행하기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageTopicPublisher {
 public static void main(String[] args) {
  BufferedReader br = null;

  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);
   TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Topic topic = (Topic)ctx.lookup("jmstopic");
   TopicConnection con = factory.createTopicConnection();
   TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   TopicPublisher publisher = session.createPublisher(topic);

   String line = null;
   br = new BufferedReader(new InputStreamReader(System.in));

   while( (line = br.readLine()) != null ) {
    TextMessage message = session.createTextMessage();
    message.setText(line);
    publisher.publish(message);

    if( "exit".equals(line) ) {
     break;
    }

    message = null;
   }

   con.close();

  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}



# Topic 에서 구독하기

import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;

public class MessageTopicSubscriber {
 public static void main(String[] args) {
  BufferedReader br = null;

  try {
   Properties p = new Properties();
   p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   p.put(Context.PROVIDER_URL, "t3://localhost:7001");

   Context ctx = new InitialContext(p);
   TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");

   Topic topic = (Topic)ctx.lookup("jmstopic");
   TopicConnection con = factory.createTopicConnection();
   TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
   TopicSubscriber subscriber = session.createSubscriber(topic);
   subscriber.setMessageListener(new MessageListener() {
    public void onMessage(Message message) {
     try {
      if( message instanceof TextMessage) {
       TextMessage m = (TextMessage)message;
       System.out.println("구독 내용 > " + m.getText());
      }
     } catch(Exception e) {
      e.printStackTrace();
     }
    }

   });

   con.start();
   while(true) {
    char c = (char)System.in.read();
    if( c == 'q') break;
   }
   con.close();

  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}


 # 세션 빈의 구성과 용도

  원격 인터페이스
    javax.ejb.EJBObject 또는 javax.ejb.EJBLocalObject를 상속받는다.
    클라이언트가 호출할 비즈니스 메소드를 정의하고 있다.

  홈 인터페이스
    javax.ejb.EJBHome 또는 javax.ejb.EJBLocalHome 를 상속받는다.
    빈 클래스를 생성, 검색, 삭제할 수 있는 메소드를 선언한다.

  빈 클래스
    javax.ejb.SessionBean 인터페이스를 구현한다.
    원격 인터페이스에서 선언한 비즈니스 메소드를 구현해야 한다.
    (EJB 클래스는 원격 인터페이스를 구현하지 않는다.)



# 세션 빈 테스트

package kr.co.ejb.examples;

/**
 * Remote Interface
 *
 * Client가 호출할 원격 인터페이스
 * Client가 호출할 메소드만 정의함
 *
 * @author Lucky
 */

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface HelloWorld extends EJBObject {
 public String helloWorld() throws RemoteException;
 public String hello(String param) throws RemoteException;
 public String getTime() throws RemoteException;
}



 

package kr.co.ejb.examples;

/**
 * Bean Class
 */

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloWorldBean implements SessionBean {
 private SessionContext ctx;

 public void setSessionContext(SessionContext c) {
  ctx = c;
 }

 public String helloWorld() {
  return "Hello World";
 }

 public String hello(String param) {
  return "Hello " + param;
 }

 public String getTime() {
  return (new java.util.Date().toString());
 }

 public void ejbCreate() {}
 public void ejbRemove() {}
 public void ejbActivate() {}
 public void ejbPassivate() {}
}



 

package kr.co.ejb.examples;

/**
 * Home Interface
 *
 * Client가 EJB를 생성시킬 때 사용하는 메소드 정의
 *
 *
 * @author Lucky
 */


import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface HelloWorldHome extends EJBHome {
 public HelloWorld create() throws CreateException, RemoteException;
}


# 위 java 파일들을 compile 한 후에 WebLogic Builder를 이용해서 descriptor file 작성
# package 가 시작하는 폴더에서 META-INF 폴더와 같이 jar 생성
   c:\> cd c:\java\classes\helloworld
   c:\java\classes\helloworld> dir
   kr     META-INF
   c:\java\classes\helloworld> jar cvf helloworld.jar *
   c:\java\classes\helloworld> dir
   kr     META-INF     helloworld.jar
# WebLogic 관리 콘솔에서 EJB 로 배포함
   mydomain -> Deployments -> EJB Modules -> Deploy a new EJB Modules
:
Posted by 뽀기
2007. 10. 23. 10:24

JSP & Servlet 교육 Day 2nd. 그거/Seminar2007. 10. 23. 10:24


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies

# Day 2

Developing View Component

## Use Case
         Actor                           Use Case
   ---------------------------------------------------------
   Player                         List all avaliable leagues
                                  Register for a league

   League Administrator           Add a new league
     

## View 설계 및 구현 (List all avaliable leagues : Player)
   index.html
   list_league.view

   * html 파일은 더 이상 수정하지 않을 페이지
   * view 파일은 개발자가 계속 수정하면서 사용할 페이지

   League Bean 생성
   ListLeagueServlet 생성

   * eclipse에 tomcat을 연동한 후에
     Dynamic Web Project를 생성하여 위 작업을 할 경우
     eclipse에서 src, build. webContent 디렉토리가 생성된다.
     src 에서 생성된 java 파일의 class 파일들이 build/classes 에 생성이 되는데
     흔히 알고 있는 WEB-INF\classes 밑에 servlet의 class 파일들이 없어도 servlet이 잘된다.
   * tomcat에서 web.xml에 있는 invoker servlet에 대해서 주석을 해제시키지 않아도
     servlet이 잘 된다.(이건 왜 그런지 참 신기허다. 알고 있기로는 주석을 빼줘야 하는데..)
   * tomcat에 context를 추가할 때 $TOMCAT_HOME/conf/Catalina/localhostxml 파일을 추가해줘야
     context가 추가되는 걸로 알고 있었는데, $TOMCAT_HOME/webapps/ 밑에는 그냥 디렉토리 만들고
     WEB-INF, WEB-INF/classes, WEB-INF/web.xml 들만 추가해주면 context가 추가된다.


## 웹로직 설치 & 환경 설정

웹로직 설치
  server812_win32.exe

WebLogic 설정
  시작->프로그램->Bea weblogic platform 8.1 ->
Configuration Wizard
  작업 도메인을 mydomain 으로 한다.

환경설정
  user_projects\mydomain\startWebLogic.cmd 수정
    set CLASSPATH=.;%WEBLOGIC_CLASSPATH%.....

  user_project\mydomain\setEnv.cmd 수정
    set CLASSPATH=.;%WEBLOGIC_CLASSPATH......

  path에 수정
    C:\bea\user_projects\domains\mydomain
추가


## 서블릿과 JSP 운용

  디렉토리 구조
    webtest -+--- WEB-INF ------------- classes  (java class file : 서블릿, DTO)
             |         |
             |         +--------------- lib      (class library   : .jar 파일)
             |         |
             |         +--------------- src      (java sourc file : .java 파일)
             |         |
             |         +--------------- web.xml, weblogic.xml
             |
             +---- html 파일, jsp 파일
    required -> WEB-INF, web.xml, weblogic.xml


## Packaging Applications

  File Contents                                   Type of File
  --------------------                            -------------------
  EJB Component JAR                              
  Helper Classes JAR File          ----->         EAR file ( .ear )
  WAR File
  RAR File

  Bean Implementation Class
  Helper Classes                   ----->         EJB Component JAR file ( .jar )
  Interfaces
  Deployment Descriptor

  HTML
  JSP
  Servlets                         ----->         Web Component or Web Archive ( .war )
  Helper Classes
  Deployment Descriptor


## 웹로직에 Web Application 배포

  C:\bea\user_projects\domains\mydomain\applications

  폴더 밑에 작업한 디렉토리(webtest)를 복사하거나 위 경로에 webtest 디렉토리를 만들고 작업을 한다.

  WebLogic Server Console에서 확인한다.

  mydomain -> Deployments -> Web Application Modules

  위 메뉴를 따라가서 보면 _appsdir_webtest_dir 라는 이름으로 webtest가 Web Application이 Deploy 됐음을 확인할 수 있다.

  http://localhost:7001/webtest/index.html 을 브라우저에서 실행해서 제대로 보이는지 확인한다.

  C:\bea\user_projects\domains\mydomain\config.xml 파일에 아래 내용이 추가됐음을 확인할 수 있다.
      <Application Name="_appsdir_webtest_dir"
        Path="C:\bea\user_projects\domains\mydomain\applications"
        StagingMode="nostage" TwoPhase="true">
        <WebAppComponent Name="webtest" Targets="myserver" URI="webtest"/>
      </Application>


weblogic.xml 를 아래처럼 수정
<weblogic-web-app>
 <context-root>/</context-root>
</weblogic-web-app>


위와 같이 하면 http://localhost:7001/webtest/index.html 이렇게 하지 않고
http://localhost:7001/index.html 이렇게 호출하여 사용할 수 있다.

HelloWorldServlet.java, CounterServlet.java 파일을 생성하고
WEB-INF\classes 에 위 java 파일들을 컴파일 하여 class 파일을 위치시킨 후에
web.xml 파일에 아래 내용을 추가한다.

 <servlet>
  <servlet-name>HelloWorld</servlet-name>
  <servlet-class>examples.HelloWorldServlet</servlet-class>
 </servlet>

 <servlet>
  <servlet-name>Counter</servlet-name>
  <servlet-class>examples.CounterServlet</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>HelloWorld</servlet-name>
  <url-pattern>/hello</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>Counter</servlet-name>
  <url-pattern>/counter</url-pattern>
 </servlet-mapping>



  * java 파일을 컴파일 할 경우 컴파일을 실행할 도스창(cmd)에서
   C:\bea\user_projects\domains\mydomain
밑에 있는 setEnv.cmd 파일을 실행하여
    컴파일에 필요한 classpath 등에 대해서 자동으로 설정하도록 한다.

추가한 후에 webtest application을 재배포한 후에 브라우저에서
http://localhost:7001/hello, http://localhost:7001/counter 를 호출하여 페이지를 확인한다.

:
Posted by 뽀기
2007. 10. 22. 12:27

JSP & Servlet 교육 Day 1st. 그거/Seminar2007. 10. 22. 12:27


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies


# Day 1

기본 환경 설정 및 설정 환경 테스트


프로그램 설치 및 설정 >
  JDK 1.5.0_12 설치
  PATH 설정
  CLASSPATH 설정
  Tomcat 5.5 설치
  Eclipse 3.2 설치
  Eclipse Project 만들기
  Eclipse + Tomcat 연동 (plug-in 복사 :
http://www.eclipsetotale.com/tomcatPlugin.html)
  Eclipse + Oracle 연동 (eclipse->window->show view->Data Explorer)

주의 >

  Kill Apache Server Process
  Oracle HttpService 중지(속성->수동 으로 변경)
  Tomcat bin (start server)

테스트 >
  HTML 페이지
  JSP 페이지
  Servlet 페이지

Introduction Web Application Technologies

## MVC 패턴

모델
  -> 비즈니스 데이터와 그 데이터를 다루는 연산의 집합
  -> 자바 객체와 데이터베이스 간의 매핑을 통해 자바 객체에 접근하듯이 데이터베이스에 접근할 수 있도록 하는 프레임워크 필요.
    : ejbStore(), ejbLoad()
  -> 모델의 구현
    : 어떤 방식으로 접근할 것인가
    : 어느 정도 규모의 애플리케이션인가?
    : 개발자들의 기술 수준이 어느 정도인가?


  -> 디자이너의 역할이 더 큰 영역
  -> 비지니스 로직과 프레젠테이션 로직의 분리
  -> JSP

컨트롤러
  -> 흐름을 관리하는 역할
  -> 모델과 뷰 간의 조정 역할

MVC 모델 1, 모델 2
 => 사용자의 요청을 받아 흐름을 제어하는 일을 누가 하는가?

모델 1 : JSP
모델 2 : Servlet

## 프레임워크

 -> 사전적 의미 : 무언가를 이루는 뼈대나 기반 구조
 -> Java에서의 의미
   : 소프트웨어의 특정 문제 영역을 해결하기 위한 뼈대를 이루는 클래스와 인터페이스의 집합
 -> 프레임워크는 내가 만든 프로그램을 끼워 넣는 것이고, 유틸리티는 필요한 프로그램을 갖다 쓰는 것이다.
 -> 프레임워크는 extends, 유틸리티는 import
 -> 디자인 패턴의 집합이다.
 -> 어떻게 하면 이전에 만들어 놓은 코드를 다시 사용할 수 있을까?
   : 얼마나 재사용성이 높은 프로그램을 만드는가?
   : 재사용에 적합한 구조로 잘 설계 되었는가?

## 수준별 재사용 방식


 - Copy & Paste 방식
  -> 복사한 소스에서 버그가 발견되거나, 기능을 추가해야 한다면,
     모든 소스를 일일이 찾아서 수정,
     복사한 소스의 위치와 횟수를 기억해야 한다.
  -> 유지보수가 매우 곤란해진다.
 - 함수 재사용
  -> 코드의 양을 줄일 수 있다.
  -> 공유되고 있는 소스에 버그가 있다면 한 곳에서 고치면 된다.
 - 클래스 상속과 재정의를 통한 재사용
  -> 객체의 상호 작용 중심의 사고로 개발자의 사고방식을 전환
  -> 상속과 인터페이스 구현
  -> 다형성
- 디자인 패턴, 프레임 워크
  -> 잘못된 클래스의 정의 시 문제 발생
    : 디자인 패턴과 프레임워크 적용
  -> 디자인 패턴
    : 개발자들이 오랫동안 고민해서 얻은 설계 노하우를 쉽게 자신의 것으로 재사용 할 수 있다.
    : 하나의 상황에 초점을 맞춘 것.


## 웹

Java
  -> 정적 + 동적
     HTML + <% %>
            Servlet
            JavaBeans
            EJB
.NET
  -> 정적(ASP.NET) + 동적(C#.NET, VB.NET)

Java Web Application
  -> HTML (정적)에 프로그램 기술을 접목시킴
  -> CGI (Common Gateway Interface) 기술
    : 사용자의 요청에 매번 새로운 프로세스가 생성
    : 어느 정도의 한계를 벗어난 동시 접속자가 발생하면 서버 전체가 다운되는 경우가 많다.
    : 다른 프로세스와의 정보 공유가 쉽지 않다.
  -> 1997년 서블릿의 소개

서블릿
  -> 서버 측 프로그램
  -> 서블릿 라이프 사이클(Life Cycle)
    : init(), service(), destroy()
  -> 하나의 JVM 안에서 Multi Thread로 동작
    : 서블릿이 한번 적재되면 동시 접속자가 몇 명이든 하나의 프로세스 안에서
      접속자 당 하나의 Thread가 생성되어 서비스
    : 자원을 효율적으로 나누어 사용하면서 서비스를 제공
  -> 서블릿의 생성과 초기화는 최초에 단 한번만 이루어진다.
  -> 모든 사용자 요청을 처리하면, 서블릿 컨테이너는 해당 서블릿을 소멸

                        요청1       요청2       요청3       요청4
    ================================================================
    서블릿 컨테이너 -- init()
    요청/응답       -- service()
    요청/응답       -------------- service()
    요청/응답       -------------------------- service()
    요청/응답       -------------------------------------- service()
    요청/응답       -------------------------------------- destroy()


  -> init() method
    : 서블릿이 처음 적재될 때 호출된다.
      실제로 서비스가 이루어지기 전에 호출 => 초기화 작업 가능
    : init(ServletConfig config)
        init(config) method에서 super.init(config)가 호출되어야 함
    : init()
        getServletConfig() method를 이용하여 ServletConfig 가져올 수 있음

  -> service() method
   : 사용자의 요청이 있을 때마다 호출
   : 서블릿 컨테이너는 GenericServlet에 정의된 service() 만 호출
     HttpServlet 에서는 service() method가 호출되면 요청 정보를 분석해서
     HTTP 명령에 따라 doGet() 또는 doPost() method를 호출하도록 재정의하고 있다.

  -> destroy() method
   : 서블릿 컨테이너가 서블릿을 소멸시키기 직전에 호출
     자원 반납하는 역할 구현

  -> ServletRequest
   : 사용자의 IP 주소나 호스트 명, 사용하는 프로토콜, 포트 번호,
     요청 파라미터 등 요청에 관련된 많은 정보를 제공
   : String getParameter(String name);
     String[] getParameterValues(String name);
     위 method를 이용하여 프로그램에 전송된 요청 파라미터를 확인할 수 있다.

  - ServletResponse
   : response.setCharacterEncoding(String enc)
     파라미터의 값이 한글일 경우, 한글 설정(euc-kr)
   : java.io.PrintWriter getWriter()
     Html 과 같은 텍스트 형식일 경우, getWriter()를 통해 PrintWriter를 생성하여 출력할 수 있다.
   : ServletOutputStream getOutputStream()
     바이너리(이미지, PDF 등등) 파일일 경우, getOutputStream()을 통해 SerlvetOutputStream을 이용할 수 있다.

서블릿에서 멀티 쓰레드에 대한 고려
  : concurrency, synchronization 문제
    사용자 1        사용자 2
    ===============================
    count++
    -------------------------------
                    count++
    -------------------------------
                    println(count)
    -------------------------------
    println(count)
    synchronized(this) {
      count++;
      out.println(count);
    }

멀티 쓰레드
  - Virtual CPU
  - Code
  - Class Variables
  위 3가지를 공유함

  하나의 process가 생성이 된 후에 Thread가 여러개 생성이 되면
  process가 사용하는 CPU를 각 Thread가 공유하게 된다(Virtual CPU)

  class variables는 process 범위에서 생성 & 유지되는 변수이고, 각 thread에서 공유한다.
  doGet(), doPost() 등은 각 thread 에서 각자 실행되는 부분이다.

 
:
Posted by 뽀기