본문 바로가기
> 프로그래밍 언어/JSP

[JSP] 서블릿 개념 핥기 1~ 3탄(끝)

by 자몽주스 2023. 4. 25.
728x90

< login.jsp >

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
	<%-- 1) 입력받는 파일 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<form action="loginProc.jsp" method="post">
		<input type="text" name="userid"><br> 
		<input type="password" name="userpw"><br> 
		<input type="submit" value="로그인">
	</form>
	<!-- 로그인 페이지
	사용자의 입력을 위해서 페이지가 필요함.
	그 입력한 내용이 처리가 될려면 어떤 jsp 파일로 요청을 해야한다.
	 -->
</body>
</html>

< loginProc.jsp >

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%-- 2) 처리하는 파일 --%>
<%
/*처리를 위한 JSP파일 
로그인했을 때 로그인 form 을 보여주고,
로그인 프로세서에서 할일은 클라이언트한테 뭘 보여 줄 필요 X
요청을 받아서 어떻게 할 건지만 결정

브라우저를 위한 동적페이지가 아니라,
그냥 처리를 위해 존재.
*/

String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");

if (userid.equals(userpw)) {
	// userid 하고 pw하고 동일하다면 로그인 성공
	// 로그인 성공되면 다른 페이지로 redirect - ex) 메인페이지
	// 로그인 실패되면 로그인 페이지로 이동
	response.sendRedirect("/main.jsp");
} else {
	response.sendRedirect("/login.jsp");

}
%>

JSP 파일을 요청하는 것과, Servlet을 요청하는 형식은 다름

 < MVC 패턴 >

JSP: 이전에는 요청처리였다면,

보여주는 역할을 담당하게 됨

< LoginServlet.java>

package servletex;

import java.io.IOException;

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

public class LoginServlet extends HttpServlet {
		@Override
		public void init() throws ServletException {
			System.out.println("로그인 서블릿 초기화");
		}
		@Override
		public void destroy() {
			System.out.println("로그인 서블릿 소멸");
		}
		@Override
		protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			System.out.println("로그인 서비스!");
		}
}

클라이언트의 요청을 처리하는 담당

= controller ( Servlet )

< web.xml >

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>youtube</display-name>
	<!-- 서블릿 등록 -->
	<servlet>
		<servlet-name>loginServlet</servlet-name>
		<servlet-class>servletex.LoginServlet</servlet-class>
	</servlet>
	<!-- 경로 매핑 -->
	<servlet-mapping>
		<servlet-name>loginServlet</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>

</web-app>

< 내가 만든 서블릿 등록해주기 >

: web.xml

: tomcat에 servlet 등록

 

서비스 등록:

톰캣이 서비스를 사용해야겠다고 인식

 

경로매핑:

브라우저에서 뭐라고 요청했을 때

동작할건지

 

loginServlet은 브라우저에서 최상위에

login 이라는 요청이 들어왔을 때

( ex: localhost:8080/login )

동작한다는 뜻

< LoginServlet.java>

@Override
	    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

	}

서비스 지워주고,

요청 메서드 get을 사용해서

get 요청이 들어왔을 때

어떻게 처리하게 할 건지

get 요청: 주소창으로 서버를 요청하는 것

 

get으로 요청이 들어왔을 땐,

로그인 할 수 있는 페이지를 보여줘야 함.

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getRequestDispatcher("/login.jsp").forward(req, resp);
	}

jsp 파일로 브라우저에 응답할 내용을 만들어서,

내부에서 포워딩

 


최초로 서버에

JSP 파일 요청했을 때


< 컨트롤러 >

request가 서버에 들어오면 

서블릿 중에서 컨트롤러 역할을 하는 애를 만든다

 

컨트롤러가 요청을 받아서

요청이 뭔지 확인을 하고,

요청에 맞게 처리를 함.

 

이때, 모델을 사용

(비지니스로직 처리할 때)

 

< 모델 >

컨트롤러로부터 요청을 받아서

(메소드 호출)

그 요청을 처리

처리 결과는  return 된다

 

결과가 돌아가면 그 결과를

사용자에게 보여줘야 되므로

request  객체나

session 객체 같은 곳에다가

결과 데이터를 유지해 줌.

 

그 유지된 파일을 갖고

JSP가 처리될 수 있게끔

view 라는 걸 선택.

 

 

클라이언트의 최초 요청을 받아주는 것은

컨트롤러의 서블릿.

 

< 뷰 >

결과를 보여주는 JSP 파일도

포워딩을 받아서 요청을 처리하는 서블릿.

 

AddServlet1이 요청을 받으면,

요청으로부터 데이터를 꺼내고

처리하는 것 => 비지니스 로직

응답데이터도 응답해줌

(response)

< web.xml >

이 서블릿이 동작하기 위해서

이렇게 서블릿 등록을 해야함

 

addServlet1을 동작시킬것

언제? /add1이 들어왔을 때 동작

 

지금까지가 기능 하나(1개)의 설정.

만약 또다른 기능이 있다면,

xml 설정을 추가로 한다

 

기능을 추가로 할 때마다

등록 해야 함

 그걸 일일이 추가로 하면

불편하니까

Front Controller 라는 개념을 추가해서 적용한다.

< Front Controller >

하나의 매핑(/)을 이용.

슬래시 하나에

내가 만든 서블릿을 모두 매핑.

 

클라이언트한테 오는 모든 요청들을

하나의 서블릿으로 다 받게 함

< controller.CommandHandler.java > 

package controller;

import java.io.IOException;

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

public interface CommandHandler {
	public String handlerAction(
			HttpServletRequest request,
			HttpServletResponse response
			) throws ServletException, IOException;

}

동작을 하고 동작을 할 때

 request와 response 를 받아서 동작하고

결과는 String을 반환함

< controller. AddHandler.java > 

package controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import model.AddService;

public class AddHandler implements CommandHandler {
	private AddService addService = new AddService();

	@Override
	public String handlerAction(HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
			throws ServletException, IOException {
		int n1 = Integer.parseInt(request.getParameter("n1"));
		int n2 = Integer.parseInt(request.getParameter("n2"));

		int result = addService.add(n1, n2);

		request.setAttribute("result", result);
		return "/WEB-INF/add.jsp";
	}
}

서비스 + 서비스

요청이 들어왔을 때 

파라미터를 통해서 더하기 기능을 시킴

결과물은 request 에 담아두고

view 경로를 반환하게 한다.

< controller. MinHandler.java > 

package controller;

import java.io.IOException;

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

import model.MinService;

public class MinHandler implements CommandHandler {
	private MinService minService = new MinService();

	public String handlerAction(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		int n1 = Integer.parseInt(request.getParameter("n1"));
		int n2 = Integer.parseInt(request.getParameter("n2"));

		int result = minService.min(n1, n2);

		request.setAttribute("result", result);
		return "/WEB-INF/min.jsp";

	}
}

MinHandler 가 빼기 기능에 대한 서비스를 갖고 있고,

요청파라미터를 이용해서

빼기 기능을 동작시켜서

결과물을 request에 담고

min.jsp 라는 경로를 반환.

컨트롤러가

add 인지

min 인지

구분해주는 역할을 함

클라이언트 요청 받아서

응답줄 수 있는 HttpServlet

 

  HttpServlet은 요청이 들어왔을 때

요청이 무엇인 지 구분해야하고, 

요청에 맞는 기능으로 연결을 해 줘야 한다.

 

commandHandlerMap에  HashMap 객체를 생성해두고,

문자열과 매핑되는 객체를 등록해준다

"/add", new AddHandler());

 

728x90

'> 프로그래밍 언어 > JSP' 카테고리의 다른 글

[Mybatis] 설치 및 시작  (0) 2023.04.04
[ IT핥기] JSP! 독학! (2)  (0) 2023.03.29
[ IT핥기] JSP! 독학! (1)  (0) 2023.03.28
[JSP] JSP시작, 톰캣 설치하기  (0) 2023.03.28
[servlet/JSP] 1강 ~ 7강  (0) 2023.03.24