[23.11.30] 78차
<<진도>>
[Back-end] Spring Framework
/ 지난 jsp 과제풀이
/ 스프링 프레임워크 Spring Framework
/ STS (ver.3) 기본 세팅 및 프로젝트 생성
/ Spring Framework requset 프로세스
<<오늘의 팁>>
- 다른 환경에서 만든 프로젝트를 Tomcat 서버로 실행시키면 오류가 날 수 있다.
<<과제>>
- MVC패턴 / MVC 모델 정리
- request 프로세스 정리
JSP [forward와 redirect는 내부작동원리가 다르다]
차이
1)URL
forward : 주소URL를 숨김
redirect : 이동된 페이지 주소노출
2) 페이지 이동
forward : 서버 내에서 페이지 이동
redirect : 클라이언트가 새로운 요청을 하는 구조
3) 제어권의 차이
+) forward는 WEB-INF에 접근 가능 / redirect는 불가능
<과제풀이 1128>
* quiz02 (include를 활용하여 간소화)
<h1>Action Tag : Forward Quiz</h1>
<form action="quiz02_response.jsp">
<div>혈액형별 성격 테스트</div>
<div>당신의 혈액형은?</div>
<div>
<input type="radio" name="bloodtype" value="A">A형
<input type="radio" name="bloodtype" value="B">B형
<input type="radio" name="bloodtype" value="O">O형
<input type="radio" name="bloodtype" value="AB">AB형
</div>
<input type="submit" value="보내기">
</form>
* quiz02_response
<h1>quiz02_response.jsp 파일입니다</h1>
<%
request.setCharacterEncoding("UTF-8");
String user_name = "홍길동";
String bloodtype = request.getParameter("bloodtype");
%>
<jsp:forward page='<%="quiz02_" + bloodtype + ".jsp"%>'>
<jsp:param value="<%=user_name%>" name="user_name" />
</jsp:forward>
* forward되는 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String user_name = request.getParameter("user_name");
String bloodtype = request.getParameter("bloodtype");
%>
<!DOCTYPE html>
<html>
<head>
<%@page trimDirectiveWhitespaces="true" %>
<meta charset="UTF-8">
<title>quiz02_<%= bloodtype %>.jsp</title>
</head>
<body>
<h1><%=bloodtype %>형</h1>
<div><%=user_name %>님의 혈액형은 <%=bloodtype %>형 입니다.</div>
* _header.jsp를 통해 아래 파일들 간소화 가능 ( + )
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="quiz02_header.jsp" %>
<div>A형 : 우리나라에서 가장 많은 혈액형입니다.</div>
</body>
</html>
[ Spring Framework ]
STS (ver.3) 기본설정
이 외의 Web의 파일 인코딩도 동일하게
서버 실행 시 경고뜨는 1,000,000 -> 제한없애기
[spring-ver1]
Spring (Spring Framework) / Spring Boot (Spring Boot)
- 패키지명 지정해주기 (3개 이상 필수 :: 계층구조)
만들어진 Spring Legacy Project 구조
(Package Explorer에는 java 폴더가 안보인다.)
- project 선택후 Run
** [스프링 프레임워크는 외장 Tomcat을 사용]
WAS(Tomcat) 안에 여러개의 Application(프로젝트)을 관리
/ server.xml (설정 파일을 보면) path="" << URL의 Context
path="/ver1"(=Context) 이면 spring-ver1(=Application(프로젝트))를 찾아가라
>> 위와 같이 외부에서 URL로 해당 프로젝트(spring-ver1)에 요청이 오게되면
1. webapp의 web.xml로 먼저 찾아가
2. DispatcherServlet(class)으로 servlet(servlet-context.xml)을 찾아간다.
+) web.xml에서 특정 애플리케이션의 컴포넌트를 스캔하여
3. servlet은 web.xml의 HandlerMapping을 (“ / ”) 통해 특정 요청에 매핑되는(RequestMapping) Controller(HomeController.java)를 검색하여 찾아감
4. Controller는 Model 및 View와 관련된 처리를 수행하여 servlet에 논리 뷰를 return한다.
1) Controller가 return한 "home"은 문자열로 파일의 이름만 가리키지만 [논리 뷰 형태]
2) servlet에서 <beans: property> [viewResolver] 뷰리졸버가 "home이" WEB-INF/views/의 경로에 있고(prefix) / home / 확장자가 .jsp임을 특정함 (suffix)
5. 이렇게 특정된 View를 Client로 결과를 리턴한다.
[이미지 파일 경로 설정]
/ home.jsp
이미지를 넣으면 깨지게 되는데
** Spring(프레임워크)은 하나의 외장 Tomcat으로 여러 프로젝트를 관리하며,
Context(/ver1/)를 통해 구분을 하므로
[ view.jsp ] 로 연결하기 위한 핸들러 메서드 (.Controller)
@RequestMapping(value = "/view")
public String view() {
return "view"; // 논리view (.jsp 파일명)
}
[spring-ver2]
스프링 부트에서 template에 파일들에는 controller를 통해서만 접근해야 했던것처럼,
스프링 프레임워크에서 WEB - INF 안에 파일은 controller를 통해 접근해야함.
// But, webapp에 있는 파일은 Tomcat이 바로 처리해줌(DispatcherServlet이 바로 관여하는 것)
* web.xml(Tomcat 서버)
SpringBoot에서는 jsp를 공식지원하지 않음(JSP가 가능하지만 보장X)
Spring Framework에서는 오히려 views에서는 JSP만 인식하고
HTML을 인식하지 못한다. >> 이유는 servlet-context.xml의 ViewResolver가 suffix .jsp 세팅
<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>
Spring Framework와 JSP는 세트! (굳이 html을 쓰려면 forward 등을 이용)