<BoardMapper.java>
package com.smhrd.mapper;
import java.util.List;
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);
}
<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>
</mapper>
<BoardController.java>
package com.smhrd.web;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.smhrd.domain.Board;
import com.smhrd.mapper.BoardMapper;
// 어노테이션
// POJO임을 명시
@Controller
public class BoardController {
// IOC : Inversion of Controll (제어 역전 )
// 우리가 xml에 적어두면, Spring이 알아서 객체 생성, 사용을 한다.
// DI : Dependency Injection(의존성 주입)
@Autowired // self service
BoardMapper mapper;
// 메서드 <--> 주소 연결(Mapping)
// /boardList요청이 들어오면 이 메서드 실행
@RequestMapping("/boardList.do")
public String boardList(HttpServletRequest request) {
// Request나, Session같이 필요한 게 있으면, 매개변수
// 게시물 가져오기
List<Board> list = mapper.boardList();
// 객체바인딩
request.setAttribute("list", list);
// jsp(view) 파일의 이름
// forward방식 이동
// /WEB-INF/views/boardList.jsp
return "boardList";
}
// boardForm으로 이동할 메서드
@RequestMapping("/boardForm.do")
public void boardForm() {}
// 리턴X --> 페이지 이동
// 만약 리턴이 없다면, 메서드명과 같은 이름을 가진 view(jsp) 이동
// 게시글 작성 메서드
@RequestMapping("/boardInsert.do")
public String boardInsert(Board vo) {
// 1. input태그의 name == VO의 필드명 == Table의 컬럼명
// 2. 기본생성자
// 매개변수를 통해서 파라미터 수집 가능
// 만약 한개만 보내주는 경우라면?
// input태그의 name == 매개변수 변수명
// 자동으로 파라미터 수집하는 경우 --> 만약 null값을 받으면 기본값으로 대체 ex) content : null --> vo.setContent("");
// 파라미터 수집
// form태그로 보낸 데이터 받기(변수에 담기)
/*
* String title = request.getParameter("title"); String writer =
* request.getParameter("writer"); String content =
* request.getParameter("content");
*
* Board vo = new Board();
* vo.setTitle(title);
* vo.setWriter(writer);
* vo.setContent(content);
*/
// 게시글 저장
mapper.boardInsert(vo);
// WEB-INF/views/boardList.do.jsp
// Redirect
// 컨트롤러(POJO 메서드)로 다시 요청하는 경우 사용
// urlMapping앞에 redirect:/를 붙이면 동작한다.
return "redirect:/boardList.do";
}
// 게시글 1개 가져오는 메서드
@RequestMapping("/boardContent.do")
public void boardContent(int idx, Model model) {
// DB에서 글 가져오기
Board vo = mapper.boardContent(idx);
// 객체바인딩
// Model -> 객체바인딩 특화, request 영역에 저장
model.addAttribute("vo",vo);
}
// 게시글 삭제
/*
* @RequestMapping("/boardDelete.do") public String
* boardDelete(@RequestParam("idx") int num ) { // @RequestParam("name") : 변수의
* 이름이 일치하지 않아도 수집
*
* // 게시글 삭제 mapper.boardDelete(num);
*
* // List로 돌아가기 return "redirect:/boardList.do";
*
* }
*/
// 게시글 삭제
// "/boardDelete.do/{name}/{name2}/{name3}"
@RequestMapping("/boardDelete.do/{idx}")
public String boardDelete(@PathVariable ("idx") int num ) {
// 주소 모양 그대로 데이터를 보내는 방식 : path variable
// RequestMapping에서 /{name}을 통해 받아줘야함
// @PathVariable : 메서드의 매개변수로 Path Variable의 값을 받아옴
// @PathVariable("name") : name 값에 해당하는 Path Variable 값을 매개변수에 담아준다.
// 게시글 삭제
mapper.boardDelete(num);
// List로 돌아가기
return "redirect:/boardList.do";
}
}
<BoardContent.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="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
// scope(pageContext, request, session, application)
pageContext.setAttribute("cpath", request.getContextPath());
%>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2>SpringMVC01</h2>
<div class="panel panel-default">
<div class="panel-heading">게시판 만들기</div>
<div class="panel-body">
<table class="table table-hover">
<tr>
<td>제목: </td>
<td>${vo.title}</td>
</tr>
<tr>
<td>작성자: </td>
<td>${vo.writer} </td>
</tr>
<tr>
<td>내용: </td>
<%--fn:replace("대상", "변경전", "변경후") --%>
<% pageContext.setAttribute("newLine", "\n"); %>
<td>${ fn:replace(vo.content, newLine, "<br>") }</td>
</tr>
<tr>
<td>작성일: </td>
<td>${vo.indate}</td>
</tr>
<tr>
<td colspan="2" align="center">
<button class="btn btn-sm btn-info">수정</button>
<button onclick="goDelete('${cpath}',${vo.idx})" class="btn btn-sm btn-warning">삭제</button>
<button class="btn btn-sm btn-success">목록</button>
</td>
</tr>
</table>
</div>
<div class="panel-footer">지능형 IoT 8차 최지연</div>
</div>
</div>
<script type="text/javascript">
function goDelete(cpath, idx){
// 삭제시켜 줄 컨트롤러로 이동
// 삭제 후 boardList.jsp 로
location.href =cpath+'/boardDelete.do?idx='+idx;
}
</script>
</body>
</html>
'자바스프링' 카테고리의 다른 글
게시판 글 수정 SpringMVC02(Ajax + JSON) (0) | 2022.06.30 |
---|---|
게시판 수정 (0) | 2022.06.28 |
게시판 글 출력 (0) | 2022.06.24 |
게시판 만들기 (0) | 2022.06.24 |
스프링 서버과정 (0) | 2022.06.24 |