JSP는 HTML 내에 자바 코드를 삽입하여 동적인 웹 콘텐츠를 생성한다.
JSP 파일은 일반적으로 .jsp 확장자를 가지며, 웹 서버에서 실행될 때 서블릿으로 변환된다.
이 변환 과정에서 HTML과 자바 코드가 결합되어 최종적으로 클라이언트에게 전달되는 HTML 페이지를 생성한다.
지시어(Directives)
지시어는 JSP 파일의 상단에 위치하며, JSP 페이지의 전반적인 설정을 정의한다.
페이지의 내용 타입, 캐릭터 인코딩 등을 설정한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
스크립틀릿(Scriptlets)
스크립틀릿은 JSP 페이지 내에서 자바 코드를 직접 작성할 수 있는 부분이다.
스크립틀릿은 <% %> 태그로 감싸며, 일반적으로 동적인 데이터 처리나 계산을 수행한다.
<%
String message = "Hello, World!";
out.println(message);
%>
표현식(Expressions)
표현식은 자바 코드를 실행하고 그 결과를 HTML 콘텐츠로 삽입한다.
표현식은 <%= %> 태그로 감싸며, 주로 페이지의 동적 데이터를 출력하는 데 사용다.
<p>Current time: <%= new java.util.Date() %></p>
선언(Declarations)
선언은 JSP 페이지 내에서 변수나 메서드를 정의한다.
선언은 <%! %> 태그로 감싸며, 페이지의 여러 부분에서 사용할 수 있는 클래스를 정의한다.
<%!
private int add(int a, int b) {
return a + b;
}
%>
태그 라이브러리(Tag Libraries)
JSP에서 반복적이고 복잡한 작업을 간단하게 처리하기 위해 JSTL(JavaServer Pages Standard Tag Library)와 같은 태그 라이브러리를 사용할 수 있다. JSTL은 조건문, 반복문, 데이터 포맷팅 등 여러 유용한 태그를 제공한다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="${user != null}">
<p>Welcome, ${user.name}!</p>
</c:if>
JSP는 서블릿 기술의 확장으로 볼 수 있다. 서블릿은 자바로 작성된 서버측 애플리케이션 컴포넌트로, 클라이언트의 요청을 처리하고 응답을 생성한다. JSP는 HTML과 자바 코드를 혼합할 수 있는 방법을 제공하며, JSP 파일은 실행 시 서블릿으로 변환되어 서블릿과 동일한 방식으로 동작한다.
JSTL(JavaServer Pages Standard Tag Library)
JavaServer Pages (JSP)에서 웹 애플리케이션의 동적인 콘텐츠를 보다 쉽게 작성할 수 있도록 도와주는 표준 태그 라이브러리이다. JSTL은 JSP 페이지에서 자주 필요한 작업을 더 간단하게 수행할 수 있는 태그를 제공하며, 자바 코드의 직접 사용을 줄여서 JSP 페이지의 가독성과 유지보수성을 높인다.
JSTL은 EL(Expression Language)를 사용하여 표현한다.
Core Library (코어 라이브러리)
기본적인 조건문, 반복문, 변수 설정 등을 제공한다.
접두어: c
<c:out>: 데이터를 화면에 출력다. 기본적으로 XSS 공격을 방지하기 위해 HTML 이스케이프 처리가 된다.
<c:out value="${data}" />
<c:out value="${data}" default="값 없음" />
<c:set>: 변수를 설정한다. 변수의 범위(scope)는 page, request, session, application 중 하나로 설정할 수 있다.
<c:set scope="request" var="data" value="my_testValue" />
<c:forEach>: 컬렉션을 반복하여 처리한. 반복 인덱스나 상태 정보를 제공한다.
<c:forEach var="item" items="${itemList}" varStatus="status">
<c:out value="${item}" />
</c:forEach>
<c:if>: 조건문을 처리한다.
<c:if test="${empty data}">
data 값이 비어있으면 실행
</c:if>
<c:choose>, <c:when>, <c:otherwise>: if문 안의 복잡한 조건을 처리할 때 사용한다.
<c:choose>
<c:when test="${data == 'A'}">data 값이 A이면 실행</c:when>
<c:when test="${data == 'B'}">data 값이 B이면 실행</c:when>
<c:otherwise>data 값이 A, B가 아닐 경우 실행</c:otherwise>
</c:choose>
<c:import>: 다른 JSP 페이지의 내용을 현재 페이지에 삽입한다.
<c:import url="header.jsp" />
<c:redirect>: 클라이언트를 다른 URL로 리다이렉트한다.
<c:redirect url="http://example.com" />
Formatting Library (포맷팅 라이브러리)
날짜, 시간, 숫자를 포맷팅하고 국제화 및 다국어 지원 기능을 제공한다.
접두어: fmt
<fmt:formatDate>: 날짜를 형식화한다.
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd" />
<fmt:formatNumber>: 숫자를 형식화한다.
<fmt:formatNumber value="${price}" type="currency" />
Functions Library (함수 라이브러리)
문자열 처리와 관련된 함수를 제공한다.
접두어: fn
fn:contains: 문자열이 다른 문자열을 포함하는지 확인한다.
fn:substring: 문자열의 부분 문자열을 추출한다.
SQL Library (SQL 라이브러리)
데이터베이스와의 기본적인 CRUD 작업을 지원한다.
기능은 제공하지만 보안 및 성능 문제로 인해 데이터베이스 작업은 서블릿이나 DAO를 통해 처리하는 것이 좋다.
접두어: sql
<sql:query>: SQL 쿼리를 실행하고 결과를 반환한다.
<sql:query var="result" dataSource="${dataSource}">
SELECT * FROM users
</sql:query>
<sql:update>: 데이터베이스의 데이터를 업데이트한다.
<sql:update dataSource="${dataSource}">
UPDATE users SET name='John Doe' WHERE id=1
</sql:update>
XML Library (XML 처리 라이브러리)
XML 문서를 처리하고 쿼리한다.
접두어: x
<x:parse>: XML 문서를 파싱하여 DOM 객체를 생성한다.
<x:parse xml="${xmlData}" var="parsedXml" />
<x:out>: XML 데이터를 출력한다.
<x:out select="/root/node" />
연산자
연산자는 조건문에서 사용하는 비교 및 논리 연산자를 제공한다.
== (eq): 두 값이 같은지 비교
${1 == 1} <!-- true -->
${1 eq 1} <!-- true -->
!= (ne): 두 값이 다른지 비교
${1 != 1} <!-- false -->
${1 ne 1} <!-- false -->
< (lt), > (gt), <= (le), >= (ge): 값의 비교
${1 < 10} <!-- true -->
${1 gt 10} <!-- false -->
&& (and), || (or), ! (not): 논리 연산
${true && false} <!-- false -->
${true or false} <!-- true -->
empty 및 not empty: 변수의 유효성 검사
${empty name} <!-- name이 null이거나 빈 문자열이면 true -->
${not empty name} <!-- name이 null도 아니고 빈 문자열도 아니면 true -->
Status 속성 제어
<c:forEach> 태그의 varStatus 속성을 사용하여 반복문의 상태 정보를 얻을 수 있다.
<c:forEach items="${RESULT}" var="result" varStatus="status">
${status.current}<br/> <!-- 현재 아이템 -->
${status.index}<br/> <!-- 0부터의 순서 -->
${status.count}<br/> <!-- 1부터의 순서 -->
${status.first}<br/> <!-- 현재 루프가 처음인지 반환 -->
${status.last}<br/> <!-- 현재 루프가 마지막인지 반환 -->
</c:forEach>
JSTL for 문
<c:forEach>를 사용하여 다양한 방식으로 반복문을 제어할 수 있다.
인덱스로 접근
<c:forEach var="i" begin="1" end="5" step="1" varStatus="status">
번호 : ${status.count}
이름 : ${item[i].name}
직업 : ${item[i].job}
급여 : ${item[i].salary}
</c:forEach>
begin과 end로 접근
<c:forEach var="item" items="${list}" begin="0" end="5" step="1" varStatus="status">
번호 : ${status.count}
이름 : ${item.name}
직업 : ${item.job}
급여 : ${item.salary}
</c:forEach>
일반적인 접근
<c:forEach var="item" items="${list}" varStatus="status">
번호 : ${status.count}
이름 : ${item.name}
직업 : ${item.job}
급여 : ${item.salary}
</c:forEach>
JSTL break문 구현
JSTL은 기본적으로 break문을 지원하지 않지만, 조건문과 변수를 이용해 비슷한 효과를 낼 수 있다.
<c:set var="doneLoop" value="false" />
<c:forEach var="entity" items="${_STORE}" varStatus="status">
<c:if test="${status.count % 6 eq 1}">
<c:set var="doneLoop" value="false" />
</c:if>
<c:if test="${not doneLoop}">
<span><input type="checkbox" id="store_id" name="store_id" value="<c:out value="${entity.STORE_ID}"/>" <c:out value="${entity.USE_YN}"/>><c:out value="${entity.STORE_NM}"/></span>
<c:if test="${status.count % 6 eq 0}">
<c:set var="doneLoop" value="true"/>
</c:if>
</c:if>
</c:forEach>
비즈니스 로직과 프리젠테이션 로직의 분할
JSP(JavaServer Pages)에서 날짜 형식을 직접 변경하거나 리다이렉트를 수행하는 것은 바람직하지 않다. 이들 작업은 JSP 페이지의 주요 역할인 프레젠테이션(디스플레이) 로직과 비즈니스 로직의 경계를 흐릴 수 있으며, 코드 유지보수성과 명료성을 떨어뜨릴 수 있다.
- 프레젠테이션 로직: JSP의 주요 역할은 HTML과 자바 코드를 결합하여 동적인 웹 페이지를 생성하는 것이다.
- 이와 관련된 작업은 주로 데이터를 표시하거나 사용자 인터페이스를 구성하는 데 초점을 맞춘다.
- 비즈니스 로직: 날짜 형식 변경, 데이터베이스 작업, 리다이렉트와 같은 작업은 비즈니스 로직에 속한다. 이러한 작업은 JSP 페이지가 아니라, 서블릿, 서비스 레이어, 혹은 비즈니스 로직을 처리하는 별도의 컴포넌트에서 처리하는 것이 디자인 패턴에 맞다.
'CS > JAVA' 카테고리의 다른 글
클래스, 인스턴스, 인터페이스, 상속 (0) | 2024.08.15 |
---|---|
인터페이스와 프레임워크의 차이 (0) | 2024.08.15 |
Servlet (0) | 2024.08.14 |
세션의 값을 저장하고 꺼내는 법 (0) | 2024.08.14 |
추상클래스와 인터페이스 (0) | 2024.08.13 |