- 서블릿 프로그래밍
- JSP 사용법(계속)
JSP 사용법
표현식(expression element)
ex05.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<%
String[] names = {"홍길동", "임꺽정", "유관순"};
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex05</title>
</head>
<body>
<h1>표현식(expression element)</h1>
<ul>
<%for (String name : names) {%>
<li><%=name%></li>
<%}%>
</ul>
</body>
</html>
<%--
용어 정리
1) 문장(statement)
if () {...}
else {...}
for () {...}
int a = 100;
2) 표현식(expression)
- 문장 중에 값을 리턴하는 문장
a * b <---- 곱하기 결과 리턴
(..)? a : b <---- 조건에 따라 a 또는 b 값 리턴
plus(10, 20) <---- plus()의 실행 값 리턴
out.println("okok") <---- 이 문장은 값을 리턴하지 않는다. 따라서 표현식이 아니다.
표현식(expression element)
문법:
<%= 표현식 %>
자바 코드:
out.print(표현식)
또는
out.write(표현식)
--%>
ㄴ <%= 표현식 %>
=>
=>
ㄴ trimDirectiveWhitespaces 를 true 로 설정 시 디렉티브 선언부와 스크립트릿 사이의 공백이 제거됨
선언부(declaration element)
ex06.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex06 </title>
</head>
<%!
// 다음과 같이 상속 받은 메서드를 오버라이딩 할 수 있다.
public void jspInit() {
System.out.println("ex06.jsp의 jspInit()");
}
public void jspDestroy() {
System.out.println("ex06.jsp의 jspDestroy()");
}
%>
<body>
<h1>선언부(declaration element)</h1>
100,000,000 입금 = <%=calculate(100000000)%>
</body>
<%!
double interest = 0.025; // 인스턴스 변수
private String calculate(long money) { // 인스턴스 메서드
return String.format("%.2f", money + (money * interest));
}
%>
<%!
{ // 인스턴스 블록
System.out.println("ex06 인스턴스 생성!");
}
static { // 스태틱 블록
System.out.println("ex06 클래스 로딩");
}
%>
</html>
<%--
선언부
- 클래스에 멤버를 추가할 때 사용한다.
- jspInit()나 jspDestroy()와 같은 메서드를 오버라이딩 할 때도 사용할 수 있다.
- 선언하는 위치는 상관없다.
- 문법:
<%! 멤버 선언 %>
- 자바 코드:
class JSP클래스 {
멤버선언
void _jspService() {
...
}
}
--%>
=>
=>
ex06_jsp.java
ㄴ <%! ... %> 안에 있는 것들은 위쪽에 선언됨
ex07.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.net.Socket"
import="java.net.ServerSocket"
import="java.util.List,java.util.Map,java.util.Set"
trimDirectiveWhitespaces="true"
autoFlush="false"
buffer="16kb"
%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.Statement"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex07</title>
</head>
<body>
<h1>지시문(directive element)</h1>
<%
for (int i = 0; i < 1000; i++) {
//out.print(". ");
}
%>
<p>출력완료!</p>
</body>
</html>
=>
=>
ex07.jsp
ㄴ 주석 제거
=>
ㄴ 출력 가능
=>
ㄴ 페이지 소스 보기를 이용해 확인
=>
ex07.jsp, ex07_jsp.java
=>
ex07.jsp, ex07_jsp.java
ㄴ charset 변경 시 자동으로 생성되는 _jsp 파일에서도 EUC-KR 로 설정됨
=>
ex07.jsp
ㄴ contentType 에 "text/html" 대신 "text/plain" 입력
=>
=>
ex07.jsp, ex07_jsp.java
=>
ex07.jsp, ex07_jsp.java
ㄴ import 하나씩 할 경우
=>
ex07.jsp, ex07_jsp.java
ㄴ import 를 한 줄에 여러 개 하면 각각 따로따로 import 문으로 변경됨
=>
ㄴ <% page import= ... %> 이렇게 improt 를 따로 빼서도 할 수 있음
=>
ex07.jsp
ㄴ 해당 코드 제거
=>
ex07.jsp
ㄴ 1000 -> 7000 으로 변경
=>
ㄴ 출력 가능
=>
ex07.jsp
ㄴ 7000 -> 8000 으로 변경
=>
ex07.jsp
ㄴ autoFlush 를 false 로 설정
=>
ㄴ 용량 부족으로 출력 불가
=>
ex07.jsp
ㄴ buffer 를 16kb 로 설정
=>
ㄴ 출력 가능
=>
ex07.jsp
ㄴ 8000 -> 18000 으로 변경
=>
ㄴ 용량 부족으로 출력 불가
=>
ex07.jsp
=>
ㄴ authFlush 를 true 로 설정 시 출력 가능
include 지시문
include 지시문
1) file="JSP에 포함시킬 파일 경로"
- 지정한 파일을 JSP로 포함시킨 후에 자바 서블릿 클래스를 생성한다.
자동 생성된 자바 서블릿 클래스의 소스를 확인해보라!
- 따라서 일반 텍스트 파일이면 된다. JSP 파일일 필요가 없다.
- RequestDispatcher의 include()와 다르다.
- 비록 JSP 파일이 아니더라도 다음을 선언하여 해당 파일의 문자집합을 지정해야 한다.
<%@ page pageEncoding="UTF-8"%>
JSP 엔진이 해당 파일의 내용을 가져올 때 pageEncoding에 지정된 문자집합으로
내용을 인식한다.
또한 JSP 엔진은 <%@ page ...%>는 참고만 할 뿐 가져오지는 않는다.
ex08.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex08</title>
</head>
<body>
<h1>지시문(directive element) - include</h1>
<%@ include file="./ex08_header.txt"%>
<p>테스트</p>
<%@ include file="./ex08_footer.txt" %>
</body>
</html>
ex08_header.txt
<%@ page pageEncoding="UTF-8"%>
<header>머리말</header>
ex08_footer.txt
<%@ page pageEncoding="UTF-8"%>
<footer>꼬리말</footer>
=>
=>
=>
ex08.jsp, ex08_jsp.java
=>
ex08.jsp, ex08_jsp.java
지시문(directive element) - taglib
tablib 지시문
=> 외부에 따로 정의된 JSP 확장 태그를 가져올 때 사용한다.
=> JSP 확장 태그
1) JSTL(JSP Standard Tag Library)
- JSP 명세에 추가로 정의된 태그이다.
- Servlet/JSP API에서는 JSTL 구현체를 제공하지 않는다.
- 따로 구현된 라이브러리를 다운로드 받아야 한다.
mvnrepository.com에서 JSTL 라이브러리를 검색하여 프로젝트에 추가하라.
- 보통 apache.org 사이트에서 구현한 것을 사용한다.
2) 개발자가 정의한 태그
- 개발자가 따로 태그를 정의할 수 있다.
- 그러나 실무에서는 유지보수를 일관성을 위해 JSTL과 같은 표준 API를 사용한다.
- 즉 개발자가 자신의 회사에서만 사용할 태그를 따로 정의하지 않는다.
=> 사용법
<%@ taglib
uri="확장 태그를 정의할 때 부여한 확장 태그 URI"
prefix="확장태그를 사용할 때 붙이는 접두사"%>
JSP 페이지에서 사용하기
<확장_태그_접두사:사용자_태그명 속성명="값" .../>
ex09.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex09</title>
</head>
<body>
<h1>지시문(directive element) - taglib</h1>
<c:forEach items="홍길동,임꺽정,유관순,안중근,윤봉길,김구,김원봉" var="n">
이름=<%=pageContext.getAttribute("n")%>, ${n}<br>
</c:forEach>
</body>
</html>
=>
=>
ㄴ c 태그 사용
=>
=>
=>
ㄴ jstl 검색
=>
ㄴ 해당 코드 복사
=>
build.gradle
ㄴ build.gradle 스크립트 파일에 라이브러리 추가
=>
ㄴ 빌드 하기
=>
ㄴ jstl 라이브러리 생성됨을 확인
=>
=>
App Restart
=>
=>
ex09_jsp.java
=>
ex09.jsp, ex09_jsp.java
JSP 빌트인 객체 - JSP에서 기본으로 사용할 수 있는 객체
JSP 빌트인 객체
- JSP를 가지고 서블릿 클래스를 만들 때 _jspService() 메서드에서 기본으로 준비하는 객체
- JSP 엔진은 반드시 다음과 같은 이름으로 레퍼런스를 선언해야 한다.
즉 서블릿 컨테이너(ex: 톰캣, jetty, resin 등)에 상관없이 이름이 같다.
1) request - HttpServletRequest => _jspService() 파라미터이다.
2) response - HttpServletResponse => _jspService() 파라미터이다.
3) pageContext - PageContext => _jspService()의 로컬 변수이다.
4) session - HttpSession => _jspService()의 로컬 변수이다.
5) application - ServletContext => _jspService()의 로컬 변수이다.
6) config - ServletConfig => _jspService()의 로컬 변수이다.
7) out - JspWriter => _jspService()의 로컬 변수이다.
8) page - 서블릿 객체를 가리킨다. 즉 this 이다. => _jspService()의 로컬 변수이다.
9) exception - Throwable => _jspService()의 로컬 변수이다.
- 이 변수는 JSP 페이지가 <%@ page isErrorPage="true"%>로 설정되었을 때만 존재한다.
- 주로 오류가 발생되었을 때 실행되는 JSP 페이지인 경우 위 설정을 붙인다.
ex10.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"
isErrorPage="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex10</title>
</head>
<body>
<h1>JSP 빌트인 객체 - JSP에서 기본으로 사용할 수 있는 객체</h1>
<%
// JSP에서 기본으로 준비한 변수를 사용할 수 있다.
request.setAttribute("aaa", "okok");
session.setAttribute("bbb", "nono");
application.setAttribute("ccc", "haha");
out.println("okok");
%>
</body>
</html>
ㄴ request => HttpServletRequest
ㄴ session => HttpSession
ㄴ application => ServletContext
ㄴ out => JspWriter
=>
=>
ex10_jsp.java
ㄴ _jspService 의 파라미터 => HttpServletRequest, HttpServletResponse
=>
ex10_jsp.java
ㄴ JSP 빌트인 객체
=> JSP를 가지고 서블릿 클래스를 만들 때 _jspService() 메서드에서 기본으로 준비하는 객체
ㄴ HttpSession => session 등
JSP 액션 태그 - jsp:useBean, jsp:setProperty
JSP 액션 태그
=> JSP에서 기본으로 제공하는 JSP 전용 태그
=> 따로 taglib를 사용하여 라이브러리를 선언할 필요가 없다.
=> JSP에서 기본으로 제공하기 때문에 그대로 사용하면 된다.
=> 네임스페이스 이름은 jsp 이다.
<jsp:태그명 ..../>
jsp:useBean
=> JSP에서 사용할 객체를 생성할 때 사용할 수 있다.
=> 또는 보관소(ServletContext, HttpSession, ServletRequest, PageContext)에
저장된 객체를 꺼낼 때도 사용한다.
=> 사용법
<jsp:useBean scope="보관소명" id="객체명" class="클래스명"/>
=> 주요 속성
scope
- 객체를 꺼내거나 생성된 객체를 저장할 보관소 이름
- 다음 4개의 값 중 한 개를 지정할 수 있다. 값을 지정하지 않으면 기본이 "page" 이다.
application(ServletContext), session(HttpSession),
request(ServletRequest), page(PageContext)
id
- 객체를 꺼내거나 저장할 때 사용할 이름
class
- 보관소에서 객체를 찾을 수 없을 때 생성할 객체의 클래스명
- 반드시 패키지 이름을 포함해 클래스명(fully-qualified name; FQName)을 지정해야 한다.
<%@ page import="..."%> 를 선언해도 소용없다.
- 객체를 꺼내는 경우 레퍼런스의 타입으로도 사용된다.
- 객체를 생성할 때도 사용할 수 있기 때문에 반드시 콘크리트(concrete) 클래스명이어야 한다.
추상 클래스와 인터페이스는 객체를 생성할 수 없기 때문에 안된다.
ex11.jsp
<%@page import="java.sql.Date"%>
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<%@ page import="eomcs.vo.Board"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex11</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean, jsp:setProperty</h1>
<%-- bitcamp.vo.Board 객체 생성하기 --%>
<jsp:useBean id="b1" class="eomcs.vo.Board" scope="page"/>
<%--
위 태그의 자바 코드:
eomcs.vo.Board b1 = (eomcs.vo.Board) pageContext.getAttribute("b1");
if (b1 == null) {
b1 = new eomcs.vo.Board();
pageContext.setAttribute("b1", b1);
}
--%>
<%-- scope을 생략하면 기본이 page(PageContext)이다. --%>
<jsp:useBean id="b2" class="eomcs.vo.Board"/>
<jsp:useBean id="b3" class="eomcs.vo.Board"/>
<%-- 객체의 setter 메서드를 호출하기 --%>
<jsp:setProperty name="b3" property="no" value="100"/>
<jsp:setProperty name="b3" property="contents" value="내용입니다."/>
<jsp:setProperty name="b3" property="viewCount" value="88"/>
<%-- 단, 자바 객체의 프로퍼티 타입이 자바 원시 타입과 문자열인 경우 가능하다.
다른 타입이라면 따로 처리해야 한다. --%>
<%--
<jsp:setProperty name="b3" property="createdDate" value="2019-4-8"/>
--%>
<%=b1%> => out.print(b1);<br>
<%=b2%> => out.print(b2);<br>
<%=b3%> => out.print(b3);<br>
<%=b3.toString()%> => out.print(b3.toString());<br>
</body>
</html>
=>
ㄴ vo 패키지 생성하지 않아 발생한 오류
=>
=>
ㄴ eomcs 폴더에 새로운 vo 라는 이름의 패키지 생성
=>
ㄴ /Users/사용자명/git/eomcs-java/eomcs-servlet/app/src/main/java/com/eomcs/web/vo 위치에 있는 모든 파일 복사
=>
ㄴ 인텔리제이에서 생성한 vo 패키지에 복사한 파일 모두 붙여넣기
=>
ex11.jsp
ㄴ import 정확히 해주기
=>
ex11.jsp
ㄴ class 정확히 작성하기
=>
ex11.jsp
ㄴ eomcs.vo.Board 객체생성하도록 함
=>
ex11.jsp
ㄴ class 정확히 작성하기
=>
ex11.jsp
ㄴ class 정확히 작성하기
=>
vo/Board.java
=>
=>
ex11.jsp
ㄴ 주석 제거
=>
=>
ex11.jsp, ex11_jsp.java
=>
ex11_jsp.java
ㄴ scope 을 page 라고 지정했으므로 pageContext 에 저장됨
JSP 액션 태그 - jsp:useBean
jsp:useBean 문법:
<jsp:useBean id="레퍼런스명" type="레퍼런스타입" scope="보관소"/>
=> id
- 보관소에서 값을 꺼낼 때 사용하는 이름이다.
- 또한 꺼내 값을 저장하는 변수의 이름으로 사용된다.
=> type
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
=> scope
- 값을 꺼내는 보관소를 가리킨다.
=> 예)
태그:
<jsp:useBean id="s4" type="java.lang.String" scope="page"/>
자바코드:
String s4 = (String) pageContext.getAttribute("s4");
if (s4 == null) {
throw new Exception("객체 꺼내기 오류");
}
ex12.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex12</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<%-- 보관소에 저장된 객체 꺼내기 --%>
<%
application.setAttribute("s1", "홍길동");
session.setAttribute("s2", "임꺽정");
request.setAttribute("s3", "안중근");
pageContext.setAttribute("s4", "윤봉길");
%>
<jsp:useBean id="s1" type="java.lang.String" scope="application"/>
<%-- 자바코드로 표현해보면,
String s1 = (String)application.getAttribute("s1");
--%>
<jsp:useBean id="s2" type="java.lang.String" scope="session"/>
<%-- String s2 = (String)session.getAttribute("s2"); --%>
<jsp:useBean id="s3" type="java.lang.String" scope="request"/>
<%-- String s3 = (String)request.getAttribute("s3"); --%>
<jsp:useBean id="s4" type="java.lang.String" scope="page"/>
<%-- String s4 = (String)pageContext.getAttribute("s4"); --%>
<%=s1%><br>
<%=s2%><br>
<%=s3%><br>
<%=s4%><br>
<%-- 보관소에 없는 객체를 꺼내려 하면 예외 발생! --%>
<%--
<jsp:useBean id="s5" type="java.lang.String" scope="page"/>
--%>
</body>
</html>
=>
=>
ex12.jsp
ㄴ 주석 제거
=>
ㄴ 보관소에 없는 객체인 s5 를 꺼내려했기 때문에 오류 발생
=>
ex12.jsp
ㄴ class 로 지정해줌
=>
ex12_jsp.java
ㄴ 객체를 생성함
=>
ㄴ type 으로 지정해줌
=>
ㄴ 오류 발생
=>
ex12.jsp, ex12_jsp.java
ㄴ 객체 생성하지 않고 보관소에서 꺼낸 객체의 타입만 지정
JSP 액션 태그 - jsp:useBean (계속)
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
ex13.jsp
<%@page import="java.util.ArrayList"%>
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex13</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<%-- 보관소에 저장된 객체 꺼내기 --%>
<%
ArrayList<String> names = new ArrayList<>();
names.add("홍길동");
names.add("임꺽정");
names.add("안중근");
names.add("윤봉길");
pageContext.setAttribute("list", names);
%>
<jsp:useBean id="list" type="java.util.ArrayList<String>" scope="page"/>
<%-- 자바코드로 표현해보면,
java.util.ArrayList<String> list =
(java.util.ArrayList<String>) pageContext.getAttribute("list");
if (list == null) {
throw new Exception("ArrayList 꺼내기 오류!");
}
--%>
<%
for (Object obj : list) {
out.println(obj + "<br>");
}
%>
</body>
</html>
=>
ex13.jsp
ㄴ pageContext 에 list 라는 이름으로 names 라는 이름의 ArrayList 저장
=>
ex13.jsp
ㄴ 저장된 값 꺼내기 (ArrayList 타입)
=>
=>
ex13.jsp, ex13_jsp.java
JSP 액션 태그 - jsp:useBean (계속)
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
ex14.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex14</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<%-- 보관소에 저장된 객체 꺼내기 --%>
<%
ArrayList<String> names = new ArrayList<>();
names.add("홍길동");
names.add("임꺽정");
names.add("안중근");
names.add("윤봉길");
pageContext.setAttribute("list", names);
%>
<jsp:useBean id="list" type="java.util.List<String>" scope="page"/>
<%-- type에는 인터페이스를 지정할 수 있다.
java.util.List<String> list =
(java.util.List<String>) pageContext.getAttribute("list");
--%>
<%
for (String n : list) {
out.println(n + "<br>");
}
%>
</body>
</html>
=>
ex14.jsp
ㄴ list 라는 이름으로 값 꺼내기 (List 타입)
=>
=>
ex14.jsp, ex14_jsp.java
=>
ex14.jsp
=>
=>
ex14.jsp, ex14_jsp.java
ㄴ 컴파일 되다가 중단되어버림
JSP 액션 태그 - jsp:useBean (계속)
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
ex15.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex15</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<%-- id로 지정된 객체를 찾지 못하면 예외가 발생한다. --%>
<jsp:useBean id="list" type="java.util.List<String>" scope="page"/>
<%-- 자바코드로 표현해보면,
java.util.List<String> list =
(java.util.List<String>) pageContext.getAttribute("list");
if (list == null) {
throw new Throwable("list라는 이름의 빈이 없습니다.");
}
--%>
<%
for (String n : list) {
out.println(n + "<br>");
}
%>
</body>
</html>
=>
=>
ex15.jsp
=>
ex15_jsp.java
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
<%-- type 속성 대신에 class 속성을 사용하면
id로 지정한 객체를 찾지 못했을 때 해당 객체를 만들고,
그 id로 보관소에 저장한다.
단 class 속성에는 generic 문법을 사용할 수 없다.
또한 보관소에 객체가 없을 때 생성해야 하기 때문에
class 속성에는 인터페이스를 설정할 수 없다. --%>
ex16.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex16</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<jsp:useBean id="list" class="java.util.ArrayList" scope="page"/>
<%-- 자바코드로 표현해보면,
java.util.ArrayList list =
(java.util.ArrayList) pageContext.getAttribute("list");
if (list == null) {
list = new java.util.ArrayList();
pageContext.setAttribute("list", list);
}
--%>
<%
// 제네릭 문법을 사용하지 못했기 때문에 list의 타입은 java.util.ArrayList이다.
// 따라서 for 문에서 항목의 타입을 지정할 때 String으로 지정할 수 없다.
out.println(list.size() + "<br>");
for (Object n : list) {
out.println(n + "<br>");
}
%>
</body>
</html>
=>
ex16.jsp
=>
ㄴ type 으로 설정 시 에러 발생
=>
ex16.jsp, ex16_jsp.java
=>
ㄴ type -> class 로 다시 변경
=>
=>
ㄴ class 속성에는 generic 문법을 사용할 수 없음
=>
=>
ex16.jsp, ex16_jsp.java
ㄴ 컴파일이 되다가 중단됨
JSP 액션 태그 - jsp:useBean (계속)
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
<%-- id가 가리키는 객체가 보관소에 없을 때
class 속성에 지정된 타입의 인스턴스를 생성한다.
그래서 class 속성에는 인터페이스나 추상 클래스를 지정할 수 없다.
왜? 인터페이스나 추상클래스는 인스턴스를 생성할 수 없기 때문이다.--%>
ex17.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex16</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<jsp:useBean id="list" class="java.util.List" scope="page"/>
<%-- 자바코드로 표현해보면,
java.util.List list =
(java.util.List) pageContext.getAttribute("list");
if (list == null) {
list = new java.util.List(); <=== 이 부분 때문에 인터페이스를 지정할 수 없다.
pageContext.setAttribute("list", list);
}
--%>
<%
// 제네릭 문법을 사용하지 못했기 때문에 list의 타입은 java.util.ArrayList이다.
// 따라서 for 문에서 항목의 타입을 지정할 때 String으로 지정할 수 없다.
for (Object n : list) {
out.println(n + "<br>");
}
%>
</body>
</html>
=>
JSP 액션 태그 - jsp:useBean (계속)
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
<%-- for ( : ) 문을 제대로 사용하려면 목록에 보관된 객체의 타입이 무엇인지
제네릭으로 지정해야 한다.
그러나 class에서는 제네릭을 지정할 수 없다.
해결책?
- type과 class를 함께써라!
- type으로 제네릭을 표현하고 class로 객체를 생성할 클래스를 지정하라!
--%>
ex18.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex16</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:useBean (계속)</h1>
<jsp:useBean id="list"
type="java.util.List<String>"
class="java.util.ArrayList" scope="page"/>
<%-- 자바코드로 표현해보면,
java.util.List<String> list =
(java.util.List<String>) pageContext.getAttribute("list");
if (list == null) {
list = new java.util.ArrayList();
pageContext.setAttribute("list", list);
}
--%>
<%
// type 속성에서 제레릭으로 String을 지정했기 때문에 항목의 타입을 String으로 선언할 수 있다.
//list.add(new Integer()); // 제네릭에 지정된 타입과 달라서 컴파일 오류!
list.add("홍길동");
list.add("임꺽정");
list.add("유관순");
list.add("안중근");
// ArrayList 에 제네릭을 적용하지 않으면
// 다음과 같이 어떤 타입의 객체라도 저장할 수 있다.
// => 그러나 jsp:useBean 태그에서 type 속성을 설정하면 제네릭을 사용할 수 있다.
//list.add(new Integer(100));
//list.add(new com.eomcs.web.vo.Board());
for (String n : list) {
out.println(n + "<br>");
}
%>
</body>
</html>
=>
ex18.jsp
=>
=>
ex18.jsp, ex18_jsp.java
JSP 액션 태그 - jsp:include
jsp:include
=> 다른 페이지로 실행을 위임한 후 그 실행 결과를 포함시킬 때 사용한다.
실행이 끝난 후 제어권이 되돌아 온다.
=> 따라서 page 속성에 지정하는 URL은 서블릿/JSP 이어야 한다.
=> RequestDispatcher.include() 코드를 생성한다.
jsp:forward
=> 다른 페이지로 실행을 위임할 때 사용한다.
제어권이 넘어가면 되돌아 오지 않는다.
=> 따라서 page 속성에 지정하는 URL은 서블릿/JSP 이어야 한다.
=> RequestDispatcher.forward() 코드를 생성한다.
ex19.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex19</title>
</head>
<body>
<h1>JSP 액션 태그 - jsp:include</h1>
<jsp:include page="ex19_header.jsp"/>
<%-- 자바 코드:
RequestDispatcher rd = request.getRequestDispatcher("/ex19_header.jsp");
rd.include(request, response):
--%>
<p>테스트</p>
<jsp:include page="ex19_footer.jsp"/>
</body>
</html>
ex19_header.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<header>머리말</header>
ex19_footer.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<footer>꼬리말</footer>
=>
=>
ex19_jsp.java
ㄴ ex19_header.jsp 파일과 ex19_header.jsp 파일을 포함하여 출력하도록 함
errorPage 속성과 isErrorPage 속성
errorPage
=> JSP를 실행하는 중에 오류가 발생했을 때 실행할 JSP를 지정할 수 있다.
=> 어떻게?
<%@ page errorPage="URL"%>
=> 이 속성에 URL을 지정하지 않으면 오류가 발생했을 때
서블릿 컨테이너의 기본 오류 출력 페이지가 실행된다.
isErrorPage
=> 오류가 발생했을 때 실행되는 JSP 쪽에서
그 오류 내용을 받을 때 사용한다.
ex20.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"
errorPage="ex20_error.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex20</title>
</head>
<body>
<h1>errorPage 속성과 isErrorPage 속성</h1>
<%
int value = Integer.parseInt(request.getParameter("value"));
%>
10 / <%=value%> = <%=10 / value%>
</body>
</html>
=>
ex20.jsp
ex20_error.jsp
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"
isErrorPage="true"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex20</title>
</head>
<body>
<h1>오류 발생!</h1>
<%=exception.getMessage()%>
</body>
</html>
<%--
오류가 발생했을 때 실행되는 JSP 페이지는
exception이라는 변수를 통해 오류 내용을 받을 수 있다.
단, isErrorPage 속성이 true이어야 해당 변수가 준비된다.
--%>
=>
ex20_error.jsp
=>
=>
ex20_jsp.java
ex19_jsp.java
ㄴ 에러페이지를 지정하지 않으면 해당 위치에 null 이 들어감
=>
ㄴ isErrorPage 설정 제거
=>
ㄴ 해당 오류가 발생