하루의 일상💜

[JSP] web.xml -> FrontController로 이동하는 설정 본문

JSP

[JSP] web.xml -> FrontController로 이동하는 설정

도하루박 2022. 10. 27. 12:12
반응형

web.xml → frontController 로 이동하는 설정하기

 

src에서 패키지 만들고 패키지 명령법 com.example.app 최상위경로로 설정해준다.

여기서 똑같은 경로 중 회원에 관한건 회원, 보드(게시판)에 관한건 보드로 설정해야 하기 때문에 

기존 패키지를 눌러 .member 써주어서 패키지를 겹치게 한다.

 

그러고 자바 클래스 frontController를 만들어 준다. MemberFrontController

 

여기서 멤버프론트컨트롤러는 요청을 받아야 하기 때문에 서블릿이다.

그렇기 때문에 부모 클래스는 httpservlet을 지정해줘야 한다.

http서블릿에서는 doget, dopost를 재정의 할 수있다.

public class MemberFrontController extends HttpServlet{
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   }
   
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   }

위처럼 httpservlet을 상속하고 doget, dopost를 만들어준다.

 

jsp에서는 두겟, 두포스트 구분을 하지 않기 때문에 두 메서드를 동일한 이름으로 담아 사용할 수 있다. 

뭘로 요청했던 간에 로직은 똑같을 것이기 때문이다.

public class MemberFrontController extends HttpServlet{
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doProcess(req, resp);
   }
   
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doProcess(req, resp);
   }
   
   protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
   }

메서드를 아래에 똑같이 붙여넣기 한다음 실행시킬 메서드의 이름을 변경해준다. 새로 생성한 메서드에 두겟, 두 포스트를 담아 사용할 수 있게 한다.

 

frontController가 하는 역할

사용자가 url 로 요청을 할때 xml에서 일일이 다 확인할 수 없으니 그룹화를 시켜 프론트컨트롤러로 보낸다. 요청보낸 값을 프론트 컨트롤러에서 세분화시켜서 확인한다. 그렇기 때문에 우리가 마지막에 작성했던 메서드 안에는 사용자가 요청한 url 을 가져와야 한다. ★ 사용자가 요청한 객체 -> request 객체에 들어있다.

protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      String target = req.getRequestURI().substring(req.getContextPath().length());
      }

request 객체안에 URI를 가져오는 메서드를 사용하고 우리가 가져와야할 url 은 예를들어 

naver.com/news

naver.com/mail

naver.com/blog 

이렇게 앞에 있는 주소값은 계속 동일하게 반복하게 되는데 이것을 컨텍스트페스라고 한다. (루트경로)

그렇기 때문에 요청한 url에서 반복되는 컨텍스트 패스의 length만큼을 제외한 부분부터 가져오면 된다.

바로 이부분이 세분화하여 판단해야하는 부분이다! 

 

세분화하기

상위경로/경로

회원가입이 여러군데 있을 수 있기 때문에 상위경로를 설정해준다.

 if(target.equals("/member/join.me")) {
    	  //회원가입 페이지 이동
      }else if(target.equals("/member/joinOk.me")) {
    	  //회원가입 페이지 이동 완료
      }else if(target.equals("/member/checkId.me")) {
      }else if(target.equals("/member/login.me")) {
    	  //로그인 페이지 이동
      }else if(target.equals("/member/loginOk.me")) {
    	  //로그인 페이지 이동 완료
      }else if(target.equals("/member/logout.me")) {
      }

이제 web.xml에서 해당 경로로 끝나게 되면 위의 경로로 올 수 있게 설정해줘야 한다.

 

  <servlet>
     <servlet-name>Member</servlet-name>
     <servlet-class>com.example.app.member.MemberFrontController</servlet-class>
  </servlet>
  
  <servlet-mapping>
     <servlet-name>Member</servlet-name>
     <url-pattern>*.me</url-pattern>
  </servlet-mapping>

자바의 폴더를 따라서 Webcontent안에 app이라는 이름을 따서 member폴더까지 만들어 준다.

주로 assets에서는 css, js 를 주로 관리하게 된다. member 안에 join.jsp는 해당 회원가입의 html이 저장되어 있다.

day05 / 01:47:00

 

join.jsp 경로 설정하기 -> 절대경로로 설정해줘야 한다. 

${pageContext.request.contextPath}

 

a href="javascript:void(0)"

페이지 이동이 안되게 막아준다.

 

모든 곳에서 접근할 수 있게끔 com.example.app에 객체를 만들어 준다.

package com.example.app;

public class Result {
	private String path;
	private boolean isRedirect;
}

어디로 이동할 것인지, path를 선언한다.

어떤 방식으로 할 건지 boolean 타입으로 만들어준다. 왜냐하면 forward 방식인지 redirect 방식인지 구분해야하기 때문에

 

 

* 컨트롤러를 만드는 이유: DAO를 사용하기 위해서
* DAO를 사용하는 이유 : DB를 조회하기 위해서
※ 때문에 DB조회를 하는 것들이 바로 컨드롤러를 만드는 이유이다.
if(target.equals("/member/join.me")) {
      }else if(target.equals("/member/joinOk.me")) {
      }else if(target.equals("/member/checkId.me")) {
      }else if(target.equals("/member/login.me")) {
      }else if(target.equals("/member/loginOk.me")) {
      }else if(target.equals("/member/logout.me")) {
      }

컨트롤러가 필요한 부분 -  joinOk, checkId, loginOk 이다. 컨트롤러가 필요없는 것은 그냥 그 안에서 해결해준다.

if(target.equals("/member/join.me")) {
         result = new Result();
         result.setPath("/app/member/join.jsp");
         
      }else if(target.equals("/member/joinOk.me")) {
      }else if(target.equals("/member/checkId.me")) {
      }else if(target.equals("/member/login.me")) {
      }else if(target.equals("/member/loginOk.me")) {
      }else if(target.equals("/member/logout.me")) {
      }
      
      if(result != null)
    	  if(result.isRedirect()) {
    		  resp.sendRedirect(result.getPath());
    		  
    	  }else {
    		  req.getRequestDispatcher(result.getPath()).forward(req,resp);
    	  }

 

반응형