이번 실습에서는 화면과 함께 상호작용이 가능한 계산기 서블릿을 구현해 본다. HTML 폼을 통해 숫자, 연산자를 입력하고 입력값을 서블릿으로 전달해 계산 결과를 출력하는 구조이다.

실습을 통해 HTML과 서블릿의 상호작용과 서블릿에서 사용자 요청, 응답 처리 방법을 배운다.

실습 내용

실행결과는 다음과 같다. 서블릿 생성서블릿 생성

이번 실습에서 만들게 되는 계산기는 두개의 숫자와 연산자를 선택하고 계산 버튼을 누르면 입력값을 서블릿으로 전달한다. 서블릿은 브라우저로 부터 전달된 입력값들을 가지고와 계산후 결과를 포함한 화면을 출력하는 구조 이다.

입력 파라미터

calcForm.html

WebContent 폴더에 basic 폴더를 만들고 calfForm.html 파일을 생성한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Simple Calculator</title>
</head>
<body>
	<h2>Simple Calculator</h2>
	<hr>
	<form method="post" action="/jwprj/calc">
		<input type="text" name="n1" size="10"> <select name="op">
			<option>+</option>
			<option>-</option>
			<option>*</option>
			<option>/</option>
		</select> <input type="text" name="n2" size="10"> 
		<input type="submit"value="Run">
	</form>
</body>
</html>

작성을 완료 했으면 실행해서 화면이 제대로 나오는지 확인 하도록 한다.

서블릿 생성

계산기 서블릿은 다음과 같이 생성 하도록 한다.

계산기 구현은 doGet() 에서 하도록 한다.

파라미터 가지고 오기

HTML 폼에서 입력한 파라미터는 Query String 으로 서블릿에 전달되며 doGet() 의 인자인 request의 getParameter() 를 통해 참조할 수 있다.

int n1 = Integer.parseInt(request.getParameter("n1"));
int n2 = Integer.parseInt(request.getParameter("n2"));
String op = request.getParameter("op"); 

계산기능 구현하기

연산자는 별도 변수를 선언해서 가지고 오거나 switch 문에서 바로 사용해도 된다. if 문을 사용해도 되나 여기서는 구조적으로 단순한 switch 를 사용한다.

switch(op) {
	case "+": result = n1+n2; break;
	case "-": result = n1-n2; break;
	case "/": result = n1/n2; break;
	case "*": result = n1*n2; break;
}

결과 화면 구현하기

결과 화면은 출력 스트림을 통해 HTML 과 result 변수를 조합해 구성 한다.

PrintWriter out = response.getWriter();
out.append("<html><body><h2>Simple Calculator</h2><hr>")
.append("Result : "+result+"</body></html>");

계산기 서블릿의 전체 코드는 다음과 같다.

package jwprj.basic;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class CalcServlet
 */
@WebServlet("/calc")
public class CalcServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public CalcServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int n1 = Integer.parseInt(request.getParameter("n1"));
		int n2 = Integer.parseInt(request.getParameter("n2"));
		
		long result = 0;
		
		switch(request.getParameter("op")) {
			case "+": result = n1+n2;break;
			case "-": result = n1-n2;break;
			case "/": result = n1/n2;break;
			case "*": result = n1*n2;break;
		}
				
		PrintWriter out = response.getWriter();
		out.append("<html><body><h2>Simple Calculator</h2><hr>")
		.append("Result : "+result+"</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}