DeseoDeSeo
[Spring] SpringMVC01_동기방식 마무리 본문
boardList.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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.4/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>Spring MVC01</h2>
<div class="panel panel-default">
<div class="panel-heading">Board</div>
<div class="panel-body">
<table class="table table-bordered table-hover">
<!-- tr class = success , info , danger, warning, active -->
<tr class="danger">
<td>번호</td>
<td>제목</td>
<td>작성자</td>
<td>작성일</td>
<td>조회수</td>
</tr>
<!-- model 안에 있는 list를 jstl을 활용하여 출력 -->
<c:forEach items ="${list}" var ="vo" varStatus="i">
<tr>
<td> ${i.count}</td>
<td> <a href ="boardContent.do/${vo.idx}">${vo.title}</a></td>
<td> ${vo.writer}</td>
<td> ${fn:split(vo.indate, " ")[0]}</td>
<td> ${vo.count}</td>
</tr>
</c:forEach>
</table>
<a href="boardForm.do" class="btn btn-primary btn-sm"> 글쓰기 </a>
</div>
<div class="panel-footer">스프링게시판-PBK</div>
</div>
</div>
</body>
</html>
○ a 태그안에 ?idx=$ 부분을 <td> <a href ="boardContent.do/${vo.idx}">${vo.title}</a></td> "/"로 바꾼다.
BoardController.java
package kr.spring.controller;
import java.util.ArrayList;
import java.util.List;
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 kr.spring.entity.Board;
import kr.spring.mapper.BoardMapper;
@Controller // 현재 클래스를 핸들러맵핑이 찾기 위해 컨트롤러로 등록하는 부분.
public class BoardController {
@Autowired // 자동으로 연결하는 거.
private BoardMapper mapper;// mybatis한테 JCBC를 실행하라고 요청하는 객체
@RequestMapping("/")// 요청url로 들어왔을 때 아래 기능을 수행하겠다.
public String home(){
System.out.println("홈 기능 수행");
return "redirect:/boardList.do"; // 다시 접속할 주소를 리다이렉트 방식으로 리턴하는거임.
}
@RequestMapping("/boardList.do") // 요청url로 들어왔을 때 아래 기능을 수행하겠다. 보통 메서드도 요청 url앞 부분이랑 맞춰줌.
public String boardList(Model model) {
System.out.println("게시판목록보기 기능수행");
// web-inf > view > boardList생성.
// 실행해서 열리는 페이지의 url에 /boardList.do 붙이면 console창에 게시판목록보기 기능수행이 출력됨.
// 게시글 정보 가져오기
// 한 개의 게시물로 하나로 묶음. board (dto)형으로 바꿈
// 전체 게시글 조회기능
List<Board> list = mapper.getLists();
//객체 바인딩- 동적바인딩
model.addAttribute("list", list);
return "boardList";
}
@RequestMapping("/boardForm.do")
public String boardForm() {
System.out.println("글쓰기 페이지 이동");
return "boardForm";
}
@RequestMapping("/boardInsert.do")
// Board board라고 하면 Board객체 안에 알아서 옴. 1. input의 name과 vo name의 값이 같아야한다. 2. default 기본 생성자가 있어야한다. getter/setter도 있어야한다.
public String boardInsert(Board board) {
System.out.println("게시글 등록 기능 수행");
mapper.boardInsert(board);
return "redirect:/boardList.do";
}
@RequestMapping("/boardContent.do/{idx}")
// url이 더 간편해짐.( 최신 버전)
public String boardContent(@PathVariable("idx") int idx, Model model) {
System.out.println("게시글 상세보기 기능 수행");
// 게시글 연결하고db관련된거는 mapper에게 부탁함.
// 한개의 게시글이 리턴타입임. 그래서board객체로 받아옴,
// 게시글 조회수 증가
mapper.boardCount(idx); //count =count+1
Board vo =mapper.boardContent(idx);
model.addAttribute("vo",vo);
return "boardContent";
// 모델이라는 공간에 담아서 boardContent로 보냄.
}
@RequestMapping("/boardDelete.do/{idx}")
public String boardDelete(@PathVariable("idx") int idx) {
System.out.println("게시글 삭제기능수행");
mapper.boardDelete(idx);
return "redirect:/boardList.do";
// 여기서 idx를 받으면 Boardmapper.java로 이동함. 그 다음 BoardMapper.xml로 이동함.
}
@RequestMapping("/boardUpdateForm.do/{idx}")
public String boardUpdateForm(@PathVariable("idx") int idx, Model model) {
System.out.println("게시글 수정화면 이동 기능 수행");
// 수정 화면으로 이동 => 하나의 게시글 정보(=idx)를 가지고(=> RequestParam으로 idx를 받아서 int idx에 저장. boardUpdateForm으로 이동함.
Board vo = mapper.boardContent(idx);
model.addAttribute("vo", vo);
return "boardUpdateForm";
// boradUpdateForm.jsp로 이동함.
}
// 동기방식: 한 가지의 일을 하는 동안 다른 일은 못함.
// 비동기방식: 동시에 다른일도 할 수 있음.
@RequestMapping("/boardUpdate.do")
public String boardUpdate(Board vo) {
mapper.boardUpdate(vo);
return "redirect:/boardList.do";
}
}
○ "/boardDelete.do/{idx}" 링크가 있는 곳에 / 넣어줌.
조회수
// 게시글 조회수 증가
mapper.boardCount(idx); //count =count+1
Board vo =mapper.boardContent(idx);
model.addAttribute("vo",vo);
@ PathVariable
➜ URI 변수 (JSP로 데이터를 전달하기 위한 방법)
: URL경로 일부를 변수 값으로 추출하여 매개변수에 할당.
기본적으로 경로 변수는 반드시 값을 가져야 하며, 없을 경우 404에러 발생.
< Request가 들어오는 방식 >
1. URI변수(@PathVariable)
2. Query String(@RequestParam)
3. Body
4. Form
BoardMapper.java
package kr.spring.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import kr.spring.entity.Board;
@Mapper // MyBatis interFace를 찾기 위해 달아주는 부분.
public interface BoardMapper {
public List<Board> getLists();
//우리는 sql문만 적으면 sql~~가 다 구현해서 함.
public void boardInsert(Board board);
public Board boardContent(int idx);
public void boardDelete(int idx);
public void boardUpdate(Board vo);
public void boardCount(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="kr.spring.mapper.BoardMapper">
<!-- 인터페이스랑 xml이랑 같은 이름 사용하면 위의 namespace처럼 알아서 맞춰짐 -->
<!-- id는 메서드 명이랑 똑같이 해야 찾아갈 수 있음. boardmapper.java에서 return타입이 list이니까 그에 맞춰서
resultType도 적어준다.그리고 -->
<select id ="getLists" resultType="kr.spring.entity.Board">
SELECT * FROM BOARD ORDER BY INDATE DESC
</select>
<!-- 매개변수는 parameterType에. 그리고 똑같이 board임. -->
<insert id ="boardInsert" parameterType="kr.spring.entity.Board">
INSERT INTO BOARD(TITLE, CONTENT, WRITER) VALUES(#{title},#{content},#{writer})
</insert>
<!-- 사실 parameterType은 안 적어도 됨.( 매개변수) -->
<select id="boardContent" resultType="kr.spring.entity.Board">
SELECT * FROM BOARD WHERE IDX =#{idx}
</select>
<delete id="boardDelete">
DELETE FROM BOARD WHERE IDX= #{idx}
</delete>
<update id="boardUpdate" parameterType="kr.spring.entity.Board" >
UPDATE BOARD SET TITLE=#{title}, CONTENT=#{content}, WRITER=#{writer} WHERE IDX=#{idx}
</update>
<update id="boardCount">
UPDATE BOARD SET COUNT=COUNT +1 WHERE IDX=#{idx}
</update>
</mapper>
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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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.4/jquery.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<%pageContext.setAttribute("newLineChar", "\n");%>
<div class="container">
<h2>Spring MVC01</h2>
<div class="panel panel-default">
<div class="panel-heading">Board</div>
<div class="panel-body">
<table class="table">
<tr><!-- 모델안에 넣어둔 데이터 꺼내옴, -->
<td>제목</td>
<td>
${vo.title}
</td>
</tr>
<tr>
<td>내용</td>
<!-- vo.content에서 newLineChar가 보이면 br태그로 바꿔주겠다. -->
<td> ${fn:replace(vo.content, newLineChar, "<br>" )}
</td>
</tr>
<tr>
<td>작성자</td>
<td>${vo.writer}</td>
</tr>
<tr>
<td>작성일</td>
<td>
<!-- 0번째꺼 쓰겠다. -->
${fn:split(vo.indate, " ")[0]}
</td>
</tr>
<tr>
<td>조회수</td>
<td>${vo.count}</td>
</tr>
<tr>
<td colspan="2" align="center">
<a href ="../boardUpdateForm.do/${vo.idx}" class="btn btn-success btn-sm">수정 화면</a>
<!-- boardController로감, -->
<!-- Q: 게시글을 삭제하고 게시글 목록으로 이동하시오. -->
<a href ="../boardDelete.do/${vo.idx}" class="btn btn-warning btn-sm">삭제</a>
<!-- 위의 코드는 boardcontroller로 감. -->
<a href ="../boardList.do" class="btn btn-info btn-sm" >목록</a>
<!-- 한칸 위로 올라간다라는 의미../ -->
</td>
</tr>
</table>
</div>
<div class="panel-footer">스프링게시판-PBK</div>
</div>
</div>
</body>
</html>
boardList.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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.4/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>Spring MVC01</h2>
<div class="panel panel-default">
<div class="panel-heading">Board</div>
<div class="panel-body">
<table class="table table-bordered table-hover">
<!-- tr class = success , info , danger, warning, active -->
<tr class="danger">
<td>번호</td>
<td>제목</td>
<td>작성자</td>
<td>작성일</td>
<td>조회수</td>
</tr>
<!-- model 안에 있는 list를 jstl을 활용하여 출력 -->
<c:forEach items ="${list}" var ="vo" varStatus="i">
<tr>
<td> ${i.count}</td>
<td> <a href ="boardContent.do/${vo.idx}">${vo.title}</a></td>
<td> ${vo.writer}</td>
<td> ${fn:split(vo.indate, " ")[0]}</td>
<td> ${vo.count}</td>
</tr>
</c:forEach>
</table>
<a href="boardForm.do" class="btn btn-primary btn-sm"> 글쓰기 </a>
</div>
<div class="panel-footer">스프링게시판-PBK</div>
</div>
</div>
</body>
</html>
pom.xml
<!-- mybatis와 Spring을 연결해주는 API -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
'spring' 카테고리의 다른 글
[Spring] SpringMVC02_비동기방식 (0) | 2023.09.13 |
---|---|
[Spring] 비동기방식 (0) | 2023.09.12 |
[Spring] SpringMVC01_게시판 구현(글쓰기) (0) | 2023.09.07 |
[Spring] SpringMVC01_ 환경설정 (0) | 2023.09.06 |
[spring] springMVC 구조 (0) | 2023.09.06 |