본문 바로가기
ICIA 수업일지

2021.08.20 수업일지(Spring, Servlet)

by 주성씨 2021. 8. 20.

- 어제와 같이 어레이리스트로 호출해서 출력하는게 아닌 에이작으로 제이손 어레이로 바꿔서 에이작으로 처리하는것을 해보겠다.

- [new] ex04 - 새로운 프로젝트를 만들어준다.

- webcontent\ [new] main.jsp - 웹페이지의 기본틀을 만들어준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>이주성의 도서관리 시스템</title>
<style>
#container {
	width: 960px;
	border: 1px solid black;
	margin: 0 auto;
	padding: 20px;
}

#header {
	padding: 20px;
	border: 1px solid black;
}

#center {
	padding: 20px;
	border: 1px solid black;
	margin-top: 10px;
	margin-bottom: 10px;
}

#footer {
	padding: 20px;
	border: 1px solid black;
}

#menu {
	overflow: hidden;
	border-bottom: 1px dotted black;
}

#menu h4 {
	float: left;
	width: 100px;
}

h1, h3 {
	text-align: center;
}

#content {
	border: 1px solid black;
	padding: 10px;
	margin-top: 10px;
}
</style>
</head>
<body>
	<div id="container">
		<div id="header">
			<h1>이주성의 도서관리 시스템</h1>
		</div>
		<div id="center">
			<div id="menu">
				<h4>도서관리</h4>
				<h4>게시판관리</h4>
			</div>
			<div id="content">
				<h1>[회사 소개]</h1>
			</div>
		</div>
		<div id="footer">
			<h3>Copyright. 2021 이주성 All rights reserved.</h3>
		</div>
	</div>
</body>
</html>

출력물

 

- 서블릿을 만들어보자.

1. controller, model package를 우선 만들자.

 

2. controller\MainSevlet.java 를 만들자.

3. main.jsp를 /로 진입할 수 있게 하겠다.

package controller;

import java.io.IOException;

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


@WebServlet("/")
public class MainServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("pageName", "/about.jsp");
		RequestDispatcher dis = request.getRequestDispatcher("/main.jsp");
		dis.forward(request, response);
	}

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

	}

}

 

 

4. #content 에 넣을 수 있는 pageName으로 들어갈 about.jsp를 만들어보자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<h1>[회사 소개]</h1>

 

5. 헤더 메뉴 하위 메뉴들을 링크를 걸어서 서블릿으로 연결하는 작업의 밑작업을 미리 해놓겠다.

6. BookServlet.java를 만들자.

package controller;

import java.io.IOException;

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

@WebServlet(value={"/book/list","/book/insert","/book/read","/book/update","/book/delete"})
public class BookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		switch(request.getServletPath()){
		case "/book/list":
			request.setAttribute("pageName", "/book/list.jsp");
		}
		RequestDispatcher dispatcher = request.getRequestDispatcher("/main.jsp");
		dispatcher.forward(request, response);
	}


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

}

 

7. 도서관리를 누르면 보이는 뷰를 만들어보자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>[도서 관리]</h1>

 

출력물

 

- 어제 사용했던 VO와 Database.java를 가지고 오자.

- 어제 사용했던 라이브러리를 전부 가지고 오자.

 

- DAO는 직접 만들겠다.

package model;

import java.util.*;
import java.sql.*;

public class BookDAO {
	// 1. 도서 목록을 출력하는 메서드를 만들겠다.
	public ArrayList<BookVO> list() {
		ArrayList<BookVO> array = new ArrayList<BookVO>();
		try {
			String sql = "select * from books order by code desc";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				BookVO vo = new BookVO();
				vo.setCode(rs.getString("code"));
				vo.setTitle(rs.getString("title"));
				vo.setWriter(rs.getString("writer"));
				vo.setPrice(rs.getInt("price"));
				vo.setImage(rs.getString("image"));
				array.add(vo);
			}
		} catch (Exception e) {
			System.out.println("list : " + e.toString());
		}
		return array;
	}
}

 

- 자바 실행을 위한 메인메서드를 만든다. 테스트용이다.

- model\DAOTest.java

package model;

public class DAOTest {

	public static void main(String[] args) {
		BookDAO dao = new BookDAO();
		dao.list();
	}

}

 

- 어레이리스트를 제이손 타입으로 바꿔주는 작업을 하겠다.

 

-BookServlet.java

1. value에 /book/list.json 추가

@WebServlet(value = { "/book/list", "/book/list.json", "/book/insert", "/book/read", "/book/update", "/book/delete" })
public class BookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

 

2. ArrayList를 json 타입으로 바꿔준다.

package controller;

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

import javax.servlet.RequestDispatcher;
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 org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import model.*;

@WebServlet(value = { "/book/list", "/book/list.json", "/book/insert", "/book/read", "/book/update", "/book/delete" })
public class BookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	BookDAO dao = new BookDAO();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		switch (request.getServletPath()) {
		case "/book/list.json": // ArrayList를 json 타입으로 바꿔준다.
			ArrayList<BookVO> array = dao.list(); // 타입지정후 변수에 넣음
			JSONArray jArray = new JSONArray();
			for (BookVO vo : array) { // array를 꺼내서 vo에 넣겠다.
				JSONObject obj = new JSONObject();
				obj.put("code", vo.getCode());
				obj.put("title", vo.getTitle());
				obj.put("writer", vo.getWriter());
				obj.put("price", vo.getPrice());
				obj.put("image", vo.getImage());
				jArray.add(obj);
			}
			PrintWriter out = response.getWriter(); //
			out.print(jArray);
			break;
		case "/book/list":
			request.setAttribute("pageName", "/book/list.jsp");
			RequestDispatcher dispatcher = request.getRequestDispatcher("/main.jsp");
			dispatcher.forward(request, response);
			break;
		}
	}

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

}

 

출력물

 

- 이제 json을 출력해보도록 하겠다.

- list.jsp

- 일단 제목만 출력해보도록 하겠다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<h1>[도서 관리]</h1>
<div id="books"></div>
<script>
	getList();
	function getList() {
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			success : function(data) {
				var str = "";
				$(data).each(function() {
					str += "<h4>" + this.title + "</h4>";
				});
				$("#books").html(str);
			}
		});
	};
</script>

출력물

 

- main.jsp

- 핸들바를 추가해준다. - 찾아볼것 - 출력하고자하는 템플릿을 만들때 사용한다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/3.0.1/handlebars.js"></script>

 

- list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
.item {
	overflow: hidden;
	border: 1px solid gray;
	margin-bottom: 10px;
	padding: 20px;
	border-radius: 10px;
}

.item .info {
	float: left;
	margin-left: 10px;
}

.item img {
	float: left;
	margin: 10px;
}
</style>
<h1>[도서 관리]</h1>
<div id="books"></div>

<script id="temp" type="text/x-handlebars-template">
{{#each .}}
<div class="item">
	<img src="/image/book/{{image}}" width=150/>
	<div class="info">
		<div class="code">도서 코드 : {{code}}</div>
		<div class="title">도서 제목 : {{title}}</div>
		<div class="writer">도서 저자 : {{writer}}</div>
		<div class="price">도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>

<script>
	getList();
	function getList() {
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));
			}
		});
	};
</script>

출력물

 

- 페이지 버튼을 만들어주고 page 값을 json에 넘겨준다.

</script>
<div style="text-align: center">
	<button id="prev">이전</button>
	<span id="page"></span>
	<button id="next">다음</button>
</div>
<script>
	// 2. next prev button
	var page = 1;
	$('#prev').on('click', function() {
		page--;
		getList();
	});
	$('#next').on('click', function() {
		page++;
		getList();
	});

	// 1. 목록 출력
	getList();
	function getList() {
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			data:{"page":page},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));
				$("#page").html(page);
			}
		});
	};
</script>

 

- BookServlet.java

- 넘겨받은 page 값을 매개변수로 설정하고

		case "/book/list.json": // ArrayList를 json 타입으로 바꿔준다.
			// page값을 json으로 부터 받아온다.
			int page = Integer.parseInt(request.getParameter("page")); // new
			
			ArrayList<BookVO> array = dao.list(page); // 타입지정후 변수에 넣음 // new

 

- BookDAO.java

- sql문으로 페이지 출력 갯수를 limit해주기 위해 사용한다.

public class BookDAO {
	// 1. 도서 목록을 출력하는 메서드를 만들겠다.
	public ArrayList<BookVO> list(int page) { // new
		ArrayList<BookVO> array = new ArrayList<BookVO>();
		try {
			String sql = "select * from books order by code desc limit ?,3"; // new
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setInt(1, (page-1)*3); // new

 

출력물

 

- page 값에 따라서 버튼의 사용 유무 조건값을 지정해준다.

	function getList() {
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			data:{"page":page},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));
				$("#page").html(page);
				if(page==1){ // new
					$('#prev').attr("disabled",true);
				}else{
					$('#prev').attr("disabled",false);
				}
			}
		});
	};

 

출력물

 

- 마지막 페이지를 지정해주기 위해서 데이터 총 갯수를 갖는 메서드를 만들어보자.

- BookDAO.java

	// 2. 전체 도서 갯수 출력
	public int total() {
		int total = 0;
		try {
			String sql = "select count(*) from books";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				total = rs.getInt("count(*)");
			}
		} catch (Exception e) {
			System.out.println("total : " + e.toString());
		}
		return total;
	}

 

- BookServlet.java

			// 페이지 값을 지정해주는 삼항연산자.
			int page = request.getParameter("page") == null ? 1 :
				Integer.parseInt(request.getParameter("page"));
			// int page = Integer.parseInt(request.getParameter("page"));
			int total = dao.total();
			JSONObject jObject = new JSONObject();
			jObject.put("array",jArray);
			jObject.put("total",total);
			PrintWriter out = response.getWriter(); //
			out.print(jObject);
			break;

 

테스트 출력물

 

- list.jsp

<h1>[도서 관리]</h1>
<div id="condition">
	도서 갯수 : <span id="total"></span>건
</div>
<div id="books"></div>

<script id="temp" type="text/x-handlebars-template">
{{#each array}}
<div class="item">
	<img src="/image/book/{{image}}" width=150/>
	<div class="info">
		<div class="code">도서 코드 : {{code}}</div>
		<div class="title">도서 제목 : {{title}}</div>
		<div class="writer">도서 저자 : {{writer}}</div>
		<div class="price">도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>
<div style="text-align: center">
	<button id="prev">이전</button>
	<span id="page"></span>
	<button id="next">다음</button>
</div>
<script>
	// 2. next prev button
	var page = 1;
	$('#prev').on('click', function() {
		page--;
		getList();
	});
	$('#next').on('click', function() {
		page++;
		getList();
	});

	// 1. 목록 출력
	getList();
	function getList() {
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			data : {
				"page" : page
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));

				var total = data.total;
				var lastPage = Math.ceil(total / 3);
				
				$('#total').html(total);
				$("#page").html(page + "/" + lastPage);

				if (page == 1) {
					$('#prev').attr("disabled", true);
				} else {
					$('#prev').attr("disabled", false);
				}
				if (page == lastPage) {
					$('#next').attr("disabled", true);
				} else {
					$('#next').attr("disabled", false);
				}
			}
		});
	};
</script>

 

출력물

 

- 만약에 금액 포맷을 주고 싶다면?

- BookServlet.java

				DecimalFormat df = new DecimalFormat("#,###원");
				String strPrice = df.format(vo.getPrice());
				obj.put("price", strPrice);

 

출력물

 

- 검색폼을 만들어보자.

- list.jsp

#search {
	height: 20px;
	margin-bottom: 10px;
}
</style>
<h1>[도서 관리]</h1>
<div id="condition">
	<input type="text" id="search" placeholder="검색어입력"/>
	<b>도서 갯수 : <span id="total"></span>건</b>
</div>
	// 3. search 상자에서 press할 경우 1 page로 돌아간다.
	$('#search').on('keypress',function(e){
		if(e.keyCode=13){
			page=1;
			getList();
		};
	});
	
	// 1. 목록 출력
	function getList() {
		var search = $('#search').val();
		$.ajax({
			type : "get",
			url : "/book/list.json",
			dataType : "json",
			data : {
				"page" : page,
				"search" : search
			},

 

- BookServlet.java

			// 서치값을 받아오자. 널이면 "" 아니면 값을 받아온다.
			String search = request.getParameter("search") == null ? "":
				request.getParameter("search");
			
			ArrayList<BookVO> array = dao.list(page, search); // 타입지정후 변수에 넣음
			JSONArray jArray = new JSONArray();

 

- BookDAO.java

	// 1. 도서 목록을 출력하는 메서드를 만들겠다.
	public ArrayList<BookVO> list(int page, String search) {
		ArrayList<BookVO> array = new ArrayList<BookVO>();
		try {
			String sql = "select * from books where title like ? order by code desc limit ?,3";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, "%"+search+"%");
			ps.setInt(2, (page - 1) * 3);

 

 

- 토탈도 변하게 해보자. 또한 특정 키워드를 입력하면 갯수가 바뀌는지도 확인해보자.

- BookServlet.java

			int total = dao.total(search); // new
			JSONObject jObject = new JSONObject();
			jObject.put("array", jArray);
			jObject.put("total", total);
			
			PrintWriter out = response.getWriter(); //
			out.print(jObject);
			break;

 

- BookDAO.java

	// 2. 전체 도서 갯수 출력
	public int total(String search) { // new
		int total = 0;
		try {
			String sql = "select count(*) from books where title like ?;";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ps.setString(1, "%"+search+"%"); // new
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				total = rs.getInt("count(*)");
			}
		} catch (Exception e) {
			System.out.println("total : " + e.toString());
		}
		return total;
	}

 

출력물

 

- 카카오 API 를 가지고와서 도서검색을 만들어보자.

- main

			<div id="menu">
				<h4><a href="/book/list">도서관리</a></h4>
				<h4><a href="/bbs/list">게시판관리</a></h4>
				<h4><a href="/book/search">도서검색</a></h4>
			</div>

 

- bookservlet

@WebServlet(value = { "/book/list","/book/search", "/book/list.json", "/book/insert", "/book/read", "/book/update", "/book/delete" })
public class BookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	BookDAO dao = new BookDAO();
		case "/book/search":
			request.setAttribute("pageName", "/book/search.jsp");
			dispatcher = request.getRequestDispatcher("/main.jsp");
			dispatcher.forward(request, response);
		}

 

- new search.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>[도서 검색]</h1>

 

- 이제 카카오에서 제공하는 도서검색 API를 적용해보자.

- search.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
.item {
	overflow: hidden;
	border: 1px solid gray;
	margin-bottom: 10px;
	padding: 20px;
	border-radius: 10px;
	margin-bottom: 10px;
}

.item .info {
	float: left;
	margin-left: 10px;
}

.item img {
	float: left;
	margin: 10px;
	box-shadow: 5px 5px 5px gray;
}

#condition {
	height: 20px;
	margin-bottom: 10px;
}

#search {
	height: 20px;
	margin-bottom: 10px;
}
</style>
<h1>[도서 검색]</h1>
<div id="books"></div>
<script id="temp" type="text/x-handlebars-template">
{{#each documents}}
<div class="item">
	<img src={{thumbnail}} width=150/>
	<div class="info">
		<div class="isbn">- 도서 코드 : {{isbn}}</div>
		<div class="title">- 도서 제목 : {{title}}</div>
		<div class="authors">- 도서 저자 : {{authors}}</div>
		<div class="price">- 도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>

<script>
	getList();
	function getList() {
		$.ajax({
			type : "get",
			url : "https://dapi.kakao.com/v3/search/book?target=title",
			data : {
				"query" : "자바",
				"size" : 5
			},
			dataType : "json",
			headers : {
				"Authorization" : "KakaoAK 31347cda85f0d6ed06e3025a531f2aca"
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));
			}
		});
	};
</script>

출력물

 

- 도서 검색 페이지에 도서 검색란을 만들어 직접 키워드로 검색해보자.

- search.jsp

<h1>[도서 검색]</h1>
<div id="condition">
	<input type="text" id="search" value="안드로이드"/>
</div>
<div id="books"></div>
<script id="temp" type="text/x-handlebars-template">
{{#each documents}}
<div class="item">
	<img src={{thumbnail}} width=150/>
	<div class="info">
		<div class="isbn">- 도서 코드 : {{isbn}}</div>
		<div class="title">- 도서 제목 : {{title}}</div>
		<div class="authors">- 도서 저자 : {{authors}}</div>
		<div class="price">- 도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>

<script>
	// 젼역변수
	var page=1;

	getList();
	
	// 검색란에 키프레스를 할경우
	$('#search').on('keypress',function(e){
		if(e.keyCode==13){
			page=1;
			getList();
		}
	});
	
	function getList() {
		var search = $('#search').val();
		$.ajax({
			type : "get",
			url : "https://dapi.kakao.com/v3/search/book?target=title",
			data : {
				"query" : search,
				"size" : 5
			},
			dataType : "json",
			headers : {
				"Authorization" : "KakaoAK 31347cda85f0d6ed06e3025a531f2aca"
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').html(temp(data));
			}
		});
	};
</script>

삼성이라는 키워드로 검색할 경우 위와 같이 나오는 것을 알 수 있다.

 

- 더보기 버튼으로 밑으로 데이터가 추가되는 기능을 넣어보자.

- select tag을 적용해보자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
.item {
	overflow: hidden;
	border: 1px solid gray;
	margin-bottom: 10px;
	padding: 20px;
	border-radius: 10px;
	margin-bottom: 10px;
}

.item .info {
	float: left;
	margin-left: 10px;
	width: 650px;
}

.item img {
	float: left;
	margin: 10px;
	box-shadow: 5px 5px 5px gray;
}

#condition {
	height: 20px;
	margin-bottom: 10px;
}

#search {
	height: 20px;
	margin-bottom: 10px;
}

select, input[type=text] {
	height: 20px;
}
</style>
<h1>[도서 검색]</h1>
<div id="condition">
	<select id="target">
		<option value="title">제목</option>
		<option value="publisher">출판사</option>
		<option value="person">저자</option>
	</select>
	<input type="text" id="search" placeholder="검색어를 입력하세요." />
	<span id="total">검색건수 : 0건</span>
</div>
<div id="books"></div>
<script id="temp" type="text/x-handlebars-template">
{{#each documents}}
<div class="item">
	<img src={{thumbnail}} width=150/>
	<div class="info">
		<div class="isbn">- 도서 코드 : {{isbn}}</div>
		<div class="title">- 도서 제목 : {{title}}</div>
		<div class="authors">- 도서 저자 : {{authors}}</div>
		<div class="price">- 도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>
<button id="more">더보기</button>
<script>
	// 젼역변수
	var page = 1;

	getList();

	// 더보기 버튼을 눌렀을 경우 페이지를 증가 시키도록 하자.
	$('#more').on('click', function() {
		page++;
		getList();
	});

	// 검색란에 키프레스를 할경우
	$('#search').on('keypress', function(e) {
		if (e.keyCode == 13) {
			$('#books').html("");
			page = 1;
			getList();
		}
	});

	function getList() {
		var search = $('#search').val();
		var target = $('#target').val();
		$.ajax({
			type : "get",
			url : "https://dapi.kakao.com/v3/search/book?target="+target,
			data : {
				"query" : search,
				"size" : 5,
				"page" : page
			},
			dataType : "json",
			headers : {
				"Authorization" : "KakaoAK 31347cda85f0d6ed06e3025a531f2aca"
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').append(temp(data));
				$('#total').html("검색건수 : "+data.meta.total_count + "건");
			}
		});
	};
</script>

 

출력물 gif

 

- 라인박스를 적용해보자.

- search.jsp

- 예제 CSS

#darken-background {
	position: absolute;
	top: 0px;
	left: 0px;
	right: 0px;
	height: 100%;
	display: none;
	background: rgba(0, 0, 0, 0.5);
	z-index: 10000;
	overflow-y: scroll;
}

#lightbox {
	width: 700px;
	margin: 20px auto;
	padding: 15px;
	border: 1px solid #333333;
	border-radius: 5px;
	background: white;
	box-shadow: 0px 5px 5px rgba(34, 25, 25, 0.4);
	text-align: center;
}

 

- 이미지를 클릭할 경우 라인박스가 보일 수 있게 하자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<style>
.item {
	overflow: hidden;
	border: 1px solid gray;
	margin-bottom: 10px;
	padding: 20px;
	border-radius: 10px;
	margin-bottom: 10px;
}

.item .info {
	float: left;
	margin-left: 10px;
	width: 650px;
}

.item img {
	float: left;
	margin: 10px;
	box-shadow: 5px 5px 5px gray;
}

#condition {
	height: 20px;
	margin-bottom: 10px;
}

#search {
	height: 20px;
	margin-bottom: 10px;
}

select, input[type=text] {
	height: 20px;
}

#darken-background {
	position: fixed;
	top: 0px;
	left: 0px;
	right: 0px;
	height: 100%;
	display: none;
	background: rgba(0, 0, 0, 0.5);
	z-index: 10000;
	overflow-y: scroll;
}

#lightbox {
	width: 700px;
	margin: 20px auto;
	padding: 15px;
	border: 1px solid #333333;
	border-radius: 5px;
	background: white;
	box-shadow: 0px 5px 5px rgba(34, 25, 25, 0.4);
	text-align: center;
}
</style>
<h1>[도서 검색]</h1>
<div id="condition">
	<select id="target">
		<option value="title">제목</option>
		<option value="publisher">출판사</option>
		<option value="person">저자</option>
	</select> <input type="text" id="search" placeholder="검색어를 입력하세요." /> <span
		id="total">검색건수 : 0건</span>
</div>
<div id="books"></div>
<script id="temp" type="text/x-handlebars-template">
{{#each documents}}
<div class="item">
	<img src={{thumbnail}} width=150 contents="{{contents}}"/>
	<div class="info">
		<div class="isbn">- 도서 코드 : {{isbn}}</div>
		<div class="title">- 도서 제목 : {{title}}</div>
		<div class="authors">- 도서 저자 : {{authors}}</div>
		<div class="price">- 도서 가격 : {{price}}</div>
	</div>
</div>
{{/each}}
</script>
<button id="more">더보기</button>

<!-- 라인박스 -->
<div id="darken-background">
	<div id="lightbox">
		<div class="item">
			<img src="" id="image" width=50% height=50% />
			<div id="info" style="width:100%; text-align: left;">
				<div class="title"></div>
				<div class="price"></div>
				<div class="writer"></div>
			</div>
		</div>
		<hr />
		<div id="contents"></div>
		<hr />
		<button id="close">닫기</button>
	</div>
</div>

<script>
	// 젼역변수
	var page = 1;

	getList();

	// 이미지를 클릭 했을때
	$('#books').on('click', '.item img', function() {
		var image = $(this).attr('src');
		var contents = $(this).attr('contents');
		var title = $(this).parent().find(".title").html();
		var writer = $(this).parent().find(".authors").html();
		var price = $(this).parent().find(".price").html();
		
		$('#image').attr("src", image);
		$('#contents').html(contents);
		$('#lightbox .title').html(title);
		$('#lightbox .writer').html(writer);
		$('#lightbox .price').html(price);
		$('#darken-background').show();
	});

	// 닫기 버튼을 클릭할 경우
	$('#close').on('click', function() {
		$('#darken-background').hide();
	})

	// 더보기 버튼을 눌렀을 경우 페이지를 증가 시키도록 하자.
	$('#more').on('click', function() {
		page++;
		getList();
	});

	// 검색란에 키프레스를 할경우
	$('#search').on('keypress', function(e) {
		if (e.keyCode == 13) {
			$('#books').html("");
			page = 1;
			getList();
		}
	});

	function getList() {
		var search = $('#search').val();
		var target = $('#target').val();
		$.ajax({
			type : "get",
			url : "https://dapi.kakao.com/v3/search/book?target=" + target,
			data : {
				"query" : search,
				"size" : 5,
				"page" : page
			},
			dataType : "json",
			headers : {
				"Authorization" : "KakaoAK 31347cda85f0d6ed06e3025a531f2aca"
			},
			success : function(data) {
				var temp = Handlebars.compile($('#temp').html());
				$('#books').append(temp(data));
				$('#total').html("검색건수 : " + data.meta.total_count + "건");
			}
		});
	};
</script>

 

- 오픈 데이터 검색한 도서 정보를 DB에 넣어보는 작업을 해보자.

- BookDAO

	// 3. 도서입력
	public void insert(BookVO vo) {
		try {
			String code = "";
			String sql = "select max(code) from books";
			PreparedStatement ps = Database.CON.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				code = rs.getString("max(code)");
			}
			int intCode = (Integer.parseInt(code) + 1);
			code = Integer.toString(intCode);
			
			sql = "insert into books(code, title, writer, price, image) values(?,?,?,?,?)";
			ps = Database.CON.prepareStatement(sql);
			ps.setString(1, code);
			ps.setString(2, vo.getTitle());
			ps.setString(3, vo.getWriter());
			ps.setInt(4, vo.getPrice());
			ps.setString(5, vo.getImage());
			ps.execute();

		} catch (Exception e) {
			System.out.println("insert : " + e.toString());
		}
	}

 

- DAOTest

package model;

public class DAOTest {

	public static void main(String[] args) {
		BookDAO dao = new BookDAO();
		BookVO vo = new BookVO();
//		dao.list();
//		System.out.println(dao.total());
		vo.setTitle("이것이 자바다.");
		vo.setWriter("신용권");
		vo.setPrice(25000);
		vo.setImage("img06.jpg");
		dao.insert(vo);
	}

}

 

출력물

 

- line-box에 저장 버튼 추가

- search.jsp

<!-- 라인박스 -->
<div id="darken-background">
	<div id="lightbox">
		<div class="item">
			<img src="" id="image" width=50% height=50% />
			<div id="info" style="width:100%; text-align: left;">
				<div class="title"></div>
				<div class="price"></div>
				<div class="writer"></div>
			</div>
		</div>
		<hr />
		<div id="contents"></div>
		<hr />
		<button id="close">닫기</button>
		<button id="save">도서등록</button>
	</div>
</div>
	// 라인박스의 도서등록 버튼을 클릭했을때
	$('#save').on('click', function(){
		var title = $(this).parent().find(".title").html();
		var writer = $(this).parent().find(".writer").html();
		var price = $(this).parent().find(".price").html();
		var image = $('#lightbox img').attr("src");
		
		alert(title);
			
		$.ajax({
			type : 'post',
			url : "/book/insert",
			data : {"title":title, "writer":writer, "price":price, "image":image},
			success:function(data){
				alert("도서등록 성공");
				location.href="/book/list";
			}
		});
		
		if(!confirm("해당 상품을 등록하시겠습니까?")) return;
	});

 

- BookServlet

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		BookVO vo = new BookVO();
		vo.setTitle(request.getParameter("title"));
		vo.setWriter(request.getParameter("writer"));
		vo.setPrice(Integer.parseInt(request.getParameter("price")));
		//vo.setImage(request.getParameter("image"));
		dao.insert(vo);
	}

 

출력물

 

ex04.zip
1.09MB