다잘하고싶어

서블릿 본문

이론학습/Servlet&JSP

서블릿

챙영잉 2023. 4. 10. 10:50
더보기

<목차>

- Dynamic Web Project 구조

- 웹과 웹 프로그래밍

- 톰캣 다운로드 및 이클립스에 톰캣 연결하기

- 서블릿

  - 서블릿 등록 방법

    - 고전방식

    - 최신방식

 - 서블릿 생명주기

- get/post

- url 구성요소

 

 

Dynamic Web Project 구조

Java Resources

  • Web application 실행에 필요한 java 관련 리소스를 포함

Webcontent

  • html, javascript, css, jsp, image 등 웹 컨텐츠를 포함
  • 웹 어플리케이션 설정파일인 web.xml 도 여기에 위치

  • 현재 사용하고 있는 브라우저 역시 서버와 클라이언트 관계

클라이언트가 서버가 될 수 있을까? YES

클라이언트 = 요청을 보내는 컴퓨터, 응답을 받는 컴퓨터

서버 = 요청을 받는 컴퓨터, 응답을 보내는 컴퓨터

둘다 된다!

 

WAS 를 톰캣을 이용해서 쓴다

webserver → 사용자에게 동적,정적 페이지를 돌려준다

정적페이지 ⇒ 이미 완성된 페이지( 데이터 바뀔 필요 없음)

 

웹과 웹 프로그래밍

  • URL → 웹 상의 자원을 참조하기 위한 웹 주소
  • 웹페이지 → 웹 브라우저를 통해서 보여지는 화면
  • 웹서버 → 클라이언트 요청에 맞는 응답(웹페이지)을 제공
    • java EE 버전이어야함
  • 웹 어플리케이션 → 웹 서버를 기반으로 실행되는 응용 소프트웨어
  • 웹 어플리케이션 서버 (Web Application Server, WAS) → 요청이 오면 알맞은 프로그램을 실행하여 응답 만들고 제공하는 서버

톰캣다운로드

 

 

이클립스에 톰캣 등록하기

 

https://22chaechae.tistory.com/70

 

이클립스에 톰캣 등록하기

자바는 Java EE 버전이어야 한다.

22chaechae.tistory.com

서블릿 Servlet

  • Server + Applet 의 합성어
  • 자바를 이용하여 웹에서 실행되는 프로그램을 작성하는 기술
  • 자바를 이용하여 웹페이지를 동적으로 생ㅅ어할 수 있음
  • Servlet 은 자바 코드 안에 HTML 을 포함

톰캣에는 여러개의 서블릿을 올릴 수 있다

Context root 를 직접 적음으로써, 이 안에 내 프로젝트가 있어! 알려주는 것

적어주지 않으면 프로젝트 이름이 default 값이 된다.

 

서블릿도 클래스! 클래스로 만들어준다

해당 클래스를 서블릿으로 만들기 위해서는 Servlet 인터페이스를 구현해야한다.

package com.ssafy.myservlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyServlet1 implements Servlet{

	@Override
	public void destroy() {
		// 서블릿이 파괴될때
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// 뭔가 서블릿 설정을 건드리는 것 같아
		return null;
	}

	@Override
	public String getServletInfo() {
		// 서블릿 정보
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// 서블릿 초기화할때
		
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// 서블릿에서 요청을 처리할 때
		
	}

}

→ 코드짜야할 게 너무 많아!! ⇒ 귀찮아!

따라서 이미 구현해놓은 서블릿을 가져오기

상속받았는데 왜 빨간줄? ⇒ 추상클래스라서!

 


import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyServlet2 extends GenericServlet{

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	} 
}

왜 노란줄? 직렬화 필요!

이것도 귀찮아!

import javax.servlet.http.HttpServlet;

public class MyServlet3 extends HttpServlet {

}

서블릿

서블릿 등록방법( web.xml)

주소창에 url 을 썼을 때 매핑되어있는 서블릿이 있으니까 그걸로 이동한 것

등록방법은 고전적, 최신 방법 2가지

고전방식

 

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

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

public class MyServlet4 extends HttpServlet{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		writer.append("<html>");
		writer.append("<head>");
		writer.append("<title>Hello</title>");
		writer.append("</head>");
		writer.append("<body>");
		writer.append("<h1>MyServlet4</h1>");
		writer.append("</body>");
		writer.append("</html>");
	} 
}

동작하지 않는 이유는?

매핑이 안돼서

 

이런식으로 직접 연결해줘야 연결된다!

최신방식 - 어노테이션을 사용하여 등록

 

서블릿 생명주기 Life-Cycle

  • 서블릿 인스턴스는 서블릿이 포함된 웹컨테이너에 의해 제어된다
  • 서블릿 인스턴스가 존재하지 않으면 다음과 같은 작업을 수행한다
    • 서블릿클래스 로드
    • 서블릿 클래스 인스턴스 생성
    • 서블릿 인스턴스 초기화
    • 웹 컨테이너에 의한 서비스 메서드 호출
    • destroy 메서드를 호출하여 서블릿 종료
  • 서비스 메서드는 요청이 들어올 때 마다 호출된다

웹 컨테이너에 의한 서비스 메서드는 여러번!

import java.io.IOException;
import javax.servlet.ServletConfig;
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 LifeCycle
 */
@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	int initCnt =1;
	int destroyCnt =1;
	int doGetCnt=1; 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LifeCycle() {
    	System.out.println("생성자 호출");
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출" + (initCnt++) );
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출" + (destroyCnt++));
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet 메서드 호출" + (doGetCnt++));
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost 메서드 호출");
	}

}

URL 구성요소

프로토콜 → 절차를 포함한 통신규약

서버 → 웹 페이지를 요청할 서버의 주소, 실제 IP 주소나 도메인을 입력할 수 있음

경로 → 서버 내의 상세 경로

쿼리 스트링

→ 추가로 서버로 데이터를 전송하기 위해 사용

→ ? 마크를 적어 시작을 표시한다. parameter_name = value 형태로 작성, 파라미터가 여러개일 경우 & 로 구분하여 작성한다

 

 

아무것도 적지 않으면 디폴트는 get 방식

Welcome-file 이 의미하는 것은?

project 를 실행시켰을 때 저것들이 있는지 탐색 시작,

있다면? ..주세요라고 판단

만약 프로젝트 안에 index.html 이 있다면 저기로 연결된다

요청이 들어오지 않고(매핑되어있지않고) 단순히 context root 까지만 호출했을 때 웰컴파일에 있는 것들을 찾기 시작한다.

 

 

(+)

action = “” 의 의미? ⇒ 현재 URL을 다시 넣고 엔터 = 새로고침

action 에 슬래쉬 넣으면?? localhost:8080뒤의 / 를 의미하므로

컨텍스트루트를 없애버리고 action 뒤의 값이 적힌다. 주소가 꼬일 수 있음 주의!

action 뒤에 슬래쉬를 안넣으면 단순 경로로 지정됨.

 

 

response.setContentType 의 역할?

서버와 클라이언트 간의 요청과 응답 타입을 설정해준다.

두개의 순서가 바뀌면 안된다!

겟방식은 utf-8 이 안깨지는데 post 방식은 깨진다

요청하는 것도 세팅해줘야한다.

 

(+)

get 방식 요청 방법

  • form=GET
  • URL에 붙여서
  • a 태그에 link 로

post 방식 요청

  • form = post

(+)

name 은 쿼리스트링의 키, text 는 밸류

id 는 키, text 는 밸류

'이론학습 > Servlet&JSP' 카테고리의 다른 글

JSP  (0) 2023.04.11
이클립스에 톰캣 등록하기  (0) 2023.04.10