본문 바로가기

Archived(Programming)/Spring #1(기초)

Web_웹의 기본

# MVC

JSP만으로도 웹 구축 가능 / Servlet만으로도 웹 구축 가능

그러나 Servlet은 Controller의 역할, JSP는 VIEW의 역할을 수행할 수 있도록 

@WebServlet("greeting.do") 어노테이션 > url로 들어오면 해당 Servlet을 실행시켜라

MVC 패턴

형상 관리(구성 관리)도 고려되어야 함

wildcart mapping *.inc 를 통해 사용자의 접근을 전부 모을 수 있다

package front.ctrl;

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

@WebServlet("*.inc")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void requestProc(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		String uri = request.getRequestURI();
		System.out.println("client uri :" + uri);
	}

}

Front Controller는 Factory(SingleTon)에게 작업 보냄

Factory에서 singleTon 을 통해 일관성 있는 작업 가능

package com.sinc.intern.insa.ctrl;

import java.io.IOException;

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

import com.sinc.intern.util.Controller;

public class InsertCtrl implements Controller{
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		System.out.println("InsertCtrl execute");
	}
}
package com.sinc.intern.insa.ctrl;

import java.io.IOException;

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

import com.sinc.intern.util.Controller;

public class SelectCtrl implements Controller {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		System.out.println("SelectCtrl execute");
	}
}
package com.sinc.intern.factory;

import java.util.HashMap;
import java.util.Map;

import com.sinc.intern.insa.ctrl.InsertCtrl;
import com.sinc.intern.insa.ctrl.SelectCtrl;
import com.sinc.intern.util.Controller;

public class BeanFactory {
	
	private static BeanFactory instance;
	private Map<String, Controller> map = new HashMap<>();
	
	private BeanFactory() {
		map.put("/incWEB/insert.inc", new InsertCtrl());
		map.put("/incWEB/select.inc", new SelectCtrl());
	}
	
	public static BeanFactory getInstance() {
		if(instance == null) {
			instance = new BeanFactory();
		}
		return instance;
	}
	
	public Controller getBean(String uri) {
			return map.get(uri);
	}
}
package front.ctrl;

import java.io.IOException;

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

import com.sinc.intern.factory.BeanFactory;
import com.sinc.intern.util.Controller;

@WebServlet("*.inc")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void requestProc(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		String uri = request.getRequestURI();
		System.out.println("client uri :" + uri);
		
		BeanFactory factory = BeanFactory.getInstance();
		Controller ctrl = factory.getBean(uri);
		
		ctrl.execute(request, response);
	}

}

형상 관리(구성 관리)도 고려되어야 함

CF. Forward 방식과 SendRedirect의 차이

Forward는 들어온 요청에 대해 가르켜서 연결함(즉, 기존의 요청한 페이지 url에 멈춰있음)

SendRedirect는 들어온 여청에 jsp 페이지를 직접 연결하여 띄워줌

여기서, Forward는 객체의 재사용 및 공유에 있어 이점이 있는 반면에 Redirect는 url의 변화라는 이점이 존재

 

forward
Redirect

MainCtrl를 통한 main.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>
	<div align="center">진짜 ~ 루 재미있는 웹 프레임워크 by jslim </div>
	<hr/>
	<form action="parameter.inc"  method="post">
		Post ::<br/>
		<input type="text" name="msg" id="msg">
		<input type="submit" value="이벤트">
	</form>
	Get :: <br/>
	<a href="parameter.inc?msg=jslim">링크</a>
</body>
</html>
package com.since.intern.main.ctrl;

import java.io.IOException;

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

import com.sinc.intern.util.Controller;
import com.sinc.intern.view.util.ModelAndView;

public class MainCtrl implements Controller{
	@Override
	public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		System.out.println("MainCtrl execute");
		return new ModelAndView(true, "main.jsp");
	}
}
package front.ctrl;

import java.io.IOException;

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

import com.sinc.intern.factory.BeanFactory;
import com.sinc.intern.util.Controller;
import com.sinc.intern.view.util.ModelAndView;

@WebServlet("*.inc")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		requestProc(request, response);
	}

	protected void requestProc(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException {
		String uri = request.getRequestURI();
		System.out.println("client uri :" + uri);
		
		BeanFactory factory = BeanFactory.getInstance();
		Controller ctrl = factory.getBean(uri);
		
		ModelAndView mv = ctrl.execute(request, response);
		if(mv.isSend()) {
			RequestDispatcher view = request.getRequestDispatcher(mv.getPath());
			view.forward(request, response);
		}else {
			response.sendRedirect(mv.getPath());
		}
	}

}
package com.sinc.intern.factory;

import java.util.HashMap;
import java.util.Map;

import com.sinc.intern.insa.ctrl.InsertCtrl;
import com.sinc.intern.insa.ctrl.SelectCtrl;
import com.sinc.intern.util.Controller;
import com.since.intern.main.ctrl.MainCtrl;

public class BeanFactory {
	
	private static BeanFactory instance;
	private Map<String, Controller> map = new HashMap<>();
	
	private BeanFactory() {
		map.put("/incWEB/insert.inc", new InsertCtrl());
		map.put("/incWEB/select.inc", new SelectCtrl());
		map.put("/incWEB/main.inc", new MainCtrl());
	}
	
	public static BeanFactory getInstance() {
		if(instance == null) {
			instance = new BeanFactory();
		}
		return instance;
	}
	
	public Controller getBean(String uri) {
			return map.get(uri);
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<script>
	location.href="main.inc" ;
</script>

index 페이지인 localhost:8088/incWEB 로 접속시 main.inc로 재링크 후 main.jsp 페이지 띄우기

Dispatcher Controller 에서 BeanFactory의 싱글톤 디자인을 통해 (컨트롤러 인터페이스를 구현한) 컨트롤러들을 이어준다. 그리고 해당 컨트롤러에서 ModelAndVIew를 통해 url을 가져오고 해당 url을 FrontController에서 다시 forward 해줌

 

기본적인 구조는 인터페이스 Object에다가 Impl Class 생성자를 통해 넣기

 

하나 이상의 파라미터 > 객체

VO, DTO

 

jsp에서의 HTML Parameter 변수 이름과 DTO의 변수 이름 항상 맞추기(대소문자까지)

Controller > Service(interface, impl) > Dao(Interface, impl) 과정 이해하기

 

Framework

DTO에서 DB로, DB에서 다시 VO로 담기

 

 

데이터를 심을 수 있는 자바의 4가지 메모리 영역

Context, Session, Request, Page

> 보통, Session, Request의 영역에서 데이터 공유

> 메모리 영역에다가 컨트롤러가 데이터를 심어준다

http://blog.naver.com/PostView.nhn?blogId=javaking75&logNo=140181686711

 

[JSP] 영역(Scope) 객체와 속성 ( page, request, session, application )

속성 (Attribute) : 공유되는 데이터 영역 (Scope) : 속성을 공유할수있는 유효범위. 영역객체 : 해당 영...

blog.naver.com

Session의 유효 타임은 짧기 때문에 늘려서 사용하기도 함

Request의 유효 타임은 Request~Response 더 짧다

 

CF. 쿠키와 세션의 차이는 데이터를 클라이언트/서버 어디 저장하는지

쿠키는 문자열 밖에 못심고 길이도 짧은 반면에 세션은 객체를 저장할 수 있다

운영시스템은 대부분 세션에 심어서 관리(보안 문제)

 

<%@ 지시자 태그(페이지 전체)

<%!   선언문 태그(변수, 메서드)

<%    scriptlet 태그(콜백함수 doGet, doPost)

<%=  표현식 태그(세미 콜론; 사용 불가)

+ HTML  // .jsp -> .java ->.class 

 

JSP에서는 12가지의 내장 객체가 있다

이러한 내장 객체는 선언 없이 바로 사용 가능

JSP에 띄우기

package com.sinc.intern.insa.ctrl;

import java.io.IOException;

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

import com.sinc.intern.insa.model.vo.UserDTO;
import com.sinc.intern.insa.service.UserService;
import com.sinc.intern.insa.service.UserServiceImpl;
import com.sinc.intern.util.Controller;
import com.sinc.intern.view.util.ModelAndView;

public class LoginCtrl implements Controller{
	
	// Dependency Injection
	private UserService service;
	
	public LoginCtrl() {
		service = new UserServiceImpl() ;
	}
	
	@Override
	public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		System.out.println("LoginCtrl execute");
		String id = request.getParameter("id");
		String pw = request.getParameter("pwd");
		UserDTO dto = new UserDTO(id, pw);
		Object user= service.select(dto);
		System.out.println("Ctrl result user : " + user);
		ModelAndView mv = new ModelAndView();
		
		// 분기
		if(user != null) {
			mv.setSend(true); mv.setPath("ok.jsp");
			HttpSession session = request.getSession();
			session.setAttribute("loginSession", user);
 		}else {
			mv.setSend(false); mv.setPath("error.jsp");
		}
		
		return mv;
	}
}
ok.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.sinc.intern.insa.model.vo.UserVO" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%	// scriptlet tag service 서비스 역할
		UserVO user = (UserVO)session.getAttribute("loginSession") ;
		
	%>
	<%= user %>
	
</body>
</html>

EL, JSTL library

태그 형식으로 변수 선언, 조건문 처리, 반복문 등 여러가지 활용 가능

(주석 : <%-- 활용하기 --%> )

 

다음과 같이 EL 문법 활용가능(scriptlet, import 안해도 됨, Controller에서 set 해줬던 값들 넘어오는 것)

<font color='blue'>
		${ loginSession.name }
</font>님 환영합니다~~~

<font color='blue'>
		${ loginSession['name'] }
</font>님 환영합니다~~~

'Archived(Programming) > Spring #1(기초)' 카테고리의 다른 글

Web_Spring  (0) 2020.02.03
Web_JSON  (0) 2020.02.03
Web_JSON  (0) 2020.02.02
Web_MVC  (0) 2020.01.31
Web_JSP와 SERVLET  (0) 2020.01.29