본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

[Spring] 2장 어노테이션으로 게시판 프로그램 구현하기

by 달님🌙 2021. 11. 1.
반응형

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

 

2.1절 글 등록 기능 구현하기 ( _056_BoardWeb_Spring_MVC_Anotation  )

 

- InsertBoardController 클래스에서 리턴타입과 매개변수를 수정한다.

- GetBoardListController를 실행시키기 위해 리턴타입을 String으로 수정하고 getBoardList.do를 리턴한다.

- 또한 사용자 입력값을 Command 객체로 받기 위해 BoardVO를, DB 연동 처리를 위해 BoardDAO를 매개변수로 선언

- DAO 객체 역시 Command 객체와 마찬가지로 매개변수로 선언하면 스프링 컨테이너가 해당 객체를 생성하여 전달해준다.

- Controller 메소드가 실행되고 View 경로를 리턴하면 기본이 포워딩 방식이므로 글 등록 후에 목록 화면이 출력되도 브라우저의 URL은 변경되지 않는다.

- 따라서 redirect:라는 접두사를 붙어 최종 URL이 http://localhost:9900/BoardWeb/getBoardList.do로 변경된다.

package com.springbook.view.board;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller	//presentation-layer.xml에 Controller 등록 부분과 같은 역할
public class InsertBoardController {
	 @RequestMapping(value="/insertBoard.do")	//presentation-layer.xml에 HandlerMapping 등록 부분과 같은 역할
	 //@RequestMapping : HandlerMapping 등록, 메소드 타입에 상관없이 호출 시 무조건 실행
	 //메소드 타입에 따라 @GetMapping, @PostMapping으로도 사용이 가능하며 예를 들어, PostMapping일 땐 post 메소드가 매핑되는 방식
	 
	 //Command 객체 : 사용자가 전송한 데이터를 매핑한 VO를 바로 생성
	 //				사용자 입력 값이 많아지면 코드가 길어지기 때문에 간략화 가능
	 // 			사용자 입력 input의 name 속성과 VO 멤버변수의 이름을 매핑해주는 것이 중요하다.
	 // 			그래야 BoardVO 클래스의 멤버변수가 insertBoard에 해당 변수에 자동으로 매핑이 된다. 
	 public String insertBoard(BoardVO vo, BoardDAO boardDAO) {	//VO 객체를 바로 가져옴
		 System.out.println("글 등록 처리");
			
			/*
			 * //1. 사용자 입력정보 추출(insertBoard.jsp에서 전송된 정보 추출) String title =
			 * request.getParameter("title"); String writer =
			 * request.getParameter("writer"); String content =
			 * request.getParameter("content");
			 * 
			 * //2. DB 연동 처리(BoardDAO의 메소드 호출) BoardVO vo = new BoardVO();
			 * vo.setTitle(title); vo.setWriter(writer); vo.setContent(content);
			 */
			
		 	boardDAO.insertBoard(vo);
			
		 	//화면 네비게이션(게시글 등록 완료 후 게시글 목록으로 이동)
			return "getBoard.list.do";
	 }
}

 

 

2.2절 글 목록 검색 구현하기

 

- 첫 번째 매개변수 : 사용자 입력값을 받기 위한 BoardVO 클래스

- 두 번째 매개변수 : DB 연동 처리를 위한 BoardDAO 클래스

- 마지막 매개변수 : 검색 결과와 화면 정보를 저장하여 리턴하기 위한 ModelAndView 매개변수로 선언하여 컨테이너가 생성하도록 처리

package com.springbook.view.board;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller
public class GetBoardListController {
	@RequestMapping(value="/getBoardList.do")
	public ModelAndView getBoardList(BoardVO vo, BoardDAO boardDAO, ModelAndView mav) {
		System.out.println("글 목록 검색 처리");
		
		//ModelAndView 객체에 데이터 담기
		mav.addObject("boardList", boardDAO.getBoardList(vo));
		//ModelAndView 객체에 View 담기
		mav.setViewName("getBoardList.jsp");
		return mav;
	}
}

 

 

2.3절 글 상세 보기 구현하기

 

- getBoard() 메소드의 매개변수와 리턴타입은 GetBoardListController와 같다.

package com.springbook.view.board;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller
public class GetBoardController {
	@RequestMapping(value="/getBoard.do")
	public ModelAndView getBoard(BoardVO vo, BoardDAO boardDAO, ModelAndView mav) {
		System.out.println("글 상세 조회 처리");
		
		mav.addObject("board", boardDAO.getBoard(vo));	//Model 정보 저장
		mav.setViewName("getBoard.jsp"); //어떤 화면으로 이동할 것인지 명시해줄 것
		return mav;
	}
}

 

 

2.4절 글 수정 기능 구현하기

 

- 게시글 수정 기능은 InsertBoardController와 유사하다.

- 클라이언트로부터 /updateBoard.do 요청이 들어오면 updateBoard() 메소드가 실행되며 이때 수정에 필요한 데이터는 매개변수로 선언된 BoardVO 객체를 통해 받아낸다.

- 그리고 BoardDAO 객체의 updateBoard() 메소드를 호출하여 글 등록을 처리한 후에 getBoardList.do를 리턴하여 글 목록 화면으로 이동한다.

package com.springbook.view.board;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller	//presentation-layer.xml에 Controller 등록 부분과 같은 역할
public class InsertBoardController {
	 @RequestMapping(value="/insertBoard.do")	//presentation-layer.xml에 HandlerMapping 등록 부분과 같은 역할
	 //@RequestMapping : HandlerMapping 등록, 메소드 타입에 상관없이 호출 시 무조건 실행
	 //메소드 타입에 따라 @GetMapping, @PostMapping으로도 사용이 가능하며 예를 들어, PostMapping일 땐 post 메소드가 매핑되는 방식
	 
	 //Command 객체 : 사용자가 전송한 데이터를 매핑한 VO를 바로 생성
	 //				사용자 입력 값이 많아지면 코드가 길어지기 때문에 간략화 가능
	 // 			사용자 입력 input의 name 속성과 VO 멤버변수의 이름을 매핑해주는 것이 중요하다.
	 // 			그래야 BoardVO 클래스의 멤버변수가 insertBoard에 해당 변수에 자동으로 매핑이 된다. 
	 public String insertBoard(BoardVO vo, BoardDAO boardDAO) {	//VO 객체를 바로 가져옴
		 System.out.println("글 등록 처리");
			
			/*
			 * //1. 사용자 입력정보 추출(insertBoard.jsp에서 전송된 정보 추출) String title =
			 * request.getParameter("title"); String writer =
			 * request.getParameter("writer"); String content =
			 * request.getParameter("content");
			 * 
			 * //2. DB 연동 처리(BoardDAO의 메소드 호출) BoardVO vo = new BoardVO();
			 * vo.setTitle(title); vo.setWriter(writer); vo.setContent(content);
			 */
			
		 	boardDAO.insertBoard(vo);
			
		 	//화면 네비게이션(게시글 등록 완료 후 게시글 목록으로 이동)
			return "redirect:getBoardList.do"; //redirect를 안주면 그냥 화면만 이동되는데, redirect를 주면 주소값 까지 변경됨
	 }
}

 

 

2.5절 글 삭제 기능 구현하기

 

- 게시글 삭제 기능 역시 InsertBoardController와 유사하다.

- 클라이언트로부터 /deleteBoard.do 요청이 들어오면 deleteBoard() 메소드가 실행되며 이때 삭제에 필요한 게시글 번호는 매개변수로 선언된 BoardVO 객체를 통해 받아낸다.

- 그리고 BoardDAO 객체의 deleteBoard() 메소드를 호출하여 글 삭제를 처리한 후에 getBoardList.do를 리턴하여 글 목록 화면으로 이동한다.

package com.springbook.view.board;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller
public class DeleteBoardController {
	@RequestMapping(value="/updateBoard.do")
	public String deleteBoard(BoardVO vo, BoardDAO boardDAO) {
		System.out.println("글 삭제 처리");
		
		boardDAO.deleteBoard(vo);
		return "redirect:getBoardList.do";
	}
}

 

 

2.6절 로그인 기능 구현하기

 

- 로그인 기능도 @Controller와 @RequestMapping 어노테이션을 이용하여 구현한다.

- 클라이언트의 /login.do 요청에 대해서 실행되는 login() 메소드는 사용자가 입력한 아이디와 비밀번호를 받아내기 위해 UserVO 클래스를 첫 번째 매개변수로 선언했다.

- 두 번째 매개변수 : DB 연동을 처리하기 위해 UserDAO 클래스도 선언했다.

- 마지막으로 로그인 성공과 실패에 대해 적절한 화면 정보를 리턴한다.

package com.springbook.view.user;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

//SpringFramework에서 제공하는 Controller, interface의 handleRequest메소드는 리턴 타입 ModelAndView
@Controller
public class LoginController {
	@RequestMapping(value="/login.do")
	public String login(UserVO vo, UserDAO userDAO) {
		System.out.println("로그인 처리");
		
		//로그인 성공 시 게시판 목록 조회 화면으로 이동
		if(userDAO.getUser(vo) != null) {
			//redirect : viewResolver를 무시하고 바로 리다이렉트
			return "redirect:getBoardList.do";
		//로그인 실패 시 다시 로그인 화면으로 이동
		} else {
			return "redirect:getBoardList.do";
		}
	}
}

 

 

2.7절 로그아웃 기능 구현하기

 

- 로그아웃 기능을 구현할 때는 세션 객체를 이용한다.

- /logout.do 요청으로 실행되는 logout() 메소드는 로그아웃 처리를 위해 세션 객체가 필요하다.

- 이때 HttpSession을 매개변수로 선언하면 스프링 컨테이너가 로그아웃을 요청한 브라우저와 매핑된 세션 객체를 찾아서 넘겨줌

- 따라서 매개변수로 받은 세션 객체를 강제 종료하면 된다.

package com.springbook.view.user;

import javax.naming.directory.InvalidAttributeIdentifierException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class LogoutController {
	@RequestMapping(value="/logout.do")
	//Command 객체로 HttpSession을 선언하게 되면 스프링컨테이너가 브라우저와 매핑된 세션객체를 담아서 넣어줌
	public String handleRequest(HttpSession session) {
		System.out.println("로그아웃 처리");
		
		session.invalidate();
		return "login.jsp";
	}
}

 

2.8절 컨트롤러 통합하기 ( _057_BoardWeb_Spring_MVC_Anotation_integrated_Controller )

 

- 어노테이션을 이용하면 간단하게 구현되기 때문에 Controller를 하나의 클래스(BoardController)로 묶어서 처리하여 관리가 편하도록 한다.

- 스프링 컨테이너가 BoardController 객체를 생성하여 클라이언트의 요청 패스에 따라 @RequestMapping 설정된 메소드를 실행한다.

- BoardController를 제외한 나머지 Controller들은 모두 삭제한다.

package com.springbook.view.board;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

@Controller	// 컨트롤러로 통합하면 하나의 컨트롤러에서 메소드별로 매핑을 다양하게 사용할 수 있게됨
public class BoardController {
	@RequestMapping(value="/insertBoard.do")	//presentation-layer.xml에 HandlerMapping 등록 부분과 같은 역할
	 //@RequestMapping : HandlerMapping 등록, 메소드 타입에 상관없이 호출 시 무조건 실행
	 //메소드 타입에 따라 @GetMapping, @PostMapping으로도 사용이 가능하며 예를 들어, PostMapping일 땐 post 메소드가 매핑되는 방식
	 
	 //Command 객체 : 사용자가 전송한 데이터를 매핑한 VO를 바로 생성
	 //				사용자 입력 값이 많아지면 코드가 길어지기 때문에 간략화 가능
	 // 			사용자 입력 input의 name 속성과 VO 멤버변수의 이름을 매핑해주는 것이 중요하다.
	 // 			그래야 BoardVO 클래스의 멤버변수가 insertBoard에 해당 변수에 자동으로 매핑이 된다. 
	 public String insertBoard(BoardVO vo, BoardDAO boardDAO) {	//VO 객체를 바로 가져옴
		 System.out.println("글 등록 처리");
			
			/*
			 * //1. 사용자 입력정보 추출(insertBoard.jsp에서 전송된 정보 추출) String title =
			 * request.getParameter("title"); String writer =
			 * request.getParameter("writer"); String content =
			 * request.getParameter("content");
			 * 
			 * //2. DB 연동 처리(BoardDAO의 메소드 호출) BoardVO vo = new BoardVO();
			 * vo.setTitle(title); vo.setWriter(writer); vo.setContent(content);
			 */
			
		 	boardDAO.insertBoard(vo);
			
		 	//화면 네비게이션(게시글 등록 완료 후 게시글 목록으로 이동)
			return "redirect:getBoardList.do"; //redirect를 안주면 그냥 화면만 이동되는데, redirect를 주면 주소값 까지 변경됨
	 }
	
	@RequestMapping(value="/updateBoard.do")
	public String updateBoard(BoardVO vo, BoardDAO boardDAO) {
		System.out.println("글 수정 처리");
		
		boardDAO.updateBoard(vo);
		return "redirect:getBoardList.do";
	}
	
	@RequestMapping(value="/updateBoard.do")
	public String deleteBoard(BoardVO vo, BoardDAO boardDAO) {
		System.out.println("글 삭제 처리");
		
		boardDAO.deleteBoard(vo);
		return "redirect:getBoardList.do";
	}
	
	@RequestMapping(value="/getBoard.do")
	public ModelAndView getBoard(BoardVO vo, BoardDAO boardDAO, ModelAndView mav) {
		System.out.println("글 상세 조회 처리");
		
		mav.addObject("board", boardDAO.getBoard(vo));	//Model 정보 저장
		mav.setViewName("getBoard.jsp"); //어떤 화면으로 이동할 것인지 명시해줄 것
		return mav;
	}
	
	@RequestMapping(value="/getBoardList.do")
	public ModelAndView getBoardList(BoardVO vo, BoardDAO boardDAO, ModelAndView mav) {
		System.out.println("글 목록 검색 처리");
		
		//ModelAndView 객체에 데이터 담기
		mav.addObject("boardList", boardDAO.getBoardList(vo));
		//ModelAndView 객체에 View 담기
		mav.setViewName("getBoardList.jsp");
		return mav;
	}
	
	
	
}

 

2.9절 요청 방식에 따른 처리

 

1. method 속성 ( _058_BoardWeb_Spring_MVC_Anotation_Get_Post )

 

- loginView() 와 login() 두 개의 메소드가 선언되어 있고 둘다 /login.do 요청에 실행되도록 설정한다.

- 두 메소드를 각기 다른 메소드로 처리되도록 @RequestMapping에 method 속성을 추가했다.

- GET 방식의 요청이 들어오면 loginView() 메소드를 실행하여 로그인 화면으로 이동한다.

- POST 방식으로 요청이 들어오면 login() 메소드를 실행하여 실질적인 로그인 인증 작업을 처리한다.

- loginView() 메소드의 매개변수는 로그인 화면으로 이동할 때 실행되는 메소드이지만 매개변수로 UserVO 객체를 받아들이도록 설정하여 처음 입력값을 세팅해줄 수 있다.

package com.springbook.view.user;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

//SpringFramework에서 제공하는 Controller, interface의 handleRequest메소드는 리턴 타입 ModelAndView
@Controller
public class LoginController {
	//GET방식으로 요청이 오면 로그인화면으로, Post방식으로 요청이 오면 로그인 처리
	//@RequestMapping(value="/login.do", method = RequestMethod.GET)
	@GetMapping(value="/login.do")	//위 코드와 같은 의미
	public String loginView(UserVO vo) {
		System.out.println("로그인 화면으로 이동");
		//로그인화면으로 이동시 처음 입력값 세팅
		vo.setId("test");
		vo.setPassword("test123");
		return "login.jsp";
	}
	
	//@RequestMapping(value="/login.do", method = RequestMethod.POST)
	@PostMapping(value="/login.do")
	public String login(UserVO vo, UserDAO userDAO) {
		System.out.println("로그인 처리");
		
		//로그인 성공 시 게시판 목록 조회 화면으로 이동
		if(userDAO.getUser(vo) != null) {
			//redirect : viewResolver를 무시하고 바로 리다이렉트
			return "redirect:getBoardList.do";
		//로그인 실패 시 다시 로그인 화면으로 이동
		} else {
			return "redirect:getBoardList.do";
		}
	}
}

 

2. JSP에서 Command 객체 사용 ( _059_BoardWeb_Spring_MVC_Anotation_JSP_Command )

 

1) login.jsp

- Command 객체에 저장된 데이터를 JSP에서 사용하려면 ${...} 구문을 이용한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
	<center>
		<h1>로그인</h1>
		<hr>
		<!-- login_proc.jsp : 컨트롤러에 해당 jsp 파일. 로그인 기능처리 -->
		<form action="login.do" method="post">
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange">아이디</td>
					<td><input type="text" name="id" value="${user.id }"></td>
				</tr>
				<tr>
					<td bgcolor="orange">비밀번호</td>
					<td><input type="password" name="password" value="${user.password }"></td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="로그인">
					</td>
				</tr>
			</table>
		</form>
	</center>
</body>
</html>

 

2) index.jsp

- 화면에 로그인 링크를 클릭하면 서버에 login.do 요청이 전달되고 이때 GET 방식의 요청이 전달되므로 loginView() 메소드가 실행된다.

- login.jsp 화면이 브라우저에 출력될 때 UserVO 객체에 저장한 id, password 정보가 자동으로 설정되는 것을 확인할 수 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main Page</title>
</head>
<body>
	<center>
		<h1>게시판 프로그램</h1>
		<hr>
		<a href="login.do">로그인</a>
		<a href="getBoardList.do">글 목록 바로가기</a>
		<hr>
	</center>
</body>
</html>

 

3) 실행 화면

- 로그인 화면에서 로그인 버튼을 클릭하면 /login.do 요청이 서버에 다시 한 번 전송되는데 이때는 POST 방식의 요청이므로 LoginController의 login() 메소드가 실행된다.

 

3. @ModelAttribute 사용

 

- 스프링 컨테이너가 생성하는 Command 객체의 이름은 클래스 이름의 첫 글자를 소문자로 변경한 이름이 자동으로 설정된다.

- 따라서 login.jsp 화면에서 UserVO 객체의 변수에 접근할 때 ${userVO.변수명} 을 사용한다.

- 그런데 만약 Command 객체의 이름을 변경하려면 @ModelAttribute를 사용해야 한다.

 

 

2.10절 Servlet API 사용 ( _060_BoardWeb_Spring_MVC_Anotation_Servlet_API )

 

1. loginController.java

 

- HttpSession 객체를 매개변수로 받아서 로그인 성공 시에 사용자 이름을 세션에 저장하고 글 목록 화면에서 출력하도록 한다.

package com.springbook.view.user;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

//SpringFramework에서 제공하는 Controller, interface의 handleRequest메소드는 리턴 타입 ModelAndView
@Controller
public class LoginController {
	//GET방식으로 요청이 오면 로그인화면으로, Post방식으로 요청이 오면 로그인 처리
	//@RequestMapping(value="/login.do", method = RequestMethod.GET)
	@GetMapping(value="/login.do")	//위 코드와 같은 의미
	//userVO의 이름으로 Command 객체가 생성됨
	//이름을 지정 안할 시에 자동으로 첫 글자가 소문자로 변경된 이름으로 생성됨
	//Command의 이름 지정 : @ModelAttribute("user") -> user의 이름의 Command 객체 생성
	public String loginView(@ModelAttribute("user")UserVO vo) {
		System.out.println("로그인 화면으로 이동");
		//로그인화면으로 이동시 처음 입력값 세팅
		vo.setId("test");
		vo.setPassword("test123");
		return "login.jsp";
	}
	
	//@RequestMapping(value="/login.do", method = RequestMethod.POST)
	@PostMapping(value="/login.do")
	public String login(UserVO vo, UserDAO userDAO, HttpSession session) {
		System.out.println("로그인 처리");
		UserVO user = userDAO.getUser(vo);
		//로그인 성공 시 게시판 목록 조회 화면으로 이동
		if(userDAO.getUser(vo) != null) {
			//redirect : viewResolver를 무시하고 바로 리다이렉트
			//UserVO의 name 변수를 session 데이터 보관소에 userNAme이라는 키 값으로 저장
			session.setAttribute("userName", user.getName());
			//UserVO 자체를 session 데이터 보관소에 user라는 키 값으로 저장
			//session.setAttribute("user", user);
			return "redirect:getBoardList.do";
		//로그인 실패 시 다시 로그인 화면으로 이동
		} else {
			return "login.jsp";
		}
	}
}

 

2. getBoardList

 

- 세션에 저장된 사용자 이름을 getBoardList.jsp 파일에서 출력한다.

<h1>글 목록</h1>
<h3>${userName }님 환영합니다...<a href="logout.do">Log-out</a></h3>

 

3. 게시글 목록에 사용자 이름 출력

 

 

 

2.11절 Controller의 리턴타입 ( _061_BoardWeb_Spring_MVC_Anotation_Controller_Return )

 

 

 

String으로 사용해볼 예정

ModelAndView를 Model로 변경

 

@RequestMapping(value="/getBoard.do")
	public String getBoard(BoardVO vo, BoardDAO boardDAO, Model model) {
		System.out.println("글 상세 조회 처리");
		
		//Model 객체는 RequestServlet 데이터 보관소에 저장
		//RequestServlet 데이터 보관소에 저장하는 것과 동일하게 동작
		//request.setAttribute("board", boardDAO.getBoard(vo)) == model.addAttribute("board", boardDAO.getBoard(vo))
		model.addAttribute("board", boardDAO.getBoard(vo));
		return "getBoard.jsp";
	}
	
	@RequestMapping(value="/getBoardList.do")
	public String getBoardList(BoardVO vo, BoardDAO boardDAO, Model model) {
		System.out.println("글 목록 검색 처리");
		
		model.addAttribute("boardList", boardDAO.getBoard(vo));	
		return "getBoardList.jsp";
	}

 

 

2.12절 기타 어노테이션

 

1. @RequestParam 사용하기 ( _062_BoardWeb_Spring_MVC_Anotation_RequestParam )

 

<form action="getBoardList.do" method="post">
  <table border="1" cellpadding="0" cellspacing="0" width="700">
    <tr>
      <td align="right">
        <select name="searchCondition">
          <option value="TITLE">제목</option>
          <option value="CONTENT">내용</option>
        </select>
        <input name="searchKeyword" type="text">
        <input type="submit" value="검색">
      </td>
    </tr>
  </table>			
</form>

 

	@RequestMapping(value="/getBoardList.do")
	//@RequestParam : Command 객체인 VO에 매핑값이 없는 사용자 입력정보는 직접 받아서 처리
	//				  value = 화면으로부터 전달된 파라미터 이름(jsp의 input의 name속성 값)
	//				  required = 생략 가능 여부
	public String getBoardList(	@RequestParam(value="searchCondition", defaultValue="TITLE", required=false) String condition,
								@RequestParam(value="searchKeyword", defaultValue="", required=false) String keyword,
								BoardVO vo, BoardDAO boardDAO, Model model) {
		System.out.println("글 목록 검색 처리");
		
		System.out.println("검색 조건 : " + condition);
		System.out.println("검색 키워드 : " + keyword);
		model.addAttribute("boardList", boardDAO.getBoardList(vo));
		return "getBoardList.jsp";
	}

 

package com.springbook.biz.board;

import java.sql.Date;

public class BoardVO {
	private int seq;
	private String title;
	private String writer;
	private String content;
	private Date regDate;
	private int cnt;
	private String SearchCondition;
	private String SearchKeyword;
	
	public int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}

	public String getSearchCondition() {
		return SearchCondition;
	}
	public void setSearchCondition(String searchCondition) {
		SearchCondition = searchCondition;
	}
	public String getSearchKeyword() {
		return SearchKeyword;
	}
	public void setSearchKeyword(String searchKeyword) {
		SearchKeyword = searchKeyword;
	}
	
	@Override
	public String toString() {
		return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regDate="
				+ regDate + ", cnt=" + cnt + "]";
	}	
}

 

 

2. @ModelAttribute 사용하기 ( _063_BoardWeb_Spring_MVC_Anotation_ModelAttribute )

 

@Controller
public class BoardController {
	
	@ModelAttribute("conditionMap")
	public Map<String, String> searchConditionMap() {
		Map<String, String> conditionMap = new HashMap<String, String>();
		conditionMap.put("제목", "TITLE");
		conditionMap.put("내용", "CONTENT");
		return conditionMap;
	}
    
    	...
}

 

<select name="searchCondition">
  <c:forEach var="condition" items="${conditionMap }">
  	<option value="${condition.calue }">${condition.key }</option>
  </c:forEach>
</select>

 

 

 

3. @SessionAttribute 사용하기 ( _064_BoardWeb_Spring_MVC_Anotation_SessionAttribute )

 

업데이트기능이 안됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글