Servlet / JSP ) 10. 하나의 프로그램은 하나의 Servlet으로

60jong·2022년 6월 28일
0

Servlet / JSP

목록 보기
10/17

Server 공부 흐름

Servlet --[HTML코드 출력 문제]--> JSP --스파게티 코드 문제--> JSP MVC -> Spring MVC -> SpringBoot


하나의 프로그램은 하나의 Servlet으로


그동안 Get요청을 처리하는 Servlet, Post요청을 처리하는 Servlet을 따로 만들어 로직을 처리했다.
하지만 하나의 프로그램이 나뉘어 관리되는 경우, 관리가 어려워지게 된다.
따라서

하나의 프로그램은 하나의 Servlet으로 합치는게 좋겠다.

앞서서 만들었던 계산기는

Client > WAS > Servlet Calc > Servlet CalcPage > WAS > Client 이런 구조를 가지고 있다.

  • "계산기" 라는 하나의 프로그램이 Servlet Calc, Servlet CalcPage 두 개의 Servlet으로 구현되어 있다.

이 두 Servlet을 하나의 Servlet으로 합치겠다.

그 방법을 말하기에 앞서 추상 클래스 HttpServletservice() 함수에 대해 알아보겠다.


추상 클래스 HttpServlet의 service() 함수 Override


추상 클래스 HttpServlet에서 주목할 만한 특징은

  • service()함수 내부에서 do+요청된 HTTP 메소드() ex) doGet() / doPost()를 호출하게 된다.
  • service(), doGet(), doPost() 등 메소드에 override가 가능하다.


또한, service()함수는 request.getMethod()를 통해 요청된 메소드의 타입을 확인하는데

GetMethod.java

@WebServlet("/getmethod")
public class GetMethod extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        response.getWriter().println(request.getMethod());
    }
}

getmethod.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="getmethod", method="get">
        <input type="submit" value="GET요청">
    </form>
    <form action="getmethod", method="post">
        <input type="submit" value="POST요청">
    </form>
</body>
</html>

이를 활용할 수도 있겠다.


하나의 Servlet으로 만드는 방법


위에서 확인한 특징들을 통해 하나의 Servlet으로 만드는 3가지 방법이 있다.
  1. request.getMethod()를 통해 service()함수 내에 두 로직을 따로 만들어 준다.
  • GET요청에 따른 로직
  • POST요청에 따른 로직
  1. service()함수를 override하지 않고 직접 doGet()doPost()를 override해서 로직을 따로 처리하도록 한다.
  1. 공통의 로직을 처리할 필요가 있다면 service() / doGet() / doPost()를 모두 구현하는데,
    service() 함수 내부에
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        ~~~
        super.service(request, response);
        ~~~
    }
}

부모의 service()를 추가해 세 로직을 처리하게 한다.

  • 공통 로직
  • doGet() 을 통한 로직
  • doPost()를 통한 로직

하나의 Servlet으로 합치기 (구현)


위의 세 가지 방법 중 두 번째 방식을 통해 Servlet Calculator를 구현해보겠다.

Calculator.java

@WebServlet("/calculator")
public class Calculator extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        String exp = "";

        Cookie[] cookies = request.getCookies();
        if(cookies != null)
            for (Cookie c : cookies) {
                if (c.getName().equals("exp"))
                    exp = c.getValue();
                break;
            }


        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=\"calc\" 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><input type=\"submit\" name=\"operator\" value=\"±\"/></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 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 {
            exp += (value!=null) ? value : "";
            exp += (operator!=null) ? operator : "";
            exp += (dot!=null) ? dot : "";
        }

        Cookie expCookie = new Cookie("exp", exp);

        response.addCookie(expCookie);
        response.sendRedirect("calculator");
    }
}

실제로 /calculator 하나로 GET요청과 POST요청이 잘 전달되고 있음을 확인할 수 있다.

profile
울릉도에 별장 짓고 싶다

0개의 댓글