정리노트

[스프링] 웹 플로우, 타일즈

망고고래 2024. 2. 1. 17:54

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