( presentation-layer.xml )
네임스페이스 탭에서 context 선택해서 추가한 뒤,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- component scan Registration -->
<context:component-scan base-package="com.heidi.view"></context:component-scan>
</beans>
src/main/webapp/WEB-INF/board 폴더에 있던
getBoard.jsp 와 getBoardList.jsp 를 webapp 으로 꺼낸 뒤, board 폴더는 삭제해도 된다.
( InsertBoardController.java )
package com.heidi.view.board;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController {
public InsertBoardController() {
}
public void insertBoard(HttpServletRequest request) {
System.out.println("글 등록 처리");
// 1. 사용자 입력 정보 추출
String title=request.getParameter("title");
String writer=request.getParameter("writer");
String content=request.getParameter("content");
// 2. DB 연동 처리
BoardVO vo=new BoardVO();
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
BoardDAO boardDAO=new BoardDAO();
boardDAO.insertBoard(vo);
}
}
기존의 코드에서 POJO 타입의 일반 클래스로 만들고 Controller 기능을 구현해준다.
또한 @RequestMapping 을 이용해서 HandlerMapping 설정을 대체해야 한다.
아래와 같이 한번 더 수정해주자.
package com.heidi.view.board;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController {
public InsertBoardController() {
}
@RequestMapping(value="/insertBoard.do") // insertBoard.jsp 내부 form 태그에 의해서 요청!
public void insertBoard(HttpServletRequest request) {
System.out.println("글 등록 처리");
// 1. 사용자 입력 정보 추출
String title=request.getParameter("title");
String writer=request.getParameter("writer");
String content=request.getParameter("content");
// 2. DB 연동 처리
BoardVO vo=new BoardVO();
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
BoardDAO boardDAO=new BoardDAO();
boardDAO.insertBoard(vo);
}
}
현재 insertBoard.jsp 의 파라미터명들과 BoardVO 의 멤버변수명은 동일하게 만들어놨는데,
이제 컨트롤러가 클라이언트의 요청 처리를 VO 에 저장시키는 요청처리를 해줄꺼임!
클라이언트로부터 요청사항이 들어오면 web.xml 이 가장 먼저 건드려진다.
DispatcherServlet 이 가장 먼저 건드려지는데,
여기서 init() 호출,
service() 호출,
그리고 경우에 따라서 doGet() 또는 doPost() 호출
그리고 마지막으로 destroy() 호출
web.xml 문서의
이 부분이 init() 부분에 의해 호출되는 부분임..!
component-scan 에 의해서 컨트롤러 객체들이 쭉 생성되고,
DispatcherServlet 은 서블릿 컨테이너가 만들어준다..
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController {
public InsertBoardController() {
}
@RequestMapping(value="/insertBoard.do") // insertBoard.jsp 내부 form 태그에 의해서 요청!
public void insertBoard(BoardVO vo) {
System.out.println("글 등록 처리");
// 자동매핑에 의해 getParameter 코드들과 BoardVO 에 set 시키는 코드는 필요없어졌음.
// BoardDAO 코드는 필요함!
BoardDAO boardDAO = new BoardDAO();
boardDAO.insertBoard(vo);
}
}
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController {
public InsertBoardController() {
}
@RequestMapping(value="/insertBoard.do") // insertBoard.jsp 내부 form 태그에 의해서 요청!
public String insertBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 등록 처리");
// 자동매핑에 의해 getParameter 코드들과 BoardVO 에 set 시키는 코드는 필요없어졌음.
// BoardDAO 객체 생성을 내부에서 할 필요 없어짐.
dao.insertBoard(vo);
return "getBoardList.do";
}
}
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class InsertBoardController {
public InsertBoardController() {
}
@RequestMapping(value="/insertBoard.do") // insertBoard.jsp 내부 form 태그에 의해서 요청!
public String insertBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 등록 처리");
// 자동매핑에 의해 getParameter 코드들과 BoardVO 에 set 시키는 코드는 필요없어졌음.
// BoardDAO 객체 생성을 내부에서 할 필요 없어짐.
dao.insertBoard(vo);
return "redirect:getBoardList.do";
}
}
( GetBoardListController.java )
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class GetBoardListController {
public GetBoardListController() {
}
@RequestMapping("/getBoardList.do")
public ModelAndView getBoardList(BoardVO vo, BoardDAO dao, ModelAndView mav) {
System.out.println("글 목록 보기");
mav.addObject("boardList", dao.getBoardList(vo));
mav.setViewName("getBoardList.jsp");
return mav;
}
}
( GetBoardController.java )
package com.heidi.view.board;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class GetBoardController {
public GetBoardController() {
}
@RequestMapping("/getBoard.do")
public ModelAndView getBoard(BoardVO vo, BoardDAO dao, ModelAndView mav) {
System.out.println("글 상세 보기");
mav.addObject("board", dao.getBoard(vo));
mav.setViewName("getBoard.jsp");
return mav;
}
}
( UpdateBoardController.java )
package com.heidi.view.board;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UpdateBoardController {
public UpdateBoardController() {
}
@RequestMapping("/updateBoard.do")
public String updateBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 수정 처리");
dao.updateBoard(vo);
return "redirect:getBoardList.do";
}
}
( DeleteBoardController.java )
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class DeleteBoardController {
public DeleteBoardController() {
}
@RequestMapping("/deleteBoard.do")
public String deleteBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 삭제 처리");
dao.deleteBoard(vo);
return "redirect:getBoardList.do";
}
}
(LoginController.java)
package com.heidi.view.user;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.heidi.biz.user.UserVO;
import com.heidi.biz.user.impl.UserDAO;
@Controller
public class LoginController {
public LoginController() {
}
@RequestMapping("/login.do")
public String logint(UserVO vo, UserDAO dao) {
System.out.println("로그인 처리");
if(dao.getUser(vo) != null) return "redirect:getBoardList.do";
else return "redirect:login.jsp";
}
}
( LogoutController.java )
package com.heidi.view.user;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LogoutController {
public LogoutController() {
}
@RequestMapping(value="/logout.do")
public String logout(HttpSession session) {
System.out.println("로그아웃 처리");
session.invalidate();
return "redirect:login.jsp";
}
}
여기까지 각 컨트롤러 수정했으면
login.jsp 실행했을때 잘 되야함
( BoardController.java)
클래스를 com.heidi.view.board 패키지에 생성 후,
로그인, 로그아웃을 제외한 모든 컨트롤러 내부 메소드를 붙여넣기
package com.heidi.view.board;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.heidi.biz.board.BoardVO;
import com.heidi.biz.board.impl.BoardDAO;
@Controller
public class BoardController {
// 기본생성자
public BoardController() {
}
// 글 등록
@RequestMapping(value="/insertBoard.do") // insertBoard.jsp 내부 form 태그에 의해서 요청!
public String insertBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 등록 처리");
// 자동매핑에 의해 getParameter 코드들과 BoardVO 에 set 시키는 코드는 필요없어졌음.
// BoardDAO 객체 생성을 내부에서 할 필요 없어짐.
dao.insertBoard(vo);
return "redirect:getBoardList.do";
}
// 글 수정
@RequestMapping(value="/updateBoard.do")
public String updateBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 수정 처리");
dao.updateBoard(vo);
return "redirect:getBoardList.do";
}
// 글 삭제
@RequestMapping(value="/deleteBoard.do")
public String deleteBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 삭제 처리");
dao.deleteBoard(vo);
return "redirect:getBoardList.do";
}
// 글 상세 조회
@RequestMapping(value="/getBoard.do")
public ModelAndView getBoard(BoardVO vo, BoardDAO dao, ModelAndView mav) {
System.out.println("글 상세 보기");
mav.addObject("board", dao.getBoard(vo)); // Model 정보 저장
mav.setViewName("getBoard.jsp"); // View 정보 저장
return mav;
}
// 글 목록 조회
@RequestMapping(value="/getBoardList.do")
public ModelAndView getBoardList(BoardVO vo, BoardDAO dao, ModelAndView mav) {
System.out.println("글 목록 보기");
mav.addObject("boardList", dao.getBoardList(vo)); // Model 정보 저장
mav.setViewName("getBoardList.jsp"); // View 정보 저장
return mav;
}
}
그리고 해당 컨트롤러 클래스는 모두 삭제하기
이런 구조가 되도록!
login.jsp 다시 실행시켜보고
잘되는지 확인하기
( LoginController.java )
package com.heidi.view.user;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.heidi.biz.user.UserVO;
import com.heidi.biz.user.impl.UserDAO;
@Controller
public class LoginController {
public LoginController() {
}
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String loginView(UserVO vo) {
System.out.println("로그인 화면으로 이동");
vo.setId("test");
vo.setPassword("test1234");
return "login.jsp";
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(UserVO vo, UserDAO dao) {
System.out.println("로그인 기능을 처리..");
if(dao.getUser(vo) != null) return "redirect:getBoardList.do";
else return "redirect:login.jsp";
}
}
그리고 여기서 loginView() 내부에서 저장한 id와 password 값을 jsp 에서 사용하려면
${ } 를 사용해야함!
( login.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 align="center">
<h1>로그인</h1>
<hr>
<div align="center">
<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="${userVO.id }"/></td>
</tr>
<tr>
<td bgcolor="orange">비밀번호</td>
<td><input type="password" name="password" value="${userVO.password }"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="로그인" />
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
그리고 index.jsp 를 생성한다.
( index.jsp )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main</title>
</head>
<body align="center">
<h1>게시판 프로그램</h1>
<hr>
<a href="login.do">로그인</a><br /><br /><br />
<a href="getBoardList.do">글 목록 바로가기</a>
<hr>
</body>
</html>
여기까지 하고, index.jsp 를 실행시켜서 잘 되나 확인하기
만약 UserVO 객체명을 지정해서 만들고 싶다면?
( LoginController.java )
package com.heidi.view.user;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.heidi.biz.user.UserVO;
import com.heidi.biz.user.impl.UserDAO;
@Controller
public class LoginController {
public LoginController() {
}
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String loginView(@ModelAttribute("user") UserVO vo) {
System.out.println("로그인 화면으로 이동 <== loginView() 실행");
vo.setId("test");
vo.setPassword("test1234");
return "login.jsp";
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(UserVO vo, UserDAO dao) {
System.out.println("로그인 기능을 처리.. <== login() 실행");
if(dao.getUser(vo) != null) return "redirect:getBoardList.do";
else return "redirect:login.jsp";
}
}
@ModelAttribute 를 사용해서 지정해줄 수 있고,
이렇게 지정해줬다면 당연히 login.jsp 부분도 바껴야겠지
( login.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 align="center">
<h1>로그인</h1>
<hr>
<div align="center">
<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>
</div>
<hr>
<a href="index.jsp">메인으로</a>
</body>
</html>
실행 결과
이렇게 첫 화면에서 로그인 링크를 누르면, 로그인 페이지로 이동하는데
이 때 아이디와 비밀번호가 입력되어 있는 상태로 화면이 뜨게된다.
( 여기서, LoginController 의 loginView() 메소드의 마지막 return 값을
"redirect:login.jsp" 로 넘겨주면 자동으로 값이 채워진 상태가 아니라 빈 칸이 뜨게된다. )
Servlet API 사용
( LoginController.java )
package com.heidi.view.user;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.heidi.biz.user.UserVO;
import com.heidi.biz.user.impl.UserDAO;
@Controller
public class LoginController {
public LoginController() {
}
@RequestMapping(value="/login.do", method=RequestMethod.GET)
public String loginView(@ModelAttribute("user") UserVO vo) {
System.out.println("로그인 화면으로 이동 <== loginView() 실행");
vo.setId("test");
vo.setPassword("test1234");
return "login.jsp";
}
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(UserVO vo, UserDAO dao, HttpSession session) {
System.out.println("로그인 기능을 처리.. <== login() 실행");
UserVO user = dao.getUser(vo);
if(user != null) {
session.setAttribute("userName", user.getName());
return "getBoardList.do";
}
else return "redirect:login.jsp";
}
}
login 메소드를 위에처럼 수정 후,
( getBoardList.jsp ) 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 목록</title>
</head>
<body align="center">
<h1>글 목록</h1>
<h3>${userName} 님! 환영합니다.<a href="logout.do">Log-out</a></h3>
상단에 EL 태그 ${ } 부분만 수정하기
수정 후 실행하면,
이런식으로 로그인한 유저 이름이 나와야함!
( test 라고 뜨는 부분! )
Controller 의 리턴타입 변경
( BoardController.java ) 에서,
getBoard() 와 getBoardList() 메소드 수정!
// 글 상세 조회
@RequestMapping(value="/getBoard.do")
public String getBoard(BoardVO vo, BoardDAO dao, Model model) {
System.out.println("글 상세 보기");
model.addAttribute("board", dao.getBoard(vo)); // Model 정보 저장
return "getBoard.jsp"; // View 정보 저장
}
// 글 목록 조회
@RequestMapping(value="/getBoardList.do")
public String getBoardList(BoardVO vo, BoardDAO dao, Model model) {
System.out.println("글 목록 보기");
model.addAttribute("boardList", dao.getBoardList(vo)); // Model 정보 저장
return "getBoardList.jsp"; // View 정보 저장
}
수정 후, 실행시키면 동일하게 잘 실행되야함.
여기서 ModelAndView => Model 로 바꾸고 내부 코드도
세션에 저장하는게 아닌 Model 객체에 addAttribute() 메소드로 저장하는데
getBoard.jsp나 getBoardList.jsp 내부를 수정하지 않아도 된다는거,,,
기타 어노테이션 중,
@RequestParam
( getBoardList.jsp )
<!-- 검색 시작 -->
<div align="center">
<form action="getBoardList.jsp" 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 type="text" name="searchKeyword" />
<input type="submit" value="검색">
</td>
</tr>
</table>
</form>
검색 부분은 위와 같다.
( BoardController.java )
// 글 목록 조회
@RequestMapping(value="/getBoardList.do")
public String getBoardList(@RequestParam(value="searchCondition", defaultValue="TITLE", required=false) String condition,
@RequestParam(value="searchKeyword", defaultValue="", required=false) String keyword,
BoardVO vo, BoardDAO dao, Model model) {
System.out.println("글 목록 보기");
System.out.println("검색 조건 : " + condition);
System.out.println("검색 단어 : " + keyword);
model.addAttribute("boardList", dao.getBoardList(vo)); // Model 정보 저장
return "getBoardList.jsp"; // View 이름 리턴
}
이렇게 바꿔주기
@ModleAttribute 사용하기
( getBoardList.jsp )
select 태그쪽 수정!
<!-- 검색 시작 -->
<div align="center">
<form action="getBoardList.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0" width="700">
<tr>
<td align="right">
<select name="searchCondition">
<c:forEach items="${conditionMap }" var="option">
<option value="${option.value }">${option.key }
</c:forEach>
</select>
<!-- 기존 검색 코드
<select name="searchCondition">
<option value="TITLE">제목</option>
<option value="CONTENT">내용</option>
</select>
-->
<input type="text" name="searchKeyword" />
<input type="submit" value="검색">
</td>
</tr>
</table>
</form>
기존의 제목, 내용은 키명으로...
TITLE, CONTENT는 값으로....
키명과 값을 갖는건 컬렉션 중 Map !
( BoardController.java )
메소드 하나 추가!
// 검색 조건 목록 설정하는 메소드
@ModelAttribute("conditionMap")
public Map<String, String> searchConditionMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("제목", "TITLE");
map.put("내용", "CONTENT");
return map;
}
위의 예제들 중, 객체명을 수정할 때 사용했던 @ModelAttribute 어노테이션의 경우
클래스명 바로 앞에 붙여서 써줬는데 여기서는 메소드 선언부 위에 썼음.!
실행 결과 글 전체 목록이 잘 뿌려져야한다.
@SessionAttributes
( BoardController.java )
updateBoard() 메소드에서
// 글 수정
@RequestMapping(value="/updateBoard.do")
public String updateBoard(BoardVO vo, BoardDAO dao) {
System.out.println("글 수정 처리");
System.out.println("작성자 이름 : " + vo.getWriter());
dao.updateBoard(vo);
return "redirect:getBoardList.do";
}
이렇게 수정 하면 작성자 이름 값이 매핑이 안되기 때문에
실행 후 글 수정을 누르면 콘솔창에 null 값이 찍히는걸 볼 수 있다.
( BoardController.java )의 클래스 선언부 위에
@Controller
@SessionAttributes("board")
public class BoardController {
붙여주고
updateBoard() 메소드 내부 수정
// 글 수정
@RequestMapping(value="/updateBoard.do")
public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO dao) {
System.out.println("글 수정 처리");
System.out.println("번호 : " + vo.getSeq());
System.out.println("제목 : " + vo.getTitle());
System.out.println("작성자 이름 : " + vo.getWriter());
System.out.println("내용 : " + vo.getContent());
System.out.println("등록일 : " + vo.getRegDate());
System.out.println("조회수 : " + vo.getCnt());
dao.updateBoard(vo);
return "redirect:getBoardList.do";
}
실행하고 글 수정 해보면,
이케됨
각 메소드가 어떤 jsp의 어느 부분에 의해 호출되고 어디로 값을 전달해주는지 등등...
각각 메소드의 기능과 사용되는 지점 ㄷㅇ등을 자세하게 기록하면서 공부하기
'Java . Spring . Web . SQL' 카테고리의 다른 글
[Model 1] Model 1 아키텍처로 게시판 개발 (0) | 2020.10.21 |
---|---|
스프링 JDBC (0) | 2020.10.20 |
[AOP] 어노테이션 기반 AOP (0) | 2020.10.19 |
[AOP] JoinPoint 와 바인드 변수 (0) | 2020.10.18 |
[AOP] Advice(어드바이스) 동작 시점 (0) | 2020.10.16 |
댓글