관리 메뉴

거니의 velog

231127_SPRING 2 (4-1) 본문

대덕인재개발원_웹기반 애플리케이션

231127_SPRING 2 (4-1)

Unlimited00 2023. 11. 27. 08:32

[JSTLHomeController.java]

package kr.or.ddit.controller.jsp;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/jstl")
public class JSTLHomeController {

		/*
		 * 		5. 표준 태그 라이브러리(JSTL)
		 * 
		 * 			- 많은 개발자들이 JSP에서 코드를 깔끔하게 작성하기 위해 커스텀 태그를 만들어왔는데, 이런 중복되는 노력을 없애기 위해서 나온 것이 바로 JSTL이다.
		 * 
		 * 			1) core 태그 라이브러리
		 * 
		 * 				요소			|		설명							
		 * 			-------------------------------------------------------------------------------------
		 * 			<c:out>			|	JSPWriter에 값을 적절하게 처리한 후에 출력한다.
		 * 			<c:set>			|	JSP에서 사용할 변수를 설정한다. (setter)
		 * 			<c:remove>		|	설정한 변수를 제거한다.
		 * 			<c:catch>		|	예외를 처리한다.
		 * 			<c:if>			|	조건을 지정하고 지정된 조건과 일치하는 처리 내용을 구현한다.
		 * 			<c:choose>		|	여러 조건을 처리할 때 사용한다.
		 * 			<c:when>		|	여러 조건을 지정하고 지정한 조건과 일치하는 처리 내용을 구현한다. <c:choose> 요소에서 사용한다.
		 * 			<c:otherwise>	|	<c:when>요소에서 지정한 조건에 모두 일치하지 않은 때 처리할 내용을 구현한다. <c:choose> 요소에서 사용한다.
		 * 			<c:forEach>		|	컬렉션이나 배열의 각 항목을 처리할 때 사용한다.
		 * 			<c:forTokens>	|	구문자로 구분된 각각의 토큰을 처리할 때 사용한다.
		 * 			<c:import>		|	URL을 사용하여 다른 자원을 삽입한다.
		 * 			<c:url>			|	URL을 재작성한다.
		 * 			<c:redirect>	|	지정한 URL에 리다이렉트한다.
		 * 			<c:param>		|	파라미터를 지정한다.
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			[ taglib 지시자 사용 ::: <%@ tablib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ]
		 * 
		 * 			2) fmt 태그 라이브러리
		 * 
		 * 				요소				|			설명							
		 * 			-------------------------------------------------------------------------------------
		 * 			<fmt:formatNumber>	|	숫자를 형식화한다.
		 * 			<fmt:parseNumber>	|	문자열을 숫자로 변환한다.
		 * 			<fmt:formatDate>	|	Date 객체를 문자열로 변환한다.
		 * 			<fmt:parseDate>		|	문자열을 Date 객체로 변환한다.
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			[ taglib 지시자 사용 ::: <%@ tablib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> ]
		 * 
		 * 			3) function 태그 라이브러리
		 * 
		 * 				요소					|			설명							
		 * 			-------------------------------------------------------------------------------------
		 * 			<fn:contains>			|	지정한 문자열이 포함되어 있는지 판단한다.
		 * 			<fn:containsIgnoreCase>	|	지정한 문자열이 대문자/소문자를 구분하기 않고 포함되어 있는지 판단한다.
		 * 			<fn:startsWith>			|	지정한 문자열이 시작하는지 판단한다.
		 * 			<fn:endsWith>			|	지정한 문자열로 끝나는지 판단한다.
		 * 			<fn:indexOf>			|	지정한 문자열이 처음으로 나왔을 때의 인덱스를 구한다.
		 * 			<fn:length>				|	컬렉션 또는 배열의 요소 개수, 문자열 길이를 구한다.
		 * 			<fn:escapeXml>			|	지정한 문자열을 XML 구문으로 해석되지 않도록 이스케이프한다.
		 * 			<fn:replace>			|	문자열을 치환한다.
		 * 			<fn:toLowerCase>		|	문자열을 소문자로 변환한다.
		 * 			<fn:toUpperCase>		|	문자열을 대문자로 변환한다.
		 * 			<fn:trim>				|	문자열을 trim 한다.
		 * 			<fn:substring>			|	지정한 범위에 해당하는 문자열을 잘라낸다.
		 * 			<fn:substringAfter>		|	지정한 문자열에 일치하는 이후의 문자열을 잘라낸다.
		 * 			<fn:substringBefore>	|	지정한 문자열에 일치하는 이전의 문자열을 잘라낸다.
		 * 			<fn:join>				|	문자열 배열을 결합해서 하나의 문자열을 만든다.
		 * 			<fn:split>				|	문자열을 구분자로 분할해서 문자열 배열을 만든다.
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			[ taglib 지시자 사용 ::: <%@ tablib uri="http://java.sun.com/jsp/jstl/function" prefix="fn" %> ]
		 * 
		 * 		6. 코어 태그
		 * 
		 * 			- 조건분기나 반복처리 그리고 변수의 지정 등과 같이 논리적인 처리를 위해 사용되는 스크립트 코드를 대체하기 위한 태그를 제공한다.
		 * 
		 * 			1) <c:out>
		 * 
		 * 				- JSPWriter에 값을 적절하게 처리한 후에 출력한다.
		 * 				- 단순히 값을 출력하는 것에 끝나는게 아니라, 값의 형태에 따라 출력되는 최종 결과가 달라질 수 있다. (데이터 입력값 확인차)
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			value			|	Object		|	출력할 값
		 * 			escapeXml		|	boolean		|	특수 문자를 변환할지의 여부
		 * 			defalut			|	Object		|	value의 결과값이 null인 경우 출력할 값(대신 출력함)
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			2) <c:set>
		 * 
		 * 				- JSP에서 사용할 변수를 설정한다.
		 * 				- VO의 setter와 같은 기능을 담당한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			var				|	String		|	EL 변수 이름
		 * 			value 			|	Object		|	변수에 할당할 값
		 * 			scope			|	String		|	변수를 생성할 영역, 기본값을 page
		 * 			target			|	Object		|	프로퍼티 값을 설정할 객체 지정
		 * 			property		|	String		|	프로퍼티 이름
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			3) <c:remove>
		 * 
		 * 				- 설정한 변수를 제거한다.
		 * 				- 프로퍼티에 설정되어 있는 변수를 제거할 수 있다. (var에 설정된 변수)
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			var				|	String		|	삭제할 EL 변수 이름
		 * 			scope			|	String		|	삭제할 변수가 포함된 영역
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			4) <c:catch>
		 * 
		 * 				- 예외를 처리한다.
		 * 				- 예외처리는 EL안에서 발생하는 에러는 catch 문 안에서 설정이 어렵다(EL안에서 발생하는 에러는 EL이 알아서 처리)
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			var				|	String		|	예외를 저장할 EL 변수 이름
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			5) <c:if>
		 * 
		 * 				- 조건을 지정하고 지정된 조건과 일치하는 처리 내용을 구현한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			test			|	boolean		|	검사 조건
		 * 			var				|	String		|	검사 조건의 계산 결과값을 저장할 EL 변수
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			6) <c:choose>
		 * 
		 * 				- 여러 조건을 처리할 때 사용한다.
		 * 
		 * 					*** 유의사항 : 주석을 달면 안된다. (구문 에러가 발생한다.)
		 * 
		 * 			7) <c:when>
		 * 
		 * 				- 여러 조건을 지정하고 지정한 조건과 일치하는 처리 내용을 구현한다. <c:choose> 요소에서 사용한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			test			|	boolead		|	출력할 값
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			8) <c:otherwise>
		 * 
		 * 				- <c:when> 요소에서 지정한 조건에 모두 일치하지 않을 때 처리할 내용을 구현한다. <c:choose> 요소에서 사용한다.
		 * 				- <c:when> 과 셋트
		 * 
		 * 			9)	<c:forEach>
		 * 
		 * 				- 컬렉션이나 배열의 각 항목을 처리할 때 사용한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			var				|	String		|	몸체에서 사용할 EL 변수 이름
		 * 			items			|	Object		|	반복 처리할 데이터
		 * 			varStatus		|	String		|	루프 상태를 저장할 EL 변수 이름 (index, count를 얻을 수 있다)
		 * 			begin			|	int			|	시작 인덱스 값
		 * 			end				|	int			|	끝 인덱스 값
		 * 			step			|	int			|	인덱스 증분 값
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			10) <c:forTokens>
		 * 
		 * 				- 구분자로 구분된 각각의 토큰을 처리할 때 사용한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			var				|	String		|	몸체에서 사용할 EL 변수 이름
		 * 			items			|	Object		|	구분자로 구분 처리할 데이터
		 * 			delims			|	String		|	구분자
		 * 			varStatus		|	String		|	루프 상태를 저장할 EL 변수 이름
		 * 			begin			|	int			|	시작 인덱스 값
		 * 			end				|	int			|	끝 인덱스 값
		 * 			step			|	int			|	인덱스 증분 값
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			11) <c:import>
		 * 
		 * 				- URL을 사용하여 다른 자원을 삽입한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			url				|	String		|	읽어올 URL
		 * 			var				|	String		|	읽어온 결과를 저장할 변수 이름
		 * 			scope			|	String		|	변수를 저장할 영역
		 * 			charEncoding	|	String		|	결과를 읽어올 때 사용할 캐릭터 인코딩
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			12) <c:url>
		 * 
		 * 				- URL을 재작성한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			value			|	Object		|	읽어올 URL
		 * 			var				|	String		|	읽어올 결과를 저장할 변수 이름
		 * 			scope			|	String		|	변수를 저장할 영역
		 * 			-------------------------------------------------------------------------------------
		 * 			value 속성값의 두 가지 타입
		 * 			- 절대 URL : 완전한 URL이다.
		 * 			- 상대 URL : > 웹 애플리케이션 내에서의 절대 경로 : '/' 로 시작하는 경로 (ex) /board/list.jsp
		 * 						> 현재 JSP에 대한 상대 경로 : '/' 로 시작하지 않는다. (ex) ../board/list.jsp
		 * 			웹 애플리케이션 내에서의 절대 경로를 사용할 경우 실제로 생성되는 URL은 컨텍스트 경로를 포함한다.
		 * 
		 * 			13) <c:redirect>
		 * 
		 * 				- 지정한 URL에 리다이렉트한다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			url				|	String		|	리다이렉트 할 URL
		 * 			context			|	String		|	컨텍스트 경로
		 * 			-------------------------------------------------------------------------------------
		 * 
		 * 			14) <c:param>
		 * 
		 * 				- url 내 셋팅 파라미터가 존재하는 경우, <c:param>을 이용해 파라미터를 설정할 수 있다.
		 * 
		 * 				속성			|	타입			|	설명
		 * 			-------------------------------------------------------------------------------------
		 * 			name			|	String		|	파라미터 이름
		 * 			value			|	Object		|	파라미터 값
		 * 			-------------------------------------------------------------------------------------
		 */
	
}

	// c:out escapeXml과 default 속성을 활용한 테그스 (excapeXml 속성의 기본값은 true이다.)
	// default 속성은 전달받은 값이 null인 경우 대체할 값이다.
	@RequestMapping(value = "/home0101", method = RequestMethod.GET)
	public String home0101(Model model) {
		Member member = new Member();
		member.setUserId("<p>hongkd<>&%0101</p>");
		member.setPassword(null);
		model.addAttribute("member", member);
		return "home/jstl/home0101";
	}

[home0101.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0101</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>1) escapeXml 속성의 기본값은 true이고, 특수문자를 변환한다.</p>
		<table border="1">
			<tr>
				<td>member.userId</td>
				<td>${member.userId }</td>
			</tr>
			<tr>
				<td>member.userId</td>
				<td><c:out value="${member.userId }" /></td>
			</tr>
			<!--  
				escapeXml 속성의 기본값은 true이고, 특수문자를 변환하여 출력한다(태그가 포함되어 있다면 태그가 함께나옴)
				escapeXml 속성을 false로 설정하면 태그를 인식하여 출력한다(태그가 태그의 역할을 하도록 출력된다.)
			-->
			<tr>
				<td>member.userId(escapeXml false)</td>
				<td><c:out value="${member.userId }" escapeXml="false" /></td>
			</tr>
			<!--  
				default 속성을 설정하면, 넘어온 값이 null인 경우에 default에 설정되어 있는 값으로 설정된다.
			-->
			<tr>
				<td>member.password</td>
				<td><c:out value="${member.password }" default="12341234" /></td>
			</tr>
		</table>
		
	</body>
</html>

- http://localhost/jstl/home0101


	// c:set을 이용해 값을 출력한다.
	// c:set의 몸체를 값으로 사용하여 출력한다.
	@RequestMapping(value = "/home0201", method = RequestMethod.GET)
	public String home0201(Model model) {
		Member member = new Member();
		member.setUserId("hongkd0201");
		model.addAttribute("member", member);
		return "home/jstl/home0201";
	}

[home0201.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0201</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>2) c:set을 활용해 값을 출력할 수 있다. (몸체에 값을 설정 후 값을 출력할 수 있다.)</p>
		
		<c:set value="${member.userId }" var="id" />
		<table border="1">
			<tr>
				<td>member.userId</td>
				<td>${id }</td>
			</tr>
		</table>
		
		<c:set var="memId">${member.userId }</c:set>
		<table border="1">
			<tr>
				<td>member.userId</td>
				<td>${memId }</td>
			</tr>
		</table>
		
	</body>
</html>

- http://localhost/jstl/home0201


	// c:remove
	// c:set 태그로 지정한 변수 memberId를 삭제한다.
	@RequestMapping(value = "/home0301", method = RequestMethod.GET)
	public String home0301(Model model) {
		Member member = new Member();
		member.setUserId("hongkd0301");
		model.addAttribute("member", member);
		return "home/jstl/home0301";
	}

[home0301.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0301</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>3) c:remove를 이용해 memberId를 삭제한다.</p>
		
		<c:set value="${member.userId }" var="memberId" />
		<table border="1">
			<tr>
				<td>member.userId</td>
				<td>${memberId }</td>
			</tr>
		</table>
		
		<!--  
			[참고]
			세션 처리 시, 작성한 키가 SessionInfo일 때,
			SessionInfo 안에 들어 있는 정보가 member에 해당하는 회원정보 일 때,
			세션 안에 들어 있는 회원 정보를 꺼낼 수 있는 방법은? (EL을 활용)
			${sessionScope.SessionInfo.userId }
		-->
		
		<c:set target="${member }" property="userId" value="hongkildong" />
		<table border="1">
			<tr>
				<td>member.userId</td>
				<td>${member.userId }</td>
			</tr>
		</table>
		
		<c:remove var="memberId"/>
		<p>memberId 변수를 삭제 처리 함...</p>
		
		<table border="1">
			<tr>
				<td>memberId</td>
				<td>${memberId }</td>
			</tr>
		</table>
		
	</body>
</html>

- http://localhost/jstl/home0301


	// c:catch
	// EL 안에서 발생하는 에러 장보는 EL 안에서 처리하도록 되어 있다보니, var 속성에 설정된 변수로 에러정보를 확인할 수 없다.
	@RequestMapping(value = "/home0401", method = RequestMethod.GET)
	public String home0401(Model model) {
		Member member = new Member();
		String[] hobbyArray = {"Music", "Movie"};
		member.setHobbyArray(hobbyArray);
		model.addAttribute("member", member);
		return "home/jstl/home0401";
	}

[home0401.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0401</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>4) c:catch</p>
		
		<c:catch var="ex">
			${member.hobbyArray[3] }
		</c:catch>
		<table border="1">
			<tr>
				<td>에러 발생 내용</td>
				<td>
					<c:if test="${ex != null }">
						${ex }
					</c:if>
				</td>
			</tr>
		</table>
		
	</body>
</html>

- http://localhost/jstl/home0401


	@RequestMapping(value = "/home0402", method = RequestMethod.GET)
	public String home0402(Model model) {
		return "home/jstl/home0402";
	}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0401</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>4) c:catch</p>
		
		<% 
			String[] hobbyArray = {"Music", "Movie"};
		%>
		<c:catch var="ex">
			<%= hobbyArray[3] %>
		</c:catch>
		<table border="1">
			<tr>
				<td>에러 발생 내용</td>
				<td>
					<c:if test="${ex != null }">
						${ex }
					</c:if>
				</td>
			</tr>
		</table>
		
	</body>
</html>

- http://localhost/jstl/home0402


	// c:if
	@RequestMapping(value = "/home0501", method = RequestMethod.GET)
	public String home0501(Model model) {
		Member member = new Member();
		member.setForeigner(true);
		model.addAttribute("member", member);
		return "home/jstl/home0501";
	}
	
	// c:when, c:otherwise
	@RequestMapping(value = "/home0601", method = RequestMethod.GET)
	public String home0601(Model model) {
		Member member = new Member();
		member.setGender("M");
		model.addAttribute("member", member);
		return "home/jstl/home0601";
	}

[home0501.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0501</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>5) c:if</p>
		
		<c:if test="${member.hobbyArray == null }">
			<p>member.hobbyArray == null</p>
		</c:if>
		
		<c:if test="${member.hobbyArray eq null }">
			<p>member.hobbyArray eq null</p>
		</c:if>
		
		<p>test 속성에 true나 false를 값으로 가지는 bool 타입의 변수가 올 수 있다.</p>
		<c:if test="${member.foreigner }">
			<p>member.foreigner == true</p>
		</c:if>
		
	</body>
</html>

- http://localhost/jstl/home0501


[home0601.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0601</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>6) c:when, c:otherwise</p>
		
		<c:choose>
			<c:when test="${member.gender eq 'M' }">
				<p>남자</p>
			</c:when>
			<c:when test="${member.gender eq 'F' }">
				<p>여자</p>
			</c:when>
			<c:otherwise>
				<p>Others</p>
			</c:otherwise>
		</c:choose>
		
	</body>
</html>

- http://localhost/jstl/home0601


	// c:forEach
	@RequestMapping(value = "/home0701", method = RequestMethod.GET)
	public String home0701(Model model) {
		Member member = new Member();
		String[] hobbyArray = {"Music", "Movie"};
		member.setHobbyArray(hobbyArray);
		model.addAttribute("member", member);
		return "home/jstl/home0701";
	}
	
	// c:forTokens
	@RequestMapping(value = "/home0801", method = RequestMethod.GET)
	public String home0801(Model model) {
		Member member = new Member();
		String hobby = "Music, Movie";
		member.setHobby(hobby);
		model.addAttribute("member", member);
		return "home/jstl/home0801";
	}

[home0701.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0701</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>7) c:forEach</p>
		
		<c:forEach items="${member.hobbyArray }" var="hobby">
			${hobby }<br />
		</c:forEach>
		
	</body>
</html>

- http://localhost/jstl/home0701


[home0801.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0801</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>8) c:forTokens</p>
		
		<c:forTokens items="${member.hobby }" delims="," var="hobby">
			${hobby }<br />
		</c:forTokens>
		
	</body>
</html>

- http://localhost/jstl/home0801


	// c:import
	@RequestMapping(value = "/home0901", method = RequestMethod.GET)
	public String home0901(Model model) {
		return "home/jstl/home0901";
	}

[home0901.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0901</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>9) c:import</p>
		
		<p>절대 URL</p>
		<c:import url="http://localhost/board/list" />
		
		<c:import url="http://localhost/board/search">
			<c:param name="keyword" value="orange" />
		</c:import>
		
		<br />
		
		<p>상대 URL - 절대 경로</p>
		<c:import url="http://localhost/board/list" />
		
		<p>상대 URL - 상대 경로</p>
		<c:import url="../../board/list.jsp" />
		
	</body>
</html>

[BoardController.java]

	@RequestMapping(value = "/search", method = RequestMethod.GET)
	public String boardSearch(String keyword, Model model) {
		model.addAttribute("keyword", keyword);
		return "board/search";
	}

[search.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>BOARD</title>
	</head>
	<body>
	
		<h3>SEARCH</h3>
		
		keyword : ${keyword }
		
	</body>
</html>

- http://localhost/jstl/home0901


	// c:redirect
	@RequestMapping(value = "/home1001", method = RequestMethod.GET)
	public String home1001(Model model) {
		return "home/jstl/home1001";
	}

[home1001.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME1001</title>
	</head>
	<body>
		
		<h3>7장 JSP</h3>
		<p>10) c:redirect</p>
		
		<c:redirect url="http://localhost/board/list"></c:redirect>
		
		<!--  
			리다이렉트 된 이후엔 아래 내용을 확인할 수 없기 때문에, c:redirect 태그 이후의 코드는 실행되지 않는다.
		-->
		<p>리다이렉트를 이용하여 list 페이지로 이동합니다.</p>
		<h4>페이지 이동방식 : 리다이렉트</h4>
		
	</body>
</html>

- http://localhost/jstl/home1001


[JSPFmttagController.java]

package kr.or.ddit.controller.jsp;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/fmttag")
public class JSPFmttagController {

	/*
	 * 		7. 숫자 및 날짜 포멧팅 처리 태그
	 * 
	 * 			- 숫자 및 날짜의 포맷팅과 관련된 태그이다.
	 * 			- 문자열을 숫자로, 문자열을 날짜로 변형하여 사용한다.
	 * 
	 * 			1) <fmt:formatNumber>
	 * 
	 * 				- 숫자를 형식화한다.
	 * 
	 * 				속성			|	타입					|	설명
	 * 			-------------------------------------------------------------------------------------
	 * 			value			|	String of Number	|	서식에 맞춰 출력할 숫자
	 * 			type			|	String				|	어떤 서식으로 출력할지를 정한다.
	 * 			pattern			| 	String				|	직접 숫자를 출력할 서식을 지정한다.
	 * 			var				|	Stirng				|	포맷팅한 결과를 지정할 변수이름
	 * 			-------------------------------------------------------------------------------------
	 * 			** type 속성 : number 일 경우 숫자 형식으로, percent일 경우 '%' 형식으로, currency일 경우 통화 형식으로 출력한다.
	 * 			기본 값은 number이다. currency는 속해 있는 국가코드에 맞는 통화 형식이 부여된다.
	 * 
	 * 			2) <fmt:parseNumber>
	 * 
	 * 				- 문자열을 숫자로 변환한다.
	 * 
	 * 				속성			|	타입					|	설명
	 * 			-------------------------------------------------------------------------------------
	 * 			value			|	String				|	파싱할 문자열
	 * 			type			|	String				|	value 속성의 문자열 타입을 지정
	 * 			pattern			|	String				|	파싱할 때 직접 사용할 서식을 지정한다.
	 * 			var				|	String				|	파싱한 결과를 저장할 변수 이름을 지정한다.
	 * 			-------------------------------------------------------------------------------------
	 * 			** type 속성 : number, currency, percent가 올 수 있다.
	 * 
	 * 			3) <fmt:formatDate>
	 * 
	 * 				- Date 객체를 문자열로 변환한다.
	 * 
	 * 				속성			|	타입					|	설명
	 * 			-------------------------------------------------------------------------------------
	 * 			value			|	java.util.Date		|	포맷팅할 날짜 및 시간 값
	 * 			type			|	String				|	날짜, 시간 또는 둘 다 포맷팅 할지의 여부를 지정한다.
	 * 			dateStyle		|	String				|	날짜에 대해 미리 정의된 포맷팅 스타일을 지정한다.
	 * 			timeStyle		|	String				|	시간에 대해 미리 정의된 포맷팅 스타일을 지정한다.
	 * 			pattern			|	String				|	파싱할 때 직접 사용할 서식을 지정한다.
	 * 			var				|	String				|	파싱한 결과를 저장할 변수 이름을 지정한다.
	 * 			-------------------------------------------------------------------------------------
	 * 			** type 속성 : time, date, both 중 한 가지 값을 가질 수 있으며 기본값은 date이다.
	 * 			dateStyle 속성 : default, short, medium, long, full 중 한 가지 값을 가질 수 있으며, 기본값은 default이다.
	 * 			timeStyle 속성 : default, short, medium, long, full 중 한 가지 값을 가질 수 있으며, 기본값은 default이다.
	 * 
	 * 			4) <fmt:parseDate>
	 * 
	 * 				- 문자열을 Date 객체로 변환한다.
	 * 
	 * 				속성			|	타입					|	설명
	 * 			-------------------------------------------------------------------------------------
	 * 			value			|	String				|	파싱할 문자열
	 * 			type			|	String				|	날짜, 시간 또는 둘 다 포맷팅 할지의 여부를 지정한다.
	 * 			dateStyle		|	String				|	날짜에 대해 미리 정의된 포맷팅 스타일을 지정한다.
	 * 			timeStyle		|	String				|	시간에 대해 미리 정의된 포맷팅 스타일을 지정한다.
	 * 			pattern			|	String				|	파싱할 때 직접 사용할 서식을 지정한다.
	 * 			var				|	String				|	파싱한 결과를 저장할 변수 이름을 지정한다.
	 * 			-------------------------------------------------------------------------------------
	 * 			** type 속성 : time, date, both 중 한 가지 값을 가질 수 있으며 기본값은 date이다.
	 * 			dateStyle 속성 : default, short, medium, long, full 중 한 가지 값을 가질 수 있으며, 기본값은 default이다.
	 * 			timeStyle 속성 : default, short, medium, long, full 중 한 가지 값을 가질 수 있으며, 기본값은 default이다.
	 */
	
	
	
}

	// 1) type 속성을 지정하거나 pattern 속성을 지정하여 숫자를 형식화한다.
	@RequestMapping(value = "/home0101", method = RequestMethod.GET)
	public String home0101(Model model) {
		int coin = 100;
		model.addAttribute("coin", coin);
		return "home/fmttag/home0101";
	}

[home0101.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0101</title>
	</head>
	<body>
		
		<h4>1) type 속성을 지정하거나 pattern 속성을 지정하여 숫자를 형식화한다.</h4>
		<p>coin : ${coin }</p>
		<p>currency : <fmt:formatNumber value="${coin }" type="currency" /></p>
		<p>percent : <fmt:formatNumber value="${coin }" type="percent" /></p>
		<p>pattern : <fmt:formatNumber value="${coin }" pattern="000000.00"  /></p>
		
	</body>
</html>

- http://localhost/fmttag/home0101


	// 2) type 속성이 지정되지 않으면 기본값은 number이다.
	@RequestMapping(value = "/home0201", method = RequestMethod.GET)
	public String home0201(Model model) {
		String coin = "1000";
		model.addAttribute("coin", coin);
		return "home/fmttag/home0201";
	}

[home0201.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0201</title>
	</head>
	<body>
		
		<h4>2) type 속성이 지정되지 않으면 기본값은 number이다.</h4>
		<p>coin : ${coin }</p>
		<fmt:parseNumber value="${coin }" var="coinNum" />
		<p>coinNum : ${coinNum }</p>
		
	</body>
</html>

- http://localhost/fmttag/home0201


	// 3) type 속성이 currency이다.
	// 만약, type 속성이 percent인 경우에 넘겨받아야 할 값이 '1000%'과 같이 % 스타일 형태의 값이 넘어가야 한다.
	// 그래서 type 속성과 일치하여 값을 파싱할 수 있다.
	@RequestMapping(value = "/home0202", method = RequestMethod.GET)
	public String home0202(Model model) {
		String coin = "₩1000"; // ㄹ + 한자
		model.addAttribute("coin", coin);
		return "home/fmttag/home0202";
	}

[home0202.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0202</title>
	</head>
	<body>
		
		<h4>3) type 속성이 currency이다.</h4>
		<p>coin : ${coin }</p>
		<fmt:parseNumber value="${coin }" var="coinCurrency" type="currency" />
		<p>coinCurrency : ${coinCurrency }</p>
		
	</body>
</html>

- http://localhost/fmttag/home0202


	// 4) pattern 속성을 사용하여 직접 사용할 서식을 지정한다.
	@RequestMapping(value = "/home0204", method = RequestMethod.GET)
	public String home0204(Model model) {
		String coin = "1,000.25";
		model.addAttribute("coin", coin);
		return "home/fmttag/home0204";
	}

[home0204.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0204</title>
	</head>
	<body>
		
		<h4>4) pattern 속성을 사용하여 직접 사용할 서식을 지정한다.</h4>
		<p>coin : ${coin }</p>
		<fmt:parseNumber value="${coin }" var="coinPattern" pattern="0,000.00" />
		<p>coinPattern : ${coinPattern }</p>
		
	</body>
</html>

- http://localhost/fmttag/home0204


	// 6) type 속성을 date로 지정하여 날짜 포멧팅을 한다.
	// 7) type 속성을 time으로 지정하여 시간 포멧팅을 한다.
	// 8) type 속성을 both로 지정하여 날짜 및 시간 둘 다 포멧팅을 한다.
	@RequestMapping(value = "/home0301", method = RequestMethod.GET)
	public String home0301(Model model) {
		Date date = new Date();
		model.addAttribute("now", date);
		return "home/fmttag/home0301";
	}

[home0301.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0301</title>
	</head>
	<body>
		
		<h4>6) type 속성을 date로 지정하여 날짜 포멧팅을 한다.</h4>
		date default : <fmt:formatDate value="${now }" type="date" dateStyle="default"/><br />
		date short : <fmt:formatDate value="${now }" type="date" dateStyle="short"/><br />
		date medium : <fmt:formatDate value="${now }" type="date" dateStyle="medium"/><br />
		date long : <fmt:formatDate value="${now }" type="date" dateStyle="long"/><br />
		date full : <fmt:formatDate value="${now }" type="date" dateStyle="full"/><br />
		
		<h4>7) type 속성을 time으로 지정하여 시간 포멧팅을 한다.</h4>
		time default : <fmt:formatDate value="${now }" type="time" timeStyle="default"/><br />
		time short : <fmt:formatDate value="${now }" type="time" timeStyle="short"/><br />
		time medium : <fmt:formatDate value="${now }" type="time" timeStyle="medium"/><br />
		time long : <fmt:formatDate value="${now }" type="time" timeStyle="long"/><br />
		time full : <fmt:formatDate value="${now }" type="time" timeStyle="full"/><br />
		
		<h4>8) type 속성을 both로 지정하여 날짜 및 시간 둘 다 포멧팅을 한다.</h4>
		both default : <fmt:formatDate value="${now }" type="both" dateStyle="default" timeStyle="default" /><br />
		both short : <fmt:formatDate value="${now }" type="both" dateStyle="short" timeStyle="short"/><br />
		both medium : <fmt:formatDate value="${now }" type="both" dateStyle="medium" timeStyle="medium"/><br />
		both long : <fmt:formatDate value="${now }" type="both" dateStyle="long" timeStyle="long"/><br />
		both full : <fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full"/><br />
		
	</body>
</html>

- http://localhost/fmttag/home0301


	// 9) pattern 속성을 지정하여 날짜를 포맷팅한다.
	@RequestMapping(value = "/home0304", method = RequestMethod.GET)
	public String home0304(Model model) {
		Date date = new Date();
		model.addAttribute("now", date);
		return "home/fmttag/home0304";
	}

[home0304.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0304</title>
	</head>
	<body>
		
		<h4>9) pattern 속성을 지정하여 날짜를 포맷팅한다.</h4>
		<p>now : ${now }</p>
		<!--  
			y : 년
			M : 월
			d : 일
			H : 시간
			m : 분
			s : 초
			z : 나라 표기 시
			a : 오전/오후
		-->
		pattern1 : <fmt:formatDate value="${now }" pattern="yyyy-MM-dd HH:mm:ss"/><br />
		pattern2 : <fmt:formatDate value="${now }" pattern="a h:mm"/><br />
		pattern3 : <fmt:formatDate value="${now }" pattern="z a h:mm"/><br />
		
	</body>
</html>

- http://localhost/fmttag/home0304


	// 11) dateStyle 속성을 각 스타일로 지정하여 문자열을 Date객체로 변환한다.
	@RequestMapping(value = "/home0402", method = RequestMethod.GET)
	public String home0402(Model model) {
		String dateValueShort = "20. 2. 1"; // style short 형태로 지정
		String dateValueMedium = "2020. 2. 1"; // style medium 형태로 지정
		String dateValueLong = "2019년 2월 1일 (금)"; // style long 형태로 지정
		String dateValueFull = "2019년 2월 1일 금요일"; // style full 형태로 지정
		
		model.addAttribute("dateValueShort", dateValueShort);
		model.addAttribute("dateValueMedium", dateValueMedium);
		model.addAttribute("dateValueLong", dateValueLong);
		model.addAttribute("dateValueFull", dateValueFull);
		
		// 각 dateStyle로 지정한 값이 페이지로 넘어가 parsing이 진행될 때, parseDate내에
		// dateStyle을 각 값과 일치하는 스타일 형태로 지정해주어야 값이 파싱된다.
		
		return "home/fmttag/home0402";
	}

[home0402.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0402</title>
	</head>
	<body>
		
		<h4>11) dateStyle 속성을 각 스타일로 지정하여 문자열을 Date객체로 변환한다.</h4>
		
		<p>dateStyle 속성을 short로 지정하여 문자열을 Date 객체로 변환한다.</p>
		<p>dateValueShort : ${dateValueShort }</p>
		<fmt:parseDate value="${dateValueShort }" type="date" dateStyle="short" var="dateShort" />
		<p>date : ${dateShort }</p>
		
		<p>dateStyle 속성을 medium로 지정하여 문자열을 Date 객체로 변환한다.</p>
		<p>dateValueMedium : ${dateValueMedium }</p>
		<fmt:parseDate value="${dateValueMedium }" type="date" dateStyle="medium" var="dateMedium" />
		<p>date : ${dateMedium }</p>
		
		<p>dateStyle 속성을 long로 지정하여 문자열을 Date 객체로 변환한다.</p>
		<p>dateValueLong : ${dateValueLong }</p>
		<fmt:parseDate value="${dateValueLong }" type="date" dateStyle="long" var="dateLong" />
		<p>date : ${dateLong }</p>
		
		<p>dateStyle 속성을 full로 지정하여 문자열을 Date 객체로 변환한다.</p>
		<p>dateValueFull : ${dateValueFull }</p>
		<fmt:parseDate value="${dateValueFull }" type="date" dateStyle="full" var="dateFull" />
		<p>date : ${dateFull }</p>
		
	</body>
</html>

- http://localhost/fmttag/home0402


	// 12) pattern 속성을 지정하여 문자열을 Date 객체로 변환한다.
	@RequestMapping(value = "/home0403", method = RequestMethod.GET)
	public String home0403(Model model) {
		String dateValue = "2020-02-01 15:00:24";
		model.addAttribute("dateValue", dateValue);
		return "home/fmttag/home0403";
	}

[home0403.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0403</title>
	</head>
	<body>
		
		<h4>12) pattern 속성을 지정하여 문자열을 Date 객체로 변환한다.</h4>
		
		<p>dateValue : ${dateValue }</p>
		<fmt:parseDate value="${dateValue }" pattern="yyyy-MM-dd HH:mm:ss" var="date" />
		<p>date : ${date }</p>
		
	</body>
</html>

 

- http://localhost/fmttag/home0403


[JSPELController.java]

package kr.or.ddit.controller.jsp;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/el")
public class JSPELController {

	/*
	 * 		8. EL함수
	 * 
	 * 			- JSTL의 표현언어(EL)에서 사용할 수 있는 함수를 제공한다.
	 * 
	 * 			fn:contains(str1, str2)
	 *			- 지정한 문자열이 포함되어 있는지 판단한다.
	 *
	 *			fn:containsIgnoreCase(str1, str1)
	 *			- 지정한 문자열이 대문자/소문자를 구분하지 않고 포함되어 있는지 판단한다.
	 *
	 *			fn:startsWith(str1, str2)
	 *			- 지정한 문자열로 시작하는지 판단한다.
	 *
	 *			fn:endsWith(str1, str2)
	 *			- 지정한 문자열로 끝나는지 판단한다.
	 *
	 *			fn:indexOf(str1, str2)
	 *			- 지정한 문자열이 처음 나왔을 때의 인덱스를 구한다.
	 *
	 *			fn:length(obj)
	 *			- 컬렉션 또는 배열의 요소 개수, 문자열 길이를 구한다.
	 *
	 *			fn:escapeXml(str)
	 *			- 지정한 문자열을 XML 구문으로 해석되지 않도록 이스케이프한다.
	 *
	 *			fn:replace(str, src, dest)
	 *			- 문자열을 치환한다.
	 *
	 *			fn:toLowerCase(str)
	 *			- 문자열을 소문자로 변환한다.
	 *
	 *			fn:toUpperCase(str)
	 *			- 문자열을 대문자로 변환한다.
	 *
	 *			fn:trim(str)
	 *			- 문자열을 trim한다. (공백제거)
	 *
	 *			fn:substring(str, idx1, idx2)
	 *			- 지정한 범위에 해당하는 문자열을 잘라낸다.
	 *
	 *			fn:substringAfter(str1, str2)
	 *			- 지정한 문자열에 일치하는 이후의 문자열을 잘라낸다.
	 *
	 *			fn:substringBefore(str1, str2)
	 *			- 지정한 문자열에 일치하는 이전의 문자열을 잘라낸다.
	 *
	 *			fn:join(array, str2)
	 *			- 문자열을 구분자로 분할해서 하나의 문자열로 만든다.
	 *
	 *			fn:split(str1, str2)
	 *			- 문자열을 구분자로 분할해서 문자열 배열을 만든다.
	 */
	
	@RequestMapping(value = "/home0101", method = RequestMethod.GET)
	public String home0101(Model model) {
		String str = "<font>Hello World!</font>";
		model.addAttribute("str", str);
		return "home/el/home0101";
	}
	
}

[home0101.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>HOME0101</title>
	</head>
	<body>
		
		<p>str : ${str }</p>		
		<p>contains : ${fn:contains(str, 'Hello') }</p>
		<p>containsIgnoreCase : ${fn:containsIgnoreCase(str, 'Hello') }</p>
		<p>startsWith : ${fn:startsWith(str, 'Hello') }</p>
		<p>endsWith : ${fn:endsWith(str, 'World!') }</p>
		<p>indexOf : ${fn:indexOf(str, 'World!') }</p>
		<p>length : ${fn:length(str) }</p>
		<p>escapeXml : ${fn:escapeXml(str) }</p>
		<p>replace : ${fn:replace(str, 'Hello', 'Hi') }</p>
		<p>toLowerCase : ${fn:toLowerCase(str) }</p>
		<p>toUpperCase : ${fn:toUpperCase(str) }</p>
		<p>trim : ${fn:trim(str) }</p>
		<p>substring : ${fn:substring(str, 7, 12) }</p>
		<p>substringAfter : ${fn:substringAfter(str, 'World!') }</p>
		<p>substringBefore : ${fn:substringBefore(str, 'World!') }</p>
		<p>split : ${fn:split(str, ' ') }</p>
		
		<c:set value="${fn:split(str, ' ') }" var="strArray" />
		<p>join : ${fn:join(strArray, '-') }</p>
		
	</body>
</html>

- http://localhost/el/home0101


 

'대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231128_SPRING 2 (5-1)  (0) 2023.11.28
231127_SPRING 2 (4-2)  (0) 2023.11.27
231124_SPRING 2 (3-2)  (1) 2023.11.24
231124_SPRING 2 (3-1)  (2) 2023.11.24
231123_SPRING 2 (2-3) 과제  (0) 2023.11.23