티스토리 뷰

반응형

먼저 간단한 그림을 통해서 동적 페이지 구현에 대해서 알아보자.
맞는지 안 맞는지는 모르겠지만 내가 정리한 내용으로는 이렇다.

코드를 분석해보자!

//CalcPage.java
package com.newlecture.web;

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

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("/calcpage")
public class CalcPage extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/* 쿠키 */
		
		Cookie[] cookies = request.getCookies(); //쿠키를 cookies 배열로 저장
		
		String result = "0";
		if(cookies != null)	//브라우저에서 null을 아무 값도 안 줄경우 조건문
			for(Cookie c : cookies)	//쿠키변수를 선언하고 쿠키의 개수만큼 반복
				if(c.getName().equals("result")) {	//쿠키의 값이 result와 같은 조건문
					result = c.getValue();	//result에 쿠키 값을 저장
					break;
				}
				
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();

		
		out.write("<!DOCTYPE html>");
		out.write("<html>");
		out.write("<head>");
		out.write("<meta charset=\"UTF-8\">");
		out.write("<title>Insert title here</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("	backgroud: #e9e9e9;");
		out.write("	font-size:24px;");
		out.write("	font-width:bold;");
		out.write("	text-align:right;");
		out.write("	padding:0px 5px;");
		out.write("}");
			
		out.write("</Style>");

		out.write("</head>");
		out.write("<body>");
		out.write("	<form action=\"calc3\" method=\"post\">");
		out.write("		<table>");
		out.write("			<tr>");
		/* 계산된 결과를 출력 */
		out.printf("				<td class=\"output\" colspan=\"4\">%s</td>", result);
		out.write("			</tr>");
		out.write("			<tr>");
		out.write("				<td><input type=\"submit\" name=\"operator\" value=\"CE\"></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=\"number\" value=\"7\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" value=\"8\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" 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=\"number\" value=\"4\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" value=\"5\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" 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=\"number\" value=\"1\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" value=\"2\"></td>");
		out.write("				<td><input type=\"submit\" name=\"number\" 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=\"number\" 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>");
				
		}
	}
	


 

//Calc3.java
package com.newlecture.web;

import java.io.IOException;

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;

//import jdk.internal.org.jline.reader.ScriptEngine;

@WebServlet("/calc3")
public class Calc3 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
		Cookie[] cookies = request.getCookies(); //쿠키를 배열로 읽어온다
				
		String number = request.getParameter("number");
		String operator = request.getParameter("operator");
		String dot = request.getParameter("dot");
		
		String result = "";
				
		if(cookies != null)	//브라우저에서 null을 아무 값도 안 줄경우 조건문
			for(Cookie c : cookies)	//쿠키변수 c를 선언, c를 하나씩 돌면서 쿠키의 개수만큼 반복
				if(c.getName().equals("result")) {	//쿠키의 값이 result와 같은 조건문
					result = c.getValue();	//result에 쿠키 값을 저장
					break;
				}
		
		if(operator != null && operator.equals("=")) {	//조건문, opartor이 null이 아니고, =인 경우
			/* ScriptEngine으로 구현 */
			ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
			try {
				result = String.valueOf(engine.eval(result));
			} catch (ScriptException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
			
		
		else {
			result += (number == null)?"":number;	//조건문, number가 null이면 빈문자열, null아니면 number 누적
			result += (operator == null)?"":operator;	//조건문, operator가 null이면 빈문자열, null아니면 operator 누적
			result += (dot == null)?"":dot;	//조건문, dot이 null이면 빈문자열, null아니면 dot 누적
		}
	
		Cookie resultCookie = new Cookie("result", result);	//resultCookie 생성, 생성되는 **위치가 중요!! 쿠키를 저장하기 바로전에 생성하자
		
		response.addCookie(resultCookie);		
		
		response.sendRedirect("/calcpage"); //calcpage로 이동, 경로가 같음.
			
		
		
		}
	}
	


ㅎ하루종일 ScriptEngine이 작동이 되지 않아서, 왜 안되는지를... 찾아봤다. 구글링하니깐 GraalVM을 쓰란다.
그래서 사용하려니깐 그것도 너무 복잡하다. 그래서 다시 코드로 구현하려고 보니깐 작동이 안된다. 
아..........그래서 ScriptEngine쓰려고 다시 jRE 바꾸고 셋팅 바꾸고 했다가 서버까지 안됐다. 하루종일 그랬다.
그래서 포기하고 글을 쓰려는데, 그냥 같은 코드를 쳤는데......된다.........??? 아;
너무 빡쳐서 이성을 잃고 캡쳐도 못해놨다. 오류 좀 적어둘걸........ 평정심을 가지자.
아무튼 고맙네 되줘서.
주석을 잘 읽어보면 이해가 될 것임.

계산기 작동모습

Warning: Nashorn engine is planned to be remoced form a future JDK release
=> 곧 있으면 못쓴단다. 얼른 GraalVM 어떻게 사용하는지도 알아봐야겠다!

반응형
댓글
공지사항