Spring

스프링 MVC 객체구현 (@Controller) -(2)

heejin424 2023. 2. 1. 20:09
728x90

1. context.path 경로 수정하는 법

1] pom.xml에서 artifactId 수정

2] 서버 더블 클릭하고 module 들어가서 path 수정

 

edit - path명 변경

그러면 controller에서 basic으로 변경 완료

 

2. @controller, @RequestMapping을 이용한 URL 맵핑, Controller의 화면 처리

 

 

예시 1. )

화면은 컨트롤러를 타고 맵핑된 주소를 기본화면으로 둔 뒤 리턴으로 구현한다.
리퀘스트파일의 jsp문서내용을 화면에 구현 / 요청경로와 출력경로를 동일하게 맞춰준다.
요청경로와 출력경로가 동일하다면 두가지의 종류로 사용가능

1-1) requestController, ex01.jsp

package com.simple.controller;

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

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {
	
	
	@RequestMapping("/ex01") //요청 경로
	public String ex01() {
		
		return "request/ex01"; //출력 경로 
	}

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	ex01화면
	
	<a href="basic1">요청1</a>
	<a href="basic2">요청2</a>
	<a href="basic3">요청3</a>
</body>
</html>

1-2 ) RequestController에서 RequestMapping, PostMapping, GetMapping 사용해보기

package com.simple.controller;

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;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {
	
//   String메서드 - 출력 화면을 직접 지정
   @RequestMapping("/ex01")//요청경로
   public String ex01() {
      
      return "request/ex01";//출력경로
   }
   
//   //void메서드 - 요청 경로가 출력경로가 동일할 경우 아래와 같이 작성해도된다.
//   @RequestMapping("ex01")
//   public void ex01() {
//      
//   }
   
   //get만 허용
   //@RequestMapping(value = "/basic1", method = RequestMethod.GET)
   @GetMapping("/basic1")
   public String basic1() {
      System.out.println("get만 허용");
      return null;
   }
   
   //post만 허용
   //@RequestMapping(value = "/basic2", method = RequestMethod.POST)
   @PostMapping("/basic2")
   public String basic2() {
      System.out.println("post만 허용");
      return null;
   }
   
   //get, post 둘 다 허용
   @RequestMapping("/basic3")
   public String basic3() {
      System.out.println("get, post");
      return null;
   }
   

}

여기서 @RequestMapping(value = "/basic1", method = RequestMethod.GET)에 있는 value는 다중 값이 들어갈 때 사용

 

1-3) 화면출력

 

3.  요청 파라미터 처리 3가지 ★★

예시 1. )

1-1) Controller ( Request )

더보기
package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Value;
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.bind.annotation.RequestParam;

import com.sample.command.PracVO;
import com.sample.command.ReqVO;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청경로
public class RequestController {

//   ex02화면요청
   @RequestMapping("/ex02")
   public String ex02() {
	   return "request/ex02";
   }
   
   //1st 전통적 방식 맵핑
   @RequestMapping(value = "/doAction", method = RequestMethod.POST)
   public String doAction (HttpServletRequest request) {
	   
	   String name = request.getParameter("name");
	   String age = request.getParameter("age");
	   String[] inter = request.getParameterValues("inter");
	   
	   System.out.println(name);
	   System.out.println(age);
	   System.out.println(Arrays.toString(inter));
	   
	   return "request/ex02_ok";
   }
   
   //2nd 어노테이션을 이용한 맵핑
   @RequestMapping("/doAction")
   public String doAction(@RequestParam(value = "name", required = false) String name, 
		   				  @RequestParam("age") int age,
		   				  @RequestParam(value = "inter", required = false, defaultValue = "") List<String> list) {
	  
	   //requestParam은 공백과 null데이터가 전달되면 요청을 거절하게 됩니다.
	   //필수가 아닌 파라미터는 required=false속성을 지정하면 됩니다.
	   //필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defaultValue로 기본값을 줄 수 있습니다.
	   
	   System.out.println(name);
	   System.out.println(age);
	   System.out.println(list.toString());
	   
	   return "request/ex02_ok";
	   
   }
   
   //3rd - 커맨드 객체를 통해서 맵핑( 넘어오는 데이터의 name과 setter명이 같아야합니다. )
   @RequestMapping("/doAction")
   public String doAction(ReqVO vo) {
	   System.out.println(vo.toString());
	   
	   return "request/ex02_ok";
   }
   
 

}

 1-2 ) ex02.jsp

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	ex02화면

	<form action="doAction" method="post">
		이름 :<input type="text" name="name"> 
		나이 :<input type="number" name="age"> 
			
			
			<input type="checkbox" name="inter" value="1">java 
			<input type="checkbox" name="inter" value="2">Spring
			<input type="checkbox" name="inter" value="3">Boot
			
			<input type="submit" value="확인">
	</form>
</body>
</html>

1-3 ) 커맨드 객체를 활용한 맵핑 - VO생성

더보기
package com.sample.command;

import java.util.List;

public class ReqVO {

	private String name;
	private int age;
	private List<String> inter;
	
	
	@Override
	public String toString() {
		return "ReqVO [name=" + name + ", age=" + age + ", inter=" + inter + "]";
	}


	public ReqVO() {
		super();
	}


	public ReqVO(String name, int age, List<String> inter) {
		super();
		this.name = name;
		this.age = age;
		this.inter = inter;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public List<String> getInter() {
		return inter;
	}


	public void setInter(List<String> inter) {
		this.inter = inter;
	}
	
	
	
	
	
}

1-4 ) 결과 (consol출력) -> 페이지는 ex02_ok.jsp 로 이동

jsp 내용
1,2번 방식 입력, 선택한 결과값 출력
3번 방식 입력, 선택한 결과값  toString override형식 출력

* 연습 문제(RequestController, req_quiz01, req_quiz01_ok, req_quiz01_no)

더보기

controller

package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Value;
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.bind.annotation.RequestParam;

import com.sample.command.PracVO;
import com.sample.command.ReqVO;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청경로
public class RequestController {
   
// 실습
 @RequestMapping("/req_quiz01")
 public String req_quiz01() {
	   return "request/req_quiz01";
 }
 
 //1번방식
 @RequestMapping(value = "/doAction", method = RequestMethod.POST)
 public String doAction( HttpServletRequest req ) {
	 
	 if( req.getParameter("id").equals("abc123") && req.getParameter("pw").equals("xxx123")) {
		 
		 return "request/req_quiz01_ok";
	 }else {
		 
		 return "request/req_quiz01_no";
	 }
	
	 
 }
 
 //2번 어노테이션 방식
 @RequestMapping("/doAction")
 public String doAction( @RequestParam(value = "id", required = false) String id,
		 				@RequestParam(value = "pw", required = false) String pw) {
	 if(id.equals("abc123") && pw.equals("xxx123")) {
		 return "request/req_quiz01_ok";
	 }else {
		 return "request/req_quiz01_no";
	 }
 }
 
 //3번 커멘드 객체방식
 @RequestMapping("/doAction")
 public String doAction(PracVO vo) {
	 
	 String id = vo.getId();
	 String pw = vo.getPw();
	 
	 if(id.equals("abc123") && pw.equals("xxx123")) {
		 return "request/req_quiz01_ok";
	 }else {
		 return "request/req_quiz01_no";
	 }
	 
	 
 }
 

}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
	<%--
	맵핑
	1.RequestController에 현재 파일의 화면 처리를 하는 메서드를 생성.
	2.폼 전송을 처리하는 메서드 생성(login맵핑 - POST만 허용)
	3.아이디가 abc123, 비밀번호가 xxx123이라면 req_quiz01_ok.jsp 로 화면 이동
	4.아니라면 req_quiz01_no.jsp로 화면이동 
	--%>

	<form action="doAction" method="post">
		ID:<input type="text" name="id"><br>
		PW:<input type="password" name="pw"><br>
		<input type="submit" value="로그인" >
	</form>
	
	
</body>
</html>

아이디와 비밀번호 일치/ 비일치시 화면구현

 

4.  Model전달자: 화면에 데이터를 전달하기 위한 객체

 

첫 화면 jsp에서 controller를 타고 요청을 한 뒤 retun을 통해서 원하는 jsp파일로 이동해준다.

 

예시 1 )

1-1) Controller ( Response )

더보기
package com.simple.controller;

import java.util.Date;

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

@Controller
@RequestMapping("/response")
public class ResponseController {

	//1. 화면
	@RequestMapping("/ex01") //입력경로
	public String ex01() {
		return "response/ex01"; //출력경로
	}
	
	//result01 요청 - model객체
	@RequestMapping("/result01")
	public String result01(Model model) {
		
		model.addAttribute("data", "홍길동"); //(키, 값)
		model.addAttribute("serverTime", new Date());
		
		return "response/result01";
	}
	
	//result02요청 - ModelAndView객체
	@RequestMapping("/result02")
	public ModelAndView result02() {
		
		//뷰의 정보, data정보를 함께 저장할 수 있는 객체
		ModelAndView mv = new ModelAndView();
		mv.addObject("data", "홍길동");
		mv.addObject("name" , "이순신");
		
		mv.setViewName("response/result02");
		
		return mv;
	}
}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h3>res ex01</h3>
	
	<a href="result01">model객체 사용</a>
	<a href="result02">modelAndView객체 사용</a>

</body>
</html>

 1-2) Model객체를 사용한 데이터 전달 (자주 사용하는 방식)

 result01.jsp

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%-- 
    <%
    	String data = (String)request.getAttribute("data");
    %> 
    --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%-- <%=data %> --%>
		모델을 사용해서 가져온 데이터의 결과
		${data }<br/>
		${serverTime }
</body>
</html>

 1-3) ModelAndView 객체를 사용한 데이터 전달( 필터를 받아서 처리할 때 주로 사용함 )

result02.jsp

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	결과
	${data }<br/>
	${name }
</body>
</html>
 

모델객체를 사용하면 getAttribute() 를 이용해서 값을 가져오지 않아도 컨트롤러를 통해 나오는 화면에서 바로 데이터를 꺼내서 가져올 수 있다.

728x90

'Spring' 카테고리의 다른 글

스프링 MVC 웹서비스  (0) 2023.02.02
스프링 MVC 객체구현 (@Controller) -(3)  (0) 2023.02.02
스프링 MVC 객체구현 (@Controller) -(1)  (2) 2023.02.01
JSP에 스프링 조립하기  (0) 2023.01.31
DI / IoC  (0) 2023.01.30