jsp
Scripting Element(tag) ------------ > 자바 코드
1. Scriptlet element <%자바코드%> |
----> | _jspService() { 자바코드를 그대로 복사 } |
2. expression element <%=자바코드%> (출력문 파라미터로 들어갈 코드) |
----> | _jspService() { out.print(자바코드); (결과를 리턴하는 문장이어야한다) } |
결과를 리턴하는 문장: expression int i; (x) if() -; (x) ()? : (o) a+b (o) |
Declaration element --------------> 자바코드
(유지 보수 편하게 한 쪽으로(맨 밑) 몰아넣기)
<%! 필드선언 메서드선언 %> |
복사됨 ~> (클래스 블록 아래에 바로 복사됨) |
class 서블릿 { 필드선언 메서드 선언 _jspService() { } } |
Directive element -------> 자바코드
<%@ page language="java" |
"java" *DSL에서 사용할 언어 지정 Domain-Specific Language *JSP 페이지에서 사용할 언어 => java 밖에 안 된다. |
|
contentType="--" | ------> | response.setContentType("---"); |
pageEncoding="UTF-8" | JSP 엔진에게 JSP 파일이 어떤 character set으로 인코딩 되었는지 알려줌 | |
import="패키지" import="패키지,패키지" |
------> | import 패키지; |
trimDirectiveWhitespaces="true" | ------> | directive element 뒤에 붙은 엔터는 무시 |
buffer="8kb" | ------> | 출력스트림의 버퍼 크기 지정 (default : 8kb) |
autoFlush="false" | ------> | 버퍼차면 예외 발생 defaule: true( 자동 방출) |
errorPage="URL"
|
JSP를 실행하는 중에 오류가 발생했을 때 포워딩할 url을 지정한다. | |
isErrorPage="true|false"
|
- JSP 페이지가 예외를 처리하는 페이지인지 지정한다. - true로 설정하면, 포워딩할 때 받은 예외 객체를 사용할 수 있도록 Throwable 타입의 exception 빌트인 객체가 추가된다. |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
trimDirectiveWhitespaces="true"%>
<%@ include file="파일경로"%> | jsp 파일을 include 자리에 진짜 삽입해서 사용. (jsp 파일일 필요없음. utf-8만 선언하면) jsp 액션의 include는 코드를 가진 서블릿을 실행하고 되돌아옴. |
|
<%@ taglib prefix="별명" uri="태그라이브러리 url" %> |
외부라이브러리를 사용하려면 .jar파일을 추가해야한다. |
Tag Library 종류 1. JSTL (JSP standard Tag Libreary) : 표준 2. user-defined Tag Library : 각 회사 |
<c:forEach items="홍길동,임꺽정,유관순,안중근,윤봉길,김구,김원봉" var="n">
이름=<%=pageContext.getAttribute("n")%>, ${n}<br> ee(expression element) , el (expression language) </c:forEach> |
||
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 페이지인 경우 위 설정을 붙인다.
JSP Action Tag
JSP Action Tag - < jsp:useBean>
1. <jsp:useBean id = "b1" class="java.lang.String" scope="page"/>
id에 오는 값은 name
class에는 FQName이 오는거임
scope에는 request, session, application도 올 수 있음
자바 코드로 바뀌면=>
java.lang.String b1 = (java.lang.String) pageContext.getAttribute("b1");
if(b1 == null) {
bl = new java.lang.String();
pageContext.setAttribute("b1", b1);
}
class ms
<%--
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) 클래스명이어야 한다.
추상 클래스와 인터페이스는 객체를 생성할 수 없기 때문에 안된다.
--%>
type (인터페이스 넣을 수 있음) 새로 객체를 만들지 않고 없으면 예외를 던짐
<jsp:useBean id="b1" type="java.lang.String" scope="page"/>
=>
java.lang.String b1 = (java.lang.String) pageContext.getAttribute("b1");
if (b1 == null) {
throw new Exception("----");
}
type은 인스턴스 생성을 안 함. 그래서 인터페이스 생성 가능하다.
<%@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"/>
<%--
위 태그의 자바 코드:
com.eomcs.web.vo.Board b1 = (com.eomcs.vo.Board) pageContext.getAttribute("b1");
if (b1 == null) {
b1 = new com.eomcs.web.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>
<%--
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) 클래스명이어야 한다.
추상 클래스와 인터페이스는 객체를 생성할 수 없기 때문에 안된다.
--%>
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("객체 꺼내기 오류");
}
14
class 와 type의 큰 차이
tclass 속성을 사용하면 id로 지정한 객체를 찾지 못했을 때 해당 객체를 만들고, 그 id로 보관소에 저장한다.
단 class 속성에는 generic 문법을 사용할 수 없다. (type에선 쓸 수 있음)
또한 보관소에 객체가 없을 때 생성해야 하기 때문에 class 속성에는 인터페이스를 설정할 수 없다.(type은 반대)
=>id가 가리키는 객체가 보관소에 없을 때 class 속성에 지정된 타입의 인스턴스를 생성한다.
그래서 class 속성에는 인터페이스나 추상 클래스를 지정할 수 없다. 왜? 인터페이스나 추상클래스는 인스턴스를 생성할 수 없기 때문이다.
invalid: 코드 자동생성할 때 끊기면 ,,
18
<%@ 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>
<%-- for ( : ) 문을 제대로 사용하려면 목록에 보관된 객체의 타입이 무엇인지
제네릭으로 지정해야 한다.
그러나 class에서는 제네릭을 지정할 수 없다.
해결책?
- type과 class를 함께써라!
- type으로 제네릭을 표현하고 class로 객체를 생성할 클래스를 지정하라!
--%>
<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>
<%--
jsp:useBean (계속)
1) type 속성
- 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.
--%>
19
jsp:include
=> 다른 페이지로 실행을 위임한 후 그 실행 결과를 포함시킬 때 사용한다.
실행이 끝난 후 제어권이 되돌아 온다.
=> 따라서 page 속성에 지정하는 URL은 서블릿/JSP 이어야 한다.
=> RequestDispatcher.include() 코드를 생성한다.
jsp:forward
=> 다른 페이지로 실행을 위임할 때 사용한다.
제어권이 넘어가면 되돌아 오지 않는다.
=> 따라서 page 속성에 지정하는 URL은 서블릿/JSP 이어야 한다.
=> RequestDispatcher.forward() 코드를 생성한다.
<jsp:include page="ex19_header.jsp"/>
<%-- 자바 코드:
RequestDispatcher rd = request.getRequestDispatcher("/ex19_header.jsp");
rd.include(request, response):
--%>
20
errorPage
=> JSP를 실행하는 중에 오류가 발생했을 때 실행할 JSP를 지정할 수 있다.
=> 어떻게?
<%@ page errorPage="URL"%>
=> 이 속성에 URL을 지정하지 않으면 오류가 발생했을 때
서블릿 컨테이너의 기본 오류 출력 페이지가 실행된다.
isErrorPage
=> 오류가 발생했을 때 실행되는 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"%>
-------------EL
EL 표기법
- EL(Expression Language)은 콤마(.)와 대괄호([]) 등을 사용하여 객체의 프로퍼티나,
리스트, 셋, 맵 객체의 값을 쉽게 꺼내고 설정하게 도와주는 문법이다.
특히 값을 꺼낼 때는 OGNL 표기법을 사용한다.
- OGNL(Object Graph Navigation Language)?
객체의 프로퍼티 값을 가리킬 때 사용하는 문법이다.
파일의 경로처럼 객체에 포함된 객체를 탐색하여 값을 쉽게 조회할 수 있다.
- 문법
${ 객체명.프로퍼티명.프로퍼티명.프로퍼티명 }
${ 객체명["프로퍼티명"]["프로퍼티명"]["프로퍼티명"] }
- EL에서 사용할 수 있는 객체?
pageContext
- JSP의 PageContext 객체
servletContext
- ${ pageContext.servletContext.프로퍼티명 }
자바코드 => pageContext.getServletContext().get프로퍼티()
session
- ${ pageContext.session.프로퍼티명 }
예) $ { pageContext.session.name }
=> pageContext.getSession().getName();
request
- ${ pageContext.request.프로퍼티명 }
response
param
- ${ param.파라미터명 }
=> request.getParameter("파라미터명");
paramValues
- ${ paramValues.파라미터명 }
=> request.getParameterValues("파라미터명");
header
- ${ header.헤더명 }
=> request.getHeader("헤더명");
headerValues
- ${ headerValues.헤더명 }
=> request.getHeaders("헤더명");
cookie
- ${ cookie.쿠키명 }
- ${ cookie.쿠키명.name }
- ${ cookie.쿠키명.value }
initParam
- ${ initParam.파라미터명 }
=> 보관소에서 값을 꺼내는 문법
pageScope
- ${ pageScope.객체이름 }
=> pageContext.getAttribute("객체이름");
requestScope
- ${ requestScope.객체이름 }
=> request.getAttribute("객체이름");
sessionScope
- ${ sessionScope.객체이름 }
=> session.getAttribute("객체이름");
예) ${ sessionScope.name }
=> session.getAttribute("name");
applicationScope
- ${ applicationScope.객체이름 }
=> application.getAttribute("객체이름");
=> 왜냐면 저 리스트 앞에는 보관소.보관소. 요게 생략되어있음. 보관소에서만 꺼낼수 잇음
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
8/28 프로젝트 (0) | 2023.08.28 |
---|---|
[NC7기-85일차(8월28일)] - 웹프로그래밍 66일차 (0) | 2023.08.28 |
[NC7기-83일차(8월24일)] - 웹프로그래밍 64일차 (0) | 2023.08.24 |
8/24 프로젝트 63- mvc 모델 1 (계속) (0) | 2023.08.24 |
[NC7기-82일차(8월23일)] - 웹프로그래밍 63일차 (0) | 2023.08.23 |