서블릿 JSP

두 개의 서블릿을 하나로 합치기

영카이브 2024. 2. 26. 20:54

현재 코드

 

Calc3 서블릿

@WebServlet("/calc3")
public class Calc3 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 클라이언트로부터 전송된 쿠키를 읽어옴
        Cookie[] cookies = req.getCookies();
        
        // 사용자가 입력한 값(value), 연산자(operator), 소수점(dot)을 가져옴
        String value = req.getParameter("value");
        String operator = req.getParameter("operator");
        String dot = req.getParameter("dot");

        // 이전에 저장된 계산식을 읽어옴
        String exp = "";
        if (cookies != null) {
            for (Cookie c : cookies) {
                if (c.getName().equals("exp")) {
                    exp = c.getValue();
                    break;
                }
            }
        }

        // '=' 연산자가 들어온 경우, 계산식(exp)을 처리
        if (operator != null && operator.equals("=")) {
        	// Graal.js 엔진을 사용하여 계산식 처리
        	ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js"); 
        	try {
        		// 계산식을 평가하여 결과를 문자열로 변환
        		exp = String.valueOf(engine.eval(exp));
			} catch (ScriptException e) {
				// 스크립트 평가 중 오류가 발생한 경우
				e.printStackTrace();
			} 
        } else if(operator !=null && operator.equals("C")) {
        	// 
        	exp=""; 
        }else {
            // 입력값(value), 연산자(operator), 소수점(dot)을 기존의 계산식에 추가
            exp += (value == null) ? "" : value;
            exp += (operator == null) ? "" : operator;
            exp += (dot == null) ? "" : dot;
        }
        

        // 계산식을 쿠키로 저장
        Cookie expCookie = new Cookie("exp", exp);
        // C 누를 시 초기화(쿠키 삭제)
        if(operator!=null && operator.equals("C")) {
            expCookie.setMaxAge(0);
        }
        resp.addCookie(expCookie);
        // "calcpage"로 리다이렉트
        resp.sendRedirect("calcpage");
    }
}

 

CalcPage 서블릿

@WebServlet("/calcpage")
public class CalcPage extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    	Cookie[] cookies = request.getCookies();
    	
    	String exp = "0"; 
    	// 쿠키배열이 null이 아닌 경우만
    	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();
		

        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("        <title>Calc</title>");
        out.println("        <style>");
        out.println("            input{");
        out.println("                width: 50px;");
        out.println("                height: 50px;");
        out.println("            }");
        out.println("            .output{");
        out.println("                height: 50px;");
        out.println("                font-size: 24px;");
        out.println("                font-weight: bold;");
        out.println("                background: gray;");
        out.println("                text-align: right;");
        out.println("                padding-right: 5px;");
        out.println("            }");
        out.println("        </style>");
        out.println("     </head>");
        out.println("     <body>");
        out.println("      <form action=\"calc3\" method=\"post\">");
        out.println("        <table>");
        out.println("            <tr>");
        out.printf("               <td class=\"output\" colspan=\"4\">%s</td>\n", exp);
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"CE\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"C\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"≪\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"/\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"7\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"8\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"9\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"*\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"4\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"5\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"6\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"-\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"1\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"2\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"3\"/></td>");
        out.println("               <td><input type=\"submit\" name=\"operator\" value=\"+\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"0\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"dot\" value=\".\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"=\"/></td>");
        out.println("            </tr>");
        out.println("        </table>");
        out.println("      </form>");
        out.println("    </body>");
        out.println("</html>");
    }
}

 

 

  • GET:/calcpage  Java 웹 프로젝트를 실행하면 브라우저에서 서버에 대한 초기 요청은 GET요청이다. 그리고 resp.sendRedirect("calcpage");  코드로 인한 리다이렉트 요청은 GET 요청이다.
  • POST:/calc3 <form action=\"calc3\" method=\"post\">");

 

두 서블릿을 Calculaotr 서블릿 한개로 합치기

 

1. doGet()에 clac3서블릿 내용을,  doPost()에 clacpage서블릿 내용 입력

2.  <form action=\"calc3\" method=\"post\">"); 에서  <form  method=\"post\">"); 으로 수정

3.  resp.sendRedirect("calcpage"); 을   resp.sendRedirect("calculator"); 로 수정

4.  expCookie.setPath("/calculator");로 수정 : 다른 URL로 가는 것을 막고 오직 /calculator로만 쿠키를 가지고 이동

* expCookie.setPath("/") 일시 사이트 전역범위에서 쿠키전달을 받음( 보통의 사이트의 경우에 해당 )

@WebServlet("/calculator")
public class Calculator extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		if(req.getMethod().equals("GET")) {
			System.out.println("GET요청이 왔습니다.");
		} else if(req.getMethod().equals("POST")){
			System.out.println("POST요청이 왔습니다.");
		}
		// 부모가 가진 서비스함수는 사용자가 요청이오면 그에 따른 do함수 실행
		// 그것이 get요청이면 doGet() 실행, post는 doPost()실행  
		super.service(req, resp);
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	Cookie[] cookies = req.getCookies();
    	
    	String exp = "0"; 
    	// 쿠키배열이 null이 아닌 경우만
    	if(cookies!=null) {
    		for(Cookie c :  cookies) {
    			if(c.getName().equals("exp")) {
    				exp = c.getValue();
    				break; 
    			}
    		}
    	}
    	
    	resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html; charset=UTF-8");
		PrintWriter out = resp.getWriter();
		

        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("        <title>Calc</title>");
        out.println("        <style>");
        out.println("            input{");
        out.println("                width: 50px;");
        out.println("                height: 50px;");
        out.println("            }");
        out.println("            .output{");
        out.println("                height: 50px;");
        out.println("                font-size: 24px;");
        out.println("                font-weight: bold;");
        out.println("                background: gray;");
        out.println("                text-align: right;");
        out.println("                padding-right: 5px;");
        out.println("            }");
        out.println("        </style>");
        out.println("     </head>");
        out.println("     <body>");
        out.println("      <form method=\"post\">");
        out.println("        <table>");
        out.println("            <tr>");
        out.printf("               <td class=\"output\" colspan=\"4\">%s</td>\n", exp);
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"CE\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"C\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"≪\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"/\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"7\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"8\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"9\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"*\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"4\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"5\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"6\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"-\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"1\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"2\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"3\"/></td>");
        out.println("               <td><input type=\"submit\" name=\"operator\" value=\"+\"/></td>");
        out.println("            </tr>");
        out.println("            <tr>");
        out.println("                <td></td>");
        out.println("                <td><input type=\"submit\" name=\"value\" value=\"0\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"dot\" value=\".\"/></td>");
        out.println("                <td><input type=\"submit\" name=\"operator\" value=\"=\"/></td>");
        out.println("            </tr>");
        out.println("        </table>");
        out.println("      </form>");
        out.println("    </body>");
        out.println("</html>");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 클라이언트로부터 전송된 쿠키를 읽어옴
        Cookie[] cookies = req.getCookies();
        
        // 사용자가 입력한 값(value), 연산자(operator), 소수점(dot)을 가져옴
        String value = req.getParameter("value");
        String operator = req.getParameter("operator");
        String dot = req.getParameter("dot");

        // 이전에 저장된 계산식을 읽어옴
        String exp = "";
        if (cookies != null) {
            for (Cookie c : cookies) {
                if (c.getName().equals("exp")) {
                    exp = c.getValue();
                    break;
                }
            }
        }

        // '=' 연산자가 들어온 경우, 계산식(exp)을 처리
        if (operator != null && operator.equals("=")) {
        	// Graal.js 엔진을 사용하여 계산식 처리
        	ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js"); 
        	try {
        		// 계산식을 평가하여 결과를 문자열로 변환
        		exp = String.valueOf(engine.eval(exp));
			} catch (ScriptException e) {
				// 스크립트 평가 중 오류가 발생한 경우
				e.printStackTrace();
			} 
        } else if(operator !=null && operator.equals("C")) {
        	// 
        	exp=""; 
        }else {
            // 입력값(value), 연산자(operator), 소수점(dot)을 기존의 계산식에 추가
            exp += (value == null) ? "" : value;
            exp += (operator == null) ? "" : operator;
            exp += (dot == null) ? "" : dot;
        }
        

        // 계산식을 쿠키로 저장
        Cookie expCookie = new Cookie("exp", exp);
        // C 누를 시 초기화(쿠키 삭제)
        if(operator!=null && operator.equals("C")) {
            expCookie.setMaxAge(0);
        }
        // calculator외에는 쿠키 전달 불가
        expCookie.setPath("/calculator");
        resp.addCookie(expCookie);
        // "calcpage"로 리다이렉트
        resp.sendRedirect("calculator");
	}
}

 

 

 

참고 자료 출처 : https://www.youtube.com/watch?v=TSSKJ90t_T0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=40