글 쓰기

링크 생성

링크는 이전에 게시판 목록 페이지를 만들때 해줬다.

컨트롤러 매핑

컨트롤러에서 boardPost.jsp로 매핑해주는거로 시작한다.

package com.poby.myapp.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.poby.myapp.service.BoardService;

@Controller
public class BoardController {
	@Autowired
	BoardService service;
	
	// 게시판 목록(페이징, 검색)
	@RequestMapping("/board/boardList")
	public ModelAndView boardList() {
		ModelAndView mav = new ModelAndView();
		
		return mav;
	}
	
	// 글 쓰기
	@GetMapping("/board/boardPost")
	public String boardPost() {
		return "board/boardPost";
	}
}

페이지 이동

글 쓰기 form을 만들어보자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<title>글 쓰기</title>
<div class="container">
	<h1>글 쓰기 form</h1>
	<form action="/myapp/board/boardPostOk">
		<ul>
			<li>제목</li>
			<li><input type="text" name="subject" id="subject" size="50"></li>
			<li>
				<textarea name="content" id="content" rows="20" cols="100"></textarea>
			</li>
			<li><input type="submit" value="저장"></li>
		</ul>
	</form>
</div>

유효성 검사

submit하기 전에 제목과 내용이 비어있진 않은지 확인해주자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<script>
	function formCheck(){
		if(document.getElementById("subject").value == ""){
			alert("제목을 입력하세요.");
			return false;
		}
		if(document.getElementById("content").value == ""){
			alert("내용을 입력하세요.");
			return false;
		}
		return true;
	}
</script>
<title>글 쓰기</title>
<div class="container">
	<h1>글 쓰기 form</h1>
	<form method="post" action="/myapp/board/boardPostOk" onsubmit="return formCheck()">
		<ul>
			<li>제목</li>
			<li><input type="text" name="subject" id="subject" size="50"></li>
			<li>
				<textarea name="content" id="content" rows="20" cols="100"></textarea>
			</li>
			<li><input type="submit" value="저장"></li>
		</ul>
	</form>
</div>

이전엔 jQuery로 했지만, 이번엔 Javascript로 했다. action에 boardPostOk로 링크를 생성했다.

컨트롤러 매핑

이제 입력받은 제목과 내용을 DB에 등록해주자. 컨트롤러에 boardPostOk를 매핑하자.

package com.poby.myapp.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.poby.myapp.service.BoardService;
import com.poby.myapp.vo.BoardVO;

@Controller
public class BoardController {
	@Autowired
	BoardService service;
	
	// 게시판 목록(페이징, 검색)
	@RequestMapping("/board/boardList")
	public ModelAndView boardList() {
		ModelAndView mav = new ModelAndView();
		
		return mav;
	}
	
	// 글 쓰기
	@GetMapping("/board/boardPost")
	public String boardPost() {
		return "board/boardPost";
	}
	
	// 새 글 등록
	@PostMapping("/board/boardPostOk")
	public ModelAndView boardPostOk(BoardVO vo, HttpServletRequest req) {	// 제목, 내용
		ModelAndView mav = new ModelAndView();
		
		vo.setIpAddr(req.getRemoteAddr());	// 작성자 ip주소
		vo.setUsername((String)req.getSession().getAttribute("username"));	// 현재 로그인한 아이디
		
		return mav;
	}
}

작성자의 ip주소를 불러와야하기 때문에 매개변수로 HttpServletRequest를 넣었다.

Service

DAO, Service, ServiceImpl에도 메소드를 만들자.

package com.poby.myapp.service;

import com.poby.myapp.vo.BoardVO;

public interface BoardService {
	// 새 글 등록
	public int boardPostOk(BoardVO vo);
}
package com.poby.myapp.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.poby.myapp.dao.BoardDAO;
import com.poby.myapp.vo.BoardVO;

@Service
public class BoardServiceImpl implements BoardService {
	@Inject
	BoardDAO dao;

	@Override
	public int boardPostOk(BoardVO vo) {
		return dao.boardPostOk(vo);
	}
}

DAO, 쿼리문 작성

package com.poby.myapp.dao;

import com.poby.myapp.vo.BoardVO;

public interface BoardDAO {
	// 새 글 등록
	public int boardPostOk(BoardVO vo);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.poby.myapp.dao.BoardDAO">
	<insert id="boardPostOk" parameterType="com.poby.myapp.vo.BoardVO">
		INSERT INTO board_tbl(postno, subject, content, username, ipAddr) 
		VALUES(board_seq.nextval, #{subject}, #{content}, #{username}, #{ipAddr})
	</insert>
</mapper>

컨트롤러 모델&뷰

// 새 글 등록
@PostMapping("/board/boardPostOk")
public ModelAndView boardPostOk(BoardVO vo, HttpServletRequest req) {	// 제목, 내용
	ModelAndView mav = new ModelAndView();
	
	vo.setIpAddr(req.getRemoteAddr());	// 작성자 ip주소
	vo.setUsername((String)req.getSession().getAttribute("username"));	// 현재 로그인한 아이디
	
	mav.addObject("result", service.boardPostOk(vo));
	mav.setViewName("board/boardPostOk");
	
	return mav;
}

페이지 이동

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- attribute로 넘어온 변수 : result -->
<!-- 등록 안 됐을때, 뒤로가기 -->
<c:if test="${ result=0 }">
	<script>
		alert("글 등록 실패.");
		history.back();
	</script>
</c:if>
<!-- 등록됐을때, 목록으로 이동 -->
<c:if test="${ result>0 }">
	<script>
		location.href = "/myapp/board/boardList";
	</script>
</c:if>

랜덤한 뉴스 기사를 가져와서 등록하고, board_tbl에 저장되었는지 확인하자.

 

이제 글의 개수에 따라서 페이지를 만들어보자.

+ Recent posts