WAS는 웹브라우저로부터 JSP에 대한 요청을 받게되면 JSP코드 -> 서블릿 코드로 변환 후 컴파일하여 실행한다.
JSP의 라이프싸이클은 JSP 코드를 서블릿으로 변환하는 첫 단계를 시작으로 이후 단계는 서블릿의 라이프 싸이클과 같다.
JSP 실행순서
- 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.
- 만약 브라우저가 요청한 JSP가 최초로 요청된 경우라면
- 웹 컨테이너(톰캣 등)는 jsp 코드를 서블릿 코드로 (.java) 변환한다.
- 서블릿 코드를 컴파일하여 클래스파일을 만든다.(.class)
- 서블릿 클래스를 로딩하고 인스턴스를 생성한다.
- jspInit() 메소드를 호출하여 초기화한다.
- 서블릿이 실행되어 요청을 처리하고 응답정보를 생성한다.
웹컨테이너는 jsp코드를 서블릿코드(.java)로 변환한다음 이를 .class 파일로 컴파일한다.
실제 코드를 살펴보자
exam01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int total = 0;
for(int i=1; i<=10; i++){
total += i;
}
%>
<h1>1부터 10까지의 합은 <%=total%> </h1>
</body>
</html>
서버를 실행하게되면 java파일과 class파일이 만들어진 것을 볼 수 있다.

exam01_jsp.java 파일
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP들은 오직 GET, POST 또는 HEAD 메소드만을 허용합니다. Jasper는 OPTIONS 메소드 또한 허용합니다.");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.print(request.getSession().getServletContext().getRealPath("/"));
out.write('\r');
out.write('\n');
int total = 0;
for(int i=1; i<=10; i++){
total += i;
}
out.write("\r\n");
out.write("\r\n");
out.write("<h1>1부터 10까지의 합은 ");
out.print(total);
out.write(" </h1>\r\n");
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
_jspService() 안에 jsp에서 작성한 코드들이 들어있는 것을 확인 할 수 있다.
jsp에서 _jspService() 가 아닌 곳에 코드를 작성하게 하고 싶다면 선언식을 이용한다 <%! %>
exam01.jsp
<body>
<%
int total = 0;
for(int i=1; i<=10; i++){
total += i;
}
%>
<h1>1부터 10까지의 합은 <%=total%> </h1>
<%!
public void jspInit() {
System.out.println("jspInit()!");
}
public void jspDestroy() {
System.out.println("jspDestroy()");
}
%>
</body>
exam01_jsp.java
public void jspInit() {
System.out.println("jspInit()!");
}
public void jspDestroy() {
System.out.println("jspDestroy()");
}
jsp에서 추가한 메소드가 생성된 것을 볼 수 있다.
'Web' 카테고리의 다른 글
| 폼 데이터 입력 후 한글 깨짐 현상 (0) | 2021.12.15 |
|---|---|
| 폼 데이터 입력 후 한글 깨짐 현상 (0) | 2021.12.09 |
| redirect와 forward (0) | 2021.11.15 |
| JSP 문법 (0) | 2021.11.13 |
| Servlet (0) | 2021.11.10 |