JSP 8_2 .사칙연산_예제

zhyun·2020년 11월 28일
0

JspSpring

목록 보기
11/39

/webStudy01/src/kr/or/ddit/servlet02/CalculateServlet.java

@WebServlet("/03/calculate.do")
public class CalculateServlet extends HttpServlet{
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//accept헤더에 머가 있는지
		MimeType mime = MimeType.parseAcceptToMimeType(req);
		System.out.println("마임타입 : "+ mime);
		resp.setContentType(mime.toString()); //accept에 맞는 contentType
		
		//요청받고, 요청분석
		String left = req.getParameter("leftOp");
		String right = req.getParameter("rightOp");
		String opParam = req.getParameter("operator");
		
		//널처리
		int status = HttpServletResponse.SC_OK;
		String message = null;
		if(left==null || !left.matches("[0-9]+")) {//좌측 피연산자가 null이거나 숫자가 아닐때 
			status = HttpServletResponse.SC_BAD_REQUEST;
			message = "좌측 피연산자 누락";
			
		}
		if(right==null || !right.matches("[0-9]+")) {//우측 피연산자가 null이거나 숫자가 아닐때
			status = HttpServletResponse.SC_BAD_REQUEST;
			message = "우측 피연산자 누락";
			
		}
		
		OperateType operator = null;
		if(opParam==null || opParam.isEmpty()) { // -,+,*,/,% null이거나 비었을때
			status = HttpServletResponse.SC_BAD_REQUEST;
			message = "연산자 누락";
			
		}else {
			try {
				//opparam에 대한 검증
				operator = OperateType.valueOf(opParam);
			}catch (IllegalArgumentException e) {
				status = HttpServletResponse.SC_BAD_REQUEST;
			}
		}
		
		if(status != HttpServletResponse.SC_OK) { //status가 200이 아닐때
			resp.sendError(status,message); //응답에 상태와 메세지를 같이 보낸다
			return;
		}
		
		//정상진행, req한테 받아온값들은 다 String이니까 parseInt처리
		int leftOp = Integer.parseInt(left);
		int rightOp = Integer.parseInt(right);
		int result = operator.operator(leftOp, rightOp);
		
		String exprPtrn = "%d %s %d = %d"; //숫자 문자열 숫자 = 숫자 정규식패턴
		String responseData = String.format(exprPtrn, leftOp, operator.getSign(), rightOp, result);
		Date now = new Date();
		req.setAttribute("data", responseData);
		req.setAttribute("now", now);
		
		if(MimeType.HTML == mime) {
			String view = "/WEB-INF/views/calculate.jsp";
			req.getRequestDispatcher(view).forward(req, resp);
		}else if(MimeType.JSON == mime) {
			//이 서블릿에서 응답을 책임지고 있는 부분이 없다 model2
			JsonResponseUtils.toJsonResponse(req,resp);
		}
	}
}
  • 위 서블릿에서 req.setAttribute("data",responseData);
    req.setAttribute("now",now); req한테 받아서 data를 가공 한 다음 응답데이터를 josn으로 가공하는 단계로 가야한다.
    "data", "now"가 name이 되고, responseData,now가 values가 된다.

/webStudy01/src/kr/or/ddit/utils/JsonResponseUtils.java

public class JsonResponseUtils {
	public static void toJsonResponse(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		Enumeration<String> names = req.getAttributeNames();
		
		Map<String, Object> dataMap = new HashMap<>();
		while (names.hasMoreElements()) {
			String name = (String) names.nextElement();
			Object value = req.getAttribute(name);
			dataMap.put(name, value); //req가 갖고잇는 데이터를 dataMap에 넣어줌
		}
		
		//마샬링
		ObjectMapper mapper = new ObjectMapper();
		
		String contentType = resp.getContentType();
		if(contentType == null) {
			resp.setContentType(MimeType.JSON.toString());
		}
		
		//직렬화 과정
		try(
			PrintWriter out = resp.getWriter();
		){
			mapper.writeValue(out, dataMap);
		}
	}			
}

목적

  • 요안에서 마샬링을 해야댐 - json데이터 만듦
  • 응답데이터를 json으로 가공(처리)

과정

  • 이과정을 하기위해서는 json 라이브러리를 연결해야한다. (--아래 설명--)
  • 서블릿에서 req에 setAttribute한 값들을 가져와야 응답데이터를 만들 수 있다.
  • setAttribute한 name들을 일단 가져와야한다.
    • Enumeration<String> names = req.getAttributeNames();
  • setAttribute, getAttribute (name, values) 타입이 (string,object)이다.
    그래서 name,values를 넣을때 Map<String,Object> 여기에 put한다.
  • 서블릿에서 resp.setContentType한 MimeType을 가져와서(getContentType()) ->

Enumeration 인터페이스

  • 메서드 종류
    • hasMoreElements() : 읽어올 요소가 남아있는지 확인.
      있으면 true, 없으면 false. Iterator의 hasNext()와 같음.
    • nextElement() : 다음 요소를 읽어옴. Iterator의 next()와 같음
profile
HI :)

0개의 댓글