들어가기 전에
WAS는 웹 브라우저로부터 JSP에 대한 요청을 받게 되면, JSP코드를 서블릿 소스코드로 변환한 후 컴파일 하여 실행되게 됩니다.
서블릿으로 컴파일되어 실행될 때 상황에 따라서 어떤 메소드들이 실행되는지 잘 알아야, JSP를 알맞게 작성할 수 있습니다.
학습 목표
- jsp의 라이프 사이클을 이해한다.
- jsp를 이용해서 init, destroy 메소드를 이용할 수 있다.
핵심 개념
- jsp라이프 사이클
학습하기
들어가기 전에
WAS는 웹 브라우저로부터 JSP에 대한 요청을 받게 되면, JSP코드를 서블릿 소스코드로 변환한 후 컴파일 하여 실행되게 됩니다.
서블릿으로 컴파일되어 실행될 때 상황에 따라서 어떤 메소드들이 실행되는지 잘 알아야, JSP를 알맞게 작성할 수 있습니다.
학습 목표
핵심 개념
학습하기
1에서 10까지 출력하는 jsp가 서블릿으로 변경 된 파일입니다.
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 {
.....
try {
.....
out.write("\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
out.write("<html>\n");
out.write("<head>\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
out.write("<title>sum10</title>\n");
out.write("</head>\n");
out.write("<body>\n");
out.write("\n");
int total = 0;
for(int i = 1; i <= 10; i++){
total = total + i;
}
out.write("\n");
out.write("\n");
out.write("1부터 10까지의 합 : ");
out.print(total );
out.write("\n");
out.write("\n");
out.write("</body>\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
.....
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
스크립틀릿 부분이라고 java 코드를 입력한 부분은 다음과 같이 입력되어 있습니다.
int total = 0;
for(int i = 1; i <= 10; i++){
total = total + i;
}
표현식으로 출력한 부분은 다음과 같습니다.
out.print(total );
JSP의 실행순서
lifecycle.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>
hello
<%
System.out.println("_jspService()");
%>
<%!
public void jspInit() {
System.out.println("jspInit()!");
}
public void jspDestroy() {
System.out.println("jspDestroy()");
}
%>
</body>
</html>
생각해보기
참고 자료
https://beginnersbook.com
https://www.studytonight.com
comment
24.04.02.
https://dololak.tistory.com/508
jsp 파일이 servlet으로 변환될때 http.jspBase를 상속받게 되는데 httpjspBase는 servlet인 httpservlet을 상속받은 클래스이다.
public final void init(servletconfig config) throws ServletException{
super.init(config);
jspInit();
}
public final void destroy(){
jspDestroy();
}
이를 통해 servlet의 init을 호출하면 jspinit()을 호출하고 servlet의 destroy를 호출하면 jspDestroy를 호출하게 된다.
servlet의 service는 jsp의 jspservice와 매칭한다.
System.out.print();에서 에러가 뜨는데 이거 어떻게 해결할 수 있나요?
아무리 구글링 해봐도 모르겠네요...
jsp 파일이 변환되어 생성된 서블릿 클래스는 HttpJspBase 라는 추상 클래스를 상속받게 되는데, 이 클래스의 생성자와 소멸자는 각각 다음과 같은 형태로 이루어져있습니다.
생성자 코드
@Override
public final void init(ServletConfig config)
throws ServletException
{
super.init(config);
jspInit();
_jspInit();
}
소멸자 코드
@Override
public final void destroy() {
jspDestroy();
_jspDestroy();
}
위와 같은 형태로 이루어져있기 때문에 인스턴스 생성 시 자동으로 jspInit(), _jspInit() 코드가 실행되고, 인스턴스 소멸 시 자동으로 jspDestroy(), _jspDestroy() 메소드가 실행되는 구조
서블릿 라이프 사이클에서 실행되는 메소드와 JSP 라이프 사이클에서 실행되는 메소드는 다른 이름을 가지고 있지만, 동일한 역할을 수행하는 듯
20220215
210621
서블릿과 jsp의 lifecycle method 이름 비교
21.05.09
20.05.20
jsp의 라이프사이클은 서블릿의 라이프사이클과 정확히 같다
워크스페이스 >> .metadata안에서 파일이 이름_jsp.java파일이 생성되고, 그 파일안에 _jspService라는 매서드 안에 우리가 만들었던 코드들이 그대로 변환되서 들어가고 있는걸 볼 수 있다.
JSP 실행 순서
1.브라우저가 웹서버에 JSP대한 요청정보를 전달.
2. 브라우저가 요청한 JSP가 최초로 요청한 경우만,
JSP코드를 서블릿으로 변환 >> 서블릿코드를 컴파일 해서 실행가능한 코드로 바꿈(컴파일도 여기서함.) >> 서블릿 클래스를 로딩해서 인스턴스를 생성하는 이런일해줌. - JSP엔진이 >> 그리고 다시 서블릿이 실행되서 요청을 처리하고, 응답정보를 생성하는 일을함.
3. 서블릿이 실행되어 요청을 처리하고, 응답정보를 생성함.
<%!는 선언식.
크래스에서 메서드를 선언한다거나 필드를 선언할때 넣어준다.
매서드 뿐만아니라 특정 매서드를 서비스 매서드가 아니라, 필드나 매서드로 내가 지정하고 싶다면 선언식을 사용하면 도니다.
2019.12.27
잘 듣고 갑니다 감사합니다!!
댓글을 입력하세요.
서블릿 라이프 싸이클에서는 init(), service(), destroy() 이고 JSP 라이프 싸이클에서는 _jspinit(), _jspservice(), _jspdestroy()입니다.
1. 서블릿 라이프 싸이클에서 실행되는 메소드의 이름은 init(), service(), destroy()이고,
JSP 라이프 싸이클에서 실행되는 메소드의 이름은 jspInit(), _jspService(), jspDestory()입니다.
이번 강의는 자막 스크립트가 누락되었네요.
서블릿 변환된 .java파일에서
_jspInit() 와 _jspDestroy() 메서드는 어떤것인가요?
jspInit() 와 jspDestroy() 메서드는 위 메서드와 별개인가요?
jsp 파일을 생성하면 html 파일은 따로 생성할 필요가 없는건가요?
맥에서는 변경된 서블릿이 eclipse-workspace 어디에 저장될까요?
java 경로 D:\dev2\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\work\Catalina\localhost\firstweb\org\apache\jsp