유정잉

54일차 스프링 [ MVC - 추출, 주입, form taglib ] 본문

네이버 클라우드 부트캠프/복습 정리

54일차 스프링 [ MVC - 추출, 주입, form taglib ]

유정♡ 2024. 5. 8. 12:56

1. 추출 / 주입 받기

    - HttpServletRequest 사용 (request.getParameter())

    - WebRequest 사용 

    - 경로로 주입받기(=@PathVariable) 주소/값1/값2/값3/...

    - ** @RequestParam ** 중요 !! : 값을 직접 주입받을 수 있다 (이름이 무조건 같아야함 !! 즉, 변수이름=파라미터이름)

    - @ModelAttribute : 파라미터를 객체로 주입받을 수 있다. 생략도 가능하다. (@RequestParam은 일반변수, 파라미터로 주입 받음)

    - 여기까진 값을 주입받아 값을 콘솔에 출력 !!!

2. viewReslover

     - 값을 주입받아 값을 브라우저에 출력 

      - 값을 담는 setAttribute 사용해서 브라우저에 전달 (pageContext, request, session, ApplicationContext)

3. form 요소들 <form:form> ----> radio, checkbox, input ...

4. redirect / forward

5. request, session Bean 주입 

 

//값을 세팅만 할 수 있음 - Model, ModelAndView

//값을 세팅해서 브라우저로 전송할 때 : requestScope.클래스명(맨앞글자 소문자).필드명

//값을 세팅해서 한번 더 매핑시켜서 데이터 가져올 때 : getAttribute(HttpServletRequest)

 


[ MVC_Basic_05 - project ] 

    ※ 파라미터로 주입받는 방법 !!!

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<body>
	<a href="t1?data1=10&data2=20&data3=30&data3=40?">test1</a><br>
		
	<form action="t2" method="post">
		d1 : <input type="text" name="d1"/><br>
		d2 : <input type="text" name="d2"/><br>
		d3 : <input type="checkbox" name="d3" value="10">data3 10
			 <input type="checkbox" name="d3" value="20">data3 20<br>
			 <button type="submit">test2</button>	
	</form>
	
	<br>
	
	<a href="t3?data1=10&data2=20&data3=30&data3=40?">test3</a><br>
	
	<a href="t4/10/20/30">test4</a><br>
	
	<a href="t5?data1=10&data2=20&data3=30&data3=40?">test5</a><br>
	
	<a href="t6?data1=10&data2=20&data3=30&data3=40?">test6</a><br>
	
	<a href="t7?data1=10">test7</a><br>
</body>
</html>

[ SpringController.java class 파일 ]

package kr.bit.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.WebRequest;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1(HttpServletRequest request) {
		String d1 = request.getParameter("data1"); // 10
		String d2 = request.getParameter("data2"); // 20
		String d3[] = request.getParameterValues("data3");

		System.out.println(d1);
		System.out.println(d2);

		for (String str : d3) {
			System.out.println(str);
		}
		return "final";
	}

	@PostMapping("/t2")
	public String t2(HttpServletRequest request) {
		String d1 = request.getParameter("d1"); // 10
		String d2 = request.getParameter("d2"); // 20
		String d3[] = request.getParameterValues("d3");

		System.out.println(d1);
		System.out.println(d2);

		for (String str : d3) {
			System.out.println(str);
		}
		return "final";
	}

	@GetMapping("/t3")
	public String t3(WebRequest request) {
		String d1 = request.getParameter("data1"); // 10
		String d2 = request.getParameter("data2"); // 20
		String d3[] = request.getParameterValues("data3");

		System.out.println(d1);
		System.out.println(d2);

		for (String str : d3) {
			System.out.println(str);
		}
		return "final";
	}

	@GetMapping("/t4/{data1}/{data2}/{data3}")
	public String t4(@PathVariable int data1, @PathVariable int data2, @PathVariable int data3) {
		// @PathVariable : 데이터 요청주소에 값이 있을 경우 값을 주입받을 수 있다.
		System.out.println(data1);
		System.out.println(data2);
		System.out.println(data3);

		return "final";
	}

	@GetMapping("/t5")
	public String t5(@RequestParam int data1, @RequestParam int data2, @RequestParam int[] data3) { 
		System.out.println(data1);
		System.out.println(data2);
		for(int str :data3) {
			System.out.println(str);
		}
		return "final";
	}

	@GetMapping("/t6") //변수 이름을 다르게 줄 때 value 속성 사용을 해서 파라미터 이름을 지정한다 
	public String t6(@RequestParam(value="data1") int n1, @RequestParam(value="data2") int n2, 
					 @RequestParam(value="data3") int[] n3) {
		System.out.println(n1);
		System.out.println(n2);
		for(int str :n3) {
			System.out.println(str);
		}
		return "final";
	}
	
	@GetMapping("/t7")						//@RequestParam(required = false)는 false일 때 null값 들어감 
	public String t7(@RequestParam int data1, @RequestParam(required = false) String data2,
			         @RequestParam(defaultValue = "0") int data3) {
		System.out.println(data1);
		System.out.println(data2);
		System.out.println(data3);
		
		return "final";
	}
	
}

순서대로 test1,3,4,5,6,7 클릭시 출력되는 결과 (test2는 input값에 입력한 값과 checkbox에 check한 값이 출력 됨)

 


 

[ MVC_Basic_06 - project ] 

     객체로 주입받는 방법 !!

 

1) views 폴더 안에 index.jsp 와 final.jsp JSP 파일 생성

[ index.jsp 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>
   <a href="t1?data1=10&data2=20&data3=30&data4=40">test1</a>
   <br>

   <a href="t3?data1=10&data2=20&data3=30&data4=40">test2</a>
   <br>

</body>
</html>
[ final.jsp JSP 파일 ]

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

</body>
</html>

 

2) kr.bit.beans package 안에 Data, Data2 class 생성

package kr.bit.beans;

public class Data {

	private int data1;
	private int data2;
	private int data3[];
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public int getData2() {
		return data2;
	}
	public void setData2(int data2) {
		this.data2 = data2;
	}
	public int[] getData3() {
		return data3;
	}
	public void setData3(int[] data3) {
		this.data3 = data3;
	}
}
package kr.bit.beans;

public class Data2 {
	
	private int data1;
	private int data2;
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public int getData2() {
		return data2;
	}
	public void setData2(int data2) {
		this.data2 = data2;
	}
}

 

2) kr.bit.controller package 안에 SpringController class 생성 

    @ModelAttribute : 파라미터를 객체로 주입받을 수 있다. 생략도 가능하다. 그치만 보통 알아보기 위해 써준다 !

    (@RequestParam은 일반변수, 파라미터로 주입 받음)

package kr.bit.controller;

import java.util.List;
import java.util.Map;

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.RequestParam;

import kr.bit.beans.Data;
import kr.bit.beans.Data2;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1") //t1?data1=10&data2=20&data3=30&data3=40?
	public String t1(@RequestParam Map<String, String> map,
					 @RequestParam List<String> data3) {
		
		String data1=map.get("data1");
		String data2=map.get("data2");
		String data33=map.get("data3");
		
		System.out.println(data1);
		System.out.println(data2);
		System.out.println(data33);
		
		for(String str : data3) {
			System.out.println(str);
		}
		return "final";
	}
	
	@GetMapping("/t2") //index.jsp에서 값을 넘길 때 (/t2) -> Data 객체 필드에 주입 됨 (넘긴값)
	public String t2(@ModelAttribute Data bean1, Data2 bean2) { //@ModelAttribute 써도 되고 생략도 가능 ! (그치만 보통 써줌 표시하기위해)
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		for(int n : bean1.getData3()) {
			System.out.println(n);
		}
		
		System.out.println(bean2.getData1());
		System.out.println(bean2.getData2());
		
		return "final";
	}
	
}

test1 누르면 뜨는 출력결과 / 출력결과 뜸과 동시에 final.jsp 로 넘어감

 


[ MVC_Basic_07 - project ] 

 

1) views 폴더 안에 indaex.jsp, test1, test2, test3, test4 JSP 파일 생성 (SpringController에서 설정한 data값 출력하기)

    requestScope는 생략 가능 ! Model이 붙어있으면 범위가 request 임

[ index.jsp 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>

	<a href="t1?data1=10&data2=20">test1</a><br>
	
	<a href="t2">test2</a><br>
	
	<a href="t3">test3</a><br>
	
	<a href="t4">test4</a><br>
	
</body>
</html>

 

[ test1.jsp 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>
	<!-- data1, data2 출력 -->
	${param.data1 }<br>
	${param.data2 }<br>
</body>
</html>
[ test2.jsp 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>
	<!-- data1, data2 출력 -->
	<!-- test1.jsp와 달리 requestScope. 생략도 가능 ! -->
	${requestScope.data1 }<br>
	${data2 }<br>
</body>
</html>
[ test3.jsp 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>
	<!-- data1, data2 출력 -->
	<!-- test1.jsp와 달리 param 생략도 가능 ! -->
	${requestScope.data1 }<br>
	${data2 }<br>
</body>
</html>
[ test4.jsp 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>
	<!-- data1, data2 출력 -->
	<!-- test1.jsp와 달리 param 생략도 가능 ! -->
	${requestScope.data1 }<br>
	${data2 }<br>
</body>
</html>

test1 test2 클릭시 10 20 출력 / test3 클릭시 30 40 출력 / test4 클릭시 50 60 출력 

 

2) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

import javax.servlet.http.HttpServletRequest;

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

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1() {
		return "test1";
	}
	
	@GetMapping("/t2")
	public String t2(HttpServletRequest request) {
		request.setAttribute("data1", 10);
		request.setAttribute("data2", 20);
		
		return "test2";
	}

	@GetMapping("/t3") 
	public String t3(Model model) { //범위가 request 
		model.addAttribute("data1",30);
		model.addAttribute("data2",40);
		
		return "test3";
	}
	
	@GetMapping("/t4")
	public ModelAndView t4(ModelAndView mv) {
		mv.addObject("data1",50);
		mv.addObject("data2",60);
		
		mv.setViewName("test4"); //test4로 뷰페이지 설정 -> 페이지 이동 
		
		return mv;
	}
}

 

 


[ MVC_Basic_08 - project ] 

 

Data에 해당하는 필드 명이랑 name이랑 똑같이 줘야 함 ~~ !!

 

1) kr.bit.beans package에 Data.java class 생성

package kr.bit.beans;

public class Data {

	private String str1;
	private String str2;
	
	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void setStr2(String str2) {
		this.str2 = str2;
	}
	
	
}

 

2) views 폴더 안에 index.jsp -> 객체로 저장된 필드 값 가져올 때 클래스명 맨 앞글자는 소문자 !! (대문자 아님)

     ${request.data.str1 }

[ index.jsp 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>
	<form action="t1" method="post">
		d1:<input type="text" name="str1" /><br> <!-- 여기서 name 값이 Data 클래스의 필드명과 일치해야함 -->
		d2:<input type="text" name="str2" /><br>
		<button type="submit">체크</button>
	</form>
	
	<form action="t2" method="post">
		d1:<input type="text" name="str1" /><br>
		d2:<input type="text" name="str2" /><br>
		<button type="submit">체크</button>
	</form>
	
</body>
</html>
[ test1.jsp 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>
	<!-- 값이 출력되지 않음 -->
	${requestScope.str1 }
	
	<!-- name값 똑같이 값 출력 됨 -->
	<!-- 그리고 str1 앞에 data를 적어줘야 함 ! 그래야 출력 가능 -->
	<!-- 객체로 저장된 필드 값 가져올 때 클래스명 맨 앞글자는 소문자로 지정 -->
	${requestScope.data.str1 }
	${requestScope.data.str2 }
</body>
</html>
[ test2.jsp 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>
	<!-- 객체로 지정된 필드 값 가져올 때 클래스명 맨 앞글자는 소문자 -->
	<!--  Controller에서 @ModelAttribute("test")로 이름 지정 했기 때문에 data가 아닌 test로 -->
	${requestScope.test.str1 }
	${requestScope.test.str2 }
</body>
</html>

 

2) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import kr.bit.beans.Data;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@PostMapping("/t1")
	public String t1(@ModelAttribute Data bean1) {
		return "test1";
	}

	@PostMapping("/t2") //@ModelAttribute("test") 에 이름을 지정 함 
	public String t2(@ModelAttribute("test") Data bean1) {
		return "test2";
	}
}

 

체크 버튼 누르면 입력한 값 1 2가 test1.jsp로 넘어가면서 화면에 출력 됨 

 

 


[ MVC_Basic_09 - project ]

form 요소들 <form:form>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

 

1) views 폴더 안에 index.jsp , test1.jsp

밑에 코드 활용하여 <form:xxx></form:xxx> 사용 

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>
	<a href="t1">test1</a><br>
	
	<a href="t2">test1</a><br>
	
	<a href="t3">test1</a><br>
	
	<a href="t4">test1</a><br>	
</body>
</html>
[ test1.jsp 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>
<form action="final" method="post">
	이름 : <input type="text" name="name" value="${requestScope.data.name }"><br>
	아이디 : <input type="text" name="id" value="${data.id }"><br>
	비번 : <input type="text" name="pw" value="${data.pw }"><br>
	주소1 : <input type="text" name="adr1" value="${requestScope.data.adr1 }"><br>
	주소2 : <input type="text" name="adr2" value="${requestScope.data.adr2 }"><br>
</form>
</body>
</html>
[ test2.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form action="final" modelAttribute="data">
	이름 : <form:input path="name" /><br> <!-- path이름과 설정한 필드명이 같아야 함 -->
	아이디 : <form:input path="id" /><br>
	비번 : <form:input path="pw" /><br>
	주소1 : <form:input path="adr1" /><br>
	주소2 : <form:input path="adr2" /><br>
	<button type="submit">체크</button>
</form:form>
</body>
</html>
[ test3.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form action="final" modelAttribute="modelBean">
	이름 : <form:input path="name" /><br> <!-- path이름과 설정한 필드명이 같아야 함 -->
	아이디 : <form:input path="id" /><br>
	비번 : <form:input path="pw" showPassword="true"/><br>
	주소1 : <form:input path="adr1" /><br>
	주소2 : <form:input path="adr2" /><br>
	<button type="submit">체크</button>
</form:form>
</body>
</html>
[ test4.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form action="final" modelAttribute="modelBean">
	이름 : <form:input path="name" /><br> <!-- path이름과 설정한 필드명이 같아야 함 -->
	아이디 : <form:input path="id" /><br>
	비번 : <form:input path="pw" showPassword="true"/><br>
	주소1 : <form:input path="adr1" /><br>
	주소2 : <form:input path="adr2" /><br>
	<button type="submit">체크</button>
</form:form>
</body>
</html>

 

2) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import kr.bit.beans.Data;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1(Data bean) { //경로매핑 후에 필드에 값을 세팅 
		bean.setName("현욱");
		bean.setId("harry");
		bean.setPw("1234");
		bean.setAdr1("seoul");
		bean.setAdr2("gangnam");
		
		return "test1";
	}

	@GetMapping("/t2")
	public String t2(Data bean) { //경로매핑 후에 필드에 값을 세팅 
		bean.setName("예준");
		bean.setId("Juun");
		bean.setPw("5678");
		bean.setAdr1("seoul");
		bean.setAdr2("seocho");
		
		return "test2";
	}
		
	@GetMapping("/t3")
	public String t3(@ModelAttribute("modelBean") Data bean) {
		bean.setName("호준");
		bean.setId("hoho");
		bean.setPw("2345");
		bean.setAdr1("seoul");
		bean.setAdr2("mapo");
		
		return "test3";
	}
	
	@GetMapping("/t4")
	public String t4(Model model) {
		Data bean=new Data();
		bean.setName("성민");
		bean.setId("mini");
		bean.setPw("3456");
		bean.setAdr1("seoul");
		bean.setAdr2("yongsan");
		
		model.addAttribute("modelBean",bean);
		
		return "test4";
	}
}

 

test1 맨위에꺼 클릭하면 현욱 / 두번째꺼 클릭하면 예준

 


[ MVC_Basic_10 - project ]

form 요소들 <form:form>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

 

1) views 폴더 안에 index.jsp , main1.jsp , main2.jsp 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">Redirect</a><br>
<a href="t2">Forword</a><br>

</body>
</html>
[ main1.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>main1_redirect</h1>
</body>
</html>
[ main2.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>main2_forward</h1>
</body>
</html>

 

2) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

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

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1() {
		return "redirect:/main1"; //t1으로 주소가 바뀌는게 아니라 main1으로 바뀜 
	}
	
	@GetMapping("/main1")
	public String main1() {
		return "main1";
	}
	
	@GetMapping("/t2")
	public String main2() {
		return "main2";
	}
	
	
	
}

http://localhost:8080/MVC_Basic_01/main1 or http://localhost:8080/MVC_Basic_01/t2

 

 


[ MVC_Basic_11 - project ]

RootAppContext.java class에 Data.java Bean으로 등록

1) views 폴더 안에 index.jsp

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">test1</a><br>

</body>
</html>

 

2) Data, Data2, Data3, Data4

package kr.bit.beans;

public class Data {
   
	private String str1;
	private String str2;
	
	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void setStr2(String str2) {
		this.str2 = str2;
	}
	
}
package kr.bit.beans;

public class Data2 {
   
	private String str3;
	private String str4;
	
	public String getStr3() {
		return str3;
	}
	public void setStr3(String str3) {
		this.str3 = str3;
	}
	public String getStr4() {
		return str4;
	}
	public void setStr4(String str4) {
		this.str4 = str4;
	}
	
	
	
}
package kr.bit.beans;

import org.springframework.stereotype.Component;

@Component
public class Data3 {
   
	private String str5;
	private String str6;
	
	public String getStr5() {
		return str5;
	}
	public void setStr5(String str5) {
		this.str5 = str5;
	}
	public String getStr6() {
		return str6;
	}
	public void setStr6(String str6) {
		this.str6 = str6;
	}
  
}
package kr.bit.beans;

import org.springframework.stereotype.Component;

@Component(value = "request4")
public class Data4 {
	private String str7;
	private String str8;

	public String getStr7() {
		return str7;
	}

	public void setStr7(String str7) {
		this.str7 = str7;
	}

	public String getStr8() {
		return str8;
	}

	public void setStr8(String str8) {
		this.str8 = str8;
	}

}

 

3) kr.bit.config package에 RootAppContext.java class에 Bean 등록 

    Data와 Data2는 Root에 @Bean으로 등록했지만 Data3와 Data4는 @Component이므로 

    kr.bit.config package에 ServletAppContext.java class에 @ComponentScan("kr.bit.beans") 추가해줘야함 

package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import kr.bit.beans.Data;
import kr.bit.beans.Data2;

@Configuration
public class RootAppContext {  //root-context.xml
	
	@Bean
	public Data data() {
		return new Data();
	}
	
	@Bean("request2")
	public Data2 data2() {
		return new Data2();
	}

	
}
package kr.bit.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.beans") //추가한 부분 !!!!
public class ServletAppContext implements WebMvcConfigurer{
	
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/",".jsp");
	}
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
}

 

4) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import kr.bit.beans.Data;
import kr.bit.beans.Data2;
import kr.bit.beans.Data3;
import kr.bit.beans.Data4;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@Autowired
	Data data1; //Ioc 컨테이너에 빈으로 등록(@Bean)한 Data 객체의 주소값이 data1 필드에 주입 됨 
	
	@Resource(name="request2")
	Data2 data2; //Ioc 컨테이너에 빈으로 등록(@Bean)한 이름을 지정(request2) Data2 객체의 주소값이 data2 필드에 자동 주입 됨 
	
	@Autowired
	Data3 data3;
	
	@Resource(name="request4")
	Data4 data4;
	
	@GetMapping("/t1")
	public String t1() {
		data1.setStr1("스프링1");
		data1.setStr2("스프링2");
		
		data2.setStr3("스프링3");
		data2.setStr4("스프링4");
		
		data3.setStr5("스프링5");
		data3.setStr6("스프링6");
		
		data4.setStr7("스프링7");
		data4.setStr8("스프링8");
		
		return "forward:/final1"; 
        	//이부분을 return "redirect:/final1";로 바꿔도 final1 유지가 됨 (원래는 안 되는게 정상 !)
	}
	
	@GetMapping("/final1")
    public String final1(Model model) { //request 범위랑 같음 
		
		//model 객체에 data1234 값 넣기 
        model.addAttribute("data1", data1);
        model.addAttribute("data2", data2);
        model.addAttribute("data3", data3);
        model.addAttribute("data4", data4);

        return "final";
    }
}

 

5) views 폴더 안에 final.jsp

[ final.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>
	<!-- requestScope 생략 가능 -->
	${data1.str1 } 
	${requestScope.data1.str2 } <br>
	
	${requestScope.data2.str3 }
	${requestScope.data2.str4 } <br>
	
	${requestScope.data3.str5 }
	${requestScope.data3.str6 } <br>
	
	${requestScope.data4.str7 }
	${requestScope.data4.str8 } <br>
	
</body>
</html>

 

6) 다시 RootAppContext.java로 돌아와서 data()와 data2()에 @RequestScope 추가 

    그리고 Data3과 Data4에도 @RequestScope 추가 !!

package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;

import kr.bit.beans.Data;
import kr.bit.beans.Data2;

@Configuration
public class RootAppContext {  //root-context.xml
	
	@Bean
	@RequestScope //요청이 발생할 때 마다 Bean 객체가 생성되어 자동으로 주입된다
	public Data data() {
		return new Data();
	}
	
	@Bean("request2")
	@RequestScope
	public Data2 data2() {
		return new Data2();
	}
	
}
package kr.bit.beans;

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;

@Component
@RequestScope
public class Data3 {
   
	private String str5;
	private String str6;
	
	public String getStr5() {
		return str5;
	}
	public void setStr5(String str5) {
		this.str5 = str5;
	}
	public String getStr6() {
		return str6;
	}
	public void setStr6(String str6) {
		this.str6 = str6;
	}
  
}
package kr.bit.beans;

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;

@Component(value = "request4")
@RequestScope
public class Data4 {
	private String str7;
	private String str8;

	public String getStr7() {
		return str7;
	}

	public void setStr7(String str7) {
		this.str7 = str7;
	}

	public String getStr8() {
		return str8;
	}

	public void setStr8(String str8) {
		this.str8 = str8;
	}

}

 


[ MVC_Basic_12 - project ]

1) views 폴더 안에 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">test1</a><br>
<a href="t2">test2</a><br>
<a href="t3">test3</a><br>
<a href="t4">test4</a><br>
<a href="t5">test5</a><br>

</body>
</html>

 

2) kr.bit.controller package 안에 SpringController.java class 생성

package kr.bit.controller;

import javax.servlet.http.HttpServletRequest;

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

import kr.bit.beans.Data;

//Bean으로 등록함과 동시에 @Controller 작업이 일어나면서 Mapping 하겠다 
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1(HttpServletRequest request) {
		request.setAttribute("data1", "spring1");
		return "forward:/final1";
		//index에서 test1을 누르면 data1에 spring1이란 정보 담아서 final1로 이동
	}
	
	@GetMapping("/final1")
	public String final1(HttpServletRequest request) {
		//data1을 받아서 final1.jsp에 출력 data1을 
		String data1 = (String)request.getAttribute("data1");
		return "final1";
	}
	
	@GetMapping("/t2")
	public String t2(Model model) {
		model.addAttribute("data2" , "spring2");
		return "forward:/final2";
	}
	
	@GetMapping("/final2")
	public String final2(HttpServletRequest request) {
		request.getAttribute("data2");
		return "final2"; 
	}
	
	@GetMapping("/t3")
	public ModelAndView t3(ModelAndView mv) {
		mv.addObject("data3","spring3");
		mv.setViewName("forward:/final3");
		return mv;
	}
	
	//값을 세팅만 할 수 있음 - Model, ModelAndView
	//값을 세팅해서 브라우저로 전송할 때 : requestScope.클래스명(맨앞글자 소문자).필드명
	//값을 세팅해서 한번 더 매핑시켜서 데이터 가져올 때 : getAttribute(HttpServletRequest)
	@GetMapping("/final3") 
	public String final3(HttpServletRequest request) {
		request.getAttribute("data3");
		
		return "final3";
	}
	
	@GetMapping("/t4")
	public String t4(@ModelAttribute("bean") Data d1) {
		d1.setStr1("aa");
		d1.setStr2("bb");
		
		return "forward:/final4";
	}
	
	@GetMapping("/final4")
	public  String final4(HttpServletRequest request) {
		Data d1=(Data)request.getAttribute("bean");
		System.out.println(d1.getStr1());
		System.out.println(d1.getStr2());
		
		return "final4";
		//final4에서 
	}
	
		
}

 

3) kr.bit.beans package 안에 Data.java class

package kr.bit.beans;

public class Data {
   
	private String str1;
	private String str2;
	
	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void setStr2(String str2) {
		this.str2 = str2;
	}
	
	
	
}

4) views 폴더 안에 final1 2 3 4 

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>
	${requestScope.data1 } 
	
</body>
</html>
728x90