이번 예는 간단한 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 순으로 데이터의 흐름이 어떻게 움직이는지 확인해보자.
'JDBC, Servlet, JSP, Ajax, Json, Gson > 02.Servlet, JSP 사용법' 카테고리의 다른 글
[Servlet, JSP]02-11. MVC 패턴 1, 2 (0) | 2018.12.10 |
---|---|
[Servlet, JSP]02-10. Servlet, JSP 예 5 (0) | 2018.12.10 |
[Servlet, JSP]02-07.Tomcat이 페이지의 default 값 파일이 저장되어 있는 위치, java 파일이 서버에 적용되는 원리 (0) | 2018.12.07 |
[Servlet, JSP]02-08. Servlet, JSP 예 3 (0) | 2018.12.07 |
[Servlet, JSP]02-06. Servlet과 JSP의 비교, <%%> 관련 키워드 사용법들 (0) | 2018.12.07 |