티스토리 뷰
브라우저가 서버에 요청시 브라우저당 메모리 공간을 서버에 할당함
메모리 공간은 브라우저 당 1개이기 때문에
새 요청 발생해도 그 공간 사용함
이것이 session!
브라우저의 요청 ~ 브라우저 종료 전까지 사용 가넝한 이 시간? 기간?을
SessionScope라고 함
SessionScope내에서는 session 영역에 저장된 데이터, 객체 사용 가능
이걸 이용해 데이터를 전송해보자!
XML ver
프로젝트 생성
Project Explorer에서 빈공간에 우클릭하면 Dynamic Web Project 만들 수 있다!
여기까진 할 수 있잖아
방금 만든 그 프로젝트를 Maven Project로 만들어주자!
혹시 다시 Maven 제거하고 싶다면, 위의 그림처럼 Disabled Maven Nature 해주믄 되니꽈
아! 메이븐 설정하고 프로젝트에 오류뜨면 그냥 alt+F5로 마무리해주십시다
Maven 기본설정 해보자!
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- pom모델버전 -->
<modelVersion>4.0.0</modelVersion>
<!-- 프로젝트 생성하는 조직의 고유 아이디 like 도메인 이름 -->
<groupId>Ex01JavaSetting</groupId>
<!-- Maven 프로젝트 식별하는 아이디 like 프로젝트명 -->
<artifactId>Ex01JavaSetting</artifactId>
<!-- 프로젝트 현재 버전 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 어떤 형태로 프로젝트를 패키징할 지 결정 -->
<packaging>war</packaging>
<!-- 소스의 디렉토리 구조, 빌드 산출물 디렉토리 구조, 빌드시 사용할 플러긴 정보 관리 -->
<build>
<!-- sourceDirectory : 자바 소스 코드를 관리하는 디렉토리 -->
<sourceDirectory>src/main/java</sourceDirectory>
<!-- Maven제공 기능은 플러긴 기반으로 작동 따라서 설정 필요 -->
<plugins>
<!-- 컴파일 플러그인 설정 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!-- 16>14변경 -->
<release>14</release>
</configuration>
</plugin>
<!-- 배포 패키징 플러긴 설정 -->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<!-- configuration 추가 -->
<configuration>
<!-- 배포할 위치 directory -->
<warSourceDirectory>src</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
<!-- 라이브러리 버전관리 : properties -->
<properties>
<javax.servlet-version>4.0.1</javax.servlet-version>
<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
<org.springframework>5.2.2.RELEASE</org.springframework>
</properties>
<!-- 라이브러리 셋팅 : dependencies 프로그램과 의존관계인 라이브러리 관리 -->
<dependencies>
<!-- servlet-api 라이브러리 적용 위한 설정 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
<version>${javax.servlet-version}</version>
<scope>provided</scope>
</dependency>
<!-- javax.servlet.jsp-api 라이브러리 적용 위한 설정 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
<version>${javax.servlet.jsp-version}</version>
<scope>provided</scope>
</dependency>
<!-- javax.servlet/jstl 라이브러리 적용 위한 설정 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
<version>${javax.servlet.jsp.jstl-version}</version>
</dependency>
<!-- spring-webmvc 라이브러리 적용 위한 설정 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
<version>${org.springframework}</version>
</dependency>
</dependencies>
</project>
Spring MVC XML 기본설정
일단 Spring MVC를 어떻게 구현할지 구조부터 대충 살펴보면,
전에 JSP MVC 패턴때 bean.xml 만들어서 bean을 정의해주었지
그 역할을 이젠 web.xml 이용해서 XML버전으로 만들어보자
아까 Java버전으로 치자면 ServletConfigClass의 역할을 얘가 하는거여
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<!-- 현재 웹 애플리케이션에러 받아들이는 모든 요청에 대해 appServlet이란 이름으로 정의된 서블릿 사용 -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 설정 정보를 분석해 controller 선택하는 서블릿 지정 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<!-- Spring MVC에서 저공하는 기본 서블릿 지정 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring MVC 설정을 위한 XML파일 지정 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/servlet-context.xml</param-value>
</init-param>
<!-- 로드는 딱 한 번만 시키기 : 서버 꺼질 때까지 한 번만 실행 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Bean정의할 XML 파일 지정 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/root-context.xml</param-value>
</context-param>
<!-- 리스너 설정 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 파라미터 인코딩 필터 설정 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
이제 web.xml에서 context-param을 보면 bean을 정의할 xml파일을 지정해두었잖아?
root-context.xml 그걸 한 번 만들어보자
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- XML방식으로 Bean등록하기 -->
<bean class="kr.co.goodee39.vo.DataVO1" scope="request"/>
<bean class="kr.co.goodee39.vo.DataVO2" id="requestVO2" scope="request"/>
</beans>
간단하지? bean을 설정할 수 있는 xmlns, xmls:xsi, xsi:schemaLocation을 삽입해준게 전부야
가 아니라!
이제는 Bean을 주입해야하므로 Java에서 그랬듯, bean을 정의해준다
XML방식으로 정의하자면 bean태그로 class속성에 path 적어주고, scope는 @RequestSope대신 scope속성 이용해 request를 명시해준다!
DataVO2는 Java방식으로 할 때 bean주입시 Controller에서 @Qualifier또는 @Resource로 주입할 수 있도록
이름을 설정해줘본다.
이번엔 web.xml에서 servlet을 보면 설정 정보 분석해서 controller를 선택해주는 서블릿 경로를 만들어뒀어
servlet-context.xml이건데, 그걸 한 번 해보자고
<?xml version="1.0" encoding="UTF-8"?>
<!-- mvc는 beans:beans로 태그 변경해야 인식함 -->
<beans:beans
xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 스캔한 패키지 내부 클래스 중 @Controller 있는 클래스 controller로써 로딩하도록 설정 -->
<annotation-driven />
<!-- 스캔할 bean들이 모여있는 패키지 지정 -->
<context:component-scan base-package="kr.co.goodee39.controller" />
<context:component-scan base-package="kr.co.goodee39.vo" />
<!-- Controller의 메서드에서 반환하는 문자열 앞, 뒤에 붙일 경로 정보 셋팅 -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 정적파일(img, video, audio) 로드 설정 -->
<resources mapping="/**" location="/resources/" />
</beans:beans>
Java때랑 내용이 같은데, 표현법이 다른거야
annotaion-driven은 클래스에 @Controller달린걸 찾을 수 있게 도와주는 아이야
context:component-scan으로 controller 찾아낼 경로 설정해주고,
이따가 VO 4개를 만들어서 주입해볼건데, component로 controller패키지 말고, vo패키지도 추가할 예정이므로
미리 component-scan에 base-package로 vo패키지도 추가해줬음!
beans:bean에서는 아까 Java에서 경로 자동으로 /WEB-INF/views/파일명.jsp 완성되도록 설정했어
prefix, suffix가 위치에 따른 설정인거쥐
마찬가지로 정적파일 즉 오디오, 사진, 비디오를 위한 파일을 불러오기 위한 폴더를 설정해주는데
resources로 할 수 있다.
mapping="/**"라는건 어떤 위치이든 뭐 그런 뜻일까...?ㅎㅎㅎㅎ
Controller 클래스 만들기
아까 위에서 web.xml보면 servlet에서 appServlet이란 이름으로 설정한 controller 선택 서블릿이 있는데,
servlet-context.xml라고 파일 하나 만들었좌나,
그리고 @Controller로 지정한 파일 알 수 있도록 annotaion-driven 태그 달아줬고,
context:component-scan으로 controller 찾아낼 경로 설정까지 했으니 이제 @Controller단 클래스를 하나 만들기야
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
//ServletAppContext에서 설정한 configureViewResolvers()메소드 통해서
///WEB-INF/views/index.jsp로 변환됨
@RequestMapping(value="/", method=RequestMethod.GET)
public String home() {
return "index";
}
}
별건 없어
그냥 무슨 역할하는지 보자고!
위에서 계속 언급했듯 이 클래스는 controller의 역할을 할 클래스이므로 어노테이션으로 이름표 달아주고,
메소드를 하나 만드는데, 이 메소드는 무어냐
첫 페이지 역할, 그러니까 home 역할을 할 페이지를 설정하는 메서드야
그래서 이름도 home이야 후후
value는 우리 JSP MVC 패턴에서 servlet만들면 맨 상단에
@WebServlet("/블라블라")하는 공간이 있어 (ㄴㅇㄹ는 무시혀~ 걍 쓴거임)
저 블라블라는 보통 servlet이름이 들어가는데, 파일을 실행시켜서 이동한다거나 하면
url에 저기 작성된 이름이 뒤에 뜨더라고?
근데 이걸 /만 남기고 지워주면?!
그냥 RequestDispatcher rdp = request.getRequestDispatcher("");에서 설정한 jsp파일이 home으로 떠부러
servlet이라는 위치가 jsp파일 앞전에 안붙기 때문이지!
그거랑 같은 이치야 value = "/"는
아무턴, return "문자열";은 이따가 만들 home이 될 jsp파일 이름을 넣어준거야
이 controller가 실행되면 index라는 홈이름이 아까 위에서 servlet-context.xml로 설정한 beans를 통해
prefix="/WEB-INF/views/"와 suffix=".jsp"를 만나 /WEB-INF/views/문자열.jsp가 되는거지
그리고 index.jsp에 이미지가 있다면 resources태그 통해서
src 앞에 /resources/가 콱 붙어주겠지~
이 아래부터는 Java버전이랑 동일합니다!
HomeController에서 설정한 첫 페이지가 되어줄 index.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>
<!--
브라우저가 서버에 요청시 브라우저당 메모리 공간을 서버에 할당함
메모리 공간은 브라우저당 1개이기 때문에 새 요청 발생해도 그 공간 사용함
이것이 session!
브라우저의 요청 ~ 브라우저 종료 전까지 사용 가넝한 이 시간? 기간?을 SessionScope라고 함
SessionScope내에서는 session 영역에 저장된 데이터, 객체 사용 가능
-->
<a href="test1">Test1</a><br />
<a href="test2">Test2</a><br />
<a href="test3">Test3</a><br />
<a href="result1">Result1</a>
<hr />
<a href="test4">Test4</a><br />
<a href="result4">Result4</a><br />
<hr />
<a href="test5">Test5</a><br />
<a href="result5">Result5</a><br />
</body>
</html>
test1,2,3 링크는 session으로 데이터 전송시 forward, redirect, 페이지 이동만 시켰을 때
데이터 이동이 일어나는지 확인하기 위한 태그
test4는 객체를 주입해서도 session으로 데이터 전송이 가능한지 확인하기 위한 태그
test5는 객체를 sessionScope 영역에 추가해서 사용하는 법을 확인하기 위한 태그
VO를 하나 만들어주자~
public class DataVO1 {
private String data1;
private String data2;
public DataVO1() {
// TODO Auto-generated constructor stub
}
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
test4에서 객체 주입으로도 session 통한 데이터 전달 가능한지 본다고 했으니까
객체 하나를 만들어줘야겠지
Controller 만들기
import javax.servlet.http.HttpSession;
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.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import kr.co.goodee39.vo.DataVO1;
@Controller
//test5메서드 위한 SessionAttributes : ModelAttribute에서 설정한 sessionVO1, sessionVO2가 sessionScope로 들어감
@SessionAttributes({"sessionVO1", "sessionVO2"})
public class TestController {
//test5메서드를 위한 ModelAttribute
@ModelAttribute("sessionVO1")
public DataVO1 sessionVO1() {
return new DataVO1();
}
@ModelAttribute("sessionVO2")
public DataVO1 sessionVO2() {
return new DataVO1();
}
/*
* public String test1(HttpServletRequest request) { HttpSession session =
* request.getSession(); 이렇게 가져와야 했던 세션을 아래처럼 한 방에 해결
*/
@GetMapping("/test1")
public String test1(HttpSession session) {
session.setAttribute("data1", "문자열1");
return "test1";
}
@GetMapping("/test2")
public String test2(HttpSession session) {
session.setAttribute("data1", "문자열2");
return "redirect:/result1";
}
@GetMapping("/test3")
public String test3(HttpSession session) {
session.setAttribute("data1", "문자열3");
return "forward:/result1";
}
// test1, test2, test3 메서드는 모두 잘 실행됩니다.
// Session은 브라우저가 종료되기 전까지 살아있음
// 다만 test1메서드는 콘솔창에는 찍히지 않음!
// data1은 마지막에 실행된 메서드가 지정한 값을 가지고 있음
@GetMapping("/result1")
public String result1(HttpSession session) {
String data1 = (String) session.getAttribute("data1");
System.out.println("data1 : " + data1);
// data1 : 문자열1
return "result1";
}
@GetMapping("/test4")
public String test4(HttpSession session) {
// 객체 받아와서 필드마다 setter이용해 데이터 초기화 DataVO1 vo1 = new DataVO1();
DataVO1 vo1 = new DataVO1();
vo1.setData1("문자열4");
vo1.setData2("문자열5");
session.setAttribute("vo1", vo1);
return "test4";
}
@GetMapping("/result4")
/*
* public String result4(HttpSession session) {
*
* DataVO1 vo1 = (DataVO1)session.getAttribute("vo1");
*/
//위의 내용을 아래처럼 @SessionAttribute("vo1")을 사용해서 객체 받아오기 가능
//많이 사용함!!!
public String result4(@SessionAttribute("vo1") DataVO1 vo1) {
System.out.println("vo1.data1 : " + vo1.getData1());
// vo1.data1 : 문자열4
System.out.println("vo1.data2 : " + vo1.getData2());
// vo1.data2 : 문자열5
return "result4";
}
//ModelAttribute에서 지정하는 이름은 sessionsScope에 집어넣어준 그 객체를 이용하는 것
@GetMapping("/test5")
public String test5(@ModelAttribute("sessionVO1") DataVO1 vo1, @ModelAttribute("sessionVO2") DataVO1 vo2) {
vo1.setData1("문자열6");
vo1.setData2("문자열7");
vo2.setData1("문자열8");
vo2.setData2("문자열9");
return "test5";
}
@GetMapping("/result5")
public String result5(@ModelAttribute("sessionVO1") DataVO1 vo1, @ModelAttribute("sessionVO2") DataVO1 vo2) {
System.out.println("sessionVO1.data1 : "+vo1.getData1());
System.out.println("sessionVO1.data2 : "+vo1.getData2());
System.out.println("sessionVO2.data1 : "+vo2.getData1());
System.out.println("sessionVO2.data2 : "+vo2.getData2());
return "result5";
}
}
test1(), test2(), test3(), result1()은 session으로 데이터 전송시
forward, redirect, 자기자신으로 return하는 방법이 먹힐지 테스트하기 위함이고,
test4(), result4()메서드는 객체를 주입해서 session으로도 데이터 전송이 간능한지 확인하기 위한 메서드
test5(), result5() 메서드는 최상단에서 생성한 인스턴스를 sessionScope에 집어넣고,
그걸 이 메소드에서 가져와 사용해 볼 것이다
최상단 보면 @SessionAttribute로 배열 타입으로 두 개의 이름이 들어가있는데,
고 바로 아래에 @ModelAttribute로 설정된 인스턴스를 지칭하는 것이다
이 과정을 거치면 ModelAttribute로 설정된 인스턴스가 SessioScope영역에 들어가게 된다!
그럼 메소드에서 @ModelAttribute로 가져다가 사용하면 session영역에 있는 인스턴스를 사용하는 꼴이 되겠쥐
결과페이지를 만들자~
<%@ 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>
<h1>Test1</h1>
<h3>session영역에 저장 완</h3>
</body>
</html>
<%@ 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>
<h1>Test4</h1>
<h3>session영역에 저장 완</h3>
</body>
</html>
<%@ 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>
<h1>Test5</h1>
<h3>session영역에 저장 완</h3>
</body>
</html>
데이터를 session에 저장하기 위한 메소드 실행 페이지
<%@ 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>
<h1>Result1</h1>
<h3>result1 : ${sessionScope.data1}</h3>
</body>
</html>
<%@ 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>
<h1>Result4</h1>
<h3>vo1.data1 : ${sessionScope.vo1.data1}</h3>
<h3>vo1.data2 : ${sessionScope.vo1.data2}</h3>
</body>
</html>
<%@ 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>
<h1>Result5</h1>
<h3>sessionVO1.data1 : ${sessionScope.sessionVO1.data1}</h3>
<h3>sessionVO1.data2 : ${sessionScope.sessionVO1.data2}</h3>
<h3>sessionVO2.data1 : ${sessionScope.sessionVO2.data1}</h3>
<h3>sessionVO2.data2 : ${sessionScope.sessionVO2.data2}</h3>
</body>
</html>
실제 세션 영역에 데이터가 담겼는지 확인하기 위한 페이지
home으로 만들었던 index페이지에서 진짜 이동 되는지 한 번 해보자!
Run on Server를 클릭해주쟈
결과
'(기초)그래서 뭘 배운거야? > SPRING' 카테고리의 다른 글
SPRING-79-Spring Web MVC : SessionScope로 Bean 주입 - JAVA (0) | 2021.12.21 |
---|---|
SPRING-77-Spring Web MVC : SessionScope - JAVA (0) | 2021.12.21 |
SPRING-76-Spring Web MVC : RequestScope Bean 주입하기 - XML (0) | 2021.12.21 |
- Total
- Today
- Yesterday
- 정보처리기사필기
- marktag
- 비전공
- imgtag
- br tag
- 정보처리기사
- 단락태그
- tablespan
- tabletag
- spantag
- definition List
- 합격
- 복습
- usemap
- ptag
- pretag
- 93점
- hn태그
- 줄글
- ul>li
- boldtag
- 긴문장
- 정처기
- html
- 2021년42회
- emtag
- 2021년2회
- hr tag
- ol>li
- 정보처리기사실기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |