MVC model2에서 ajax를 통해 좋아요 구현하기 /
jsp servlet ajax jquery 통신
하.. 게시판 댓글 ajax로 구현해 보려고 했는데,
개념이 안 잡혀있는 상태로 하려고 하다 보니 너무 힘들어서 결국 포기했다.
서블릿에서 jsonarray를 보내는데 jsp단에서 어떻게 받아오는지 몰라서 2일 동안 골머리 앓았다.
결국 모르겠어서 포기!
그리고 다음날, 조금 더 쉬운 좋아요를 ajax를 구현해봤다.
ajax success 부분을 제대로 알지 못해 생각보다 오래걸렸다.
다시는 안 까먹을라고 기록해놔야지.
사용 라이브러리
* json-simple-2.1.2.jar
- 알집 받아 푼 후 jar파일을 WEB-INF/lib/ 안에 붙여넣기
jQuery ajax 사용방법
$.ajax({
url: 요청이 보내지는 곳,
type: http요청 방식 get/post,
dataType: data의 타입,
data: 서버로 넘어갈 값,
success: http 요청 성공의 경우 동작할 함수,
error: http 요청 실패의 경우 동작할 함수,
complete: http 요청 완료 후 동작할 함수,
global: 전역 함수 여부 true/false,
async: 동기 여부 true/false
});
코드 돌아가는 순서
- boardView.jsp (좋아요 버튼 클릭)
- javascript like()함수의 ajax 싫애
- BoardServlet 호출 command 구분해서 LikeUpdateAction으로 보냄
- LikeUpdateAction.java에서 BoardDAO 인스턴스 생성
- bDao.update_Like(bno) => 좋아요 수 업데이트 하고
- int like=bDao.select_Like(bno); => 좋아요 갯수 가져와서 like라는 변수에 넣는다.
- JSONObject 생성해서 obj.put("like",like);
- response.setContentType("application/x-json; charset=UTF-8"); esponse.getWriter().print(obj); 객체 실어 보낸다
코드
boardView.jsp
<!-- 좋아요 ajax --> <form id="like_form"> <table id="list"> <input type="hidden" name="command" value="like_it"> <input type="hidden" name="board_num" value="${board.num}"> <tr><input type="button" value="좋아요!" onclick="return like()" > </tr> <tr><div id="like_result">${board.like_it}</div> </tr> </table> </form>
board.js
function like(){ $.ajax({ url: "BoardServlet", type: "POST", cache: false, dataType: "json", data: $('#like_form').serialize(), //아이디가 like_form인 곳의 모든 정보를 가져와 파라미터 전송 형태(표준 쿼리형태)로 만들어줌 success: function(data){ //ajax통신 성공시 넘어오는 데이터 통째 이름 =data alert("'좋아요'가 반영되었습니다!") ; // data중 put한 것의 이름 like $("#like_result").html(data.like); //id값이 like_result인 html을 찾아서 data.like값으로 바꿔준다. }, error: function (request, status, error){ alert("ajax실패") } }); }
LikeUpdateAction.java (boardservlet에서 커맨드 받아서 요기로 보냄)
package com.twbh.board.controller.action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONObject; import com.twbh.common.dao.BoardDAO; public class LikeUpdateAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub //BoardVO bVo = new BoardVO(); int bno = Integer.parseInt(request.getParameter("board_num")); BoardDAO bDao = BoardDAO.getInstance(); bDao.update_Like(bno); int like=bDao.select_Like(bno); System.out.println("LikeUpdateAction.java의 like 개수:"+ like); JSONObject obj = new JSONObject(); obj.put("like",like); //request.setAttribute("json", json); response.setContentType("application/x-json; charset=UTF-8"); response.getWriter().print(obj); } }
BoardDAO.java
//좋아요 업데이트 public void update_Like(int bno){ String sql = "update board set like_it=like_it+1 where num=?"; Connection conn = null; PreparedStatement pstmt = null; try{ conn = DBManager.getConnection(); pstmt = conn.prepareStatement(sql); // '?'바인드를 사용해서 sql문을 효과 적으로 사용할수있음 pstmt.setInt(1,bno); pstmt.executeUpdate(); }catch(SQLException e){ e.printStackTrace(); }finally { DBManager.close(conn, pstmt); } } //좋아요 개수 찾기 public int select_Like(int bno){ String sql = "select like_it from board where num=?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; int like=0; try{ conn = DBManager.getConnection(); pstmt = conn.prepareStatement(sql); // '?'바인드를 사용해서 sql문을 효과 적으로 사용할수있음 pstmt.setInt(1,bno); rs= pstmt.executeQuery(); if(rs.next()){ like = rs.getInt("like_it"); } }catch(SQLException e){ e.printStackTrace(); }finally { DBManager.close(conn, pstmt,rs); } return like; }
BoardVO.java
package com.twbh.common.dto; import java.sql.Timestamp; public class BoardVO { private int num; private String name; private String email; private String title; private String content; private int readcount; private Timestamp writedate; private String pictureUrl; private int ref; // 참조할 부모글 번호 private int indent; // 원글 답글 구분을 위한 들여쓰기 private int step; //같은 답글 끼리 순서 private int comment_count; private int like_it; public int getLike_it() { return like_it; } public void setLike_it(int like_it) { this.like_it = like_it; } public int getComment_count() { return comment_count; } public void setComment_count(int comment_count) { this.comment_count = comment_count; } public int getRef() { return ref; } public void setRef(int ref) { this.ref = ref; } public int getIndent() { return indent; } public void setIndent(int indent) { this.indent = indent; } public int getStep() { return step; } public void setStep(int step) { this.step = step; } public int getNum() { return num; } public String getPictureUrl() { return pictureUrl; } public void setPictureUrl(String pictureUrl) { this.pictureUrl = pictureUrl; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getReadcount() { return readcount; } public void setReadcount(int readcount) { this.readcount = readcount; } public Timestamp getWritedate() { return writedate; } public void setWritedate(Timestamp writedate) { this.writedate = writedate; } @Override public String toString() { return "BoardVO [num=" + num + ", name=" + name + ", email=" + email + ", title=" + title + ", content=" + content + ", readcount=" + readcount + ", writedate=" + writedate + ", pictureUrl=" + pictureUrl + "]"; } }
실행결과
좋아요 누르기 전
좋아요 버튼 클릭

페이지 이동 없이
밑에 좋아요 숫자 올라감

ajax jquery javascript는 나중에 책사서 따로 공부하던가 해야겠다.
개념이 제대로 안잡혀있으니 너무 헷갈린다.
참고했던 블로그들
https://shxrecord.tistory.com/108
https://gloriajun.github.io/language/2014/03/06/java-servlet-ajax.html
참고하고 싶었지만 못한 블로그
'공부 > JAVA | JSP&Servlet | Spring' 카테고리의 다른 글
Spring 어노테이션 관련 설정 (0) | 2019.03.22 |
---|---|
Spring 왕초보 책 추천 / spring 책 추천 (광고 아님!) (0) | 2019.03.21 |
기상청 API 받아오기 도움 되었던 사이트 모음 (0) | 2019.03.02 |
jsp/servlet button 눌렀을 때 창 띄우기 (비밀번호 맞는지 체크) (0) | 2019.02.23 |
JSP에서 파라미터 값 가져오기 (0) | 2019.02.18 |