ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 계산기 서블릿 구현하기 (오류 수정 완)
    JSP, Servlet 2021. 12. 13. 01:00

    동적인 페이지(서버 페이지)의 필요성
    사용자가 입력한 숫자를 포함한 웹 페이지를 보내줘야 함 -> 동적으로 만들어야 함

    처음이자 마지막으로 동적인 페이지 서블릿으로 직접 만들기

    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;
    
    
    @WebServlet("/calc")
    public class Calc extends HttpServlet {
    	
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    				
    		Cookie[] cookies = request.getCookies();
    		
    		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");
    			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"))
    			expCookie.setMaxAge(0);
    		response.addCookie(expCookie);	
    		response.sendRedirect("calcpage");
    	}		
    }
    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 {
    	
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setCharacterEncoding("utf-8");
    		response.setContentType("text/html; charset=utf-8");
    		PrintWriter out = response.getWriter();
    		Cookie[] cookies = request.getCookies();
    		
    		String exp = "0";
    		if(cookies != null) 
    			for(Cookie c : cookies) 
    				if(c.getName().equals("exp")) {
    					exp = c.getValue();
    					break;
    				}
    		
    		out.write("<!DOCTYPE html>");
    		out.write("<html>");
    		out.write("<head>");
    		out.write("<meta charset='UTF-8'>");
    		out.write("<meta name='viewport' content='width=device-width, initial-scale=1.0'>");
    		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("width: 50px;");
    		out.write("background-color: #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("</style>");
    		out.write("</head>");
    		out.write("<body>");
    		out.write("<form action='calc' 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='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='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>");
    	}
    }

     


    오류 내용 : 숫자나 연산을 눌러도 값이 출력되지 않음

    이유 : if(c.getName().equals("exp")) 에 "원래 있던 값"을 수정하지 않았음

     

    코딩할 때마다 느끼는 거지만 정말 사소한 거에도 오류가 나니까.. 더 꼼꼼해져야겠다는 생각이 든다

    댓글