카테고리 없음

servlet 으로 자바의 집합체들을 json데이터로 만들기( 오늘은 받는거말고 내보내는것만)

logloglog 2021. 1. 4. 12:21

index html이 열리는 이유는 기본서블렛때문이라고 했따


 

servlet 으로 json데이터 만들기

 

일괄적으로 데이터 만들떄 jackson  어쩌고사용함

 

 

jackson-databind-2.9.8.jar
1.28MB
복붙

 

아까 그 페이지에서 저것들도 받는다.. 저부분이 호환버전
jackson-core-2.9.8.jar
0.31MB
jackson-annotations-2.9.0.jar
0.06MB

 

JDBC 에서 resultSet이랑 statement만드는 부분에서 좀 번거로움

 

항상 중심엔 JAVA가 있음. 왜냐면 전체로 봤을때 화면단은 입출력에 불과하고 DB는 결국은 저장소..storage..

사용자가 보는 뷰단은 결국은 전체 아키텍쳐에서 입출력에 불과한거란 말임

그 사이에 java 가 중간다리역할을 하는거임

 

view에서 이루어 지는 데이터 속성이 web이라고 치면 들어가는 언어는 html;이 되는거임

 

getparameter로 구해서 set id //                        // getString(id)(resultSet)로  setid

 

 

*서블릿에서 화면만드는게 버거워지니까 jsp나온거임

출처 : 다은이;

실제로 json데이터를어떻게 자바로 매핑시키는지... 에 대해서 얘기할거임

 

데이터는 키 : 밸류 (ex 수학 : 40점 ) 형태임. java은 변수명에 할당하는형식. a = 40 이런 형태.. 그래서 변수명을 잘 지어야함. 다시말해 변수명이 Key가 된다.

그럼 json은? 자원을 줄이기 위해서 key : value형탱를 그대로 .. 속성명 : value 이런식으로 한다.

 

자바에서 MemberVO라는 Class가 있을때, String id="mini"가 들어가잇다고 치자

이건 json 으로 바꾸면

{id:"mani"} 로 표현한다.

 

이걸 매핑한다라고 한다.

 

자바의 변수= 값은 json에서는 property: value 가 된다

 

이제 집합체가 문제임sdfdsfs

 

 배열의 형태( Vector)

 

json 의 어레이 형태는 잭슨형을 거치면 Array/List가 된다 cla.

 

 

서블릿만들거임

 

잭슨이 겟메서드를 씀

리플렉션을 이용할때 겟메서드와 셋메서드를 이용하고..????

 

???

 

 

일단 내보낼 데이터를 만들어야함

 

package com.json.to;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

@WebServlet("/classToJson")
public class ClassToJsonServlet extends HttpServlet {

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
	   Data data = new Data(); //  new Data () 하게되면 그 안에 String message .. 그 안에 "sinchucknyun.."이라고 들어가잇는거임
	   //json으로 된다면,, class니까 {} 생기고 그 안에 message : sinchuk 이라고 들어갈거라고 예상됨 (화이트박스테스으)
	   
	 //이제 이걸 내보내야하는데
	   ObjectMapper mapper = new ObjectMapper(); // ObjectMapper 가 변환자임.. dataMap.put() 을 {score:{kor:95,math:90...} 으로 바꾸는
	   //잭슨패키지에 잇는 녀석임 
	   //여기서 붕어빵은 mapper임.. 얘가 실제로 일을 함
	   //mapper가  java의 Object를 json의 String형태로 만들어줄거임
	   
	   //줄때 야 이거 json이야 라고 말해줘야하므로 컨텐츠타입 정해줌
	    response.setContentType("application/json;charset=utf-8");
	    //주의! writer꺼내기 전에 contenttype말해줘야함.. 헤더먼저 세팅후 라이터 가져오기
	   PrintWriter out = response.getWriter();//29 번줄이랑 순서바뀌면 안됨!
	   
	   out.println(mapper.writeValueAsString(data));//json형태의 STring으로 만들어짐 //하나씩 꺼내서 json데이터에 넣는게 이 한줄로 끝남
	   
	   out.close();
	   
	   
	   
	   
   }

   
}
class Data{
   String message="신축년입니다.";

   public String getMessage() {
      return message;
   }

   public void setMessage(String message) {
      this.message = message;
   }
   
}

 

 

서버의 web.xml은 모든 프젝에 적용

각각의 프젝의 web.xml은 각각의 프젝에 적용되는 WAS의 행위들을 정의

 

프젝의 web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app>
	<filter>
		<filter-name>setCharacterEncodingFilter</filter-name>
		<filter-class>
			org.apache.catalina.filters.SetCharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>setCharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

 

해당 프젝이 was에 들어가있는지 확인 후 서버돌린다.
 localhost다음에 /jQuery_test가 들어가야 한다는걸 알 수 잇다 (Context Root)

 

다운받고 새고하면 이렇게 보인다!

여기서 .. 사용자가 보낸 메세지를 좀 바꾸고 싶네?

 

사용자가 보낸 메세지를 받아서 저 메세지의 밸류를 바꾸려고 한다...? 데이터는 브라우저가 받는건 서버임

브라우저에서 사용자가 준 데이터를 받아서  json데이터에 데이터를 풀려고 하는데

지금 뭘로보내? 주소줄임!

이렇게 하면 주는놈은 있는데 받는놈은 없는거임.. 받는거는 서버! 서버에서 받는역할은 서블릿이 함

그래서 우리가 그녀석을 컨트롤러라고 함. 

그래서 서블릿을 화면제어라는 뜻의 컨트롤러... 그게 MVC 패턴

 

암튼 저 안녕하십니까를 뭘로받을거임? 이름... (항상 보내는 데이터에는 이름이있다)

?뒤에 써서 보내는걸 파라미터형식이라고 함

data.set~이 내보내려고 넣은거임

 

이제 주는놈 받는놈 처리하는놈있으니까 나오게되어있따. 이게 ajax 기본임

 

근데 사용자가 저 url쓰게 만들거임 ?  이렇게 보여줄거임?? no ! >> 예쁜 UI 만들어서 보여줘야하므로 이제 jQuery가 필요한거임

 

 

그럼 이제 list를 만들면 어떻게 될까

간접적으로 class를 하나 만들건데 패키지는 member vo

package com.json.to;

public class MemberVO {
	private String id;
	private String pwd;
	private String phone;
	private String email;
	
	public MemberVO() {}
	public MemberVO(String id, String pwd, String phone, String email) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.phone = phone;
		this.email = email;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
}

VO 는 왜만들어? DB의 데이터를 자바로 변환시켜야하는데 그걸 하기위한 바구니같은애임. 그릇같은애

그래서  VO 는 DB에 데이터를 가져오거나 넣어야할떄 그 데이터의 갯수나 종류나 타입에 모자름이 없이 만들어야

CRUD 가 가능

db와 java 사이에 왓다갔다하는 객체임

DB  에서 내가 필요한 정보 단위로 만드는거임 테이블단위가 아니라..

 

여러개 테이블을 조인해서 가져와야하는 데이터가 있따면 테이블 기준이 아니라 데이터 셋을 기준으로 잡아야함

그것이 정규화로 잘라져있던 하나로 되어잇던 간에... 테이블이 몇개건간에 결국은 DB에서 가져와야 하는거니까

변수명의 이름을 컬럼명으로 맞춰야 어떤데이터가 어떤데이터인지 알 수 있다.

그래서  vo객체의 변수명은 컬럼명에 맞춰라

VO는 껍데기이고 알맹이는 DB의 데이터들인거임

이걸 안맞추니까 mapper에 map을 맞춰야하게되는거임

 

그니까 DB에 id,pwd,phone,email이라는 컬럼이 있다는 거임

 

 


 

이제 list 형태로 만들거임

package com.json.to;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.json.dto.MemberVO;

/**
 * Servlet implementation class ListToJsonServlet
 */
@WebServlet("/ListToJson")
public class ListToJsonServlet extends HttpServlet {


	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		List<MemberVO> memberList = new ArrayList<MemberVO>();//내보낼 대상. 처리의 대상이기때문에 먼저 만들어놓은거임
		
		//처리단
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		
		//출력 은 동일하다 (복붙)
		 
		   ObjectMapper mapper = new ObjectMapper(); // ObjectMapper 가 변환자임.. dataMap.put() 을 {score:{kor:95,math:90...} 으로 바꾸는
		   //잭슨패키지에 잇는 녀석임 
		   //여기서 붕어빵은 mapper임.. 얘가 실제로 일을 함
		   //mapper가  java의 Object를 json의 String형태로 만들어줄거임
		   
		   //줄때 야 이거 json이야 라고 말해줘야하므로 컨텐츠타입 정해줌
		    response.setContentType("application/json;charset=utf-8");
		    //주의! writer꺼내기 전에 contenttype말해줘야함.. 헤더먼저 세팅후 라이터 가져오기
		   PrintWriter out = response.getWriter();//29 번줄이랑 순서바뀌면 안됨!
		   
		   out.println(mapper.writeValueAsString(memberList));//json형태의 STring으로 만들어짐 //하나씩 꺼내서 json데이터에 넣는게 이 한줄로 끝남
		   
		   out.close();
	}



}


이제 맵핑을 해보자

 

package com.json.to;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.json.dto.MemberVO;

/**
 * Servlet implementation class MapToJsonServlet
 */
@WebServlet("/MapToJson")
public class MapToJsonServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//일단 맵이필요할거니까 맵을 만들건데 
		Map<String, MemberVO> dataMap = new HashMap<String, MemberVO>();
		
		dataMap.put("member1", new MemberVO("mimi","mimi","mimi","mimi"));
		dataMap.put("member2", new MemberVO("mimi","mimi","mimi","mimi"));
		dataMap.put("member3", new MemberVO("mimi","mimi","mimi","mimi"));
		//json 으로 어떻게 나올까? {member1 : {id : "mimi", pwd : "mimi"....} ,member2 : {} , member3 : {}}
		
		ObjectMapper mapper = new ObjectMapper(); // ObjectMapper 가 변환자임.. dataMap.put() 을 {score:{kor:95,math:90...} 으로 바꾸는
		   //잭슨패키지에 잇는 녀석임 
		   //여기서 붕어빵은 mapper임.. 얘가 실제로 일을 함
		   //mapper가  java의 Object를 json의 String형태로 만들어줄거임
		   
		   //줄때 야 이거 json이야 라고 말해줘야하므로 컨텐츠타입 정해줌
		    response.setContentType("application/json;charset=utf-8");
		    //주의! writer꺼내기 전에 contenttype말해줘야함.. 헤더먼저 세팅후 라이터 가져오기
		   PrintWriter out = response.getWriter();//29 번줄이랑 순서바뀌면 안됨!
		   
		   out.println(mapper.writeValueAsString(dataMap));//json형태의 STring으로 만들어짐 //하나씩 꺼내서 json데이터에 넣는게 이 한줄로 끝남
		   
		   out.close();
	}

	
}

자꾸 출력부분이 중복된다?> 메서드로 빼자> 내일할거임

 

내일은 json 구조를 보고  그걸 받을수잇는 객체를 만들거임(오늘이랑 반대)

 

마지막에 자유게시판 (CRUD) + 댓글 + 파일업로드. 다운로드

 

 

어떤 기능을 만들 때, 항상 give and take를 생각하기

 

저 만큼의 출력단을 잘라내서 resolver (해결사) 로 만들거임 얘 만들어놓고 resp랑 내보내는 객체만 쏙 주면 해결사가 알아서 해줄거임

프로세스상에 꼭 필요한건 아니지만 있으면 좋은거 >> Utility 

package com.json.to;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.json.dto.MemberVO;
import com.json.util.JsonResolver;

/**
 * Servlet implementation class ListToJsonServlet
 */
@WebServlet("/ListToJson")
public class ListToJsonServlet extends HttpServlet {


	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		List<MemberVO> memberList = new ArrayList<MemberVO>();//내보낼 대상. 처리의 대상이기때문에 먼저 만들어놓은거임
		
		//처리단
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		memberList.add(new MemberVO("mimi","mimi","mimi","mimi"));
		
		//출력 은 동일하다 (복붙)
		 
		try {
			JsonResolver.view(response, memberList);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}



}

 

 

package com.json.to;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.json.dto.MemberVO;

/**
 * Servlet implementation class MapToJsonServlet
 */
@WebServlet("/MapToJson")
public class MapToJsonServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//일단 맵이필요할거니까 맵을 만들건데 
		Map<String, MemberVO> dataMap = new HashMap<String, MemberVO>();
		
		dataMap.put("member1", new MemberVO("mimi","mimi","mimi","mimi"));
		dataMap.put("member2", new MemberVO("mimi","mimi","mimi","mimi"));
		dataMap.put("member3", new MemberVO("mimi","mimi","mimi","mimi"));
		//json 으로 어떻게 나올까? {member1 : {id : "mimi", pwd : "mimi"....} ,member2 : {} , member3 : {}}
		
		ObjectMapper mapper = new ObjectMapper(); // ObjectMapper 가 변환자임.. dataMap.put() 을 {score:{kor:95,math:90...} 으로 바꾸는
		   //잭슨패키지에 잇는 녀석임 
		   //여기서 붕어빵은 mapper임.. 얘가 실제로 일을 함
		   //mapper가  java의 Object를 json의 String형태로 만들어줄거임
		   
		   //줄때 야 이거 json이야 라고 말해줘야하므로 컨텐츠타입 정해줌
		    response.setContentType("application/json;charset=utf-8");
		    //주의! writer꺼내기 전에 contenttype말해줘야함.. 헤더먼저 세팅후 라이터 가져오기
		   PrintWriter out = response.getWriter();//29 번줄이랑 순서바뀌면 안됨!
		   
		   out.println(mapper.writeValueAsString(dataMap));//json형태의 STring으로 만들어짐 //하나씩 꺼내서 json데이터에 넣는게 이 한줄로 끝남
		   
		   out.close();
	}

	
}