JSP 기본 구조

박영준·2024년 6월 5일
0

JSP

목록 보기
2/17

1. 전체적인 구조

2. 스크립트릿, 지시어, 속성

  • 해당 JSP페이지의 처리 방법을 JSP엔진에 '지시' 해주는 역할

  • 주로 스크립트 언어나 인코딩 방식등을 설정

1) <% %> 스크립트릿

해당 기호 내에서 스크립트 요소(JSP 페이지에서 여러 동적 처리를 제공)를 Java 코드로 구현
(스크립트 요소 : HTML 파일 중간에 자바 코드를 삽일할 때 사용)

스크립트(script)요소
1. <% %> 스크립트릿

<% 
    int total = 0;
    for(int i = 1; i <= 10; i++){
        total = total + i;
    }
%>

기존 자바 언어를 동일하게 사용할 수 있는 태그

  1. <%@ %> 지시자
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

JSP 페이지가 컨테이너에게 필요한 메시지를 보내기 위한 태그.
JSP 페이지의 전체적인 환경 설정 시에 사용 (문서 종류, 인코딩 방식 등... 지정).

  1. <%! %> 선언
<@!
  int a; 
  int b;
%>

페이지 내 어디서나 접근할 수 있는 전역 변수 및 메소드 선언

  1. <%= %> 표현식
1부터 10까지의 합 : <%=total %>

변수 또는 메소드의 결과값을 출력

2) 지시어 & 속성

여러가지의 속성을 지정할 수 있으며, 속성은 지시어마다 다르다

(1) page 지시어

해당 JSP 페이지의 속성을 지정하는 역할

① 속성

속성역할
language페이지에서 사용할 언어셋 설정
contentType페이지의 문서 타입 지정
pageEncoding현재 페이지의 인코딩 타입을 지정
import다른 페이지의 클래스나 메소드를 추가(불러옴)
errorPage에러 발생시 사용될 페이지를 설정
isErrorPagetrue일 경우 현재 페이지를 에러 페이지로 지정
bufferJSP 페이지내 출력 버퍼값을 지정
autoFlush출력 버퍼가 초과되면 수행할 기능을 지정(true, fasle)
isThreadSafe다중 Thread를 사용여부 설정(true, fasle)
sessionSESSION 사용 여부를 지정
info해당 페이지의 설명
extends페이지내에서 상속받을 클래스를 지정

② 예시 : import 속성

<%@ page languge="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.text.SimpleDateformat"%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>page 지시어-import 속성</title>
</head>
<body>
    <%
        Date today = new Date(); <!-- 외부 클래스 생성 -->
        SimpleDateformat dateFormat = new SimpleDateformat("yyyy-mm-dd"); <!-- 외부 클래스 생성 -->
        Stirng todayStr = dateFormat.format(today);
        out.println("오늘날짜 : " + todayStr); <!-- 오늘 날짜를 웹브라우저에 출력 -->
    %>
</body>
</html>
  • 예시에서 import 속성을 사용하여, Date 클래스와 SimpleDateFormat 클래스를 불러온 이유?
    • Date 클래스와 SimpleDateFormat 클래스는 java.lang패키지에 속하지 않기 때문에 현재 문서에 사용하기 위하여 import를 진행

이클립스에서 JSP파일을 생성하면 "language, contentType, pageEncoding" 속성이 기본적으로 삽입됨

  • languge : 스크립팅 언어는 자바를 사용
  • contentType : 문서의 타입, 즉 MIME타입은 text/html이고, 캐릭터셋은 UTF-8
  • pageEncoding : 소스코드의 인코딩 방식은 UTF-8 방식

③ 예시 : errorPage, isErrorPage 속성

어떤 웹페이지에서 에러가 발생한 경우에 미리 만들어둔 페이지를 불러올 수 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="IsErrorPage.jsp" isErrorPage = "true"%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>errorPage, isErrorPage 속성</title>
</head>
<body>
    <%
        int myAge = Integer.parseInt(request.getParameter("age")) + 10; <!-- 에러가 발생 -->
        out.println("10년 후 당신의 나이는 : " + myAge + "입니다."); <!-- 실행되지 않음 -->
    %>
</body>
</html>
  • 예시 코드에서 발생한 문제?
    "age"라는 이름의 매개변수 값을 받아와 정수로 변환해야되는데, 최초 실행 시 매개변수가 없으므로 null값이 전달되어 에러가 발생한다.
    (interger.parseInt() : String타입의 숫자를 int타입으로 변환)
    (request.getParameter() : 웹브라우저에서 전달한 parameter값을 가져옴)

  • 해당 속성 사용 목적?
    JSP 실행 도중 에러가 발생하면 에러화면을 웹브라우저에 표시해주게 되는데 이때 일부 코드가 노출되게 된다.
    이를 방지하기 위해 try/catch문을 사용하거나 or 디자인이 적용된 페이지로 대체 가능(errorPage, isErrorPage속성)

  • errorPage="IsErrorPage.jsp : errorPage가 발생할 경우 IsErrorPage.jsp가 보여지도록 함
    isErrorPage = "true" : isErrorPage = "true"로 지정 함

④ 예시 : trimDirectiveWhitespaces 속성

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>trimDirectiveWhitespaces 속성</title>
</head>
<body>
	<h2>page지시어로 생긴 불필요한 공백 제거 </h2>
</body>
</html>
  • 지시어 때문에 생성된 불필요한 공백을 제거

  • 해당 속성 사용 목적?

    • 일반적으로는 크게 문제는 없으나, 안드로이드와 같은 외부 기기와 연동시 가끔 문제를 일으키키도 하기 때문 (컴퓨터 입장에서는 공백도 하나의 문자로 인식하기 때문)

⑤ 예시 : buffer, autoFlush 속성

<!-- 버퍼 설정 : buffer의 크기는 1kb로 지정, 버퍼가 채워지면 예외를 발생시킴 -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" buffer="1kb" autoFlush="false"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>pagebuffer, autoFlush 속성</title>
</head>
<body>
	<%
		for(int i=1; i<=100; i++)
		{                              <!-- 버퍼 채우기 -->
			out.println("abcde12345");
		}
	%>
</body>
</html>
  • buffer

    • '버퍼'라는 임시 저장소를 두어서, 데이터들이 충분히 쌓일 때까지 기다렸다가 보내는 것

    • 버퍼 속성 이동경로

      • 버퍼가 없을 때, 입력 즉시 전송

        • 키보드 ---> 프로그램
      • 버퍼 사용 시, 입력 후 버퍼에 저장되고, 버퍼가 가득차면 프로그램으로 전송

        • 키보드 ---> 버퍼 ---> 프로그램
    • buffer의 사용유무
      <%@ page buffer="1kb"%> : 버퍼의 크기를 설정할 수 있고, 기본값을 8kb로 되어있다.

      <%@ page buffer="none"%> : 버퍼를 사용하지 않을 때 none을 한다. (none으로 지정하는 경우 거의 없음)

  • autoFlush

    • 버퍼가 모두 채워졌을 때의 처리 방법을 정하는 데 사용

    • 플러시(flush) : 버퍼 안의 데이터를 목적지로 전송하고 버퍼를 비우는 작업

    • true(기본값) : 버퍼가 채워지면 자동으로 플러시
      false : 버퍼가 채워지면 예외를 발생시킴

(2) include 지시어

외부 파일을 현재 JSP페이지에 포함시킬 수 있다. (현재 JSP 내에서 다른 JSP를 추가)

IncludeFile.jsp(포함될 페이지)

<%@ page import="java.time.LocalDateTime" %>
<%@ page import="java.time.LocalDate"%>

<%
    LocalDate today = LocalDate.now();  <!-- 오늘 날짜 -->
    LocalDateTime tomorrow = LocalDateTime.now().plusDay(1);    <!-- 내일 날짜 -->
%>
  • 포함 될 파일이기 때문에 html요소는 다 제거하되, page 지시어는 사용해야 jsp정상적으로 작동한다.

위 파일을 포함할 메인 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ include file="IncludeFile.jsp"%> <!-- 현재 페이지에 IncludeFile.jsp파일을 포함시킨다는 의미 -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>include지시어</title>
</head>
<body>
  	<!-- IncludeFile.jsp를 포함하면서 IncludeFile.jsp에서 선언한 변수를 사용할 수 있게 된다 -->
    <%
    	out.println("오늘 날씨 : " + today);	<!-- 오늘 날짜 : 2021-12-20 -->
        out.println("<br/>");
        out.println("내일 날짜 : " + tomorrow);	<!-- 내일 날짜 : 2021-12-21 -->
    %>
</body>
</html>
  • <%@ include file="포함할 파일의 경로"%>

  • 반복적인 부분(웹사이트에서 상단이나 하단메뉴 등...)을 별도의 파일에 작성해 두어서, 필요한 페이지에서 그 파일을 include하여 가져다 쓸 수 있다.

(3) taglib 지시어

커스텀 태그 라이브러리를 JSP 파일에서 사용하기 위한 지시어

  • 직접적으로 Java 코드를 넣지 않고, Java 파일을 taglib를 통해서 연결/캡슐화하여 사용

  • <%@ taglib uri="태그 라이브러리 경로" 혹은 tagdir="태그 파일 경로" prefix="태그 접두어" %>

    • uri : 태그 라이브러리 위치로 태그를 정의하고 있는 .tld 파일 경로
    • tagdir : 태그 파일로 태그를 구현한 경우 태그 파일 경로
    • prefix: 해당 태그를 구분해서 사용하기 위한 접두어

TLD (Tag Library Descriptor)

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"    
	xmlns:xml="http://www.w3.org/XML/1998/namespace"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "> 

	<tlib-version>0.0</tlib-version>    
  	<short-name>customTag</short-name>    
  	<uri>http://customTag.com</uri>    

</taglib>
  • JSP에서 사용되는 커스텀 태그나 JSTL의 태그들에 대한 설정 파일
  • 개발한 태그 핸들러에 대해 속성이나 속성의 타입, 태그명, uri 등에 대해 정의해두는 설정 파일
  • *.tld라는 확장자를 가짐
  • 웹 어플리케이션 경로의 WEB-INF 디렉터리 하위에 작성해야함
  • XML 기반

JSTL (JSP Standard Tag Library)

...
  <dependencies>
 ...
    <!-- taglibs -->
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>datetime</artifactId>
        <version>1.0.1</version>
    </dependency>       
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>string</artifactId>
        <version>1.1.0</version>
    </dependency>       
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.1.2</version>
    </dependency>
  </dependencies>
  • 자주 사용될 수 있는 커스텀 태그들을 모아서 표준으로 모아놓은 태그 라이브러리

참고: JSP 지시어 종류와 사용 예제
참고: [서블릿/JSP] TLD(Tag Library Descriptor)란? tld 파일 작성 방법
참고: [JSP] JSP (Java Server Pages) 정의와 태그, 사용 예제

profile
개발자로 거듭나기!

0개의 댓글