자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 38. 서블릿(Servlet) 작성 - web.xml에 기술하여 매핑하는 방법, @WebServlet 어노테이션으로 매핑하는 방법

개발학생 2025. 4. 29. 17:45
반응형

*JAVA/JSP 35번 글의 시점부터는 노트북이 고장나는 바람에.. 다른 분의 글과 이전에 올렸던 글들을 참고하여, 다른 데스크탑의 윈도우 환경에 환경설정을 다시 진행한 후 작성하였습니다. 환경설정 관련 글들은 아래를 참고해 주세요.

  • JDK11 설치 및 환경 변수(JAVA_HOME) 설정 - CLASSPATH는 추가하지 않음
 

자바(JAVA) 11 설치 및 환경설정 | 자바 11 환경 변수

자바로 코딩 공부를 하려면 개발 할 수 있는 환경을 만들어 주어야 한다. 그 순서를 먼저 작성하자면JAVA SE JDK 설치 -> JAVA 환경 변수 설정 -> IDE 설치 이렇게 볼 수 있겠다. 이 포스팅은 자바로 개

velog.io

  • 톰캣 설치, 이클립스 설치 - 이 글을 쓰는 시점에서는 Tomcat 8버전이 없어, Tomcat 9버전 설치
 

JSP) JDK, 이클립스(eclipse), 톰캣 설치 및 환경 설정

1. JDK 설치 → Path 설정 2.eclipse JAVA EE버전 다운로드 3.웹컨테이너 톰캣 설치 →톰캣 환경설정 1. JDK 설치 - JAVA) 1. JDK 참고하여 설치하고 설정한다. -https://storyblogger.tistory.com/15?category=984696 2. 구글에

storyblogger.tistory.com

  • 이클립스 JDK 버전 설정 - JDK11로 설정
 

[이클립스] JDK 버전 바꾸는 법

스프링을 사용하는 에러가 난다? 그러면 JRE 버전을 확인해보자! 프로젝트의 JRE System Library의 오른쪽을 살펴보면 [JavaSE-17]이라고 되어있다. 스프링이나 하이버네이트를 사용할 때, 자바 8이나 자

myvelop.tistory.com

  • JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치 및 JDK 버전 설정 이후~ ⇒ 톰캣 버전과 jsp 파일 경로는 글 내용과 다르게 아래 이미지와 같음

 

JAVA/JSP 1. 개발 환경 구축 - 이클립스 기본 설정

*JDK 설치 및 환경 변수(JAVA_HOME) 설정, 톰캣 설치, 이클립스 설치를 완료한 상태OpenJDK 11: 자바 프로그램을 컴파일하고 실행해주는 기본 도구*이클립스 JDK-17이 설치되어있어서, https://coding-house.tisto

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - JSP 예제 테스트

1. 프로젝트 생성1) [File] → [New] → [Dynamic Web Project] 선택 2) 프로젝트 설정 화면 → Project name: HelloJSP, Target runtime: Apache Tomcat v9.0, Dynamic web module version: 4.0으로 설정 후 Next 클릭 3) 자바 소스 파일

keep-programming-study.tistory.com

 

 

JAVA/JSP 1. 개발 환경 구축 - 마지막 추가 설정

1. 외부 웹 브라우저로 실행하기-크롬이클립스는 웹 애플리케이션 실행 시, 자체 브라우저를 통해 실행 결과 출력웹 애플리케이션 배포 시 사용자는 크롬/파이어폭스 같은 전용 웹 브라우저로

keep-programming-study.tistory.com

  • 오라클(Oracle Database 11gR2 Express Edition) 설치 및 설정 
 

JAVA/JSP 14. 데이터베이스 - 특징, 오라클 설치(Oracle Database 11gR2 Express Edition), 사용자 계정 생성 및

1. 데이터베이스의 특징우리가 매일 PC나 스마트폰을 통해 접하는 거의 모든 웹 애플리케이션에서 사용함매일 업데이트되는 뉴스나 날씨 등의 정보는 데이터베이스가 없다면 클라이언트에 전달

keep-programming-study.tistory.com

 

 

 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

JAVA/JSP 16. 데이터베이스 - 커넥션 풀로 성능 개선, 간단한 쿼리 작성 및 실행

6. 커넥션 풀로 성능 개선웹은 클라이언트의 요청에 서버가 응답하는 구조→ Connection 객체 생성 때마다 네트워크 통신이 이뤄지며, 시간이 걸리는 작업들이 수반됨 == 시스템 성능에 큰 영향을

keep-programming-study.tistory.com

  • 시퀀스 설정
 

JAVA/JSP 15. 데이터베이스 - 테이블 및 시퀀스 생성, JDBC 설정 및 데이터베이스 연결

*회원제 게시판 만들기-회원 인증 필요4. 테이블 및 시퀀스 생성1) 테이블 생성(1) member 테이블 - 아이디, 패스워드, 이름, 가입 날짜테이블 정의컬럼명데이터 타입 null 허용 키 기본값 설명idvarchar2

keep-programming-study.tistory.com

 

서블릿 작성 개요

서블릿 작성은 클라이언트의 요청을 전달할 '요청명'을 결정하는 일부터 시작

JSP에서는 클라이언트의 요청을 JSP가 직접 받아 처리하는 반면,
서블릿은 요청명을 기준으로 이를 처리할 서블릿 선택
-> 매핑(Mapping): web.xml에 기술하는 방법 or @WebServlet 어노테이션을 써서 코드에 직접 명시하는 방법

 

1. web.xml에 기술하여 매핑하는 방법

  • 형식
<servlet>    <!-- 서블릿 등록 -->
  <servlet-name>서블릿명</servlet-name>
  <servlet-class>패키지를 포함한 서블릿 클래스명</servlet-class>
</servlet>
<servlet-mapping>    <!-- 서블릿과 요청명(요청 URL) 매핑 -->
  <servlet-name>서블릿명</servlet-name>
  <url-pattern>클라이언트 요청 URL</url-pattern>
</servlet-mapping>

예제

// src/main/webapp/HelloServlet.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HelloServlet.jsp</title>
</head>
<body>
  <h2>web.xml에서 매핑 후 JSP에서 출력하기</h2>
  <p>
    <!-- 1. request 영역에 저장한 message 속성 출력(서블릿에서 저장함)-->
    <strong><%= request.getAttribute("message") %></strong>  
    <br />
    <!-- 2. 바로가기 URL: 서블릿 요청명으로 지정 -->
    <a href="./HelloServlet.do">바로가기</a>  
  </p>
</body>
</html>
  • web.xml에 매핑 정보 추가 
// src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>HelloJSP</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  <servlet> <!-- 서블릿 등록 -->
  	<servlet-name>HelloServlet</servlet-name>  <!-- 1. 서블릿 매핑을 위한 서블릿명 -->
  	<servlet-class>servlet.HelloServlet</servlet-class>  <!-- 2. 요청을 처리할 서블릿을 패키지를 포함하여 명시 -->
  </servlet>
  <servlet-mapping>  <!-- 서블릿과 요청명 매핑 -->
  	<servlet-name>HelloServlet</servlet-name>  <!-- 3. 1과 동일한 서블릿명 -->
  	<url-pattern>/HelloServlet.do</url-pattern>  <!-- 4. 컨텍스트 루트를 제외한 요청명 작성 -->
  </servlet-mapping>
</web-app>
  • 실제 요청을 처리할 서블릿 클래스 작성 
// Java Resources/src/servlet/HelloServlet.java
package servlet;

import java.io.IOException;

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

// 1, HelloServlet 클래스를 servlet 패키지에 생성한 후 HttpServlet 클래스 상속
public class HelloServlet extends HttpServlet {
	// 2. doGet() 메서드를 오버라이딩
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException, ServletException{
		// 3. request 영역에 message라는 속성으로 데이터 저장
		req.setAttribute("message", "Hello Servlet");
		// 4. HelloServlet.jsp로 포워드(req는 doGet() 메서드의 매개변수로 전달받은 request 내장 객체)
		req.getRequestDispatcher("/HelloServlet.jsp").forward(req, resp);
	}
}

HelloServlet.jsp 실행

request 영역에 아직 아무 데이터도 저장되지 않았으므로 null이 뜸

  • [바로가기] 클릭 시

서블릿이 요청을 처리한 후 공유한 데이터 출력

2. @WebServlet 어노테이션으로 매핑하는 방법

예제

  • 요청명을 통한 바로가기 링크가 있는 JSP를 먼저 작성
// src/main/webapp/AnnoMapping.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AnnoMapping.jsp</title>
</head>
<body>
  <h2>어노테이션으로 매핑하기</h2>
  <p>
    <!-- 1. EL을 이용해 request 영역에 저장된 데이터 출력 -->
    <strong>${ message }</strong>
    <br />
    <!-- 2. 컨텍스트 루트 경로(/HelloJSP)를 반환하고, 요청명을 합쳐 바로가기 링크 완성 -->
    <a href="<%= request.getContextPath() %>/AnnoMapping.do">바로가기</a>
  </p>
</body>
</html>
  • 서블릿 클래스 작성
// Java Resources/src/servlet/AnnoMapping.java
package fileupload;

import java.io.IOException;

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

// 1. 어노테이션으로 이 서블릿이 요청명 "AnnoMapping.do"를 처리할 것임을 선언
@WebServlet("/AnnoMapping.do")
// 2. 서블릿이므로 HttpServlet을 상속
public class AnnoMapping extends HttpServlet {
  // 3. doGet() 메서드 오버라이딩
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException{
    // 4. request 영역에 데이터 저장
    req.setAttribute("message", "HelloServlet");
    // 5. AnnoMapping.jsp로 포워드
    req.getRequestDispatcher("/AnnoMapping.jsp").forward(req, resp);
  }
}

AnnoMapping.jsp 실행

request 영역에 아직 아무 데이터도 저장되지 않았으므로 값이 출력되지 않음

  • [바로가기] 클릭 시

마찬가지로, 서블릿이 요청을 처리한 후 공유한 데이터 출력

*web.xml 방식과 비교

  • 비교적으로 편리함
  • 요청명(url-pattern)이 변경되면 해당 서블릿 클래스를 수정하고 다시 컴파일
    -> 요청명만으로 서블릿 클래스명을 바로 알 수 있도록 둘 사이에 명확한 이름 규칙을 정하는 것이 중요 
  • 서블릿 개수가 많아지면, 특정 요청명을 처리하는 클래스를 찾기 어려워짐(클래스를 일일이 열어 확인)
    -> 요청을 검색할 방법이 없으므로, 요청명과 클래스명을 매핑해주는 일정한 패턴이 없다면 유지보수하기 더 어려울 수 있음

 

 

반응형