본문 바로가기
Programming/Java

Servlet

서블릿(servlet): 자바 소스코드에 html이 들어가는 형태   

 

 

<->

JSP(Java Serve Pages): HTML에 java 코드 들어가는 것

 

서블릿의 불편함때문에 JSP가 나왔다.

 

그런데 JSP도 요즘 불편해서 잘 안씀 -> Spring framwork -> Springboot

 

 

 

 

서블릿 생성 실습: java resource에서 new 해서 servlet 을 만든다.

package ch05;

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 HelloWorld       
 * @WebServlet가 어떤 요청에 의해 서블릿 호출될 것인지, url 형태까지 모두 설정
 */
@WebServlet(description = "my first servlet", urlPatterns = { "/Hello" })
public class HelloWorld extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorld() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 * doGet()은 GET 요청을 처리하는 메소드다. 요청이 오면 무언가 실행되게 수정하자.
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)			
			throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.append("<!doctype html><html><head><title>Hello World Servlet</title></head><body>")
		.append("<h2>Hello World !!</h2><hr>")
		.append("현재 날짜와 시간은: "+java.time.LocalDateTime.now())
		.append("</body></html>");
		// TODO Auto-generated method stub  호출하는쪽에서 예외처리하는 default 내용인데 여기선 쓰지안고 위에 작성내용 사용
		// response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 * doPost는 실행시키도록 하는 것
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

run as로 서버랑 연결해서 실행 시, 다음과 같은 주소와 웹페이지를 볼 수 있다.

 

 

 

 

 

 

 

서블릿과 연계해서 계산기를 만들자.

 

우선 html 작성한 파일이다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기 만들기</title>
</head>
<body>
	<h2>계산기</h2>
	<hr>
	<form method="post" action="/jwbook/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="실행">
	</form>		
</body>
</html>

이를 실행하면 아래와 같이 나온다. (옵션만 구현한 상태이다.)

 

계산기 만들기

계산기


 

 

 

 

이를 연결하는 서블렛(계산기 작동)을 작성한다

package ch05;

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  
 * description이 생략되어 주소형태만 나옴.
 */
@WebServlet("/Calc")
public class CalcServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CalcServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub 여기에 내용 추가한다.
		// response.getWriter().append("Served at: ").append(request.getContextPath());
		int n1 = Integer.parseInt(request.getParameter("n1"));   // int 값만 집어넣는 제한이다.
		int n2 = Integer.parseInt(request.getParameter("n2"));
		String op = request.getParameter("op");
		
		long result = 0;   
    // 값이 int범위이다. 소수점을 하기위해서는 int와 long을 모두 double로 바꿔야한다.
		
		switch(request.getParameter("op")) {
		case "+": result = n1 + n2; break;
		case "-": result = n1 - n2; break;
		case "*": result = n1 * n2; break;
		case "/": result = n1 / n2; break;
		}
		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.append("<html><body><h2>계산기 서블릿</h2><hr>")
		.append("계산 결과: "+ result + "</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

실행은 html을 서버로 실행시켜서 서블릿에 자연스럽게 연결한다. (웹브라우저 아님!) 

 

서버로 연결하여 localhost가 나오게 한다. 웹브라우저 실행 아님!

54 나누기 27 실행을 해보면

 

이렇게 잘 나온다.

 

그러나 26을 나누면 여전히 2만 나온다.

결과와 인풋이 무조건 int와 long으로 제한되어있기 때문이다. (코드 참조)

728x90
반응형