Web/Java+Spring

JSP

WakaraNai 2021. 5. 8. 22:50
728x90
반응형

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으로 자동 변환된다.

  1. WAS는 JSP 파일을 Java Servlet (.java)로 변환
  2. WAS는 사용자 요청에 맞는 적절한 Servlet 파일을 컴파일하여 (.class) 파일을 생성한다.
    1. 그 파일을 메모리에 올려 Servlet 객체를 만들 때
    2. 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메소드 실행
    3. WAS는 요청이 올때마다 thread를 생성하여 처리함
    4. 각 thread는 Servlet의 단일 객체에 대한 service() 메소드 실행
    5. service() 메소드는 요청에 맞는 적절한 메소드(doGet(), doPost())를 호출
  3. 수행 완료 후 생성된 데이터를 웹 페이지와 함께 클라이언트로 응답

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>

https://velog.io/@ansalstmd/JSP5.-%EB%82%B4%EC%9E%A5-%EA%B0%9D%EC%B2%B4

참고: gmlwjd9405.github.io/2018/11/03/jsp.html

728x90
반응형

'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