Servlet쇼핑몰1: 기본설정 및 가상주소생성

Servlet쇼핑몰1: 기본설정 및 가상주소생성

index.jsp

  • 서블릿을 사용할때 주소가 .jsp로 끝나는 경우 다 잘못된 코드이다.
  • 그건 모델2의 방식이 아니다.
  • 모델2를 출력하는 방식은
    1. 직접url타이핑
    2. index.jsp를 시작페이지로 지정 -> 여기서 실행
1
2
3
4
<%
//프로젝트의 시작페이지
response.sendRedirect("./MemberJoin.me");
%>




MemberFrontController.java 생성

  • 가장 기본적인 코드.

순서

  1. class를 서블릿으로 변경해줘야함 => extends HttpServlet 상속받기
  2. get/post 방식에 대한 처리 가능하도록 준비 => 오버라이딩 doGet(), doPost()
  3. doProcess()생성 : get방식이든 post방식이든 doProcess()에서 한번에 처리가능할 수 있게끔 만드는 메서드
  4. 가상주소가져오기
    • URI와 URL차이
    • 어차피 똑같은 프로토콜 부분을 항상 들고다닐 필요가 없으므로 URI사용함.
    • 변수 command: 가상경로라고 칭함.

https://velog.io/@jch9537/URI-URL

https://velog.io/@jch9537/URI-URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//1. 상속
public class MemberFrontController extends HttpServlet {

//3. doProcess()생성
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doProcess메서드 호출");

//4. 가상주소 가져오기 : 가지고 다닐 주소는 /*.me 앞부분의 주소는 필요가 없다.
String requestURI = req.getRequestURI();
StringBuffer requestURL = req.getRequestURL();
//uri와 url차이 -> uri에서 내 프로젝트명을 뺀 /*.me만 들고다니면됨
System.out.println("리퀘스트uri: "+requestURI); ///Model2JSP7/*.me
System.out.println("리퀘스트url: "+requestURL); //http://localhost:8088/Model2JSP7/*.me
//contextPath는 프로젝트명을 호출함
String contextPath = req.getContextPath();
System.out.println("contextPath: "+contextPath); ///Model2JSP7
//가상주소: 필요한 주소인 /*.me만 가져다니기 위해 substring()사용
String command = requestURI.substring(contextPath.length());
System.out.println("잘 짤렸는지 가상주소 command: "+command);

}

//2.오버라이딩: doGet(), doPost()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet메서드 호출");
doProcess(req, resp); //get방식이든 post방식이든 doProcess()에서 한번에 처리가능

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost메서드 호출");
doProcess(req, resp); //get방식이든 post방식이든 doProcess()에서 한번에 처리가능
}

}




web.xml 코드 추가

  • me는 member의 앞 두글자를 따옴.
  • *.me : 주소 중 me로 끝나는 모든 페이지는 servlet-name이 MemberFrontController인 .java페이지에서 처리하겠다는 의미.
1
2
3
4
5
6
7
8
9
<!-- model2 구조  -->

<servlet-name>MemberFrontController</servlet-name>
<servlet-class>com.itwillbs.member.action.MemberFrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MemberFrontController</servlet-name>
<url-pattern>*.me</url-pattern>
</servlet-mapping>




ActionForward.java 생성

  • 이동정보를 저장하는 객체
  • 이동할 페이지, 이동할 방식을 이동정보에 저장함.
  • 이동방식은 어떻게 선택할까?
    • true면 sendRedirect방식으로 이동
      • 언제 사용?: 주소와 화면의 전환이 동시에 일어날때 (가상주소 -> 가상주소로 )
    • false면 forward방식으로 이동
      • 언제 사용?: 주소는 그대로인데 화면이 바뀔때 (가상주소에서 jsp보여줌)
    • 절대적인 방식은 아니지만 보통 실무에서 위처럼 많이 사용한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ActionForward {

//1.외부접근 못하도록 이동할 페이지와 이동할 방식 멤버변수 생성
private String path;
private boolean isRedirect;
// true면 sendRedirect방식으로 이동
// false면 forward방식으로 이동

//2. getter setter생성
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}

//3.toString
@Override
public String toString() {
return "ActionForward [path=" + path + ", isRedirect=" + isRedirect + "]";
}
}




MemberFrontController.java 추가 코드작성

  • 모델2에서 페이지 이동은 무조건 ActionForward사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//3. doProcess()생성
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doProcess메서드 호출");

//4. 가상주소 가져오기 : 가지고 다닐 주소는 /*.me 앞부분의 주소는 필요가 없다.
String requestURI = req.getRequestURI();
StringBuffer requestURL = req.getRequestURL();
//uri와 url차이 -> uri에서 내 프로젝트명을 뺀 /*.me만 들고다니면됨
System.out.println("리퀘스트uri: "+requestURI); ///Model2JSP7/*.me
System.out.println("리퀘스트url: "+requestURL); //http://localhost:8088/Model2JSP7/*.me
//contextPath는 프로젝트명을 호출함
String contextPath = req.getContextPath();
System.out.println("contextPath: "+contextPath); ///Model2JSP7
//가상주소 command : 필요한 주소인 /*.me만 가져다니기 위해 substring()사용
String command = requestURI.substring(contextPath.length());
System.out.println("잘 짤렸는지 가상주소 command: "+command);

//5. 툭정 주소에 대한 처리
if(command.equals("/MemberJoin.me")){
System.out.println("/MemberJoin.me 호출");
}
}
//출력값
doGet메서드 호출
doProcess메서드 호출
리퀘스트uri: /Model2JSP7/*.me
리퀘스트url: http://localhost:8088/Model2JSP7/*.me
contextPath: /Model2JSP7
잘 짤렸는지 가상주소 command: /*.me