본문 바로가기
Spring

[Spring] MyBatis(6) 목록페이지 -> 등록페이지

by moca7 2024. 10. 22.

 

 

ㅁ notice-mapper.xml

 

 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="noticeMapper">


  <resultMap id="noticeResultMap" type="NoticeDto">
    <result column="no" property="no" />
    <result column="title" property="title" />
    <result column="content" property="content" />
  </resultMap>


 
  <select id="selectNoticeList" resultMap="noticeResultMap">
    select
           no
        ,  title
        ,  content
      from notice
     order
        by no desc      
  </select>
 
 
 
  <!-- 번호로 공지사항 조회 -->
  <select id="selectNoticeByNo" resultMap="noticeResultMap">
    select
            no
         ,  title
         ,  content
      from  notice
     where  no = #{ noticeNo }
  </select>
 
 
  <!-- 공지사항 등록 -->
  <insert id="insertNotice">
    insert
      into notice
      (
        no
      , title
      , content    
      )
      values
      (
        seq_notice.nextval
      , #{ title }
      , #{ content }  
      )
  </insert>
 
 
  <!-- 공지사항 수정 -->
  <update id="updateNotice">
    update
            notice
       set  title = #{title}
         ,  content = #{content}      
     where  no = #{no}          
  </update>
 
 
 
</mapper>

 

- 쿼리는 이렇게 작성했었다.

 

 

 

 

ㅁ list.jsp

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  <h3>공지사항 목록 페이지</h3>

  <c:choose>
    <c:when test="${ empty list }">
      존재하는 공지사항이 없습니다
    </c:when>
   
    <c:otherwise>
      <table border="1">
        <thead>
          <tr>
            <th>번호</th>
            <th>제목</th>
            <th>내용</th>
          </tr>
        </thead>
       
        <tbody>
          <c:forEach var="n" items="${ list }">
            <tr>
              <td>${ n.no }</td>
              <td><a href="${contextPath}/notice/detail.do?no=${n.no}">${ n.title }</a></td>
              <td>${ n.content }</td>
            </tr>
          </c:forEach>
        </tbody>
      </table>
    </c:otherwise>
  </c:choose>


  <a href="${contextPath}/notice/enroll.do">공지사항 등록</a>

</body>
</html>
 

 

- 공지사항 등록 페이지로 이동할 수 있게끔 a 태그를 추가했다.

 

 

 

 

ㅁ NoticeController 

 

 
package com.br.sbatis.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.br.sbatis.dto.NoticeDto;
import com.br.sbatis.service.NoticeService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequestMapping("/notice")
@RequiredArgsConstructor
@Controller
public class NoticeController {

 
  private final NoticeService noticeService;
 
  @GetMapping("/list.do") // /notice/list.do
  public void noticeList(Model model) {
    List<NoticeDto> list = noticeService.selectNoticeList();
    log.debug("list: {}", list);
    model.addAttribute("list", list);
   
    // return "notice/list"; void여도 포워딩하려 한다. url mapping("/notice/list")를 가지고 포워딩한다.
  }
 
 
 
  @GetMapping("/detail.do") // /notice/detail.do
  public void noticeDetail(int no, Model model) {
    NoticeDto n = noticeService.selectNoticeByNo(no);
    model.addAttribute("n",n);
  }
 
 
  @GetMapping("/enroll.do") // /notice/enroll.do
  public void noticeEnroll() {}
  // 이렇게만 작성해도 페이지 이동이 된다.
 
}

 

 

- noticeEnroll 메소드 생성

 

 

 

 

 

ㅁ src/main/webapp/WEB-INF/views/notice에 enroll.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  <h3>공지사항 등록 페이지</h3>

  <form action="${ contextPath }/notice/insert.do" method="post">
    제목 : <input type="text" name="title"> <br>
    내용 : <textarea name="content"></textarea> <br><br>
   
    <input type="submit" value="등록">
  </form>

</body>
</html>
 

 

 

 

 

 

 

ㅁ web.xml

 

 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

  <!-- 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 -->
  <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>
   
  <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>
  </filter>
 
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 
</web-app>

 

- 한글 데이터 깨짐 방지.

- 서블릿 관련된 부분 하단에 <filter>, <filter-mapping> 태그를 작성해서 인코딩 필터를 등록한다.

 

 

 

 

 

ㅁ NoticeController

 

 
package com.br.sbatis.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.br.sbatis.dto.NoticeDto;
import com.br.sbatis.service.NoticeService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequestMapping("/notice")
@RequiredArgsConstructor
@Controller
public class NoticeController {

 
  private final NoticeService noticeService;
 
  @GetMapping("/list.do") // /notice/list.do
  public void noticeList(Model model) {
    List<NoticeDto> list = noticeService.selectNoticeList();
    log.debug("list: {}", list);
    model.addAttribute("list", list);
   
    // return "notice/list"; void여도 포워딩하려 한다. url mapping("/notice/list")를 가지고 포워딩한다.
  }
 
 
 
  @GetMapping("/detail.do") // /notice/detail.do
  public void noticeDetail(int no, Model model) {
    NoticeDto n = noticeService.selectNoticeByNo(no);
    model.addAttribute("n",n);
  }
 
 
  @GetMapping("/enroll.do") // /notice/enroll.do
  public void noticeEnroll() {}
  // 이렇게만 작성해도 페이지 이동이 된다.
 
 
  @PostMapping("/insert.do")
  public String noticeInsert(NoticeDto n) {
    int result = noticeService.insertNotice(n);
   
    if(result > 0) { // 성공시 다시 목록페이지
      return "redirect:/notice/list.do";
    }else { // 실패시 메인페이지
      return "redirect:/";
    }
   
   
  }
}