<BoardMapper.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smhrd.mapper.BoardMapper">
<select id="boardList" resultType="com.smhrd.domain.Board">
select * from board
</select>
<insert id="boardInsert" parameterType="com.smhrd.domain.Board">
insert into board(title, writer, content)
values(#{title}, #{writer}, #{content})
</insert>
<select id="boardContent" resultType="com.smhrd.domain.Board">
select * from board where idx = #{idx}
</select>
<delete id="boardDelete">
delete from board where idx = #{idx}
</delete>
<update id="boardCount">
update board set count = count+1 where idx=#{idx}
</update>
<select id="boardSearch" resultType="com.smhrd.domain.Board">
select * from board where title like #{search}
</select>
</mapper>
<BoardMapper.java>
package com.smhrd.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Update;
import com.smhrd.domain.Board;
// DAO를 interface로 만든다
public interface BoardMapper {
// ********** 연결된 xml파일이랑 이름이 같아야함
// DB 연결은 다른 파일에서 진행
// 추상메서드
// Spring에서 쓸때는 추상메서드만 만들고, mapper.xml이랑 맵핑
// 메서드 이름 <--> xml의 id mapping
public List<Board> boardList();
// resultType ==> 리턴타입
// parameterType ==> 매개변수
public int boardInsert(Board vo);
public Board boardContent(int idx);
public int boardDelete(int idx);
public int boardUpdate(Board vo);
public int boardCount(int idx);
public List<Board> boardSearch(String search);
// 어노테이션을 이용해서 sql문 맵핑
// Mapper.xml 동시에 맵핑 불가능
@Update("update board set content=#{content} where idx = #{idx}")
public int ContentUpdate(Board vo);
<BoardRestController.java>
package com.smhrd.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.smhrd.domain.Board;
import com.smhrd.mapper.BoardMapper;
@RestController
public class BoardRestController {
// Ajax랑 통신해서, 요청을 처리하고, 데이터를 응답해주는 경우
// @ResponseBody를 적지 않아도, 페이지이동 대신 데이터를 리턴할 수 있게 해줌
@Autowired
BoardMapper mapper;
@RequestMapping("/boardList.do")
public List<Board> boardList() {
// 일반적인 Controller를 만들면 forward이동
// 리턴타입에 @ResponseBody를 붙여주면 된다.
// DB에서 게시글 목록
List<Board> list = mapper.boardList();
// ajax에서 사용하는 데이터 포맷(xml, csv, json)
// xml : html처럼 태그와 속성을 이용해서 데이터를 저장 but 용량 너무 큼
// csv : comma로만 데이터 구분, 용량이 작다. but 가독성이 안좋음
// json : javascript의 객체 형식으로 데이터 저장, java/ python / javascript에서 쉽게 사용가능
// jsp/Servlet에서의 응답 --> out.print("응답할 내용");
// Spring에서의 응답 --> return한 내용
// jackson databind 라이브러리
// 전달하고 싶은 객체를 리턴 --> JSON으로 변환
return list;
}
@RequestMapping("/boardUpdate.do")
public String boardUpdate(Board vo) {
// 데이터 받기
// Ajax로부터 데이터를 받거나, ajax에게 돌려줄때는 UTF-8 방식으로만 인코딩 가능
// mapper 이용 내용만 업데이트
mapper.ContentUpdate(vo);
// ajax한테 응답해주기
return "내용 수정";
}
@RequestMapping("/boardInsert.do")
public void boardInsert(Board vo) {
// Ajax로부터 제목, 작성자, 내용을 받아서
// DB에 insert 시키는 기능
mapper.boardInsert(vo);
}
@RequestMapping("/boardSearch.do")
public List<Board> boardSearch(String search) { // "스프링"
// 게시글 검색
List<Board> list = mapper.boardSearch("%"+search+"%"); // boardSEarch("%스프링%")
return list; // json
}
}
<board.js>
function goList(cpath){
location.href = cpath + "/boardList.do"
}
function goUpdate(cpath, idx){
location.href = cpath + '/boardUpdate.do?idx='+idx
}
function goDelete(cpath, idx){
// 삭제시켜 줄 컨트롤러로 이동
// 삭제 후 boardList.jsp 로
// url/value1/value2/.....
location.href =cpath+'/boardDelete.do/'+idx;
}
function loadBoard(){
// ajax를 이용해서 게시물 목록 가져오기
$.ajax({
url : 'boardList.do', // 요청할 주소
type : 'post', // get? post?
data : {
// 'name' : value
},
// dataType : 'json', // 응답받는 데이터가 어떤 형식인지
success : makeTable, // 요청이 성공했을 때, 실행되는 콜백함수
error : function(){ alert('error') } // 요청이 실패했을 때, 실행되는 콜백함수
});
}
function makeTable(res){
// res --> 서버로부터 받는 응답
console.log(res);
// 받아온 데이터 이용, 테이블 생성
// tbody 초기화
$('#tbody').html("");
for(let i = 0; i< res.length; i++){
board = res[i]
// ` : 백틱 : 개행을 해도 되는 문자열
// 백틱 내에서 ${} 를 통해 문자열 사이에 변수값을 집어넣을 수 있다.
// 단, jsp에서는 사용불가
tr = `
<tr>
<td>${board.idx}</td>
<td onclick="viewBoard(${board.idx})"><a>${board.title}</a></td>
<td>${board.writer}</td>
<td>${board.indate}</td>
<td>${board.count}</td>
</tr>
<tr id="tr${board.idx}" style="display : none;">
<td>내용</td>
<td colspan="4">
<textarea id="con${board.idx}" row="5" class="form-control">${board.content}</textarea>
<br>
<button onclick="update(${board.idx})" class="btn btn-sm btn-info">수정</button>
</td>
</tr>
`;
// $('선택자').html('코드') : 안에 있는 코드 덮어쓰기
// $('선택자').after('코드') : 닫는 태그 바로 뒤에 추가
// $('선택자').before('코드') : 여는 태그 바로 앞에 추가
// $('선택자').append('코드') : 안에 추가
$('#tbody').append(tr);
}
}
function viewBoard(idx){
//$('tr'+idx) --> 아래와 똑같음
// .css('속성명') : 해당하는 css 옵션의 값을 리턴
// .css('속성명', '속성값') : 해당하는 css옵션의 값을 변경
if($(`#tr${idx}`).css('display') == "none" ){
// 보여주기
$(`#tr${idx}`).css('display', 'table-row');
}else{
// 숨겨주기
$(`#tr${idx}`).css('display', 'none');
}
}
function update(idx){
// textarea 글자 가져오기
// $('선택자').val()
let content = $('#con'+idx).val();
// ajax 요청 통해서 글 내용 업데이트
$.ajax({
url : 'boardUpdate.do',
type : 'post',
data : {'idx' : idx, 'content' : content}, // name값에 '' 붙여주기.
success : loadBoard,
error : function(){alert('error')}
});
}
function openwForm(){
if($('#wForm').css('display') == "none"){
$('#wForm').css('display', 'block');
}else{
$('#wForm').css('display', 'none')
}
}
function boardWrite(){
// 1. 제목, 작성자, 내용 가져오기
// $('태그이름[속성명=속성값]')
// $('input[name=title]')
let title = $('input[name=title]').val();
let writer = $('input[name=writer]').val();
let content = $('textarea[name=content]').val();
// ajax 이용 게시글 저장
$.ajax({
url : 'boardInsert.do',
type : 'post',
data : {
// key(name) : value
// Board의 필드명 == key(name)
'title' : title, 'writer' : writer, 'content' : content},
// 응답받는 데이터의 형식
// dataType : 'json', // json 데이터를 받을때만 사용
success : function(res){location.reload();},
error : function(){alert('error!')}
});
}
function BoardSearch(){
// input태그 값을 가져와서
let search = $('#search').val();
// ajax를 통해
// DB에서 검색한 문자열을 포함하는 제목을 가진 글들만 가져오기
$.ajax({
url : 'boardSearch.do',
type : 'get',
data : {
'search' : search
},
dataType : 'json',
success : makeTable,
error : function(){alert('error!')}
});
}
'자바스프링' 카테고리의 다른 글
게시글 작성하기(SpringMVC02(Ajax + JSON)) (0) | 2022.07.01 |
---|---|
게시판 글 수정 SpringMVC02(Ajax + JSON) (0) | 2022.06.30 |
게시판 수정 (0) | 2022.06.28 |
게시판 글 삭제 (0) | 2022.06.27 |
게시판 글 출력 (0) | 2022.06.24 |