간단한 소개
html의 정적인 웹페이지에서 servlet을 이용해 동적인 웹페이지(계산기)구현
숫자를 post로 입력받아 쿠키를 브라우저에 쿠키를 저장하여 "=" 연산기호를 사용하면ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
자바스크립트엔진을통해 계산하여 결과값 Redirect한다 그리고
"C"를 누르면 expCookie.setMaxAge(0); 을 이용하여
저장된 쿠키를 만료시켜 초기값인 "0" 으로 다시 설정된다.
서버 : 톰켓9v 사용
느낀점
비록 보고 따라한 클론? 코딩이지만 무작정 보고 따라치기보다
서블릿이 어떻게 구현되는지 흐름을 알수있었다.
알수있었던것들
#상태 저장 객체 application(서버 저장소),session(서버 저장소),cookie(클라이언트 저장소)의
각각의 사용범위,생명주기,저장위치
#get , post 요청의 차이점
#cookie의 옵션 .setMaxAge(); 로 쿠키 만료시간 설정
# .getParmeter(); 로 입력값 받아오기
#@WebServlet("/url") 로 servlet소스에서 url mapping
#인코딩방식 .setCharacterEncoding("UTF-8"); .setContentType("text/html; charset=UTF-8"); 등
#html 소스를 서블릿 파일에 합치기위한 객체생성과 구문
PrintWriter out = response.getWriter(); //html소스 서블릿 소스에 합칠 구문
out.write(""); //("") html구문 합침
#doGet(); , doPost() 메서드 오버라이딩으로 서블릿소스 하나로 합치기
package restart;
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{
//get요청 소스 시작
@Override //doGet메서드 오버라이딩 get요청을하는 웹페이지와 post를요청하는 페이지를 각각
//doGet , doPost 메서드로 오버라이딩하여 하나의 서블릿 소스로 합쳤다.
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();
//html 소스를 서블릿 파일에 합치기위헤 위의 객체를 생성하고 아래의 구문"out.write("");"을 사용하였다.
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write("<head>");
out.write("<meta charset=\"UTF-8\">");
out.write("<title>계산기</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(" .head{");
out.write(" padding : 50px;");
out.write(" }");
out.write(" </style>");
out.write("</head>");
out.write("<body>");
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=\"CD\"/></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>");
}
//get요청 소스 끝
//post요청 소스 시작
@Override //doPost메서드를 오버라이딩해서 Post를 담당하는 소스를 오버라이딩 했다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies(); // 쿠키 읽기
// get요청값 각자의 문자열 변수에 저장
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"); //계산 로직 대신 자바스크립트 엔진사용 jdk상위버전에선 다른 식으로 자바스크립트를 사용하도록 바뀜
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")) //계산기 "C"를 누리면 쿠키를 만료시켜 초기값으로 되돌린다.
expCookie.setMaxAge(0);
expCookie.setPath("/calculator"); //path를 calculator두어 쿠키를 이문서에문 유효하게한다.
response.addCookie(expCookie); //쿠키 추가
response.sendRedirect("calculator"); //
}
//post요청 소스 끝
}
'Prgraming Error > jsp,servlet' 카테고리의 다른 글
JSP MVC model1 이란? (0) | 2022.01.28 |
---|---|
jsp ) 소스안 자바코드 넣는 코드블럭 (0) | 2022.01.26 |
jsb/Servlet Application / Session / Cookie 정리 (0) | 2022.01.25 |
jsp/servlet #Cookie 옵션 .setMaxAge (0) | 2022.01.25 |
jsp/servlet #Cookie 옵션 (0) | 2022.01.25 |