본문 바로가기
Servlet & JSP

JSP 기초

by kmmguumnn 2018. 6. 29.



선언문(Declaration)


  - <%! 문장 %>

  - 선언문은 JSP 페이지 내에서 필요한 멤버변수나 메소드가 필요할 때 선언해 사용하는 요소




스크립트릿(Scriptlet)


  - <% 문장 %>

  - 가장 일반적으로 많이 쓰이는 스크립트 요소

  - 주로 프로그래밍의 로직을 기술할 때 사용

  - Scriptlet에서 선언된 변수는 지역변수

  - Scriptlet 안에 있는 것들은 출력 결과에는 포함되지 않는다.




표현식(Expression)


  - <%=문장 %>

  - JSP 페이지에서 웹 브라우저에 출력할 부분을 표현 (즉, 화면에 출력하기 위한 것)

  - Scriptlet 내에서 출력할 부분은 내장 객체인 out 객체의 print() 또는 println() 메소드를 사용해서 출력




<%=total %>     (☚ JSP; 표현식)

out.print(total)  (☚ Servlet)                        서로 같다.


JSP로 작성한 코드는 WAS에 의해 특수한 형태의 Servlet으로 변형된다.



1부터 10까지 더해서 출력하는 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 = total + i;
}
%>
1부터 10까지의 합 : <%=total %>
</body>
</html>



이 JSP 파일은 곧 다음의 Servlet 파일로 변형된다.

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);
    }
  }



JSP에서 작성한 코드들은 기본적으로 Servlet에서 service() 내부에 위치하게 된다.


단, <%! %> (선언문) 안의 코드들은 Servlet에서 service() 바깥(Class body쪽)에 위치하게 된다. 

어떤 특정 메소드를 service() 내부가 아니라, 필드나 메소드로 따로 지정하고 싶은 경우, 선언식 안에 넣으면 된다.



JSP의 실행순서는 다음과 같다.


1. 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.

2. 브라우저가 요청한 JSP가 최초로 요청 됐을 경우에만

   1) JSP로 작성된 코드가 Servlet으로 변환된다. (Java 파일 생성)

   2) Servlet 코드를 컴파일해서 실행가능한 bytecode로 변환한다. (class 파일 생성)

   3) Servlet 클래스를 로딩하고 인스턴스를 생성한다. (JSP engine에 의해)

3. Servlet이 실행되어 요청을 처리하고 응답 정보를 생성한다.




<%@ 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>

위와 코드에서, 선언문 안에 jspInit()과 jspDestroy()를 추가하였다. 이렇게 되면 Servlet의 service() 외부에 jspInit() 메소드와 jspDestroy() 메소드가 따로 존재하게 된다.

해당 코드를 실행 시 라이프사이클은 Servlet에서와 동일하게 진행된다.




JSP 내에서 따로 추가해주지 않아도 바로 사용할 수 있는 "내장 객체(Implicit Object)"가 존재한다. JSP를 Servlet으로 변형한 결과를 보면, jspService() 내부의 상단 부분에 만들어져 있는 몇가지 객체들이 있는데 그것들이 바로 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>
<%
    StringBuffer url = request.getRequestURL();

    out.println("url : " + url.toString());
    out.println("<br>");
%>
</body>
</html>

request, out 등등은 선언한 적이 없지만 사용하고 있는 것을 볼 수 있다.













'Servlet & JSP' 카테고리의 다른 글

Servlet & JSP의 4가지 Scope  (0) 2018.07.01
Forward, 그리고 Servlet & JSP의 연동  (0) 2018.06.30
Redirect  (0) 2018.06.29
Servlet 기초  (0) 2018.06.29
미들웨어 / 웹서버 / WAS  (0) 2018.05.30

댓글