본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 66일차 (2023-08-25) 자바 프로그래밍_JSP 사용법(ex05.jsp~ex20.jsp)

by prometedor 2023. 8. 26.
- 서블릿 프로그래밍
  - 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 설정 제거

=>

ㄴ 해당 오류가 발생