새소식

JAVA 교육/Servlet

2019/10/02 Servlet을 이용한 index.do

  • -

Servlet 게시판 만들기

※ Servlet을 이용해서 만들어야 할 페이지 목록

첫 페이지    : index.do

답변형게시판: 쓰기, 목록 , 상세보기, 삭제, 수정

회원           :로그인, 로그아웃, 회원가입, 아이디 중복확인, 아이디/비번 찾기


Model : DAO
View: JSP, EL, JSTL
Controller: MyController, DispatcherServlet(Spring)
모든 페이지들을 web.xml에서 처리하기 힘들기 때문에 
MyController을 만들어서 반환해 줄 것이다

 


index.jsp로 첫 페이지를 부르는 것이 아니라 이제부터 index.do로 첫 화면을 부를 수 있게 하겠다.

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

WEB-INF/command.preperties ----------------------------------------------------------
명령어를 입력하면 그 명령어에 맞는 페이지로 이동할 수 있는 페이지를 작성
(※ command.preperties라는  class를 사용하여, key=value 형태로 데이터를 저장할 것이다.)

/myweb/index.do=net.action.Index

위의 경로로 command.properties file을 생 성해준 후 코드를 입력하였다.
이제부터는 사용자가 요청한 커맨드를 command.properties 에 작성하겠다


2. 한글 필터

1) package net.utility/EncodeFilter.java
(request 전에 response 후에 처리할 코드가 있다면 이곳에서 처리된다.)

package net.utility;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodeFilter implements Filter {//한글필터

	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		//사용자가 요청을 하면 doFilter를 거쳐서 나가고
		//사용자에게 response를 할때도 doFilter를 거쳐서 보내준다
		
		//request 보내기전에 전처리할 코드가 있으면 여기서 처리한다.
		//또한 response후의 후처리할 코드가 있다면 여기서 처리
		arg0.setCharacterEncoding("UTF-8");
		arg2.doFilter(arg0, arg1);
		
	}//doFilter end
    
	@Override
	public void init(FilterConfig arg0) throws ServletException {}

}//class end

13  line  EncodeFilter 클래스를 Filter(인터페이스)를 상속받는다.
14,30 line  Filter의 함수 init 와 destroy 를 override해준다.
18 line  함수 doFilter도 같이 오버라이드 해준 후 요청받은 arg0를 UTF-8로 인코딩

2) web.xml에 등록

모든 형태의 파일은  필터 EncodeFilter.java 거쳐서 갈 수있게 web.xml 에 등록 

 1. <filter> 태그를 이용해서 EncodeFilter로 연결될 encode 생성

 2. <filter-mapping>을 통해서 모든 url은  EncodeFilter를 거칠 수 있게 url-pattern을 지정

 3. 경로를 지정해 줄 때 '/*' 하게 되면 모든 url주소 또는 파일은 이 필터를 거쳐감

 

3. MyController 컨트롤러

1) MyController

package net.controller;

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

public class MyController extends HttpServlet{
	
	private Map commandMap = new HashMap(); //명령어와 명령어 처리 클래스를 쌍으로 저장

	//명령어와 처리클래스가 매핑되어 있는 propertise 파일을 읽어서 Map 객체인 commandMap에 저장
	//명령어와 처리클래스가 매핑되어 있는 propertise 파일은 command.properties파일
}



    url 주소에 '.do' 라는 명령어가 나오면  Mycontroller 로 보내진다.
6 line   MyController 은 HttpServlet 추상클래스를 상속받음

 

2) web.xml

※ 우선 MyController을 생성 후. do 명령어를 가진 url 이 MyController로 올 수 있게 서블릿 등록을 하자

27~35 line  servlet 으로 ControllerAction을 등록을 해 준 후, 그 경로가 net.controller.MyController 로 지정
31~34 line  윗 줄에서 등록한 서블릿으로 command.properties 를 가져갈수 있게 init-param으로 지정
37~40 line  url-pattern 을 '*.do'로 설정(.do를 가진 모든 url패턴)

 

3) MyController (init() 함수)

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.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyController extends HttpServlet{
	
	private Map commandMap = new HashMap(); //명령어와 명령어 처리 클래스를 쌍으로 저장

	//명령어와 처리클래스가 매핑되어 있는 propertise 파일을 읽어서 Map 객체인 commandMap에 저장
	//명령어와 처리클래스가 매핑되어 있는 propertise 파일은 command.properties파일
	@Override
	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 파일 가져오기 가져온 파일을 f변수에 넣어준후 
			pr.load(f);  //command.properties파일을 명령어와 처리 클래스의  Properties 객체에 저장하기
		}catch(IOException e){
			System.out.println(e);
			}finally{
				if(f!=null)try{f.close();}catch(Exception ex){}
		}
		
		Iterator keylter = pr.keySet().iterator();// Iterator객체는 Enumeration 개체를 확장시킨 개념의 객체
		while(keylter.hasNext()){// 객체를 하나씩 꺼내서 그 객체명으로 Properties 객체에 저장된 객체에 접근
			String key= (String)keylter.next();
			String value=pr.getProperty(key);
			//System.out.println(key);
			//System.out.println(value);
			//http://localhost:8090/myweb/index.do
			try{
				Class commandClass = Class.forName(value);					//해당 문자열을 클래스로 만든다.
				Object commandInstance = commandClass.newInstance();	//해당클래스의 객체를 생성
				commandMap.put(key, commandInstance);//Map객체인 commandMap 에 객체 저장
			}catch(Exception e){System.out.println(e);}
		}//while
	}//init() end
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		process(req, resp);
	}//doGet() end

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		process(req, resp);
	}//doPost() end
	
	
	//사용자의 요청을 분석해서 해당 작업을 처리
	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(e);
		}
		RequestDispatcher dispatcher=req.getRequestDispatcher(view);
		dispatcher.forward(req, resp);
	}//process() end
}
17 line  위에서 미리 생성한 MyController 클래스
24,54,61,69 line  컨트롤러에 필요한 init(),doGet,doPost()를 override 해준 후 process 함수를 만들어 주자
53~58,60~65 line

 doGet() 함수는 get방식으로 받은 매개 변수를, doPost() 함수는 post 방식으로 받은 매개 변수를 
 process(req, resp)를 이용해서 process에 보내준다
※ process에 보내주는 이유는 get방식이던, post 방식이던 들어오는 요청을 한 번에 처리하기 위해서

69~83 line  74 line 전해받은 url 주소를 command 에 할당
 75 line url 주소를 19 line 에 생성한 HashMap 개체에 다시 입력 후 슈퍼인터페이스 CommandAction 에
 넣어준다.
 81~82 line RequestDispatcher 를 이용해서 위에서 받은 주소값으로 이동!!!
24~51 line
 

26 line 보내주는 매개변수로 보내준 propertyConfig의 command.properties를 받아 props에 담아준다

27 line  명령어와 처리클래스의 매핑정보를 저장할 Properties 객채 생성
38 line Interator 개체로 pr 에 담은 command.properties 에서 객체에 접근
40~41 line 접근한 객체를 key값과 value 값을 나눠 주소값인 value를  HasMap 객체 저장

 

4) command.properties의 key = value 값 확인 (40~41 line 확인 )

 ▶ key value  값을 분리했으니 key값을 입력하면 value 가 실행할 수 있도록 구성을 만들어야 한다.

------------------------------------------------------------------------------------------------commandMap
key value
/myweb/index.do new index()
/myweb/bbsform.do new BbsForm()
/myweb/bbsinsert.do new BbsInsert()

 

 

4. 슈퍼 인터페이스 CommandAction.java

1) 소개

-명령어 메뉴 나열
-매니저 클래스 역할
-서블릿으로부터 명령어의 처리를 지시받아 해당 명령에 대한 작업을 처리하고
작업 결과를 서블릿으로 리턴한다
-실제로 작업을 처리하는 것은 구현 클래스가 수행

1) CommandAction

//-명령어 메뉴 나열
//-매니저 클래스 역할
//-서블릿으로 부터 명령어의 처리를 지시받아 해당 명령에 대한 작업을 처리하고
//-작업결과를 서블릿으로 리턴한다
//-실제로 작업을 처리하는 것은 구현클래스가 수행
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. index.class

interface CommandAction {}

class index implements CommandAction {}
class BbsForm implements CommandAction {}
class  BbsList implements CommandAction {}

Index(), BbsForm(),BbsForm(), BbsList() 등은  CommandAction 객체를 인터페이스 했기 때문에

CommandAction com=new Index()
CommandAction com=new BbsForm()
CommandAction com=new BbsList()

다형성으로 인해 CommandAction 객체로 Index(), BbsForm(),BbsForm(), BbsList()등의 객체를 생성할 수 있다.

▶ index.do를 입력하면 Index.java로 이동!!!!

package net.action;

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

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

 

▶ index.java에서 return값을 index.jsp로 이동한다

 

'JAVA 교육 > Servlet' 카테고리의 다른 글

2019/10/01 error 페이지  (0) 2019.10.01
2019/09/30 loginForm.jsp (mvc) test  (0) 2019.09.30
2019/09/30 모델2  (0) 2019.09.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.