주먀
3. 게시판 조회하기 본문
1. 점선 위아래 두개 다른 객체이다.
2. 기본적인 특징들은 꼭 외우기 ( 또 다른 특징. Aop -> 관점지향 프로그램 )
BoardMapper.xml
1. 매우중요! mapper id 와 xml 메서드명 일치해야한다.
2. mysql -> 조회해온 값이 한줄이면 : BroadCast / 여러줄 : ArrayList<BroadCast> 로 받아오기
3. mapper -> db
4. vo -> 고객에게 받아온 값이다.
5. #{} -> 파라미터로 Board 안에 수많은 필드가 있을건데, 그 중에서 대문자 Writer의 Getter 메서드를 사용한다는 뜻이다.
6. sql 구문은 대문자로 -> 빨리 읽힌다.
7. 인터페이스를 거쳐야만 xml로 갈 수 있다
8. 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" >
<!-- SQL구문을 작성하는 xml파일 -->
<!-- 반드시 DAO역할을 하는 Mapper.java파일과 package명칭을 동일하게 맞추기
반드시 DAO역할을 하는 Mapper.java파일과 이름도 동일하게 맞추기 -->
<mapper namespace="kr.smhrd.mapper.BoardMapper">
<!-- 1) 게시글 전체조회하기 -->
<!-- 매우중요! 해당하는 SQL구문을 불러서 사용하게 될 메소드명과 id값을 동일하게 맞추기 -->
<select id="getList" resultType="kr.smhrd.model.Board">
SELECT * FROM BOARD
</select>
<!-- 2) 게시글 추가하기 -->
<insert id="boardInsert" parameterType="kr.smhrd.model.Board">
INSERT INTO BOARD(WRITER, TITLE, CONTENT)
VALUES(#{writer}, #{title}, #{content})
</insert>
<!-- \#{필드명} : parameterType으로 받아온 데이터의 getter메소드를 부르는 기호 -->
</mapper>
BoardController.java
- url 앞에 슬래쉬 필수이다. ( .do랑 같은 의미 )
- 비동기통신전까지는 무조건 String타입이다.
- url 변경이 되면 controller로 잡아주기
package kr.smhrd.web;
import java.util.ArrayList;
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.RequestMethod;
import kr.smhrd.mapper.BoardMapper;
import kr.smhrd.model.Board;
// servlet-context.xml에 scan 지정이 되어있음
// POJO와 같이 어노테이션(@Controller, @RestController 등)이 붙은 class scan
// 이것만 잘 적어주면 spring이 알아서 스캔해줄거임
@Controller // POJO임을 명시
public class BoardController {
// 실제 요청을 처리할 POJO
// 1-1) Mapper(DAO) 생성
@Autowired // --> Spring Container에 위치하고 있는
// SqlSessionFactoryBean 구현체를 받아와서 연결
private BoardMapper mapper;
// 요청이 들어왔을 때, 무슨 일을 할건지 정해주자 --> method 정의
// /list 라는 요청 들어오면, boardList.jsp로 이동하겠다.
@RequestMapping("/list") // @RequestMapping 달고 UrlMapping 지정
public String list(Model model) {
// request가 필요하면 메소드의 매개변수에 선언을 하게 되면,
// Spring Container가 자동으로 request를 채워준다.
// Model == request 경량화 버전
// SpringFramework에서는 request객체 대신 Model 사용한다.
// 1. 게시글 데이터를 DB에서 조회해서 가져오기
// 1-2) mapper 사용
ArrayList<Board> list = mapper.getList();
// 2. 조회한 데이터를 request에 담아서
model.addAttribute("list", list);
// 3. boardList.jsp 로 forward방식으로 이동
return "boardList"; // /WEB-INF/View/boardList.jsp ->root-context.xml에 들어있음
// boardList : 논리적인 주소값
// /WEB-INF/View/boardList.jsp : 물리적인 주소값 변환 해줌(Spring 내부 객체가)
}
// boardInsert로 GET방식 요청이 들어왔을 때
@GetMapping("/boardInsert")
public String boardInsert() {
// boardInsert.jsp로 forward 이동
return "boardInsert";
}
// boardInsert로 Post방식 요청이 들어왔을 때
// 동일한 url mapping이더라도 요청방식에 따라서 다른 메소드를 연결해줄 수 있다!!
// @RequestMapping(value="/boardInsert",method=RequestMethod.POST)
@PostMapping("/boardInsert")
public String boardInsert(Board vo) {
// INSERT INTO BOARD(WRITER, TITLE, CONTENT)
// VALUES(?,?,?)
// 1. db에 데이터 추가
mapper.boardInsert(vo);
// BoardMapper인터페이스 --> BoardMapper.xml 안의 쿼리문을 실행!!!
// 2. redirect방식으로 /list로 이동
return "redirect:/list";
// : 기준으로 split을 진행하고 뒤쪽에 있는 url값만 가져다가
// redirect방식으로 이동하게끔 Spring 내부에 설계가 되어있다.
}
// 게시글 조회하기
@GetMapping("/boardContent/{num}")
public String boardContent(@PathVariable("num") int n1, Model model) {
// HttpSession --> session
// 1. Board 파라미터 수집 가능
// 2. 자료형 name값
// 3. url path값에 보내줄 데이터를 포함시켜서 수집하는 방법
// >>>>> @PathVariable
// 1. DB에서 게시글 한개를 조회해오기
Board result = mapper.boardContent(n1);
//2. 조회한 게시글을 model 담아주기
model.addAttribute("result", result);
//3. boardContent.jsp로 forward방식으로 이동
return "boardContent";
}
}
BoardMapper.java
package kr.smhrd.mapper;
import java.util.ArrayList;
import java.util.Date;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import kr.smhrd.model.Board;
public interface BoardMapper {
// DAO 역할을 하는 클래스
// 1. 전체 게시글을 조회하는 기능
public ArrayList<Board> getList();
// 추상메소드
// 2. 게시글 추가하는 기능
public void boardInsert(Board vo);
// 간단한 쿼리구문은 annotation을 사용해서 mapper interface에 작성할 수 있다.
// annotation과 xml에 쿼리구문이 두개이상 존재하면 에러가 난다!!!
// 3. 게시글 한개를 조회하는 기능
@Select("SELECT * FROM BOARD WHERE NUM = #{n1}")
public Board boardContent(int n1);
// SpringContainser에 적재되어있는
// SqlSessionFactoryBean클래스가 알아서 작동시킴~!
///////////////////////////////////////////////////////////////////////
// SqlSession session = SqlSessionFactory.openSession(true);
// ArrayList<Board> list = session.selectList("getList");
// session.close();
// // 생성한 게시글을 리턴
// return list;
///////////////////////////////////////////////////////////////////////
}
* 1. web.xml 해석 * ( 스키마추가 : Namespaces -> 스키마 체크 )
1-1. root-context.xml 해석 -> HikariConfig -> 유효성 검사 ( ContextLoader ( web.xml 16줄 ) 에러안뜨면 -> root-context.xml에 문제가 있는 것다. )
1-2. DispatcherServlet ( appServlet 명칭 )-> FrontController -> servlet-context.xml해석을 해야 FrontController로 간다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container
shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Processes application requests -->
<!-- FronController 생성하는 구간 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- FronController 생성하는 구간 -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 한글 잡아주는 인코딩 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
* 2. root-context.xml 해석 *
2-1. property 값 잘 들어가있는지 체크하기 -> 잘만들어져야 dbcp 생성이 된다. -> mapper 파일의 위치 등록하는 것 체크하기
-> 에러뜨면 -> sql구문을 잘 못 썻을때 해당 체크하기
*3. servlet-context.xml 해석 *
3-1. POJO 해석이다.
3-2. 폴더 위치 해석이다. ( res로 하고싶으면 작성 하면됨 )
3-3. ViewResolver -> 앞뒤로 풀어준다.
3-4. 폴더만들어주고 싶으면 view/ 뒤에 추가하면된다.
3-5. ★★★★★ Controller가 어디에 위치되어있는지 스캔하는 기능 ★★★★★
패키지명 변경할때 web 대신 다른 패키지명으로 변경하기
boardList.jsp
1. 태그는 태그안에 추가 가능하다.
2. <!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->
3. get -> url 포함 ( 쿼리스트링 )
4. 1Controller -> 1Mapper 생성하기
5. 쿼리스트명 -> 변수명 동일해야함
6. 쿼리스트링 말고 새로운 방법 -> url만 꺼내오는 방법 ( @PathVariable )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<!-- jQuery library -->
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<!-- Popper JS -->
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>Spring Framework 게시판</h1>
<p>spring MVC를 이용해서 간단한 게시판을 만들어봅시다~</p>
</div>
</div>
<div class="container">
<div class="card">
<div class="card-header">빅데이터 분석서비스 개발자과정 게시판</div>
<div class="card-body">
<table class="table table-bordered table-hover" border = '1'>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
</tr>
<!-- jstl 문법을 써서 반복 -->
<c:forEach items="${list}" var="b">
<td>${b.num}</td>
<td><a href="${cpath}/boardContent/${b.num}">${b.title}</a></td>
<td>${b.writer}</td>
<td>${b.indate}</td>
</tr>
</c:forEach>
<td colspan="4">
<button class="btn btn-success btn-sm" onclick="location.href='boardInsert'">글쓰기</button>
</td>
</tr>
</table>
</div>
<div class="card-footer">Spring 마스터를 해봅시다.</div>
</div>
</div>
</body>
</html>
boardContent.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- contextPath를 동적으로 가져오는 방법 -->
<c:set var="cpath" value="${pageContext.request.contextPath}"/>
<!-- cpath == /web -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<!-- jQuery library -->
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<!-- Popper JS -->
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>Spring Framework 게시판</h1>
<p>spring MVC를 이용해서 간단한 게시판을 만들어봅시다~</p>
</div>
</div>
<div class="container">
<div class="card">
<div class="card-header">빅데이터 분석서비스 개발자과정 게시판</div>
<div class="card-body">
<table class="table table-bordered table-hover" border = '1'>
<tr>
<td>번호</td>
<td>${result.num}</td>
</tr>
<tr>
<td>제목</td>
<td>${result.title}</td>
</tr>
<tr>
<td>작성자</td>
<td>${result.writer}</td>
</tr>
<tr>
<td>작성일</td>
<td>${result.indate}</td>
</tr>
</table>
</div>
<div class="card-footer">Spring 마스터를 해봅시다.</div>
</div>
</div>
</body>
</html>
'학원 > Spring' 카테고리의 다른 글
5. piechart 그리기 (0) | 2023.06.09 |
---|---|
4. 차트 그리기 ( 전체 조회하기 ) (0) | 2023.06.07 |
2. 게시글 전체조회하기 / 게시글 추가하기 ( Controller , DAO , DTO ) (0) | 2023.05.31 |
1. Spring 시작 (0) | 2023.05.30 |
Spring 프레임 워크 다운 (0) | 2023.05.30 |