지난 포스팅에서
JSP의 역할을 알아보았다.
JSP는 jasper가 Dynamic하게
처리할 부분을 표시한 문서이다.
개발자는 HTML 코드 중
Dynamic한 부분을 코드블록을 사용하여
표현해야한다.
<% %>
jasper는 JSP 문서를
서블릿 클래스로 변환한다.
// 서블릿클래스
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
// 1) 멤버변수 및 멤버함수 영역
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException{
// 2) 서비스 메소드 영역
}
}
서블릿 클래스의 용도는
클라이언트로부터 받은 Request를 처리하여
Response로 보내는 Service를 제공하는 것이다.
jsp 서블릿의 경우,
_jspService 메소드가 그 역할을 담당한다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- 코드 블록 -->
<% int x = 1;
int y = 2;
%>
</body>
</html>
위와 같은 JSP문서가 있다.
HTML 코드 안에
int x와 int y가 코드 블록( <% %> ) 안에
감싸져서 선언되어 있다.
그렇다면
이는 어떻게 서블릿 코드로 변환될까?
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
// 중략....
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// 중략 ...
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"EUC-KR\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" ");
// 코드 블록 안에 감싸져 있던 부분
int x = 1;
int y = 2;
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
// 중략...
}
}
<% %> 코드 블록 안에
감싸져 있는 JAVA 코드는
위와 같이,
_jspService 메소드 안에
그대로 복붙된다.
고로,
서블릿의 서비스 메소드에
JAVA 코드를 추가하고 싶다면
<% %>을 사용한다.
<%= %>
<%= %>는 <% out.print(); %>와 같은 의미다. out은 JspWriter 클래스의 객체로 _jspService 메소드 안에 내장되어 있다. out은 밖으로 html 코드를 내보내는 역할을 담당한다. 이때 out.write(""); 메소드를 활용하는데, 문자열 출력만 가능해서 정수와 같은 리터럴 출력은 out.print()를 사용한다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<% int x = 1;
int y = 2;
%>
<h1> 결과 : <%= x+y %></h1>
</body>
</html>
위 jsp 문서를 서블릿으로 변환하면
아래와 같다.
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
// 중략....
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// 중략 ...
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"EUC-KR\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" ");
// <% %>
int x = 1;
int y = 2;
out.write("\r\n");
out.write(" \r\n");
out.write(" <h1> 결과 : ");
//<%= %>
out.print( x+y ); // x + y가 연산되어 출력, Dynamic!
out.write("</h1>\r\n");
out.write("</body>\r\n");
out.write("</html>");
// 중략...
}
}
이렇게
<%= %> 부분은 자동으로
out.print(x+y)로 치환된다.
<%! %>
<% %> 코드 블록은
JAVA 코드를 _jspService 메소드 안에
삽입한다.
만약
메소드를 삽입하고 싶을 때는 어떻게 할까?
// 서블릿클래스
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
// 1) 멤버변수 및 멤버함수 영역
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException{
// 2) 서비스 메소드 영역
}
}
<% %> 는 2) 영역에 코드를 삽입한다.
그러나
메소드를 메소드 안에 삽입하면 에러가 난다.
고로
1) 영역에 메소드를 선언해야하는데
<%! %> 코드 블록을 쓰면
1) 영역에 코드가 삽입되도록 약속되어 있다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
int x = 1;
int y = 2;
%>
<h1> 결과 : <%= sum(x,y) %></h1> <!-- out.print( sum(x,y) ); -->
<!-- 메소드 정의 -->
<%!
public int sum(int x, int y){
return x+y;
}
%>
</body>
</html>
이와 같이
<%! %> 를 이용하여
sum() 메소드를 정의하였고
<%= %> 블록 안에
sum 메소드를 호출하였다.
그럼 서블릿으로는 어떻게 변환될까?
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
// <%! %>
public int sum(int x, int y){
return x+y;
}
// 중략 ...
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// 중략 ...
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"EUC-KR\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" ");
// <% %>
int x = 1;
int y = 2;
out.write("\r\n");
out.write(" \r\n");
//<%= %>
out.write(" <h1> 결과 : ");
out.print( sum(x,y) );
out.write("</h1>\r\n");
out.write(" \r\n");
out.write(" ");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
// 중략 ...
}
}
이와같이,
<%! %>는 멤버 메소드 영역에
코드를 삽입한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page %> 블록은 페이지의 정보를
표현하는 지시 블록이다.
서블릿으로 변환할 때
설정해두어야 하는 페이지 정보를 담는다.
▷ language="java" : 코드블록 안에 JAVA 언어로 설정한다.
▷ contentType : 페이지가 웹브라우저에 출력될 때의 MIME Type을 설정한다.
▷ pageEncoding : JSP 파일 자체의 인코딩 방식을 설정한다.
참고자료
'Web언어 > JSP' 카테고리의 다른 글
[JSP] JSP의 역할 (0) | 2022.01.30 |
---|---|
[JSP] 동적(Dynamic) 페이지란? (0) | 2022.01.29 |
[ JSP ] 상태 유지 ( Session, Cookie ) (0) | 2022.01.25 |
[ JSP ] 인코딩(Encoding) 설정 (0) | 2021.06.21 |
[ JSP ] 인코딩(Encoding)을 하는 이유 (3) | 2021.06.21 |