비교 항목 | jsp:include 액션 태그 (동적) | include 디렉티브 (정적) |
처리 시간 | 요청 시간에 처리 | JSP 파일을 자바 소스로 변환 시 처리 |
기능 | 별도 파일로 요청 처리 흐름 이동 | 현재 파일로 대상 페이지가 들어감 |
데이터 전달 | request, jsp:param 이용 | 페이지 내 변수 선언 후 변수에 값 저장 |
용도 | 화면 레이아웃의 일부분을 모듈화 | 저작권, 공통 변수 지정 |
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>main</title>
</head>
<body>
main.jsp에서 생성한 내용.<br>
<jsp:include page="sub.jsp" />
include 이후의 내용<br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<p>
sub.jsp에서 생성한 내용
</p>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>laylout</title>
</head>
<body>
<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
<!-- cellpadding : 셀과 내용 사이의 여백, cellspacing : 셀과 테이블 사이의 여백 -->
<tr>
<td colspan="2">
<jsp:include page="/module/top.jsp" flush="false" />
</td>
</tr>
<tr>
<td style="width: 30%" valign="top">
<jsp:include page="/module/left.jsp" />
</td>
<td>
<!-- 내용 부분 : 시작 -->
레이아웃1<br><br><br>
<!-- 내용 부분 : 끝 -->
</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page="/module/bottom.jsp" />
</td>
</tr>
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
상단 메뉴 :
<a href="<%=request.getContextPath() %>/chapter07/layout.jsp">홈</a>
<a href="<%=request.getContextPath() %>/chapter07/info.jsp">정보</a>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>INFO</title>
</head>
<body>
<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2">
<jsp:include page="/module/top.jsp" flush="false" />
</td>
</tr>
<tr>
<td style="width: 30%" valign="top">
<jsp:include page="/module/left.jsp" />
</td>
<td>
<!-- 내용 부분 : 시작 -->
<table style="width: 100%;" border="1">
<tr>
<th>제품번호</th><td>P101000001</td>
</tr>
<tr>
<th>가격</th><td>10,000원</td>
</tr>
</table>
<!--
info.jsp?type=B
jsp:param 액션 태그로 추가한 파라미터가 기존 파라미터보다 우선한다.
-->
<jsp:include page="/chapter07/infoSub.jsp">
<jsp:param name="type" value="A" />
</jsp:include>
<%-- <%@ include file="/chapter07/infoSub.jsp" %> --%>
<!-- 내용 부분 : 끝 -->
</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page="/module/bottom.jsp" />
</td>
</tr>
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
// <jsp:param name="type" value="A" />
String type = request.getParameter("type").toUpperCase(); // A가 받아짐
// if(type == null){
// return;
// }
// type : info.jsp?type=B + jsp:param의 A
String[] names = request.getParameterValues("type");
for(String name : names){
out.print("name : " + name + "<br>");
}
%>
<!-- info.jsp페이지에 include되는 sub 페이지 -->
<br>
<table style="width: 100%;" border="1">
<tr>
<th>타입</th>
<td><b><%=type %></b></td>
</tr>
<tr>
<th>특징</th>
<td>
<%
if(type.equals("A")){
out.print("강한 내구성");
}else if(type.equals("B")){
out.print("뛰어난 대처 능력");
}else{
out.print("저렴한 가격");
}
%>
</td>
</tr>
</table>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
좌측 메뉴 : <br>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
하단 메뉴 : 소개 | 도움말 | 약관 | 사이트맵
- layout.jsp 출력 결과 :
- layout.jsp에서 정보 클릭 시
- 주소창에 info.jsp?type=B를 입력했을 때
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
좌측 메뉴 : <br>
<a href="/chapter07/freeboard.jsp?currentPage=1">자유게시판</a>
- left.jsp에 자유게시판으로 이동하는 a태그 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>자유게시판 목록</title>
</head>
<body>
<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2">
<jsp:include page="/module/top.jsp" flush="false" />
</td>
</tr>
<tr>
<td style="width: 30%" valign="top">
<jsp:include page="/module/left.jsp" />
</td>
<td>
<!-- 내용 부분 : 시작 -->
<table border="1" style="width: 100%;">
<tr>
<td colspan="4"><a href="/chapter07/freeboardwrite.jsp">[게시글 쓰기]</a></td>
</tr>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>조회수</th>
</tr>
<%
//freeboard.jsp?currentPage=1 기본 currentPage 파라미터 값 : 1
String currentPageStr = request.getParameter("currentPage");
int currentPage = Integer.parseInt(currentPageStr);
//글 전체 개수(120행)
//SELECT COUNT(*) TOTAL FROM FREEBOARD; => 120행
int total = 121;
//전체 페이지 수
int totalPages = total /10; //12페이지
//121 % 10 => 1 => 전체 페이지 수를 1 증가
//(전체 행의 수/ 한 화면에 보여지는 size 했을 때 딱 떨어지지 않고 넘쳤을 때..)
//12페이지는 120행을 커버하는데 문제는 121행처럼 1행이 넘쳤을 때에는 13페이지로 처리해줘야 하므로..
if(total % 10 > 0) {
totalPages++;
}
//글 시작 번호(1페이지일 경우 시작번호 : 1, 2페이지일 경우 시작번호 : 11)
int startNum = (currentPage * 10) - 9;
//글 종료 번호
int endNum = currentPage * 10;
//int endNum = startNum + 9;
//시작 페이지 [이전] 1 2 3 4 5 [다음] => 1
//정수 / 정수 => 정수
// 1 / 5 => 0.2지만 정수로 0임
int startPage = currentPage / 5 * 5 + 1;
//현재 페이지를 5개로 나눈 나머지
//5같은 경우는 5/5 => 1이 되기 때문에 1 * 5 + 1 = 6이 됨
int modVal = currentPage % 5;
//6-5를 빼줌 => 1이 됨
if(modVal == 0) startPage -= 5; //보정작업
//종료 페이지 [이전] 1 2 3 4 5 [다음] => 5
int endPage = startPage + 4;
//종료 페이지 [이전] 11 12 13 14 15 [다음] => 15
if(endPage > totalPages) endPage = totalPages; //totalPages : 13(121행일때)
for(int i=startNum; i<=endNum; i++) { %>
<tr>
<th><%=i%></th>
<th>제목<%=i%></th>
<th>작성자<%=i%></th>
<th>0</th>
</tr>
<%} %>
<tr style="text-align: center;">
<td colspan="4">
<%if(startPage > 5) {%>
<a href="/chapter07/freeboard.jsp?currentPage=<%=startPage - 5%>">[이전]</a>
<%} %>
<%for(int j=startPage; j<=endPage; j++) {%>
<a href="/chapter07/freeboard.jsp?currentPage=<%=(j)%>">
<%=(j)%>
</a>
<%} %>
<%if(endPage < totalPages) { %>
<a href="/chapter07/freeboard.jsp?currentPage=<%=startPage + 5%>">[다음]</a>
<%} %>
</td>
</tr>
</table>
<!-- 내용 부분 : 끝 -->
</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page="/module/bottom.jsp" />
</td>
</tr>
</table>
</body>
</html>
- 현재 페이지가 1일 때(자유게시판 클릭했을 때 기본값, 이전 버튼 없음)
- 현재 페이지가 8일 때(이전, 다음 버튼 있음)
- 현재 페이지가 13일 때(마지막 페이지, 다음 버튼 없음)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>새글작성</title>
<script type="text/javascript">
function fn_list() {
history.go(-1); //이전 화면으로 이동
}
</script>
</head>
<body>
<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2">
<jsp:include page="/module/top.jsp" flush="false" />
</td>
</tr>
<tr>
<td style="width: 30%" valign="top">
<jsp:include page="/module/left.jsp" />
</td>
<td>
<!-- 내용 부분 : 시작 -->
<form action="/chapter07/freeboardreg.jsp" method="post">
<p>제목 : <br><input type="text" name="title" placeholder="제목을 입력해주세요"></p>
<p>내용 : <br><textarea name="content" rows="5" cols="30"></textarea></p>
<input type="submit" value="새글등록">
<input type="button" value="목록" onclick="fn_list()">
</form>
<!-- 내용 부분 : 끝 -->
</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page="/module/bottom.jsp" />
</td>
</tr>
</table>
</body>
</html>
- 게시글 쓰기 화면
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
String content = request.getParameter("content");
//out.print("title : " + title + "<br>");
//out.print("content : " + content + "<br>");
//Map : java.util 패키지에 있는 interface
Map<String, Object> map = new HashMap<>();
map.put("title", title);
map.put("content", content);
session.setAttribute("map", map);
%>
<!DOCTYPE html>
<html>
<head>
<title>게시글 등록</title>
</head>
<body>
게시글을 등록했습니다. <br>
<a href="/chapter07/freeboardview.jsp">[게시글 내용 보기]</a>
</body>
</html>
- 새글 등록 버튼 클릭시
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Map<String, Object> map = (Map<String, Object>)session.getAttribute("map");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상세보기</title>
<script type="text/javascript">
function fn_list() {
location.href="/chapter07/freeboard.jsp?currentPage=1";
}
</script>
</head>
<body>
<table border="1" style="width: 100%;" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2">
<jsp:include page="/module/top.jsp" flush="false" />
</td>
</tr>
<tr>
<td style="width: 30%" valign="top">
<jsp:include page="/module/left.jsp" />
</td>
<td>
<!-- 내용 부분 : 시작 -->
<form action="/chapter07/freeboardreg.jsp" method="post">
<p>제목 : <br><input type="text" name="title" placeholder="제목을 입력해주세요" value="<%=map.get("title")%>"></p>
<p>내용 : <br><textarea name="content" rows="5" cols="30"><%=map.get("content")%></textarea></p>
<input type="button" value="목록" onclick="fn_list()">
</form>
<!-- 내용 부분 : 끝 -->
</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page="/module/bottom.jsp" />
</td>
</tr>
</table>
</body>
</html>
게시글 내용 보기 클릭시