본문 바로가기
다양한 기술들/Web 관련

[서블릿] 실습 : form태그를 통한 HTTP 통신

by 예스p 2023. 1. 10.

이클립스 실습 : Form을 통한 실습

HTML 파일을 만들어 form태그로 소스를 작성 한 후

서블릿과 연동하여 작동 원리를 확인해보는 과정을 단계별로 해보자


 

1) 서블릿 소스파일 만들기

  1. 서버세팅과 이클립스 프로젝트 세팅을 마친다
    관련 포스팅 : 61번 포스팅
  2. 서블릿 생성하기
    - 이클립스 패키지 오른클릭 new > Servlet
    - 서블릿이 저장되는 패키는 보통 controller (src/main/java/com/rh/controller) 
    - 클래스명은 대문자로 짓는다.
  3. 매핑값 입력하기
    - Next를 눌러 URL mappings에 연결시킬 매핑값을 입력한다 ( /test1.do )
    - 생성된 소스파일에서 @WebServlet 어노테이션이 ("/test1.do") 으로 자동 설정됨
    - url/contextPath/매핑값 으로 요청 시 해당 서블릿이 구동된다.
    - 매핑값은 서블릿간에 중복되어서는 안된다.
    - form의 action에 들어가는 값이다.
package com.rh.controller;

import javax.servlet.ServletException;
...

@WebServlet("/test1.do")
public class Test1Servlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // doGet 메소드 : GET 요청을 처리
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 요청 처리 로직을 여기에 작성합니다.
        response.getWriter().write("Hello from Test1Servlet - GET method!");
    }

    // doPost 메소드 : POST 요청을 처리
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 요청 처리 로직을 여기에 작성합니다.
        response.getWriter().write("Hello from Test1Servlet - POST method!");
    }
}

 

 

 

2) form 태그 작성하기 

  • form 태그 작성
    - form내의 제출버튼 클릭시 action 속성의 값의 url로 요청되면서 사용자가 입력한 값들이 넘어간다.
    - method 속성은 "get"으로 설정한다.
  • 경로값 입력 주의사항
    - 상대경로로 입력 시 현재 url의 마지막 '/'뒤에 경로값이 붙는다.
      >> 원치 않는 경로로 매핑되는 원인
    - '/'로 시작하는 절대경로로 입력해야 기본경로 뒤에 매핑값이 붙는다
      * 기본경로는 포트번호까지 포함임
      ** 매핑값에는 ContextRoot까지 포함된다
      *** 예: 기본경로 http://localhost:8888, action="/Servlet/test.do"일 시 
              http://localhost:8888/Servlet/test.do로 연결됨
<form action="/01_Servlet/test1.do" method="post">
    <label for="name">이름:</label>
    <input type="text" id="name" name="name" required>

    <label for="age">나이:</label>
    <input type="number" id="age" name="age" required>

    <input type="submit" value="제출">
</form>

 

 

 

4) 서블릿 처리 과정 : doGet, doPost

  1. GET방식으로 요청 시 doGet 메소드가 호출된다.
    이때 컨테이너에서 HttpServletRequest( 변수명 request )와 HttpServletResponse( 변수명 response )객체를 전달한다
  2. 요청데이터 뽑기 : request
    - getParameter로 사용자 입력 데이터들을 뽑는다
      ** 사용자가 입력하지 않으면 빈문자열 또는 null이 오는데 이를 parsing 할때 예외가 발생하므로 주의한다.
    - 요청처리(=> Service => Dao => sql문 실행) 후 응답 데이터가 있을경우 Attribute에 담는다
  3. 응답데이터 보내기 : response
    - 응답 형태와 문자셋을 지정한다 > setContentType("text/html; charset=UTF-8")
    - 응답하고자하는 사용자와의 스트림을 생성한다 > PrintWriter out = response.getWriter();
    - println/print/printf 메소드로 응답 html 구문을 한줄씩 보낸다.
    ** 해당 방식은 코드가 복잡해서 JSP 방식이 등장하였다
       관련포스팅 : 99번 포스팅 외
  4. doPost 메소드가 호출된경우
    - 자동으로 doGet() 메소드가 호출되도록 작성되어있으므로 doGet에서 비즈니스로직을 처리한다.
    - 단, 한글이 포함된 경우 문자셋을 변경해주어야한다.
       setCharacterEncoding("UTF-8");
//이름, 나이, 성별, 좋아하는 음식들 정보를 넘겨받은 서블릿의 doGet메소드 처리
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	String name = request.getParameter("name");
	int age = Integer.parseInt(request.getParameter("age"));
	String gender = request.getParameter("gender"); 
	//체크박스와 같은 복수개의 밸류값들을 뽑고자 할때
	String[] foods = request.getParameterValues("food");

	response.setContentType("text/html; charset=UTF-8");
	PrintWriter out = response.getWriter();

	out.println("<html>");
	out.println("<head>");
	out.println("</head>");	
	out.println("<body>");
	out.println("<h2>개인정보 응답화면</h2>");
	out.printf("<span>%s</span>님은 ", name);
	out.printf("<span>%d</span>살이며, ", age);
	out.print("성별은 ");
	if(gender == null ) {
		out.println("선택을 안했습니다. <br>");
	}else {
		if(gender.equals("M")) {
			out.println("<span id='gender'>남자</span>입니다 <br>");
		}else {
			out.println("<span id='gender'>여자</span>입니다 <br>");
		}
	}
	out.print("좋아하는 음식은 ");
	if(foods==null) {
		out.println("없습니다. ");
	}else { // 배열
		out.println("<ul>");
		for(int i=0; i<foods.length; i++) {
			out.println("<li>"+foods[i]+"</li>");
		}
		out.println("</ul>");
	}
	out.println("</body>");
	out.println("</html>");
}

 

 

 

 

댓글