서버에서 페이지 전환 Redirection
response.sendRedirect("calc2");


쿠키 삭제하기
if(operator != null && operator.equals("C"))
expCookie.setMaxAge(0);


Java에서 자바스크립트 엔진 사용하여 구문 분석하기
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
exp = String.valueOf(engine.eval(exp));
} catch (ScriptException e) {
e.printStackTrace();
}
-jdk11 이후부터는 nashorn 엔진은 지원되지 않는다. 
-자바에서 자바스크립트를 사용하고 싶다면 GraalVM 엔진을 사용하자.

 

엔진 변경 방법
1. 프로젝트 우클릭 -> configure -> convert to maven project 클릭
2. 생성된 pom.xml 파일에 
  <dependencies>
  <dependency>
    <groupId>org.graalvm.js</groupId>
    <artifactId>js</artifactId>
    <version>19.2.0.1</version>
</dependency>  
<dependency>
    <groupId>org.graalvm.js</groupId>
    <artifactId>js-scriptengine</artifactId>
    <version>19.2.0.1</version>
</dependency>
  </dependencies>
삽입 ( <build> 바로 위 )
ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js"); 

graal.js 삽입



                         service                            doGet                             doPost


HttpServlet을 상속받은 서블렛 클래스는 클라이언트에서 요청받은 메소드 방식에 따라 doGet, doPost 등 기타 다른 서비스 메소드를 자동으로 호출한다.
이때 해당 서비스 메소드가 오버라이드 되어있지 않으면 405 에러를 출력한다.
(URL을 찾을 수 없으면 404 에러)

동일한 서블렛 조각에서 GET 방식과 POST 방식을 한꺼번에 처리하는 방식을 원하면 service 메소드를 오버라이드 해서 super.service(req, resp);는 지우고 조건문 if(request.getMethod().equals("GET")){}등을 통해 원하는 서비스를 오버라이드 하도록 하고.

GET과 POST 요청을 따로 처리하길 원한다면 service 메소드를 오버라이드 하지 않고 doGet, doPost 메소드를 오버라이드 하여 사용한다.

또는 service 메소드 오버라이드에 super.service(req, resp); 호출을 통해 선택적으로 메소드 오버로드처럼 사용할 수도 있긴 하다.


Servlet 계산기 (JSP의 필요성)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import java.io.IOException;
import java.io.PrintWriter;
 
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("/calculator")
public class Calculator extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        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>Insert title here</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\">");
        // POST를 폼에서 요청하고 있기 때문에 input 버튼을 누르면 doPost 메소드를 호출
        // 자기 자신의 페이지를 요청하기에 action 속성은 필요없다
        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>");
    
    }
    
    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("graal.js");
            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);
        
        expCookie.setPath("/calculator");
        // 다른 url에는 쿠키가 전달되지 않음
        response.addCookie(expCookie);
        response.sendRedirect("calculator");
        //response.sendRedirect("./"); 자기자신 호출
        //sendRedirect 함수 자체가 GET을 요청하기 때문에 doGet 메소드를 호출
        
    }
 
}
 
cs

 

out.write 노가다를 대신해 줄 JSP가 필요하게 됨 

'Development > Java' 카테고리의 다른 글

JSP MVC model #5  (0) 2022.08.14
Servlet & JSP (method) #4  (0) 2022.08.13
Servlet (Application, Session, Cookie) #2  (0) 2022.08.12
Servlet #1  (0) 2022.08.11
Tomcat  (0) 2022.08.11

+ Recent posts