리다이렉트는 서버 측에서 페이지 이동을 처리하는 방법 중 하나입니다. 이 방법을 사용하면 클라이언트가 요청한 페이지를 서버에서 다른 페이지로 이동시킬 수 있습니다.
JSP 리다이렉트를 수행하는 방법은 다음과 같습니다.
response.sendRedirect("이동할페이지의 URL");
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "이동할페이지의 URL");
위의 코드에서 "이동할페이지의 URL"은 이동할 대상 페이지의 URL을 입력하면 됩니다.
리다이렉트는 클라이언트가 요청한 페이지의 URL이 변경되는 것을 의미합니다. 따라서, 클라이언트는 새로운 URL로 요청을 보내게 되며, 이 때 HTTP 상태 코드 302가 반환됩니다.
리다이렉트를 이용하여 페이지 이동을 처리하는 경우, 클라이언트가 새로운 페이지를 요청하므로, 이전 페이지에서 사용자가 입력한 데이터는 유지되지 않습니다. 따라서, 이전 페이지에서 입력한 데이터를 새로운 페이지에서 사용해야 하는 경우, 세션 객체나 쿠키를 이용하여 데이터를 전달해야 합니다.
[예제]
member id가 'madovirus'인지 비교
값 이 'madovirus' 이면
값 이 'madovirus' 아니면
를 출력한다.
JSP(Java Server Pages)는 동적인 웹 페이지를 생성하기 위한 기술로, 서블릿 기술을 기반으로 하고 있습니다. JSP 페이지는 일반적인 HTML 페이지와 같은 모습으로 구성되어 있지만, <% %>와 같은 특수한 태그를 사용하여 자바 코드를 삽입할 수 있습니다.
JSP 페이지가 처리되는 과정은 다음과 같습니다.
즉, JSP 페이지가 클라이언트에게 보여지기 위해서는 서블릿으로 변환되고, 서블릿 클래스가 실행되어야 합니다. 이 과정에서 서블릿 컨테이너는 JSP 페이지를 처리하고, 서블릿 클래스를 생성하고, 실행하여 요청을 처리하게 됩니다.
JSP 페이지를 포함하는 폴더 구조는 다음과 같은 구성 요소를 가질 수 있습니다.
WebContent 폴더
JSP 페이지와 웹 애플리케이션에서 사용되는 다른 자원(이미지, CSS 파일 등)을 포함하는 폴더입니다.
JSP 페이지는 WebContent 폴더의 하위 폴더에 위치할 수 있습니다.
WEB-INF 폴더
웹 애플리케이션의 구성 정보와 자원을 포함하는 폴더입니다.
WEB-INF 폴더의 lib 폴더에는 웹 애플리케이션에서 사용되는 라이브러리 파일(.jar 파일)이 위치할 수 있습니다.
WEB-INF 폴더의 web.xml 파일은 웹 애플리케이션의 구성 정보를 정의합니다.
META-INF 폴더
JAR 파일에서 사용되는 메타데이터를 포함하는 폴더입니다.
웹 애플리케이션에서는 사용되지 않는 폴더입니다.
JSP 페이지는 일반적으로 WebContent 폴더의 하위 폴더에 위치합니다. 예를 들어, /WebContent/index.jsp와 같은 경로로 JSP 페이지를 배치할 수 있습니다.
또한, JSP 페이지에서 사용하는 자바 클래스 파일이나 라이브러리 파일은 WEB-INF/lib 폴더에 위치할 수 있습니다. 이렇게 함으로써, JSP 페이지에서 사용하는 자바 클래스나 라이브러리를 직접적으로 웹 브라우저에서 접근할 수 없게 되어 보안상의 이점을 가질 수 있습니다.
폴더와 URL의 관계는 웹 애플리케이션의 폴더 구조와 밀접한 관련이 있습니다. JSP 페이지를 포함하는 폴더의 위치에 따라서 URL의 경로도 달라지기 때문입니다.
보통 JSP 페이지는 웹 애플리케이션의 WebContent 폴더 안에 위치하며, URL의 경로는 WebContent 폴더를 루트로 하는 상대 경로로 지정됩니다. 예를 들어, WebContent 폴더 안에 login.jsp라는 파일이 있다면, 이 파일을 호출하기 위한 URL은 "/login.jsp"가 됩니다.
만약 WebContent 폴더 안에 하위 폴더를 더 추가했다면, URL에서는 하위 폴더를 경로에 추가하여 접근할 수 있습니다. 예를 들어, WebContent 폴더 안에 board라는 하위 폴더가 있고, 그 안에 list.jsp라는 파일이 있다면, 이 파일을 호출하기 위한 URL은 "/board/list.jsp"가 됩니다.
또한, JSP 페이지에서 서블릿 코드를 사용하여 동적인 웹 페이지를 생성할 때는, 서블릿 클래스의 URL 경로를 정의해야 합니다. 서블릿 클래스의 URL 경로는 @WebServlet 어노테이션을 사용하여 지정할 수 있습니다. 예를 들어, @WebServlet("/example") 어노테이션이 있다면, "/example" 경로를 사용하여 이 서블릿 클래스를 호출할 수 있습니다.
따라서, JSP 페이지와 URL은 웹 애플리케이션의 폴더 구조에 따라 관계가 결정되며, URL은 JSP 페이지나 서블릿 클래스를 호출하기 위한 경로로 사용됩니다.
대상 폴더에 파일을 직접 복사
가장 일반적인 방법은 WAR(Web Application Archive) 파일을 생성하여 웹 서버에 배포하는 것입니다.
(WAR 파일은 압축된 웹 애플리케이션 파일로, 웹 애플리케이션을 실행하는 데 필요한 모든 파일과 설정 정보를 포함합니다.)
JSP 웹 애플리케이션을 배포하는 방법은 다음과 같습니다.
JSP 웹 애플리케이션을 배포할 때는, 웹 서버와 호환되는 버전의 Java 및 JSP 컨테이너가 설치되어 있어야 합니다. 또한, 웹 애플리케이션을 개발하는 환경과 웹 서버의 환경이 다르면, 환경 설정 문제로 인해 문제가 발생할 수 있으므로, 가능하면 개발 환경과 동일한 환경에서 배포하는 것이 좋습니다.
프로젝트 선택 - 우클릭 - Export - WAR file 클릭
Browse...클릭
톰캣 경로에 webapps에 저장 - finish
(프로젝트명).war 파일이 생성된것을 확인할 수 있다.
배포할땐 이클립스에 있는 톰캣을 끄고 윈도우즈에 (apache-tomcat-8.5.87\bin 경로) 있는 startup.bat 실행시키면 .war 파일이 있다면 톰캣은 그 파일을 압축해제하면서 실행한다.
두개의 톰캣(이클립스와 startup으로 실행)을 동시에 실행하는건 불가능(같이 켜면 충돌하므로)
bin에서 startup 배치파일을 클릭하면 war파일이 압축해제 되는것을 확인할 수 있다.
\apache-tomcat-8.5.87\conf에 server.xml설정과
web.xml에 맨 아래 welcom-file-list를 기본 index.html로 되어있는걸 수정
request:
클라이언트가 서버에 요청한 정보를 담고 있는 객체입니다. HttpServletRequest 인터페이스를 구현한 객체로서, 클라이언트가 전송한 파라미터나 헤더 정보 등을 가져올 수 있습니다.
response:
서버가 클라이언트에게 응답할 정보를 담고 있는 객체입니다. HttpServletResponse 인터페이스를 구현한 객체로서, 클라이언트에게 전송할 데이터를 설정하거나 리다이렉트를 수행하는 등의 작업을 할 수 있습니다.
page : JSP 페이지 내에서 자동으로 생성되므로, 별도의 객체 생성 없이 바로 사용할 수 있습니다. 주로 JSP 페이지에서 contentType, isErrorPage 등의 속성을 설정하거나, exception 메소드를 사용하여 예외 처리를 수행하는 데 사용됩니다.
pageContext:
JSP 페이지의 컨텍스트 정보를 담고 있는 객체입니다. PageContext 클래스를 구현한 객체로서, 현재 JSP 페이지의 다른 객체들을 참조할 수 있습니다.
session: 클라이언트와 서버 사이의 상태 정보를 유지하기 위한 객체입니다. HttpSession 인터페이스를 구현한 객체로서, 클라이언트가 로그인한 사용자인지 등을 판단할 때 사용됩니다.
application:
웹 어플리케이션 전체에서 공유되는 객체입니다. ServletContext 인터페이스를 구현한 객체로서, 서버가 시작될 때 생성되고 서버가 종료될 때까지 유지됩니다. 보통 웹 어플리케이션에서 설정 정보나 공유 데이터 등을 저장하기 위해 사용됩니다.
out:
응답 결과를 출력하기 위한 출력 스트림 객체입니다. JspWriter 클래스를 구현한 객체로서, HTML 코드나 텍스트 데이터를 출력할 때 사용됩니다.
config: JSP 페이지의 설정 정보를 담고 있는 객체입니다. ServletConfig 인터페이스를 구현한 객체로서, JSP 페이지에서 설정 정보를 읽어올 수 있습니다.
exception: JSP 페이지에서 발생한 예외 정보를 담고 있는 객체입니다. Exception 클래스를 구현한 객체로서, 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>
<%
out.println("안녕하세요");
%>
// <br>을 안넣으면 줄바꿈을 안한다.
out 기본 객체를 사용하여
<%
out.println("출력한 결과입니다.");
%>
</body>
</html>
br을 추가한 결과
웹 애플리케이션의 네 가지 영역(scope)은 다음과 같습니다.
Request 영역 : 클라이언트로부터 들어온 요청(request) 정보를 담고 있는 영역입니다. 즉, 클라이언트가 요청한 페이지에서만 유효한 데이터를 저장하고 공유할 수 있습니다. 이 데이터는 서버가 클라이언트의 요청을 처리하는 동안에만 유효하며, 다른 페이지로 이동하면 데이터가 사라집니다.
Session 영역 : 웹 애플리케이션 내에서 특정 세션(session)에 대한 데이터를 저장하고 공유할 수 있는 영역입니다. 즉, 클라이언트와 서버 간에 연결이 유지되는 동안 계속해서 유효한 데이터를 저장하고 공유할 수 있습니다. 이 데이터는 같은 세션 내에서 모든 페이지에서 유효합니다.
Context 영역 : 웹 애플리케이션 내에서 모든 클라이언트에 대한 데이터를 저장하고 공유할 수 있는 영역입니다. 이 데이터는 웹 애플리케이션이 실행되는 동안 계속해서 유효하며, 모든 페이지에서 접근할 수 있습니다.
Application 영역 : 웹 애플리케이션 내에서 전역적으로 사용할 수 있는 데이터를 저장하고 공유할 수 있는 영역입니다. 이 데이터는 웹 애플리케이션이 실행되는 동안 계속해서 유효하며, 모든 클라이언트에서 접근할 수 있습니다.
이 네 가지 영역은 각각의 특성에 따라 사용되는 데이터의 유효 범위와 생명 주기가 다르기 때문에, 적절한 용도에 따라 선택하여 사용해야 합니다.
JSP 페이지에서는 try-catch 블록을 사용하여 예외 처리를 할 수 있습니다. 예외가 발생할 가능성이 있는 코드를 try 블록 안에 작성하고, 예외가 발생하면 catch 블록에서 처리합니다.
예를 들어, 다음과 같이 NullPointerException이 발생할 가능성이 있는 코드를 예외 처리합니다.
<%@ page language="java" %>
<html>
<head>
<title>Exception Handling in JSP</title>
</head>
<body>
<%
try {
String str = null;
str.length();
} catch (NullPointerException e) {
out.println("NullPointerException occurred: " + e.getMessage());
}
%>
</body>
</html>
위 코드에서는 try 블록에서 NullPointerException이 발생할 가능성이 있는 str.length(); 코드를 작성하고, catch 블록에서 NullPointerException을 처리합니다. 이렇게 예외가 발생할 가능성이 있는 코드를 try 블록에 작성하고, 예외가 발생하면 catch 블록에서 예외를 처리합니다.
또한, JSP에서는 에러 페이지(error page)를 설정하여 예외 처리를 할 수도 있습니다. 에러 페이지를 설정하면, 예외가 발생했을 때 해당 페이지로 자동으로 이동하게 됩니다. 이를 위해서는 <%@ page isErrorPage="true" %> 디렉티브를 설정해야 하며, 에러 페이지에서는 exception 내장 객체를 사용하여 예외 정보를 출력할 수 있습니다.
<%@ page language="java" isErrorPage="true" %>
<html>
<head>
<title>Error Page</title>
</head>
<body>
An error occurred:
<%= exception.getMessage() %>
</body>
</html>
위 코드에서는 <%@ page language="java" isErrorPage="true" %> 디렉티브를 설정하여 이 페이지가 에러 페이지임을 나타내고, exception 내장 객체를 사용하여 예외 정보를 출력합니다. 이렇게 설정된 에러 페이지는 예외가 발생하면 자동으로 호출되어 예외 처리를 수행합니다.
[익셉션 예제]
<%@ 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>
name 파라미터 값 : <%= request.getParameter("name").toUpperCase() %>
</body>
</html>
name을 요청한게 없어서 에러가 발생한다.
익셉션을 이용해 처리해보자
<%@ 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>
name 파라미터 값 :
<% try { %>
<%= request.getParameter("name").toUpperCase() %>
<% } catch(Exception ex) { %>
name 파라미터가 올바르지 않습니다.
<% } %>
</body>
</html>
과 사이에 아래의 404 에러코드를 처리하는 설정 추가
jsp:include 디렉티브는 JSP 페이지에서 다른 JSP 페이지나 HTML 파일을 포함하는 데 사용됩니다.
사용 방법은 다음과 같습니다.
<jsp:include page="파일이름.jsp" />
위의 코드는 현재 JSP 페이지에 "파일이름.jsp" 파일을 포함합니다.
또한, 다른 JSP 페이지에 있는 변수나 메소드를 사용하고 싶은 경우, 아래와 같이 속성을 사용할 수 있습니다.
<jsp:include page="파일이름.jsp">
<jsp:param name="변수명" value="<%=변수값%>"/>
</jsp:include>
위의 코드는 "파일이름.jsp" 파일을 포함하고, "변수명"이라는 이름으로 변수를 전달합니다. 이 변수는 <%=변수값%>에 해당하는 값으로 설정됩니다.
주의할 점은 jsp:include 디렉티브를 사용하면 포함된 파일의 내용이 현재 JSP 페이지에 그대로 복사되므로, 포함된 파일에 있는 변수나 메소드는 현재 JSP 페이지에서 직접 사용할 수 있습니다. 따라서 포함된 파일에 중복되는 변수나 메소드가 있을 경우 충돌이 발생할 수 있으므로 주의해야 합니다.
[예제]
코드 main.jsp , sub.jsp
결과
[예제]
layout.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>
<table border="1">
<tr>
<td colspan="2">
<jsp:include page = "top.jsp"/>
</td>
</tr>
<tr>
<td><jsp:include page = "left.jsp"/></td>
<td>중앙내용</td>
</tr>
<tr>
<td colspan="2">
<jsp:include page = "bottom.jsp"/>
</td>
</tr>
</table>
</body>
</html>
top.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>
상단 메뉴: <a href="layout.jsp">홈</a> <a href="layout.jsp">정보</a>
</body>
</html>
left.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>
좌측 메뉴:
</body>
</html>
bottom.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>
하단 메뉴 : 소개 | 도움말 | 약관 | 사이트맵
</body>
</html>
결과
info.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>
<table border="1">
<tr>
<td>제품코드</td><td>xxxx</td>
</tr>
<tr>
<td>가격</td><td>10,000원</td>
</tr>
</table>
<jsp:include page="infosub.jsp" flush="false">
<jsp:param name="type" value="A" />
</jsp:include>
</body>
</html>
infosub.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String type = request.getParameter("type");
if(type==null){
return;
}
%>
<br>
<table border="1">
<tr>
<td>타입</td>
<td><%=type %></td>
</tr>
<tr>
<td>특징</td>
<td>
<% if(type.equals("A")){ %>
강한 내구성
<%}else if(type.equals("B")){ %>
뛰어난 대처 능력
<%} %>
</td>
</tr>
</table>
[결과]
값이 A일때
값이 B일때
<%@ include file="포함할 파일" %>
jspf 확장자를 가진 파일은 JSP fragment 파일이라고도 불리며, JSP 페이지에서 재사용 가능한 코드 조각을 분리하여 작성할 때 사용됩니다. 이 파일들은 일반적으로 JSP 페이지에서 자주 사용되는 HTML, Java 코드, JavaScript 등을 포함하고 있습니다.
jspf 파일을 include하는 방법은 다음과 같습니다.
<%@ include file="파일이름.jspf" %>
위의 코드는 현재 JSP 페이지에 "파일이름.jspf" 파일을 포함합니다.
주의할 점은 include 디렉티브를 사용하면 포함된 파일의 내용이 현재 JSP 페이지에 그대로 복사되므로, 포함된 파일에 있는 변수나 메소드는 현재 JSP 페이지에서 직접 사용할 수 있습니다. 따라서 포함된 파일에 중복되는 변수나 메소드가 있을 경우 충돌이 발생할 수 있으므로 주의해야 합니다.
[예제]
includer.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>
<%
int number = 10;
%>
<%@ include file="includee.jspf" %>
공통변수 DATAFOLDER "<%= dataFolder %>"
</body>
</html>
incldee.jspf
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
includer.jsp에서 지정한 번호 : <%= number %>
<p>
<%
String dataFolder = "c:\\data";
%>
jsp:forward는 JSP 페이지에서 다른 JSP 페이지나 서블릿으로 제어를 전달하는 데 사용됩니다.
jsp:forward 사용법은 다음과 같습니다.
<jsp:forward page="이동할_페이지_이름" />
위의 코드에서 "이동할페이지이름"은 제어를 전달할 페이지의 이름이나 경로입니다.
jsp:forward는 현재 JSP 페이지의 출력 스트림을 비워주고, 제어를 전달할 페이지나 서블릿으로 이동합니다. 따라서 jsp:forward 태그 이후에 있는 코드는 실행되지 않습니다. 또한, 제어를 전달한 페이지에서는 다시 돌아올 수 없으므로 주의해야 합니다.
주의할 점은 jsp:forward를 사용하면 브라우저는 새로운 요청을 보내게 되므로, URL이 변경됩니다. 따라서 jsp:forward는 현재 페이지와 전달할 페이지가 같은 웹 어플리케이션 내에 있어야 합니다.
jsp:forward는 주로 조건에 따라 다른 페이지로 제어를 전달할 때 사용됩니다. 예를 들어, 로그인이 필요한 페이지에 접근하려는 경우 로그인 페이지로 제어를 전달할 수 있습니다.
[예제_jsp:forward]
<%@ 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>
이 페이지는 from.jsp가 생성한 것입니다.
<jsp:forward page="to.jsp" />
</body>
</html>
<%@ 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>
이 페이지는 to.jsp가 생성한 것입니다.
</body>
</html>
실행 결과