본문 바로가기

Programming/국비학원

220921 - 서버 - 서블릿 매핑, 응답 및 요청 처리

서블릿 매핑

: 서블릿의 URL주소(full path)를 보안성, 편리성 제고 위해 간결하게 표시

http://IP주소:포트번호/프로젝트이름/패키지이름포함된클래스이름

 

 

 

 

  • 1. web.xml 설정 수정 

=> 여러 서블릿 사용 시 복잡해짐

 

 

 

  • FirstServlet.java
package servlet01.ex01;

import java.io.IOException;

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

public class FirstServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//요청, 응답 리턴
		System.out.println("doGet 메소드 호출됨");
	}

	@Override
	public void destroy() {
	//서블릿 제거
		System.out.println("destroy 메소드 호출됨");
	}

	@Override
	public void init() throws ServletException {
	//초기화 작업 //서블릿이 서비스에 배치되고 있음을 나타냄
		System.out.println("init 메소드 호출됨");
	}

}

 

 

 

  • 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>servlet01</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>delivery</servlet-name>
  	<servlet-class>servlet01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>delivery</servlet-name>
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
</web-app>

 

 

=> http://127.0.0.1:8080/servlet01/first

 

 

 

  • SecondServlet.java
package servlet01.ex01;

import java.io.IOException;

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

public class SecondServlet extends HttpServlet {

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

	@Override
	public void destroy() {
		System.out.println("second의 destroy 메소드 호출");
	}

	@Override
	public void init() throws ServletException {
		System.out.println("second의 init 메소드 호출");
	}

}

 

 

 

  • 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>servlet01</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>delivery</servlet-name>
  	<servlet-class>servlet01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet>
  	<servlet-name>delivery2</servlet-name>
  	<servlet-class>servlet01.ex01.SecondServlet</servlet-class>
  </servlet>  
  <servlet-mapping>
  	<servlet-name>delivery</servlet-name>
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>delivery2</servlet-name>
  	<url-pattern>/second</url-pattern>
  </servlet-mapping>  
</web-app>

 

 

 

 

  • 2. java 소스코드에 annotation 설정

패키지 우클릭 - new servlet - next - urlmapping (/third) 수정

=> 오류 (톰캣 8,9버전 기준이라서 예전 패키지 import함)

=> new servlet 대신 class 로 작성 시 해결됨 (or 패키지명만 jakarta로 변경)

 

 

 

  • ThirdServlet.java
package servlet01.ex01;

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


@WebServlet("/third") ////
public class ThirdServlet extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("third에서 init 메소드 호출");
	}

	public void destroy() {
		System.out.println("third에서 init 메소드 호출");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("third에서 doGet 메소드 호출");
	}

}

 

 

 

 

서블릿 동작 과정
  •  

사용자(클라이언트)가 웹브라우저 실행 (url)
로그인으로 id, 비번 값 서블릿으로 전달 => 요청
서블릿은 데이터베이스 조회
데이터베이스에서 서블릿으로 결과값 전달
서블릿은 클라이언트에 응답값 (ex. 로그인되었습니다) 전달 => 응답

 

 

 

 

서블릿 요청 처리
  • 로그인
  • webapp/login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
	<h2>로그인 창</h2>
	<form action="login" method="get" name="formLogin">
		<label for="user_id">아이디</label>
		<input type="text" id="user_id" name="user_id"><br> 
		<!-- name : 서버로 전달되는 변수 -->
		<label for="user_pw">비밀번호</label>
		<input type="text" id="user_pw" name="user_pw"><br>
		<input type="submit" value="로그인">
		<input type="reset" value="다시입력"> 		
	</form>
</body>
</html>

 

 

 

  • LoginServlet.java
package servlet01.ex01;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메소드 호출됨");
	}

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//우선 요청만 처리
		request.setCharacterEncoding("utf-8");
		//getParameter() : name(user_id)에 해당하는 값(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);
	}

}

 

 

=> http://127.0.0.1:8080/servlet01/login.html

 

 

 

 

  • 체크박스
  • webapp/input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>여러 타입 전송 창</title>
</head>
<body>
	<h2>로그인 창</h2>
	<form action="input" method="get" name="formInput">
		<label for="user_id">아이디</label>
		<input type="text" id="user_id" name="user_id"><br> 
		<fieldset>
			<legend>특강신청</legend>
			<input type="checkbox" name="subject" value="자바">자바
			<input type="checkbox" name="subject" value="C언어">C언어
			<input type="checkbox" name="subject" value="react">리액트
			<input type="checkbox" name="subject" value="android">안드로이드
			<input type="checkbox" name="subject" value="oracle">오라클
		</fieldset>
		<input type="submit" value="신청하기">
		<input type="reset" value="다시입력"> 		
	</form>
</body>
</html>

 

 

 

  • InputServlet.java
package servlet01.ex01;

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


@WebServlet("/input")
public class InputServlet extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메소드 호출됨");
	}

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String id = request.getParameter("user_id");
		System.out.println(id + "님 특강 신청 완료");
		String[] subject = request.getParameterValues("subject"); 
		//해당 name에 해당하는 여러 값(value)을 배열로 받음
		for (String sub:subject) {
			System.out.println("신청한 과목 : "+sub);
		}
	}

}

 

 

 

 

  • getParameterNames()

: 모든 태그의 name 속성값(key)을 Enumeration 객체로 리턴

 

=> 일괄 처리 메소드 (다양한 타입, 많은 입력 데이터 받을 수 있음)

=> 활용해 key, value 값 모두 얻기 가능

 

 

 

  • input2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="input2" method="get" name="formLogin">
		<label for="user_id">아이디</label>
		<input type="text" id="user_id" name="user_id"><br> 
		<label for="user_pw">비밀번호</label>
		<input type="text" id="user_pw" name="user_pw"><br>
		<label for="user_email">비밀번호</label>
		<input type="text" id="user_email" name="user_email">
		<fieldset>
			<legend>특강신청</legend>
			<input type="checkbox" name="subject" value="자바">자바
			<input type="checkbox" name="subject" value="C언어">C언어
			<input type="checkbox" name="subject" value="react">리액트
			<input type="checkbox" name="subject" value="android">안드로이드
			<input type="checkbox" name="subject" value="oracle">오라클
		</fieldset>
		<input type="submit" value="신청하기">
		<input type="reset" value="다시입력"> 	
	</form>
</body>
</html>

 

 

 

  • InputServlet2.java
package servlet01.ex01;

import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.util.Enumeration;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {
	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메소드 호출됨");
	}

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		Enumeration enu = request.getParameterNames(); //여러 종류 값 받기 때문에 제네릭 뺌 //매개변수 이름 전달
		while(enu.hasMoreElements()) {
			String name = (String)enu.nextElement(); //key //하나씩 요소 전달
			String[] values = request.getParameterValues(name); //value들 배열에 전달
			for (String val : values) {
				System.out.println("name = "+ name + " 값 = "+val);
			}
		}
	}

}

 

 

 

 

서블릿 응답 처리

서블릿(서버) -> 웹 브라우저로 데이터 전송 시, 웹브라우저에 데이터 종류 미리 알려줘야 함

MIME-TYPE : 톰캣 컨테이너(웹서버)에서 미리 설정한 데이터 종류
ex. html 전송 시 text/html

새로운 데이터 종류 지정 시 톰캣 서버/web.xml에 mime-mapping 추가

 

 

 

  • 로그인
  • login2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
	<h2>로그인 창</h2>
	<form action="login2" method="get" name="formLogin">
		<label for="user_id">아이디</label>
		<input type="text" id="user_id" name="user_id"><br> 
		<label for="user_pw">비밀번호</label>
		<input type="text" id="user_pw" name="user_pw"><br>
		<input type="submit" value="로그인">
		<input type="reset" value="다시입력"> 		
	</form>
</body>
</html>

 

 

 

  • LoginServlet2.java
package servlet01.ex02;

import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메소드 호출됨");
	}

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8"); //mime-type 지정
		PrintWriter out = response.getWriter();
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String data = "<html>";
		data += "<body>";
		data += "<p>접속한 아이디는 " + id + "입니다";
		data += "<p>비밀번호는 " + pw + "입니다";
		data += "</body>";
		data += "</html>";
		out.print(data); //print() 통해 html 태그를 웹브라우저로 보냄
	}

}

 

=> http://127.0.0.1:8080/servlet01/login2.html

=> 입력, submit 시 브라우저에 문구 표시

접속한 아이디는 aa입니다

비밀번호는 bb입니다


 

 

※ getWriter()
서블릿의 응답 형태 => 바이트 or 문자 가능
문자 형태로 응답하려면 데이터의 흐름(Stream)을 컨트롤해야 함 (문자로 응답 보내도록 설정해야 함)
HttpServletResponse 인터페이스의 상위 인터페이스인 ServletResponse의 getWriter() 메소드 호출 

=> 스트림에 텍스트 기록 가능