벡엔드 웹프로그래밍/JSP

JSP 웹프로그래밍 60일차 (25/2/11)

wkun 2025. 2. 11. 17:59

contents

 

PART 02 JSP 기본문법

chapter 05 내장 객체: 도서 상세 정보 표시하기

01.내장 객체의 개요

02.request 내장 객체

03.response 내장 객체

04.out 내장 객체

05.도서 상세 정보 표시하기

 

 

---------------------------------------

 

 

PART 02 JSP 기본문법

 

chapter 05 내장 객체: 도서 상세 정보 표시하기

 

01.내장 객체의 개요

-내장 객체(implicit object)는 JSP 페이지에서 사용할 수 있도록 JSP 컨테이너에 미지 정의 된 객체로 그 종류가 다양함. JSP 페이지가 서블릿 프로그램으로 번역될 때 JSP 컨테이너가 자동으로 내장 객체를 멤버 변수, 메소드 매개변수 등의 각종 참조 변수(객체)로 포함함. 그래서 JSP 페이지에 별도의 import 문 없이 자유롭게 사용할 수 있음. 그리고 스크립틀릿 태그나 표현문 태그에 선언을 하거나 객체를 생성하지 않고도 직접 호출하여 사용할 수 있음

 

◎내장 객체의 종류

내장 객체 반환 유형 설명
request: 저장(1) javax.servlet.http.HttpServletRequest 웹 브라우저의 HTTP 요청 정보를 저장함
response: 저장(1) javax.servlet.http.HttpServletResponse 웹 브라우저의 HTTP 요청에 대한 응답 정보를 저장함
out: 출력 javax.servlet.jsp.jsp.jspWriter JSP 페이지에 출력할 내용을 담고 있는 출력 스트림임
session: 저장(n) javax.servlet.http.HttpSession 웹 브라우저의 정보를 유지하기 위한 세션 정보를 저장함
application: 저장(~) javax.servlet.ServletContext 웹 어플리케이션의 콘텍스트 정보를 저장함
pageContext javax.servlet.jsp.PageContext JSP 페이지의 정보를 저장함
page java.lang.Object JSP 페이지를 구현한 자바 클래스로 JSP 페이지 자체를 나타냄
config javax.servlet.ServletConfig JSP 페이지의 설정 정보를 저장함
exception java.lang.Throwable JSP 페이지의 예외 발생을 처리함

*page 정보: config/exception = <%@ page %>

 

-JSP 페이지가 자바 서블릿 프로그램으로 번역될 때 내장 객체가 자동으로 포함된 것을 확인할 수 있음

-내장 객체는 서블릿 프로그램에서 모두 _jspService() 메소드 내부에 있음. 그리고 메소드 매개변수인 request, reponse를 비롯해 pageContext, session, application, config, out, page 등은 메소드 내에서 참조할 수 있는 참조 변수임

-모든 내장 객체는 JSP 컨테이너가 관리하는 객체로, 이 중 request, session, application, pageContext를 이용하여 속성을 관리할 수 있음. 속성은 각각의 내장 객체가 존재하는 동안 JSP 페이지 사이에서 정보를 주고받거나 공유하는 데 사용됨. 이렇게 속성을 처리하는 메소드는 다음과 같이 네 종류임

 

*public (1)static     (2)데이터

                instance      void

이름()

함수 case1 : 생성자

                      일반함수 = case2 +case3

함수 case2: instance

                    static

함수 case3: set(void)

                    get: return

 

속성 처리 메소드의 종류

메소드 반환 유형 설명
setAttribute(String name, Object value) void 해당 내장 객체의 속성 이름이 name인 속성 값을 value로 저장함
getAttribute(String name) Object 해당 내장 객체의 속성 이름이 name인 속성 값을 가져옴
removeAttribute(String name) void 해당 내장 객체의 속성 이름이 name인 속성을 삭제함
getAttributeNames(): keys 목록 java.util.Enumeration 해당 내장 객체의 모든 속성 이름은 가져옴(단, pageContext 내장 객체는 이 메소드를 제공하지 않음)

 

02.request 내장 객체

-request 내장 객체는 JSP 페이지에서 가장 많이 사용되는 기본 내장 객체로, 웹 브라우저에서 서버의 JSP 페이지로 전달하는 정보를 저장함. 즉 폼 페이지로부터 입력된 데이터를 전달하는 요청 파라미터 값을 JSP 페이지로 가져옴. JSP 컨테이너는 웹 브라우저에서 서버로 전달되는 정보를 처리하기 위해 jakarta.servlet.http.HttpServletRequest 객체 타입의 request 내장 객체를 사용하여 사용자의 요구 사항을 얻어냄

 

1)요청 파라미터 관련 메소드

-요청 파라미터는 사용자가 폼 페이지에 데이터를 입력한 후 서버에 전송할 때 전달되는 폼페이지의 입력된 정보 형태를 말함. 이러한 요청 파라미터는 <name=value> 형식으로 웹 브라우저에서 서버의 JSP 페이지로 전송됨

-요청 파라미터는 폼 페이지에서 <input type="text"···>처럼 입력 양식이 텍스트 유형일 때 값을 입력하지 않으면 서버로 빈 문자열이 전송됨. 하지만 체크 박스와 라디오 버튼 유형일 때 어떤 것도 선택하지 않고 전송하면 요청 파라미터 자체가 전달되지 않음

 

요청 파라미터 관련 메소드의 종류

요청 파라미터 관련 메소드  반환 유형 설명
getParameter(String name) String 요청 파라미터 이름이 name인 값을 전달받음. 요청 파라미터 값이 없으면 null  반환
getParameterValues(String name) String[] 모든 요청 파라미터 이름이 name인 값을 배열 형태로 전달받음. 요청 파라미터 값이 없으면 null 반환
getParameterNames() java.util.Enumeration 모든 요청 파라미터의 이름과 값을 Enumeration 객체 타입으로 전달받음
getParameterMap() java.util.Map 모든 요청 파라미터의 이름과 값을 Map 객체 타입으로 전달받음[Map 객체 타입은 (요청 파라미터 이름, 값 형식으로 구성됨)

 

-request 내장 객체의 getParameter() 메소드를 이용하여 폼 페이지에서 입력된 데이터를 전달하는 요청 파라미터 값을 출력함. 폼의 입력  양식에 '홍길순'을 입력하고 <전송>을 클릭하면 요청 파라미터가 '입력 양식 이름=값' 형식인 'name=홍길순'으로 전송되고, JSP 페이지는 전송된 요청 파라미터 이름 name을 통해 값을 받음. 만약 폼의 입력 양식 값을 입력하지 않으면 요청 파라미터의 값으로 빈 문자열이 전송됨

cf) <a> -> 요청

     <form> -> 요청+파라미터

http://localhost:8080 / project / process.jsp?name=홍길순

                                     ↓        ↓                    ↓ 

                          프로젝트명 (/)webapp      (?)파라미터 시작 key value

 

예제 5-1.request 내장 객체로 폼 페이지로부터 아이디와 비밀번호를 전송받아 출력하기

http://localhost:8080/JSPBook/ch05-1?id=aaa&password=bbb

 

1)index.html에 코드 삽입: <a href="요청명"></a>

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>


<style>
body{
padding-left: 30%;
}
</style>
</head>
<body>
<h1>실습리스트</h1>
<h3>챕터2</h3>
<p><a href="ch02_1">실습 2-1</a></p>
<p><a href="ch02_2">실습 2-2</a></p>
<p><a href="ch02_3">실습 2-3</a></p>
<p><a href="ch02_4">실습 2-4</a></p>
<p><a href="ch02_5">실습 2-5</a></p>
<p><a href="ch02_6">실습 2-6</a></p>
<p><a href="ch02_7">실습 2-7</a></p>
<h3>챕터3</h3>
<p><a href="ch03_3">실습 3-3</a></p>
<p><a href="ch03_6">실습 3-6</a></p>
<p><a href="ch03_7">실습 3-7</a></p>
<p><a href="ch03_9">실습 3-9</a></p>
<p><a href="ch03_10">실습 3-10</a></p>
<p><a href="ch03_11">실습 3-11</a></p>
<h3>챕터4</h3>
<p><a href="ch04_1">실습 4-1</a></p>
<p><a href="ch04_3">실습 4-3</a></p>
<p><a href="ch04_4">실습 4-4</a></p>
<p><a href="ch04_5">실습 4-5</a></p>
<p><a href="ch04_6">실습 4-6</a></p>
<p><a href="ch04_7">실습 4-7</a></p>
<p><a href="ch04_8">실습 4-8</a></p>
<h3>챕터5</h3>
<p><a href="ch05_1">실습 5-1</a></p>
<p><a href="ch05_2">실습 5-2</a></p>
<p><a href="ch05_3">실습 5-3</a></p>
<p><a href="ch05_4">실습 5-4</a></p>
</body>
</html>

 

2)controller: doget(), dopost()

controller

package controller.ch05;


import java.io.IOException;


import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/ch05_1")
public class ch05_1_controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget 입장");
RequestDispatcher ds = req.getRequestDispatcher("ch05/request01.jsp");
ds.forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost 입장");
//http://localhost:8080/JSPBook/ch05_1?id=aaa&password=bbb
//전처리(가공): 변수에 담음
req.setCharacterEncoding("utf-8"); //한글깨지지않게 설정
String id=req.getParameter("id");
String pw=req.getParameter("password");
System.out.println(id);
System.out.println(pw);

//뷰이동
req.setAttribute("id", id); //저장
req.setAttribute("pw", pw);
RequestDispatcher ds = req.getRequestDispatcher("ch05/request01_process.jsp");
ds.forward(req, resp);

}


}

*request.setCharacterEncoding("utf-8"); : 폼에서 한글 입력을 정상적으로 처리하려면 반드시 필요함

 

3)jsp

 

JSPBook/src/main/webapp/ch05/request01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Implicit Objects</title>
</head>
<body>
<form action="ch05_1" method="post">
<p> 아 이 디 : <input type="text" name="id">
<p> 비밀번호 : <input type="text" name="password">
<p> <input type="submit" value="전송" />
</form>
</body>
</html>

 

JSPBook/src/main/webapp/ch05/request01_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Implicit Objects</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8"); //한글깨지지않게 설정
String id = (String) request.getAttribute("id"); //원래 데이터 타입으로 강제 형변환(Casting)
String pw = (String) request.getAttribute("pw");
%>
<p> 아이디 : <%=id %>
<p> 비밀번호 : <%=pw %>
</body>
</html>

 

실행 결과

 

2)요청 HTTP 헤더 관련 메소드

-웹 브라우저는 HTTP 헤더에 부가적인 정보를 담아 서버로 전송함. request 내장 객체는 헤더 정보나 쿠키 관련 정보를 얻을 수 있는 메소드를 제공함

 

요청 HTTP 헤더 관련 메소드의 종류

요청 HTTP 헤더 관련 메소드 반환 유형 설명
getHeader(String name) String 설정한 name의 헤더 값을 가져옴
getHeaders(String name) Enumeration 설정한 name의 헤더 목록 값을 가져옴
getHeaderNames() Enumeration 모든 헤더 이름을 가져옴
getIntHeader(String name) int 설정한 name의 헤더 값을 정수로 가져옴
getDateHeader(String name) long 설정한 name의 헤더 값을 시간 값으로 가져옴
getCookies() javax.servlet.http.Cookie 모든 쿠키 값을 가져옴

 

 

예제 5-2.request 내장 객체로 모든 HTTP 헤더 정보 값 출력하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Implicit Objects</title>
</head>
<body>
<%     타입                                              keys
Enumeration en = request.getHeaderNames();
while(en.hasMoreElements()){  -> 안에 있는 값을 모를 때
String headerName=(String) en.nextElement();
String headerValue=request.getHeader(headerName);
%>
<%=headerName %> : <%=headerValue %><br>
<%
}
%>
----------------------------------------------------------<br>
<% String headerValue = request.getHeader("accept"); %> <-값을 알 때
<%= headerValue %>


</body>
</html>

 

*hasMoreElements() -> hasNext(): 다음커서 이동

 nextElement() -> next() 반환

 

while(en.hasMoreElements()) : 안에 있는 값을 모를 때          Enumeration타입의 데이터

                               ↑

-> bof
 key: value 
[host: localhost:8080
connection
user-agent
accept

accept-language
cookie

....]
-> eof

 

실행 결과

 

3)웹 브라우저/서버 관련 메소드

-request 내장 객체는 웹 브라우저의 요청 및 서버 관련 정보를 얻을 수 있는 메소드를 제공함

 

웹 브라우저/서버 관련 메소드의 종류

웹브라우저/서버 관련 메소드 반환 유형 설명
getRemoteAddr() String 웹 브라우저의 IP 주소를 가져옴
getContentLength() long 웹 브라우저의 요청 파라미터 길이를 가져옴
getCharacterEncoding() String 웹 브라우저의 문자 인코딩을 가져옴
getContentType() String 웹 브라우저의 콘텐츠 유형을 가져옴
getProtocol() String 웹 브라우저의 요청 프로토콜을 가져옴
getMethod() String 웹 브라우저의 HTTP 요청 메소드(GET, POST)를 가져옴
getRequestURI() String 웹 브라우저가 요청한 URI 경로를 가져옴
getContextPath() String 현재 JSP 페이지의 웹 애플리케이션 콘텍스트 경로를 가져옴
getServerName() String 서버 이름을 가져옴
getServerport() int 실행 중인 서버 포트 번호를 가져옴
getQueryString() String 웹 브라우저의 전체 요청 파라미터 문자열[물음표(?) 다음 URL에 할당된 문자열]을 가져옴

*URL안에 URI 포함

cf) form -> controller -> 뷰

 

예제 5-3.request 내장 객체로 모든 웹 브라우저 및 서버 정보 값 출력하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Implicit Object</title>
</head>
<body>
<p>클라이언트 IP : <%=request.getRemoteAddr() %></p>
<p>요청 정보 길이 : <%=request.getContentLength() %></p>
<p>요청 정보 인코딩 : <%=request.getCharacterEncoding() %></p>
<p>요청 정보 콘텐츠 유형 : <%=request.getContentType() %></p>
<p>요청 정보 프로토콜 : <%=request.getProtocol() %></p>
<p>요청 정보 전송방식 : <%=request.getMethod() %></p>
<p>요청 URI : <%=request.getRequestURI() %></p>
<p>콘테스트 경로 : <%=request.getContextPath() %></p>
<p>서버이름 : <%=request.getServerName() %></p>
<p>서버포트 : <%=request.getServerPort() %></p>
<p>쿼리문 : <%=request.getQueryString() %></p>
</body>
</html>

 

실행 결과

 

◎속성을 공유할 수 있는 유효 범위(scope)

-내장 객체가 존재하는 동안 사용할 수 있는 속성의 영역(scope)은 page, request, session, application임

영역 내장 객체  속성의 유효 범위
page pageContext 해당 페이지가 클라이언트에게 서비스를 제공하는 동안 유효함
request request 클라이언트의 요청이 처리되는 동안 유효함 cf)응답하기 전까지 1번
session session 세션이 유지되는 동안 유효함 cf)n번
application application 웹 앨플리케이션이 실행되고 있는 동안 유효함

           요청

*HTML   ->   Server

                  :controller  request

            <-

           응답 

           

03.response 내장 객체

-response 내장 객체는 사용자의 요청을 처리한 결과를 서버에서 웹 브라우저로 전달하는 정보를 저장함. 즉 서버는 응답 헤더와 요청 처리 결과 데이터를 웹 브라우저로 보냄

-JSP 컨테이너는 서버에서 웹 브라우저로 응답하는 정보를 처리하기 위해 jakarta.servlet.http.HttpServletResponse 객체 타입의 response 내장 객체를 사용하여 사용자의 요청에 응답함

 

1)페이지 이동 관련 메소드

-사용자가 새로운 페이지를 요청할 때와 같이 페이지를 강제로 이동하는 것을 리다이렉션(redirection)이라고 함. 서버는 웹 브라우저에 다른 페이지로 강제 이동하도록 reponse 내장 객체의 리다이렉션 메소드를 제공함. 페이지 이동 시에는 문자 인코딩을 알맞게 설정해야 함

 

◎페이지 이동 방법

1)포워드(forward) 방식

-현재 JSP 페이지에서 이동할 URL로 요청 정보를 그대로 전달하므로 사용자가 최초로 요청한 정보가 이동된 URL에서도 유효함. 그러나 이동된 URL이 웹 브라우저의 주소 창에 나타나지 않고 처음 요청한 URL이 나타나기 때문에 이동 여부를 사용자가 알 수 없음

<jsp:forward page="이동할 페이지" />  -> request 사용x

 

cf) RequestDispatcher ds = req.getRequestDispatcher("ch05/request01.jsp");  -> request(o)
ds.forward(req, resp);

 

2)리다이렉트(redirect) 방식

-처음 요청받은 현재 JSP 페이지로부터 이동할 URL을 웹 브라우저로 반환함. 이때 웹 브라우저에서는 새로운 요청을 생성하여 이동할 URL에 다시 요청을 전송하므로 처음 보낸 요청 정보가 이동된 URL에서는 유효하지 않음. 즉 클라이언트가 새로 페이지를 요청한 것과 같은 방식으로 페이지가 이동함. 따라서 이동된 URL이 웹 브라우저의 주소 창에 보이는 것임

response.sendRedirect("이동할 페이지")  -> U턴: 새로운 URL로 바뀜(새 controller)

*서버 나갔다 들어옴

 

◎페이지 이동 관련 메소드의 종류

페이지 이동 관련 메소드 반환 유형 설명
sendRedirect(String url) void 설정한 URL 페이지로 강제 이동함

 

예제 5-4.response 내장 객체로 페이지 이동하기

JSPBook/src/main/webapp/ch05/response01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Implicit Objects</title>
</head>
<body>
<form action="" method="post">
<p> 아 이 디 : <input type="text" name="id">
<p> 비밀번호 : <input type="text" name="password">
<p> <input type="submit" value="전송" />
</form>
</body>
</html>

 

                       ch05_4_controller.java

package controller.ch05;


import java.io.IOException;


import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/ch05_4")
public class ch05_4_controller extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget 입장");
RequestDispatcher ds = req.getRequestDispatcher("ch05/response01.jsp");
ds.forward(req, resp);


}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost 입장");
// RequestDispatcher ds = req.getRequestDispatcher("ch05/response01_process.jsp");
// ds.forward(req, resp);
String id=req.getParameter("id");
String password=req.getParameter("password");
if(id.equals("admin")&&password.equals("1234")) {
resp.sendRedirect("ch04_1");
}else {
resp.sendRedirect("ch03_3"); //controller 에서 controller 되돌아감
}
}


}

*request.sendRedirect("ch03_3"); .jsp 파일 경로가 아닌 controller 경로

ch04_1_controller.java

package controller.ch04;


import java.io.IOException;


import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/ch04_1")
public class ch04_1_controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

RequestDispatcher ds = req.getRequestDispatcher("ch04/forward.jsp");
ds.forward(req, resp);
}


}

 

ch03_4_controller.java

package controller.ch03;


import java.io.IOException;


import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/ch03_3")
public class ch03_3_controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


RequestDispatcher ds = req.getRequestDispatcher("ch03/page_import.jsp");
ds.forward(req, resp);
}


}

 

실행 결과

 

아이디: admin/ 비밀번호: 1234 입력 -> 전송

 

다른 값 입력

 

2)응답 HTTP 헤더 관련 메소드

-응답 HTTP 헤더 관련 메소드는 서버가 웹 브라우저에 응답하는 정보에 헤더를 추가하는 기능을 제공함. 헤더 정보에는 주로 서버에 대한 정보가 저장되어 있음

 

응답 HTTP 헤더 관련 메소드의 종류

응답 HTTP 헤더 관련 메소드 반환 유형 설명
addCookie(Cookie cookie) void 쿠키를 추가함
addDateHeader(String name, long date) void 설정한 헤더 이름 name에 날짜/시간을 추가함
addHeader(String name, String value) void 설정한 헤더 이름 name에 vlaue를 추가함
addIntHeader(String name, int value) void 설정한 헤더 이름 name에 정수 값 value를 추가함
setDateHeader(String name, long date) void 설정한 헤더 이름 name에 날짜/시간을 설정함
setHeader(String name, String value) void 설정한 헤더 이름 name에 문자열 값 value를 설정함
setIntHeader(String name, int value) void 설정한 헤더 이름 name에 정수 값 value를 설정함
containsHeader(String name) boolean 설정한 헤더 이름 name이 HTTP 헤더에 포함되었는지 여부를 확인함. 포함하고 있는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환함
getHeader(String name) String 설정한 헤더 이름 name 값을 가져옴

 

 

예제 5-5.response 내장 객체로 5초마다 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>
<p> 이 페이지는 5초마다 새로고침 됩니다.
<%
response.setIntHeader("Refresh", 5);
%>
<p> <%=(new java.util.Date()) %>
</body>
</html>

*Refresh: ~초 마다 ex)광고

 

실행 결과

 

3)응답 콘테츠 관련 메소드

-response 내장 객체는 웹 브라우저로 응답하기 위해 MIME 유형, 문자 인코딩, 오류 메시지, 상태 코드 등을 설정하고 가져오는 응답 콘텐츠 관련 메소드를 제공함. 다음은 response 내장 객체의 응답 콘테츠 관련 메소드를 이용하여 웹 브라우저의 콘텐츠 정보를 설정하는 예임. 문자 인코딩과 콘텐츠 유형에 대해 설정하고 각각의 값을 가져와 출력함

 

응답 콘텐츠 관련 메소드

응답 콘텐츠 관련 메소드 반환 유형 설명
setContentType(String type) void 웹 브라우저에 응답할 MIME 유형을 설정함
getContentType() String 웹 브라우저에 응답할 MIME 유형을 가져옴
setCharacterEncoding(String charset) void 웹 브라우저에 응답할 문자 인코딩을 설정함
getCharacterEncoding() String 웹 브라우저에 응답할 문자 인코딩을 가져옴
sendError(int status_code, String message) void 웹 브라우저에 응답할 오류(코드 및 오류 메시지)를 설정함
setStatus(int statuscode) void 웹 브라우저에 응답할 HTTP 코드를 설정함

 

04.out 내장 객체

*출력방법: 1.<%  out %> 2.<%= %> 3.${ }

 

-out 내장 객체는 웹 브라우저에 데이터를 전송하는 출력 스트림 객체임. JSP 컨테이너는 JSP 페이지에 사용되는 모든 표현문 태그와 HTML, 일반 텍스트 등을 out 내장 객체를 통해 웹 브라우저에 그대로 전달함. out 내장 객체는 스크립틀릿 태그에 사용하여 단순히 값을 출력하는 표현문 태그(<%= %>)와 같은 결과를 얻을 수 있음

 

out 내장 객체의 메소드의 종류

out 내장 객체 메소드 반환 유형 설명
print(String str) void 설정된 str 값을 웹 브라우저에 출력함
println(String str) void 설정된 str 값을 웹 브라우저에 출력함. 이때 줄 바꿈(\r\n 또는 \n)이 적용되지 않음
newLine() void 줄바꿈(\r\n 또는 \n)울 출력함
getBufferSize() int 현재 출력 버퍼의 크기를 가져옴
getRemaining() int 현재 남아 있는 출력 버퍼의 크기를 가져옴
clear() void 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 않고 비움. 만약 버퍼가 이미 플러시되었다면 IOException이 발생함
clearBuffer() void 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 않고 비움. 만약 버퍼가 이미 플러시되었다면 IOException이 발생하지 않음
flush() void 현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하고 비움
isAutoFlush() boolean 출력 버퍼가 채워졌을 때의 처리를 결정함. 자동으로 플러시하는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환함

 

-out 내장 객체의 println() 메소드를 이용하여 설정된 문자열을 출력함. out 내장 객체는 스크립틀릿 태그 내에 사용하여 표현식 태그처럼 결과 값을 출력함. 이때 println() 메소드에는 줄 바꿈이 적용되지 않기 때문에 줄 바꿈을 위해 <br> 태그를 사용함

 

05.도서 상세 정보 표시하기

-내장 객체를 적용하여 북마켓의 도서 목록 중에서 선택한 도서의 상세 정보를 출력하고, 북마켓 시작 페이지의 현재 접속 시각이 자동으로 갱신되게 함

 

예제 5-9.도서 상세 정보 표시하기

 

1)도서 상세 정보를 가져오는 메소드 만들기

BookMarket/src/main/java/dao/BookRepository.java

package dao;


import dto.Book;
import java.util.ArrayList;


public class BookRepository {


private ArrayList<Book> listOfBooks = new ArrayList<Book>();


public BookRepository() {
Book book1 = new Book("ISBN1234", "C# 프로그래밍", 27000);
book1.setAuthour("우재남");
book1.setDescription(
"C#을 처음 접하는 독자를 대상으로 일대일 수업처럼 자세히 설명한 책이다. 꼭 알아야 할 핵심 개념은 기본 예제로 최대한 쉽게 설명했으며, 중요한 내용은 응용 예제, 퀴즈, 셀프 스터디, 예제 모음으로 한번 더 복습할 수 있다.");
book1.setPublisher("한빛아카데미");
book1.setCategory("IT모바일");
book1.setUnitsInStock(1000);
book1.setReleaseDate("2022/10/06");

Book book2 = new Book("ISBN1235", "자바마스터", 30000);
book2.setAuthour("송미영");
book2.setDescription(
"자바를 처음 배우는 학생을 위해 자바의 기본 개념과 실습 예제를 그림을 이용하여 쉽게 설명합니다. 자바의 이론적 개념→기본 예제→프로젝트 순으로 단계별 학습이 가능하며, 각 챕터의 프로젝트를 실습하면서 온라인 서점을 완성할 수 있도록 구성하였습니다.");
book2.setPublisher("한빛아카데미");
book2.setCategory("IT모바일");
book2.setUnitsInStock(1000);
book2.setReleaseDate("2023/01/01");


Book book3 = new Book("ISBN1236", "파이썬 프로그래밍", 30000);
book3.setAuthour("최성철");
book3.setDescription(
"파이썬으로 프로그래밍을 시작하는 입문자가 쉽게 이해할 수 있도록 기본 개념을 상세하게 설명하며, 다양한 예제를 제시합니다. 또한 프로그래밍의 기초 원리를 이해하면서 파이썬으로 데이터를 처리하는 기법도 배웁니다.");
book3.setPublisher("한빛아카데미");
book3.setCategory("IT모바일");
book3.setUnitsInStock(1000);
book3.setReleaseDate("2023/01/01");


listOfBooks.add(book1);
listOfBooks.add(book2);
listOfBooks.add(book3);


}


public ArrayList<Book> getAllBooks() {
return listOfBooks;
}

-------------------------- 추가 -------------------------------

public Book getBookById(String bookId) {
Book bookById=null;

for(int i=0; i<listOfBooks.size(); i++) {
Book book=listOfBooks.get(i);
if(book!=null && book.getBookId()!=null && book.getBookId().equals(bookId)) {
bookById=book;
break;
}
}
return bookById;
}
}

 

2)도서 상세 정보 버튼 만들기

BookMarket/src/main/webapp/books.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="dto.Book" %>
<jsp:useBean id="bookDAO" class="dao.BookRepository" scope="session" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src=" " crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<title>도서 목록</title>
</head>
<body>
<div class="container py-4">
<%@ include file="menu.jsp" %>
<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">도서목록</h1>
<p class="col=md-8 fs-4">BookList</p>
</div>
</div>
<%
ArrayList<Book> listOfBooks = bookDAO.getAllBooks();
%>


<div class="row align-items-md-stretch text-center">
<%
for(int i=0; i<listOfBooks.size(); i++){
Book book=listOfBooks.get(i);


%>
<div class="col-md-4">
<div class="h-100 p-2">
<h5><b><%=book.getName() %></b></h5>
<p> <%=book.getAuthor() %>
<br><%=book.getPublisher() %> : <%=book.getUnitPrice() %>
<p> <%=book.getDescription().substring(0,60) %>...
<p><%=book.getUnitPrice() %>

-------------------------- 추가 -------------------------------

<p> <a href="./book.jsp?id=<%=book.getBookId() %>" class="btn btn-secondary" role="button">상세 정보 &raquo;</a>
</div>
</div>
<%
}
%>
</div>
<%@ include file="footer.jsp" %>
</div>
</body>
</html>

*링크: 마우스 올리면 링크 주소 나옴

 

3)도서 상세 정보 페이지 만들기

BookMarket/src/main/webapp/book.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="dto.Book" %>
<jsp:useBean id="bookDAO" class="dao.BookRepository" scope="session" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src=" " crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">


<title>도서 정보</title>
</head>
<body>
<div class="container py-4">
<%@ include file="menu.jsp" %>

<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">도서정보</h1>
<p class="col-md-8 fs-4">BookInfo</p>
</div>
</div>

<%
String id=request.getParameter("id");
Book book=bookDAO.getBookById(id);
%>

<div class="row align-items-md-stretch">
<div class="col-md-12">
<h3><b><%=book.getName() %></b></h3>
<p> <%=book.getDescription() %>
<p> <b>도서코드 : </b><span class="badge text-bg-danger">
<%= book.getBookId()%></span>
<p> <b>저자</b> : <%=book.getAuthor() %>
<p> <b>출판사</b> : <%=book.getPublisher() %>
<p> <b>출판일</b> : <%=book.getReleaseDate() %>
<p> <b>분류</b> : <%=book.getCategory() %>
<p> <b>재고수</b> : <%=book.getUnitsInStock() %>
<h4><%=book.getUnitPrice() %></h4>
<p> <a href="#" class="btn btn-info">도서주문 &raquo;</a>
<a href=" ./book.jsp" class="btn btn-secondary" >도서 목록 &raquo;</a>
</div>
</div>
<jsp:include page="footer.jsp" />
</div>
</body>
</html>

 

4)시작 페이지의 접속 시각 자동 갱신하기

BookMarket/src/main/webapp/welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome</title>
<script src=" " crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<%!
String greeting = "도서 쇼핑몰에 오신 것을 환영합니다";
String tagline = "Welcome to Web Market!";
%>
<div class="container py-4">
<%@ include file="menu.jsp" %>
<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold"><%= greeting %></h1>
<p class="col-md-8 fs-4">BookMarket</p>
</div>
</div>
<div class="row align-items-md-stretch text-center">
<div class="col-md-12">
<div class="h-100 p-5">
<h3><%= tagline %></h3>

-------------------------- 추가 -------------------------------

response.setIntHeader("Refresh", 5);
Date day=new java.util.Date();
String am_pm;
int hour=day.getHours();
int minute=day.getMinutes();
int second=day.getSeconds();
if(hour / 12==0){
am_pm="AM";
}else{
am_pm="PM";
hour=hour - 12;
}
String CT=hour + ":" + minute + ":" + second + " " + am_pm;
out.println("현재 접속 시각: " + CT + "\n");

%>
</div>
</div>
</div>
<%@ include file="footer.jsp" %>
</div>
</body>
</html>

 

실행 결과