관리 메뉴

DeseoDeSeo

[Spring] SpringMVC01_동기방식 마무리 본문

spring

[Spring] SpringMVC01_동기방식 마무리

deseodeseo 2023. 9. 12. 10:05
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