💜 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() 함수를 통해 함수나 변수 값이 출력되도록 출력되도록 변환
'학교 > JAVA' 카테고리의 다른 글
07) 내장 객체 예제 (0) | 2023.12.15 |
---|---|
05) 서블릿 (0) | 2023.12.14 |
07) JSP 내장 객체 종류 (0) | 2023.12.14 |
모바일 웹 서비스 구현을 위한 JSP 웹 프로그래밍 연습문제_07 JSP 내장 객체 (0) | 2023.12.13 |
모바일 웹 서비스 구현을 위한 JSP 웹 프로그래밍 연습문제_06 JSP (0) | 2023.12.13 |