JSP: JSTL

JIHYUN·2023년 8월 20일
0

jsp

목록 보기
1/3

Servlet: 서버에서 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램

new dynamic web project > configure > convert to Maven project
package > create Servlet(inherited abstract methods, doGet)

Servlet/JSP 동작 방식:

Servlet: Server + Applet 합성어.

  • 웹 서버에서 실행되는, 요청을 처리하는 작은 Java 프로그램.
  • Java 클래스로 작성. HttpServlet 클래스를 상속.
  • 서블릿 객체의 생성과 서블릿 메서드 호출은 WAS가 담당.
    - 최초 요청: 서블릿 객체 생성 -> doGet, doPost 메서드 호출 -> 응답
    - 요청: 생성되어 있는 서블릿 객체의 doGet, doPost 메서드 호출 -> 응답.

서블릿 클래스의 URL 매핑(요청 주소)을 설정하는 방법:

  1. web.xml 설정 파일에서 설정 하거나,
  2. 서블릿 클래스에서 @WebServlet 애너테이션으로 설정하는 방법이 있음.
    (주의) web.xml과 애너테이션을 모두 설정하면 안됨.

doGet

클라이언트에서 GET 방식의 요청이 왔을 때 WAS(Web Application Server, Tomcat)가 호출하는 메서드.
파라미터 request: 클라이언트가 보낸 요청에 대한 정보를 가지고 있는 객체.
파라미터 response: WAS가 클라이언트로 보낼 응답을 작성하기 위해 필요한 기능들을 가지고 있는 객체.

doPost -> doGet

JSP: Java Server Page

  • 서블릿은 순수한 자바 클래스 코드이기 때문에 HTML을 작성하기가 힘듦.
  • HTML 형식의 문서 안에서 자바 코드들이 실행될 수 있도록 만든 Server-side 문법
  • JSP 실행 과정: jsp -> java -> class -> 객체 생성 -> 메서드 호출 -> 응답.
    - 최초 요청: jsp를 서블릿 클래스(java)로 변환 -> 컴파일해서 class 파일 생성 -> 객체 생성 -> 메서드 호출 -> 응답.
    - 요청: 생성되어 있는 객체에서 메서드 호출 -> 응답.

JSP 구성 요소(태그)

  1. 주석(comment): <@-- ... --%>
  2. 지시문(directive): <%@ ... %>, <%@ page ... %>, <%@ include ... %>, <%@ taglib ... %>, ...
  • Java class의 import 문장.
    <%@page import="java.time.LocalDateTime"%>
  • page 지시문: JSP 페이지의 설정. 컨텐트 타입 설정, 인코딩 설정, ...
    <%@page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
  • include 지시문을 사용한 jspf 파일 삽입
    include 지시문이 사용된 위치에 jsp, jspf, html 파일의 내용을 삽입하고 하나의 자바 클래스 파일로 변환되고 컴파일됨.
    <%@ include file="header.jspf" %>
  1. 선언문(devlaration): <%! ... %> JSP가 Java로 변환될 때, 클래스의 필드와 메서드를 선언하는 부분
  2. 스트립트릿(scriptlet): <% ... %> JSP 가 Java로 변환될 때, _jspService() 메서드 안에 포함되는 자바 코드 지역 변수 선언. 조건문, 반복문, 메서드 호출, ...
  3. 식, 표현식(expression): <%= ... %> JSP가 Java로 변환될 때, out.print() 메서드의 atgument로 전달되는 값. HTML에 바로 삽입되는 "값".

JSP form method(GET, POST)

  1. GET: 기본값. 클라이언트에서 서버로 보내는 정보가 질의 문자열(query string)에 포함.
  2. POST: 클라이언트에서 서버로 보내는 정보가 HTTP 패킷에 포함되는 방식.
    1. (참고) URL 형식
      프로토콜://서버주소:포트/(context root 포함)경로?질의문자열
<form action="form-result.jsp" method="post">
	<input type="text" name="username" placeholder="이름 입력" required autofocus />
    <input type="submit" value="전송" />
</form>

JSP scriptlet

  • scriptlet: JSP 안에서 Java 코드들을 작성하기 위한 태그.
    지역 변수 선언, 객체 생성, 메서드 호출, 조건문, 반복문, ...

JSP 액션 태그: 스크립트릿에서 사용되는 자바 코드들을 HTML 또는 XML 등에 사용되는 태그로 대체하기 위해서 정의된 태그.

  • <jsp:forward></jsp:forward>

  • <jsp:include></jsp:include>

    • <%@ include %> 지시문과 비슷하게 다른 JSP의 내용을 포함시킴.
    • jspf 확장자를 사용할 수 없고, jsp만 사용.
    • include하는 JSP 마다 각각의 Java 파일과 클래스들이 생성됨.
  • <jsp:useBean></jsp:useBean>

  • <jsp:getProperty></jsp:getProperty>

  • <jsp:setProperty></jsp:setProperty>

EL(Expression Language)

JSP expression 태그(<%= %>)를 대체하는 문법: ${ 식 }

  • 지시문 <%@ %> 안에서는 사용할 수 없음.
  • 선언문 <%! %> 안에서는 사용할 수 없음.
  • 스크립트릿 <% %> 안에서는 사용할 수 없음.
  • 식 <%= %> 안에서는 사용할 수 없음.
  • 그 이외의 JSP 안에서는 언제든지 사용 가능.
    - HTML 태그의 컨텐트
    - HTML 태그의 속성 값
    - CSS 프로퍼티 값
    - JavaScript 코드의 일부.

상태 정보 유지:

  • JSP에서 상태 정보들을 유지하기 위해서 사용하는 객체(변수 이름)들:

    • pageContext: JSP 페이지가 유지되는 동안
    • request: 요청 객체가 유지되는 동안
    • session: 세션이 유지되는 동안
    • application: 웹 애플리케이션이 동작하는 동안
    • 사용 범위: pageContext < request < session < application
  • EL에서 상태 정보들을 유지하기 위해서 사용하는 객체(변수 이름)들:

    • pageScope
    • requestScope
    • sessionScope
    • applicationScope
  • EL에서 상태 변수를 찾는 순서: ${ var }
    ${ pageScope.var }
    ==> ${ requestScope.var }
    ==> ${ sessionScope.var }
    ==> ${ applicationScope.var }

JSTL(JSP Standard Tag Library)

  1. POM.xml 파일에 의존성(dependency) 추가(jstl:jstl:1.2)
  2. JSTL을 사용하는 JSP 파일에서 taglib 지시문을 설정.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSTL forEach

<c:forEach items="${ contacts }" var="c">

JSTL set

<c:set var="colorValue2" value="black"></c:set>

JSTL if

<c:if test="${ param.color == 'r' }"></c:if>

JSTL choose, when

<c:choose>
    <c:when test="${ param.username == 'admin' }">
        <h2>관리자 페이지</h2>
    </c:when>
    <c:otherwise>
        <h2>일반 사용자 페이지</h2>
    </c:otherwise>
</c:choose>

JSTL url, param

<c:url var="reqURL" value="form2-result.jsp">
    <c:param name="username" value="adm&in"></c:param>
    <c:param name="color" value="g"></c:param>
</c:url>

<c:url>에서 "/" 요청주소는 context root까지.

<c:url var="mainPage" value="/"></c:url>
<a href="${ mainPage }">메인 페이지</a>

JSTL <fmt:formatDate>

java.sql.Date, java.sql.Timestamp 타입의 객체들을 원하는 형식으로 포맷팅.
java.time.LocalDate, java.time.LocalDateTime 객체들은 포맷팅을 못함.

<c:set var="now" value="<%= Timestamp.valueOf(LocalDateTime.now()) %>"></c:set>

<h2>${ now }</h2>
<h2>date: 
  	<fmt:formatDate value="${ now }" type="date" />
</h2>
<h2>time:
   	<fmt:formatDate value="${ now }" type="time" />
</h2>
<h2>date &amp; time:
	<fmt:formatDate value="${ now }" type="both" />
</h2>
<h2>
    <fmt:formatDate value="${ now }" type="both" dateStyle="full" timeStyle="full" />
</h2>
<h2>
    <fmt:formatDate value="${ now }" type="both" dateStyle="short" timeStyle="short" />
</h2>
<h2>
   <fmt:formatDate value="${ now }" pattern="yyyy/MM/dd HH:mm:ss" />
</h2>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.itwill</groupId>
    <artifactId>post</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <description>JSP MVC example</description>
    <dependencies>
        <!-- Tomcat 10.1 WAS에서 JSTL을 사용하기 위해서. -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!-- JUnit Test -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.3</version>
            <scope>test</scope>
        </dependency>
        <!-- Oracle JDBC library -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <version>23.2.0.0</version>
        </dependency>
        <!-- HikariCP - Connection Pool -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>5.0.1</version>
        </dependency>
        <!-- Log4j - 로그 출력 라이브러리 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>17</release>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
            </plugin>
        </plugins>
    </build>
</project>
profile
🍋

0개의 댓글