home
자바
home
🎳

02. JSP

JSP (Java Server Page)

JSP란, HTML형식 내에서 자바코드를 쓸 수 있는 "자바언어"로 서블릿(자바코드내)에서 응답화면(HTML)을 구현했던 복잡함을 보다 간단하게 해결 가능 → 즉, JSP의 가장 큰 장점은 Servlet에서는 비즈니스 로직처리(요청처리)에만 집중하고 프레젠테이션 로직(응답화면을 만들어내는)은 JSP에서 집중하게끔 분리할 수 있는 것

JSP Element 표현법

1. JSP 스크립팅 원소 (Scripting Element)

JSP 페이지에서 자바 코드를 기술할 수 있게 해주는 기능
선언문 : <%! 자바코드 %>멤버변수와 메소드를 선언하기 위해 사용
스크립틀릿 : <% 자바코드 %>JSP에서 자바코드를 기술하기 위한 제일 기본적인 표현법
표현식(출력식) : <%= 자바코드 %>자바에서 작성한값(또는 메소드 호출)을 출력하기 위해 사용

2. 지시어 (Directive) <%@ page|include|taglib 속성="속성값" ... %>

JSP page 전체에 영향을 미치는 정보를 기술 할 때 쓰임
1.
page 지시어 : 현재의 jsp 페이지를 처리하는데 필요한 각종 속성을 기술하는 부분
language : 사용할 스크립트 언어 유형을 지정
contentType : 웹 브라운저가 받아 볼 해당 페이지의 형식, 인코딩 방식 지정
pageEncoding : jsp파일에 기록된 자바코드의 인코딩 방식 지정
import : 자바의 import와 같은 의미
errorPage : 해당 jsp상에 오류가 발생했을 경우 보여줄 에러페이지의 경로 지정
2.
include 지시어 : jsp파일에 또다른 jsp를 포함시키고자 할 때 사용하는 지시어
3.
taglib 지시어 : JSP 기능을 좀 더 확장할 수 있는 인자로 추가적인 라이브러리를 등록하는 구문
피자주문페이지 주문요청 --> 주문요청을 받아서 처리해주는 Servlet --> 피자결제페이지(응답jsp)
1.
주문요청 페이지.jsp (VS로 작업함)
<%@ 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> <h1>피자 주문 페이지</h1> <h2>오늘의 날짜</h2> <%@ include file="datePrint.jsp" %> <br> <form action="/2_JSP/confirmPizza.do" method="get"> <fieldset> <legend>주문자정보</legend> <table> <tr> <th>이름</th> <td><input type="text" name="userName" required></td> </tr> <tr> <th>전화번호</th> <td><input type="text" name="phone" required></td> </tr> <tr> <th>주소</th> <td><input type="text" name="address" required></td> </tr> <tr> <th>배달요청사항</th> <td><textarea name="message"></textarea></td> </tr> </table> </fieldset> <fieldset> <legend>주문정보</legend> <table> <tr> <th>피자</th> <td> <select name="pizza"> <option>콤비네이션</option> <option>불고기피자</option> <option>하와이안피자</option> <option>고구마피자</option> <option>포테이토피자</option> </select> </td> </tr> <tr> <th>토핑</th> <td> <input type="checkbox" name="topping" value="치즈토핑"> 치즈토핑 <input type="checkbox" name="topping" value="고구마무스"> 고구마무스 <input type="checkbox" name="topping" value="콘크림무스"> 콘크림무스 <br> <input type="checkbox" name="topping" value="파인애플토핑"> 파인애플토핑 <input type="checkbox" name="topping" value="치즈바이트"> 치즈바이트 <input type="checkbox" name="topping" value="치즈크러스트"> 치즈크러스트 </td> </tr> <tr> <th>사이드</th> <td> <input type="checkbox" name="side" value="콜라"> 콜라 <input type="checkbox" name="side" value="사이다"> 사이다 <input type="checkbox" name="side" value="갈릭소스"> 갈릭소스 <br> <input type="checkbox" name="side" value="핫소스"> 핫소스 <input type="checkbox" name="side" value="피클"> 피클 <input type="checkbox" name="side" value="파마산치즈가루"> 파마산치즈가루 </td> </tr> <tr> <th>결제방식</th> <td> <input type="radio" name="payment" value="card" checked> 카드결제 <input type="radio" name="payment" value="cash"> 현금결제 </td> </tr> </table> </fieldset> <br> <input type="submit" value="주문"> <input type="reset"> </form> <br> </body> </html>
Java
복사
2. 서블릿.java (요청처리)
1.
전달값 중에 한글이 있을 경우 인코딩 처리 (post방식 일때만)
2.
요청시 전달값 뽑기 및 데이터가공처리 => 변수 및 객체 기록
request.getParameter("키값") : "밸류값" (String)
request.getParameterValues("키값") : ["밸류값", "밸류값", ..] (String[])
만일 키값이 존재하지 않을 경우 : null 반환
3.
요청 처리 (보통의 흐름 : db에 sql문 실행하러 > Service > Dao)
작업 시 NullPointer 에러가 뜨지 않도록 조건문 만들기
4.
요청처리 후 사용자가 보게될 응답페이지(결제페이지) 만들기 혹은 jsp 위임
응답페이지에 필요한 데이터 담기 > request의 attribute영역
request.setAttribute("객체명"(String), 객체(Object));
Object로 전달되기 때문에 받을 때 형변환 해주어야함
5.
응답할뷰(jsp) 선택
RequestDispatcher 메소드 사용
RequestDispatcher view = request.getRequestDispatcher("jsp 경로");
6.
선택된 뷰가 사용자에게 보여지도록 포워딩
view.forward(request, response);
package com.kh.controller; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class PizzaServlet */ @WebServlet("/confirmPizza.do") public class PizzaServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public PizzaServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1) 전달값 중에 한글이 있을 경우 인코딩 처리 (post방식 일때만) //request.setCharacterEncoding("UTF-8"); // 2) 요청시 전달값 뽑기 및 데이터가공처리 => 변수 및 객체 기록 // request.getParameter("키값") : "밸류값" (String) // request.getParameterValues("키값") : ["밸류값", "밸류값", ..] (String[]) // 만일 키값이 존재하지 않을 경우 : null 반환 String name = request.getParameter("userName"); // "홍길동" String phone = request.getParameter("phone"); // "01012341234" String address = request.getParameter("address"); // "서울시 강남구 ..." String message = request.getParameter("message"); // "요청사항어쩌고~~" / "" String pizza = request.getParameter("pizza"); // "콤비네이션피자" String[] toppings = request.getParameterValues("topping"); // ["", ""] / null String[] sides = request.getParameterValues("side"); // ["", ""] / null String payment = request.getParameter("payment"); // "card" // 3) 요청 처리 (보통의 흐름 : db에 sql문 실행하러 > Service > Dao) int price = 0; switch(pizza) { case "콤비네이션피자" : price += 5000; break; case "불고기피자" : price += 8000; break; case "하와이안피자" : price += 6000; break; case "고구마피자" : case "포테이토피자" : price += 7000; break; } if(toppings != null) { // NullPointerException 방지 for(int i=0; i<toppings.length; i++) { switch(toppings[i]) { case "콘크림무스" : case "고구마무스" : price += 1500; break; case "파인애플토핑" : case "치즈토핑" : price += 2000; break; case "치즈바이트" : case "치즈크러스트" : price += 3000; break; } } } if(sides != null) { for(int i=0; i<sides.length; i++) { switch(sides[i]) { case "콜라": case "사이다": price += 2000; break; case "갈릭소스": case "핫소스": price += 500; break; case "피클": case "파마산치즈가루": price += 1000; break; } } } // 4) 요청처리 후 사용자가 보게될 응답페이지(결제페이지) 만들기 혹은 jsp 위임 // 응답페이지에 필요한 데이터 담기 > request의 attribute영역 request.setAttribute("name", name); request.setAttribute("phone", phone); request.setAttribute("address", address); request.setAttribute("message", message); request.setAttribute("pizza", pizza); request.setAttribute("toppings", toppings); request.setAttribute("sides", sides); request.setAttribute("payment", payment); request.setAttribute("price", price); // 응답할뷰(jsp) 선택 RequestDispatcher view = request.getRequestDispatcher("views/05_pizzaPayment.jsp"); // 선택된 뷰가 사용자에게 보여지도록 포워딩 view.forward(request, response); // 04_pizzaOrderForm.jsp 요청=> 응답 PizzaServlet.java 요청=> 응답 05_pizzaPayment.jsp } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Java
복사
3. 피자결제페이지.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String name = (String)request.getAttribute("name"); String phone = (String)request.getAttribute("phone"); String address = (String)request.getAttribute("address"); String message = (String)request.getAttribute("message"); String pizza = (String)request.getAttribute("pizza"); String[] toppings = (String[])request.getAttribute("toppings"); String[] sides = (String[])request.getAttribute("sides"); String payment = (String)request.getAttribute("payment"); int price = (int)request.getAttribute("price"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>주문 내역</h1> <h4>[ 주문자 정보 ]</h4> <ul> <li>성함 : <%= name %></li> <li>전화번호 : <%= phone %></li> <li>주소 : <%= address %></li> <% if(message.equals("")){ %> <!-- 요청사항을 기술하지 않았을 경우 --> <li>요청사항 : 작성안함</li> <% } else { %> <!-- 요청사항을 기술했을 경우 --> <li>요청사항 : <%= message %></li> <% } %> </ul> <br> <h4>[ 주문 정보 ]</h4> <ul> <li>피자 : <%= pizza %></li> <% if(toppings == null){ %> <!-- 토핑을 선택 안했을 경우 --> <li>토핑 : 선택안함</li> <% } else { %> <!-- 토핑을 선택했을 경우 --> <li>토핑 : <%= String.join(", " , toppings) %></li> <% } %> <% if(sides == null){ %> <!-- 사이드를 선택안했을 경우 --> <li>사이드 : 선택안함</li> <% } else { %> <!-- 사이드를 선택했을 경우 --> <li>사이드 : <%= String.join(", " , sides) %></li> <% } %> <li>결제방식 : <%= payment %></li> </ul> <h3>위와 같이 주문하셨습니다.</h3> <h2>총 가격 : <%= price %></h2> </body> </html>
Java
복사
04_pizzaOrderForm.jsp - submit으로 요청 → 응답 서블릿 (PizzaServlet.java) doGet메소드로 객체받아서 처리, 전달 → 응답 jsp (05_pizzaPayment.jsp)