Servlet & Jsp : 마임타입

지환·2023년 12월 5일
0

Jsp & Servlet

목록 보기
9/21

Json으로 처리해보자.(서블릿)

마임타입

Json.java

package com.example.demo.ch6;

import org.slf4j.LoggerFactory;

import jakarta.servlet.http.HttpServlet;

public class Json{
	
	

}

JsonServlet.java


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)으로 마임타입이 일치하다 그렇기 떄문에 브라우저에서 찍혀 나오는 부분이 다르다.

실제로 프로젝트시에 자바스크립트랑 붙여지는 부분은?

테스트 케이스 1

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를 입양하지 않는 이유는?

  • jsp에서 내장객체로 제공해주고 있음 jsp.java -> jsp.class(컴파일)

redirect

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 때문에.


forward 방식

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);
 %>

  • @WebServlet("/mine/json2.do")
    • .do로 끝나는 url은 내가 가로챌게 라는 얘기
  • url은 바뀌지 않지만, 페이지는 바뀐다.

초기화면 null값

널값이 나오는 이유는 초기 화면에 null이 찍힐 수 밖에 없다.

form 태그에서 action 및 submit를 설정하지 않는 이상

현재 서블릿으로 전송되는 부분이 없기 떄문에 null값이 나오는 것이다.

만약에 form가 있었더라면 서블릿에서 받은 list 정보를 해당 부분은 처리되니?
-> Yes


정리

Front-End 언어와 Back-End 언어가 다를 떄

  • 뷰 계층과 Model 계층을 어떻게 연결해야 되는지?

    • 데이터셋은 서블릿에게 맡길것인가? JSP에게 맡길것인가?
      • 둘 다 가능하면 어떤 선택이 효과적인가?
    • 마임타입을 고민해보자.(application/json)
    • 그렇다면 DB연동의 처리 결과는 누가 쥐고 있는가?(서블릿)
    • 굳이 결과를 JSP로 넘겨야 하나?
    • 서블릿에서 내보내도 되지 않나?
  • Servlet - > Java(xxxDao.java) -> 리턴타입으로 List&Map -> Servlet -> 어떤 클래스가 필요하다.
    (클래스가 스프링에선 Model클래스를 통해서 그 정보를 유지해준다)

    • 모델객체가 파라미터 자리이다 -> 주입해준다 -> 스프링컨테이너가
profile
아는만큼보인다.

0개의 댓글