1. custom tag library로 JSP 스펙에는 포함되지 않았지만 자바 진영에서 진행하는 태그 라이브러리. - 커스텀 태그(custom tag) : JSP에서 스크립트릿으로 작성해야할 동적 로직을 태그로 처리 - jstl.java.net에서 api를 다운로드 후 web application의 lib 폴더에 넣어 사용한다.
2. JSP에서 커스텀 태그를 사용하기 위해서는 taglib 지시자 태그 설정 필요 <%@ taglib prefix="접두어" uri="태그 라이브러리 구분자"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl.core"%> 사용 : <c:>
1. 변수 지원 - set : JSP에서 Attribute로 binding된 객체 처리 - remove : binding된 attribute 제거
2. 제어문 지원 - if : if문 - choose : 다중 조건 처리 - forEach : 반복문 처리
3. 출력지원 ① out 태그
- 태그형태의 문자열을 그대로 출력되도록 처리할 수 있다. - 속성 - value : 출력할 내용 - escapeXml : 태그 출력 여부 처리 true : 태그를 해석하지 않고 그대로 출력 false : 태그를 해석해서 출력 - default : value의 값이 null일 경우 출력할 기본 값
* WebContent 이름 : jstl/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"%><!-- 이건 지정하면 이 페이지 안에서만 가능하다. --> <% request.setAttribute("text", "<b>내용입니다.</b>"); request.setAttribute("age", 20); %> <!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> </head> <body> JSTL - out태그<p> <c:out value="안녕하세요<br>반가워요"/><br><!-- out의 주 기능은 value값을 있는 그대로 찍어주는 것이다. --> <c:out value="${requestScope.text }"/><br> <c:out value="${requestScope.text }" escapeXml="false"/><!-- escapeXml="false"를 하면 태그화 해서 화면에 보여준다. --> <hr> null값 출력<br> 이름 : ${requestScope.name }<br> 이름 : <c:out value="${requestScope.name }" default="이름이 없습니다."></c:out><br> 나이 : <c:out value="${requestScope.age }">나이가 없네요</c:out> </body> </html>
- 결과
② if 태그
- 단일 조건 조건문 처리. -if문과 동일 - 다중 조건 처리에는 사용할 수 없다. (if-else) - 속성 - test : 조건 설정 - 구문 <c:if test="조건"> 조건 만족시 실행할 내용 </c:if>
<!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> </head> <body> error.jsp<br> 오류가 발생했습니다.<br> 관리자에게 문의하세요.. admin@abc.com<br> <% request.setAttribute("error_message", "~~문제로 오류가 발생했습니다."); session.setAttribute("login_info", new CustomerDTO("a","1","홍길동","이메일",15)); %> <c:if test="${requestScope.error_message != null }"><!-- 에러 메세지가 있으면 아래 구문을 넣어주고 아니면 찍지마라 --> 오류메세지 : ${requestScope.error_message } </c:if><br> <c:if test="${not empty requestScope.error_message }"><!-- not 대신 ! 를 사용할 수도 있다. --> 오류메세지 : ${requestScope.error_message } </c:if> <hr> 메뉴 : 마이페이지 QnA 장바구니 <c:if test="${sessionScope.login_info.age>=19 }"> 성인입장페이지 </c:if><!-- 로그인한 사람의 나이가 19세 이상일 경우에만 성인입장페이지를 보여줘라. --> </body> </html>
* 로그인한 사람이 19세 이하일 경우 결과보기
* 로그인한 사람이 19세 이상일 경우 결과보기
③ choose 태그
- 다중 조건을 처리하는 태그 - if else, switch case - choose 태그는 조건들을 묶어주는 역할 - 하위태그 - when 태그 - 선택할 조건을 표시하기 위한 태그 - 속성 : test - 조건 설정 - otherwise - else의 역할(switch case의 default 역할) - 구문 <c:choose> <c:when test="조건1"> 조건1이 true일 경우 실핼할 내용 </c:when> <c:otherwise> when의 모든 조건이 만족 하지 않을 경우 실행할 내용 </c:otherwise> </c:choose>
- 특정 횟수만큼 반복을 처리 - 속성 - begin : 시작 값 - end : 종료 값 - step : 증감 값 - var : 변화되는 값을 저장할 변수 선언 <c:forEach begin="1" end="10" step="1" var="i"> ${i} - 안녕 </forEach>
<%@page import="java.util.HashMap"%> <%@page import="myjsp.dto.CustomerDTO"%> <%@page import="java.util.ArrayList"%> <%@ 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> </head> <body> forEach를 이용한 collection반복<br> <% String [] names = {"이순신", "홍길동", "김유신", "강감찬"}; request.setAttribute("names", names);
1. JSP 2.0에서 새로 추가된 스크립트 언어 2. 기존의 expression tag의 업그레이드 버전
3. 주요기능 - 리터럴 데이터 출력 - 각종 연산자를 제공하여 연산결과 출력을 지원 - 4개 속성 scope(page, reqeust, session, application)에 binding된 Attribute(객체)나 그 Attribute의 property값 출력 - JSTL과 연동
4. 구문 - ${출력내용} - ${10}, ${"안녕"}, ${10+20} - ${value1.value2[.value3 ..]} - 특정 객체의 property 접근 할 때 사용
- ${value1[value2]} - 컬랙션(list 계열)의 값을 출력할 때 주로 사용
- value1에는 EL 내장객체나 attribute 명이 들어와야 한다. - 구문을 실행 도중 null이 나오면 더이상 진행하지 않고 출력도 하지 않는다. - 예) ${requestScope.mto.id} ${cto.address.zipcode} ${sessionScope.list[0]}
5. JSP의 scropt(스크립트 릿, 표현식, 선언식, 지시자) 태그에는 사용 못한다. 6. action 태그내에는 사용 가능 - <jsp:include page="${dir}/a.jsp"/>
7. EL의 내장객체(기본객체) - EL은 11개의 내장객체를 제공하여 별다른 추가 코드 없이 특정 객체에 접근하여 사용할 수 있도록 한다. - JSP의 내장객체와는 다르다.(pageContext는 jsp와 같지만 쓸일이 없다) - EL 내장객체 중 pageContext를 제외하고는 모두 name - value 형태의 값을 관리한다. - ${} 내에서만 사용가능 하며 첫번째 값으로만 올 수 있다.
- scope와 관련된 내장객체 - pageScope : pageScope에 접근 - requestScope : request Scope에 접근 - sessionScope : session scope에 접근 - applicationScope : application scope에 접근
- 요청파라미터 관련 내장객체 - param : 요청파라미터 조회시 사용(하나의 이름 하나의 값이 넘어온 경우) - paramValues - 요청파라미터 조회시 사용(하나의 이름으로 여러값이 넘어온 경우)
- Header 값 관련 - header - headerValues
- 쿠키 값 조회 - cookie : ${cookie.이름.value}
- 초기 파라미터 조회(context-param으로 설정된 것) - initParam
- PageContext 객체 관련 내장객체 - pageContext
* [실습]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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> </head> <body> <!-- EL의 리터럴(literal)값 - 문자열 : ', "로 감싼다. - 숫자 -true/false - null - null+300하면 null을 0으로 바꿔줘서 계산한다. - mto가 null이 되면 mto.age가 0이 되어 30을 더해서 30 이 나온다.
1. JSP 페이지 내에 다른 컴포넌트(JSP, HTML, Servlet)를 포함 시키는 기술 - 주로 jsp나 html을 포함시킨다. - include 지시자 태그를 이용, 표준 action 태그 이용 - 기타 : JSTL(jsp standard tag library)의 import 태그 이용, tiles 프레임 워크
2. <%@ include%> 지시자 태그 이용 - copy and paste 방식 - jsp를 servlet으로 변환하기 전에 포함시킬 파일의 내용을 카피하여 붙인다. - 구문 : <%@include file="포함시킬 파일명"%>
* [실습]
jsp WebContent 이름 : include/a.jsp, b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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> </head> <body> a.jsp <% int k =200; %> <hr> <%@include file="b.jsp" %> <hr>
- 실행결과(지시자 태그를 사용하면 소스를 그대로 붙여서 사용하기 때문에 a.jsp에 선언된 k를 b.jsp에서 인식해서 에러가 나지 않지만 아래 액션태그를 사용하면 k를 인식하지 못해서 에러를 낸다.(액션 태그는 RequestDispatcher 방식으로 요청을 하고 결과만을 받아서 중간에 있는 k를 인식하지 못한다. )
3. <jsp:include> 액션 태그 이용 - 요청 디스패치 방식 - 수행을 포함시킬 컴포넌트로 이동한 뒤 출력내용을 포함시키는 방식 - 구문 <jsp:include page="url"/> <jsp:include page="url"> <jsp:param name="name" value="value"/> </jsp:include>
* [실습]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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> </head> <body> a.jsp <% int k =200; %> <hr> <%@include file="b.jsp" %> <hr> <jsp:include page="b.jsp"/> </body> </html>
1. JSP의 수행을 다른 컴포넌트로(JSP, Servlet, HTML)로 이동하는 태그 2. RequestDispatcher객체.forard() 실행을 태그화한 것 3. 요청 Dispatch 방식으로 이동 4. 속성 - page : 수행을 이동할 컴포넌트의 url 설정 5. 예) <jsp:forward page="abc.jsp"/> -> 의미 RequestDispatcher rdp = request.getRequestDispatcher("abc.jsp"); rdp.forward(request, response);
* <jsp:setProperty> 1. <jsp:useBean> 태그로 lookup 한 객체(Attribute)의 property에 값을 설정하는 태그 2. Lookup 한 Attribute의 setter 메소드를 호출하여 값을 설정한다. - 명시적인 값을 설정 - 요청파라미터로 넘어온 값을 설정 3. 속성 - name : 값을 설정할 bean의 이름. useBean의 id값 - property : 값을 설정할 property 명. (setter메소드에서 set을 제외한 이름) - value : 설정할 값 - param : 요청파라미터의 값을 설정할 경우, 요청파라미터의 이름 4. 요청파라미터로 넘어온 값을 설정할 경우 property의 이름과 요청파라미터의 이름이 동일한 경우 param을 생략할 수 있다. 5. 예) <jsp:setProperty name="mto" property="id" value="myid"/> ->의미 mto.setId("myId");
1. 속성 영역(page, request, session, application) 에 binding 된 속성 객체를 lookup한다. 만약 가져 오지 못하면 생성하여 그 영역에 binding한다.
2. 태그의 attribute(속성) - id : 자바식별자, binding 시 설정 이름 - class : lookup할 클래스의 이름. fully name으로 설정 - scope : 속성 영역, 값 : page(기본), request, session, application - 예) <jsp:useBean id="mto" class="dto.MemberDTO" scope="request"/>
-> 의미 MemberDTO mto = (MemberDTO)request.getAttribute("mto"); if( mto == null ){ mto = new MemberDTO(); //no-arg 생성자로 생성, 따라서 MemberDTO class에는 반드시 no-arg생성자가 있어야 한다. request.setAttribute("mto",mto); }
[실습] class package : myjsp.dto class : CustomerDTO
package myjsp.dto;
public class CustomerDTO { private String id; private String password; private String name; private String email; private int age; //생성자, setter/getter, toString, equals, hashCode public CustomerDTO() { super(); // TODO Auto-generated constructor stub } public CustomerDTO(String id, String password, String name, String email, int age) { super(); this.id = id; this.password = password; this.name = name; this.email = email; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "CustomerDTO [id=" + id + ", password=" + password + ", name=" + name + ", email=" + email + ", age=" + age + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CustomerDTO other = (CustomerDTO) obj; if (age != other.age) return false; if (email == null) { if (other.email != null) return false; } else if (!email.equals(other.email)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (password == null) { if (other.password != null) return false; } else if (!password.equals(other.password)) return false; return true; }
- JSP 내에서 자바코드를 줄이기 위한 태그 - 액션 태그는 JSP내에서 JAVA코드 없이 태그를 이용해 동적인 실행을 처리 하기 위해 제한됨 - 태그와 Java코드를 연결하여 JSP가 Servlet으로 변환 시 Web Container가 그에 알맞은 동적인 실행을 처리
- 종류 - 표준 Action 태그 : Jsp 스펙에서 제공하는 태그 - Custom tag : 사용자 정의 액션 태그
- 기본 주문 - <prefix : 태그명 속성 = "속성값" [속성="속성값"...]> - prefix - 태그 library를 구분하기 위한 이름 - xml 문법을 따른다. - 대소문자 구분 - 속성의 값은 ' 또는 "으로 감싸준다. - 태그는 반드시 닫아야 한다. - 예) <c:forEach item="list" var="mto"></c:forEach> <jsp:getProperty name='cto' property='name'/>
* 표준 액션 태그
- JSP 스펙에서 제공하는 액션태그 - 따로 library를 설정할 필요 없이 web container가 제공한다. - 구문 <jsp:태그명 속성='값' ...> - 주요 태그 - Attribute로 설정된 빈 객체와 연동하기 위한 태그 - useBean, forward, param
1. jsp에서 기본적으로 제공해 주는 객체 - 변수의 선언, 객체의 생성, 할당 없이 JSP 태그에서 사용할 수 있는 객체 - JSP가 서블릿으로 변환될 때 web container가 생성해서 제공
2. 종류 - request : HttpServletRequest - response : HttpServletResponse (ex : 쿠키 관련된 것에 많이 사용된다) - out : JspWriter - Servlet에서의 PrintWriter 역할 - session : HttpSession - <%@ page session="false"%> 로 설정하면 안 생긴다. - application : ServletContext - config : ServletConfig - pageContext : PageContext - Servlet에는 없는 객체로 다른 내장 객체들을 생성할 수 있다. - page : this - 서블릿 객체 자신 - exception : Throwable - <%@ page isErrorPage="true"%>로 설정 된 경우만 생성(default 는 false)