。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-84일차(8월25일)] - 웹프로그래밍 65일차

quarrrter 2023. 8. 25. 19:28

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("객체 꺼내기 오류");
  }

jsp파일
컴파일 된거

14

jsp

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 속성 
   - 보관소에서 꺼낸 객체의 타입을 지정할 때 사용한다.

 --%>

type과 class 동시 지정

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("객체이름");

=> 왜냐면 저 리스트 앞에는 보관소.보관소. 요게 생략되어있음. 보관소에서만 꺼낼수 잇음