본문 바로가기

개발일기/Java

[Java] Servlet과 JSP을 이용한 동적 웹사이트 만들기

 

웹 시스템

 

정적 페이지와 동적 페이지

 

- 정적 페이지                  

: 언제, 누가, 어디서 접속해도 디자인/내용이 동일한 페이지. 

: HTML과 CSS로만 웹 어플리케이션을 제작하면 정적 페이지로밖에 제작할 수 없다

 

- 동적 페이지

: 접속한 시간, 장소, 사람에 따라 디자인/내용이 달라지는 페이지

: Javascript를 비롯해 PHP, Java 등으로 구현이 가능하다.

 

 

MVC 패턴

- 디자인 패턴 중 하나로, 어플리케이션 혹은 프로젝트를 구성할 때 그 구성요소를 세 가지의 역할(Model, View, Controller)로 구분하는 것.

- 사용자가 Controller를 조작하면, Controller는 Model을 통해 데이터베이스에 접근하고, 그 정보를 바탕으로 View가 시각적으로 표현하여 사용자에게 전달한다.

구분 역할 규칙
Model 어플리케이션의 데이터(데이터베이스, 상수, 초기화값, 변수 등)의 접근과
가공을 책임지는 컴포넌트
1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.

2. View나 Controller에 대해 어떤 정보도 알지 말아야 한다.

3. 변경이 일어나면 변경 통지(이벤트 발생 혹은 수신)에 대한 처리 방법을 구현해야만 한다.
View 데이터를 기반으로 사용자들이 볼 수
있는 화면, 즉 사용자 인터페이스
요소를 담당한다.
1. Model이 가지고 있는 정보를 따로 저장해서는 안된다.

2. Model이나 Controller에 대해 어떤 정보도 알지 말아야 한다.

3. 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야만 한다.
Controller 데이터와 사용자 인터페이스 요소들을 잇는 다리 역할을 한다.

데이터의 열람이나 수정에 대한 이벤트들을 처리한다.
1. Model과 View에 대해 알고 있음으로써, Model과 View가 변경을
외부로 알리거나 수신하면 그것을 중재해주어야 한다.

2. Model과 View의 변경을 모니터링하여, 변경 통지를 해석해 각각의 구성 요소에 통지해주어야 한다.

 

 

 

Servlet과 JSP

 

MVC모델에서의 Servlet과 JSP

 

- MVC모델에서 Servlet은 Controller, JSP는 View의 역할을 해준다.

- Servlet은 Java기반 문법, JSP는 HTML기반 문법을 따른다.

- 그러므로, JSP를 통해 사용자로부터 입력을 받아 그 처리는 Servlet이 맡고, 결과는 다시 JSP로 표시하는 흐름을 따른다.

 

* Servlet과 JSP환경에서의 리퀘스트/리스폰스 흐름

1. JSP페이지를 통해 사용자의 입력이 이루어진다.

2. 입력값은 Servlet으로 전달되어, 데이터베이스에 액세스 하는 등의 처리를 한다.

3. 처리한 결과값을 JSP에 전달하고, 그 이후의 작업을 맡긴다(포워드).

4. JSP가 전달받은 데이터를 바탕으로 사용자에게 보여줄 화면을 만든다.

 

사전 준비

 

1. 서버 준비

- 이클립스의 '서버' 패널에서 사용할 Tomcat 서버를 우클릭->개시

 

2. 프로젝트 작성

- 파일-신규-동적 웹 프로젝트 생성

 

3. JSP 파일 생성

- src/main/webapp 경로에 JSP 파일을 생성한다.

 

4. Servlet 파일 생성

- src/main/java 경로에 java 파일을 생성한다.

 

 

JSP파일의 작성

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

- 문서 상단에 추가해줄 코드.

 

<% Java 코드 %>

- 기본적으로는 HTML작성법을 따르나, Java 코드를 넣고 싶을 경우엔 '<% ~ %>' 안에 집어넣는다.

 

<%=aaa%>

- 변수 'aaa'의 값을 화면에 출력해주는 코드.

 

<a href="index.jsp">index.jsp로 이동</a>

- 링크를 클릭했을 때 페이지를 이동하는 코드. 일반적인 HTML 작성법과 동일하다.

 

* 예제) 당첨-꽝 추첨

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
	
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>JSP연습 01</title>
	</head>
	<body>
		<%
			int num = (int)(Math.random()*10);
			String str;
			if(num > 5){
				str = "당첨!";
			}
			else{
				str="꽝!";
			}
		%>
		<p>결과 <%= str%></p>
	</body>
</html>

 

 

JSP -> Servlet -> JSP 로의 페이지 이동

* 예제) 사용자로부터 이름과 생년월일을 입력받아 이름과 나이를 표시하는 페이지

 

1. index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>사용자 입력</title>
	</head>
	<body>
		<form action="inputcheck" method = "get">
			<input type="text" name = "name">
			<input type="number" name = "birth">
			<input type="submit">
		</form>
	</body>
</html>

- form의 전송처는 Servlet파일의 url로 지정해준다.

 

2. inputcheck.java (Servlet파일)

// 사용할 URL 지정.
// 기본적으론 파일명으로 지정되나, 따로 지정하고 싶을 경우 사용
@WebServlet(urlPatterns={"/inputcheck"})

public class ServletSample extends HttpServlet {
	protected void doGet(HttpServletRequest request , HttpServletResponse response)
		    throws ServletException , IOException {
            
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		// 리퀘스트(form으로 입력받은 정보)를 불러들여 변수에 저장/처리
		String name = request.getParameter("name");
		int birth = Integer.parseInt(request.getParameter("birth"));
		int age = 2025 - birth;
		
		String mes = "어서오세요" + name + "님." + "연령 : " + age;
		
                // 처리 결과를 JSP 파일에 전송
		request.setAttribute("mes", mes);
                // 이후의 작업을 result.jsp에 넘김(포워드)
		request.getRequestDispatcher("/result.jsp").forward(request, response);
	}
}

- 정보를 받고 처리하는 과정이 doGet 메소드 내에서 이루어진다.

- index.jsp의 form에서 입력된 정보가 인수인 request를 통해서 전달된다.

- 데이터를 처리한 후, 처리 결과는 그것을 표시할 result.jsp파일로 전송해주고, 이후의 작업도 넘겨준다.

 

3. result.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>
	<%
		String mes = (String)request.getAttribute("mes");
	%>
	<body>
		<p><%=mes %></p>
	</body>
</html>

- inputcheck.java로부터 데이터를 넘겨받아, 화면에 표시한다.

 

 

~ 참고한 자료 ~

[개발자 면접준비]#1. MVC패턴이란 : 네이버 블로그