basic/jsp

[jsp 14] EL(표현언어), JSTL

못지(Motji) 2021. 7. 22. 17:35

Controller 통합

Servlet life cycle

진행순서

  1. url 요청 : http://locatlhost:8080/web/~~
  2. url 요청이 톰캣에 들어감
  3. /web (컨텍스트 루트, Context path) : 해당 루트의 web.xml 찾아 스캔 (WEB-INF안에 web.xml)
    컨텍스트 루트가 내컴퓨터 기준으로 보면 C드라이브나 D드라이브냐를 지정하는 개념
    톰캑은 주소의 컨텍스트 루트를 보고 맞는 것을 선택해서 들어감
    한 서버아래 프로젝트 하나 더  추가해서 서버에 올리면 각각 컨텍스트 루트에 따라 다르게 접근함
  4. web.xml의 <servlet-mapping>을 분석함
  5. <servlet-mapping>의 <url-pattern>이 요청과 일치하는 패턴의 <servlet-name>값과 동일한 <servlet-name>의 <servlet> 태그를 찾고, 찾은 태그의 <servlet-class> 값의 컨트롤러 클래스를 객체 생성하여 로딩시킨다.
    init(), service() 호출
    이때, 만약 이미 로딩이 되어있으면 service()만 호출, init()은 처음 로딩때만 호출이 된다.
  6. 컨트롤러 클래스가 하나라면 uri분석하여 맞는 로직, view 처리해줌 (개발자)

표현언어 Expression Language EL

• 모든 웹에서 사용되는 웹 언어(스크립트 언어)

• 출력문을 더쉽게 간결하게 사용할 수 있는 언어 (대입개념 x, 표현에만 초점)

• null일시 출력하지 않음

EL 기능

  • jsp 네가지 내장객체가 제공하는 영역의 속성 사용
  • 수치연산, 관계연산, 논리연산자 제공
  • 자바 클래스 메소드 호출 기능 제공
  • 쿠키 내장객체의 속성 등 jsp를 위한 표현언어의 내장객체 제공
  • 람다식 이용한 함수 정의와 실행 (EL 3.0)
  • 스트림 API를 통한 컬렉션 처리 (EL 3.0)
  • 정적 메소드 실행 (EL 3.0)

EL 구성

스크립트 표현식 <%= %>
EL ${ }

# JSP의 스크립트태그(스크릿트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용가능

#문자형 홑/겉따옴표 구분 없음

연산자

  • 산술, 논리, 비교 등 존재
  • 표현언어에는 대입 개념이 없다 ${ a = 10 } ▹ a와 10이 같은지 묻는것, 비교연산으로 인식, == 와 동일한 결과

☑ 산술 연산자

▪ + - * /(div) %(mod) ${ 10 + 5 } ▹ 화면에 15출력

▪ 정수와 실수타입에 대해서만 동작

▪ 숫자+객체(문자) 숫자로 변환해서 연산결과 출력

▪ null ▹ Long 타입의 0으로 연산처리되며, 연산없이 단순 null이면 출력을 아예 안함

Ex)

∙ java : syso("10" + 10) ▹1010

∙ EL : ${ "10" + 10 } ▹ 20

∙ ${ "일" + 10 } ▹ 에러 : 숫자로 변환 불가한 객체

∙ ${ "null" + 10 } ▹ 10

∙ ${ null } ▹ 아무것도 출력안함

 

☑ 비교 연산자

▪ == 또는 eq 또는 =

▪ != 또는 ne

▪ < 또는 lt

▪ > 또는 gt(then)

▪ <= 또는 le

▪ >= 또는 ge(그라이언트 댄 이퀄즈)

❕ 태그형태의 기호라서 < 잘 인식 못할수도 있기 때문에 영문 연산표기법 알아두기

 

☑ 논리 연산자

▪ && 또는 and

▪ || 또는 or

▪ ! 또는 not

 

☑ empty 연산자

▪ empty 변수

▪ 변수가 빈 객체인지 검사할때 사용 (주로 ArrauList나 배열)

▪ 값이 null, 빈문자열, 길이0, 빈 Map, 빈 Collection 객체일 경우 true 리턴

 

☑ 삼항연사자

▪ ? :

EL 기본객체

☑ 객체종류

📌requestScope request 내부객체에 저장된 속성 사용가능
📌sessionScope session 내부객체에 저장된 속성 사용가능
📌param 요청 파라미터 사용가능
request.getParameter("파라미터명")의 결과와 동일
paramValues 요청 파라미터 배열 사용가능
String[] request.getParameterValues("파라미터명")의 결과와 동일
cookie request.getCookies() 로 구한 쿠키배열로 매핑된 객체
pageContext pageContext 내부객체와 동일
pageScope pageContext의 속성 사용가능
applicationScope application 내부객체와 동일
hearder request.getHearder() 결과와 동일
initParam 초기화 파라미터 속성 사용가능

☑ 객체접근

▪  java : <%= session.getAttrubyte("memId") %>

▪  EL : ${ sessionScope.memId }

* 동일한 속성명(ex. name)이 여러개가 존재하면 xxxScope를 적어주기 속성이 유일하거나 구분이 가능하다면 이름만 기술하여 사용 가능. 동일한 속성명이 여러개 존재하고, xxxScope를 생략하고 이름만 적으면 page, request, session,application 순으로 검색해서 찾음

* cookie : '쿠키이름', Cookie객체 형태

new Cookie("cookieId","java");

c.setMaxAge(60*60*24);

response.addCookie(c);

${cookie.cookieId.value} ▹ java 나온다

JSTL : JSP Standard Tag Library

• JSP에서 사용가능하도록 만들어진 커스텀태그 중에서 많이 사용하는 것들을 모아서 JSTL 이라는 표준을 만듬

• 커스텀태그라고도 부르며 EL과 함께 사용 됨

• HTML코드와 자바 코드가 들어가는 JSP 스크립트 태그등이 섞여 있으면 가독성이 떨어지며 코드 재사용성이 떨어짐

• JSTL을 이용하면 스크립트 코드에서 적용한 기능을 태그로 만들어서 치환 가능 (자바를 태그화)

• XML 기반으로 작성되어 시작태그와 종료태그 쌍으로 이루어져 있음

• 홑태그는 /> 마지막에 닫아주어야함

• 대소문자 구분

 

라이브러리 배치

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2

jstl-1.2.jar 다운 받아서 WEB-INF > lib 폴더 안에 배치하기

JSTL 태그 종류

📌Core : 가장 기본적인 태그 : 접두어 c : http://java.sun.com/jsp/jstl/core

📌국제화(fmt) : 포매팅, 숫자나 날짜 관련 태그 : 접두어 fmt : http://javasun.com/jsp/jstl/fmt

XML : xml 분리하기 위해 만들어졌으나 이제 사용 안함

데이터베이스 : DB 관련 태그 (우리는 사용 안함 DAO에서 처리)

함수  : 함수처리 (우리는 사용 안함. 모든 연산은 MVC 패턴에 따라 Model 처리)

Core 태그

•  Attribute 변수 선언, 삭제 등 변수 관련 작업과 if, for 같은 제어문, url처리 등에 사용

 

core 태그 선언

▪ 현재 jsp 페이지에서 core 태그를 사용하겠다고 선언해줘야 사용 가능

▪ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

💡

∙ prefix : 태그 라이브러리 호출할때 사용할 접두어 지정. 별칭같은 존재로 core태그 사용한다. (꼭 c가 아니어도 됨)

∙ uri : 라이브러리 uri 작성, 고정값이니까 외우기

 

☑ 태그 종류

변수지원 : set/remove

흐름제어 : if/choose/forEach/forTokens

URL처리 : import/redirect/url

기타 : catch/out

태그 기능
set 변수설정
remove 설정한 변수 제거
if 조건문, 자바 if
choose 자바 switch와 비슷
forEach 반복문
forTokens 반복문
import include 와 비슷, url을 사용하여 다른 자원결과 삽입
redirect 지정한 경로로 리다이렉트 (단순이동 = 요청)
url url 작성
catch 익셉션처리시 사용
out 출력

① c:set

- 변수 생성 (일반변수)

<c:set var="변수명" value="값" />
<c:set var="변수명"> 값 </c:set>

value : 표현식, EL, 정적테스트 사용해 값 지정 가능

 

- 프로퍼티 값 설정 (객체느낌)

<c:set target="대상" property="프로퍼티명" value="값" />
<c:set target="대상" property="프로퍼티명"> 값 </c:set>

target : 값 설정한 대상 객체. 표현식, EL 사용, 대상 자바빈객체(dto,map)

property : 프로퍼티 이름지정. 타겟이 dto라면 dto안의 변수명 > set()

value : 프로퍼티 값 지정

 

② c:remove 변수 삭제

 

③ c:if 조건문 else if 없음

<c:if test="조건EL">조건이 참일경우 실행할 코드</c:if>

 

test : 속성값은 표현식, EL, 문자열사용 가능 > EL 사용하자

 

④ c:cjppse, c:when, c:otherwise / switch, if-else 섞은 느낌

<c:choose>
	<c:when test="조건EL">
    ....
    </c:when>
    <c:when test="조건EL">
    ....
    </c:when>
    <c:when test="조건EL">
    ....
    </c:when>
    <c:otherwise>
    ....위 조건에 부합되지 않을 경우 실행할 코드....
    </c:otherwise>
</c:choose>

 

⑤ c:forEach 반복문

- 자바 업그레이드 for문처럼 사용

<c:froEach var="변수" item="아이템EL">
	....
    ${변수사용}
    ....
</c:forEach>
<!-- ex -->
int[] arr = {1,2,3,4,5}
for(int i : arr){
	System.out.println(i); // 1 2 3 4 5
}

- 자바 일반 for문처럼 사용

<c:forEach var="변수" begin="시작값" end="종료값" step="건너뛸값">
	....${변수}
</c:forEach>
<c:forEach var="변수" items="아이템EL" varStatus="status">
	${변수}
	${status.varStatus속성사용}
</c:forEach>

varStatus 속성

.index 현재 실행중인 index > 0 1 2 ...
.count 루프 실행 횟수 > 1 2 3 ...
.begin begin 속성값
.end end 속성값
.step step 속성값
.first 현재 실행이 첫번째 실행일 경우 true
.last 현재 실행이 마지막 실행인 경우 true
.current 컬렉션중 현재 루프에서 사용할 객체

⑥ c:forTokens 반복문, 구분자 사용

Token방식으로 잘라서 보여주는 반복문

<c:forTokens var="변수명" items="문자열" delims="구분자">
	....${변수}
</c:forTokens>

⑦ c:import include와 비슷

<c:import var="변수명" url="경로" />
${변수명}

⑧ c:redirect 단순이동

<c:redirect url="이동경로" />

⑨ c:url url 생성

http://..../jsp14/main.jsp?id=test
<c:url value="경로">
	<c:papam name="파라미터명" value="파라미터값" />
</c:url>

value : 경로는 절대경로와 상대경로 둘다 사용 가능

- 절대경로 : http://localhost:8080/web/jsp13/logonFrom.jsp

- 상대경로 : 웹 어플 내에서 절대경로 : /jsp13/loginFrom.jsp

현 jsp에 대한 상대경로 : ../jsp13/loginFrom.jsp

 

⑩ c:out 출력

<c:out value="출력EL" />

fmt : 국제화 코드

특정 지역에 맞게 출력하거나 숫자 날짜 관련된 태그

 

 fmt 태그 선언

<%@ taglib prefix="fmt" uri="http://java.sum.com/jsp/jstl/fmt" %>

 

 태그 종류

✔ 로케일 지정
setLocale  
requestEncoding 요청파라미터 캐릭터 인코딩 지정
✔ 숫자 및 날짜 포매팅
formatDate Date 객체 포매팅
parseDate 문자열로 표시된 날짜를 분석해 Date 객체로 변환
formatNumber 숫자 포매팅
parseNumber 문자열로 표시된 날짜를 분석해서 숫자로 변환
setTimeZone 시간대 정보 특정변수에 저장
timeZone 시간대 지정