서버는 데이터를 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%>
크롬 확장프로그램에서 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
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>
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로 바꾸기
결과
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>
결과
존재하는 번호를 입력하면 정상적으로 수정이 된다.