<Board.java>
package com.smhrd.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data // Getter/Setter/toString
@NoArgsConstructor
public class Board {
// 1. Class 필드명 == Table 컬럼
// 2. 기본생성자
// 글번호
private int idx;
// 제목
private String title;
// 작성자
private String writer;
// 내용
private String content;
// 작성일
private String indate;
// 조회수
private int count;
}
<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="boardUpdate" parameterType="com.smhrd.domain.Board">
update board set title=#{title}, content=#{content} where idx=#{idx}
</update>
</mapper>
<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);
public int boardUpdate(Board vo);
}
<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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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";
}
// 업데이트 페이지로 이동
// Get방식 요청만 받아들이는 Controller
// boardUpdate.jsp 이동
@GetMapping("/boardUpdate.do")
public String boardUpdateForm(int idx, Model model) {
Board vo = mapper.boardContent(idx);
// 객체 바인딩
model.addAttribute("vo",vo);
return "boardUpdate";
}
// 같은 url요청이라도, 요청 방식에 따라 다른 처리를 해야할 때 사용
// 실제 Update기능
@PostMapping("/boardUpdate.do")
public String boardUpdate(Board vo) {
mapper.boardUpdate(vo);
// return "redirect:/boardList.do";
return "redirect:/boardContent.do?idx="+vo.getIdx();
}
}
<Boardcontent.jsp>
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);
public int boardUpdate(Board vo);
}
<BoardUpdate.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// 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">
<form class="form-horizontal" action="${cpath}/boardUpdate.do" method="post" >
<%--hidden : 공간을 차지하지 않음 --%>
<input type="hidden" name="idx" value="${vo.idx}">
<div class="form-group">
<label class="control-label col-sm-2" for="title">title:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="title"
name="title" value="${vo.title}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="writer">writer:</label>
<div class="col-sm-10">
<%-- disabled : 사용하지 못하게 함, form태그로 전송도 불가
readonly : 수정 불가능
--%>
<input readonly type="text" class="form-control" id="writer"
name="writer" value="${vo.writer}">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="content">content:</label>
<div class="col-sm-10">
<textarea rows="10" id="content" class="form-control" name="content">${vo.content}</textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Submit</button>
</div>
</div>
</form>
</div>
<div class="panel-footer">지능형 IoT 8차 최지연</div>
</div>
</div>
</body>
</html>
'자바스프링' 카테고리의 다른 글
게시글 작성하기(SpringMVC02(Ajax + JSON)) (0) | 2022.07.01 |
---|---|
게시판 글 수정 SpringMVC02(Ajax + JSON) (0) | 2022.06.30 |
게시판 글 삭제 (0) | 2022.06.27 |
게시판 글 출력 (0) | 2022.06.24 |
게시판 만들기 (0) | 2022.06.24 |