반응형

 

서블릿

 

: jsp 표준으로 웹 어플리케이션 개발을 위해 만들어진 표준이다. 

 

 

=> 자바 프로젝트가 아닌 아래의 방식으로 프로젝트를 생성한다.

 

 

 

이클립스 서블릿 설정 (정석)

 

 

  • 파일 생성 시 필요한 기본 설정 (-> 더 쉬운 방법이 존재. 하단에 기술)

Ctrl+N > web 검색 > Dynamic Web Project 클릭 후 Finish > 이름 입력 후 Finish

 

폴더 생성 확인

 

servlet-api.jar 파일을 폴더에 붙여 넣고 Buil Path를 다시 잡는다.

 

 

 

=> 톰캣에 배포하기 위해선 WAR 파일을 준비해야함.

export로 빼내어 톰켓을 깐 폴더의 webapps에 넣음 > 톰켓의 bin에서 cmd 실행 후 start.bat 입력 > 작동 확인 후 url 입력

 

  • 톰캣 배포시 필요한 설정 (-> 더 쉬운 방법이 존재. 하단에 기술)

1. Libraries

폴더에 오른쪽 마우스 클릭 > Java EE Tools > Update EAR Libraries

 

 

2. Export

폴더에 오른쪽 마우스 클릭 > Export > WAR file

 

톰캣의 webapps 에 Export한 파일 옮기기

 

bin 위치에서 startup.bat 실행

 

url을 입력하여 확인할 수 있다.

 

톰캣 실행 화면에서 System.out.println내용을 확인 가능

 

 

 

이클립스 서블릿 설정 (편리를 위해 더 자주 사용함)

 

 

=> 배포마다 위와 같은 식으로 매번 할 수는 없기에 플로깅 방식으로 진행한다.

 

  • 플로깅 방식

Servers > No servers are (중략) 클릭

 

톰캣 선택 > Next 클릭

 

왼쪽에 있는 프로젝트 선택 > Add 클릭 > Finish

 

실행 후 url 입력

 

확인 가능 콘솔 화면 : 다시 url을 입력 시 service와 doGet만 호출됨

 

 

 

  • Apache Tomcat 기본 설정

오른쪽 마우스 클릭 > Build Path > Configure Build Path 클릭

 

Libraries > Add Library

 

Server Runtime > Next

 

Apache Tomcat > Finsh

 

Apply and Close 클릭

 

 

 

서블릿 동작 방식

 

 

1. 사용자(클라이언트)가 URL 클릭 > HTTP 요청메시지를 서블릿 컨테이너로 전송

2. 서블릿 컨테이너가 web.xml에 정의된 URL패턴 확인 + 어느 서블릿을 통해 처리해야 할지 검색
(로딩이 아직 안 된 경우에는 로딩 작업이 발생함. 로딩시 init()메서드 호출됨.)

3. (서블릿 컨테이너가) 요청을 처리할 개별 스레드 객체를 생성 > service()메서드 호출
(HttpServletRequest 및 HttpServletResponse 객체를 생성하여 넘겨준다.)

4. (service() 메서드는) 메서드 타입을 확인 > 적절한 메서드 호출
(doGet, doPut, doDelet 등)

5. 요청 처리가 완료되면 HttpServletRequest 및 HttpServletResponse 객체 소멸

6. 컨테이너로부터 서블릿이 제거되는 경우 destroy() 메서드 호출

 

 

 

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 T01ServletLifeCycle extends HttpServlet{
	/*
	 * 서블릿이란?
	 * 서블릿 컨테이너(서블릿 엔진)에 의해 관리되는 자바기간 웹 컴포넌트로서, 동적인 웹컨테츠 생성을 가능하게 해준다.
	 */
	
	public T01ServletLifeCycle() {
		// 생성자
		System.out.println("[T01ServletLifeCycle] 생성자 호출됨");
	}
	
	@Override
	public void init() throws ServletException {
		// 초기화 코드 작성...
		System.out.println("[T01ServletLifeCycle] init() 호출됨");
	}
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		// 실질적인 서비스 처리가 시작되는 곳... (자바의 메인 메서드 역할)
		System.out.println("[T01ServletLifeCycle] service 호출됨");
		super.service(arg0, arg1);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//메서드 방식이 GET 방식인 경우 호출함 
		System.out.println("[T01ServletLifeCycle] doGet 호출됨");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 메서드 방식이 POST 인 경우 호출함
		System.out.println("[T01ServletLifeCycle] doPost 호출됨");
	}
	
	@Override
	public void destroy() {
		// 서블릿 객체 소멸시(컨테이너로부터 서블릿 객체 제거시) 필요한 코드 작성
		System.out.println("[T01ServletLifeCycle] destroy 호출됨");
	}
}

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
</head>
<body>
	<p> 방가방가 메인페이지 입니다... </p>
</body>
</html>

 

=> web.xml에 아래와 같이 설정을 해줘야 함

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>ServletTest</display-name>
  
  <servlet>
  	<servlet-name>T01ServletLifeCycle</servlet-name>
  	<servlet-class>kr.or.ddit.basic.T01ServletLifeCycle</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>T01ServletLifeCycle</servlet-name>
  	<url-pattern>/T01ServletLifeCycle</url-pattern>
  </servlet-mapping>
</web-app>

 

결과 화면1-1

 

결과 화면1-2

 

 

package kr.or.ddit.basic;

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 T02ServletTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// Request 객체 메서드
		System.out.println("getCharacterEncoding() : " + req.getCharacterEncoding());
		System.out.println("getContentLength() : " + req.getContentLength());
		System.out.println("getQueryString() : " + req.getQueryString());
		System.out.println("getProtocol() : " + req.getProtocol());
		System.out.println("getMethod() : " + req.getMethod());
		System.out.println("getRequestURI() : " + req.getRequestURI());
		System.out.println("getRemoteAddr() : " + req.getRemoteAddr());
		System.out.println("getRemotePort() : " + req.getRemotePort());
		
		String name = req.getParameter("name"); // 요청 메시지로부터 name값 가져오기
		
		System.out.println("name => " + name);
		
		// 요청객체에 정보 저장하기
		req.setAttribute("tel", "5555-5555");
		req.setAttribute("addr", "대전시");
		
		// 요청객체에서 저장된 정보 가져오기
		System.out.println("tel => " + req.getAttribute("tel"));
		System.out.println("addr => " + req.getAttribute("addr"));
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
	}
}

 

사용한 URL - get 방식

 

결과 화면2

 

 

 

서블릿 파라미터 테스트

 

 

- 요청 메시지로부터 파라미터 데이터 가져오는 방법

getParameter() - 파라미터값이 한개인 경우에 사용함.
getParameterValues() - 파라미터값이 여러개인 경우에 사용함 ex)checkbox
getParameterName() - 요청 메시지에 존재하는 모든 파라미터 이름을 가져올때 사용함.

 

 

 

formdata.html

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>입력폼 예제</title>
</head>
<body>
   <form method="post" action="/ServletTest/T03ServletParameterTest">
    <label for="username">유저명:</label><br>
    <input type="text" name="username" id="username"><br>
    <label for="password">패스워드:</label><br>
    <input type="password" name="password" id="password"><br>
    <hr>
    <label for="birthDay">생년월일:</label><br>
    <input type="date" name="birthDay" id="birthDay"><br>
    <hr>
    <input type="radio" id="male" name="gender" value="male">
    <label for="male">Male</label><br>
    <input type="radio" id="female" name="gender" value="female">
    <label for="female">Female</label><br>
    <input type="radio" id="other" name="gender" value="other">
    <label for="other">Other</label><br>
    <hr>
    <input type="checkbox" id="cb01" name="hobby" value="ch01">
    <label for="cb01">낚시</label>
    <input type="checkbox" id="cb02" name="hobby" value="ch02">
    <label for="cb02">등산</label>
    <input type="checkbox" id="cb03" name="hobby" value="ch03">
    <label for="cb03">하이킹</label>
    <input type="checkbox" id="cb04" name="hobby" value="ch04">
    <label for="cb04">독서</label><br>
    <hr>
    <label for="rlgn">종교</label>
    <select id="rlgn" name="rlgn">
    	<option value="01">불교</option>
    	<option value="02">기독교</option>
    	<option value="03">힌두교</option>
    	<option value="04">기타</option>
    </select>
    
    <hr>
    <label for="food">좋아하는 음식</label>
    <select id="food" name="food" multiple="multiple">
    	<option value="01">소고기</option>
    	<option value="02">돼지고기</option>
    	<option value="03">물고기</option>
    	<option value="04">채식</option>
    </select>
    
	<br>
	<br>
    <input type="submit" value="Submit">
   </form> 
</body>
</html>

 

package kr.or.ddit.basic;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

public class T03ServletParameterTest extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		/*
		 * 요청 메시지로부터 파라미터 데이터 가져오는 방법
		 * 
		 * - getParameter() - 파라미터값이 한개인 경우에 사용함.
		 * - getParameterValues() - 파라미터값이 여러개인 경우에 사용함 ex)checkbox
		 * - getParameterName() - 요청 메시지에 존재하는 모든 파라미터 이름을 가져올때 사용함.
		 */
		
		// getParameter() 호출 전에 설정해야 함.
		req.setCharacterEncoding("UTF-8");
        
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		String gender = req.getParameter("gender");
		String hobby = req.getParameter("hobby");
		String rlgn = req.getParameter("rlgn");

		String[] food = req.getParameterValues("food"); // 여러개의 값이 동일한 name으로 들어올 시 사용
		
		///////////////////////////////////////////////

		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
        
		PrintWriter out = resp.getWriter();
		out.print("<html><body><p>" + username + "</p>"
					+ "<p>" + password + "</p>"
					+ "<p>" + gender + "</p>"
					+ "<p>" + hobby + "</p>"
					+ "<p>" + rlgn + "</p>");
		
		if(food != null) {
			for (String f : food) {
				out.print("<p>food : " + f + "</p>");
			}
		}
		
		// 모든 파라미터 정보 가져오기
		Enumeration<String> paramNames = req.getParameterNames();
		while(paramNames.hasMoreElements()) {
			String param = paramNames.nextElement();
			out.print("<p>파라미터 정보 : " + param + " => "
					+ req.getParameter(param) + "</p>");
		}
		out.print("</body></html>");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

 

post 방식으로 데이터 전송

 

결과 화면3 : UTF-8 설정을 하지 않을 시 한글 깨짐(setCharacterEncoding와 setContentType)

 

 

+ UTF-8 설정 3가지

// 1.
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");

// 2.
resp.setContentType("text/html;charset=UTF-8");

// 3.
resp.addHeader("Content-Type", "text/html;charset=UTF-8");

 

 

반응형

'자바' 카테고리의 다른 글

[Java 고급] 28장 세션  (1) 2024.02.21
[Java 고급] 27장 쿠키  (0) 2024.02.21
[Java 고급] 25장 UDP 방식의 통신, HTTP 통신  (0) 2024.02.16
[Java 고급] 24장 TCP 방식의 통신  (0) 2024.02.16
[Java 고급] 23장 소켓  (1) 2024.02.15