2015년 8월 13일 목요일

신입SW인력을 위한 실전 JSP 동영상과정 - 제 05~08강 Servlet 기능 알아보기

이 게시물은
http://www.wiz.center/191
http://www.wiz.center/192
http://www.wiz.center/193
http://www.wiz.center/194

의 동영상 강의를 시청하고 작성한 글입니다.
새로 시작하는 경우라면 위 링크의 동영상 강의를
들어보세요


1. Servlet Class설명
  ① public class HelloWorld extends HttpServlet {
      작성한 클래스는 HttpServlet을 상속받아 작성한다.

  ② protected void doGet
            (HttpServletRequest request, HttpServletResponse response)
      doGet 메서드를 오버라이드 할 수 있고 이때
       클라이언트가 서버에 요청 HttpRequest
       서버가 클라이언트에 응답 HttpResponse
       하는 두개 객체를 인자로 담아 작성한다.
      같은 Get, Post 각각 방식에 대해서 다른 처리가 가능하다. 또는
       묶어서 처리하는것도 가능하다.
      Get, Post 방식 결정은 html에서
       <form method ="get" or "post"> 선택으로 가능하다.

  ③ response.setContentType("text/html; charset=euc-kr")
       HttpResponse setContentType() 메서드를 통해서
       응답 방식을 먼저 결정한다.

  ④ PrintWriter writer = response.getWriter();
       출력 스트림 PrintWriter 에 response.getWriter()를
       주입시 writer 객체에 문자를 실어 클라이언트로
       보낼 수 있다.

  ⑤ writer.println("");
       writer 객체의 println 메서드를 이용하면  웹 브라우저에
       출력이 가능하다.
 

package com.javalec.ex;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloWorld
 */
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet { //①
 private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorld() {
        super();
        // TODO Auto-generated constructor stub
    }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//②
  System.out.println("HelloWorld~~");
  
  response.setContentType("text/html; charset=euc-kr");//③
  PrintWriter writer = response.getWriter();//④
  
  writer.println("");
  writer.println("");
  writer.println("");
  writer.println("");
  writer.println("

HelloWorld~~~

"); writer.println(""); writer.println(""); //⑤ writer.close(); //⑥ } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }

2. Apache-Tomcat 서버의 Server.xml 설정파일  ContextPath 속성
     관련 설명 : http://egloos.zum.com/playgame/v/287965

  1) 특징1 이클립스에서 실행시 등록하면 자동실행된다.

  2) 특징2 별도 실행시 war 파일을 webapps 폴더에 넣고
     서버 재 시작시 자동 등록된다.

  3) 위 내용처럼 수동으로 넣을 수도 있지만
     Tomcat 에서는 자동으로 등록하도록 권유하고 있음.
     아래는 Server.xml 의 다른 태그에 대한 설명을 포함
      http://sinope.tistory.com/38

3. Servlet 동작 이해
  1) 웹 서버와 웹 어플리케이션 서버
     잘설명된 글이 있어서 아래 링크
     웹 서버는 적절한 페이지를 보여주는 것
     ,웹 어플리케이션 서버는 적절한 업무 로직을 수행하는 것
     http://bsnippet.tistory.com/47

  2) Servlet이 작동순서 및 LifeCycle

3. HTML Form 태그 및 Servlet Parameter

  1) Form 태그
     브라우저(Exploorer, Chrome, FireFox, Sapari, ...)에서
       서버로 데이터를 보낼때 사용하는 태그
       표준 문제로 근시일내 form 이외의 방법으로
       서버에 자료를 전송하는 방법은 만들지 않을 것으로 보인다.
     관련 설명
     http://www.nextree.co.kr/p8428/


  2) Servlet Parameter
     (1) From 의 Action 이름이 Servlet의 경우에
          서블릿 매핑명으로 등록되어 매칭되고
          이후 Servlet(java) 에서는
          request.getParameter() 메서드를 통해서
          From 안의 자료의 name을 key로 하여 vaule 내용을
          가져올 수 있다.

     <Form action="pikacu" method="post">
       ....
     <input type="submit" value="전송하기">
     </Form>

-----------------------------------------------------
     @WebServlet("/FormEx")
.........
protected void doPost
       (HttpServletRequest request,
        HttpServletResponse response)
          throws ServletException, IOException {
String id = request.getParameter("id");
..............

     (2) 가져올대 확인할 점 파일 인코딩 방식
         Tomcat 서버는 기본적으로  IOS-8859-1방식을 지원함
           따라서 Tomcat 서버 설정을 UTF-8 또는 EUC-KR로 바꿔서
           통일시켜줘야 한글 깨짐이 해결됨
           Spring은 web.xml에서 설정하고 페이지별로만 적용하면 되었는데...

         다만 Get, Post 방식에 따라 적용방법이 틀림
          Get 방식은 Apache-Tomcat 서버의 아래 구문에 URIEncoding 속성을
          추가해서 적용되며

{변경 전}
<Connector connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>

{변경 후}
<Connector URIEncoding="EUC-KR" connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>

          Post 방식은 Servlet아래에 getParameter 메서드를 작성전에
          아래와 같이 ContentType을 추가해주면된다.

{작성 추가할 ContectType 속성}
response.setContentType("text/html; charset=EUC-KR");

     (3) 가져올대 확인할 점 컴파일 에러 발생 관련
         예제에선느 java 1.8버전으로 작성해놨는데 (나온지 1년정도 됨)
         Spring 에서는 1.7을 쓰는 관계상 아래와 같은 작성 에러가 발생한다.
         여기에 대해서는 아래 화면처럼 옵션 조정을 통해서
         컴파일러를 변경 가능하다.


4. 서블릿 고유 기능들
    프로젝트 사용시 특정 목적의 상수나 초기에 필요한 상수값(초기화파라미터)
     가 필요할 수 있는데 이를 관리하고 사용, 접근하는 방법을 알아본다.

  1) 서블릿 초기화 파라미터 ServletConfig
    특정 서블릿 에서만 사용하는 상수가 필요한 경우
     서블릿 생성 web.xml 에 명시하여 Servlet에서 사용하거나
     해당 서블릿에 직접 명시하여 사용 할 수 있다.

     (1) web.xml에 상수를 작성 관리하고 이를 Servlet에서 사용하기
작성1. web.xml 에 Servlet 작성시 아래와 같이 initparam을 포함한다.

  
   ServletInitParam
   com.javalec.ex.ServletInitParam
   
   
    id
    hongkd
   
   
    pw
    qwer
   
   
    path
    C:\\javalec\\welcome
   
   
  
  
   ServletInitParam
 /InitParam
  
  


작성2. 명시된 Servlet 파일에서 가져다 사용한다.
          GenericServlet.getInitParameter(String id)
          메서드로 사용가능한 상태가 됨.
.....
String id = getInitParameter("id");
String pw = getInitParameter("pw");
String path = getInitParameter("path");
.....


      (2) Servlet에서 데이터를 관리하고 사용하기
작성1. 서블릿 파일 어노테이션에 다음 내용을 추가한다.
         (여기서는 보기 좋게 줄넘긴 했으나 소스상에서는 한줄에 작성
          , 그리고 사용방법은 같음)
 
@WebServlet
        (urlPatterns=
                {"/ServletInitParam"
                }, 
        initParams=
                {@WebInitParam(name="id", value="abcdef"),
                 @WebInitParam(name="pw", value="1234"), 
                 @WebInitParam(name="path", value="C:\\javalec\\workspace")
                }
        )
public class ServletInitParam extends HttpServlet {
 private static final long serialVersionUID = 1L;
..... 
String id = getInitParameter("id");
String pw = getInitParameter("pw");
String path = getInitParameter("path");
.....

여기는 복사용 코드
 
@WebServlet(urlPatterns={"/ServletInitParam"}, initParams={@WebInitParam(name="id", value="abcdef"), @WebInitParam(name="pw", value="1234"), @WebInitParam(name="path", value="C:\\javalec\\workspace")})
public class ServletInitParam extends HttpServlet {
 private static final long serialVersionUID = 1L;
..... 
String id = getInitParameter("id");
String pw = getInitParameter("pw");
String path = getInitParameter("path");
.....


  2) 데이터 공유 ServletContext
작성1. web.xml에 context-param을 작성한다.

  
   id
   abcdef
  
  
   pw
   1234
  
  
   path
   C:\javalec\workspace
  
  
작성2. Servlet에서 아래와 같은 방법으로 사용한다.

 
..... 
String pm = getServletContext().getInitParameter(String parameter_name);
.....


  3) 웹어플리케이션 감시 ServletContextListener
     위의 LiftCycle 그림에서 전, 후처리 함수가 있다는걸
       보았는데 이는 별도의 클래스에 기술하여 구현가능하다.

작성1. 아래와 같은 ServletContextListener 을 implements 하는
         클래스를 하나 작성한다. 그러면 오버라이드해야되는 2개 함수가
         뜨는데 이를 통해서 전, 후처리 함수를 구현가능하다.

 
@WebListener
public class ContextListenerEx implements ServletContextListener{

 public ContextListenerEx() {
  // TODO Auto-generated constructor stub
 }

 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
  // TODO Auto-generated method stub
  System.out.println("contextDestroyed");
 }

 @Override
 public void contextInitialized(ServletContextEvent arg0) {
  // TODO Auto-generated method stub
  System.out.println("contextInitialized");
 }
 

작성2. 위처럼 @WebListener 어노테이션을 준 경우에는
         해당되지 않음, 위 어노테이션이 없는 경우
         web.xml에 다음과 같이 Listener를 부여할 수 있다.
         뭐 둘다해도 에러나지 않고 동작하긴 함.

  
    com.javalec.ex.ContextListenerEx
  
  

댓글 없음:

댓글 쓰기