코딩기록 저장소 🐕/JSP

mvc pattern2

kimkongmom 2023. 9. 19. 09:01

 

 

 

연습예제

각 요청(getAge.do, getAbs.do, getInfo.do)에 대한 서비스 메서드가 구현되어 있으며, 

해당 서비스 메서드가 호출되어 비즈니스 로직을 수행합니다. 

결과는 ActionForward 객체를 통해 JSP 페이지로 이동하거나 출력됩니다.

 

 

 

▶ index.jsp

 

html 전달

 

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="<%=request.getContextPath()%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
 
  <div>
    <form method="get" action= "${contextPath}/getAge.do">
      <label for="year">태어난년도</label>
      <select name="year">
        <c:forEach var= "y" begin="1970" end="2023" step="1">
          <option>${y}</option>
        </c:forEach>
      </select>
      <button type="submit">몇 살인지 알려주세요</button>
    </form>
  </div>
  
  <hr>
  
  <div>
    <form method="get" action="${contextPath}/getAbs.do">
      <label for="n">숫자입력</label>
      <input type="text" name="n" id="n">
      <button type="submit">절대값요청하기</button>
    </form>
  </div>
  
  <hr>
  
  <div>
    <form method="post" action="${contextPath}/getInfo.do">
      <div>
        <label for="name">이름</label>
        <input type="text" name="name" id="name">
      </div>
      <div>
        <label for="age">나이</label>
        <input type="text" name="age" id="age">
      </div>
      <div>
        <label>성별</label>
        <input type="radio" name="gender" id="man" value="man"><label for="man">남자</label>
        <input type="radio" name="gender" id="woman" value="woman"><label for="woman">여자</label>
        <input type="radio" name="gender" id="none" value="none" checked><label for="none">선택안함</label>
      </div>
      <div>
        <label>취미</label>
        <input type="checkbox" name="hobbies" id="baskitball" value="야구"><label for="baskitball">야구</label>
        <input type="checkbox" name="hobbies" id="travel" value="여행"><label for="travel">여행</label>
        <input type="checkbox" name="hobbies" id="game" value="게임"><label for="game">게임</label>
      </div>
      <div>
        <button type="submit">정보전송하기</button>
      </div>
    </form>
  </div>
  
</body>
</html>
cs

 

 

age.jsp

age.jsp: 사용자의 나이를 출력하는 JSP 페이지입니다. 

${age}는 서블릿에서 HttpServletRequest를 통해 설정된 age 속성 값을 출력합니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <div>현재 나이는 ${age}살입니다.</div>
</body>
</html>
cs

 

 

info.jsp

info.jsp: 사용자의 정보를 출력하는 JSP 페이지입니다. 

${vo.name}, ${vo.age}, ${vo.gender}, ${vo.hobbies}는 UserVo 객체의 필드 값을 출력합니다.

 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
  <div>
    <ul>
      <li>${vo.name}</li>
      <li>${vo.age}</li>
      <li>${vo.gender}</li>
      <li>
        <c:forEach var="hobby" items="${vo.hobbies}">
          ${hobby}&nbsp;
        </c:forEach>
      </li>
    </ul>
  </div>
</body>
</html>
cs

 

 

▶ UserVo

사용자 정보를 저장하는 Java Bean 클래스입니다. 

name, age, gender, hobbies 필드를 가지고 있습니다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Vo;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@NoArgsConstructor
@AllArgsConstructor
@Data
public class UserVo {
  private String name;
  private int age;
  private String gender;
  private String[] hobbies;
}
 
cs

 

 

MvcService 인터페이스 

각각의 요청에 대한 서비스 메서드를 정의합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package service;
 
import java.io.IOException;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import common.ActionForward;
 
public interface MvcService {
 
  public ActionForward getAge(HttpServletRequest request);
  public void getAbs(HttpServletRequest request, HttpServletResponse response) throws IOException;
  public ActionForward getInfo(HttpServletRequest request);
}
 
 
cs

 

 

 

MvcServiceImpl 클래스 

MvcService 인터페이스를 구현하는 클래스로, 각각의 메서드에서 비즈니스 로직을 처리합니다.

 

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package service;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDate;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import Vo.UserVo;
import common.ActionForward;
 
public class MvcServiceImpl implements MvcService {
 
  @Override
  public ActionForward getAge(HttpServletRequest request) {
    
    String year = request.getParameter("year");
    int iYear = Integer.parseInt(year);
    int nowYear = LocalDate.now().getYear();
    
    request.setAttribute("age", nowYear - iYear);
    
    return new ActionForward("views/age.jsp"false);
    
  }
  
  @Override
  public void getAbs(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    int n = Integer.parseInt(request.getParameter("n"));
    
    PrintWriter out = response.getWriter();
    out.println("<script>");
    out.println("alert('" + (n >= 0 ? n : -n) + "')");
    out.println("location.href='" + request.getContextPath() + "'");
    out.println("</script>");
    out.flush();
    out.close();
    
  }  
  @Override
  public ActionForward getInfo(HttpServletRequest request) {
    String name = request.getParameter("name");
    int age = Integer.parseInt(request.getParameter("age"));
    String gender = request.getParameter("gender");
    String[] hobbies = request.getParameterValues("hobbies");
    
    UserVo vo = new UserVo();
    vo.setName(name);
    vo.setAge(age);
    vo.setGender(gender);
    vo.setHobbies(hobbies);
    
    request.setAttribute("vo", vo);
    
    return new ActionForward("views/info.jsp"false);
  }
}
cs

 

 

 

서블릿 (MvcController) :
doGet 메서드: 웹 요청을 처리하는 서블릿입니다.
요청의 URI를 분석하여 적절한 서비스 메서드를 호출하고, 그 결과에 따라 다른 페이지로 이동하거나 결과를 출력합니다.

 

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package ctrl;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import common.ActionForward;
import service.MvcService;
import service.MvcServiceImpl;
 
/**
 * Servlet implementation class MvcController
 */
@WebServlet("*.do")
public class MvcController extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MvcController() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
      // 요청 인코딩 + 응답 타입과 인코딩
      request.setCharacterEncoding("UTF-8");
      response.setContentType("text/html; charset=UTF-8");
      
      // 요청 확인
      String requestURI = request.getRequestURI();
      String contextPath = request.getContextPath();
      String urlMapping = requestURI.substring(contextPath.length());
      
      // 서비스 객체 생성
      MvcService mvcService = new MvcServiceImpl();
      
      // ActionForward 객체 생성 (서비스의 실행 결과를 저장할 객체)
      ActionForward af = null;
      
      // 요청에 따른 서비스 선택과 실행
      switch(urlMapping) {
      case "/getAge.do" :
        af = mvcService.getAge(request);
        break;
      case "/getAbs.do" :
        mvcService.getAbs(request, response);
        break;
      case "/getInfo.do":
        af = mvcService.getInfo(request);
        break;
      }
      
      // 이동
      if(af != null) {
        if(af.isRedirect()) {
          response.sendRedirect(af.getPath());
        } else {
          request.getRequestDispatcher(af.getPath()).forward(request, response);
        }
      }
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
 
}
 
cs

 

 

ActionForward :

서비스 메서드가 반환하는 결과를 저장하는 클래스입니다. 

path는 이동할 JSP 페이지의 경로를, redirect는 리다이렉트 여부를 나타냅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package common;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ActionForward {
 private String path;
 private boolean redirect;
}
 
cs

 

 

실행결과

 

 

 

 

 

'코딩기록 저장소 🐕 > JSP' 카테고리의 다른 글

게시물 CRUD,DBCP  (0) 2023.09.20
DBCP  (0) 2023.09.19
mvc pattern  (0) 2023.09.18
jsp session 로그인 장바구니 cookie  (0) 2023.09.18
JSP jstl  (0) 2023.09.15