본문 바로가기

웹 프로그래밍/JSP

[JSP] 기초 (Servlet 코드와 JSP 코드 비교)

package kr.ac.kopo.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// http://localhost:9999/Lecture-WEB/servlet/table?row=3&col=3
/*
 		-------------------------------------
 		|	(0, 0)	|	(0, 1) 	| 	(0, 2) 	|
 		-------------------------------------
 		|	(1, 0)	|	(1, 1) 	| 	(1, 2) 	|
 		-------------------------------------
 		|	(2, 0)	|	(2, 1) 	| 	(2, 2) 	|
 		-------------------------------------	
 */
// http://localhost:9999/Lecture-WEB/servlet/table  --> 5 X 5 테이블 응답
// http://localhost:9999/Lecture-WEB/servlet/tableExam  --> 5 X 5 테이블 응답

// web.xml을 대체하는 기술이다. 이미 있는 매핑된 정보를 어노테이션에 쓰면 중복 에러가 난다.
@WebServlet(urlPatterns = {"/tableExam", "/table"})
public class TableServletExam extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException {
		
		String strRow = request.getParameter("row");
		String strCol = request.getParameter("col");
		
		int row = 5, col = 5;
		if(strRow != null && !strRow.equals(""))
			row = Integer.parseInt(strRow);
		if(strCol != null && !strCol.equals(""))
			col = Integer.parseInt(strCol);
		
		// 응답
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();

		StringBuilder sb = new StringBuilder();
		sb.append("<html>");
		sb.append("<head>");
		sb.append("  <title>테이블 생성 연습</title>");
		sb.append(" <style>");
		sb.append("    table { ");
		sb.append("       background-color : yellow; ");
		sb.append("    } ");
		sb.append(" </style>");
		sb.append("</head>");
		sb.append("<body>");
		sb.append("  <table border='1'>");
		for(int i = 0; i < row; i++) {
			sb.append("<tr>");
			for(int j = 0; j < col; j++) {
				sb.append("<td>");
				sb.append("(" + i + ", " + j + ")");
				sb.append("</td>");
			}
			sb.append("</tr>");
		}
		sb.append("  </table>");
		sb.append("</body>");
		sb.append("</html>");
		
		out.println(sb.toString());
		out.flush();
		out.close();
	}

}

Serlvet으로 html 코드를 작성하는 것이 굉장히 불편했다.

StringBuilder 객체로 append 해서 코드들을 작성했다.

그리고 PrintWriter 객체로 println 해주고, flush 한 다음 close 해서 종료했다.

 

그러나, 이러한 방식으로는 에러난 부분을 눈으로 확인 하는 것이 굉장히 불편하다.

 

그래서 등장한 것이 JSP이다.

JSP 보이는 모습은 HTML 같지만,  WAS 내부에서는 Servlet으로 해석된다.

 

 


<!doctype html>
<html>
</html>

HTML이 위의 형태로 시작하는 것처럼, JSP 시작은 아래와 같이 시작한다.

<%@page>
<html>
</html>

 

WebContent 내부에 만든다.


주석에도 차이가 있다.

클라이언트에 보낼 때, JSP 주석은 안보낸다.

하지만, Content 주석은 보낸다. 그러나 주석처리되어 있기 때문에 브라우저에서 나타나지 않을 뿐이다. 

일반적으로 주석은 클라이언트에게 보낼 필요가 없으므로 JSP 주석을 더 많이 사용한다.

 

<%-- --%> : JSP 주석

<!-- --> : Content 주석

 

<%@ 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 주석 : 서블릿으로 변환되지 않기 때문에 화면에 전송되지 않음.
		
	 --%>
	 
	 <!-- 
	 	컨텐트 주석 : 서블릿으로 변환되어 브라우저에 전송 되지만, 웹브라우저에서 해석하지 않아 화면에 보이지 않음.
	  -->
	  
	  주석이 화면에 보입니까?

</body>
</html>

 


.jsp 를 요청하면 WAS 서버는 servlet 으로 변환시켜서 out.println 으로 response 한다.

맨처음 접속할 때는 .jsp를 servlet 코드로 변환시켜주기 때문에 느리다. 두 번째 부터는 빠르다.

 

 

 

최초 jsp 파일을 실행한 뒤,

JSP 엔진이 Servlet 파일로 변환한 모습이다.

 

 

참조

 

1. A: 개발자가 web-workspace 밑에 jsp 파일을 만든다.

2. B: 이클립스가 자동으로 해당 파일(web-workspace 밑의 jsp 파일)을, 톰캣 파일의 deploy path에 복사해준다. (? ㅠㅠ)

3. C: JSP 엔진이 work > 카탈리나 밑에 있는 jsp 파일을 찾아서 servlet 으로 변환시킨다. (? ㅠㅠ)

 

 


JSP 내에 JAVA 코드를 입력할 수 있다.

또한, 아래의 for 반복문 내에 out이라는 객체를 사용하고 있는데,

우리가 선언한 적이 없음에도 실행이 된다.

 

왜냐하면 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>
	
	<h1>1~ 10 사이의 정수 출력</h1>
	<%
		for (int i = 1; i <= 10; i++){
			out.println(i + "<br>");
		}
	%>
	
	
</body>
</html>
<%@ 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>
	<h1>1~10 사이의 정수 출력</h1>
	<%-- <%
		for(int i = 1; i <= 10; i++){
			out.write(i + "<br>");
		}
	%> --%>
	
	<%
		int sum = 0;
		for(int i = 1; i <= 10; i++){
			sum += i;
	%>
		<%= i%><br>
	<%
		}
	%>	
	
	<%-- <%= "1~10 사이의 총합 :" sum %><br> --%>
	1~10 사이의 총합 : <%=sum %><br>

</body>
</html>
<%@page import="java.util.Random"%>
<%@ 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>
	<h1>1 ~ 10 사이의 임의의 정수 출력</h1>
	<%
		//java.util.Random r = new java.util.Random();
		Random r = new Random();
		int random = r.nextInt(10) + 1;
		
	%>
	추출된 정수 : <%= random %> <!-- 표현식 내에는 수식 혹은 변수만 써야한다. 예를 들어 3 * 6 또는 sumVar 등등-->

</body>
</html>