JSP

zihooy·2023년 5월 31일
0

Web Development

목록 보기
7/8
post-thumbnail

JSP에 대해 알아보자.

🏹 JSP란

JSP(JavaServer Pages)는 Java 기반의 웹 개발 기술로, 동적인 웹 페이지를 생성하기 위해 사용된다. JSP는 HTML 문서 내에 Java 코드를 삽입하여 동적으로 페이지를 생성하고, 서버 측에서 실행된다. 클라이언트의 요청에 따라 JSP는 서버에서 실행되고 결과를 HTML 형태로 반환하여 클라이언트에게 전달한다.

🏹 JSP 문법

스크립트 태그 (<% %>, <%= %>, <%! %>)

<% %>

  • Java 코드 작성 시 사용
  • 변수 선언, 반복문, 조건문 등의 Java 코드 작성 가능

<%= %>

  • Java 코드 결과 출력 시 사용
  • 변수, 메소드의 값을 출력할 때 사용

<%! %>

  • JSP 클래스에 멤버 변수나 메소드를 선언할 때 사용
  • JSP 페이지 전체에서 사용 가능

디렉티브 태그 (<%@ %>)

<%@ page %>

  • JSP 페이지의 속성을 지정 시 사용
  • 페이지의 인코딩 방식, 세션 사용 여부, 에러 페이지 설정 등을 지정

<%@ include %>

  • 다른 JSP 파일을 포함시키는 데 사용
  • 해당 위치에 다른 JSP 파일의 내용이 포함되어 결과 페이지에 함께 출력

<%@ taglib %>

  • 커스텀 태그 라이브러리를 사용하기 위해 필요한 디렉티브
  • 태그 라이브러리의 URI와 태그 위치를 지정

표현식 (${ })

${ }

  • 안에 Java 표현식이나 변수를 사용하여 값을 출력할 수 있다.
  • 동적인 데이터를 HTML에 삽입할 수 있다.

주석 (<%-- --%> 혹은 <!-- -->)

<%-- --%>

  • JSP 코드 내에서 사용되는 주석
  • 주석 내의 내용은 JSP 코드로 처리되지 않음

<!-- -->

  • HTML 주석으로, 브라우저에서 표시되지 않는 주석
  • JSP 코드와 관련 없는 주석을 작성할 때 사용

주요 메서드

JSP에서 자주 사용되는 메서드를 알아보자.

  1. out.print(): 출력 스트림에 내용을 출력
  2. request.getParameter(): HTTP 요청으로부터 전달된 파라미터 값을 가져옴
  3. session.getAttribute(): 현재 세션에서 지정된 속성의 값을 가져옴.
  4. response.sendRedirect(): 지정된 URL로 리다이렉트
  5. request.getRequestDispatcher().forward(): 다른 서블릿이나 JSP로 요청을 전달

out은 JSP의 내장 객체 중 하나인 JspWriter 객체를 사용한다.
request.getParameter()는 HttpServletRequest 객체를 사용한다.

이 외에도 JSP는 자바 코드를 사용할 수 있으므로, 자바에서 사용되는 다양한 메서드와 라이브러리를 활용할 수 있다.

🏹 JSP 생성 및 실행

우선 Eclipse에서 웹 프로젝트를 하나 생성해보자.

만드는 방법을 모르다면 Dynamic Web Project 만들기 클릭 !

index.jsp 파일을 생성하고 아래의 코드를 실행해보자.

설명을 위해 중간중간 코드를 끊으며 설명하지만, 합치면 하나의 파일이 된다.

디렉티브 태그

<%@ page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

앞서 설명했던 태그 중 디렉티브 태그에 해당한다. 페이지의 인코딩 방식 등을 설정하였고, import 문을 통해 자바에서 지원하는 java.util.Data 클래스를 사용할 수 있게 하였다.

표현식의 활용

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%
String color = "grey";
%>
<body bgcolor=<%=color%>>
<!-- 컬러를 표현 식으로 넣기, 표현 식을 사용하는 이유: 변수를 받을 수 있어서-->

위와 같이 <body>문에 bgcolor를 표현식으로 부여하여 동적으로 배경 색상을 변경할 수 있다.

만약 아래와 같이 bgcolor를 문자열로 부여하면 고정값이 되기 때문에, 표현식의 변수를 활용하여 동적으로 할당하는 것이 좋다.

<body bgcolor="green"> 
<!-- 컬러를 고정값으로 넣기 -->

스크립트 태그

	<!-- 스크립트 릿 -->
	<h1>Hello World</h1>

	<!-- 함수 -->
	<%!void f1() {
		System.out.println("test");
		// out.println() // out 객체를 몰라서 사용할 수 없음
	}

위와 같이 <%! %> 을 활용하여 함수를 작성할 수 있다.
JSP 페이지에서 출력을 하려면 스크립트릿(<% %>)이나 표현식(<%= %>)을 사용한다.
그러나 선언 영역(<%! %>)에서는 out 객체를 직접 사용할 수 없다.

	void f2(javax.servlet.jsp.JspWriter out) {
		try {
			out.println("sample");
		} catch (Exception e) {

		}

		// out 객체를 인수로 전달받음
	}

이러한 경우에는 위와 같이 JspWriter 객체를 인수로 전달하면, 선언 영역(<%! %>)에서도 out 객체를 사용할 수 있다.

	int f3() {
		return 1000;
	}%>

	<%
	int num = 10;
	String str = "호랑이";
	out.println(num);
	out.println(str);
	f1();
	f2(out);
	%>

위의 예시처럼 스크립트 태그 안에서 Java 코드를 작성하여 변수를 선언하거나, 출력하고, 함수를 호출 할 수 있다.

표현식

	<!-- 표현식 -->
	<%=num%><br />
	<%=str%><br />
	<%=f3()%><br /> num

	<%
	int count = 0;
	java.util.Date date1 = new java.util.Date(); // Date 객체를 불러와서 생성
	Date date2 = new Date(); // import를 통해 생성 : page import="java.util.Date"
	%>
	<%=date1%><br />
	<hr />

테이블 생성

	<!--  테이블  -->
	<table border="1" width="200">
		<tr>
			<td>1</td>
			<td>2</td>
			<td>3</td>
		</tr>
		<tr>
			<td>4</td>
			<td>5</td>
			<td>6</td>
		</tr>
	</table>
	<br />

테이블 안에서 표현식 사용

	<!-- 테이블 안에서 표현식 사용 -->
	<table border="1" width="200">
		<tr>
			<td><%=10%></td>
			<td><%="호랑이1"%></td>
		</tr>
		<tr>
			<td><%=20%></td>
			<td><%="호랑이2"%></td>
		</tr>
		<tr>
			<td><%=30%></td>
			<td><%="호랑이3"%></td>
		</tr>
	</table>
	<br />

반복문을 활용하여 배열안의 값 테이블에 넣기

	<!-- 반복문을 활용하여 배열안의 값 테이블에 넣기 -->
	<%
	String[] name = { "호랑이1", "호랑이2", "호랑이3" };
	%>
	<table border="1" width="200">
		<%
		for (int i = 0; i < 3; i++) { // for문 시작
		%>
		<tr>
			<td><%=i * 10 + 10%></td>
			<td><%=name[i]%></td>
		</tr>
		<%
		} // for문 끝
		%>
	</table>

표현식 안에 들어갈 수 있는 것들

	<!-- 표현식 안에 들어갈 수 있는 것들 : 숫자, 문자열, 변수, 배열, 삼항연산  -->
	<h3>구구단</h3>
	<table border="1">
	<%
	for (int i = 0; i < 10; i++) {
		out.print("<tr>");
		for (int j = 2; j < 10; j++) {
			out.print("<td>");
			out.print(j + " X " + i + " = " + (j * i));
			out.print("</td>");
		}
		out.print("</tr>");
	}
	%>
	</table>

</body>
</html>

위의 코드를 실행한 결과는 아래와 같다.

🏹 JSP 동작 원리

JSP의 동작 원리

  1. 클라이언트가 웹 브라우저를 통해 JSP에 대한 요청을 전송
  2. 웹 서버는 JSP 파일을 서블릿 파일(.java)로 변환. 이때 JSP 컨테이너는 JSP 파일을 Java 소스 코드로 변환하는 과정 수행
  3. 변환된 서블릿 파일(.java)은 컴파일되어 바이트코드(.class)로 변환
  4. 웹 컨테이너는 변환된 서블릿 클래스를 로딩하고 인스턴스를 생성
  5. 클라이언트의 요청에 대한 처리를 위해 서블릿의 service() 메서드가 호출
  6. service() 메서드 내에서 JSP 페이지의 내용이 실행. 이때 HTML 코드는 그대로 출력되고, Java 코드는 서버 측에서 실행되어 동적인 데이터를 생성
  7. JSP 페이지의 실행 결과는 HTML 형식으로 생성되어 클라이언트에 응답으로 전송
  8. 클라이언트는 서버로부터 받은 HTML 응답을 렌더링하여 사용자에게 보여줌

JSP to Servlet 확인하기

위의 과정 중 2번의 실행 결과를 직접 확인할 수 있다.
위에서 생성한 웹 프로젝트의 저장 경로로 들어가보자.
아마도 eclipse-workspace 폴더 하위에 있을 것이다.

아래와 같은 폴더로 접근하자.
/Users/{사용자 계정}/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/Web03/org/apache/jsp에 들어가면
index_jsp.java 파일을 확인할 수 있다.

맥북의 경우, /Users/{사용자 계정}/eclipse-workspace/ 위치를 맥북 파인더로 접근한 후 shift +command + . 을 입력하면 숨겨진 파일 및 폴더(.metadata)를 확인할 수 있다.

index_jsp.java 파일은 Jsp를 Servlet으로 변환한 것으로, 위에서 작성한 jsp와 유사하지만 다른 형태를 보인다.

	for (int i = 0; i < 3; i++) { // for문 시작
		
      out.write("\n");
      out.write("		<tr>\n");
      out.write("			<td>");
      out.print(i * 10 + 10);
      out.write("</td>\n");
      out.write("			<td>");
      out.print(name[i]);
      out.write("</td>\n");
      out.write("		</tr>\n");
      out.write("		");

		} // for문 끝
profile
thisIsZihooLog

0개의 댓글