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 |