본문 바로가기
JAVA_Servlet

초보의 Servlet 개발 화면이동

by old Developer 2020. 11. 19.

olDevServlet_화면이동.zip
0.01MB

JSP 개발 때와 마찬가지로 Servlet으로 화면 이동부터 하나씩 만들어보자.


1. 목표

 

이전처럼 index.jsp에 버튼을 생성하고 mberSample.jsp 이동하고 이 이동을 받아줄 MberSampleServlet도 만들자.

 

- index.jsp 버튼 추가

- 버튼 클릭하면 MberSampleServlet.java에서 응답으로 mberSample.jsp를 return 하자.

- MberSmapleServelet.java를 web.xml servlet-mapping 하자.

- Servlet에서 test 값을 넘겨보자.

 

2. index.jsp 수정하기

 

소스코드 :

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

	<head>
		<meta charset="UTF-8">
		<title>olDevServlet Hello World!</title>
	</head>

	<body>
		<form id="indexFrm" name="indexFrm">
			<input type="hidden" id="submitType" name="submitType">
			<a href="javascript:void(0);" onclick="fnPageChange('/mberSample.do', 'get')">Get Submit</a>
			<a href="javascript:void(0);" onclick="fnPageChange('/mberSample.do', 'post')">Post Submit</a>
		</form>
	</body>
	
	<script type="text/javascript">
		function fnPageChange(url, type) {
			
			// get, post type 따른 doGet, doPost method 로그용 parameter 
			var hiddenInput = document.getElementById("submitType");
			hiddenInput.value = type;
			
			var frm = document.getElementById("indexFrm");
			frm.method = type;
			frm.action = url;
			frm.submit();
			
		}
	</script>
	
</html>

 

소스 코드를 보면 기존 input="button" type대신 <a> 태그를 적용했고 <a> 태그 클릭 시 스크롤 이동을 막는 내용도 추가해 주었다. form submit을 get, post 방식을 선택적으로 테스트할 수 있도록 2개로 구성했고 해당 방식을 Servlet에 Parameter로 전달하고 전달받은 내용을 찍어볼 생각이다. 앞으로 되도록이면 post 방식으로 작성할 예정이기도 하다. (get 방식의 url 노출이 마음에 안 듦 ㅎㅎ)

 

3. mberSamp.jsp

 

sample.jsp 파일 이름을 mberSample.jsp로 수정하고 불필요한 내용은 제거

 

소스코드 :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<body>
	<input type="text" id="sampleTest" name="sampleTest" value="<%=request.getParameter("sampleTest")%>">
	<a href="javascript:void(0);" onclick="fnPageChange('/')">index</a>
</body>

<script type="text/javascript">
	function fnPageChange(url) {
		location.href = url;
	}
</script>

 

index.jsp 보다 훨씬더 간단하다. Servlet으로부터 데이터를 받아 보려 request.getParameter("sampleTest") 출력 내용을 넣어 준 것 외에는 특별한 게 없다.

 

4. MberSampleServlet.java

 

OlDevSampleServlet.java 파일명을 MberSampleServlet.java로 변경

 

소스코드 :

package com;

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MberSampleServlet extends HttpServlet {

	private static final long serialVersionUID = 3161530544990290786L;

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		System.out.println("### doGet method :: " + req.getParameter("submitType"));
		resp.sendRedirect("/mberSample.jsp");
	}
	
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		System.out.println("### doPost method :: " + req.getParameter("submitType"));
		req.setAttribute("sampleTest", "setAttribute value");
		resp.sendRedirect("/mberSample.jsp");
	}
}

 

소스코를 보면 뭐 특별한 것도 없고 요청 type log 정도 찍은 게 전부지만 그래도 좀 살펴보면

 

- getPost

form method 설정 값으로 get, post가 있고 그 덕분에 Servlet도 get과 post를 구분해서 처리해야 한다. JSP에서 선택적으로 get, post를 요청할 테니 부모의 doPost method를 overring 하자 인자는 goGet과 동일하다. 

 

* form mrthod='post' 타입으로 요청 보냈는데 Servlet에 doPost 구현이 안되어 있으면 405 Error를 return 함.

 

- setAttribute

setAttribute는 요청에 대한 응답 값을 전달하기 위한 세팅인데 map처럼 key, value 형태로 설정하고 value 인자의 data type이 object로 되어있어 java에서 사용하는 모든 객체를 담을 수 있다. 응답에 대한 값은 response.setAttribute여야 할 것 같은데 response에서 제공하는 method들을 살펴보면 응답 방법, 응답 header 세팅 등에 관련된 내용이 대부분이고 값에 대한 처리는 request로 설정해야 한다. setAttribute에 상응하는 getAttribute method도 있는 데 사용할 때 알아보자.

 

- sendRedirect

sendRedirect는 응답을 method에 입력한 곳으로 보내겠다는 것인데 mberSample.jsp로 바로 보내는구나? 싶겠지만 그렇게 움직이지는 않는다. 이미지를 보면

 

sendRedirect의 이동

 

보는 바와 같이 예상과는 다르게 실제로는 index.jsp 페이지로 응답이 전달되고 index.sjp 페이지가 sedRedirect 되는 페이지로 이동시켜준다. 이게 무엇을 이야기하려는 것이냐면 저 setAttribute는 값을 전달할 수가 없다. request, response는 휘발성이라 하지 않았던가? index.jsp가 response를 받은 시점에 setAttribute는 전달되었던 것이고 index.jsp는 redirect화면으로 이동시키며 새로운 Request가 발생하게 되어 mberSample.jsp로 전달 시 setAttribute 데이터를 전달할 수 없다. 뭐 그렇다는 거다... 아직은 깊이 들어갈 필요가 없고 '아 이렇게는 데이터를 전달할 수 없구나'만 이해하고 그럼 이 녀석은 데이터를 전달하지 않아도 되는 화면으로 이동할 때 사용하면 좋겠다 정도 생각하자. 예를 들자면 Login과 같은 화면 말이다. 

 

5. web.xml servlet-mapping

 

기존 매핑된 OlDevSampleServlet 내용을 MberSampleServlet으로 변경

 

소스코드 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xmlns="http://java.sun.com/xml/ns/javaee"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		 id="WebApp_ID"
		 version="2.5">
		 
	<display-name>olDevServlet</display-name>
  
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
  
	<servlet>
		<servlet-name>mberSample</servlet-name>
		<servlet-class>com.MberSampleServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>mberSample</servlet-name>
		<url-pattern>/mberSample.do</url-pattern>
	</servlet-mapping>
  
</web-app>

 

기존 정보를 변경한 것 외에는 달라진 것이 없다.

 

6. 실행

 

기왕 만든 거니깐 화면 이동이나 시켜보자.

 

Get 이든 Post든 클릭해보자.

 

클릭한 요청에 따른 Log 출력

 

화면은 열렸는데 sendRedirect는 데이터 전달이 안된다.

 

별 내용이 없기 때문에 화면 이동은 잘된다. 역시 데이터를 받지 못하지만 ㅎ

이렇게 목표했던 화면 이동은 끝난 거 같은데... 데이터를 못 받다니... 그건 난중에 조회할 때 다시 찾아보고 딸랑 하나 만들어 봤지만 JSP와 다르게 아니 뭐 저딴거 하나 하자고 Servlet을 꼭 써야 하는가? 하는 생각이 들지 않는가? web.xml 설정하고. java도 만들고 막 method 알아야 하고... 어휴 욕 나와 싶을 수도 있겠다. 근데 쓰는 데는 다 이유가 있었고... 나만 몰랐고..... 쩝 Model1, Model2 뭐 이런 거 다 필요 없고 비즈니스 분리니 뭐니 다 필요 없다. 왜냐고? 모바일 App에서 데이터 요청 들어오면 어떻게 처리할 거임?. jsp 호출하세요 해야 하나? <% DB Access 하고 비즈니스 짜고 뭐.... 스크립트릿으로 난리 칠 필요가 있나? %> 그냥 자바로 짜두면 되지.... 내가 보여줄 화면도 없는데? 이게 젤 큰 이유 아닌가? 관리? 유지보수? 뭔 소리를 해도 화면을 JSP로 안 만들면 그. 만. 이. 다. 비즈니스 표현 대상이 은하계든 사과든 상관없이 동일한 비즈니스 구현해두고 사용하라고 알려주기엔 Servlet를 써야 하지 않겠는가? Request 받고 Response 주면 끝인데? 뭐 그렇다는 거고... 쨌든 목표 채웠으니 이만 끝! ㅋㅋ

 

댓글