톰캣 다운 받을 시 받았던 파일에서 lib 폴더로 가 위의 두 파일을 복사하여
[WEB-INF]-[lib] 에 넣는다.
Web App Libraries에 여러 jar 파일이 추가된 것을 볼 수 있다.
JSTL
JSP는 개발자가 직접 <jsp:include>와 같이 태그를 작성할 수 있는 기능을 제공하는데 이를 커스텀 태그라고 한다. 커스텀 태그 중에서 가장 많이 사용되는 것들을 모아서 JSTL이라는 규약을 만들었다. JSP페이지에서 논리적인 판단, 반복문의 처리, 데이터 베이스등의 처리를 하는 코드를 깔끔하게 작성하기 위해서 커스텀 태그를 작성해왔는데, 이런 중복되는 노력을 없애기 위해서 나온 것이 바로 JSTL(JSP Standard Tag Library)이다.
코어태그(p.479)
>JSTL이 제공하는 태그의 종류
라이브러리 |
하위기능 |
접두어 |
관련 URI |
코어 |
변수 지원
흐름 제어
URL 처리 |
c |
http://java.sun.com/jsp/jstl/core |
XML |
XML 코어
흐름 제어
XML 변환 |
x |
http://java.sun.com/jsp/jstl/xml |
국제화 |
지역
메시지 형식
숫자 및 날짜 형식 |
fmt |
http://java.sun.com/jsp/jstl/fmt |
데이터베이스 |
SQL |
sql |
http://java.sun.com/jsp/jstl/sql |
함수 |
컬렉션 처리 |
fn |
http://java.sun.com/jsp/jstl/function |
※이번 프로젝트에서는 코어를 중심으로 사용.
>코어 태그 라이브러리
기능분류 |
태그 |
설명 |
변수지원 |
set |
JSP에서 사용될 변수를 설정한다. |
remove |
설정한 변수를 제거한다. |
흐름제어 |
if |
조건에 따라 내부 코드를 수행한다. |
choose |
다중 조건을 처리할 때 사용된다. |
forEach |
컬렉션이나 Map의 각 항목을 처리할 때 사용된다. |
forTokens |
구분자로 분리된 각각의 토큰을 처리할 때 사용된다. |
URL처리 |
import |
URL을 사용하여 다른 자원의 결과를 삽입한다. |
redirect |
지정한 경로로 리다이렉트 한다. |
url |
URL을 재작성한다. |
기타 태그 |
catch |
예외 처리에 사용된다. |
out |
JspWriter에 내용을 알맞체 처리한 후 출력한다. |
코어 태그 라이브러리를 사용하려면 JSP페이지에 다음과 같이 taglib디렉티브를 추가해 주어야 한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
<c:set>태그
<c:set>태그는 EL 변수의 값이나 EL변수의 프로퍼티의 값을 지정할 때 사용한다.
page, request, session, application의 네 영역에 저장되어 있는 객체를 <jsp:useBean>태그와 <jsp:setProperty>태그를 사용하여 JSP코드 내에서 사용될 변수를 지정하고 변수 프로퍼티의 값을 지정할 수 있는 것과 마찬가지로, <c:set>태그는 JSTL의 태그에서 사용될 변수의 값을 처리할 때 사용된다.
<c:set var="varName" value="varValue" [scope="영역"] />
<c:set var="varName" [scope="영역"]>varValue</c:set>
|
var: 값을 지정할 EL 변수의 이름
value : 변수의 값을 지정한다. 표현식, EL, 정적인 텍스트를 사용하여 값을 지정할 수 있다.
scope : 변수를 지정할 영역을 지정한다. 값은 page, request, session, application 중 하나가 온다. 지정하지 않을 경우 기본값은 page이다.
test.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:set테스트 </p>
<c:set var="name" value="홍길동" scope="session" />
c:set 이후 name: ${name}<br>
c:set 이후 requestScope.name: ${requestScope.name}<br>
c:set 이후 sessionScope.name: ${sessionScope.name}<br>
<c:remove var = "name" />
c:remove 이후 name: ${name}<br/>
</body>
</html>
<c:if> 태그
<c:if test="조건">
....
</c:if>
|
test.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:set테스트 </p>
<c:set var="name" value="홍길동" scope="session" />
c:set 이후 name: ${name}<br>
c:set 이후 requestScope.name: ${requestScope.name}<br>
c:set 이후 sessionScope.name: ${sessionScope.name}<br>
<c:remove var = "name" />
c:remove 이후 name: ${name}<br/>
<c:if test ="${empty name}">
name값이 설정되어 있지 않습니다.<br>
</c:if>
<c:if test ="${ name == null }" >
name값이 설정되어 있지 않습니다.<br>
</c:if>
<c:set var="a" value="100"/>
<c:if test="${ a>50 }">
예, a의 값은 50보다 큽니다.</br>
a의 값은 ${a}입니다.
</c:if>
</body>
</html>
<c:choose><c:when><c:otherwise>
<c:choose>태그는 자바의 switch 구문과 if-else 블록을 혼합한 혀태로서 다수의 조건문을 하나의 블록에서 수행하고자 할 때 사용된다.
<c:choose>
<c:when test="${memver.level == 'trial'}">
........
</c:when>
<c:when test="${memver.level == 'regular'}">
........
</c:when>
<c:when test="${memver.level == 'provider'}">
........
</c:when>
<c:otherwise>
.......
</c:otherwise>
</c:choose>
|
test.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:choose 테스트 </p>
<c:choose>
<c:when test = "${param.type == 'in' }">
내부검색을 요청하였습니다.
</c:when>
<c:when test = "${param.type == 'out' }">
외부검색을 요청하였습니다.
</c:when>
<c:otherwise>
요청정보가 전달되지 않았습니다.
</c:otherwise>
</c:choose>
</body>
</html>
http://localhost:8080/test.jsp?type=in 을 사용하여 파라메터를 넘겨 줄 수있다.
<c:forEach>태그
<c:forEach> 태그는 배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용할 수 있는 태그로서, 자바의 for, do-while 등을 대신해서 사용할 수 있다. <c:forEach>태그의 기본적인 사용 방법은 다음과 같다.
<c:forEach var ="변수" item="아이템">
......
<tr>
<td align="right" bgcolor="#ffffff">
${변수사용}
</td>
.....
</c:forEach> |
<%@ 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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:forEach 테스트 </p>
<%
String[] list={"사과", "바나나", "키위"};
session.setAttribute("fruits", list);
%>
<ul>
<c:forEach var="f" items="${fruits}">
<li> ${f}</li>
</c:forEach>
</ul>
</body>
</html>
<c:forEach>태그를 selection과 혼합
<%@ 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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:forEach 테스트 </p>
<%
String[] list={"사과", "바나나", "키위"};
session.setAttribute("fruits", list);
%>
<ul>
<c:forEach var="f" items="${fruits}">
<li> ${f}</li>
</c:forEach>
</ul>
과일을 선택하세요:
<select name="choice">
<c:forEach var="f" items="${fruits}">
<option>${f}</option>
</c:forEach>
</select>
</body>
</html>
JAVABEAN 객체와 혼합..
Member.java
package simple.web.model;
import java.io.Serializable;
/*
* JAVA Bean객체를 만들 수 있는 클래스를 만든다.
* JAVA Bean이란?
* 1) Encapsulation 구현 O
* 2) getter, setter O
* 3) default 생성자 O
* 4) Serializable 구현.
*/
public class Member implements Serializable {
private String id;
private String passwd;
private String name;
private String email;
private String phone;
private String address;
private String sex;
private String[] interest;
public Member() {
super();
}
public Member(String id, String passwd, String name, String email,
String phone, String address) {
super();
this.id = id;
this.passwd = passwd;
this.name = name;
this.email = email;
this.phone = phone;
this.address = address;
}
public Member(String id, String passwd, String name, String email,
String phone, String address, String sex, String[] interest) {
super();
this.id = id;
this.passwd = passwd;
this.name = name;
this.email = email;
this.phone = phone;
this.address = address;
this.sex = sex;
this.interest = interest;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getInterest() {
return interest;
}
public void setInterest(String[] interest) {
this.interest = interest;
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "simple.web.model.*, java.util.*"%>
<%@ taglib prefix = "c" uri = "
http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:forEach 테스트 </p>
<%
String[] list={"사과", "바나나", "키위"};
session.setAttribute("fruits", list);
ArrayList<Member> members = new ArrayList<Member>();
members.add(new Member("kim", "111","김영숙",
"
yskim@korea.com", "010-1111-2222","address"));
members.add(new Member("lee", "111","이순신",
"
yskim@korea.com", "010-1111-2222","address"));
members.add(new Member("hong", "111","홍길동",
"
yskim@korea.com", "010-1111-2222","address"));
members.add(new Member("park", "111","박찬호",
"
yskim@korea.com", "010-1111-2222","address"));
request.setAttribute("member", members); //m이라는 객체를 request 스콥에 박아넣음
%>
회원목록<br/>
<ul>
<c:forEach var="m" items="${member}">
<li>회원ID :
${m.id}
패스워드: ${m.passwd}
회원명 : ${m.name}
이메일 : ${m.email} <br/>
전화번호: ${m.phone}
주소 : ${m.address}
</li>
</c:forEach>
</ul>
</body>
</html>
<!-- 여기서 m.id라는 것은 member에 있는 getId라는 것을 호출해서 출력한다.
그러하기에 반드시 JAVA BEAN 객체여야 한다.
-->
<c:forEach>와 <c:forTokens>태그
<c:froTokens>태그는 items 속성으로 전달받은 문자열을 구분자를 이용해서 나눈 뒤 나뉘어진 각 문자열을 var속성에 명시한 변수에 저장한다. 예를 들어, 아래 코드는 item을 속성의 값을 (/)로 나눈 "red", "green", "blue"문자열을 color변수에 차례로 대입한다.
<c:forTokens var="color" items="red,green,blue" delims=",">
${color}
</forTokens}
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "simple.web.model.*, java.util.*"%>
<%@ taglib prefix = "c" uri = "
http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<p> c:forEach 테스트 </p>
<%
String wishList="집,돈,맥북,아이폰";
request.setAttribute("wish", wishList);
String wishList2="토끼/사슴/호랑이/앵무새";
request.setAttribute("wish2", wishList2);
%>
희망목록
<ol>
<c:forEach var="w" items="${wish}">
<li>${w}</li>
</c:forEach>
</ol>
<!-- forEach는 ,(콤마)를 기준으로 자른다. -->
구분자를 지정해 준 forToken
<ol>
<c:forTokens var="w" items="${wish2}" delims = "/">
<li>${w}</li>
</c:forTokens>
</ol>
</body>
</html>
<c:catch>태그
<c:catch>태그는 발생된 예외를 EL 변수에 저장할 때 사용되는 태그이다.
<c:catch var="exName">
......
예외가 발생할 수 있는 코드
.......
</c:catch>
.....
${exName} 사용
|
<%@ taglib prefix = "c" uri = "
http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
p { color: blue; font-size: 14pt;}
</style>
</head>
<body>
<c:catch var="ex">
<% int b = 10/0;%>
</c:catch>
<c:if test="${not empty ex}">
${ex}
</c:if>
</body>
</html>