Spring

Spring STEP 4 - Spring MVC

2023. 6. 14. 16:37
728x90

★ Spring MVC

  • 스프링 기반 MVC 웹 프로젝트 구현
패키지
- "com.test.controller"

웹 요청 담당하는 서블릿 > Controller 역할
스프링 컨트롤러 > OOOController

com.test.controller > "Ex01Controller.java"

views > "ex01.jsp"
  • Ex01Controller.java : 서블릿 역할
//JSP Model2 > (발전) > Spring MVC

//서블릿 역할
public class Ex01Controller implements Controller {

	//요청 메소드
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		//RequestDispatcher > forward() 
		
		//Model > 데이터 전송
		//View > JSP
		ModelAndView mv = new ModelAndView();
		
	}

}
  • 작성 후, Bean을 등록해줘야함.
  • -> servlet-context.xml 열어서 컨트롤러 등록
<!-- 컨트롤러를 빈으로 등록하기 -->
<beans:bean name="/ex01.do" class="com.test.controller.Ex01Controller"></beans:bean>

 

■ 서블릿 구문 확인

  • JSP -> URL 확인
mv.setViewName("ex01");
  • 데이터 전달
mv.addObject("name", "아무개");
  • jsp에서 읽어와서 출력
<div>
    <div>이름: ${requestScope.name}</div>
</div>

 

★ Ex02 : Controller 인터페이스 구현

com.test.controller > "Ex02Controller.java"
				
"com.test.persistence"
                    > "SpringDAO.java"(I)
                    > "SpringDAOImpl.java"(C)
views > "ex02.jsp"
  • Ex02Controller.java : 서블릿 역할
package com.test.controller;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.test.persistence.SpringDAO;

public class Ex02Controller implements Controller {
	
	private SpringDAO dao;
	
	public Ex02Controller(SpringDAO dao) {
		this.dao = dao;
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		
		//의존 객체 > 의존 주입
		
		int count = dao.getCount();
		
		ModelAndView mv = new ModelAndView("ex02");
		
		mv.addObject("count", count);
		
		return mv;
	}

}
  • 컨트롤러 Bean 등록
<beans:bean id="dao" class="com.test.persistence.SpringDAOImpl"></beans:bean>

<beans:bean name="/ex02.do" class="com.test.controller.Ex02Controller">
    <beans:constructor-arg ref="dao"></beans:constructor-arg>
</beans:bean>

 

★ Ex03 : @Controller 어노테이션 사용

  • ex03Controller.java : 서블릿 역할
@Controller
@RequestMapping(value="/ex03.do")
public class Ex03Controller {

	//요청 메소드(핸들러) > 맘대로~
	@RequestMapping
	public String test() {
		
		//업무 코드
		
		//뷰 호출하기
		
		//JSP 페이지 이름 > ViewResolver
		// >> "/WEB-INF/view/ex03.jsp"
		return "ex03"; 
		
	}
	
}
  • servlet Context 등록
<context:component-scan base-package="com.test.controller" />

 

★ Ex04 : 핵심 

@Controller
public class Ex04Controller {

	
	@RequestMapping("/ex04.do")
	public String ex04() {
			
		return "ex04";
		
	}
	
	@RequestMapping("/ex04_1.do")
	public String ex04_1() {
		
		
		return "ex04";
	}
	
}

 

★ BoardController : 분산되어 있던 서블릿 환경을 하나로 통합

  • 파일 구성
/com.test.controller/
	> BoardController.java

/views/
	> add.jsp
    > addok.jsp
    > list.jsp
    > view.jsp
  • BoardController.java : 서블릿 페이지
@Controller
public class BoardController {
	
	//둘다 쓸 경우
	@RequestMapping(value="/list.do", method= {RequestMethod.GET, RequestMethod.POST})
	public String list() {
		
		return "list";
		
	}
	
	//doGet() 역할
	//@RequestMapping(value="/add.do", method=RequestMethod.GET)
	@GetMapping(value="/add.do")
	public String add() {
		
		return "add";
		
	}
	
	//doPost() 역할
	//@RequestMapping(value="/addok.do", method=RequestMethod.POST)
	@PostMapping(value="/addok.do")
	public String addok() {
		
		return "addok";
		
	}
	
}
  • jsp 코드
//list.jsp
<h1>게시판 <small>목록보기</small></h1>

<div>테이블</div>

<div>
    <button type="button" class="add" onclick="location.href='/web/add.do';">글쓰기</button>
</div>

//add.jsp
<h1>게시판 <small>글쓰기</small></h1>

<form method="POST" action="/web/addok.do">
    <div>입력 폼</div>
    <div><button class="add">글쓰기</button></div>
</form>

//addok.jsp
<h1>게시판 <small>글쓰기</small></h1>

<div>글쓰기 완료</div>
  • 만약 URL 주소에 중간 경로를 만들고 싶다면
//- "/web/board/list.do"

//- 중간 경로 생성
@RequestMapping("/board")
//둘다 쓸 경우
@RequestMapping(value="/list.do", method= {RequestMethod.GET, RequestMethod.POST})
public String list() {

    return "list";

}

 

★ Ex05 : 데이터 수신

  • 파일 구성
com.test.java >
	Ex05Controller.java
com.test.domain >
	SpringDTO.java
views >
	ex05.jsp
  • 기존 방식
req.getParameter("");
  • 방식 1 : 좀 더 편리한 req
@PostMapping("/ex05ok.do")
public String ex05ok(HttpSession session, HttpServletResponse resp, HttpServletRequest req) {

    System.out.println(req==null);
    System.out.println(resp==null);
    System.out.println(session==null);

    String data = req.getParameter("data");
		
    req.setAttribute("data", data);

    return "ex05ok";

}
  • 방식 2 : Spring을 이용 - 1
//***************** 방법 2 : Spring
@PostMapping("/ex05ok.do")
public String ex05ok(@RequestParam("data") String data, Model model) {

    //String data = req.getParameter("data"); == @RequestParam("data") String data

    System.out.println(data);

    //ModelAndView > Model : 이제 뷰가 필요 없기 떄문에 Model만 남겨 놓은 것. -> request를 대신 하는 역할

    model.addAttribute("data", data);

    return "ex05ok";

}
  • 방식 3 : Spring을 이용 - 2 : 가장 자주 사용 하는 방법
//******************** 방법 3 : Spring
@PostMapping("/ex05ok.do")
public String ex05ok(Model model, String data) {

    //@RequestParam("data") 생략 가능!!

    System.out.println(data);

    model.addAttribute("data", data);

    return "ex05ok";

}
  • 방식 4 : 다중 값 가져오기
//*** 방법 4 : 다중 값 가져오기
@PostMapping("/ex05ok.do")
public String ex05ok(
                        Model model,
                        @RequestParam("name") String name,
                        @RequestParam("age") String age,
                        @RequestParam("address") String address
                    ) {

    SpringDTO dto = new SpringDTO();

    dto.setName(name);
    dto.setAge(age);
    dto.setAddress(address);

    model.addAttribute("dto", dto);

    return "ex05ok";

}
  • 방식 5 : 초간단 다중 값 가져오기
@PostMapping("/ex05ok.do")
public String ex05ok(Model model, SpringDTO dto) {

    model.addAttribute("dto", dto);

    return "ex05ok";

}
  • 방식 6 : hidden 태그의 값도 가져오기
@PostMapping("/ex05ok.do")
public String ex05ok(Model model, SpringDTO dto, String seq) {

    //System.out.println(dto);
    model.addAttribute("dto", dto);

    System.out.println(seq);

    return "ex05ok";

}
  • 방식 7 : 체크 박스 값 가져오기 - 배열 ver
@PostMapping("/ex05ok.do")
public String ex05ok(Model model, 
            //@RequestParam("cb") String[] cb
            String[] cb) {

    //String[] list = req.getParameterValues("cb")

    model.addAttribute("cb", cb);

    return "ex05ok";

}
  • 방식 8 : 체크 박스 값 가져오기 - ArrayList
@PostMapping("/ex05ok.do")
public String ex05ok(Model model, 
            //@RequestParam("cb") String[] cb
            //String[] cb
            @RequestParam("cb") List<String> cb) {

    //String[] list = req.getParameterValues("cb")

    model.addAttribute("cb", cb);

    return "ex05ok";

}

 

★ Ex06 : 요청 메소드 반환값

  • 1. String
//- JSP 파일명
//- ViewResolver 호출
  • 2. void
//2. void
//- 요청 주소와 동일한 이름은 JSP 페이지를 자동으로 호출한다.

@GetMapping("/ex06.do")
public void test() {

}
  • 3. String + 키워드
//3. String + 키워드
//- "redirect : URL"
//- "forward: URL"
@GetMapping("/ex06.do")
public String test() {

    //response.sendRedirect()
    //return "redirect:/ex05.do";

	//pageContext.forward()
    return "forward:/ex05.do";

}
  • Redirect 사용
@GetMapping("/ex06.do")
public String test(RedirectAttributes rttr) {

    String seq = "5";
    String type = "1";

    rttr.addAttribute("seq", seq);
    rttr.addAttribute("type", type);

//		return "redirect:/ex05.do?seq=" + seq + "&type=" + type;

    return "redirect:/ex05.do";
}
  • 4. 객체
  • - @ResponseBody
  • - JSON 반환값 생성하는 어노테이션
@GetMapping("/ex06.do")
public @ResponseBody SpringDTO test() {

    SpringDTO dto = new SpringDTO();

    dto.setName("홍길동");
    dto.setAge("20");
    dto.setAddress("서울시");

    return dto;

}
  • 5. 객체를 배열로
@GetMapping("/ex06.do")
public @ResponseBody List<SpringDTO> test() {

    List<SpringDTO> list = new ArrayList<SpringDTO>();

    SpringDTO dto = new SpringDTO();

    dto.setName("홍길동");
    dto.setAge("20");
    dto.setAddress("서울시");

    return list;

}

 

★ Ex07 : 사용자 예외 처리

  • 주로 500번대 에러 처리(서버측 에러 - 자바 or 오라클)일 경우 
  • 1. 파일 구성
com.test.main
	> Ex07Controller.java
com.test.exception
	> CommonExceptionAdvice.java
views
	> ex07.jsp
    	> error.jsp
  • default값을 주어, 에러가 발생 되지 않도록 함
@RequestMapping(value="/ex07.do", method=RequestMethod.GET)
public String ex07(@RequestParam(value="num", defaultValue="10") int num, Model model) {

    //ex07.do?num-100
    model.addAttribute("result", 100/num);


    return "ex07";

}
  • 예외 페이지 처리
  • @ControllerAdvice : 컨트롤러 작업 중 에러가 발생하면 이 클래스 호출
@ControllerAdvice //컨트롤러 작업 중 에러가 발생하면 이 클래스 호출
@Log4j
public class CommonExceptionAdvice {
	
	@ExceptionHandler(Exception.class)
	public String except(Exception e, Model model) {
		
		log.error("예외 발생");
		
		model.addAttribute("code", "A001");
		model.addAttribute("e", e);
		
		
		
		return "error"; //error.jsp 페이지 호출
		
	}
	
}
  • Servlet-context.xml -> 컨트롤러 루트 경로 등록
<context:component-scan base-package="com.test.exception" />

 

★ Ex08 : 사용자 예외 처리

  • 주로 404번 에러만 별도로 처리할 경우
  • 파일 구성
views > "notfound.jsp"

 

  • 404 에러 처리 Servlet
//404 에러 발생 시 처리
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String notfound(NoHandlerFoundException e) {



    return "notfound.jsp";

}
  • web.xml 추가 사항
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
728x90
저작자표시 비영리 변경금지 (새창열림)

'Spring' 카테고리의 다른 글

Spring STEP 6 - MyBatis 활용 게시판 만들기  (0) 2023.06.16
Spring STEP 5 - MyBatis 응용  (1) 2023.06.15
Spring STEP 3 - DI & AOP  (0) 2023.06.14
Spring STEP 2 - 스프링 구성요소  (2) 2023.06.13
Spring STEP 1 - 기초 및 셋팅  (0) 2023.06.13
'Spring' 카테고리의 다른 글
  • Spring STEP 6 - MyBatis 활용 게시판 만들기
  • Spring STEP 5 - MyBatis 응용
  • Spring STEP 3 - DI & AOP
  • Spring STEP 2 - 스프링 구성요소
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • html
  • IT자격증공부
  • 백준
  • 알고리즘
  • css
  • ajax
  • 코딩테스트
  • 웹페이지
  • it
  • jsp
  • jquery
  • 정보처리기사
  • 데이터베이스
  • 개발자
  • DB
  • 정보처리기사필기
  • 앱개발자
  • 자바
  • IT자격증
  • JavaScript
  • DBA
  • 프론트엔드
  • 정보보안전문가
  • 웹개발자
  • 백엔드
  • 웹개발
  • 개발블로그
  • IT개발자
  • java
  • React

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
Spring STEP 4 - Spring MVC
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.