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 방식으로 받은 매개 변수를 |
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 {} Index(), BbsForm(),BbsForm(), BbsList() 등은 CommandAction 객체를 인터페이스 했기 때문에 CommandAction com=new Index() 다형성으로 인해 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 |
소중한 공감 감사합니다