카테고리 없음

국비 TIL(Today I Learned) 20220801 스프링

토희 2022. 8. 1. 16:47
728x90

프레임웍이란 개발에 있어 특정 목적을 가지고 효율적인 구조를 제공하여 미리 필요한 기능들을 토대로 개발의 구조 및 구현 형태의 가이드를 제시하는 개발 틀

자바에서 프레임웍은 미리 만들어둔 자바의 클래스들을 통하여 사용자들이 편리하게 메소드를 호출하거나 서비스를 제작할수 있도록 제공한다.

스프링 또한 프레임웍이며 .java로 구성되어있다

프레임웍에는 스프링뿐만 아니라 myBatis, Struts등 여러가지 프레임웍이 존재

 

 

초반에는 같이 쓰는 혼종이 발생함, 셋팅도 어렵고 충돌도 많이 발생

 

https://mvnrepository.com/artifact/org.springframework/spring-webmvc

 

 

 

라이브러리 추가시 pom.xml 에서 확인가능, 우리는 따로 추가해준건 없어, 기본적으로 Maven Dependencies 잡힘

 

배포할떄는 라이브러리 배포 안됨,

 

 

Spring은 서블릿이 구현되어있어, 따로 만들필요없음(web.xml에 설정내역 있음)

 

 

추가적인 태그를 쓸라고 하면 그 태그에 대한 정보가 필요한데, servlet-context에 있음

 

어노테이션 -> 지시자 용도로만 썼었다면 annotation-driven을 통해 annotation을 활성화하겠다. 기능으로 활성화

오늘의 키포인트래!

 

resources : 여기로 연결하겠다. 경로 지정하는거

 

annotation, context는 3버전때의 기본항목이자, 굳이 건들일 필요 없는 애들

 

 

di의 개념??? 예전버전에서 애기나옴, 내일이나 모레 추가적으로 애기해주신데

xml이 파일 계속 만듬 들어남 -> 요즘은 annotation 쓰기때문에 2줄이면 끝난데

 

 

 

 

우리는 String대신 ModelAndView

 

 

Servlet 은 우리가 확인 불가? 스프링에서 자동적으로 돌고있음

 

 

 

 

 

class 만들기

 

파일 만들고, @Controller 어노테이션 달아주기

 

 

주소가 들어오면은 난 이주소 쓸래요 하는게 @RequestMapping

주소랑 화면을 다르게 봐야함 주소가 들어오면 기능 실행

 

Model은 어디서나 만들어서 쓰면 됨, 데이터보관 용도

ModelAndView : 데이터를 보관하며, 뷰 정보나 뷰가 담기는 객체

 

 

 

순서대로 만들기 web.xml & servlet-context.xml는 기본설정 되어있으니 Controller 만들고 JSP만들기

jsp파일 만들기

주소창에 치고 들어가야함

 

주소랑 jsp이름이 다름

주소는 test인데, jsp는 a.jsp잖앙, 주소랑 화면을 같이 보면 안됨, 주소 들어오면 메소드실행

 

콘솔에 보안 4버전까지는

주소가 어떻게 연결되어있고 하는 정보가 뜸

5버전은 보안때문에 안뜨고

 

 

우리는 TestController에서 저렇게만 위치를 지정했는데 어떻게 a.jsp까지의 경로까지 가는가 하면

 

servlet-context.xml에 지정되어있음

지금 제일 작은 사이트로 돌렸데

 

앞으로 배워야할것!

RequestMapping이 이것저것 많다.

 

데이터 넘기기

 

 

 

resoureces에 제이쿼리 넣어주기

 

 

a.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>
<!-- Spring에서 resources 경로 지정시 주소창을 기준으로 상대경로 지정 
	=> resources가 들어올 경우 매핑을 연결시켯기 때문
-->
<!-- 현재주소: http://localhost:8090/test/test
	=> http://localhost:8090/test/resources/jquery/jquery-1.12.4.js
 -->
<script type="text/javascript" src="resources/jquery/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#sendBtn").on("click",function(){
		$("#goForm").submit();
	})
	
});
</script>
</head>
<body>
Hi!<br/>
<!-- el은 jstl선언 없이 사용가능 -->
<!-- Controller에서 넘어오는것은 이전 화면에서 넘어오는 것이 아니기 때문에 
	 param. 없이 호출 해야한다. 내가 나한테 넘기는중
 -->
${msg}<br/>
<form action="test2" id="goForm" method="post">
	<input type="text" name="txt" />
	<input type="button" value="전송" id="sendBtn" />
</form>
</body>
</html>

test2.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>
${param.txt}
</body>
</html>

 

TestController.java 의 일부 (밑에 전체 코드 붙여놓을거임)

controller에서 데이터 받기

 

 

 

실습

주소1 : /gugu

화면에서 숫자를 입력받아 주소 2로 보냄

주소2 : /gugures

컨드롤러에서 숫자를 받아 해당 숫자의 구구단을 문자열로 만든 뒤 화면에전달

화면에서는 컨트롤러에서 넘어온 구구단 결과를 출력

 

gugu.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>
<script type="text/javascript" src="resources/jquery/jquery-1.12.4.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$("#sendBtn").on("click",function(){
		if($("#txt").val() == ""){
			alert("값 입력하세요")
			$("#txt").focus();
		}
		else if (isNaN($("#txt").val())){
			alert("숫자만 넣으세요")
			$("#txt").val("");
			$("#txt").focus();
		} else{
		$("#goForm").submit();
		}
	})
	
});
</script>
</head>
<body>
<form action="gugures" id="goForm" method="post">
	<input type="text" name="txt" id="txt"/>
	<input type="button" value="전송" id="sendBtn" />
</form>
</body>
</html>

gugures.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>
${param.txt}단<br/>
${gugu}
</body>
</html>

 

 

TestController.java

package com.spring.test.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

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

@Controller
public class TestController {
	// RequestMapping(value = "주소") : 해당 주소가 들어올 경우 아래 메소드 실행

	@RequestMapping(value = "/test")
	public ModelAndView test(ModelAndView mav) {
		// ModelAndView : 데이터를 보관하며, 뷰 정보나 뷰가 담기는 객체
		// Spring에서 Controller의 메소드 인자는 Spring에서 자동 생성해서 제공한다.
		// -> 우리가 new를 할 필요가 없다, 샘플데이터 만들때 제외 쓸일이 거의 없을거래

		// addObject(키, 값) : Model에 해당 키와 값을 담는다
		// 값으로 담길 수 있는것은 Object이기 때문에 무엇이든 담긴다
		mav.addObject("msg", "Hello");
		// setViewName(값) : 뷰의 정보를(위치 또는 주소)를 보관한다
		mav.setViewName("test/a");

		return mav;
	}

	@RequestMapping(value = "/test2")
	public ModelAndView test2(
			// Controller에서 값 받을때 2개
			// 1. HttpServletRequest : 요청에 대한 정보가 담긴 객체, 내가 필요한 정보 아닌것도 가져올수 있음
			// 요즘은 잘 안쓰고
			HttpServletRequest req,
			// 값만 가져올래! 2. @RequestParam : 넘어오는 값 중 변수명과 이름이 같은 것을 받음
			// 값이 한두개 넘어올때
			@RequestParam String txt,
			// 2의 옵션 @RequestParam(value = 값)
			// RequestParam에서 value옵션의 경우 변수명이 일치하지 않아도
			// value가 넘어오는 키와 같으면 넣어준다
			@RequestParam(value = "txt") String s,
			// 2의 옵션 @RequestParam에 Collection 형태를 제공할 경우
			// 해당 형태에 맞추어 자동으로 값을 집어넣음
			// Map의 경우 키, 값의 형태로 제공되며,
			// List나 배열의 경우 같은 이름으로 여러개가 넘어오면 순자적으로 보관
			// 값 여러개
			@RequestParam HashMap<String, String> m,

			ModelAndView mav) {
		// getParameter(값) : 넘어오는 값 중 키가 지정한 값과 같은 경우 해당 값을 가져옴
		System.out.println(req.getParameter("txt"));
		System.out.println(txt);
		System.out.println(s);
		System.out.println(m.get("txt"));

		mav.setViewName("test/test2");

		return mav;
	}

	@RequestMapping(value = "/gugu")
	public ModelAndView gugu(ModelAndView mav) {

		mav.setViewName("test/gugu");

		return mav;
	}

	@RequestMapping(value = "/gugures")
	public ModelAndView gugures(@RequestParam int txt, ModelAndView mav) {

		String gugu = "";
		for (int i = 2; i <= 9; i++) {
			gugu += txt + "*" + i + "=" + txt * i + "<br/>"; // 화면에 붙일때는 html이기때문에 br로
		}

		mav.addObject("gugu", gugu);
		mav.setViewName("test/gugures");

		return mav;
	}

	@RequestMapping(value = "/test3")
	public ModelAndView test3(ModelAndView mav) {
		List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

		for (int i = 10; i > 0; i--) {
			HashMap<String, String> data = new HashMap<String, String>();
			data.put("no", Integer.toString(i));
			data.put("title", "Test" + i);

			list.add(data);

		}
		mav.addObject("list", list);

		mav.setViewName("test/test3");
		return mav;
	}
}

 

test3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
 table{
 	border-collapse: collapse;
 }
 td, th{
 	border: 1px solid #000;
 }
</style>
</head>
<body>
<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
		</tr>
	</thead>
	<tbody>
		<!-- 목록형 데이터 list에서 하나씩 꺼내서 data란 이름으로 사용 -->
		<!-- varStatus : 반복 시 상태값 
			  상태값.index : 인덱스 번호 취득
		-->
		<c:forEach var="data" items="${list}" varStatus="status">
			<tr>
				<td>${data.no}, ${status.index}</td>
				<td>${data.title}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
</body>
</html>
728x90