Development/JSP

[GET/POST Service Function] 웹 서버 구축하기 (12)

Go0G 2021. 12. 3. 17:13

개요

요청 Method에 따른 특화된 Method 이용하기

  • service 객체 세분화: doGet(), doPost()

환경

  • WAS Server: CentOS Linux release 7.9 - Tomcat 7.0 - JDK 1.8.0_312

관련 경로

servlet-api 라이브러리 /[Tomcat Directory]/java/tomcat-servlet-api.jar
ROOT Directory /[Tomcat Directory]/tomcat/webapps/ROOT/

실습

컴파일

#javac -classpath /[Tomcat Directory]/java/tomcat-servlet-api.jar [Java File Name].java
#mv ./[Java File Name].class ../WEB-INF/classes/
#systemctl restart tomcat

샘플 페이지

GET_POST_TEST.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>POST_TEST PAGE</title>
    </head>
    <body>
        <form action="GET_POST_TEST" method="GET">
            <input type="submit", value="GET 요청">
        </form>
        <form action="GET_POST_TEST" method="POST">
            <input type="submit", value="POST 요청">
        </form>
    </body>
</html>

doGet, doPost 메소드가 정의되어 있지 않기 때문에 super.service() 호출시 에러 발생

GET_POST_TEST.java

import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.lang.*;

@WebServlet("/GET_POST_TEST")
public class GET_POST_TEST extends HttpServlet{
    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
    {
        PrintWriter out = resp.getWriter();

        if(req.getMethod().equals("GET")){
           out.write("GET METHOD");
        }
        else if(req.getMethod().equals("POST")){
            out.write("POST METHOD");
        }
        //super.service(req,resp); //주석 삭제 시 혀옹되지 않는 메소드(405) 에러 발생
    }
}

doGet()와 doPost를 사용한 예제

GET_POST_TEST.java

import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.lang.*;

@WebServlet("/GET_POST_TEST")
public class GET_POST_TEST extends HttpServlet{
    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
    {
        PrintWriter out = resp.getWriter();

        super.service(req,resp);
        if(req.getMethod().equals("GET")){
           out.write("GET METHOD\n");
        }
        else if(req.getMethod().equals("POST")){
            out.write("POST METHOD\n");
        }
        super.service(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
        PrintWriter out = resp.getWriter();
        out.write("do POST METHOD\n");     
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
        PrintWriter out = resp.getWriter();
        out.write("do POST METHOD\n");     
    }

}

doGet()과 doPOST()를 이용하여 기존 페이지를 하나의 페이지로 병합

doGET_doPOST_calc.java

import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.lang.*;
import javax.servlet.http.Cookie;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;


@WebServlet("/doGET_doPOST_calc")
public class doGET_doPOST_calc extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
        Cookie[] cookies = request.getCookies();

        String exp = "0";         
        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.write("<!DOCTYPE html>");
        out.write("<html>");
            out.write("<head>");
               out.write(" <meta charset=\"UTF-8\">");
                out.write("<title>CALC TEST PAGE</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("background: #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 method=\"post\">"); //자신의 페이지로 요청하기 때문에 action 불필요
                    out.write("<div>");
                        out.write("<label>계산기</label><br> ");               
                    out.write("</div>");
                    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>");      
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
        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("=")){
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.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);
        if(operator != null && operator.equals("C")){ //쿠기 삭제 분기 
            expCookie.setMaxAge(0);     
        }
        expCookie.setPath("/doGET_doPOST_calc"); //Path 한정
        response.addCookie(expCookie);
        response.sendRedirect("doGET_doPOST_calc"); //자기 자신으로 리다이렉트
    }

}

Reference

더보기

[1] https://www.youtube.com/watch?v=arB7sQ9S7h0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=39

[2] https://www.youtube.com/watch?v=TSSKJ90t_T0&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=40