Web : JSP

JSP란?

  • JSP는 자체로 동작하는 게 아니라 모든 JSP는 Servlet으로 바뀌어서 동작합니다.
  • HTML코드 안에서 JSP를 사용하는 이유HTML안에서 자바코드를 이용한 프로그램을 실행시켜줄 수 있기 때문입니다.
<!-- sum10.jsp파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta 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>
  • <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    • 이 문장을 지시문 이라고 하고 <%@는 지시자라고 하는데, page가 붙어있으므로 page지시자 입니다.
    • 이 파일이 JSP라는 것을 표시합니다.
    • 이런 지시문은 WAS에게로 전달됩니다.
  • <% %>
    • scriptlet이라고 합니다.
    • 안에는 자바코드가 들어갈 수 있습니다.
  • <%= %>
    • 표현식이라고 합니다.
    • 얻어낸 값을 사용자의 브라우저한테 응답결과로 주고 싶을 때 사용합니다.
    • out.print(total);와 같다고 생각하면 됩니다.
  • JSP를 볼 때 서블릿으로 바뀌면 어떻게 될 지 생각해보는게 좋습니다.

JSP 등장배경

  • 마이크로소프트에서 ASP(Active Server Page)라는 쉽게 웹을 개발할 수 있는 스크립트(script) 엔진을 발표함 (1998년)
  • 1997년에 발표된 서블릿은 ASP에 비하여 상대적으로 개발 방식이 불편함
  • ASP에 대항하기 위하여 1999년 썬마이크로시스템즈에서 JSP를 발표
  • JSP는 실제로 서블릿 기술을 사용

JSP의 라이프사이클

sum10.jsp파일이 실행될 때 여러가지 일들이 벌어집니다. 파일을 실행하면 톰캣(WAS)이 JSP를 서블릿으로 바꾸게 됩니다. JSP코드는 java 파일class 파일 로 변환되는데,

자신의 Eclipse workspace경로\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트이름\org\apache\jsp

에서 java와 class을 볼 수 있습니다. java파일에 들어가 확인해보면 servlet으로 되어있고 public void _jspService같은 Service, Init, Destory도 있는 것을 볼 수 있습니다. JSP로 작성했던 코드들이 Service안에 그대로 만들어지는 것입니다. (HTML 코드까지)

여기서 sum10_jsp.java는 서블릿 소스로 자동으로 컴파일 되면서 실행되고 그 결과가 브라우저에서 보여집니다.

jsp 파일은 자신의 Eclipse workspace경로\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\프로젝트이름 에서 확인해 볼 수 있습니다.

JSP의 실행순서

  1. 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.
  2. 브라우저가 요청한 JSP가 최초로 요청했을 경우만 JSP로 작성된 코드를 WAS가 서블릿으로 코드로 변환한다. (java 파일 생성)
  3. 서블릿 코드를 컴파일해서 실행가능한 bytecode로 변환한다. (class 파일 생성)
  4. 서블릿 클래스를 로딩하고 인스턴스를 생성한다.
  5. 서블릿이 실행되어 요청을 처리하고 응답 정보를 생성한다.

예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello~~
<%
	System.out.print("jspService()");
%>

<%!
	public void jspInit() {
	System.out.print("jspInit()");
}
%>

<%!
	public void jspDestroy() {
	System.out.print("jspDestroy()!!!");
}
%>

</body>
</html>

JSP에서 변환된 java파일을 확인해 보면 scriptlet에 넣었든 아니든 전부 Service에 들어가는 것을 볼 수 있습니다. 하지만 Service메서드 바깥에서 실행시키고 싶을 때는 어떻게 해야할까요?

바로 <%! %> 를 사용하면 됩니다. 선언식이라고 하는 것인데요. 메서드나 필드를 선언할 때 넣어주면 Service 바깥쪽에 해당 코드들이 만들어지게 할 수 있습니다.

스크립트 요소의 이해

JSP 페이지에서는 선언문(Declaration), 스크립트릿(Scriptlet), 표현식(Expression) 이라는 3가지의 스크립트 요소를 제공합니다.

img

선언문

  • 선언문 : <%! %>
  • 선언문은 JSP 페이지 내에서 필요한 멤버변수나 메소드가 필요할 때 선언해 사용하는 요소
  • 선언문의 문법 - <%! 문장 %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
id : <%=getId() %>
    
<%!
	String id = "u001";
	public String getId() {
		return id;
	}
%>
<!-- html의 어디에 위치해 있냐는 중요하지 않습니다. 그 이유는 스크립트 요소의 종류에 따라 위치가 결정되는 것이기 때문입니다. -->

</body>
</html>

스크립트릿

  • 스크립트릿 : <% %>
  • 가장 일반적으로 많이 쓰이는 스크립트 요소
  • 주로 프로그래밍의 로직을 기술할 때 사용
  • 스크립트릿에서 선언된 변수는 지역변수
  • 스크립트릿의 문법 - <% 문장%>

표현식(Expression)

  • 표현식 : <%=%>
  • JSP 페이지에서 웹 브라우저에 출력할 부분을 표현 (즉, 화면에 출력하기 위한 것)
  • 스크립트릿내에서 출력할 부분은 내장객체인 out 객체의 print() 또는 println() 메소드를 사용해서 출력
  • 표현식의 문법 - <%=문장%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
for(int i = 1; i <= 5; i++){
%>

<H<%=i %>> 아름다운 한글 </H<%=i %>>

<%
}
%>
<!-- 스크립트릿 안에 있는 것은 응답 결과에는 포함되지 않습니다. -->
<!-- 그래서 스크립트릿을 이런식으로 쪼개서 중간에 HTML을 섞어 사용할 수 있습니다. -->

</body>
</html>

주석(Comment)

  • JSP페이지에서 사용할 수 있는 주석
    • HTML주석, 자바주석, JSP주석

HTML 주석

  • HTML 주석은 <!--로 시작해서 -->로 끝나는 형태
  • HTML 주석은 HTML주석을 사용한 페이지를 웹에서 서비스할 때 화면에 주석의 내용이 표시되지는 않으나 , [소스보기]수행하면 HTML주석의 내용이 화면에 표시합니다.
  • HTML 주석은 자바로도 바뀌고 자바에서 실행도 됩니다. 또, 응답결과에 포함도 됩니다. 실제 이 응답결과가 넘어왔을 때 즉 브라우저가 이 HTML을 보여줄 때 주석임을 인지하기 때문에 그 때는 화면에 보여주지 않습니다.
  • HTML주석의 예시
<!-- html 주석입니다. -->

JSP주석

  • JSP 페이지에서만 사용되며 <%--로 시작해서 --%>로 끝나는 형태
  • JSP주석은 주석 자체가 JSP의 주석이기 때문에 서블릿으로 바뀌지 않습니다.
  • JSP 주석은 해당 페이지를, 웹 브라우저를 통해 출력 결과로서 표시하거나, 웹 브라우저 상에서 소스 보기를 해도 표시 되지 않습니다. 또한 JSP주석 내에 실행코드를 넣어도 그 코드는 실행되지 않습니다.
  • JSP주석의 예시
<%-- JSP 주석입니다. --%>

자바주석

  • 자바 주석은 //, /* */을 사용해서 작성.
  • //은 한 줄짜리 주석을 작성할 때 사용되고, /* */은 여러 줄의 주석을 작성할 때 사용
  • 스크립트릿이나 선언문에서 사용되는 주석으로, 자바와 주석 처리 방법이 같음
  • 자바주석은는 JSP에서 자바로 다 바뀌지만 실제 자바코드가 실행될 때 주석이기 때문에 실행은 되지 않습니다.
  • 자바주석의 예시
//주석

/*주석

여러 줄에 걸친 주석이다.

*/

주석 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- jsp 주석입니다. --%>

<!-- html 주석입니다.  -->

<%
for(int i = 1; i <= 5; i++){
	// 자바주석입니다.
%>

<H<%=i %>> 아름다운 한글 </H<%=i %>>

<%
}
%>

</body>
</html>

소스보기를 하면 HTML주석은 남아있는 것을 볼 수 있습니다.

java파일을 들어가서 보면 html주석과 java 주석은 있지만 jsp주석은 없습니다.

각각의 주석이 언제 주석으로서의 역할을 하는지를 잘 생각해야 합니다.

JSP 내장 객체란?

  • JSP를 실행하면 서블릿 소스가 생성되고 실행됩니다.
  • JSP에 입력한 대부분의 코드는 생성되는 서블릿 소스의 _jspService() 메소드 안에 삽입되는 코드로 생성됩니다.
  • _jspService()에 삽입된 코드의 윗부분에 미리 선언된 객체들이 있는데, 해당 객체들은 jsp에서도 사용 가능합니다.
  • response, request, application, session, out과 같은 변수를 내장객체라고 합니다.

내장 객체의 종류

img

예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	StringBuffer url = request.getRequestURL();

	out.print("url : " + url.toString());
	out.print("<br>");
%>

</body>
</html>

내장 객체들은 이미 JSP가 서블릿으로 바뀔 때 만들어서 가지고 있습니다. 그렇기 때문에 따로 선언하거나 생성하지 않아도 가져다 쓸 수 있는 것을 볼 수 있습니다.


참고 : https://www.boostcourse.org/web326/lecture/58961/?isDesc=false

댓글남기기