Ch15 스프링 웹 플로우
15.1 웹 플로우의 개요
15.2 웹 플로우와 MVC 연동을 위한 환경 설정
15.3 주문 처리를 위한 웹 플로우 정의
15.2 웹 플로우와 MVC 연동을 위한 환경 설정
15.2.1 스프링 웹 플로우 환경 설정
15.2.2 스프링 MVC 환경 설정
15.2.1 스프링 웹 플로우 환경 설정
(1)servlet-context.xml(스프링 MVC 설정 파일)에 스프링 웹 플로우 관련 네임 스페이스/스키마 위치 선언
<beans:beans...
xmlns:webflow="http://www.springframework.org/schema/webflow-config"
xsi:schemaLocation="http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config.xsd"
</beans:beans>
(2)servlet-context.xml에 <webflow:flow-registry> 옵션
<webflow:flow-registry id="flowRegistry">
<webflow:flow-location path="웹 플로우 정의 파일과 경로" [id="아이디 이름"]/>
</webflow:flow-registry>
<!--또는 base-path 사용-->
<webflow:flow-registry id="flowRegistry" base-path="경로1">
<webflow:flow-location path="경로2/웹 플로우 정의 파일" [id="아이디 이름"]/>
</webflow:flow-registry>
예시
<webflow:flow-registry id="flowRegistry">
<webflow:flow-location path="/WEB-INF/flows/order/order-flow.xml" id="order"/>
</webflow:flow-registry>
<!--base-path 사용-->
<webflow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows">
<webflow:flow-location path="/order/order-flow.xml" id="order"/>
</webflow:flow-registry>
<webflow:flow-registry>의 속성
속성 | 설명 |
id | <webflow:flow-registry> 옵션 ID |
base-path | 웹 플로우 정의 파일이 위치한 상대 경로 |
flow-builder-services | 흐름을 빌드하는 데 사용되는 서비스 및 설정 |
<webflow:flow-location> 속성
속성 | 설명 |
id | 웹 플로우 정의 파일의 흐름 ID |
path | 웹 플로우 정의 파일과 경로 |
(3)servlet-context.xml에 <webflow:flow-executor> 옵션
웹 페이지 흐름을 생성/실행
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry"/>
<webflow:flow-executor>의 속성
속성 | 설명 |
id | <webflow:flow-executor> 옵션 ID |
flow-registry | <webflow:flow-registry> 옵션 ID |
15.2.2 스프링 MVC 환경 설정
pom.xml 파일에 의존 라이브러리/빈 등록
(1)spring-webflow.jar 의존 라이브러리 등록
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
<version>2.5.1.RELEASE</version>
</dependency>
(2)FlowHandlerMapping 빈 등록
디스패처 서블릿이 웹 요청에 대한 요청 처리 매핑
<beans:bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<beans:property name="flowRegistry" ref="flowRegistry"/>
</beans:bean>
(3)FlowHandlerAdapter 빈 등록
웹 흐름 요청 처리, 웹 흐름 제어
<webflow:flow-executor> 옵션 ID 참조
<beans:bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<beans:property name="flowExecutor" ref="flowExecutor"/>
</beans:bean>
15.3 웹 플로우 구성 요소(xml 태그)
15.3.1 <flow>
시작과 끝 태그
xml 네임스페이스, 스키마 위치 등 정의
15.3.2 <view-state>(≒뷰 리졸버)
웹 플로우에서 보여줄 뷰 정의
id 속성 값이 뷰 이름
<view-state id="뷰 이름" [view="뷰 페이지 파일 이름" model="참조할 변수 이름"></view-state>
<view-state> 관련 속성
속성 | 설명 |
id | 뷰 이름 |
view | 뷰 페이지 파일 이름 |
model | 참조할 변수 이름 |
<var name="order" class="com.springmvc.domain.Order"/>
...
<!-- 뷰 페이지 뷰 페이지 파일 사용할 모델 객체 -->
<view-state id="orderCustomerInfo" view="orderCustomerInfo.jsp" model="order"/>
15.3.3 <transition> 요소
현재 상태에서 발생한 이벤트를 처리해서 다른 상태로 전환
<view-state ...>
<transition on="이벤트 ID" to="뷰 이름/상태 ID"/>
</view-state>
<view-state id=orderCustomerInfo" model="order">
<transition on="customerInfo" to="orderShippingInfo"/>
<!-- 현재 뷰 페이지:orderCustomerInfo
이벤트 customerInfo 발생시
orderShippingInfo.jsp로 이동 -->
</view-state>
<transtion> 속성
속성 | 설명 |
on | 현재 상태에서 발생하는 이벤트 ID |
to | 이동할 뷰 ID |
on-exception | 참조할 예외 처리 객체 |
※웹페이지에서 이벤트 ID 설정 예시
<button id="back" name="_eventId_customerInfo">submit</button>
name에 _eventId_+이벤트명
submit을 누르면 customerInfo 이벤트 발생
15.3.4 <end-state>(+취소 기능)
페이지 흐름의 종료 정의
<end-state id="상태 ID/뷰 이름" [view="뷰 페이지 파일 이름"]/>
<end-state id="orderCancelled"/>
<end-state> 요소 속성
속성 | 설명 |
id | 현재 상태의 ID |
view | 현재 상태의 뷰 페이지 파일 이름 |
15.3.5 <evaluate>(≒필터)
특정 시점에서 액션(메서드, 플로 변수) 호출
<action-state...>
<evaluate expression="커맨드 객체의 메서드" [result="메서드의 반환 값" result-type="자료형"]/>
<transition .../>
</action-state>
<!-- 예시 -->
<var name="order" class="com.springmvc.domain.Order"/>
...
<evaluate expression="orderServiceImpl.saveOrder(order)" result="order.orderId"/>
<evaluate> 요소 속성
속성 | 설명 |
expression | 참조할 객체의 메서드 |
result | 메서드의 반환 결과 값을 저장하는 커맨드 객체 이름 |
result-type | 메서드의 반환 결과 값에 대한 자료형 |
15.3.6 <action-state> (+evaluate)
특정 시점에 페이지 흐름을 제어
액션 결과를 기반으로 다른 상태로 전환
id: 현재 상태의 ID
<action-state id="상태 ID">
<evaluate.../>
<transition.../>
...
</action-state>
<action-state id="confirmOrder">
<evaluate expression="orderServiceImpl.saveOrder(order)"/>
<transition on="yes" to="thankOrder"/>
<transition on="no" to="orderCancelled"/>
</action-state>
현재 상태 id: confirmOrder
orderServiceImpl.saveOrder() 실행 후
반환값이 true→이벤트 ID yes, thankOrder로 이동
반환값이 false→이벤트 ID no, orderCancelled로 이동
15.3.7 <decision-state> (이전/이후)
페이지의 흐름 방향 결정
<action-state> 요소를 대신해 if/else 문법으로 페이지 흐름 방향 결정 가능
<decision-state id="상태 ID">
<if test="커맨드 객체의 메서드" then="뷰 이름/상태 ID" else="뷰 이름/상태 ID"/>
</decision-state>
<decision-state>
<if test="orderServiceImpl.saveCustomer()" then="thankOrder" else="orderCancelled"/>
</decision-state>
Ch16 타일즈
16.1 개요
16.2 타일즈 레이아웃
16.3 타일즈와 웹 플로우 연동
16.1 개요
what?
웹 페이지 모듈화 프레임워크
레이아웃 구성에 대한 정보를 xml로 관리
why?
JSP include보다 세분화된 관리 가능
부분적인 페이지 새로고침 가능
how?
16.1.2 pom.xml 파일에 의존 라이브러리 등록
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
16.1.3 servlet-context.xml 파일에 타일즈 환경 설정
(1)별도의 타일즈 뷰 리졸버(UrlBasedViewResolver) 등록
기본 뷰 리졸버보다 우선적용 필요→order 속성 순위를 기본 리졸버보다 높여야 함
<beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
<beans:property name="order" value="1"/>
</beans:bean>
(2)타일즈 레이아웃 정의 파일 등록
뷰 페이지 레이아웃이 설정된 타일즈 레이아웃 정의 파일과 경로 등록
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<beans:property name="definitions" value="/WEB-INF/tiles/tiles.xml"/>
</beans:bean>
16.2 타일즈 레이아웃
16.2.1 기본 레이아웃 정의
레이아웃: 템플릿
JSP에 태그리브 선언
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
16.2.2 타일즈 레이아웃 정의 파일(tiles.xml) 만들기
<tiles-definitions>
타일즈 레이아웃 정의 파일의 시작과 끝
<definition>
사용자에게 보여지는 웹 페이지의 기본 레이아웃 구조에 대한 각각의 템플릿 이름과 적용할 페이지 정의
<put-attribute>
레이아웃 구조의 속성 이름과 실제 경로를 포함한 파일/문자열 정의
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="base" template="/WEB-INF/tiles/baseLayout.jsp">
<put-attribute name="title" value="제목"/>
<put-attribute name="menu" value="/WEB-INF/tiles/menu.jsp"/>
<put-attribute name="header" value="머리말"/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp"/>
</definition>
<definition name="webpage16_01" extends="base">
<put-attribute name="title" value="타일즈"/>
<put-attribute name="header" value="Chapter16 예제"/>
<put-attribute name="body" value="/WEB-INF/views/webpage16_01.jsp"/>
</definition>
</tiles-definitions>
16.2.3 타일즈 레이아웃 페이지 만들기(baseLayout.jsp)
<tiles:getAsString>(문자열) 또는 <tiles:insertAttribute>(페이지) 사용
<tiles:getAsString name="기본 템플릿 속성 이름">
<tiles:insertAttribute name="기본 템플릿 속성 이름">
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value="/resources/css/bootstrap.min.css"/>" rel="stylesheet">
<meta charset="UTF-8">
<title><tiles:insertAttribute name="title"/></title>
</head>
<body>
<tiles:insertAttribute name="menu"/>
<div class="jumbotron" align="center">
<div class="container">
<h1 class="display-3"><tiles:insertAttribute name="heading"/></h1>
<p><tiles:insertAttribute name="subheading"/>
</div>
<div class="container">
<div class="row">
<tiles:insertAttribute name="content"/>
</div>
<div class="footer">
<tiles:insertAttribute name="footer"/>
</div>
</div>
</div>
</body>
</html>
16.3 타일즈와 웹 플로우 연동
'정리노트' 카테고리의 다른 글
[GitHub] 리파지토리 생성 및 원격 저장소 연결 (0) | 2024.02.13 |
---|---|
[스프링]데이터베이스 연동 (0) | 2024.02.02 |
[스프링]스프링 웹 플로우 (0) | 2024.01.31 |
REST API (0) | 2024.01.30 |
[스프링]유효성 검사③ (0) | 2024.01.30 |