- 2019/10/02 Servlet을 이용한 index.do2019년 10월 02일
- 조별하
- 작성자
- 2019.10.02.:18
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 다음글이전글이전 글이 없습니다.댓글