- <c:out> 태그
출력문을 만드는 태그다. 문법은 다음과 같다.
● 문법
<c:out value="출력할 값" default="기본값"/>
또는
<c:out value="출력할 값">기본값</c:out>
value 속성의 값으로 EL 표현식을 사용할 수 있다. value 값이 null이면, 기본값이 출력된다. 기본값마저 없다면 빈 문자열이 출력된다. 다음 예제 코드를 JSP 페이지에 넣고 테스트한다.
<%//<c:out>태그 예제%>
1) <c:out value="안녕하세요!"/><br>
2) <c:out value="${null}">반갑습니다.</c:out><br>
3) <c:out value="안녕하세요!">반갑습니다.</c:out><br>
4) <c:out value="${null}"></c:out><br>
앞의 코드를 실행한 결과는 다음과 같다(그림 1).
- <c:set> 태그
<c:set> 태그는 변수를 생성하거나 기존 변수의 값을 덮어쓸 때 사용한다. 이 태그로 생성한 변수는 JSP 페이지의 로컬 변수가 아니라 보관소(JspContext, ServletRequest, HttpSession, ServletContext)에 저장된다.
● 문법
<!-- value 속성을 사용하여 값 설정 -->
<c:set var="변수명" value="값" scope="page|request|session|application"/>
<!-- 태그 콘텐츠를 사용하여 값 설정 -->
<c:set var="변수명" scope="page|request|session|application">값</c:set>
scope 속성의 기본값은 page 이다. scope를 생략하면 JspContext(page)에 변수명으로 값이 저장된다.
<%//<c:set>태그 예제%>
<h3>값 설정 방식</h3>
<c:set var="username1" value="홍길동"/>
<c:set var="username2">임꺽정</c:set>
1) ${username1}<br>
2) ${username2}<br>
<h3>기본 보관소 - page</h3>
3) ${pageScope.username1}<br>
4) ${requestScope.username1}<br>
<h3>보관소 지정 - scope 속성</h3>
<c:set var="username3" scope="request">일지매</c:set>
5) ${pageScope.username3}<br>
6) ${requestScope.username3}<br>
<h3>기존의 값 덮어씀</h3>
<%pageContext.setAttribute("username4", "똘이장군");%>
7) 기존 값 = ${username4}<br>
<c:set var="username4" value="주먹대장"/>
8) 덮어쓴 값 = ${username4}<br>
앞의 코드의 실행 결과를 본다(그림 2).
1), 2)는 변수를 생성하는 기본 문법을 테스트한 것이다. value 속성으로 값을 설정할 수 있고, 태그 콘텐츠로도 값을 설정할 수 있다.
3), 4)는 변수가 저장되는 기본 보관소가 어디인지 확인하는 코드이다. scope가 생략되면 기본적으로 JspContext(page)에 저장된다는 것을 알 수 있다.
5), 6)은 scope를 명시적으로 지정할 경우이다. username3의 값을 ServletRequest(request)에 저장하기 때문에, 꺼낼 때는 request에서 꺼내야 한다. 다른 보관소에는 저장되어 있지 않기 때문에 찾을 수 없다.
7), 8)은 보관소에 저장되어 있던 기존 값을 덮어쓴 경우이다. <c:set> 태그의 var 값이 이미 보관소에 있는 이름일 경우, 그 이름으로 저장된 값을 덮어쓴다.
- <c:set> 태그를 이용한 객체의 프로퍼티 값 설정
<c:set>을 이용하면, 보관소에 저장된 객체의 프로퍼티 값도 바꿀 수 있다.
<%//<c:set>태그를 이용한 객체의 프로퍼티 값 설정 예제%>
<%!
public static class MyMember {
int no;
String name;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
%>
<%
MyMember member = new MyMember();
member.setNo(100);
member.setName("홍길동");
pageContext.setAttribute("member", member);
%>
9) ${member.name}<br>
<c:set target="${member}" property="name" value="임꺽정"/>
10) ${member.name}<br>
'MyMember'라는 내장 클래스(Inner Class)를 새로 생성했다. 기존의 Member 클래스를 사용하지 않고 새로 만든 이유는, Member 클래스에 정의된 셋터 메서드(Setter Method)의 리턴 타입이 void가 아니기 때문이다.
<c:set>을 사용하여 객체의 프로퍼티 값을 설정할 때는 안타깝게도 셋터 메서드의 리턴 타입이 void 이어야 한다. Member 클래스처럼 셋터 메서드의 리턴 타입이 void가 아니라면, "프로퍼티에 해당하는 셋터 메서드를 찾을 수 없다."라는 예외가 발생한다. 셋터 메서드의 리턴 타입을 void로 할 것인지, 아니면 해당 객체의 주소를 리턴하게 할 것인지는 사용자의 선택이다.
예제 코드에서는 MyMember 내장 클래스를 정의한 후, JSP 페이지에서 객체를 생성한다. 그리고 JspContext에 저장한다.
pageContext.setAttribute("member", member);
다음의 9), 10)의 출력은 JspContext 보관소에 저장된 객체의 프로퍼티 값을 바꾸는 코드를 실행한 결과다(그림 3).
이렇게 <c:set> 태그를 사용하면 임의의 이름으로 보관소에 값을 저장할 수 있고, 기존에 저장된 값을 손쉽게 변경할 수 있다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
59. JSTL 사용하기 (4) (0) | 2022.07.03 |
---|---|
58. JSTL 사용하기 (3) (0) | 2022.06.30 |
56. JSTL 사용하기 (1) (0) | 2022.06.28 |
55. EL 사용하기 (4) (0) | 2022.06.27 |
54. EL 사용하기 (3) (0) | 2022.06.26 |
댓글