sevlet ToyProject(clone) 계산기

유튜브뉴렉처님의 servlset강의자료를 보며 계산기 구현 

 

 

간단한 소개

 

html의 정적인 웹페이지에서  servlet을 이용해 동적인 웹페이지(계산기)구현

숫자를 post로 입력받아 쿠키를 브라우저에 쿠키를 저장하여 "=" 연산기호를 사용하면ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

자바스크립트엔진을통해 계산하여 결과값 Redirect한다 그리고

"C"를 누르면 expCookie.setMaxAge(0); 을 이용하여

저장된 쿠키를 만료시켜 초기값인 "0" 으로 다시 설정된다.

서버 : 톰켓9v 사용

 

느낀점

비록 보고 따라한 클론? 코딩이지만 무작정 보고 따라치기보다

서블릿이 어떻게 구현되는지  흐름을 알수있었다.

 

알수있었던것들

#상태 저장 객체 application(서버 저장소),session(서버 저장소),cookie(클라이언트 저장소)의

각각의 사용범위,생명주기,저장위치

#get , post 요청의 차이점

#cookie의 옵션 .setMaxAge(); 로 쿠키 만료시간 설정

# .getParmeter(); 로 입력값 받아오기 

#@WebServlet("/url") 로 servlet소스에서 url mapping

#인코딩방식 .setCharacterEncoding("UTF-8");    .setContentType("text/html; charset=UTF-8"); 등

#html 소스를 서블릿 파일에 합치기위한 객체생성과 구문 

  PrintWriter out = response.getWriter(); //html소스 서블릿 소스에 합칠 구문

  out.write("");  //("") html구문 합침

#doGet(); , doPost() 메서드 오버라이딩으로 서블릿소스 하나로 합치기

 

package restart;

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

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calculator")  //맵핑 주소
public class Calculator extends HttpServlet{

	//get요청 소스 시작
	 
   @Override //doGet메서드 오버라이딩 get요청을하는 웹페이지와 post를요청하는 페이지를 각각
     //doGet , doPost 메서드로 오버라이딩하여 하나의 서블릿 소스로 합쳤다.
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	   Cookie[] cookies = request.getCookies(); // 쿠키 배열에서 쿠키 찾기
		
		String exp = "0";
		if(cookies != null)
		for(Cookie c: cookies)
			if(c.getName().equals("exp")) {
				exp = c.getValue();
				break;
			}
		
		// 인코딩
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		PrintWriter out = response.getWriter();
               //html 소스를 서블릿 파일에 합치기위헤 위의 객체를 생성하고 아래의 구문"out.write("");"을 사용하였다.
		out.write("<!DOCTYPE html>");
		out.write("<html>");
		out.write("<head>");
		out.write("<meta charset=\"UTF-8\">");
		out.write("<title>계산기</title>");

		out.write("<style>");
		out.write(" input{");
		out.write(" width: 50px;");
		out.write("height :50px;");
		out.write(" }");
		out.write(" .output{");
		out.write(" height :50px;");
		out.write("background : #e9e9e9;");
		out.write(" font-size: 24px;");
		out.write("font-weight: bold;");
		out.write(" text-align : right; "); /* 정렬 */
		out.write(" padding: 0px 5px;");
		out.write(" }");
		out.write(" .head{");
		out.write(" padding : 50px;");
		out.write(" }");
		out.write(" </style>");

		out.write("</head>");
		out.write("<body>");
		out.write(" <form method=\"post\">");
		

		out.write(" <table>");
		out.write(" <tr>");
		
		out.printf(" <td class=\"output\" colspan=\"4\">%s</td>",exp);
		
		out.write("<tr/>");
		out.write(" <tr>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"CD\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"C\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"BS\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"/\"/></td>");
		out.write(" <tr/>");
		out.write("  <tr>");
		out.write(" <td><input type=\"submit\" name=\"value\" value=\"7\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"value\" value=\"8\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"value\" value=\"9\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"*\"/></td>");
		out.write("<tr/>");
		out.write("  <tr>");
		out.write("  <td><input type=\"submit\" name=\"value\" value=\"4\"/></td>");
		out.write("  <td><input type=\"submit\" name=\"value\" value=\"5\"/></td>");
		out.write("  <td><input type=\"submit\" name=\"value\" value=\"6\"/></td>");
		out.write("  <td><input type=\"submit\" name=\"operator\" value=\"-\"/></td>");
		out.write("<tr/>");
		out.write("  <tr>");
		out.write("  <td><input type=\"submit\" name=\"value\" value=\"1\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"value\" value=\"2\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"value\" value=\"3\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"+\"/></td>");
		out.write(" <tr/>");
		out.write(" <tr>");
		out.write(" <td></td>");
		out.write("  <td><input type=\"submit\" name=\"value\" value=\"0\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"dot\" value=\".\"/></td>");
		out.write(" <td><input type=\"submit\" name=\"operator\" value=\"=\"/></td>");
		out.write(" <tr/>");
		out.write("  </table>");

		out.write(" </form>");

		out.write("</body>");
		out.write("	</html>");

	}
   
   //get요청 소스 끝
   
   //post요청 소스 시작
   
   @Override  //doPost메서드를 오버라이딩해서 Post를 담당하는 소스를 오버라이딩 했다.
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie[] cookies = request.getCookies(); // 쿠키 읽기

		// get요청값 각자의 문자열 변수에 저장
		String value = request.getParameter("value");  
		String operator = request.getParameter("operator");
		String dot = request.getParameter("dot");

		
		String exp = "";
		if (cookies != null)
			for (Cookie c : cookies)
				if (c.getName().equals("exp")) {
					exp = c.getValue();
					break;
				}
		if (operator != null && operator.equals("=")) {
			ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); //계산 로직 대신 자바스크립트 엔진사용 jdk상위버전에선 다른 식으로 자바스크립트를 사용하도록 바뀜
              try {
				exp = String.valueOf(engine.eval(exp));
			} catch (ScriptException e) {
				e.printStackTrace();
			}
		} 
		else if (operator != null && operator.equals("C")) { //쿠키 지우기 
		       exp = "";  
		}	
		
		else {  
			exp += (value == null) ? "" : value;
			exp += (operator == null) ? "" : operator;
			exp += (dot == null) ? "" : dot;
		}
		Cookie expCookie = new Cookie("exp", exp);
		if (operator != null && operator.equals("C"))  //계산기 "C"를 누리면 쿠키를 만료시켜 초기값으로 되돌린다.
         expCookie.setMaxAge(0);
		
		expCookie.setPath("/calculator");   //path를 calculator두어 쿠키를 이문서에문 유효하게한다.
		response.addCookie(expCookie); //쿠키 추가
		response.sendRedirect("calculator"); //
   
	}
   //post요청 소스 끝
}