Servlet
--[HTML코드 출력 문제]--> JSP
--스파게티 코드 문제--> JSP MVC
-> Spring MVC
-> SpringBoot
그동안 Get요청을 처리하는 Servlet, Post요청을 처리하는 Servlet을 따로 만들어 로직을 처리했다.
하지만 하나의 프로그램이 나뉘어 관리되는 경우, 관리가 어려워지게 된다.
따라서
하나의 프로그램은 하나의 Servlet으로 합치는게 좋겠다.
앞서서 만들었던 계산기는
Client > WAS > Servlet Calc > Servlet CalcPage > WAS > Client
이런 구조를 가지고 있다.
Servlet Calc
, Servlet CalcPage
두 개의 Servlet으로 구현되어 있다.이 두 Servlet을 하나의 Servlet으로 합치겠다.
그 방법을 말하기에 앞서 추상 클래스 HttpServlet
의 service()
함수에 대해 알아보겠다.
추상 클래스 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>
이를 활용할 수도 있겠다.
request.getMethod()
를 통해service()
함수 내에 두 로직을 따로 만들어 준다.
GET
요청에 따른 로직POST
요청에 따른 로직
service()
함수를 override하지 않고 직접doGet()
와doPost()
를 override해서 로직을 따로 처리하도록 한다.
- 공통의 로직을 처리할 필요가 있다면
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 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
요청이 잘 전달되고 있음을 확인할 수 있다.