실습 코드 참조
moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (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 )
업데이트기능이 안됨
댓글