JSP

[JSP] JSP 기초, 내장 객체

728x90
반응형

JSP (Java Server Pages)

동적인 웹 페이지를 개발하기 위한 웹 프로그래밍 기술

많은 확장 라이브러리, 정부 표준 프레임워크의 근간

* 동적인 페이지 : 사용자마다 다른 결과로 응답

 

  • WAS : Web Application Server, 웹 애플리케이션이 시행될 수 있는 환경을 제공하는 소프트웨어
  • HTTP : 웹 서버와 사용자 사이의 통신을 위해 사용하는 통신 프로토콜
  • Protocol : 네트워크를 통해 컴퓨터들이 정보를 주고받는 절차 또는 통신 규약
  • Port : 컴퓨터 사이에서 데이터를 주고받을 수 있는 통로
  • 정적 웹 페이지 : 저장되어 있는 파일을 그대로 웹 브라우저에 전송해 출력하는 가장 기본적인 웹 페이지 
  • 동적 웹 페이지 : 동일한 페이지라 할지라도 내용이 달라질 수 잇는 웹 페이지
  • 서블릿 : 클라이언트의 요청을 받으면 서버에서 처리하고, 결과 값만 응답으로 보내는 구조
  • 서블릿 컨테이너 : 클래스 형태의 컴파일된 자바 파일을 실행하고 관리하는 런타임 ex) 톰캣

 

서블릿은 자바 코드에 HTML을 삽입하는 과정에서 코드가 복잡해지는 단점이 있다.

이 때문에 HTML을 베이스로 필요 부분만 자바 코드를 삽입하는 JSP가 탄생하게 되었다.

 

JSP는 지시어와 스크립트로 구분할 수 있다.

스크립트는 다시 선언부, 표현부, 스크립틀릿으로 나뉜다.


지시어 : JSP 페이지를 자바 코드로 변환하는데 필요한 정보를 알리는 것

- 지시어 종류 3가지

page 지시어 : JSP 페이지 정보 설정 (문서 타입, 에러 페이지 등)

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

// import
<%@ page import="java.util.Date"%>

// errorPage: 에러 발생 시 대체할 페이지
<%@ page language=... isErrorPage="true"%>

// trimDirectiveWhitespaces: 지시어로 생긴 불필요한 공백 제거 - 불필요한 오류 방지
<%@ page language=... trimDirectiveWhitespages="true"%>

// buffer, autoFlush
<%@ page buffer="1kb"%> // option: none
  • 버퍼 : 데이터를 묶음으로 전송하기 위한 임시 저장소
  • autoFlush : 버퍼가 채워졌을 때의 처리방법 // true: 버퍼가 채워졌을 때 자동으로 플러시. false: 버퍼가 채워지면 예외 발생
  • Flush: 버퍼안의 데이터를 목적지로 전송하고 버퍼를 비우는 작업

 

include 지시어 : 외부 파일을 포함 (다른 JSP나 HTML 페이지)

<% include file="파일 경로"%>

포함한 파일의 변수를 사용할 수 있다

 

tablib 지시어 : EL(표현 언어)에서 자바 클래스의 메서드를 호출하거나 JSTL을 사용하기 위한 지시어

 


스크립트 : JSP에서 자바 코드를 직접 작성할 수 있게 해준다

- 스크립트 요소 3가지

선언부 : 멤버 변수나 메서드 선언

<%! 메서드 선언 %>

 

스크립틀릿(Scriptlet) : 실행돼야 할 자바 코드를 작성

선언부에서 정의한 메서드를 호출만 가능하다 (다른 메서드 선언 불가능)

<% 자바 코드 %>

 

 

표현식 : 실행 결과로 하나의 결과값이 남는 문장

<%= 자바 표현식 %>

 

 


 

내장 객체 : 요청과 응답, HTTP header 등의 정보를 쉽게 다룰 수 있게 함. JSP 페이지가 실행될 때 컨테이너가 자동으로 생성함

 

내장 객체의 종류 

- request 객체 : 클라이언트의 요청을 받을 때

클라이언트의 요청 정보를 저장

 

요청 방식

  • Get : URL에 쿼리스트링으로 매개변수가 전달됨
  • POST : URL에 매개변수가 보이지 않는 상태로 전달

 

<%
// 데이터 한글 인코딩
request.setCharacterEncoding("UTF-8");

// 가장 일반적인 형태, 가져온 페이지 정보에서 name="id"인 값을 호출
String id = request.getParameter("id");

// checkbox와 같이 여러 개의 값을 받아야 할 때는 getParameterValues() 사용
String[] chkbox = request.getParameterValues("chkbox");
String chkboxStr = "";
if (chkbox != null) {
	for (int i = 0; i < chkbox.length; i++) {
    	chkboxStr += chkbox[i] + " ";
    }
}   

// textarea는 텍스트를 여러 줄 입력하므로 줄바꿈을 반영해야 함
String textArea = request.getParameter("textArea").replace("\r\n", "<br/>");

%>

 

request.getHeaderNames() 메서드를 통해 HTTP 프로토콜의 정보를 확인할 수 있다.

  • user-agent : 웹 브라우저의 종류
  • referer : 웹 사이트 방문객의 접속 경로
  • cookie : 쿠키

- response 객체 : 응답을 웹 브라우저로 보낼 때

요청에 대한 응답을 웹 브라우저로 보내주는 역할

페이지 이동을 위한 redirect, HTTP 헤더에 응답 헤더 추가가 있다.

 

redirect : JSP에서는 페이지 이동을 위해 response 내장 객체의 sendRedirect()를 이용한다.

<%
if (idequalsIgnoreCase("ID") && pwd.equalsIgnoreCase("Password")) {
	response.sendRedirect("데이터를 전송할 페이지.jsp");
}
%>

 

HTTP 헤더에 응답 헤더 추가

  • add 계열 : 헤더값을 새로 추가할 때 사용. 동일한 헤더명이 있으면 동일한 이름으로 값 추가
  • set 계열 : 기존의 헤더를 수정할 때 사용. 동일한 헤더명이 없으면 새롭게 추가
<%
// 헤더에 값 추가
response.addHeader("myName", add_str);

// 헤더 값 수정
response.setHeader("myName", "유재석");
%>

 

 


- out 객체 : 값을 웹 브라우저에 출력할 때 

out 내장 객체는 버퍼를 사용한다. 버퍼의 기본값은 8KB이고, 버퍼의 크기는 재설정 할 수 있다.

<%
out.clearBuffer();	// 버퍼를 비움 (이전의 out.~ 기록이 사라진다)
out.flush();	// 버퍼 내용을 강제로 플러시
%>

 

 

- application 객체 : 웹 애플리케이션에 대한 설정값 저장할 때

  • 웹 애플리케이션당 하나만 생성된다.
  • 모든 JSP페이지에서 접근할 수 있다.

web.xml : 웹 애플리케이션에 대한 여러 설정을 저장하는 곳, 배포 서술자라고도 한다.

 

 

- exception 객체 : 예외 처리할 때

오류명과 오류페이지를 출력하는 부분에서 사용되고 있다.

에러 코드 의미 해결 방법
404 Not Found : 문서를 찾을 수 없음 경로명이나 파일명을 확인
405 Method Not Allowed : GET, POST 방식의 요청을 처리할 컨트롤러가 없다 doGet(), doPost() 메서드가 적절히 오버라이딩 되었는 지 확인
500 Internal Server Error : 코드에 오타가 있거나 로직에 문제가 있는 경우 코드를 전반적으로 확인해야 함
- web.xml

<error-page>
	<error-code>404</error-code>
	<location>./Exception.jsp</location>
</error-page>

- Exception.jsp
<%
int status = response.getStatus();	// 에러 코드 확인 #404

if (status == 404) {
	out.println("Error 404");
}
else if (status == 405) {
	out.println("Error 405");
}
..

%>