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의 실행순서
- 브라우저가 웹서버에 JSP에 대한 요청 정보를 전달한다.
- 브라우저가 요청한 JSP가 최초로 요청했을 경우만 JSP로 작성된 코드를 WAS가 서블릿으로 코드로 변환한다. (java 파일 생성)
- 서블릿 코드를 컴파일해서 실행가능한 bytecode로 변환한다. (class 파일 생성)
- 서블릿 클래스를 로딩하고 인스턴스를 생성한다.
- 서블릿이 실행되어 요청을 처리하고 응답 정보를 생성한다.
예제
<%@ 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가지의 스크립트 요소를 제공합니다.
선언문
- 선언문 : <%! %>
- 선언문은 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과 같은 변수를 내장객체라고 합니다.
내장 객체의 종류
예제
<%@ 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
댓글남기기