초급의 끄적거림

[servlet] 사용자 정의 서블릿 작성 (MyController 클래스) 본문

JSP

[servlet] 사용자 정의 서블릿 작성 (MyController 클래스)

codingD 2019. 10. 2. 17:55

첫 페이지 : index.do
답변형 게시판 : 쓰기, 목록 상세보기, 삭제, 수정
회원 : 로그인, 로그아웃, 회원가입, 아이디 중복확인, 아이디/비번찾기

이것들을 다 web.xml에 넣으면 비효율적임
때문에 이것들을 한번에 관리할 수 있는 것을 만듦

 

Model : DAO

View   : JSP, EL, JSTL

Control : MyController, DispatcherServlet (Spring)

 

0. MVC답변형 게시판


 - bbs2 라는 패키지 만들기

 - WebContent\bbs2 폴더 생성

 - index.jsp와 header.jsp 의 MVC 카테고리의 경로가 .do 인지 확인

 

1. 커맨드 패턴


 - 서블릿에서 사용자의 요청을 명령어 전달

 - 사용자가 어떤 요청을 했는지 판단하기 위한 가장 일반적인 방법이 명령어로 사용자의 요청을 전달하는 것

   예) 글목록 명령, 글삭제 명령

 

 1-1) 요청 파라미터로 명령어를 전달하는 방법

  http://localhost:8090/myweb/control?command=login.do

 

 1-2) 요청 URI 자체를 명령어로 사용하는 방법

  http://localhost:8090/myweb/index.do

 

 

2. 사용자 요청 커맨드 작성 및 등록


  2-1) /WEB-INF/command.properties (새 파일만들기)

   - 경로 : /WEB-INF/command.properties
   - web.xml을 대신해서 명령어를 모아둘 곳. 
   - 명령어=클래스명
   - 경로와 이름의 대소문자 주의 (수많은 오류의 주범이 될 수 있음)

/myweb/index.do=net.action.Index
/myweb/bbs2/bbsform=net.bbs2.BbsForm
<!-- MyController 서블릿 등록 -->
<servlet>
	<servlet-name>ControllerAction</servlet-name>
	<servlet-class>net.controller.MyController</servlet-class>
	<init-param> <!-- 초기값으로 이 값을 가져가라 -->
		<param-name>propertyConfig</param-name>
		<param-value>D:\java0514\workspace\myweb\WebContent\WEB-INF\command.properties</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>ControllerAction</servlet-name>
	<url-pattern>*.do</url-pattern>  <!-- .do 패턴으로 요청하면 무조건 거치는 것 -->
</servlet-mapping>

 

 

 2-2) 한글 필터 (EncodeFilter.java)

  - 경로 주의 : net.utility/EncodeFilter.java

package net.utility;

import java.io.*;

import javax.servlet.*;

public class EncodeFilter implements Filter{

	@Override
	public void destroy() { }

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		//request 보내기전에 전처리할 코드가 있으면 여기서 처리한다.
		//또한 response후의 후처리할 코드가 있다면 여기서 처리
		
		arg0.setCharacterEncoding("UTF-8");
		arg2.doFilter(arg0, arg1);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}
	
}//class end
<!-- web.xml에 한글 필터 등록 -->
<filter>
	<filter-name>encode</filter-name>
	<filter-class>net.utility.EncodeFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>encode</filter-name>
	<url-pattern>/*</url-pattern>  <!-- 정해진 패턴을 찍고가는데 /* 는 '전체' 를 의미  -->
</filter-mapping>

 

 

3. MyController


  - net.controller 클래스 생성

  클래스

  객체 (object)

  class Index{}

  new Index()

  class BbsForm{}

  new BbsForm()

  class BbsInsert{}

  new BbsInsert()

 

commandMap에 저장할 모습 (key와 value 형태로 데이터를 관리할 수 있게 함)

  key

  value

  index.do

 new Index()

  bbsform.do

 new BbsForm()

  bbsinsert.do

 new BbsInsert()

 

interface CommandAction{}

 

class Index implements CommandAction{}

class BbsForm implements CommandAction{}

class BbsList implements CommandAction{}

 

CommandAciton com=new Index()

CommandAciton com=new BbsForm()

CommandAciton com=new BbsList()

 

자식(Index/BbsForm/BbsList)이 부모(commandAction)집에 들어갈 수 있다 그 떄 부모는 자식의 모습으로 바꿈 → 다형성

 

package net.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.activation.CommandMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.action.CommandAction;

public class MyController extends HttpServlet {
	private Map commandMap = new HashMap();  //명령어와 명령어 처리 클래스를 쌍으로 저장, HashMap : key와 value 형태로 데이터 관리를 할 수 있게 함
	
	//명령어와 처리클래스가 매핑되어 있는 properties 파일을 읽어서 Map 객체인 commandMap에 저장
	//명령어와 처리클래스가 매핑되어 있는 properties 파일은 command.properties파일
	
	public void init(ServletConfig config) throws ServletException{
	//web.xml에서 propertyConfig에 해당하는 init-param의 값을 읽어옴
	  String props=config.getInitParameter("propertyConfig");
	  Properties pr=new Properties();  //명령어와 처리클래스의 매핑정보를 저장할 Properties 객체 생성
	  FileInputStream f=null;
	  try{
	  	f = new FileInputStream(props);  //command.properties 파일 가져오기
		pr.load(f); 		//command.properties 파일을 Properties 객체에 저장하기
	  }catch(IOException e){
		System.out.println(e);
	  }finally{
		if (f !=null) try { f.close(); } catch (Exception ex) {}
	  }//try end
		
	  Iterator keyIter = pr.keySet().iterator();  //Iterator 객체는 Enumeration객체를 확장시킨 개념의 객체
	  while(keyIter.hasNext()){		//객체를 하나씩 꺼내서 그 객체명으로 Properties 객체에 저장된 객체에 접근
		String key = (String)keyIter.next();
		String value= pr.getProperty(key);
		/*System.out.println(key);
		System.out.println(value);*/
		try{
			Class commandClass = Class.forName(value);					//해당 문자열을 클래스로 만든다
			Object commandInstance = commandClass.newInstance();	//해당 클래스의 객체를 생성
			commandMap.put(key, commandInstance); 	//Map객체인 commandMap에 객체 저장
		}catch(Exception e){ System.out.println(e); }
	  }//while end
	}//init() end

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
	}
	
	//process는 doPost를 복사해서 만듦
	protected void process(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String view=null;
		CommandAction com=null;
		try{
			String command= req.getRequestURI();  	//  /myweb/index.do
			com = (CommandAction)commandMap.get(command);  	//다형성
			view = com.requestPro(req, resp);
		}catch(Throwable e){
			throw new ServletException();
		}
		RequestDispatcher dispatcher=req.getRequestDispatcher(view);
		dispatcher.forward(req, resp);
	}//process() end
	
	
}//class end

 

4. 슈퍼 인터페이스


 - 명령어 메뉴 나열

 - 매니저 클래스 역할

 - 서블릿으로부터 명령어의 처리를 지시받아 해당 명령에 대한 작업을 처리하고 작업결과를 서블릿으로 리턴한다.

 - 실제로 작업을 처리하는 것은 구현 클래스가 수행

 

 4-1) net.action.CommandAction.java

package net.action;

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

//요청 파라미터로 명령어를 전달하는 ㅏㅇ식의 슈퍼 인터페이스
public interface CommandAction {
	//추상 메소드
	public String requestPro(HttpServletRequest req, HttpServletResponse resp) throws Throwable;
	
}//interface()end

 

5. 명령어 처리 클래스


 5-1) 첫페이지 index.jsp 호출

package net.action;

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

/* 첫 페이지 index.jsp 호출
   결과 확인 : http://localhost:8090/myweb/index.do
  
*/

public class Index implements CommandAction{
	@Override
	public String requestPro(HttpServletRequest req, HttpServletResponse resp)
			throws Throwable {
		
		return "index.jsp";
		
	}
}//class end

 

* 첫 페이지 호출 

http://localhost:8090/myweb/index.do

성공적으로 index화면을 불러옴

 

 

Comments