모든핸들러의 서비스를 가져오는 부분에 인스턴스할당을 지워줌
그럼 모든 핸들러의 isRedirect,도 지우기
셋메서드 없는 섭메뉴핸들러같은건 셋메서드를들어주기
이제 서블릿의 마지막 부분을 구현하면됨
보드쪽 핸들러는 다 레스트방식으로 만들어서
리다이렉트냐 포워드냐가 중요한게 아니므로 영향이없는데
멤버단이 문제임
멤버단의 핸들러에서
각각의 페이지 유알엘이 포워딩인지 리다이렉인지 확인해서
리다이렉트면 redirect:을 붙여주기
우리가 작성했던 뷰리졸버를보면
리다이렉트시 컨텍스트패스를 붙여주고잇다
즉 리다이렉트시 컨텍스트패스를 붙여주면 안된다
지금 보드쪽은 애시당초 화면전환을 html로 화면이 구성되고 그것을 후처리로 레스트방식으로 만들고잇어서 영향이없음
멤버단이 문제임 로그인단..
패키지 정리... 그럼 핸들러프로퍼티도 바껴야함
이전상태와 동일하게핸들러는 준비될거임
이제 맴버단의 핸들러에대해서 리다이렉트가 필요하면 리다이렉트콜론을 주자
구분할수있는건
포워딩하는애들은 webinf-views가 붙어있는애들임
없는애들은 리다이렉트인거임
리스펀스아웃은 건들면안됨
보드만 뺴고 다 건들기
뷰리졸버를 염두하고 화면을 만드는거니까
web.inf 뺸다. 이게 뷰리졸버의 프리픽스에 들어가잇으므로
로긴핸들러는
서머노트도 건들지 x
이제 멤버
우리는 뷰리졸버쓸애들만 건드는거임
url 이 널이면 건들지말아야함
핸들러를 실행햇는데 화면이 없다? 지가 리스펀스쳣단얘기임
그럼 리졸버에서 유알엘을 만들필요가없단얘기임
유알엘이 널이 아닐떄만 뷰리졸버에게 건낸다.
다른 리졸버를 거치는것도 그 리졸버의 권한이니까 건들면 안됨
STring url = nulll 은 리다이렉도 포워딩도 안하겠따는 말이니까 건들지마삼
서블릿에서 핸들러를 사용할수잇도록 만들어야함
커맨드패턴에서 중요한건 겟과포스트구분안한다는거
그걸 처리할수잇는 doget 하나의 메서드만 처리함
핸들러를 호출하고 리졸버를..당기는??
// 사용자가 요청한 uri가 뭔지를 확인해서 핸들러맵퍼를 꺼낼수있는 키값을 만드는게 목표임
//사용자 uri 검출
String command = request.getRequestURI();//contextPath포함
if(command.indexOf(request.getContextPath())==0) {//contextPath삭제
command = command.substring(request.getContextPath().length());
}
URI를 끄집어냈음
이게 이걸 가지고
command를 꺼내야함
핸들러를 줘야하는데 없으면 잘못된 요청임
package com.jquery.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jquery.handler.CommandHandler;
//url에 따라 핸들러맵퍼를 가져올수있어야하는게 가장중요
public class FrontServlet extends HttpServlet {
// private HandlerMapper handlerMapper = new HandlerMapper();
private HandlerMapper handlerMapper;
//어떤이유로???
//initmethod를 오버라이딩할거임
@Override
public void init(ServletConfig config) throws ServletException {
//이건 서블릿 로딩할때 실행됨
//서블릿은 사용자의 요청이잇을떄 실ㅇ행되는데 그때하면 늦으니까
//사용자의 요청이없어도 한번 서블릿을 로딩할수있도록 web.xml에 설정하러..
String handlerMapperType = config.getInitParameter("handlerMapper");
try {
//그 이름을 클래스 로딩해서 인스턴스 부여하는 메서드 : injectionBean
this.handlerMapper = (HandlerMapper) injectionBean(handlerMapperType);
System.out.println("[FrontServlet] handlerMapper 가 준비되었습니다.");
}catch (Exception e) {
//핸들러가 뻑나면 이메세지가 뜰거임
e.printStackTrace();
System.out.println("[FrontServlet] handlerMapper 가 준비되지않았습니다.");
}
}
private Object injectionBean(String classType) throws Exception{
Class<?> cls = Class.forName(classType);
return cls.newInstance();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
requestPro(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
requestPro(request, response);
}
private void requestPro(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
//get과 post 둘다 이 메서드를 호출하니까 겟포스트 구분않고 유알엘을 이용해서만 구분하는것임
//doget과 dopost는 자기가받은 리퀘스트와 리스펀스를 넘겨주기만 하는거임
// 사용자가 요청한 uri가 뭔지를 확인해서 핸들러맵퍼를 꺼낼수있는 키값을 만드는게 목표임
//사용자 uri 검출
String command = request.getRequestURI();//contextPath포함
if(command.indexOf(request.getContextPath())==0) {
command = command.substring(request.getContextPath().length());//contextPath삭제
}
//commandHandler를 실행해야함 (이떄 HandlerMapper에 의뢰해서 핸들러를 할당받아야함)
CommandHandler handler = null;//아직은 없으니까 널임
String view = null;//핸들러를 통해 나오는 뷰를 선언해놓자
//핸들러 매퍼는 이미 맨위에 준비해놧음
//근데 혹시나 준비가 안되어있으면
response.setContentType("text/html;charset=utf-8");
PrintWriter out= response.getWriter();
if(handlerMapper != null) {
//매퍼만 잇으면 되는게 아니고 핸들러도 잇어야하므로 여기서 검사해야함
handler = handlerMapper.getHandler(command);//url 자체가 코맨드임
if(handler!=null) {//올바른 요청. 존재하는 서비스
//이떄 뷰리졸버가 등장해야함
try {
view = handler.process(request, response);//얘가 실행하고나서 view를 줌
//이제 뷰가 제대로 온거임 이제 뷰가 널인지 아닌지 봐야함
//뷰가 널이면 그냥 리턴임
//뷰가 널이 아닐떄만리졸버 호출할거임
if(view != null) ViewResolver.view(request, response, view);
} catch (Exception e) {
e.printStackTrace();
out.println("<script>");
out.println("alert('서비스 장애가 발생했습니다. \n잠시 후에 이용바랍니다.');");
out.println("history.go(-1);");
out.println("</script>");
}
//서블렛에서 throw할수잇는건 io와 서블릿익셉션밖에없음
//근데 핸들러는 익셉션해버렷기떄문에 위의 두 익셉션보다 더 많은것들이 올수잇으므로 catch해야함
}else{//잘못된 요청...사실 이게 404인거임 서블렛이엇으면 404엿을거임 없는 서블렛url이들어온거나마찬가지
System.out.println("!! not found : " + command);
out.println("<script>");
out.println("alert('잘못된 요청입니다. 똑바로 하세요');");
out.println("history.go(-1);");
out.println("</script>");
}
}else {
//사용자에게 핸들러가없어서 못한다구 시스템ㅇ장애어쩌구라고 알려줘야함
out.println("<script>");
out.println("alert('서비스 장애가 발생했습니다. \n잠시 후에 이용바랍니다.');");
out.println("history.go(-1);");
out.println("</script>");
}
}
}
실행해보자
오류:
우리가 지금 contextpath 가없어서 /도 안붙여줌
그래서
contextpath가 없을떄는 앞에 /라도 붙을수있게끔 바꾼거임
이제부터 조심할것
mapper에 없는건 이제 하나도 안나옴: 이제 .html안나옴
package com.jquery.handler.member;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jquery.handler.CommandHandler;
public class MemberMainHandler implements CommandHandler {
@Override
public String process(HttpServletRequest request, HttpServletResponse response) throws Exception {
String url = "member/main";//pageResolver를 생각해서 만들어야함
return url;
}
}
회원이미지가 안나올거임 왜?
서블렛의 겟라이터랑 파일다운로드의 겟아웃품스트림이랑 간섭이 생긴거임
그래서 어느 하나를 죽여야함
그래서
board 를 jsp로 바꾼다.
'
board.html
html후처리했던거를
jsp forwarding 방식으로