Java Server Page (JSP)
HTML 코드에 JAVA 코드를 넣어 동적 웹 페이지를 생성하는 도구
JSP가 실행되면 JAVA Servlet으로 변환되며 웹 어플리케이션 서버에서 동작되어 필요한 기능을 수행
그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답함
- HTML 코드에 JAVA 코드를 넣어 동적인 웹 페이지를 생성하는 웹 어플리케이션 도구
- Servlet을 보완한 스크립트 방식의 표준
- implcit object, predefined tags, custom tags, expression language 등 추가됨
JAVA Servlet
웹페이지를 동적으로 생성하기 위한 서버 측 프로그램
자바 언어를 기반으로 만들어지며 웹 어플리케이션 서버 위에서 컴파일되고 동작한다
JSP로 작성된 프로그램은 서버로 요청 시 Servlet(.java) 파일로 변환되어 컴파일되고
JSP 태그를 분해/추출 후 다시 순수한 HTML로 변환한다
JSP의 문법
- 선언문 Declaration : <%! %> 전역변수 선언 및 메소드 선언에 사용
<%@ 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>
id : <%=getId() %>
</body>
</html>
<%!
String id = "u001"; //멤버변수 선언
public String getId( ) { //메소드 선언
return id;
}
%>
- Scriptlet : <% %> 프로그래밍 코드 기술에 사용. 여기서 사용한 변수는 지역변수.
<body>
<%
for(int i = 1; i <= 5; i++){
%>
<H<%=i %>> 아름다운 한글 </H<%=i %>>
<%
}
%>
</body>
html 소스 결과
<!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>
<H1> 아름다운 한글 </H1>
<H2> 아름다운 한글 </H2>
<H3> 아름다운 한글 </H3>
<H4> 아름다운 한글 </H4>
<H5> 아름다운 한글 </H5>
</body>
</html>
servlet으로 변환된 코드 주요 부분
for(int i = 1; i <= 5; i++){
out.write('\n');
out.write('<');
out.write('H');
out.print(i );
out.write("> 아름다운 한글 </H");
out.print(i );
out.write('>');
out.write('\n');
}
- 표현식 Expression : <%=%> 화면에 출력할 내용 기술에 사용. out 객체의 print(), println() 메소드 사용
<body>
<%
for(int i = 1; i <= 5; i++){
%>
<H<%=i %>> 아름다운 한글 </H<%=i %>>
<%
}
%>
</body>
- 주석 Comment
- HTML : <!-- -->
- JSP : <%-- --%>
- Java : //, /* */
JSP의 내부적인 동작 과정
생성 위치는 src -> main -> webapp. html 파일과 동일.
JSP 문서는 백그라운드에서 Servlet으로 자동 변환된다.
- WAS는 JSP 파일을 Java Servlet (.java)로 변환
- WAS는 사용자 요청에 맞는 적절한 Servlet 파일을 컴파일하여 (.class) 파일을 생성한다.
- 그 파일을 메모리에 올려 Servlet 객체를 만들 때
- 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메소드 실행
- WAS는 요청이 올때마다 thread를 생성하여 처리함
- 각 thread는 Servlet의 단일 객체에 대한 service() 메소드 실행
- service() 메소드는 요청에 맞는 적절한 메소드(doGet(), doPost())를 호출
- 수행 완료 후 생성된 데이터를 웹 페이지와 함께 클라이언트로 응답
jsp 파일이 실행되면
1. eclipse-workspace 아래 .metadata 폴더에 해당파일이 .java로 생성된다.
2. 해당 파일의 _jspService() 메소드 안을 살펴보면 jsp의 내용이 변환된 것을 확인할 수 있다.
3. .java 파일은 survlet 소스로 자동으로 컴파일되며 실행되어 그 결과가 브라우저에 보여진다.
JSP의 특징
- 스크립트 언어기에 자바 기능을 그대로 사용 가능
- WAS(ex-tomcat)가 이미 만들어놓은 JSP 내장 객체(predefined values/implicit object)를 사용
- request : HttpServletRequest Object
- response : HttpServletResponse Object
- session : HttpSession Object
- out : PrintWriter Object
- application : ServletContext Object
- custom tag 사용 가능
- servlet과 다르게 JSP는 수정된 경우 재배포할 필요 없이 Tomcat(WAS)이 알아서 처리
JSP Life Cycle 실습
목적: jsp의 라이프사이클은 서블릿의 라이프 사이클과 정확히 일치한다.
servlet에는 init() destory()도 있지만 JSP 코드는 service() 메소드에만 코드가 추가됨.
그 이유는 응답에 포함되는 건 Service()밖에 없기 때문.
그럼 JSP에서 service() 외의 곳에 쓰고 싶다면, <%! %> 선언식 사용
이 클래스에 메소드나 필드를 선언할 때 service() 바깥에서 생성되도록 해줌.
<body>
hello~
<%
System.out.println("_jspService()~~~~");
%>
<%!
public void jspInit(){
System.out.println("jspInit()!!!!");
}
public void jspDestory(){
System.out.println("jspDestroy()????");
}
%>
</body>
브라우저로 최초 요청했을 때 (Run on Server) -> init(), service()
브라우저로 두번째 요청했을 때(새로고침) -> init(), service() * n번
lifecycle.jsp 수정 후 요청했을 때(JSP 팡리 수정 -> destroy() 실행 -> 왜 나는 destroy()실행 없이 잘 되는 거지...?
JSP 내장 객체
request와 out 이란 객체는 이전에 선언한 적이 없는데 사용되고 있다.
JSP 코드가 Servlet의 _jspService() 메소드 안에 삽입되는 코드로 생성되는데,
_jspService()에 삽입된 코드의 윗부분에 미리 선언된 객체들이 있기에 다음 같은 코드가 잘 실행된다.
<body>
<%
StringBuffer url = request.getRequestURL();
out.println("url : " + url.toString());
out.println("<br>");
%>
</body>
'Web > Java+Spring' 카테고리의 다른 글
Scope (0) | 2021.05.10 |
---|---|
Redirect & Forward (0) | 2021.05.10 |
Request, Response (0) | 2021.05.06 |
Servlet의 Life Cycle (0) | 2021.05.05 |
Servlet (0) | 2021.05.05 |