본문 바로가기
back-end/sevlet+ jsp+MVC

JSP(Java Server Page)

by 모두의 향연 2022. 4. 4.
728x90
반응형

💡 JSP (Java Server Page)

자바 서버 페이지(영어: JavaServer Pages [1] , JSP)는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어이다. Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작한다. 자바 서버 페이지는 실행 시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다. 하지만, 서블릿과는 달리 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다. 1999년 썬 마이크로시스템즈에 의해 배포되었으며 이와 비슷한 구조로 PHP, ASP, ASP.NET 등이 있다. 아파치 스트럿츠나 자카르타 프로젝트의 JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩 없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다.

 

💡 jsp 동작 흐름

jsp동작흐름

 

서블릿과 jsp는 완전히 비슷하다. 모양만 바뀌었지 내부적으로 돌아가는 건 똑같다고 보면 된다. 하지만, 큰 차이점이 있다. jsp를 실행하게 되면 jsp가 실행되는 게 아니고 jsp가 내부적으로 servlet으로 변환이 일어난다. 그다음 자동으로 class파일로 컴파일이 일어나고 실제로 메모리에 올라가는 건 servlet이다.

 

 

💡 jsp생성법

java을 제외한 파일은 모두 WebContent

WebContent-New-JSP File
jsp파일을 생성해본다
html파일과 진짜 비슷하다. 위에 %뭐가 있긴하다
body안에 글을 넣자.  [jsp와 이전에 만든 servlet 비교]
F11눌러 실행하면 잘 나온다

 

 

💡 jsp가 servlet에서 실행되는지 확인

실제로 에러가 나면 jsp가 아닌 'java파일 xx 줄에서 에러 납니다'라고 뜬다.

이클립스의 파일이 실행되고 있는 파일로 들어가 이 경로로 들어가본다. 그럼 jsp가 실행되고 있는 java파일이 나온다. VScode로 실행해서 열어보자
그 다음 이클립스에서 jsp에 name변수를 생성하고 body안에 넣어보자
jsp에서 생성한 변수가 들어가있다=즉 내부적으로 jsp가 servlet으로 바뀌고 있다는 걸 보여준다

servlet문법=jsp문법

이렇게 적어본다
F11눌러보니 잘 나온다

 out이라는 객체를 만든 적이 없는데 잘 나오는 이유는 뭘까?

name만 만들었지 out을 만들진 않았다. 

코드 중간에 보면 out객체가 이미 만들어져 있다. jsp와 servlet이 다른 이유 중 하나가 내부적으로 container가 만들어주는 객체가 있다는 점. 9개의 기본객체(=내장객체)
jsp에서 한글도 깨지지 않는다. 이유는 jsp를 생성할 때 맨 앞에 자동으로 써있는

[알쓸신잡] jsp와 서블릿 중 어떤 게 빠를까?
jsp는 서블릿을 거쳐야 하기 때문에 서블릿보다 느리다고 생각할 수 있다. 하지만, jsp는 최초 요청 시 한 번만 호출되기 때문에 서블릿보다 느리다고 할 수 없다. 개발자가 테스트하기 위해 가장 먼저 서버에 들어가기 때문에 사용자가 jsp를 최초로 요청할 일은 없다. jsp는 코딩은 스크립트 언어로 실행은 컴파일 언어인 servlet을 거치기 때문에 두 개의 장점을 다 갖고 있다.

 

💡 JSP 스크립팅 요소(Scripting Element)

1. 선언 (Declaration): 멤버 변수 선언이나 메서드를 선언하는 영역

<%! 멤버변수와 method작성 %>

<%!
	String name = "모두의 향연";

	public void init(){
		name="모두의 향연";
	}
%>

jsp에 이전과 다르게 '<' 다음에 '!'를 붙여본다.
실행된 서블릿을 보니 name변수가 맨위로 호출되어있다. 느낌표를 쓰면 선언하겠다는 의미라서 변수가 맨 앞으로 이동한다.

 

 

2. 스크립트릿 (Scriptlet): Client 요청 시 매번 호출 영역으로, Servlet으로 변환 시 service() method에 해당되는 영역, request, response에 관련된 코드 구현

<%자바코드%>

 

3. 표현식 (Expression): 데이터를 브라우저에 출력할 때 사용

<%=문자열%>

<body>
	안녕하세요.
	<%=name%>입니다.  // <%= 문자열 %> == <% out.print(문자열); %> : 같은 표현
</body>

주의) <%= 문자열; %> : 문자열 뒤 세미콜론(;)은 작성X

 

 

4. 주석 (Comment): 코드 상에서 부가 설명을 작성

<%-- 주석 할 code --%>

<!-- 보이나요? HTML --> //HTML주석
<%-- 보이나요? JSP --%> //jsp주석

HTML주석은 소스보기를 하면 보이지만,JSP주석은 서버에서부터 가려서 처리됨

HTML주석은 서버에서 실행을 다 하고 가져온걸 안 보이게 하는 것, 주로 여기서 NullPointException 나옴, 자바가 스크립트나 html보다 먼저 실행되기 때문에 자바스크립트 안에 if를 가지고 제어 불가능

JSP주석은 자바 주석이다. 서버에서 아예 제거하고 진행

 

 

💡 jSP 지시자 (Directive): % 뒤에 @가 나온다면

1. page Directive: 컨테이너에게 현재 JSP페이지를 어떻게 처리할 것인가에 대한 정보를 제공한다

 <%@ page attr1=“val1” attr2=“val2” … %>
속성 기본값 설명
language java 스크립트에서 사용 할 언어 지정
info   현재 JSP 페이지에 대한 설명
contentType text/html;charset=ISO-8859-1 브라우저로 내보내는 내용의 MIME 형식 지정 및 문자 집 합 지정
pageEncoding ISO-8859-1 현재 JSP 페이지 문자집합 지정
import   현재 JSP 페이지에서 사용할 Java 패키지나 클래스를 지정
session true 세션의 사용 유무 설정
errorPage   에러가 발생할 때에 대신 처리될 JSP 페이지 지정
isErrorPage false(에러페이지가 아니다가 기본이고 에러페이지일때 true라고 설정) 현재 JSP 페이지가 에러 핸들링 하는 페이지인지 지정하는 요소
buffer 8KB 버퍼의 크기
autoflush true 버퍼의 내용을 자동으로 브라우저로 보낼 지에 대한 설정
isThreadsafe true 현재 JSP 페이지가 멀티 쓰레드로 동작해도 안전한지 여부 를 설정하는 것으로 false인 경우 JSP페이지는 SingleThread로 서비스 된다
extends javax.servlet.jsp.HttpJspPage 현재 JSP 페이지를 기본적인 클래스가 아닌 다른 클래스로 부터 상속하도록 변경

 

2. include Directive: 특정 jsp file을 페이지에 포함, 여러 jsp페이지에서 반복적으로 사용되는 부분을 jsp file로 만든 후 반복 영역에 include 시켜 반복되는 코드를 줄일 수 있다

<%@ include file=“/template/header.jsp” %>

 

3. taglib Directive: JSTL 또는 사용자에 의해서 만든 커스텀 태그(custom tag)를 이용할 때 사용되며 JSP 페이지 내에 불필요한 자바 코드를 줄일 수 있다

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

 

 

💡 JSP 기본 객체

기본 객체명 Type 설명
request javax.servlet.http.HttpServletRequest HTML 폼 요소의 선택 값 등 사용자 입력 정보를 읽어올 때 사용
response javax.servlet.http.HttpServletResponse 사용자 요청에 대한 응답을 처리하기 위해 사용
pageContext javax.servlet.jsp.PageContext 각종 기본 객체를 얻거나 forward 및 include 기 능을 활용할 때 사용
session(기본값이 true라서 false로 설정해놓으면 기본객체는 안만들어진다) javax.servlet.http.HttpSession 클라이언트에 대한 세션 정보를 처리하기 위해 사용, page directive의 session 속성을 false로 하면 내장 객체는 생성이 안된다
application javax.servlet.ServletContext 웹 서버의 애플리케이션 처리와 관련된 정보를 레퍼런스하기 위해 사용
out javax.servlet.jsp.JspWriter 사용자에게 전달하기 위한 output 스트림을 처리할 때 사용
config javax.servlet.ServletConfig 현재 JSP에 대한 초기화 환경을 처리하기 위해 사용
page java.lang.Object 현재 JSP페이지에 대한 참조 변수에 해당됨
exception(세션과 반대로 기본값이 false인데, isErrorPage를 true라고 설정하면 만들어진다) java.lang.Exception Error를 처리하는 JSP에서 isErrorPage속성을 true로 설정하면 exception내장 객체를 사용할 수 있고 기본은 false로 설 정되어 있다. 전달된 오류 정보를 담고 있는 내장 객체

세션을 false라고 해놓으면 자동완성이 안된다
isErrorPage의 기본값은 false인데 true로 설정했더니 exception의 자동완성이 생긴다

 

 

💡 JSP 기본 객체의 영역(scope)

기본객체 설명
pageContext 하나의 JSP페이지를 처리할 때 사용되는 영역. 한번의 클라이언트 요청에 대하여 하나의 JSP 페이지가 호출되며, 이때 단 한 개의 page객체만 대응이 된다. 페이지 영역에 저장한 값은 페이지를 벗어나면 사라진다.
※ 커스텀 태그에서 새로운 변수를 추가할 때 사용한다
request 하나의 HTTP 요청을 처리할 때 사용되는 영역. 웹 브라우저가 요청을 할 때마다 새로운 request객체가 생성됨. request영역에 저장한 속성은 그 요청에 대한 응답이 완료되면 사라진다.
session 하나의 웹 브라우저와 관련된 영역. 같은 웹브라우저 내에서 요청되는 페이지들은 같은 session들을 공유하게 됨.
※ 로그인 정보 등을 저장한다.
application 하나의 웹 어플리케이션과 관련된 영역. 웹 어플리케이션당 1개의 application 객체가 생성됨. 같은 웹 어플리케이션에서 요청되는 페이지들은 같은 application객체를 공유함

 

 

💡 JSP 기본 객체의 영역(scope) 공통 method:servlet과 jsp페이지 간에 특정 정보를 주고받거나 공유하기 위한 메서드를 지원

method 설명
void setAttribute (String name , Object value) 문자열 name 이름으로 Object형 데이터를 저장한다.
Object형이므로 어떠한 Java 객체도 저장이 가능하다.
Object getAttribute(String name) 문자열 name에 해당하는 속성 값이 있다면 Object 형태로 가져오고 없으면 null 을 리턴 한다. 따라서 리턴 값에 대한 적절한 형 변환이 필요하다.
Enumeration getAttributeNames() 현재 객체에 저장된 속성들의 이름들을 Enumeration 형태로 가져온다.
void removeAttribute(String name) 문자열 name에 해당하는 속성을 삭제한다.

 

 

💡 WEB Page 이동

  forward(request, response) sendRedirect(location)
사용 방법 RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
response.sendRedirect(location);이동 범위 
이동 범위 동일 서버(project)내 경로 동일 서버 포함 타 URL 가능
location bar 기존 URL 유지 (실제 이동되는 주소 확인 불가) 이동하는 page로 변경
객체 기존의 request와 response가 그대로 전달 기존의 request와 response는 소멸되고, 새로운 request와 response가 생성.
속도 비교적 빠름 forward()에 비해 느림
데이터 유지 request의 setAttribute(name, value)를 통해 전달 request로는 data 저장 불가능.
session이나 cookie를 이용

 

728x90
반응형

'back-end > sevlet+ jsp+MVC' 카테고리의 다른 글

JSTL (JSP Standard Tag Library)  (0) 2022.04.10
EL(Expression Language)  (0) 2022.04.10
HttpSession/Cookie  (0) 2022.04.09
servlet  (0) 2022.04.07