학교/JAVA

06) JSP

서윤-정 2023. 12. 14. 12:11

 

💜 JSP (Java Server Page)

- 서블릿에 비해 쉬운 프로그래밍 구문 제공

- 서블릿으로 변환되어 실행

 

 

 

💛 서블릿과 JSP 비교

- 아래 장단점으로부터 서블릿과 JSP는 필요에 따라 이용하는 것이 바람직

 

 

 

 

🧡 JSP 실행 과정

1. login.jsp는 서블릿인 login_jsp.java로 변환

 

2. login_jsp.java를 컴파일하여, login_jsp.class를 생성

 

3. Java 리플렉션 API를 이용하여 login_jsp 클래스 파일을 메모리에 로드

Java 리플렉션은 주어진 파일을 메모리에 반영한다는 의미로, Class.forName() 함수에 의해 실행

(Java Reflection API 이용 - Class.forName())

 

4. 초기화를 위해 login_jsp 클래스의 jspInit() 함수가 호출

그리고 클라이언트로부터 요청이 올 때까지 대기

 

5. 클라이언트로부터 HTTP 요청이 전달된 경우 _jspService() 함수가 실행

해당 함수에는 사용자가 login.jsp에서 정의한 JSP 코드를 변환한 Java 코드가 포함되어 있음

 

 

 

 

 

1️⃣ login.jsp 변환 코드 확인

- 파일 탐색기에서 아래 경로로 이동하여 login_jsp.java 파일 열기

C:\work\project\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\
work\Catalina\localhost\ Hello\org\apache\jsp

 

2️⃣ login_jsp.java 코드 확인 (1/2)

- login_jsp.java 클래스: _jspInit, _jspService() 함수로 구성

(login_jsp.java)

public final class login_jsp extends org.apache.jasper.runtime.HttpJspBase
...
public void _jspInit() {
}
...
public void _jspService(final javax.servlet.http.HttpServletRequest request, final
javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
...
javax.servlet.jsp.JspWriter out = null;
...
out = pageContext.getOut();

 

 

3️⃣ login_jsp.java 코드 확인 (2/2)

- _jspService() 함수에 변환 코드가 위치 (거의 원본 코드와 1:1 대응)

(login_jsp.java)

out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"ISO-8859-1\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h3>User ID: ");
out.print( request.getParameter("id") );
out.write("</h3>\r\n");
out.write("</body>\r\n");
out.write("</html>");
...

 

 

 

 

 

 

 

 

🩷 JSP 스크립팅 요소

- 아래의 5가지 요소가 있으며, 공통적으로 <% ... %> 형식으로 정의

 

 

 1️⃣스크립트릿(Scriptlet)

- Java 코드 추가를 위해 이용되며, <% ... %> 내에 Java 코드 입력

(login2.jsp)

<html>
<%
String uid = request.getParameter("id");
String res = "<h3>User ID: " + uid + "</h3>";
out.print(res);
%>
</html>

 

 

* login2_jsp.java 확인

- 파일 탐색기에서 아래 경로로 이동하여 " login2_jsp.java" 코드 확인

C:\work\project\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\
work\Catalina\localhost\ Hello\org\apache\jsp

 

 

* 변환 규칙

- 기본적으로 1:1 대응 변환 규칙이 적용되며, 요소 별로 아래의 규칙 이용

- HTML 태그: out.write() 함수의 입력 파라미터로 전달

- 스크립트릿 내의 Java 코드: _jspService() 함수에 그대로 출력

 

 

 

2️⃣ 지시어 (Directive)

- JSP 페이지 처리에 필요한 부가 속성을 정의하기 위해 이용

- <%@ ... %> 안에 속성 정의

- JSP 파일 생성 시 이클립스에서 템플릿 코드에 포함되어 제공

 

* 지시어 종류

- page와 include에 대해 설명

- taglib는 JSTL(JSP Standard Tag Library)와 관계된 내용이며, 다루지 않음

 

 

(1) Page 지시어

- JSP 페이지 처리와 실행에 필요한 속성 정의

 

 

* 변환 규칙

- 기본적으로 1:1 대응 변환 규칙이 적용되며, 개행 문자가 출력되도록 변환

- 단, _jspService() 상단에 response.setContentType("text/html")이 추가됨

 

 

* response.setContentType("text/html")

- <html> 태그가 빠져 있어도 브라우저가 HTML 파일로 인식하도록 지원

 

* 한글처리

- Page 지시어에 pageEncoding 속성 값으로 “utf-8” 추가

- <form> 태그의 method 속성 값이 post일 경우 → 한글 깨짐

- request.setCharacterEncoding() 함수 추가

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
request.setCharacterEncoding("utf-8");
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
out.print(res);
%>

 

 

 

* Page 지시어의 import 속성

- 예제: 로그인 시간 출력 -> Date 클래스를 이용하려면?

(login4.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
request.setCharacterEncoding("utf-8");
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
out.print(res);
%>

 

 

 

* Include 지시어

(login5.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
request.setCharacterEncoding("utf-8");
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
out.print(res);
%>
<%@ include file="loginTime.jsp" %>

 

(loginTime.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%
String res1 = "<br>로그인 시간: " + (new Date()).toString();
out.print(res1);
%>

 

 

* login5.jsp의 변환 결과 -> loginTime.jsp의 코드가 함께 복사

( login5_jsp.java)

...
public void _jspService(final javax.servlet.http.HttpServletRequest request, final
javax.servlet.http.HttpServletResponse response)
...
request.setCharacterEncoding("utf-8");
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
out.print(res);
...
String res1 += "<br>로그인 시간: " + (new Date()).toString();
out.print(res1);
...

 

 

 

 

3️⃣ 선언문 (Declaration)

- 함수나 변수의 선언을 위해 이요되며, <%! ... %> 안에 정의

(login6.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%!
String getDate() {
return (new Date()).toString();
}
%>
<%
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
res += "<br>로그인 시간: " + getDate();
out.print(res);
%>

 

 

* 변환 규칙

- login6_jsp 클래스의 멤버 함수로 추가됨 (_jspSerivice()에 포함되지 않음에 유의)

 

 

 

4️⃣ 표현식 (Expression)

- 함수나 변수의 호출을 위해 이용되며, <%= ... %> 안에 정의

(login7.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
out.print(res);
String date = (new Date()).toString();
%>
로그인 시간: <%= date %>

 

* 변환 규칙

- 기본적으로 1:1 대응 변환 규칙이 적용

- out.write() 함수를 통해 함수나 변수 값이 출력되도록 출력되도록 변환