ㅁ EL&JSTL
- EL은 JSP의 내장 기능이다.
- JSTL은 라이브러리다.
- EL(Expression Language)과 JSTL(JavaServer Pages Standard Tag Library)은 JSP(JavaServer Pages)에서 동적인 콘텐츠(예: 사용자의 요청에 따라 바뀌는 내용)를 처리하기 위해 사용하는 기능입니다.
- EL(Expression Language):
- JSP 페이지에서 자바 객체의 값을 쉽게 참조하고 출력할 수 있게 해줍니다.
- ${} 표기법을 사용하여 자바 코드 없이도 데이터를 출력하거나 조건을 처리할 수 있습니다. 예를 들어, ${user.name}은 user 객체의 name 속성 값을 출력하는 방식입니다.
- JSTL(JavaServer Pages Standard Tag Library):
- JSP에서 자주 사용되는 기능들을 태그 라이브러리로 제공하여 개발자가 복잡한 자바 코드를 줄이고 쉽게 페이지를 작성할 수 있게 도와줍니다.
- JSTL은 여러 태그 라이브러리로 나뉘어 있으며, 주요 라이브러리로는 코어(core), 포맷(format), SQL 등이 있습니다.
- 예를 들어, 반복문은 <c:forEach> 태그로 작성할 수 있습니다.
- 조건문은 <c:if>나 <c:choose>로 처리할 수 있습니다.
- EL과 JSTL을 사용하면 자바 코드를 직접 JSP에 삽입하는 대신, 더 간결한 방식으로 데이터를 처리하고 출력할 수 있습니다.
==================================================================================
ㅁ 나중에 스프링을 사용하면 default output folder 경로가 자동으로 webinf/classes로 잡혀있다.
ㅁ 동적 프로젝트 생성
- 프로젝트 이름 : 03_EL&JSTL
- contex path : elJstl
ㅁ 메인페이지 생성
- webapp 폴더 우클릭, index.jsp 생성.
ㅁ 서버 우클릭 - add and remove로 서버에 방금 만든 프로젝트를 add한다.
ㅁ 브라우저에서 들어가보기
- 앞은 서버, 뒤는 그 서버에서 어떤 애플리케이션을 요청할건지
- context path 까지가 webapp을 의미한다.
ㅁ EL
- Expression Language (표현 언어)
- 기존에 JSP에서 사용했던 표현식 (<%= %>)의 대안이다.
EL구문을 배우면 번거롭게 <%= %>를 안 써도 된다.
- JSP 내장객체(request, session 등)(= scope)에 담겨있는 attribute를 출력하는 표현법
- 예시
request.setAttribute("str", "안녕하세요");
request.setAttribute("b", Board객체);
(1) JSP 표현식
- 꺼낼 때 getAttribute에 key값 제시해서 그에 해당하는 value값을 꺼냈었다.
- str 값 : <%= request.getAttribute("str") %>
- 객체는 형변환과 import까지 해야 했었다.
- b의 boardTitle 필드값 : <%= ((Board)request.getAttribute("b")).getBoardTitle() %>
(2) EL
- str 값 : ${ str } // key값만 제시하면 됨.
- b의 boardTitle 필드값 : ${ b.boardTitle }
- EL 구문 내에서는 자바 코드를 쓰지 않는다. 메소드 호출같은거 하지 않음.
EL은 간단한 표현과 객체 속성에 접근하거나, 조건 및 논리 연산을 처리할 때 사용됩니다.
주된 목적은 자바 코드 없이도 JSP에서 데이터를 쉽게 표현하는 것이다.
- 두 방법 다 아는게 좋다.
ㅁ index.jsp 수정
ㅁ src/main/java에 com.br.elJstl.model.vo 라는 패키지를 만들고, Person이라는 일반 클래스를 만든다.
- 필드를 3개 만들고, 기본생성자와 매개변수 생성자, 게터세터, toString 메소드를 만든다.
ㅁ (복습) 데이터들을 담을 수 있는 JSP 내장객체 종류
- jsp 파일이라면 바로 쓸 수 있다.
- servlet에서는 바로 접근 불가능.
(1) ServletContext (application Scope=애플리케이션 범위)
- 한 애플리케이션 당 단 1개 존재하는 객체
- 애플리케이션에 유지할 데이터를 담는다.
- 애플리케이션 종료 전까지 애플리케이션 전역에서 사용 가능.
(2) HttpSession (session Scope)
- 한 브라우저당 1개 존재하는 객체
- 브라우저에 유지할 데이터를 담는다.
- 브라우저 종료 전 or 서버 종료 전까지 jsp/servlet 단에서 데이터 사용 가능.
(서버 종료되면 session이 만료됨)
- 일회용으로 쓰고자 한다면 한번 쓰고 비워둬야 함.
(3) HttpServletRequest (request Scope)
- 한 요청당 1개 존재하는 객체
- 해당 요청에 대한 응답 페이지에 사용할 데이터를 담는다.
- forward에 의해 해당 request가 전달된 jsp, servlet에서만 데이터 사용 가능하다.
(4) PageContext (page Scope)
- 서블릿에선 접근 못 함. jsp에서 접근하는 객체다.
- 한 jsp당 1개 존재하는 객체
- 해당 페이지에 필요한 데이터를 담는다.
- jsp에서 담고, 해당 그 jsp에서만 사용 가능하다.
자주 쓰는 데이터를 담아놓고 쓰는 용도다.
ㅁ servlet에서 jsp 내장 객체 접근 방법
- 서블릿에서 매개변수로 받은 request를 이용해서 jsp 내장 객체에 접근한다.
(1) ServletContext : request.getServletContext()
(2) HttpSession : request.getSession()
(3) HttpServletRequest : 매개변수로 이미 존재
(4) pageContext : 접근 불가
※ jsp 내장 객체들의 공통 메소드
(1) attribute 담기 : .setAttribute("key", 담을 데이터);
(2) attribute 꺼내기 : .getAttribute("key");
(3) attribute 제거하기 : .removeAttribute("key");
ㅁ src/main/java에 com.br.elJstl.controller 라는 패키지를 만들고, ElBasic이라는 서블릿 클래스를 만든다.
package com.br.elJstl.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.br.elJstl.model.vo.Person;
/**
* Servlet implementation class ElBasic
*/
@WebServlet("/el.do")
public class ElBasic extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ElBasic() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request Scope에 담기
request.setAttribute("classRoom", "A강의장");
request.setAttribute("student", new Person("홍길동", 20, "남자"));
// session Scope에 담기
HttpSession session = request.getSession();
session.setAttribute("teacher", new Person("김말순", 35, "여자"));
// application Scope에 담기
ServletContext application = request.getServletContext();
application.setAttribute("academy", "구디아카데미");
// request, session, application에 동일한 key값으로 attribute 담기
request.setAttribute("scope", "request에 담긴데이터");
session.setAttribute("scope", "session에 담긴데이터");
application.setAttribute("scope", "application에 담긴데이터");
request.getRequestDispatcher("/01_el/elBasic.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 각각 다른 영역에 총 7개의 데이터를 담아놨다.
- "scope"라는 같은 key값으로 request, session, application에 데이터를 담았다.
- 포워딩시에는 이동할 페이지 경로에 context path를 제외하고 쓴다.
ㅁ webapp에 01_el 폴더를 만들고, elBasic.jsp 파일을 만든다. (views 폴더는 생략)
- 기존 방법에서는 vo 객체면 getter 메소드를 일일이 써야 했다.
- 저장하고 브라우저로 들어가 본다.
- "1) EL 기본 구문"을 누른다.
ㅁ 기존 방식은 주석처리하고, EL 구문을 사용한다.
- 기존 코드를 주석처리할 때 html 주석(<!-- -->) 말고 jsp 주석(<%-- --%>)을 써야 한다.
- EL구문을 사용하면 저기서 import문, 변수 선언문(scriptlet) 다 필요 없다.
- ${ teacher.name }하면 내부적으로 게터 메소드가 수행된다.
그렇다고 해서 vo 객체에 게터 메소드가 없어도 되는 것은 아니다. 정의를 해놓아야 한다.
- 게터 메소드가 없는데 EL 구문으로 출력하면 javax.el.PropertyNotFoundException이 발생한다.
ㅁ EL 사용법
(1) JSP 내장객체에 attribute를 꺼내기
- ${ attribute명(==키값) } => attribute값(==데이터값) 출력
(2) vo 객체의 필드값 꺼내기
- ${ vo객체.필드명 } => 필드값 출력 (내부적으로 getter메소드 호출됨)
ㅁ EL 구문을 자바스크립트 코드 내에 쓸 수 있다. 표현식도 자바스크립트 코드 내에 쓸 수 있었다.
ㅁ EL의 특징
(1) EL 구문 내에 별도로 scope를 지정하지 않으면 기본적으로 공유범위가 작은 scope에서부터 탐색한다.
- scope를 제시하지 않아도 된다. 모든 scope를 탐색한다.
- page => request > session => application
(2) 직접 scope를 지정할 수도 있다.
- ${ pageScope.attribute명 }
- ${ requestScope.attribute명 }
- ${ sessionScope.attribute명 }
- ${ applicationScope.attribute명 }
(3) 해당 attribute가 존재하지 않을 경우 아무것도 출력안됨 (오류발생x, null출력x)
ㅁ elBasic.jsp 수정
- scope라는 key값을 가지는 데이터가 session에도 있고 application에도 있는데 request에 있는 데이터가 꺼내졌다.
별도로 scope를 지정하지 않았기 때문에 범위가 제일 작은 scope부터 탐색한다.
page는 없었고 request를 탐색하는데 scope라는 key 값이 있어서 request에 담겨있는 데이터가 출력된다.
- 오류나거나 null이 출력되진 않고, 그냥 아무것도 출력되지 않는다.
- attribute가 존재하지 않는 경우 그냥 출력 자체가 안된다.
- EL 구문에서 값이 없거나 null일 경우, 오류가 나거나 null이 출력되는 것이 아니라 그 자리에 아무것도 출력되지 않는다.
================================================================================
ㅁ 다 끄고 index.jsp로 돌아간다.
- EL 내에서는 자바 코드를 안쓰려고 사용한다.
자바에서의 연산자를 사용할 수 있는데, 자바에서의 연산자를 모르는 사람을 위해 연산자가 있다.
- el은 자바 코드를 모르는 사람을 위한 문법이다.
ㅁ ElOperator를 만든다.
package com.br.elJstl.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.br.elJstl.model.vo.Person;
/**
* Servlet implementation class ElOperator
*/
@WebServlet("/elOperator.do")
public class ElOperator extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ElOperator() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("big", 10);
request.setAttribute("small", 3);
request.setAttribute("str1", "안녕");
request.setAttribute("str2", "잘가");
request.setAttribute("per1", new Person("홍길동", 20, "남자"));
request.setAttribute("per2", null);
List<String> list1 = new ArrayList<>();
list1.add("안녕하세요");
List<String> list2 = new ArrayList<>();
request.setAttribute("list1", list1);
request.setAttribute("list2", list2); // 텅빈 리스트
request.getRequestDispatcher("/01_el/elOperator.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 지금은 Perosn 객체를 new로 만들지만, 나중엔 db에 연결해서 조회된 데이터를 가져온다.
- per2는 조회 결과가 없는 경우를 가정한다.
조회 결과가 없는 경우라고 가정해 텅 빈 리스트를 request에 담아 보낸다.
ㅁ 01_el 폴더에 elOperator.jsp를 만든다.
- 자바에서는 정수 나누기 정수면 정수가 나오지만, EL 구문에서는 소수점 아래까지 다 표현된다.
- 유의사항) 문자열을 연이어주고자 할 때 + 연산자 사용 불가능하다. 오류 난다.
문자열을 연이을 때 ${ str1 }${ str2 } 이렇게 써야 한다.
- EL에서 + 연산자를 사용하는 순간 왼쪽과 오른쪽에 숫자가 와야 한다.
EL 내에서 산술연산자 작성시 내부적으로 피연산자들을 숫자형으로 형변환해서 연산한다.
ㅁ 대소 비교 연산, 동등 비교 연산
- gt는 greater than, lt는 less than을 뜻한다.
- ge는 Greater than or equal to (>=)의 의미로, "크거나 같다"를 나타냅니다.
le는 Less than or equal to (<=)의 의미로, "작거나 같다"를 나타냅니다.
- 지금은 그냥 작성하고 있지만 나중에는 저 비교 연산 구문들을 조건식 자리에 쓴다.
- 자바에서는 문자열간 비교는 equals 메소드를 사용해야 했지만, el 내에서는 문자열간 동등 비교에 ==을 써도 된다.
- el 내에서는 문자열을 홑따옴표, 쌍따옴표 다 가능하다.
ㅁ 객체가 null인지 또는 리스트가 비어있는지 비교, 논리 연산자
- el 내에서의 not equal이 자바에서의 !(논리부정연산자)
'05_Server (04. JSP 프로그래밍 구현)' 카테고리의 다른 글
Formatting Library, Function Library (0) | 2024.10.08 |
---|---|
JSP Action Tag (3) | 2024.10.07 |
[AJAX] 1. ajax를 이용한 비동기식 요청 (0) | 2024.09.29 |
실제 프로젝트 작업 (1) | 2024.09.22 |
JSP/SERVLET 정리 (2) | 2024.09.21 |