티스토리 뷰
반응형
먼저 간단한 그림을 통해서 동적 페이지 구현에 대해서 알아보자.
맞는지 안 맞는지는 모르겠지만 내가 정리한 내용으로는 이렇다.
코드를 분석해보자!
//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 어떻게 사용하는지도 알아봐야겠다!
반응형
'Servlet JSP' 카테고리의 다른 글
GET, POST에 특화된 서비스 함수 (0) | 2021.04.26 |
---|---|
클리어(쿠키삭제)추가_계산기 만들기(완성2) (0) | 2021.04.26 |
처음이자 마지막으로 동적인 페이지 서블릿으로 직접 만들기_계산기 만들기2 (0) | 2021.04.25 |
동적인 페이지(서버 페이지)의 필요성_계산기 만들기1 (0) | 2021.04.24 |
redirect 페이지전환 (0) | 2021.04.24 |
댓글
공지사항