'Programming/Servlet'에 해당하는 글 9건

Servlet, jsp 를 이용하여 웹 어플리케이션을 만들려 한다면 개발 환경 구조를 구축해야 하며,
그것을 Tomcat 같은 컨테이너에서 배포할 수 있는 환경 구조가 필요합니다.
Tomcat 환경 설정을 변경하지 않았다면 기본 배포 환경 구조는 <TOMCAT_HOME>/webapps/ 에서 시작됩니다.

 

 

개발(Development) 환경 구조

 

개발 환경은 표준이 없습니다. 본인이 익숙하고 편한대로 구조를 잡으시면 됩니다.
하지만 아래와 같이 자바 소스코드 / 클래스 파일 / 라이브러리 / 뷰 페이지 / DD 등이 나뉘어져 있어야 편리하겠습니다.

 

App1 (임의의 새 디렉토리 생성) ──────── App2 ...
  │
  ├─── src ─────── com ─── oops4u ─┬─ web ───── src1.java ... (java 소스 코드)
  │                                └─ model ─── src2.java ...
  │
  ├─── classes ─── com ─── oops4u ─┬─ web ───── src1.class ... (컴파일된 클래스 파일)
  │                                └─ model ─── src2.class ...
  │
  ├─── lib ─────── servlet-api.jar ... (3rd party JAR 파일)
  │
  ├─── web ─────┬─ form.html ... (view 페이지)
  │             └─ result.jsp ...
  │
  └─── etc ─────── web.xml(DD)

 

 

배포(Deployment) 환경 구조

 

개발이 완료되었다면, 배포에 필요한 파일들을 복사하여 배포 환경 구조에 맞게 붙여 넣으면 되겠습니다.
소스코드를 제외하고 각 경로에 맞게 복사합니다.
복사가 완료되었으면 톰캣을 재시작한 후에 배포가 올바로 되었는지 브라우저에서 순서대로 테스트를 해봅니다.

 

<TOMCAT_HOME>
  │
webapps
  │
App1
  │
  ├─── WEB-INF ─┬─ classes ─── com ─── oops4u ─┬─ web ───── src1.class ...
  │             ├─ lib                         └─ model ─── src2.class ...
  │             └─ web.xml(DD)
  │
  ├─── form.html
  └─── result.jsp

 

 

위와 같은 구조라면 웹브라우저에서 다음과 같은 주소로 확인할 수 있습니다.

 

http://domain/App1/form.html
http://domain/App1/result.jsp

 

나머지 클래스들의 접근 url은 web.xml 에 정의한대로 확인합니다.


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

웹 페이지에 보여질 요소들 중 변경될 소지가 높은(이메일 주소 등...) 것들은 DD(web.xml)에 기술하는 것이 좋습니다.
이메일 등 변경된 텍스트가 재컴파일(recompile) 대신 재배포(redeploy)만으로 가능하게 해줍니다.

 

web.xml (DD: Deployment Descriptor)
DD의 파라미터 정의 방법

 

1. Context init parameters

 

<servlet> 이 아닌 <web-app> 엘리먼트 안에 정의.
이 어플리케이션의 모든 servlet, jsp 에서 사용 가능.
ServletContext 는 web-app 에 한개.

 

// web.xml
<web-app ...>
    <context-param>
        <param-name>foo</param-name>
        <param-value>bar</param-value>
    </context-param>

 

    <servlet>
        <servlet-name>Param Test</servlet-name>
        <servlet-class>TestInitParam</servlet-class>
    </servlet>

    <!-- servlet declarations -->
</web-app>

 

// source
getServletContext().getInitParameter("foo");

 

 

2. Servlet init parameters

 

<web-app> 엘리먼트의 <servlet> 엘리먼트 안에 정의.
<init-param> 을 가진 servlet 에서만 사용 가능.
ServletConfig 는 servlet 에 한개.

 

// web.xml
<web-app ...>
    <servlet>
        <servlet-name>Param Test</servlet-name>
        <servlet-class>TestInitParam</servlet-class>
        <init-param>
            <param-name>foo</param-name>
            <param-value>bar</param-value>
        </init-param>

 

        <!-- other stuff -->
    </servlet>
</web-app>

 

// source
getServletConfig().getInitParameter("foo");


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
HTTP header

♣ HttpServletRequest 를 이용한 헤더 출력
Enumeration e = req.getHeaderNames();
while(e.hasMoreElements()) {
    String name = (String)e.nextElement();
    String value = req.getHeader(name);
    ...print...
}

♣ HttpServletResponse 를 이용한 헤더 설정
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Location", "http://www.oops4u.com");
res.setHeader("Refresh", "3; URL=http://www.oops4u.com");
...more...

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
Servlet Life Cycle

모든 서블릿은 init(), service(), destroy() 메소드를 호출하는 라이프 사이클을 가진다.
  • init()
    서블릿이 메모리에 로드(Load) 되었을 때 수행되고, 메모리에 남아 클라이언트의 요청 처리
    서블릿이 서비스하기 위해 필요한 초기화 작업 수행(file open, DB Connection, ...)

  • service()
    초기화된 서블릿은 클라이언트의 요청이 있을 때마다 스레드(Thread)가 생성되어 병행적으로 수행
    service() 메소드가 호출하는 메소드 (doGet(), doHead(), doOption(), doPost(), ...)

  • destroy()
    서블릿이 메모리에서 언로드(unload)되기 전에 수행

♣ Cron.java : 일정 시간에 반복적으로 특정한 일을 수행
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Cron extends HttpServlet {
    private long num;
    private Timer timer;
    private TimerTask task;
    
    // 서블릿이 처음 메모리에 로드될 때 수행
    public void init() {
        int delay = 0;
        int period = 5000;

        timer = new Timer();
        // TimerTask 객체를 생성하면서, 수행할 작업
        task = new TimerTask() {
            public void run() {
                num++;
            }
        };
        // delay 시간 후에 period 간격으로 task 실행
        timer.scheduleAtFixedRate(task, delay, period);
    }
    
    // 서블릿이 메모리에서 삭제될 때 Timer와 TimerTask 작업 취소
    public void destroy() {
        task.cancel();
        timer.cancel();
    }

    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
        res.setContentType("text/html;charset=UTF-8");
        PrintWriter out = res.getWriter();
        req.setCharacterEncoding("UTF-8");

        out.println("<html>");
        out.println("<head><title>Cron Test</title></head>");
        out.println("<body><h3>Cron Test</h3>");
        out.println("5초 간격으로 숫자가 증가함 (새로고침 버튼 클릭).");
        out.println("<p>숫자 = " + num + "</body></html>");    
    }
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
파라미터 이름 값 구하기

getParameterValues()
- 폼 데이터를 얻을 때 여러 개의 값을 저장할 수 있는 배열 형태를 위해 사용
- 값이 전달되지 않을 경우 리턴 값이 'null' 이 올 수 있다.

getParameterNames()
- 모든 파라미터 이름을 Enumeration 타입으로 리턴

// 매개변수의 이름을 수로 반환
Enumeration e = req.getParameterNames();

// Enumeration 객체가 하나 이상의 element를 갖고 있다면 true 반환
while (e.hasMoreElements()) {

    // Enumeration 객체가 하나 이상의 element를 갖고 있다면 다음 element를 반환

    String name = (String) e.nextElement();
    String values[] = req.getParameterValues(name);

    // values 변수에 값이 있는지 확인

    if(values != null) {
        for(int i=0; i < values.length; i++) {
            out.print("<li>" + name + " : " + values[i]);
        }
    }
}

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,