포스트

03. JSP

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
✔️ Dispatcher : 필요한 정보를 제공하는 자 == 발송자

✔️ 위임 : 넘겨주다

✔️ forward : 보내다, 전달하다, 전송하다
- forward는 페이지 이동이 아닌 Servlet의 역할 중 응답화면 출력 역할을 분업한 JSP에게 req, resp를 전달만 하는 것 
  ➡️ JSP 응답을 대신 할 뿐이다
  결론 : 페이지 이동 X ➡️ 주소창의 요청 주소도 변하지 않는다

💡 응답 화면을 만드는 Servlet의 일을 좀 더 효율적으로 처리할 수 있는 JSP에게 넘겨줄 예정

✔️ RequestDispatcher
- Servlet → JSP로 HttpServletRequest 객체, HttpServletResponse 객체를 발송(위임)하는 역할의 객체
  ➡️ 정확히는 요청에 대한 응답화면을 만들어 클라이언트에게 출력하는 역할을 위임하는 객체

✔️ req.getRequestDispatcher("JSP 경로")
- HttpServletRequest 객체가 생성될 때 내부에 자동으로 요청을 위임하는 객체(RequestDispatcher)를 생성하는 방법을 포함하고 있음

💡 JSP 경로 작성 규칙
- webapp 폴더 기준으로 JSP파일까지의 모든 경로 작성

✔️ req.setAttribute(String key, Object value)
- JSP에게 전달될 예정인 req 객체에 result 변수 값 담아서 같이 전달
- value는 모든 객체(타임 상관 없음)
- Attribute : 속성 == 데이터(값)

로그인 만들기

  • 1) index.html

    1
    2
    3
    4
    5
    6
    
    <form action="/JSPProject1/login" method="post">
      ID : <input type="text" name="inputId"> <br>
      PW : <input type="password" name="inputPw"> <br>
        
      <button>로그인</button>
    </form>
    
  • 2) Servlet

    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
    
    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
        // post 방식 요청 데이터 문자 인코딩 처리
        req.setCharaterEncoding("UTF-8");
          
        // 전달받은 파라미터(input 태그의 값)을 얻어와 변수에 저장
        // 파라미터는 모두 String 타입
        String id = req.getParameter("inputId");
        String pw = req.getParameter("inputPw");
          
        // 파라미터 잘 얻어왔는지 확인
        System.out.println(id);
        System.out.println(pw);
          
        String result = null;
          
        if(id.equals("user01") && pw.equals("pass01!")) {
          result = "로그인 성공";
        } else {
          result = "아이디 또는 비밀번호 불일치";
        }
          
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/loginResult.jsp");
          
        req.setAttribute("r", result);
                  // Object로 업캐스팅 되어있는 상태
    
        dispatcher.forward(req, resp);
      }
    }
    
  • 3) JSP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    <!-- HTML 주석 : HTML 태그, CSS 등 HTML 요소만 주석 처리 가능 -->
      
    <%-- JSP 주석 : HTML 요소 + JSP 전용 태그
          <% %>, <%= %>, <%@ %>, ${EL}, <c:if>JSTL</c:if> --%>
      
    <%--
    <%@ %> : 지시자(알려주거나 지시하는 속성을 기입)
    charset=UTF-8 : 현재 문서를 해석할 때 UTF-8 인코딩을 이용해서 해석 (해석 방법 안내)
    pageEncoding="UTF-8" : 현재 문서가 UTF-8 인코딩으로 작성되어 있음
                  (문서가 작성된 형식 안내)
      
    <% %> : 스크립틀릿(Scriptlet). JSP에서 자바 코드를 작성할 수 있는 영역
      ➡️ JSTL 라이브러리를 이용해서 태그 형식 변경
      
    <%= %> : 표현식(Expression). 자바코드의 값을 HTML 형식으로 출력
            (자바의 값을 화면에 보이게 함)
      
    EL(Exprression Language, 표현 언어)로 변경
    --%>
    
    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
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
    <!-- 상단에 꼭 작성 -->
      
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>로그인 결과 페이지</title>
      </head>
      
      <body>
        <h1>로그인 결과</h1>
          
        <!-- jsp에서 자바코드의 값을 출력 -->
        <%= request.getParameter("inputId") %>
          
        <br>
          
        <%= request.getParameter("inputPw") %>
          
        <%= 2 * 5 + 10 %>
        <%
          // 자바 주석 가능
          // 여기는 JSP - Servlet으로 부터 전송 받은 req, resp가 있음
          // - req, resp를 사용할 수 있다
          // - 대신 이름이 request, response로 바뀜
            
          // request.getAttribute("key") - value(Object 타입)
            
          String res = (String)request.getAttribute("r");
                        // 다운캐스팅 필요
        %>
      
        <!-- res 변수에 저장된 값이 출력됨 -->
        <h3 style='color:green'><%= res %></h3>
      
        <button type='button' onclick='history.back()'>돌아가기</button>
      </body>
    </html>
    

피자 주문 만들기

  • 1) index.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
    
    <form action="/JSPProject1/pizzaOrder" method="post">
      <select name="pizza">
        <option>콤비네이션 피자</option>
        <option>불고기 피자</option>
        <option>고구마 피자</option>
        <option>하와이안 피자</option>
        <option>통새우 피자</option>
      </select>
        
      <br><br>
      
      사이즈
      <br>
      <label>
        R <input type="radio" name="size" value="R">
      </label>
      <br>
      <label>
        L(+2,000) <input type="radio" name="size" value="L">
      </label>
        
      <br><br>
      
      수량 : <input type="number" name="amount" min="1" max="10" value="1">
      
      <br><br>
      
      <button>주문하기</button>
    </form>
    

  • 2) Servlet

    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
    
    @WebServlet("/pizzaOrder")
    public class PizzaOrderServlet extends HttpServlet {
      
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
        req.setCharacterEncoding("UTF-8");
      
        String size = req.getParameter("size"); // R / L
      
        int amount = Integer.parseInt(req.getParameter("amount"));
        // Integer.parseInt(문자열) : 숫자 형태 String -> int 변환
      
        // (기본(10000) + 사이즈(0 or 2000)) * 수량(1~10)
        int temp = 0;
      
        if(size.equals("L")) temp = 2000;
      
        // 최종 금액
        int total = (10000 + temp) * amount;
      
        // JSP 요청 위임 객체 생성(JSP 경로 지정)
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/orderResult.jsp");
      
        // req에 total 값 세팅
        req.setAttribute("tot",total);
      
        dispatcher.forward(req, resp);
      }
    }
    
  • 3) 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    <%@ page language = "java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
      
    <%
      int total = (int)request.getAttribute("tot");
      String pizza = request.getParameter("pizza");
      String size = request.getParameter("size");
      String amount = request.getParameter("amount");
    %>
      
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>주문 결과</title>
      
        <style>
          #container{
            width : 400px;
            border : 1px solid black;
            margin : auto;
          }
        </style>
      </head>
      
      <body>
        <div id='container'>
          주문한 피자 : <%= pizza %> <br>
      
          <% if(size.equals("L")){ %>
              Large
          <%} else { %>
            Regualr
          <% } %>
      
          <br>
      
          수량 : <%= amount %><h4>총 합계 : <%= total %></h4>
        </div>
      </body>
    </html>
    

회원 가입 페이지

  • 1) index.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
    
    <h1>회원 가입(JSP 버전)</h1>
    <form action="/JSPProject1/signIn" method="post">
      <table>
        <tr>
          <th>아이디</th>
          <td>
            <input type="text" name="inputId">
          </td>
        </tr>
      
        <tr>
          <th>비밀번호</th>
          <td>
            <input type="password" name="inputPw">
          </td>
        </tr>
      
        <tr>
          <th>비밀번호 확인</th>
          <td>
            <input type="password" name="inputPw">
          </td>
        </tr>
      
        <tr>
          <th>이름</th>
          <td>
            <input type="text" name="inputName">
          </td>
        </tr>
      
        <tr>
          <th>이메일</th>
          <td>
            <input type="email" name="inputEmail">
          </td>
        </tr>
          
        <tr>
          <th rowspan="2">취미</th>
          <td>
            공부 <input type="checkbox" name="hobby" value="공부">
            게임 <input type="checkbox" name="hobby" value="게임">
            헬스 <input type="checkbox" name="hobby" value="헬스">
          </td>
        </tr>
      
        <tr>
          <td>
            독서 <input type="checkbox" name="hobby" value="독서">
            영화 <input type="checkbox" name="hobby" value="영화">
            코딩 <input type="checkbox" name="hobby" value="코딩">
          </td>
        </tr>
          
        <tr>
          <td colspan="2" style="text-align: center;">
            <button>회원 가입</button>
          </td>
        </tr>
      </table>
    </form>
    

  • 2) Servlet

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    @WebServlet("/signIn")
    public class SignIn extends HttpServlet {
      
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
        req.setCharacterEncoding("UTF-8");
      
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/signIn.jsp");
      
        dispatcher.forward(req, resp);
      }
    }
    
  • 3) 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
      
    <%
        String id = request.getParameter("inputId");
        String pw[] = request.getParameterValues("inputPw");
        String name = request.getParameter("inputName");
        String email = request.getParameter("inputEmail");
        String hobby[] = request.getParameterValues("hobby");
    %>
      
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>회원가입 결과</title>
      </head>
      
      <body>
        <%
          String hobbyResult = "";
          for(String temp : hobby){
          hobbyResult += temp + " ";
          }
        %>
        <% if(!pw[0].equals(pw[1])){ %>
          <h3>비밀번호가 일치하지 않습니다</h3>
        <% } else{ %>
          <ul>
            <li>아이디 : <%= id %></li>
            <li>비밀전호 : <%= pw[0] %></li>
            <li>이름 : <%= name %></li>
            <li>이메일 : <%= email %></li>
            <li>취미 : <%= hobbyResult %></li>
          </ul>
          <h3><%= name %>님의 회원 가입이 완료되었습니다.</h3>
        <% } %>
      </body>
    </html>