Json으로 처리해보자.(서블릿)
package com.example.demo.ch6;
import org.slf4j.LoggerFactory;
import jakarta.servlet.http.HttpServlet;
public class Json{
}
package com.example.demo.ch6;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/mine/json.do")
public class JsonServlet extends HttpServlet {
Logger logger = LoggerFactory.getLogger(JsonServlet.class);
//Get방식에 대한 처리다. (url 패턴이 어떻게 필요하지? -> )
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json");
//응답을 한다. resp (서블릿에서 -> jsp로 전송하는 역할을 한다.)
req.setCharacterEncoding("utf-8");
//이것은 req인데(듣는다-> 누구로부터? -> 클라이언트로부터 -> 클라이언트로 받는데, 타입 설정을 utf-8로 한 것.
PrintWriter out = resp.getWriter(); //resp(응답으로) 내보낸다는 의미
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> rmap = new HashMap<>(); //SELECT deptno, dname, loc FROM dept
rmap.put("deptno", 10);
rmap.put("dname", "총무부");
rmap.put("loc", "서울");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 20);
rmap.put("dname", "개발부");
rmap.put("loc", "인천");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 30);
rmap.put("dname", "운영부");
rmap.put("loc", "서울");
list.add(rmap);
Gson g = new Gson();
String temp = g.toJson(list);
out.print(list);
out.print(temp);
}
}
url-Pattern : http://localhost:8000/mine/json.do
out.print(list)로 하면 Json 형식에 맞지않다.
포스트맨으로 살펴보자.
[
{loc=서울, dname=총무부, deptno=10
},
{loc=인천, dname=개발부, deptno=20
},
{loc=서울, dname=운영부, deptno=30
}
][
{
"loc": "서울",
"dname": "총무부",
"deptno": 10
},
{
"loc": "인천",
"dname": "개발부",
"deptno": 20
},
{
"loc": "서울",
"dname": "운영부",
"deptno": 30
}
]
list
로 출력하면 key & value 연산자 사이에 =
가 있다. (Json형식x)
temp
를 보면 Key & Value에 대해서 매핑이 되어 있다. Json형식으로 되어있다.
이와 같이 마임타입은 중요하다. 여기서 마임타입은 코드에서 뭘까?
resp.setContentType("application/json");
이다. 이 부분이 마임타입이다. 마임타입을 보게되면 json이고 서블릿이라고 읽지만 실질적으로 브라우저에 전송 되는 것은 json형식이다.
out.print(list)로 브라우저에 찍어봤을 때 list가 json형식인가?
아니다. 그렇기 떄문에 (=) 이렇게 대입연산자가 들어간 상태로 출력됐다.
이번엔 out.print(temp)는 json형식으로 바뀌었기 떄문에 (Gson)으로 마임타입이 일치하다 그렇기 떄문에 브라우저에서 찍혀 나오는 부분이 다르다.
실제로 프로젝트시에 자바스크립트랑 붙여지는 부분은?
http://localhost:8000/mine/json.do?!
이렇게 준다면?
get방식이기 때문에 브라우저로부터 인터셉트를 당할 수 있어서 서버를 경유하지 않고 응답을 받아올 수 있어서 ?12 이런식으로만 적어도 200번으로 들어간다.
[{loc=서울, dname=총무부, deptno=10}, {loc=인천, dname=개발부, deptno=20}, {loc=서울, dname=운영부,
deptno=30}][{"loc":"서울","dname":"총무부","deptno":10},{"loc":"인천","dname":"개발부","deptno":20},{"loc":"서울","dname":"운영부","deptno":30}]
다르게 나온다.
바디부에는 비어있다.(Get방식이기 때문에)
다음엔, jsp 파일을 만들어보자.
(전)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
(후)
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
application/json
으로 마임타입을 맞춰야한다.
받아오려면 스트리트릿을 써야된다.
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.util.*, com.google.gson.Gson"%>
<%
//PrintWriter out = response.getWriter();
//resp로 작성하는게 아니라, 서블릿에선 지역변수로 사용이 가능했지만, 여기선 내장객체로써 작용하기 때문에 내장객체 Full-Name으로 작성해야한다.
//out.print("<br>");
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> rmap = new HashMap<>(); //SELECT deptno, dname, loc FROM dept
rmap.put("deptno", 10);
rmap.put("dname", "총무부");
rmap.put("loc", "서울");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 20);
rmap.put("dname", "개발부");
rmap.put("loc", "인천");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 30);
rmap.put("dname", "운영부");
rmap.put("loc", "서울");
list.add(rmap);
Gson g = new Gson();
String temp = g.toJson(list);
out.print(list);
out.print(temp);
%>
res,req에 대한 설명
서블릿에선 톰캣 객체가 res,req를 주입해준다. 그리고 지역변수
로 작동하는데, 스트리트릿은 jsp내장 객체에서 제공해주기 때문에 Full-name을 작성해야된다.
왜? -> jsp.java -> jsp.class(컴파일) 로 변환해주기 때문이다.
PrintWriter를 입양하지 않는 이유는?
package com.example.demo.ch6;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/mine/json2.do")
public class JsonServlet2 extends HttpServlet {
Logger logger = LoggerFactory.getLogger(JsonServlet2.class);
//Get방식에 대한 처리다. (url 패턴이 어떻게 필요하지? -> )
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("doGet");
resp.sendRedirect("./jsonTest.jsp");
}
}
http://localhost:8000/mine/JsonTest.do 엔터 쳤는데
http://localhost:8000/mine/JsonTest.jsp 로 변환되서 나옴
왜? sendRedirect 때문에.
http://localhost:8000/mine/json2.do
package com.example.demo.ch6;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/mine/json2.do")
public class JsonServlet2 extends HttpServlet {
Logger logger = LoggerFactory.getLogger(JsonServlet2.class);
//Get방식에 대한 처리다. (url 패턴이 어떻게 필요하지? -> )
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("doGet");
PrintWriter out = resp.getWriter();
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> rmap = new HashMap<>(); //SELECT deptno, dname, loc FROM dept
rmap.put("deptno", 10);
rmap.put("dname", "총무부");
rmap.put("loc", "서울");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 20);
rmap.put("dname", "개발부");
rmap.put("loc", "인천");
list.add(rmap);
rmap = new HashMap<>();
rmap.put("deptno", 30);
rmap.put("dname", "운영부");
rmap.put("loc", "서울");
list.add(rmap);
Gson g = new Gson();
String temp = g.toJson(list);
out.print(list);
out.print(temp);
req.setAttribute("list",list);
RequestDispatcher view = req.getRequestDispatcher("./JsonTest2.jsp");
view.forward(req, resp);
//테스트 케이스
// localhost:/mine/json2.do 호출
}
}
JsonTest2.jsp
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.util.*, com.google.gson.Gson"%>
<%
List<Map<String,Object>> list = (List)request.getAttribute("list");
Gson g = new Gson();
String temp = g.toJson(list);
out.print(list);
out.print(temp);
%>
초기화면 null값
널값이 나오는 이유는 초기 화면에 null이 찍힐 수 밖에 없다.
form 태그에서 action 및 submit를 설정하지 않는 이상
현재 서블릿으로 전송되는 부분이 없기 떄문에 null값이 나오는 것이다.
만약에 form가 있었더라면 서블릿에서 받은 list 정보를 해당 부분은 처리되니?
-> Yes
Front-End 언어와 Back-End 언어가 다를 떄
뷰 계층과 Model 계층을 어떻게 연결해야 되는지?
Servlet - > Java(xxxDao.java) -> 리턴타입으로 List&Map -> Servlet -> 어떤 클래스가 필요하다.
(클래스가 스프링에선 Model클래스를 통해서 그 정보를 유지해준다)