저번 페이지에서는 redirect로 listAll.jsp로 이동하기 위해 데모 코드만 작성했는데요

실제로 test로 작성했던 글들을 뿌려보겠습니다.

 

@RequestMapping(value = "/listAll", method = RequestMethod.GET)
public void listAll(Model model) throws Exception {
	logger.info("listAll!!");
	List<BoardVO> boards = service.listAll();
	model.addAttribute("list", boards);
}

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

	<script>
		var register = "${register}";
		if(register === "registerOK") {
			alert("등록 되었습니다.");
		}
	</script>

</head>
<body>
	
	<table>
		<tr> <!-- 한줄 -->
			<th>번호</th> <!-- 첫번째 칸 -->
			<th>제목</th> <!-- 두번째 칸 -->
			<th>작성자</th> <!-- 세번째 칸 -->
			<th>작성일자</th> <!-- 네번째 칸 -->
			<th>조회수</th>
		</tr>
		
		<c:forEach items="${list}" var="boardVO">
			<tr>
				<td>${boardVO.board_number}</td>
				<td><a href="/board/read?board_number=${boardVO.board_number}">${boardVO.title}</a></td>
				<td>${boardVO.name}</td>
				<td><fmt:formatDate pattern="YYYY-MM-dd" value="${boardVO.create_date}"/></td>
				<td>${boardVO.view_count}</td>
			</tr>
		</c:forEach>
	</table>
	
</body>
</html>

 

날짜를 db에 있는 값 그대로 사용하면 

Fri Jul 10 01:57:07 KST 2020 이런식으로 정보가 나오게 됩니다. 

이걸 보기 좋게 하려면 jstl에 fmt을 사용해야 하는데요

fmt를 사용하기 위해 소스 상단에 다음과 같은 코드를 추가합니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

 

 

이제 결과를 보겠습니다!!!

 

 

정상적으로 작동하네요!

'JAVA > blog' 카테고리의 다른 글

게시글 삭제, 수정 기능 추가  (0) 2020.07.09
해당 게시물 조회  (0) 2020.07.09
controller redirect  (0) 2020.07.09
controller 구현  (0) 2020.07.08
controller를 작성하기 전에 알아야 할 사항  (0) 2020.07.08

새로고침의 문제점

 

controller를 구현 후 데이터를 입력하면 정상적으로 데이터가  입력이 됐습니다.

하지만 새로고침을 하게 되면 브라우저는 한번 더 POST 방식으로 데이터를 전송할 것인지 묻습니다.

 

 

여기서 확인을 누르게 되면 게시글이 정상적으로 등록이 되는데 

이 현상을 방지하기 위해서는 게시글을 등록하고 바로 다른 페이지로 이동시키면 됩니다!

이렇게 하기 위해서는 ridrecti가 필요합니다.

보통의 페이지들은 글을 작성하고 나면 목록이나 홈으로 이동이 되는데요.

registerPOST가 실행이 된후에 listAll라는 url을 매핑받는 컨트롤러를 실행시켜 listAll.jsp가 보이도록 redirect 처리를 해보겠습니다.

 

BoardController.class 수정

 

  	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(BoardVO board, Model model) throws Exception {
		logger.info("register POST !!");
		
		service.create(board);
		
		model.addAttribute("result", "registerOK");
		
		return "redirect:/board/listAll";   // 수정
	}
	
         // 추가
	@RequestMapping(value = "/listAll", method = RequestMethod.GET)
	public void listAll(Model model) throws Exception {
		logger.info("listAll!!");
	}

 

listAll를 매핑받는 컨트롤러를 생성했으니 이제 화면을 보여줄 뷰를 만들어보겠습니다.

 

<!-- listAll.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<table>
		<tr> <!-- 한줄 -->
			<th>번호</th> <!-- 첫번째 칸 -->
			<th>제목</th> <!-- 두번째 칸 -->
			<th>작성자</th> <!-- 세번째 칸 -->
			<th>작성일자</th> <!-- 네번째 칸 -->
		</tr>
	</table>
	
</body>
</html>

 

이제 다시 실행을 하기전에 controller를 제외한 jsp나 service, dao, vo등은 수정하고 다시 서버를 재기동 하지 않아도 되는데

controller는 코드 수정을 하고 난 후 반드시 서버를 재기동 시켜야 합니다!

 

다시 서버를 작동하고  글을 작성해보겠습니다.

 

 

위에 이미지를 보시면 아까 컨트롤러에서 redirect로 설정한 listAll.jsp가 정상적으로 실행 됐습니다.

하지만 url에 보이면 안되는 result=registerOK가 보이네요.

이 문제를 해결하기 위해서는 Spring의 RedirectAttributes 객체를 사용해야 합니다.

 

 

RedirectAttributes 란?

 

스프링의 RedirectAttributes 객체는 redirect 할때 일회성으로 데이터를 전송할 수 있도록 도와주는 

addFlashAttributes() 기능을 사용할 수 있는데요.

addFlashAttributes()는 URL상에는 보이지 않도록 숨겨진 데이터 형태로 전달됩니다.

이제 RedirectAttributes객체를 사용해보겠습니다.

 

// BoardController.java

@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(BoardVO board, RedirectAttributes ra) throws Exception {   // RedirectAttributes 수정
		logger.info("register POST !!");
		
		service.create(board);
		
		ra.addFlashAttribute("register", "registerOK");  // addAttributes -> addFlashAttributes 수정
		
		return "redirect:/board/listAll";
	}

 

 

이렇게 URL에 데이터가 보이지 않도록 처리 했습니다.

 

이제 register -> listAll으로 페이지를 이동하면 alert 기능으로 경고창이 보이도록 하겠습니다.

 

listAll.jsp에서 코드를 추가할건데요 listAll.jsp에서 코드를 작성하는 이유는 

controller에서 return값이 listAll.jsp로 설정되있기 때문입니다!!

 

<!-- listAll.jsp -->

<script>
	var register = '${register}';
	if(register === 'registerOK') {
		alert("등록 되었습니다.");
	}
</script>

 

controller에서 보냈던 model값을 jsp에서 사용하는 방법은

'${변수}'로 작성하시면 됩니다( ' ', " " 둘 다 사용 가능)

 

 

 

이렇게 경고창도 잘뜨고 URL에 보여이면 안되는 정보가 보이지 않습니다!!

'JAVA > blog' 카테고리의 다른 글

해당 게시물 조회  (0) 2020.07.09
게시글 목록 구현  (0) 2020.07.09
controller 구현  (0) 2020.07.08
controller를 작성하기 전에 알아야 할 사항  (0) 2020.07.08
비즈니스 계층(service)  (0) 2020.07.08

게시물 등록

 

게시물을 등록할 때는

사용자가 작성하기 위한 페이지를 볼 경우  -> GET 방식

사용자가 데이터를 입력할 경우  -> POST 방식

 

이제 본격적으로 컨트롤러를 작성하겠습니다.

 

package kr.co.web.controller;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.co.web.domain.BoardVO;
import kr.co.web.service.BoardService;

@Controller
@RequestMapping("/board/*")
public class BoardController {

	private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
	// 로그를 찍기 위한 객체 Logger 사용
	
	@Inject
	private BoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public void registerGET(BoardVO board) throws Exception {
		logger.info("register GET !!");
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(BoardVO board, Model model) throws Exception {
		logger.info("register POST !!");
		
		service.create(board);
		
		model.addAttribute("result", "registerOK");
		
		return "/board/test";
	}
}

 

해당 컨트롤러에서 유심히 봐야할 것은 registerGET 메서드와 registerPOST메서드 입니다.

registerGET메서드는 사용자가 데이터를 입력하는 페이지에 접근할 때 사용하고,

registerPOST메서드는 주소창에 보여지면 안되는 정보를 전송할 때 사용합니다.

실제로 화면에서 입력되어 들어오는 데이터를 처리하는 registerPOST 메서드의 파라미터는 자동으로 모든 데이터를 BoardVO로 수집하는 부분과,

나중에 뷰로 데이터를 전달하기 때문에 Model 클래스의 객체를 받도록 설계 했습니다.

그리고 controller 나 service, dao에서 create메서드의 파라미터를 BoardVO로 해준 이유는 

사용자가 데이터를 입력하고 BoardVO의 setter와 getter를 이용하여 데이터를 넣고 가져오기 위함입니다!!!

(수정도 마찬가지 입니다.)

 

뷰 구현, 등록

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 작성</title>
</head>
<body>
	<form method="post">
	
		<div>
			<div>
				<label for="title">제목</label>
				<input type="text" id="title" name="title" placeholder="제목을 입력하세요."/>		
			</div>
			
			<div>
				<label for="contents">내용</label>
				<textarea name="contents" id="contents" rows="3" placeholder="내용을 입력하세요."></textarea>		
			</div>
			
			<div>
				<label for="name">작성자</label>
				<input type="text" name="name" id="name"/>		
			</div>
		</div>
		
		<div>
			<button type="submit">등록</button>
		</div>
		
	</form>
</body>
</html>

 

register.jsp에서 label 태그의 for 부분과 input 태그의 name을 같이 맞춰주어야 합니다.

해당 부분은 db, vo에서 변수로 선언한 값이랑 일치해야 합니다.

 

해당 jsp를 보면 form 태그의 method 속성이 post인데

등록버튼을 누르면 사용자가 입력한 제목, 내용, 이름을 registerPOST 메서드의 파라미터 BoardVO로 전달합니다.

 

그리고 form태그에는 action 속성이 있는데 해당 속성을 작성하지 않으면 현재 경로 그대로 action의 대상 경로로 잡습니다.

이제 게시물이 정상적으로 등록이 되었으면 보여지는 화면인 test.jsp를 구현합니다.

test를 하는 이유는 나중에 등록을 하고 난 후에 리스트를 뿌릴 작업을 할것이기 때문에 테스트용으로 작성합니다.

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	성공적으로 등록되었습니다.
</body>
</html>

 

 

이제 서버를 구동해서 제대로 되는지 확인해보겠습니다.

 

 

 

 

이제 데이터를 작성하고 등록을 눌러보겠습니다.

 

 

 

 

등록버튼을 누르면 registerPOST메서드가 실행되고

아까 registerPOST의 return값을 test.jsp로 설정했는데 test.jsp의 내용이 잘 나왔습니다!!! 

 

제대로 된것을 확인하였으니 DB에도 데이터가 잘들어갔는지 확인 해보겠습니다.

 

 

데이터가 잘들어왔습니다~~

'JAVA > blog' 카테고리의 다른 글

게시글 목록 구현  (0) 2020.07.09
controller redirect  (0) 2020.07.09
controller를 작성하기 전에 알아야 할 사항  (0) 2020.07.08
비즈니스 계층(service)  (0) 2020.07.08
persistence 계층(영속 계층)  (0) 2020.07.08

+ Recent posts