
//좋아요 등록
public void insertFav(BoardFavVO favVO)throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
//커넥션풀로부터 커넥션 할당
conn = DBUtil.getConnection();
//SQL문 작성
sql = "INSERT INTO zboard_fav (board_num,mem_num) VALUES (?,?)";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//?에 데이터 바인딩
pstmt.setInt(1, favVO.getBoard_num());
pstmt.setInt(2, favVO.getMem_num());
//SQL문 작성
pstmt.executeUpdate();
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
//좋아요 삭제
public void deleteFav(BoardFavVO favVO)throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
//커넥션풀로부터 커넥션 할당
conn = DBUtil.getConnection();
//SQL문 작성
sql = "DELETE FROM zboard_fav WHERE board_num=? AND mem_num=?";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//?에 데이터 바인딩
pstmt.setInt(1, favVO.getBoard_num());
pstmt.setInt(2, favVO.getMem_num());
//SQL문 실행
pstmt.executeUpdate();
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
//내가 선택한 좋아요 목록
public List<BoardVO> getListBoardFav(int start, int end,
int mem_num)throws Exception{
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<BoardVO> list = null;
String sql = null;
try {
//커넥션풀로부터 커넥션 할당
conn = DBUtil.getConnection();
//SQL문 작성
//(주의)zboard_fav의 회원번호(좋아요 클릭한 회원번호)로
//검색되어야 하기때문에 f.mem_num으로 표기해야 함
sql = "SELECT * FROM (SELECT a.*, rownum rnum FROM "
+ "(SELECT * FROM zboard b JOIN "
+ "zmember m USING(mem_num) JOIN zboard_fav f "
+ "USING(board_num) WHERE f.mem_num=? ORDER BY "
+ "board_num DESC)a) WHERE rnum >= ? AND rnum <= ?";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//?에 데이터 바인딩
pstmt.setInt(1, mem_num);
pstmt.setInt(2, start);
pstmt.setInt(3, end);
//SQL문 실행
rs = pstmt.executeQuery();
list = new ArrayList<BoardVO>();
while(rs.next()) {
BoardVO board = new BoardVO();
board.setBoard_num(rs.getInt("board_num"));
board.setTitle(StringUtil.useNoHTML(
rs.getString("title")));
board.setReg_date(rs.getDate("reg_date"));
board.setId(rs.getString("id"));
list.add(board);
}
}catch(Exception e) {
throw new Exception(e);
}finally {
DBUtil.executeClose(rs, pstmt, conn);
}
return list;
}
package kr.board.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.codehaus.jackson.map.ObjectMapper;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardFavVO;
import kr.controller.Action;
public class GetFavAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
//전송된 데이터 인코딩 타입 지정
request.setCharacterEncoding("utf-8");
//전송된 데이터 반환
int board_num = Integer.parseInt(
request.getParameter("board_num"));
Map<String,Object> mapAjax =
new HashMap<String,Object>();
HttpSession session = request.getSession();
Integer user_num =
(Integer)session.getAttribute("user_num");
BoardDAO dao = BoardDAO.getInstance();
if(user_num==null) {//로그인이 되지 않은 경우
mapAjax.put("status", "noFav");
}else {//로그인 된 경우
BoardFavVO boardFav =
dao.selectFav(new BoardFavVO(
board_num,user_num));
if(boardFav!=null) {
//로그인한 회원이 좋아요를 클릭함
mapAjax.put("status", "yesFav");
}else {
//로그인한 회원이 좋아요를 미클릭
mapAjax.put("status", "noFav");
}
}
//좋아요 개수
mapAjax.put("count", dao.selectFavCount(board_num));
//JSON 데이터 생성
ObjectMapper mapper = new ObjectMapper();
String ajaxData = mapper.writeValueAsString(mapAjax);
request.setAttribute("ajaxData", ajaxData);
return "/WEB-INF/views/common/ajax_view.jsp";
}
}
package kr.board.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.codehaus.jackson.map.ObjectMapper;
import kr.board.dao.BoardDAO;
import kr.board.vo.BoardFavVO;
import kr.controller.Action;
public class WriteFavAction implements Action{
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String,Object> mapAjax =
new HashMap<String,Object>();
HttpSession session = request.getSession();
Integer user_num =
(Integer)session.getAttribute("user_num");
if(user_num==null) {//로그인이 되지 않은 경우
mapAjax.put("result", "logout");
}else {//로그인 된 경우
//전송된 데이터 인코딩 타입 지정
request.setCharacterEncoding("utf-8");
//전송된 데이터 반환
int board_num = Integer.parseInt(
request.getParameter("board_num"));
BoardFavVO favVO = new BoardFavVO();
favVO.setBoard_num(board_num);
favVO.setMem_num(user_num);
BoardDAO dao = BoardDAO.getInstance();
//좋아요 등록 여부 체크
BoardFavVO db_fav = dao.selectFav(favVO);
if(db_fav!=null) {//좋아요 등록 O
//좋아요 삭제
dao.deleteFav(db_fav);
mapAjax.put("status", "noFav");
}else {//좋아요 등록 X
//좋아요 등록
dao.insertFav(favVO);
mapAjax.put("status", "yesFav");
}
mapAjax.put("result", "success");
mapAjax.put("count", dao.selectFavCount(board_num));
}
//JSON 데이터 생성
ObjectMapper mapper = new ObjectMapper();
String ajaxData = mapper.writeValueAsString(mapAjax);
request.setAttribute("ajaxData", ajaxData);
return "/WEB-INF/views/common/ajax_view.jsp";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Page</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
$(function(){
$('#photo_btn').click(function(){
$('#photo_choice').show();
$(this).hide(); //수정 버튼 감추기
});
//이미지 미리 보기
let photo_path = $('.my-photo').attr('src');//처음 화면에 보여지는 이미지 읽기
$('#photo').change(function(){
let my_photo = this.files[0];
if(!my_photo){
//선택을 취소하면 원래 처음 화면으로 되돌림
$('.my-photo').attr('src',photo_path);
return;
}
if(my_photo.size > 1024*1024){
alert(Math.round(my_photo.size/1024)
+ 'kbytes(1024kbytes까지만 업로드 가능)');
$('.my-photo').attr('src',photo_path);
$(this).val('');//선택한 파일 정보 지우기
return;
}
//화면에 이미지 미리 보기
const reader = new FileReader();
reader.readAsDataURL(my_photo);
reader.onload=function(){
$('.my-photo').attr('src',reader.result);
};
});//end of change
//이미지 전송
$('#photo_submit').click(function(){
if($('#photo').val()==''){
alert('파일을 선택하세요');
$('#photo').focus();
return;
}
//파일 전송
const form_data = new FormData();
//업로드할 파일은 $('#photo').files[0]를 호출할 수 없음
//$('#photo')[0].files[0] 또는
//document.getElementById('photo').files[0]
//형식으로 호출 가능
form_data.append('photo',$('#photo')[0].files[0]);
$.ajax({
url:'updateMyPhoto.do',
type:'post',
data:form_data,
dataType:'json',
contentType:false, //데이터 객체를 문자열로 바꿀지 설정.true이면 일반문자
processData:false, //해당 타입을 true로 하면 일반 text로 구분
success:function(param){
if(param.result == 'logout'){
alert('로그인 후 사용하세요');
}else if(param.result == 'success'){
alert('프로필 사진이 수정되었습니다.');
//수정된 이미지 정보 저장
photo_path = $('.my-photo').attr('src');
$('#photo').val('');
$('#photo_choice').hide();
$('#photo_btn').show();//수정 버튼 표시
}else{
alert('파일 전송 오류 발생');
}
},
error:function(){
alert('네트워크 오류 발생');
}
});
});//end of click
//이미지 미리보기 취소
$('#photo_reset').click(function(){
//초기 이미지 표시
$('.my-photo').attr('src',photo_path);//이미지 미리보기 전 이미지로 되돌리기
$('#photo').val('');
$('#photo_choice').hide();
$('#photo_btn').show();//수정 버튼 표시
});
});
</script>
</head>
<body>
<div class="page-main">
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<div class="content-main">
<h2>회원정보</h2>
<div class="mypage-div">
<h3>프로필 사진</h3>
<ul>
<li>
<c:if test="${empty member.photo}">
<img src="${pageContext.request.contextPath}/images/face.png"
width="200" height="200" class="my-photo">
</c:if>
<c:if test="${!empty member.photo}">
<img src="${pageContext.request.contextPath}/upload/${member.photo}"
width="200" height="200" class="my-photo">
</c:if>
</li>
<li>
<div class="align-center">
<input type="button" value="수정"
id="photo_btn">
</div>
<div id="photo_choice" style="display:none;">
<input type="file" id="photo"
accept="image/gif,image/png,image/jpeg">
<input type="button" value="전송" id="photo_submit">
<input type="button" value="취소" id="photo_reset">
</div>
</li>
</ul>
<h3>연락처 <input type="button" value="연락처 수정"
onclick="location.href='modifyUserForm.do'"></h3>
<ul>
<li>아이디 : ${member.id}</li>
<li>이름 : ${member.name}</li>
<li>전화번호 : ${member.phone}</li>
<li>이메일 : ${member.email}</li>
<li>우편번호 : ${member.zipcode}</li>
<li>주소 : ${member.address1} ${member.address2}</li>
<li>가입일 : ${member.reg_date}</li>
<c:if test="${!empty member.modify_date}">
<li>최근 정보 수정일 : ${member.modify_date}</li>
</c:if>
</ul>
<h3>비밀번호 수정 <input type="button" value="비밀번호 수정"
onclick="location.href='modifyPasswordForm.do'"></h3>
<h3>회원탈퇴 <input type="button" value="회원탈퇴"
onclick="location.href='deleteUserForm.do'"></h3>
</div>
<div class="mypage-div">
<h3>관심 게시물 목록</h3>
<table>
<tr>
<th>제목</th>
<th>작성자</th>
<th>등록일</th>
</tr>
<c:forEach var="board" items="${boardList}">
<tr>
<td><a href="${pageContext.request.contextPath}/board/detail.do?board_num=${board.board_num}" target="_blank">${fn:substring(board.title,0,12)}</a></td>
<td>${board.id}</td>
<td>${board.reg_date}</td>
</tr>
</c:forEach>
</table>
</div>
<div class="mypage-end"></div>
</div>
</div>
</body>
</html>
$(function(){
/*============================
* 좋아요 선택 여부와 선택한 총 개수 읽기
* =========================== */
function selectFav(){
//서버와 통신
$.ajax({
url:'getFav.do',
type:'post',
data:{board_num:$('#output_fav').attr('data-num')},
dataType:'json',
success:function(param){
displayFav(param);
},
error:function(){
alert('네트워크 오류 발생');
}
});
}
/*============================
* 좋아요 등록(및 삭제) 이벤트 연결
* =========================== */
$('#output_fav').click(function(){
//서버와 통신
$.ajax({
url:'writeFav.do',
type:'post',
data:{board_num:$(this).attr('data-num')},
dataType:'json',
success:function(param){
if(param.result == 'logout'){
alert('로그인 후 좋아요를 눌러주세요!');
}else if(param.result == 'success'){
displayFav(param);
}else{
alert('좋아요 등록/삭제 오류 발생');
}
},
error:function(){
alert('네트워크 오류 발생');
}
});
});
/*============================
* 좋아요 표시 함수
* =========================== */
function displayFav(param){
let output;
if(param.status == 'yesFav'){//좋아요 선택
output = '../images/fav02.gif';
}else{//좋아요 미선택
output = '../images/fav01.gif';
}
//문서 객체에 설정
$('#output_fav').attr('src',output);
$('#output_fcount').text(param.count);
}
/*============================
* 초기 데이터 호출
* =========================== */
selectFav();
});
/board/getFav.do=kr.board.action.GetFavAction
/board/writeFav.do=kr.board.action.WriteFavAction
Creatie 이용하여 UI 작성 완료






