[TIL-260309] Servlet & JSP 입문: JSP 실습, Servlet 기초

2026. 3. 10. 13:56·Backend/Java

JSP 실습

지난 금요일에 톰캣 서버와 이클립스 IDE를 연결해 간단한 jsp 파일로 웹 페이지를 만들어 보았다.

프로젝트 구조

 

  • Tomcat v9.0 Server at localhost-config: 프로젝트에서 사용될 톰캣 서버
    • 폴더 내 파일 건들지 않기!
  • servletEx, webEx: 생성한 프로젝트
  • src/main/java: 자바 서블릿 소스 파일
  • webapp: JSP 파일 (클라이언트에서 파일 이름으로 접근할 수 있음. META-INF, WEB-INF 빼고)
  • lib: 확장 라이브러리
  • web.xml: 배포서술자
    • 웹 애플리케이션의 환경설정 정보를 담은 파일
    • WAS가 처음 구동될 때 이 파일을 읽어 설정 내용을 톰캣에 적용하게 됨

 

절대 src 밑에 main 밑에 java 폴더는 건드리지 말기! (수정해도 반영 안 됨)

위에 있는 src/main/java 폴더에서 코드 작성하기.

 

JSP 페이지 예외처리

404: 요청한 JSP 페이지가 없을 때 발생하는 오류

500: 컨테이너에서 JSP 페이지 처리 중에 오류가 발생할 때 표시되는 오류

 

web.xml에서 에러 코드에 대한 예외 처리 페이지 설정이 가능하다.

  1. webapp 안에 err 폴더 만들고 error_404.jsp, error_500.jsp 파일을 만든다.
  2. jsp 코드를 작성한다. (title, h1 태그만 건드리면 됨)
<!-- error_404.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <!DOCTYPE html>
  <html>
    <head>
      <meta charset="UTF-8">
      <title>404 예외 처리 페이지</title>
    </head>
    <body>
      <h1>요청한 페이지는 존재하지 않습니다.</h1>
    </body>
  </html>

  <!-- error_500.jsp -->
  <%@ page language="java" contentType="text/html; charset=UTF-8"
      pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <title>500 예외 처리 페이지</title>
      </head>
      <body>
        <h1>죄송합니다. 서비스 실행 중 오류가 발생했습니다.</h1>
        <h1>잠시 후 다시 시도해 보세요.</h1>
      </body>
    </html>
  1. web.xml에 예외 처리 페이지 설정 (아래 코드 추가)
    <error-page>
      <error-code>404</error-code>
      <location>/err/error_404.jsp</location>
      </error-page>
      <error-page>
      <error-code>500</error-code>
      <location>/err/error_500.jsp</location>
      </error-page>

 

JSP welcome 파일 지정

web.xml에 welcome 파일을 등록해 두면 브라우저에서는 컨텍스트 이름만으로 요청할 수 있다.

<welcome-file>mmain.jsp</welcome-file>

을 추가하면 http://localhost:8080/webEx만 입력해도 main.jsp가 요청된다.

 

컨텍스트

컨텍스트(Context): server.xml에 등록하는 웹 애플리케이션. 톰캣이 인지하는 하나의 애플리케이션.

 

지금 컨텍스트는 webEx이다.

웹 애플리케이션과 컨텍스트 이름이 꼭 같을 필요는 없지만 웬만하면 통일을 시킨다.

 

브라우저에서 요청 시 컨텍스트(webEx)를 생략하는 방법

Servers 더블 클릭 -> modules -> Edit -> Path에서 webEx 지워주면 http://localhost:8080만 해도 main.jsp 요청된다.

 


Servlet 기초

서블릿(Servlet): 서버 쪽에서 실행되면서 클라이언트 요청에 따라 동적으로 서비스를 제공하는 자바클래스.
독립적으로 실행되지 못하고 톰캣과 같은 JSP/servlet 컨테이너에서 실행된다.

 

  • 서버 쪽에서 실행되면서 웹 브라우저 요청 시 기능을 수행
  • 기존 정적 웹 프로그램의 문제점을 보완하여 동적인 기능을 제공
  • 모든 메소드는 스레드 방식으로 실행
  • 자바로 만들어져 자바의 특징(객체지향)을 가짐
  • 컨테이너에서 실행. 컨테이너 종류에 상관없이 실행 – 플랫폼 독립적
  • javax.servlet.http 패키지의 HttpServlet 클래스를 상속받음

 

서블릿 생명주기

클라이언트가 서블릿에 요청을 하면 서블릿은 자바 클래스이기 때문에 초기화, 서비스 수행, 소멸 과정을 거친다.

각 과정에서 서블릿 생명주기 메서드가 호출되어 기능을 수행한다.

  1. 요청 시 서블릿 객체 생성
  2. 서버는 init() 메서드 호출하여 서블릿 초기화
  3. service() 메서드(doGet(), doPost() 등) 호출하여 서블릿이 브라우저의 요청을 처리
  4. 서버는 destroy() 메서드 호출하여 서블릿 제거 (톰캣 서버 종료시키면 호출됨)

 

첫번째 서블릿 만들기

New -> Dynamic web Project 생성하고,

서블릿을 만들거기 때문에 Build Path를 설정해준다. -> Add External JARs해서 tomcat 폴더 안에 있는 servlet-api.jar 파일을 열어서 적용해준다.

 

그리고 src/main/java 안에 FirstServlet.java 파일을 만든다.

 

package ex01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {
    public void init() throws ServletException {
        System.out.println("init 메소드 호출");
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메소드 호출");
    }

    public void destory() {
        System.out.println("destory 메소드 호출");
    }
}

 

그리고 web.xml 파일에서 위의 서블릿을 매핑한다.

<!-- welcome-file-list 태그 이후 아래에 추가 -->
<servlet>
      <servlet-name>aaa</servlet-name>
      <servlet-class>ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>aaa</servlet-name>
      <url-pattern>/first</url-pattern>
  </servlet-mapping>

 

그리고 브라우저에서 localhost:8080/ServletEx/first 으로 서블릿 요청하면 init 메서드, doGet 메서드가 호출되어 콘솔에 출력된다.

 

서블릿 기능 수행 과정

클라이언트로부터 요청을 받아 비즈니스 로직을 처리하고, 그 결과를 다시 클라이언트에게 돌려준다.

요청, 응답과 관련된 API는 모두 javax.servlet.http 패키지에 있다.

 

서블릿에서 클라이언트 요청 받기

로그인을 요청했을 때 아이디와 비밀번호가 콘솔에 출력되는 실습을 해보자.

 

우선 webapp 폴더 밑에 login.html 파일을 생성한다.

<form> 태그로 서블릿을 요청한다.

action 속성에 데이터를 전송할 서블릿이나 jsp를 지정한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
    <form name="frmLogin" method="get" action="login" encType="UTF-8">
        아이디 : <input type="text" name="user_id"><br>
        비밀번호 : <input type="password" name="user_pw"><br>
        <input type="submit" value="로그인"> <input type="reset" value="다시입력">
    </form>
</body>
</html>

 

 

그리고 LoginServlet.java 파일을 만든다.

package ex01;

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

// 애너테이션(@)으로 소스에 직접 서블릿 매핑을 설정한다
// /login 요청이 들어오면 이 서블릿이 실행된다
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    public void init() {
        System.out.println("init 메소드 호출");
    }

    // 웹 브라우저에서 전송한 정보를 톰켓 컨테이너가 HttpServletRequest 객체 생성해서 doGet()으로 넘겨줌
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 클라이언트에게 html로 응답할거고 인코딩 타입은 utf-8로 설정
        response.setContentType("text/html;charset=utf-8");
        // getParameter()를 이용해 input 태그의 name 속성 값으로 전송된 value를 받아옴
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        // 콘솔에 출력
        System.out.println("아이디 : " + user_id);
        System.out.println("비밀번호 : " + user_pw);
    }

    public void destory() {
        System.out.println("destroy 메소드 호출");
    }
}

 

<form> 태그로 전송된 데이터를 받는 메서드
  • String getParameter(String name) : name 값을 알고 있을 때 name에 대한 전송된 값을 받아오는데 사용
  • String[] getParameterValues(String name) : 같은 name에 대해 여러 개의 값을 얻을 때 사용
  • Enumeration getParameterNames() : name 값 모를 때, 넘어오는 데이터가 많을 때 사용

 


❕느낀점

TIL을 작성하면서 다시 오늘 배운 내용을 복습해보니 어려웠던 내용이 조금씩 이해되고 있다.

서블릿을 실습해보며 느낀점은 너무 비효율적이라는 것이다. ㅋㅋㅋ 서블릿, JSP가 현재 쓰이지 않는 이유를 직접 체감하며 깨달았다.

그래도 이 부분이 확실히 이해가 되어야 스프링, 타임리프도 잘 습득할 수 있기 때문에 열심히 배워야겠다.

파이팅~~

'Backend > Java' 카테고리의 다른 글

[TIL-260311] Servlet & JSP 입문: 커넥션 풀, JSP 정의, JSP 스크립트  (1) 2026.03.12
[TIL-260310] Servlet & JSP 입문: 서블릿의 응답 처리, DB 연동  (0) 2026.03.10
[TIL-260306] Servlet & JSP 입문: 자바와 웹, 웹 애플리케이션, HTTP  (0) 2026.03.08
[TIL-260212] 자바 기초: 내부 클래스, 스레드, 람다, 스트림  (0) 2026.02.17
[TIL-260211] 자바 기초: 예외처리와 제네릭, 컬렉션 프레임워크  (0) 2026.02.17
'Backend/Java' 카테고리의 다른 글
  • [TIL-260311] Servlet & JSP 입문: 커넥션 풀, JSP 정의, JSP 스크립트
  • [TIL-260310] Servlet & JSP 입문: 서블릿의 응답 처리, DB 연동
  • [TIL-260306] Servlet & JSP 입문: 자바와 웹, 웹 애플리케이션, HTTP
  • [TIL-260212] 자바 기초: 내부 클래스, 스레드, 람다, 스트림
hee-on
hee-on
작은 기록을 모아 꾸준히 성장해 나가는 개발 기록 공간입니다💻
  • hee-on
    희온의 dev log
    hee-on
  • 전체
    오늘
    어제
    • 전체 글 (52) N
      • About (2)
      • Backend (33) N
        • Java (15)
        • Spring (6)
        • DB (8) N
        • Architecture & Design (4) N
      • Frontend (6)
      • CS (6)
        • Algorithm (2)
        • Do it 알고리즘 코딩테스트 (자바편) (4)
        • Network (0)
        • Operating System (0)
      • DevOps (1)
        • Git (1)
        • CI-CD (0)
        • Docker (0)
        • AWS (0)
      • AI (1)
      • 일상 || 잡담 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    db
    백준
    소개
    개발자
    SpringBoot
    Servlet
    블로그
    알고리즘
    MVC
    ClaudeAPI
    react
    코테
    취준
    Spring
    Java
    til
    SQL
    JavaScript
    백엔드
    JSP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hee-on
[TIL-260309] Servlet & JSP 입문: JSP 실습, Servlet 기초
상단으로

티스토리툴바