이번 예는 간단한 JSP 기능들을 이용한 페이지들을 사용해보자.


테이블 구조는 다음과 같다.







총 4가지의 페이지를 볼 수 있는데 01_sum은 연산의 결과가 오류일 때 정해진 오류 페이지를 보여준다.


페이지를 열 때 브라우저에 400번대 에러와 500번대 에러는 흔히 볼 수 있는데


500번대 에러는 서버측의 에러이기 때문에 해커가 현재 서버가 어떤 문제가 있는지 코드에 어떤 오류가 있는지


알 수 있기 때문에 500번 오류는 노출하지 않는걸 권장한다.




두번째로 02_date인데 웹브라우저에서 자주 사용하는 날짜 함수를 JSP에서 어떻게 사용하는지 확인해보자.



세번째로 03_fortune은 다른 페이지(jsp 파일)를 불러와 현재 페이지에 포함(include)하는 방법을 확인해보자



네번째 04_menu는 간단하게 get방식으로 값을 넘겨서 연산처리를 하여 결과를 확인해보자.






index.jsp



<%@ 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>JSP 테스트</h1>
    <h3><a href="views/01_sum.jsp">테스트1</a></h3>
    <h3><a href="views/02_date.jsp">테스트2</a></h3>
    <h3><a href="views/03_fortune.jsp">테스트3</a></h3>
    <h3><a href="views/04_menu.jsp">테스트4</a></h3>
</body>
</html>










01_sum.jsp




<%-- directive page : 페이지 지시자 태그'<%@' --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%--
        아래의 코드(System.out.println)를 보면 에러가 발생하는 구문이다.
        실행하면 에러페이지에 아래 코드가 출력이 되는데 코드가 그대로 노출되기 때문에 보안에 매우 취약하다.
        따라서 에러 페이지를 따로 지정하면 된다.
    --%>
    <%@ page errorPage="errorPage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%-- JSP는 동적 컴파일을 지원하기 때문에 변경사항이 있어도 서버를 껏다 킬 필요가 없다. --%>
<body>
    <%-- JSP 주석 '<%--' --%>
    <!-- HTML 주석 -->
   
   
   
    <%-- Scripting Element 1 : scriptlet --%>
    <%-- <%로 시작해서 %>로 끝나는 것을 스크립틀릿이라고 부른다. --%>
    <%
        int total = 0;
       
        for(int i = 1; i <= 10; i++){
            total += i;
        }
       
        // 아래의 코드를 보면 에러가 발생하는 구문이다.
        // 실행하면 에러페이지에 아래 코드가 출력이 되는데
        String s = null;
        System.out.println(s.charAt(0));
    %>
   
   
   
    <%-- Scripting element 2 : expression 기능은 자바 코드에서 작성한 결과값을 출력한다. --%>
    <%-- expression 태그는 세미콜론이 있으면 에러가 난다. --%>
    <h4>1부터 10까지의 합은 : <span style="color: red; font-size: 16pt; "><%= total %></span></h4>
    <h4>1부터 10까지의 합은 : <span style="color: red; font-size: 16pt; "><% out.println(total); %></span></h4>
    <%-- out은 선언하지 않았는데 사용할 수 있음 - 내장객체이므로 가능 --%>
</body>
</html>





errorPage.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>에러페이지</h1>
    <h3>에러 종류 : <%= exception.getClass().getName() %></h3>
</body>
</html>











02_date.jsp




<%@page import="java.util.Date"%>
<%@ 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>
    <%
        Date now = new Date();
       
        String date = String.format("%tF", now);
        String time = String.format("%tp %tT", now, now);
        String today = String.format("%tY년 %tm월, %td일, %tA", now, now, now, now);
       
        /*
        날짜 타입           설명
        ------------------------------------------
        %tF          날짜를 yyyy-mm-dd 형식으로 포맷
        %tT          날짜의 시각을 HH:MM:SS 형식으로 포맷
        ------------------------------------------
        %tY          4자리 년도만 출력
        %ty          2자리 년도만 출력
        %tB          월의 이름 영문(January, Febuary, ....)
        %tm          월을 숫자로 (01, 02, 03 ~ 12)
        %td          일수를 1 ~ 31로 표현
        %te          %td와 같다.
        %tA          요일명 출력
        ------------------------------------------
        %tp          오전, 오후 출력
        %tk          시간을 0 ~ 23 으로 출력
        %tl          시간을 1 ~ 12로 출력
        %tM          분을 00 ~ 59로 출력
        %tS          초를 00 ~ 59로 출력
        ------------------------------------------
        */
    %>
   
    <ul style="list-style: decimal;">
        <li>오늘의 날짜 : <%= date %></li>
        <li>현재 시간 : <%= time %></li>
        <li>오늘은 <span style="color: red;"><%= today %></span>입니다.</li>
       
    </ul>
</body>
</html>










03_fortune.jsp



<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%--
<%
    Date now = new Date();
    String today = String.format("%tY년 %tm월 %td일 %tA", now, now, now, now);
%>
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%-- <h2>오늘의 운세<sub style="color:lightgray"><%= today %></sub></h2> --%>
    <h2>오늘의 운세<%@ include file="today.jsp" %></h2>
    <%-- 위의 date 때문에 오류가 나기 때문에 주석으로 감싼다. --%>
    <select>
        <option>쥐띠</option>
        <option>소띠</option>
        <option>호랑이띠</option>
        <option>토끼띠</option>
        <option>용띠</option>
        <option>뱀띠</option>
        <option>말띠</option>
        <option>양띠</option>
        <option>원숭이띠</option>
        <option>닭띠</option>
        <option>개띠</option>
        <option>돼지띠</option>
    </select>
   
</body>
</html>






today.jsp




<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    Date now = new Date();
    String today = String.format("%tY년 %tm월 %td일 %tA", now, now, now, now);
%>
<%-- include 전용 파일에 HTML 코드들이 있으면 다같이 딸려가기 때문에 지워둔다. iframe과 유사 --%>
<sub style="color: lightgray;"><%= today %></sub>











04_menu.jsp




<%@ 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>
    <h2>오늘의 메뉴<%@ include file="today.jsp" %></h2>
   
    <!--  13번째 줄과 14번째 줄은 같은 의미 -->
    <!-- <form action="/w4/menu.Order.do" method="get" name="menuFrm"></form> -->
    <form action="<%= request.getContextPath() %>/menuOrder" method="get" name="menuFrm">
        <select id="menu" name="menu">
            <option value="햄버거">햄버거</option>
            <option value="짜장면">짜장면</option>
            <option value="짬뽕">짬뽕</option>
            <option value="순대국">순대국</option>
        </select>
        <input type="submit" value="선택완료">
    </form>
   
</body>
</html>











MenuOrderServlet.java




package com.kh.servletTest.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;

@WebServlet("/menuOrder")
public class MenuOrderServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    public MenuOrderServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 전송값에 한글이 있을 경우 인코딩 처리 해야 함, 그냥 항상 하자
        request.setCharacterEncoding("utf-8");
       
        // 2. 전송갑 꺼내서 변수에 기록하기
        String menu = request.getParameter("menu");
       
        // 3. 비지니스 로직
        int price = 0;
        switch (menu) {
        case "햄버거":
            price = 5000;
            break;
        case "짬뽕":
            price = 4000;
            break;
        case "짜장면":
            price = 4500;
            break;
        case "순대국":
            price = 6000;
            break;
        }
       
        // 4. 실행 결과 처리 및 전송 (박싱이 자동으로 처리됨, 오토 박싱)
        request.setAttribute("menu", menu);
        request.setAttribute("price", price);
       
        RequestDispatcher view = request.getRequestDispatcher("views/04_menuResult.jsp");
       
        view.forward(request, response);
       
       
       
       
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}










04_menuResult.jsp





<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String menu = (String)request.getAttribute("menu");
    int price = (int)request.getAttribute("price");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>감사합니다.</h2>
    주문하신 <%= menu %>의 결제 금액은 <%= price %>원 입니다.
</body>
</html>















번호별로 주목할 점은 위에서 설명한거와 같이 넘버별로 하나씩



01_sum <%@ page errorPage="errorPage.jsp" %>을 통해서 임의의 에러 페이지를 지정하고


errorPage.jsp에서는 <%= exception.getClass().getName() %>을 통해서 에러 코드(널포인터 익셉션)를 표시해준다






02_date는 <%%> 구문안에 Date를 사용하고 사용하기 위해서 상단에 import해야 하는것을 확인하자.


그 외 실제로 확인하는 방법은 주석문에 정리해두었다.






03_fortune은 <%@ include file="today.jsp" %>을 통해서 적절한 부분에 해당 jsp 파일을 불러온다.


불러올 파일의 내용을 전부 가져오기 때문에 HTML 태그라던가 head body 등 쓸모없는 부분은 지워서 작성한다.






네번째 04_menu는 JSP -> Servlet -> JSP 순으로 데이터의 흐름이 어떻게 움직이는지 확인해보자.





+ Recent posts