웹 : R.Body, 마샬링, 직렬화 : 0306
MAVEN 1. 저장소개념(repository) 2. ...
마커인터페이스 : 가능, 불가능만 체킹하는 인터페이스
시리얼라이즈 임플리먼츠하는 것 : 시리얼라이징 가능하게 체킹해주는 것 :implements Serializable
오늘 사용할 클래스 : TestVO, MashallingSample 참고 : StreamDesc
//MashallingSample.java
package kr.or.ddit.modeling;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOError;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class MashallingSample {
public static void main(String[] args) {
// serializeCase1();
// deSerializeCase1();
// marshallingCase2();
// unMarshallingCase2();
// marshallingCase3();
// unMarshallingCase3();
// MarshallingCase4ToXML();
unMarshallingCase4FromXML();
}
private static void unMarshallingCase4FromXML() {
File file = new File("C:/DDIT/00.medias/test3.xml");
try(
FileInputStream fis = new FileInputStream(file);
){
ObjectMapper objectMapper = new XmlMapper();
TestVO testVO = objectMapper.readValue(fis,TestVO.class);
System.out.println(testVO);
}catch (Exception e) {
e.printStackTrace();
}
}
private static void MarshallingCase4ToXML() {
TestVO testVO = new TestVO();
testVO.setProp1("value1");
testVO.setProp2(45);
testVO.setPassword("비밀번호");
File file = new File("C:/DDIT/00.medias/test3.xml");
try(
FileOutputStream fos = new FileOutputStream(file);
){
ObjectMapper objectMapper = new XmlMapper();
objectMapper.writeValue(fos, testVO);
}catch (Exception e) {
e.printStackTrace();
}
}
private static void unMarshallingCase3() {
File file = new File("C:/DDIT/00.medias/test2.json");
try(
FileInputStream fis = new FileInputStream(file);
){
ObjectMapper objectMapper = new ObjectMapper();
TestVO testVO = objectMapper.readValue(fis,TestVO.class);
System.out.println(testVO);
}catch (Exception e) {
e.printStackTrace();
}
}
private static void marshallingCase3() {
TestVO testVO = new TestVO();
testVO.setProp1("value1");
testVO.setProp2(45);
testVO.setPassword("비밀번호");
File file = new File("C:/DDIT/00.medias/test2.json");
try(
FileOutputStream fos = new FileOutputStream(file); //파일 내보낼 것 생성
){
ObjectMapper objectMapper = new ObjectMapper(); // jackson 객체 생성
objectMapper.writeValue(fos, testVO); // jackson에 파일이랑 직렬화 동시에 할 파일 형태 같이 전달
}catch (Exception e) {
e.printStackTrace();
}
}
private static void unMarshallingCase2() {
File file = new File("C:/DDIT/00.medias/test.json");
try(
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
){
String json = br.readLine(); // 역직렬화
ObjectMapper objectMapper = new ObjectMapper(); // 언마샬링
TestVO testVO = objectMapper.readValue(json, TestVO.class);
System.out.println(testVO);
}catch (Exception e) {
e.printStackTrace();
}
}
private static void marshallingCase2() {
TestVO testVO = new TestVO();
testVO.setProp1("value1");
testVO.setProp2(45);
testVO.setPassword("비밀번호");
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writeValueAsString(testVO);
System.out.println(json);
File file = new File("C:/DDIT/00.medias/test.json");
try(
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
){
bw.write(json);
}
// TestVO testVO2 = objectMapper.readValue(json, TestVO.class);
// System.out.println(testVO2);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void deSerializeCase1() {
File file = new File("C:/DDIT/00.medias/test.dat");
try(
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
){
TestVO testVO = (TestVO)ois.readObject();
System.out.println(testVO);
System.out.println(testVO.getPassword());
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
private static void serializeCase1() {
// 0. 전송하거나 저장할 데이터 준비(객체형태)
TestVO testVO = new TestVO();
testVO.setProp1("value1");
testVO.setProp2(45);
testVO.setPassword("비밀번호");
// 1. 매체를 핸들링할 수 있는 형태의 객체로 생성.
File file = new File("C:/DDIT/00.medias/test.dat");
try(
// 2. 단방향 1차 스트림 객체 생성
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos); //oos 직렬화하는 2차 스트림
){
oos.writeObject(testVO); // 직렬화
}catch (IOException e) {
e.printStackTrace();
}
}
}
자바빈 규약
https://dololak.tistory.com/133
[JAVAEE] 자바빈(JavaBean) 이란? 자바빈 규약에 대해
자바빈(JavaBean) 이란? 자바빈이란 특정한 기능을 지닌 컴포넌트를 말하는 것이 아닙니다. 간단히 말하자면 자바빈 규약 또는 자바빈 관례에 따라 만들어진 클래스를 의미합니다. 자바빈 사용 배
dololak.tistory.com
json사용한다는것은 기본적으로 2tier이상이다. 언어가 다르다. => implements Serializable 필요. 내가 직렬화 하든안하든.
R.Line = 편지 봉투 / R.Body = 편지지
Get방식을 사용하면 편지봉투에 내용을 담게 된다. queryString (= get방식에서의 정보전달은 String이어야한다.)
그럼, 집배원(WAS=Tomcat)이 가장 먼저 편지 봉투의 정보를 보게 된다.
==> 라인으로 파라미터가 담겨오면 8버전에서는 톰캣이 설정을 해준다. 그런데 안된다면? 톰캣이 하고있지 않은 것.
서버에서하고 있기 때문에 서버 관리자 (톰캣의 경우 server.xml)에 가서 인코딩을 해준다. 포트번호 다음에
post방식이라 바디로 들어오는 한글이 깨진다면? request.setCharacterEncoding하자.
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
/>
그런데 get방식에서도 바디에서의 인코딩 방식을 사용하고 싶다면?
server.xml에다가 useBodyEncodingForURI="true" 추가.
글자와 파일을 보내야한다면? 받는 데이터의 형태가 여러가지라서 혼란스럽다 => multi part 파트를 쪼개어 파트별로 꽂아서 보내자 => enctype ==> 특별한 구분자로 구분함 => parameter로 더이상 받을 수 없다 => part타입으로 캡슐화하(각 입력태그의 name값은 part의 name값이 된다.)
request에는 parameter전체를 관리하는 저장 객체가 존재한다. map 컬렉션 형태로 저장된다.(키:밸류 가 필요해)
//clientSendData.jsp
<%@page import="java.io.InputStream"%>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 파라미터 확보 전 사용함.
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>파라미터 : <%=Arrays.toString(request.getParameterValues("param1")) %></h4>
<h4> 클라이언트 전송 컨텐츠 확보 </h4>
<pre>
클라이언트의 의도적 전송 데이터 분류
1. request parameter(문자열, urlEncoded[persent encoded] string)
: String getParameter(name), Map<String, String[]< getParameterMap(),
String[] getParameterValues(name), Enumeration<String< getParameterNames()
- line 을 통한 query stringa
- body 을 통한 form data
2. multi part : Part(servlet 3.x 부터) 타입으로 하나의 part 데이터를 캡슐화함.
getPart, getParts
3. content payload : body 영역을 통해 특정 컨텐츠 타입(Content-Type)으로 전송되는 경우.
역직렬화-> 언마샬링 구조 필요(ObjectMapper), request.getInputStream()
<%--
InputStream is = request.getInputStream();
--%>
</pre>
<form action="./fileUploadProcess" method="post" enctype="multipart/form-data">
<input type="text" name="param1" value="한글값1"/>
<input type="text" name="param1" value="value2"/>
<input type="file" name="uploadFile" />
<input type="submit" value="전송"/>
</form>
</body>
</html>