본문 바로가기

학원/복기

[MVC] JSTL(Java Standard Tag Library) / Core 라이브러리

JSTL(Java Standard Tag Library)

 
JSTL은 JSP 문서에서 많이 사용되는 EL 함수와 커스텀 태그를 제공하기 위한 라이브러리를 뜻한다.
JSP 문서에서 JSTL이 제공하는 EL 함수 또는 커스텀 태그를 사용하기 위해서는 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리해야한다. - https://tomcat.apache.org 사이트 참조
 
 

Download >> Taglibs

4개의 jar 파일을 다운로드 받아 빌드처리하기
 

 
 
JSTL이 제공하는 라이브러리 파일 종류 

  • Core : EL 지원 태그, 프로그램의 흐름을 제어 태그, URL 주소 관리하는 태그등을 제공
  • Formatter : 숫자 또는 날짜와 시간의 형식을 변경 태그, 국제화 태그, 다국어 지원 태그등을 제공
  • SQL : 테이블에 대한 행 삽입,변경,삭제,검색 기능의 태그 제공
  • XML : XML 문서에 대한 처리 기능의 태그 제공
  • Functions : 문자열 처리 기능의 EL 함수 제공
     

Core 태그 라이브러리

 

[core_set.jsp]
 
taglib 디렉티브를 사용하여 JSTL의 Core 태그 라이브러리를 JSP 문서에 포함해야만 Core 태그 라이브러리의 커스텀 태그를 제공받아 사용이 가능하다.
→ Core 태그 라이브러리의 prefix 속성값은 [c] 로 설정하면 된다.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Set 태그 

set 태그는 스코프 객체의 속성값으로 객체를 저장(변경)하기 위한 태그이다.


 - var 속성 : 스코프 객체에 저장될 속성값을 구분하기 위한 속성명을 속성값으로 설정한다.
 - value 속성 : 스코프 객체에 저장될 속성값(객체)을 태그 속성값으로 설정한다.
 - scope 속성 : 스코프 객체에 저장된 속성값의 사용범위를 태그 속성값으로 설정한다.
   → page, request , session , application 스코프 중 하나를 속성값으로 설정하면 된다.
   → scope 속성은 생략이 가능하다. scope 속성을 생략하면 [page] 속성값을 기본값으로 사용한다.
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - EL 지원 태그</h1>
	<hr>
	<c:set var="su" value="10" scope="page"></c:set>
	<p>su = ${su }</p>
</body>
</html>

 

 
value 속성 대신 태그 내용을 사용하여 스코프 객체에 저장될 속성값을 설정할 수 있다.
스코프 객체의 속성명이 같은 경우 스코프 객체의 속성값은 변경 처리 된다.
 

	<c:set var="su" value="10" scope="page"></c:set>
	<p>su = ${su }</p>
	
	<c:set var="su">20</c:set>
	<p>su = ${su }</p>

 

 
set 태그의 value 속성값으로 EL을 이용하여 값을 제공받아 속성값으로 저장이 가능하다.
EL 표현식에서 EL 연산자를 사용하여 처리하는 것이 가능하다.
 

<c:set var="tot" value="${su + 10 }"/>
<p>tot = ${tot }</p>

 
문자값도 저장이 가능하다.

<c:set var="name" value="홍길동"/>
<p>name = ${name }</p>

 
EL 표현식으로 제공받은 스코프 객체의 속성값이 Java 객체인 경우 자동으로 toString() 메소드를 호출하여 반환받은 문자열을 제공받아 출력 처리 할 수 있다.

<c:set var="now" value="<%=new Date() %>"/>
<p>now = ${now }</p>
<p>now.getTime() = ${now.getTime() }</p><!-- date 객체가 가지고 있는 타임스탬프 반환 -->
<p>now.time = ${now.time }</p><!-- get 생략 가능 -->

 


 
Student 클래스 선언
 

package xyz.itwill.jstl;

public class Student {
	private int num;
	private String name;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

 
 
[core_set.jsp]
 
Student 클래스의 toString() 메소드를 오버라이드 선언하지 않은 경우 Object 클래스의 toString() 메소드가 호출된다. 따라서 객체의 메모리 주소(Hash Code)가 반환된다.

<c:set var="student" value="<%=new Student() %>"/>
<p>student = ${student }

 
EL 표현식에 의해 Java 객체의 필드값을 제공받아 출력 처리한다. - Getter 메소드 자동 호출
EL에서 null 값은 출력되지 않는다.

<p>학번 = ${student.num }, 이름 = ${student.name }</p>

 
 
set 태그를 사용하여 스코프 객체에 저장된 속성값(객체)의 필드값 변경이 가능하다. - Setter 메소드 자동 호출
 
target 속성 : 필드값을 변경할 객체를 속성값으로 설정한다.
→  EL을 사용하여 스코프 객체의 속성값(객체)을 제공받아 사용할 수 있다. 
property : 필드값을 변경할 객체의 필드명을 속성값으로 설정한다. 
value : 필드값으로  변경될 객체를 태그 속성값으로 설정한다. 
 

<c:set target="${student }" property="num" value="1000"/>
<c:set target="${student }" property="name" value="홍길동"/>
<p>학번 = ${student.num }, 이름 = ${student.name }</p>

 

remove 태그

remove 태그는 스코프 객체에 저장된 속성값을 삭제하는 태그이다.

<c:remove var="student"/>
<p>student = ${student }

 
이처럼 set 태그를 이용해 scope 객체의 속성값으로 저장이나 변경할 수 있고 remove 태그는 제거할 때 사용한다.
 
 


out 태그

out 태그는 스코프 객체의 속성값을 제공받아 출력 처리하기 위한 태그이다.


 
[core_out.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - EL 지원 태그</h1>
	<hr>
	<c:set var="num" value="100"/>
	<p>정수값 = ${num }</p>
	
	<p>정수값 = <c:out value="${num }"/></p>
</body>
</html>

 

 

 

스코프 객체의 속성값으로 HTML 태그가 포함된 문자열 저장하고 EL을 사용하여 스코프 객체의 속성값으로 HTML 태그가 포함된 문자열을 제공받아 출력 처리할 경우 HTML 태그로 인식되어 출력된다. 

<c:set var="html" value="<font size='7' color='red'>안녕하세요.</font>"/>
<p>html = ${html }</p>

 
out 태그를 사용하여 스코프 객체의 속성값으로 HTML 태그가 포함된 문자열을 제공받아 출력할 경우 HTML 태그도 문자로 인식되어 출력처리 한다.
out 태그를 사용해 XSS 해킹 기술을 방어할 수 있다.

<c:set var="html" value="<font size='7' color='red'>안녕하세요.</font>"/>
<p>html = <c:out value="${html }"/></p>


흐름 제어 태그 

 

if 태그


if 태그는 조건에 대한 결과에 따라 태그내용 포함 여부를 선택하는 태그이다.
 - test 속성 : false 또는 true 중 하나를 속성값으로 설정
  → test 속성값이 [false]인 경우 태그내용을 포함하지 않고 [true]인 경우에만 태그내용 포함
  → test 속성값으로 스코프 객체의 속성값을 제공받아 사용이 가능하다. 
 
 
[core_if.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - 흐름 제어 태그</h1>
	<hr>
	<c:if test="true">
		<p>test 속성값이 [true]인 경우 태그내용 출력-1</p>
	</c:if>
	
	<c:if test="false">
		<p>test 속성값이 [true]인 경우 태그내용 출력-2</p>
	</c:if>
	
	<c:set var="result" value="true"/>
	<!-- test 속성값으로 스코프 객체의 속성값을 제공받아 사용이 가능 -->
	<c:if test="${result }">
		<p>test 속성값이 [true]인 경우 태그내용 출력-3</p>
	</c:if>
</body>
</html>

test 속성값으로 EL 사용시, EL 표현식에서 EL 연산자(비교 연산자, empty 연산자)를 사용하여 [false] 또는 [true] 중 하나를 제공받아 사용 가능하다.

<c:set var="num" value="10"/>
<c:if test="${num % 2 != 0}">${num } = 홀수</c:if>
<c:if test="${num % 2 == 0}">${num } = 짝수</c:if>
<hr>
<c:set var="num" value="11"/>
<c:if test="${num mod 2 ne 0}">${num } = 홀수</c:if>
<c:if test="${num mod 2 eq 0}">${num } = 짝수</c:if>

 

	<c:set var="score" value="80"/>
	<c:if test="${score <= 100 && score >= 0}">${score }점은 정상적인 점수입니다.</c:if>
	<c:if test="${score > 100 || score < 0}">${score }점은 비정상적인 점수입니다.</c:if>
	<hr>
	<c:set var="score" value="800"/>
	<c:if test="${score <= 100 && score >= 0}">${score }점은 정상적인 점수입니다.</c:if>
	<c:if test="${score > 100 || score < 0}">${score }점은 비정상적인 점수입니다.</c:if>
	
	<!-- 문자로 표현 -->
	<hr>
	<c:if test="${score le 100 and score ge 0}">${score }점은 정상적인 점수입니다.</c:if>
	<c:if test="${score gt 100 or score lt 0}">${score }점은 비정상적인 점수입니다.</c:if>

 

 

<c:set var="name" value="홍길동"/>
<c:if test="${empty(name) }">
	<p>name 속성명으로 저장된 속성값이 없거나 비어 있습니다.</p>
</c:if>
<c:if test="${!empty(name) }">
	<p>name 속성명으로 저장된 속성값이 [${name }]입니다.</p>
</c:if>

 


choose 태그

choose 태그는 조건에 대한 결과에 따라 태그 내용의 포함여부를 선택하기 위한 상위태그 
→  하위태그를 사용하여 태그내용 포함 여부를 선택한다.
 
choose 태그의 하위태그 : when 태그, otherwise 태그 
when 태그는 하위태그로 1개 이상, otherwise태그는 0개 또는 1개를 만들어 줄 수 있다.
 
[core_choose.jsp]
 
choose 태그의 하위태그를 제외한 다른 코드가 존재할 경우 에러가 발생한다.

<c:choose>
	<!-- 에러 발생 -->
</c:choose>

 
단, <%-- --%> 주석은 사용 가능하다.
 
 
when 태그 : 조건에 대한 결과로 태그내용 포함 여부를 선택하기 위한 태그
 - test 속성 : false 또는 true 중 하나를 속성값으로 설정한다. - 태그 속성값으로 EL 사용이 가능하다.
   → test 속성값이 [true]인 경우 태그내용을 포함하고 choose 태그를 종료한다.

<c:set var="choice" value="1"/>
<c:choose>
	<%-- 에러 미발생 --%>
	<c:when test="${choice == 1 }">
		<p>수성으로 이동합니다.</p>
	</c:when>
	<c:when test="${choice == 2 }">
		<p>금성으로 이동합니다.</p>
	</c:when>
	<c:when test="${choice == 3 }">
		<p>화성으로 이동합니다.</p>
	</c:when>
</c:choose>

oherwise 태그 : when 태그의 모든 조건이 거짓인 경우 태그내용을 무조건 포함시키기 위한 태그

<c:set var="choice" value="1"/>
<c:choose>
	<%-- 에러 미발생 --%>
	<c:when test="${choice == 1 }">
		<p>수성으로 이동합니다.</p>
	</c:when>
	<c:when test="${choice == 2 }">
		<p>금성으로 이동합니다.</p>
	</c:when>
	<c:when test="${choice == 3 }">
		<p>화성으로 이동합니다.</p>
	</c:when>
    <c:otherwise>
		<p>지구로 이동합니다.</p>
	</c:otherwise>
</c:choose>

 
otherwise를 이용해 if-else문 형식으로 만들 수 있다

<c:set var="num" value="10"/>
<c:choose>
	<c:when test="${num % 2 != 0}">${num } = 홀수</c:when>
	<c:otherwise>${num } = 짝수</c:otherwise>
</c:choose>

 


[core_choose_form.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - 흐름 제어 태그</h1>
	<hr>
	<form action="core_choose_action.jsp" method="post">
		점수입력 : <input type="text" name="score">
		<button type="submit">제출</button>
	</form>
</body>
</html>

 
[core_choose_action.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - 흐름 제어 태그</h1>
	<hr>
	<c:choose>
		<c:when test="${!empty(param.score) }">
			<p>입력점수 = ${param.score }점</p>
			<c:choose>
				<c:when test="${param.score <= 100 && param.score >= 90 }">
					<c:set var="grade" value="A"/>
				</c:when>
				<c:when test="${param.score <= 89 && param.score >= 80 }">
					<c:set var="grade" value="B"/>
				</c:when>
				<c:when test="${param.score <= 79 && param.score >= 70 }">
					<c:set var="grade" value="C"/>
				</c:when>
				<c:when test="${param.score <= 69 && param.score >= 60 }">
					<c:set var="grade" value="D"/>
				</c:when>
				<c:otherwise>
					<c:set var="grade" value="F"/>
				</c:otherwise>
			</c:choose>
			<p>${param.score }점은 ${grade } 학점입니다.</p>			
		</c:when>
		<c:otherwise>
			<p style="color: red;">입력페이지에서 점수를 반드시 입력해 주세요.</p>
			<a href="core_choose_form.jsp">입력페이지 이동</a>
		</c:otherwise>
	</c:choose>
</body>
</html>


forEach 태그

 

forEach 태그는 태그내용을 반복적으로 포함하기 위한 태그이다.
 - var 속성 : 스코퍼 객체에 저장된 속성값(객체)의 속성명을 설정하기 위한 설정 
 - begin 속성 : 스코프 객체에 저장될 시작값(Integer)을 속성값으로 설정
 - end 속성 : 스코프 객체에 저장될 종료값(Integer)을 속성값으로 설정
 - step 속성 : 스코프 객체에 저장될 증가값(Integer)을 속성값으로 설정
 
[core_forEach.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - 흐름 제어 태그</h1>
	<hr>
	<!-- 태그 내용이 5번 포함 -->
	<c:forEach var="i" begin="1" end="5" step="1">
		<p>${i }번째 출력되는 내용입니다.</p>
	</c:forEach>
</body>
</html>

 
1~100 범위의 정수들의 합계를 계산하여 출력하기

<c:forEach var="i" begin="1" end="100" step="1">
	<c:set var="tot" value="${tot + i }"/>
</c:forEach>
<p>1~100 범위의 정수들의 합계 = ${tot }</p>

 
구구단을 표(Table) 형식으로 출력하기

<table>
	<c:forEach var="i" begin="1" end="9" step="1">
		<tr>
		<c:forEach var="j" begin="2" end="9" step="1">
			<td width="100">${j } * ${i } = ${i*j }</td>
		</c:forEach>
	</c:forEach>
</table>

 


Student 클래스

package xyz.itwill.jstl;

public class Student {
	private int num;
	private String name;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}
	
	public Student(int num, String name) {
		super();
		this.num = num;
		this.name = name;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 
 
core_forEach_one.jsp

<%@page import="java.util.ArrayList"%>
<%@page import="xyz.itwill.jstl.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String[] nameArray={"홍길동","임꺽정","전우치","일지매","장길산"};
	request.setAttribute("nameArray", nameArray);
	
	List<Student> studentList=new ArrayList<>();
	studentList.add(new Student(1000,"홍길동"));
	studentList.add(new Student(2000,"임꺽정"));
	studentList.add(new Student(3000,"전우치"));
	studentList.add(new Student(4000,"일지매"));
	studentList.add(new Student(5000,"장길산"));
	request.setAttribute("studentList", studentList);
	
	request.getRequestDispatcher("core_forEach_two.jsp").forward(request, response);
%>

 
core_forEach_two.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - 흐름 제어 태그</h1>
	<hr>
	<ul>
		<li>${nameArray[0] }</li>
		<li>${nameArray[1] }</li>
		<li>${nameArray[2] }</li>
		<li>${nameArray[3] }</li>
		<li>${nameArray[4] }</li>
	</ul>
</body>
</html>

 
[core_forEach_two.jsp]
 
일괄처리하기

<ul>
<c:forEach var="i" begin="0" end="4" step="1">
	<li>${nameArray[i] }</li> 
</c:forEach>
</ul>

같은 결과 출력

 
forEach 태그를 사용하여 스코프 객체의 속성값으로 제공된 배열 또는 콜렉션 객체의 요소를 하나씩 얻어와 반복 처리하는 기능을 구현할 수 있다.
 - var 속성 : 배열 또는 콜렉션 객체의 요소값을 제공받아 스코프 객체의 속성값으로 저장하기 위한 속성명을 속성값으로 설정한다.
 - items 속성 : 반복 처리할 배열 또는 콜렉션 객체를 속성값으로 설정한다. 
   → EL을 사용하여 스코프 객체의 속성값으로 배열 또는 콜렉션 객체를 제공받아 사용할 수 있다. 

<ul>
<c:forEach var="name" items="${nameArray }">
	<li>${name }</li>
</c:forEach>
</ul>

같은 결과 출력

 

<c:forEach var="student" items="${studentList }">
	<div>학번 = ${student.num }, 이름 = ${student.name }</div>
</c:forEach>

 
 


forTokens 태그

forTokens 태그는 스코프 객체에 저장된 속성값(문자열)을 특정 문자열로 분리하여 반복 처리하는 태그이다.
 - items 속성 : 분리 처리하기 위한 문자열을 속성값으로 설정
   → EL을 사용하여 스코프 객체의 속성값을 문자열(String 객체)로 제공받아 사용 가능 
 - delims 속성 : 문자열을 분리하기 위한 구분자(문자열)을 속성값으로 설정 
 - var 속성 : 분리된 문자열을 하나씩 얻어와 스코프 객체의 속성값으로 저장하기 위한 속성명을 속성값으로 설정
 
[core_forTokens.jsp]

<c:forTokens items="${phone }" delims="-" var="num">
	<div>${num }</div>
</c:forTokens>

 


URL 관리 태그

import 태그 

 

import 태그는 다른 웹프로그램을 요청하여 응답결과를 응답받아 포함하는 태그이다.
→ JSP의 include 태그와 유사한 기능을 제공한다.
 - url 속성 : import 태그로 요청할 웹프로그램의 URL 주소를 속성값으로 설정 
 
[core_import_source.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core -  URL 관리 태그</h1>
	<hr>
	<p>core_import_source.jsp 문서의 응답 결과입니다.</p>
	
	<c:import url="core_import_target.jsp"></c:import>
</body>
</html>

 
[core_import_target.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core -  URL 관리 태그</h1>
	<hr>
	<p>core_import_target.jsp 문서의 응답 결과입니다.</p>
</body>
</html>

core_import_source,jsp 출력결과

 
 
JSP include 태그 import 태그의 차이점

: JSP include 태그는 현재 서버의 웹프로그램을 요청하여 실행결과를 응답받아 포함하지만 import 태그는 다른 서버의 웹프로그램을 요청하여 실행결과를 응답받아 포함한다.
 


param 태그

 param 태그 : 요청 웹프로그램에게 값을 전달하기 위한 태그
→ URL 관리 태그의 하위태그로 사용한다.
 
import 태그에 param 태그 외 다른 코드가 존재할 경우 에러가 발생하기 때문에 주의해야 한다.  (JSP 주석은 예외)

<c:import url="core_import_target.jsp">
	<c:param name="name" value="홍길동"/>
</c:import>

 
[core_import_target.jsp] 에서 값 가져오기

<p>${param.name }님, 안녕하세요.</p>

 

core_import_source,jsp 출력결과

 

 

redirect 태그

 

redirect태그는 클라이언트에게 URL 주소를 전달하여 응답하는 태그이다.

URL 주소를 응답받은 클라이언트는 브라우저의 URL 주소를 변경하여 요청 처리한다.

url 속성 : 클라이언트에게 전달할 URL 주소를 속성값으로  설정

 

 

[core_redirect_form.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - URL 관리 태그</h1>
	<hr>
	<form action="core_redirect_action.jsp" method="post">
		이름 : <input type="text" name="name">
		<button type="submit">제출</button>
	</form>
</body>
</html>

[core_redirect_action.jsp]
 

url 속성에는 클라이언트에게 전달할 URL 주소를 속성값으로  설정하면 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - URL 관리 태그</h1>
	<hr>
	<c:choose>
		<c:when test="${!empty(param.name) }">
			<p>${param.name }님, 안녕하세요.</p>
		</c:when>
		<c:otherwise>
			<c:redirect url="core_redirect_form.jsp"/>
		</c:otherwise>
	</c:choose>
</body>
</html>

'홍길동' 이라는 값을 전달하면 이처럼 한글이 깨져서 출력된다.

이때 formatter 태그 라이브러리를 사용하면 값이 올바르게 출력된다.

<%--formatter 태그 라이브러리를 JSP 문서에 포함 - 접두사로 [fmt] 사용 --%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

 

requestEncoding 태그

requestEncoding 태그는 POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋을 변경하는 태그이다.

 - value 속성 : 변경할 문자형태(CharacterSet)에 대한 인코딩 방식을 속성값으로 설정한다.

<fmt:requestEncoding value="utf-8"/>

 

정상적으로 출력되는 것을 확인할 수 있다.

 


필터...


 

 

 

[core_url.jsp]

 

웹자원의 경로를 상대경로로 표현하여 제공해보자.

상대경로는 요청웹프로그램의 경로를 기준으로 웹자원의 경로를 표현하는 방법이다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Core - URL 관리 태그</h1>
	<hr>
	<!-- 웹자원의 경로를 상대경로로 표현하여 제공 -->
	<img src="images/Koala.jpg" width="200">
</body>
</html>

하지만 상대경로를 사용하면 MVC 디자인 패턴을 이용한 JSP Model-2 방식의 웹프로그램 작성시 요청 웹프로그램 (컨트롤러)의 경로와 응답 웹프로그램(뷰)의 경로가 다른 경우 404 에러가 발생할 가능성이 있다는 문제점이 있다.

 

 

이를 해결하기 위해서는 웹자원의 경로를 절대경로로 표현하여 제공하면 된다.

 

절대경로는 최상위 디렉토리를 기준으로 웹자원의 경로를 표현하는 방법이다. 

<img src="/mvc/jstl/images/Koala.jpg" width="200">

 

하지만 절대경로도 마찬가지로 문제점이 발생할 수 있다.

컨텍스트의 이름이 변경될 경우 컨텍스트의 경로(예시의 경우 /mvc 부분)가 변경되어 404 에러가 발생할 수 있기 때문이다.

 

이를 해결하기 위해서는 컨텍스트 경로를 제공받아 웹자원의 경로를 절대경로로 표현해야 한다.

<!--request.getContextPath() 메소드를 호출하여 컨텍스트 경로를 반환받아 절대경로로 표현-->
<img src="<%=request.getContextPath() %>/jstl/images/Koala.jpg" width="200">

 

 

EL 표현식에서 pageContext 내장객체를 사용하여 컨텍스트 경로를 제공받아 절대경로로 표현할 수 있다.

<img src="${pageContext.request.contextPath}/jstl/images/Koala.jpg" width="200">

 

core 라이브러리의 url 태그를 사용하여 표현하는 것도 가능하다.

 

url 태그

url 태그는 컨텍스트 경로가 포함된 웹자원의 절대경로를 제공하는 태그이다.

 - value 속성 : 컨텍스트 경로를 제외한 웹자원의 절대경로를 속성값으로 설정한다.

<img src="<c:url value="/jstl/images/Koala.jpg"/>"width="200">

가장 깔끔한 방법.

 

 

 

 

 

'학원 > 복기' 카테고리의 다른 글

[MVC] Functions 태그 라이브러리  (0) 2023.07.16
[MVC] Formatter 태그 라이브러리  (0) 2023.07.16
[MVC] 커스텀 태그(Cutom Tag)  (0) 2023.07.14
[MVC] EL 연산자  (0) 2023.07.13
[MVC] TLD 파일 / EL 함수  (0) 2023.07.13