json

jinkyung·2021년 2월 3일
0

Ajax

목록 보기
1/8
post-thumbnail

서버는 데이터를 jason방식으로 바꿔 보낸다
(tomcat은 동기식)

페이지가 아니라 데이터만 받아서 브라우저에 뿌린다.


Gson 라이브러리 추가
: 자바 객체를 json으로 변환시켜 준다.

기능 이해를 위해 데이터 베이스를 이용하지 않고 코딩

Contact.java

package com.ajaxstudy.contact.domain;

/*
이 vo 클래스 객체는 json으로 변환될 것이다 
{"no":1, "name":"홍길동", "tel":"010-1111-1111","address":"지리산"}

배열 
[
	{"no":1, "name":"홍길동", "tel":"010-1111-1111","address":"지리산"},
	{"no":1, "name":"임꺽정", "tel":"010-1111-1111","address":"구월산"},
	{"no":1, "name":"장길산", "tel":"010-1111-1111","address":"장산곶"}
 ]

*/

public class Contact {
	private long no;
	private String name;
	private String tel;
	private String address;
	
	
	public Contact() {
		super();
	}
	
	
	public Contact(long no, String name, String tel, String address) {
		super();
		this.no = no;
		this.name = name;
		this.tel = tel;
		this.address = address;
	}
	
	
	public long getNo() {
		return no;
	}
	public void setNo(long no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}


	@Override
	public String toString() {
		return "Contact [no=" + no + ", name=" + name + ", tel=" + tel + ", address=" + address + "]";
	}
}

ContactList.java

package com.ajaxstudy.contact.domain;

import java.util.List;

/*
ContactList는 아래와 같은 json으로 변환된다 
{
"pageNo":3,
"pageSize":5,
"totalCount":34,
"contacts":[
     {"no":1, "name":"홍길동", "tel":"010-1111-1111","address":"지리산"},
     {"no":2, "name":"임꺽정", "tel":"010-1111-1111","address":"구월산"},
     {"no":3, "name":"장길산", "tel":"010-1111-1111","address":"장산곶"}
     {"no":4, "name":"장길산", "tel":"010-1111-1111","address":"장산곶"}
     {"no":5, "name":"장길산", "tel":"010-1111-1111","address":"장산곶"}
    ]
}
*/

public class ContactList {
	private int pageNo;
	private int pageSize;
	private int totalCount;
	private List<Contact> contacts;
	
	public ContactList() {
		super();
	}
	
	public ContactList(int pageNo, int pageSize, int totalCount, List<Contact> contacts) {
		super();
		this.pageNo = pageNo;
		this.pageSize = pageSize;
		this.totalCount = totalCount;
		this.contacts = contacts;
	}


	public int getPageNo() {
		return pageNo;
	}
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public List<Contact> getContacts() {
		return contacts;
	}
	public void setContacts(List<Contact> contacts) {
		this.contacts = contacts;
	}

	@Override
	public String toString() {
		return "ContactList [pageNo=" + pageNo + ", pageSize=" + pageSize + ", totalCount=" + totalCount + ", contacts="
				+ contacts + "]";
	}
	
	
}

converter.java

package com.ajaxstudy.contact.util;

import java.io.*;

import com.google.gson.Gson;

/*
 * 
 *  java 객체 <-> json 데이터 
 */

public class Converter {	
	private static Gson gson;
	
	static {
		gson = new Gson();
		
	}
	
	
	//Java 객체 -> json 문자열로 변환 
	public static String converToJson(Object obj) {
		return gson.toJson(obj);
	}
	
	//json 문자열-> (해당 클래스타입의) java 객체로 변환 
	public static <T> T convertFromJson(String json, Class<T> type) {
		return gson.fromJson(json, type);
	}
	
	//브라우저와 연결된 스트림에서 전송된 데이터를 읽어서 -> java 객체로 변환 
	public static <T> T convertFromJsonStream(InputStream is, Class<T> type) {
		try {
			Reader reader = new BufferedReader( new InputStreamReader(is, "UTF-8"));
			return gson.fromJson(reader, type);
			
		} catch(Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}

sampleDAO.java

package com.ajaxstudy.contact.util;

import java.util.ArrayList;
import java.util.List;

import com.ajaxstudy.contact.domain.Contact;
import com.ajaxstudy.contact.domain.ContactList;

/*
연락처 리스트를 저장하고 있는 클래스
DB에 연결하지 않고 컬렉션 객체에 주소데이터를 보관
*/
public class SampleDAO {
	private static String namelist = "고수,공유,권상우,권율,김범,김수현," +
									"김우빈,현빈,남주혁,마동석,박보검,박서준," +
									"박해일,박해진,박형식,서강준,서인국,소지섭," +
									"송강호,신구,안재욱,양택조,옥택연,원기준," +
									"원빈,유오성,유지태,윤계상,윤상현,이계인," +
									"이광기,이덕화,이동욱,이병헌,이원종,이준기," +
									"인교진,임창정,임채무,전무송,전국환,전노민," +
									"정우성,정보석,정웅인,조인성,조정석,조진웅,"+
									"주지훈,지성,지창욱,지진희,지현우,주원," +
									"차인표,차승원,최다니엘,최민수,최민식,최불암,"+
									"하석진,현빈,홍광호,황정민";
	private static List<Contact> contacts;
	private static long nextNo = 0;
	
	// 데이터 초기화(주소록 정보 생성)
	static {
		String[] names = namelist.split(",");
		contacts = new ArrayList<Contact>();
		for(int i=0;i<names.length;i++) {
			nextNo++;
			String tel = "010-1111-22" + (i+10);
			Contact c = new Contact(nextNo, names[i], tel, "서울특별시");
			contacts.add(0, c);
		}
	}
	
	// 전체 주소 요청
	public static ContactList getContacts() {
		ContactList cList = 
				new ContactList(0, 0, contacts.size(), contacts);
		return cList;
	}
	
	// 특정 페이지와 페이지에 포함될 주소 개수 요청(일부 데이터만 전송)
	public static ContactList getContacts(int pageno, int pagesize) {
		int startIndex = (pageno-1) * pagesize; // 전송 시작 주소 위치
		int endIndex = startIndex + pagesize;	// 전송 종료 주소 위치
		
		List<Contact> temps = null;
		
		// 범위를 벗어난 요청을 한다면
		if(startIndex > contacts.size()-1 ||
		   startIndex < 0 || pagesize < 1) {
			temps = new ArrayList<Contact>();	// 빈 객체를 생성
		}
		// 정상 범위의 요청을 한다면
		else {
			// 전송 종료 주소 위치가 주소록 크기를 넘어서면 
			// 마지막 주소 위치로 정해준다
			if(endIndex > contacts.size())
				endIndex = contacts.size();
			
			// 시작과 끝에 해당하는 부분 리스트를 추출해서 저장한다
			temps = contacts.subList(startIndex, endIndex);
		}
		ContactList cList = new ContactList(pageno, pagesize,
									contacts.size(), temps);
		return cList;
	}
	
	// 주소록에 주소 추가
	public static void addContact(Contact c) {
		nextNo++;
		c.setNo(nextNo);
		contacts.add(0, c);
	}
	
	// 주소 삭제
	public static int deleteContact(long no) {
		int count = 0;	// 지워진 주소의 개수
		for(int i=0;i<contacts.size();i++) {
			Contact c = contacts.get(i);
			if(c.getNo() == no) {
				contacts.remove(i);
				count++;
				break;
			}
		}
		return count;
	}
	
	// 주소 수정
	public static int updateContact(Contact c) {
		long no = c.getNo();
		int count = 0;
		for(int i=0;i<contacts.size();i++) {
			Contact con = contacts.get(i);
			if(con.getNo() == no) {
				contacts.set(i, c);
				count++;
				break;
			}
		}
		return count;
	}
	
	// 여러 개의 주소들을 업데이트
	public static int updateBatch(ContactList contactList) {
		int count = 0;
		List<Contact> list = contactList.getContacts();
		if(list.size() > 0) {
			for(Contact c : list) {
				SampleDAO.updateContact(c);
				count++;
			}
		}
		return count;
	}
}

list

list.jsp
: 편의상 서블릿 역할로 만들었다

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.ajaxstudy.contact.domain.*" %>
<%@ page import="com.ajaxstudy.contact.util.*" %>
<%
// 이 jsp파일은 서블릿의 역할을 수행하는 것이다
// view의 역할은 아니다
	String strPageno = request.getParameter("pageno");
	String strPagesize = request.getParameter("pagesize");
	int pageno = 0;		// 0이면 전체 데이터 조회, 1이상이면 해당 페이지 조회
	int pagesize = 3;	// 한 페이지의 크기
	// 1) 브라우저가 보내온 페이지 번호와 페이지 크기를 int로 변환
	try{
		pageno = Integer.parseInt(strPageno);
	}catch(Exception e){
		pageno = 0;
		System.out.println("pageno가 없음 ");
	}
	try{
		pagesize = Integer.parseInt(strPagesize);
	}catch(Exception e){
		System.out.println("pagesize가 없음 ");
		pagesize = 3;
		//e.printStackTrace();
	}
	
	ContactList contactList = null;
	if(pageno==0)	// 전체 주소록 데이터
		contactList = SampleDAO.getContacts();
	else			// 특정 페이지 데이터
		contactList = SampleDAO.getContacts(pageno, pagesize);
	// java 객체 -> json문자열로 변환
	String json = Converter.convertToJson(contactList);
%>
<%=json%>

  • 실행결과

  • pageno/pagesize를 파라미터로 넘겼을 경우 결과

크롬 확장프로그램에서 json view를 추가하면 다음과 같이 json 데이터를 보여준다.

list.jsp를 servlet으로 쓰게 된다면

ContactListServlet

package com.ajaxstudy.contact.servlets;

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.ajaxstudy.contact.domain.ContactList;
import com.ajaxstudy.contact.util.Converter;
import com.ajaxstudy.contact.util.SampleDAO;

@WebServlet("/list.do")
@SuppressWarnings("serial")
public class ContactListServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html; charset=UTF-8"); 
		
		String strPageno = request.getParameter("pageno");
		String strPagesize = request.getParameter("pagesize");
		int pageno = 0;		// 0이면 전체 데이터 조회, 1이상이면 해당 페이지 조회
		int pagesize = 3;	// 한 페이지의 크기
		// 1) 브라우저가 보내온 페이지 번호와 페이지 크기를 int로 변환
		try{
			pageno = Integer.parseInt(strPageno);
		}catch(Exception e){
			pageno = 0;
			System.out.println("pageno가 없음 ");
		}
		try{
			pagesize = Integer.parseInt(strPagesize);
		}catch(Exception e){
			System.out.println("pagesize가 없음 ");
			pagesize = 3;
			//e.printStackTrace();
		}
		
		ContactList contactList = null;
		if(pageno==0)	// 전체 주소록 데이터
			contactList = SampleDAO.getContacts();
		else			// 특정 페이지 데이터
			contactList = SampleDAO.getContacts(pageno, pagesize);
		// java 객체 -> json문자열로 변환
		String json = Converter.convertToJson(contactList);
		
		// 브라우저에 json 문자열 전송 
		PrintWriter writer = response.getWriter();
		writer.println(json);
		
	
	}
}

add

  • jsp일 경우

add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.ajaxstudy.contact.domain.*" %>
<%@ page import="com.ajaxstudy.contact.util.*" %>
<%
	// POST 방식을 사용
	request.setCharacterEncoding("UTF-8");
	String status = "ok";
	String message = "";
	
	// POST로 전송되었을 때 처리하겠다
	if(request.getMethod().equals("POST")){
		String name = request.getParameter("name");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		
		if(name==null || name.equals("") ||
		    tel==null || tel.equals("")){
			status = "fail";
			message = "이름과 전화번호는 필수 입력 사항입니다.";
		}else{
			Contact c = new Contact(0, name, tel, address);
			SampleDAO.addContact(c);
			message = "일련번호 " + c.getNo() + 
					"번 데이터가 추가되었습니다";
		}		   
	}else{
		status = "fail";
		message = "POST 메서드만 지원합니다";
	}
%>
{
	"status":"<%=status%>",
	"message":"<%=message%>"
}

index.html


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="add.jsp" method="post">
		<label> 이름 : <input type="text" name="name"></label><br/>
		<label> 전화 : <input type="text" name="tel"></label><br/>
		<label> 주소 : <input type="text" name="address"></label><br/>
		<input type="submit" value="전송">
		
	</form>
</body>
</html>


  • servlet일 경우

ContactAddServlet

package com.ajaxstudy.contact.servlets;

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.ajaxstudy.contact.domain.Contact;
import com.ajaxstudy.contact.domain.Result;
import com.ajaxstudy.contact.util.Converter;
import com.ajaxstudy.contact.util.SampleDAO;

@SuppressWarnings("serial")
@WebServlet("/add.do")
public class ContactAddServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		
		// POST 방식을 사용
		request.setCharacterEncoding("UTF-8");
		String status = "ok";
		String message = "";
		
		// POST로 전송되었을 때 처리하겠다
		//어차피 post만 들어오니까 지울 수 있다.
//		if(request.getMethod().equals("POST")){
		
			String name = request.getParameter("name");
			String tel = request.getParameter("tel");
			String address = request.getParameter("address");
			
			if(name==null || name.equals("") ||
			    tel==null || tel.equals("")){
				status = "fail";
				message = "이름과 전화번호는 필수 입력 사항입니다.";
			}else{
				Contact c = new Contact(0, name, tel, address);
				SampleDAO.addContact(c);
				message = "일련번호 " + c.getNo() + 
						"번 데이터가 추가되었습니다";
			}		   
//		}else{
//			status = "fail";
//			message = "POST 메서드만 지원합니다";
//		}
			
			//java객체 -> json 문자열로 변환 
			Result result = new Result(status,message);
			String json = Converter.convertToJson(result);
			
			//브라우저에 전송 
			PrintWriter writer = response.getWriter();
			writer.println(json);
			
			
	}

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

		//java객체 -> json 문자열로 변환 
		Result result = new Result("fail", "POST 메서드만 지원합니다.");
		String json = Converter.convertToJson(result);
		
		//브라우저에 전송 
		PrintWriter writer = response.getWriter();
		writer.println(json);
	
	
	}
}

index.html
: add.do로 바꾸기


결과


  • rest api 크롬 확장 프로그램 추가

get/post 선택 가능

정확한 데이터를 확인 가능하다


항상 html로 form을 만들어 post방식으로 전송하는 것은 번거롭다.
그럴 때 쓸 수 있는 프로그램이다.


리스트를 조회했을 때 정상적으로 추가된 것을 확인할 수 있다.


update

update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.ajaxstudy.contact.domain.*" %>
<%@ page import="com.ajaxstudy.contact.util.*" %>
<%
	request.setCharacterEncoding("UTF-8");
	String status = "ok";
	String message = "";
	
	if(request.getMethod().equals("POST")){
		long no = 0;
		try{
			no = Long.parseLong(request.getParameter("no"));
		}catch(Exception e){
			System.out.println("번호를 정수로 변환할 수 없습니다");
			return;
		}
		String name = request.getParameter("name");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		
		if(name==null || name.equals("") ||
		   tel==null || tel.equals("")){
			status = "fail";
			message = "수정을 원하면 이름과 전화번호는 필수";
		}else{
			Contact c = new Contact(no, name, tel, address);
			int count = SampleDAO.updateContact(c);
			if(count == 1){
				status = "ok";
				message = "일련번호 " + c.getNo() + "번 데이터가 수정되었습니다";
			}else{
				status = "fail";
				message = "수정하려는 데이터가 존재하지 않습니다";
			}
		}
	}else{
		status = "fail";
		message = "POST 메서드만 지원합니다";
	}
%>
{
	"status":"<%=status%>",
	"message":"<%=message%>"
}

index.html


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="update.jsp" method="post">
		<label> 번호 : <input type="text" name="no"></label><br/>
		<label> 이름 : <input type="text" name="name"></label><br/>
		<label> 전화 : <input type="text" name="tel"></label><br/>
		<label> 주소 : <input type="text" name="address"></label><br/>
		<input type="submit" value="전송">
		
	</form>
</body>
</html>

결과

존재하는 번호를 입력하면 정상적으로 수정이 된다.

0개의 댓글

관련 채용 정보