기존에는 아래와 같이 요청한 것에 대해서만 응답을 했다면 이제 이를 Redirection을 통해 전환
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;
@WebServlet("/calc2")
public class Calc2 extends HttpServlet{
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
// Application 저장소 선언
ServletContext application = request.getServletContext();
// Session 선언
HttpSession session = request.getSession();
// Cookie 선언
Cookie[] cookies = request.getCookies();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String value_ = request.getParameter("value");
String op = request.getParameter("operator");
int value = 0;
if(!value_.equals("")) value = Integer.parseInt(value_);
// 계산
if(op.equals("=")) {
int x = 0;
for(Cookie c : cookies) {
if(c.getName().equals("value")) {
x = Integer.parseInt(c.getValue());
break;
}
}
int y = value;
String operator = "";
for(Cookie c : cookies) {
if(c.getName().equals("op")) {
operator = c.getValue();
break;
}
}
int result = 0;
if(operator.equals("+")) {
result = x + y;
} else {
result = x - y;
}
response.getWriter().printf("결과 값 : %d\n", result);
} else { // 값 저장
Cookie valueCookie = new Cookie("value", String.valueOf(value));
Cookie opCookie = new Cookie("op", op);
// path 설정
valueCookie.setPath("/calc2");
opCookie.setPath("/calc2");
// maxAge 설정 - 24시간 유지
valueCookie.setMaxAge(24 * 60 * 60);
opCookie.setMaxAge(24 * 60 * 60);
response.addCookie(valueCookie);
response.addCookie(opCookie);
// Redirection
response.sendRedirect("calc2.html");
}
}
}
서버 페이지(동적 페이지)의 등장은 사용자의 입력을 실시간으로 웹 페이지에 반영할 필요에 의해 나타남
따라서 아래와 같이 html 대신 servlet을 통해 redirection하여 페이지를 동적으로 작업해 넘김
정적인 html 코드를 동적인 servlet으로 변환
여기에서는 쿠키의 정보들을 불러와 페이지에 보여줄 수 있도록 준비
package com.newlecture.web;
import java.io.IOException;
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("/calc3")
public class Calc3 extends HttpServlet{
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
// Cookie 선언
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
exp += (value == null) ? "" : value;
exp += (operator == null) ? "" : operator;
exp += (dot == null) ? "" : dot;
}
Cookie expCookie = new Cookie("exp", exp);
// Redirection
response.addCookie(expCookie);
response.sendRedirect("calcpage");
}
}
여기서는 전달 된 내용을 바탕으로 html 문서로 작성하여 사용자에게 보여줌
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
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("/calcpage")
public class CalcPage extends HttpServlet{
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
String exp = "0";
Cookie[] cookies = request.getCookies();
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>Calculation</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(" <div>");
out.write(" <form action=\"calc3\" method=\"post\">");
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=\"<-\"/></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(" </div>");
out.write("</body>");
out.write("</html>");
}
}
위와 같이 무분별한 write() 메소드 사용은 추후 JSP 등장의 이유가 됨
필요에 따라 service 함수 없이 doGet(), doPost() 메소드를 오버라이드하여 사용 가능
각기 달리 작성하여 특화되게 활용
만약 doGet(), doPost() 를 사용하지 않고 URL 접근시 405 Error 발생(허용되지 않는 메소드)
--> 404 Error : URL 없음 405 Error : URL은 있으나 이를 처리할 메소드 없음
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="calculator" method="get">
<input type="submit" value="요청">
</form>
</body>
</html>
method 를 get / post 바꿔가며 테스트
package com.newlecture.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/calculator")
public class Calculator extends HttpServlet{
// @Override
// protected void service(HttpServletRequest req
// , HttpServletResponse res)
// throws ServletException, IOException {
//
// // getMethod()를 통해 전달된 식별자는 대문자
// if(req.getMethod().equals("GET")) {
// System.out.println("GET Request");
// } else if(req.getMethod().equals("POST")) {
// System.out.println("POST Request");
// }
//
// // 요청에 따른 doGet(), doPost() 메소드 반환
// super.service(req, res);
// }
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGET Call");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPOST Call");
}
}
위에서 진행하였던 내용들을 토대로 계산기 프로그램을 하나의 서블릿으로 합침
GET 요청에 대해서는 /calcpage가 POST 요청에 대해서는 /calc3 로 연결 시킴
위와 같이 분할 시 쿠키에 대한 문제 발생(Redundancy)
doGet()에는 기존 CalcPage.java의 내용을 doPost()에는 기존 Calc3.java의 내용을 삽입
package com.newlecture.web;
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{
@Override
protected void doGet(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
String exp = "0";
Cookie[] cookies = request.getCookies();
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>Calculation</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(" <div>");
out.write(" <form method=\"post\">");
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=\"<-\"/></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(" </div>");
out.write("</body>");
out.write("</html>");
}
@Override
protected void doPost(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
// Cookie 선언
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
exp += (value == null) ? "" : value;
exp += (operator == null) ? "" : operator;
exp += (dot == null) ? "" : dot;
}
Cookie expCookie = new Cookie("exp", exp);
// setMaxAge, setPath
if(operator != null && operator.equals("C")) {
expCookie.setMaxAge(0);
}
expCookie.setPath("/calculator");
// Redirection
response.addCookie(expCookie);
response.sendRedirect("calculator");
}
}