/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 {
MimeType mime = MimeType.parseAcceptToMimeType(req);
System.out.println("마임타입 : "+ mime);
resp.setContentType(mime.toString());
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]+")) {
status = HttpServletResponse.SC_BAD_REQUEST;
message = "좌측 피연산자 누락";
}
if(right==null || !right.matches("[0-9]+")) {
status = HttpServletResponse.SC_BAD_REQUEST;
message = "우측 피연산자 누락";
}
OperateType operator = null;
if(opParam==null || opParam.isEmpty()) {
status = HttpServletResponse.SC_BAD_REQUEST;
message = "연산자 누락";
}else {
try {
operator = OperateType.valueOf(opParam);
}catch (IllegalArgumentException e) {
status = HttpServletResponse.SC_BAD_REQUEST;
}
}
if(status != HttpServletResponse.SC_OK) {
resp.sendError(status,message);
return;
}
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) {
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);
}
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()와 같음