본문 바로가기
WEB

[WEB] 03. JSP 내장 객체

by ssunooo 2024. 8. 7.

 


JSP 내장객체

객체는 메서드 수행 객체를 의미한다.

 


1. exception 내장객체

 

다음은 JSP파일을 작성하는 중 에러가 발생한 예시이다.

n2의 값이 0인데 n2로 n1을 나눠서 발생한 오류이다.

위 오류의 해결방안으로는

1) n2를 0이 아닌 다른 정수로 설정하거나

 2) try-catch를 사용해서 예외처리를 하거나
 3) 에러 페이지로 이동 처리를 하는 방법이 있다.

 

에러페이지를 error.jsp로 새로 만들고 error폴더를 하나 만들어서 저장해준다.

( 폴더별로 관리하면 응집도를 높일 수 있어서 유지보수가 용이해진다. )

error.jsp 페이지 지시어에 errorPage="error/error.jsp" 를 넣은 뒤

기존 JSP 페이지 지시어에 isErrorPage="true" 설정을 추가하면 에러가 나면 error.jsp의 페이지로 넘어간다.

 

<%= exception %>는 에러페이지에 넣을 수 있는데 
page 지시어에 isErrorPage="true" 설정을 추가하면 exception 객체를 내장해주기 때문에

사용할 수 있다.


2. out 내장객체 

 

웹 브라우저 화면에 html을 그리는 역할을 한다.
Servlet 실습에서는 기본제공되지않아서 선언하여 사용한다.
하지만, JSP에는 내장되어 있기 때문에 별도 선언 없이 사용할 수 있다.

 


3. request 

 

선언을 하지 않아도 사용가능하고, response와 짝궁이다.
요청 객체이며 METHOD 요청 전달 방식을 확인하고 getParameter 파라미터를 받아올 때 사용한다.

 


4. response 

 

다양한 응답을 할 수 있다.
응답 객체로 여러 응답 방법 중 대표적인 out 객체를 생성해서 웹 브라우저 화면에 HTML 문서를 작성할 수 있다.

.sendRedirect(); 리다이렉트 방식으로도 응답 가능하다.

 

5. 파라미터를 옮길 수 있는 내장객체들


데이터를 옮길 수 있는 내장객체들에는 크게 3가지가 있다.


 1) request

 

      새로운 요청을 수행하면 기존의 정보들이 사라진다.
      .getParameter();
       ex) 리다이렉트는 새로운 요청
      .sendRedirect(); 하니까 기존의 값이 사라져 버린다.
↓↓↓요청을 할때마다(버튼을 누를때마다) 데이터가 사라져버리면 안됨!!!
  

 2) session

     요청을 할때마다(버튼을 누를때마다) 데이터가 사라져버리면 안되서

     기존의 창을 닫으면 기존의 정보들이 사라지게 할 때 사용된다.
     시간이 정해져있어서 기존의 창이 유지되더라도, 일정 시간이 지나면 기존의 정보들이 사라진다.
     .setAttribute();, .getAttribute();
     ex) 네이버의 로그인 정보
     ex) 금융권 어플의 로그인 연장 버튼


 3) application



포워드 vs 리다이렉트


1. URL이 변화가 없을 때


페이지 주도권은 포워드 요청을 수행한 페이지가 그대로 가지고 있고,
사용자에게 보여지는 웹 페이지만 넘겨준다.
URL에 변화가 없다.
 == 새로운 요청이 없다.
 == 파라미터가 유지됨
 == request 내장객체가 유지됨
 == 동일한(하나의) 요청

2. URL이 변경되었을 때


 == 새로운 요청이다.
 == request 내장객체가 새로 생성되었다.
 == 다른 요청이다.
 == 파라미터가 삭제되어 유지되지못한다.
※ 없는 파라미터를 요청하는 코드는 에러가 아니다.
 ==just NULL 반환

 

다음은 jsp내장객체를 이용하여 장바구니에 물건을 담는 프로그램을 제작했다.

 

  • 요구 사항

    d.jsp 페이지에서 이름을 입력하여 e.jsp 페이지로 이동합니다.

    e.jsp 페이지에는 상품들이 select 박스에 제공되어있습니다.

    상품은 내가 하고 싶은대로 5개 정도 제공해주세요.

    [장바구니에 추가] 버튼을 눌러서 해당상품을 추가합니다.

    [계산하기] 버튼을 눌러서 지금까지 장바구니에 담았던 상품들을 모두 출력합니다.

    f.jsp 페이지에서 장바구니에 select에서 선택한 상품을 추가 해주세요.

    g.jsp 페이지에서 장바구니에 저장했던 상품들을 출력해주세요.

 

<d.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
	
	<form action="e.jsp" method="POST"> <!-- 폼을 만들어서 -->
	<input type="text" name="name" required placeholder="이름을 입력하세요"> <!-- 이름을 입력받은뒤 -->
	<input type="submit" value="로그인"> <!-- 로그인 버튼을 누르면 -->
	</form> <!-- e.jsp로 넘어간다 -->
	
</body>
</html>

 

<e.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상품 담기 페이지</title>

</head>
<body>
	
	<%
	String name=request.getParameter("name"); // a에서 입력받은 값을 name 변수에 저장
	if(name!=null) { // name이 null이 아니면 // 처음 받아왔다면
		session.setAttribute("member", name); // session member에 저장
	}
	String member=(String)session.getAttribute("member"); // 저장한 값 가져와서 member 변수에 저장
	
	ArrayList<String> datas=(ArrayList<String>)session.getAttribute("datas"); // session datas를 배열으로 형변환해서 datas 배열에 담는다.
	%>
	
	<form action="f.jsp" method="POST"> <!-- 폼 만든 뒤 -->
	<select name="option"> <!-- select박스에 상품 5개 제공 -->
	<option>사과</option>
	<option>참외</option>
	<option>포도</option>
	<option>딸기</option>
	<option>자몽</option>
	</select> <!-- select 한 뒤 -->
	<input type="submit" value="장바구니에 추가"> <!-- 장바구니 추가 누르면 해당상품 장바구니 배열에 추가 -->
	</form>
	<form action="g.jsp" method="POST">
	<input type="submit" value="계산하기">	<!-- 계산하기 버튼 누르면 -->
	</form> <!-- 장바구니 배열 전체 출력페이지로 넘어감 -->
	
	
</body>
</html>

 

<f.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<%
String op=(String)request.getParameter("option"); // select에서 선택한 값을 op배열에 저장

ArrayList<String> datas=(ArrayList<String>)session.getAttribute("datas"); // session에 저장된 datas를 배열로 형변환 후 datas에 저장 
if(datas == null){ // 첫 상품담기 // null이면 상품이 장바구니에 없는 것이니까 
	datas=new ArrayList<String>(); // 생성자를 새로 생성해준 뒤
	session.setAttribute("datas", datas); // session의 datas에 datas배열(현재 비어있어서 null) 저장
}
datas.add(op); // op변수 배열에 저장
out.println("<script>alert('장바구니에 "+op+" 추가');history.go(-1);</script>");
// response.sendRedirect("e.jsp"); // e에 다시 보낸다.
%>

 

<g.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>장바구니 전체 출력 페이지</title>
</head>
<body>
	
	<%
	ArrayList<String> datas=(ArrayList<String>)session.getAttribute("datas"); // session에 저장된 datas를 배열로 형변환 후 datas에 저장 
	session.removeAttribute("datas");
	if(datas!=null) { // datas가 null값이면 아직 상품을 안담은 것이니 null이 아니면 상품이 있다. %>
	장바구니 목록<hr>
	<ul>
		<% for(String data:datas) { // datas 배열에 들어있는 개수 만큼 %>
		<li><%= data // 데이터를 ul 언오더리스트로 리스트출력
		%></li>
		<% } %>
	</ul>
	<%
	}
	else {
		out.println("장바구니에 상품이 없습니다..."); // null값이면 담긴 상품이 하나도 없으니까 없다고 출력
	}
	%>
	<form action="d.jsp" method="POST">
	<input type="submit" value="처음으로 돌아가기">
	</form>
</body>
</html>

 

 

 

2024.08.07