[Spring] 스프링 입문 - Servlet & JSP

정현우·2021년 4월 12일
10

Spring Basic

목록 보기
1/2
post-thumbnail

스프링 입문 - Servlet & JSP

network의 기본개념은 생략, 철저하게 java에 초점 맞춰서 정리를 해보자
java에서 web 프로그래밍, 특히 dynamic한 페이지는 어떻게 만들어져 왔는가?

🔥 앞서 jsp 관련 사진은 https://gmlwjd9405.github.io/2018/11/03/jsp.html 에서 가져왔습니다! 정리를 기가 막히게 잘해두셨습니다!! 관련 예시도 좋습니다!!

Servlet

개요

servlet

  • 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
  • Java를 웹어플리케이션에 조금 더 개발하기 쉽게 하기 위해 만든 API(라이브러리, 클래스 들)이며 이 규약에 맞는 라이브러리나 클래스들을 상속 및 구현하여 만든 클래스들을 서블릿이라고 한다.

servlet class diagram

  • 위 사진이 servlet 클래스 다이어 그램이다.
  • 우리는 실제로 ServletEx와 같은 Class만 만들면 된다.

요약 특징 링크

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
  • Java Thread를 이용하여 동작한다!
  • MVC 패턴에서 Controller로 이용한다.

Servlet 동작 방식

  1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송합니다.
  2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
  4. 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
  5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.

실습

  • 아주 기본적이고 가벼운 형태를 살펴보자
package com.servlet.test;

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 HelloServlet
 */
@WebServlet("/hs") // 어노테이션으로 서블릿 맵핑 한 것 (url) -> 대신 web.xml에서 정의해줄 수 있음
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<head>");
		out.print("</head>");
		out.print("<body>");
		out.print("<div>");
		out.print("<h1> HELLO SERVLET </h1>");
		out.print("</div>");
		out.print("</body>");
		out.print("</html>");
		
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
  • HttpServletRequest : 요청에 대한 정보를 가지고 있는 객체
    • request.getCookies();
    • request.getSession();
    • request.getAttribute(null);
    • request.setAttribute(null, null);
    • request.getParameter(null);
    • request.getParameterNames();
    • request.getParameterValues(null);
  • HttpServletResponse : 응답에 대한 정보를 가지고 있는 객체
    • response.addCookie(null);
    • response.getStatus();
    • response.sendRedirect(null);
    • response.getWriter();
    • response.getOutputStream();

Life Cycle, 생명주기

servlet life cycle
servlet life cycle

  • 생성(init) 단계에서 body(request 패킷에서 data에 대해)등의 자원 관련 작업을 많이 한다.
  • service에서 http req에 해당하는 method가 실행된다!

JSP

개요

  • Java Server Pages의 약자, Java를 이용한 서버 사이드 스크립트 언어이다.
  • 서버 사이드 스크립트 언어는 php가 대표적이다~ 나도 php로 웹 입문했다 :)
  • 잘못된 비교일 수 있지만 비슷한 예시로 flask의 template, node 사용할때 view engine -> pug(jade) 정도로 생각해 볼 수 있다.
  • java언어 기반으로 동적인 웹 페이지를 구성할 수 있다.

java에서 jsp

jsp

jsp wiki

  • jsp page request부터 response를 받기까지 work flow를 도식화 한 그림이다.
  • jsp파일은 javax.servlet.http.HttpServlet 클래스를 상속받은 Java 소스 코드로 변환한 다음 컴파일되어 실행된다.
    jsp
  • 위 사진과 같이 <%= %>으로 java코드를 html파일에 삽입하는 방식으로 사용 가능하다.

실습

  • jsp파일 html5 포맷을 설정해주기
    jsp파일 html5 포맷

  • 선언태그와 주석 태그 <%= %> / 주석은 -- 하이폰 두개임을 헷갈리지말자!
    선언태그와 주석 태그

  • 선언태그와 비슷한 스크립트릿 태그 와 간단한 표현식 태그!
    • 스크립트릿 태그를 자연스럽게 가장많이 쓴다.
      스크립트릿
  • 지시어
    • page는 거의 동일하다! (보통 default)
    • page import="java.util.ArrayList" 와 같이, java코드를 넣을때 필요한 라이브러리 import 할때도 page를 사용한다!
    • include는 외부 다른 파일 가져올때 많이 사용한다! -> header / footer 등과 같은 반복되는 덩어리들에 대한 처리로 include를 많이 사용한다!
    • taglib은 외부 라이브러리 (예를 들어 jQuery등과 같은)를 import할때 사용!
      지시어

request, response

request

  • 요청, getParameterValues 메서드로 array(배열)형태로 받아올 수 있다.

response

  • 응답, 현제 요청 페이지에서 다른 페이지로 리다이렉트 하는 코드.
  • jsp에서 request를 통해 어떻게 소통하는지 가볍게 코드로 살펴보자

jsp test html

  • action은 request가 갈 target url이다! 사진에서는 생략되었지만 jsp파일 경로 (mSignUp.jsp)를 넣어주자! / method는 http request의 형태! -> 기본적인 세부 개념은 스킵!
  • 위 html form태그로 query string 형태로 action url에 request가 갈 것 이다.

jsp test jspfile

  • jsp파일에서 request가 들어온 (query string value 기반) 데이를 기반으로 page를 render한다!

내장객체

  • request, response 외 jsp에서 기본적으로 제공하는 다른 내장 객체는 무엇이 있을까

1. config객체

  • web.xml에서 init param와 같은 xml태그를 이용해 -> jsp에서 getInitParameter() 메소드를 이용해 confing된, (미리 정의된) 파라미터를 이용할 수 있다.
  • target servelt xml 태그 안에 위와 같은 추가 정보 xml이 정의 되어야 한다!
    config객체

2. application 객체

  • config에서 스코프가 확장되었다고 생각하면 편하다!
  • global 영역에서, application 전역에서, 미리 정의한 이 객체에 대해 접근할 수 있다.
  • getServletContext().setAttribute("key", "value"); 와 같이 정의되어 있는 것을 update하는 형식으로 set이 가능하다!
  • 물론 apllication.set---으로 바로 추가 정의도 가능하다!
    application 객체

3. out 객체

  • out.print와 같이 html 태그를 바로 출력가능하다. 단순!

4. exception 객체

  • error handle할때, 에러 발생시 어떻게 처리할지!
  • jsp파일 상단에 <%@ page errorPage = "targetError.jsp" %>와 같은 page 지시어를 추가해놓아야 한다. /
  • 특정 페이지를 에러 전용 페이지로 사용하겠다 -> <%@ page isErrorPage = "true" %> 로 해준다!
  • 그 에러 페이지 jsp에서 어떤 에러인지 접근하기 위해 exception객체에 접근 가능하다!

데이터 공유

  • 내장 객체를 응용해서 servlet에서 데이터를 공유하는 방법에 대해 체크해보자!

servlet parameter

  • config객체를 jsp페이지 내부 뿐 아니라, web.xml에서 정의한 뒤 servlet class에서도 사용이 가능하다.
    • 위 예시 그대로 servlet class내부에서 String adminId = getServletConfig().getInitParameter("key"); 와 같이 사용하면 된다.
  • application 객체 -> context parameter 또한 똑같이 사용가능하다!
profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글