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">상세 정보 »</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">도서주문 »</a> <a href=" ./book.jsp" class="btn btn-secondary" >도서 목록 »</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> |
실행 결과
![]() |
![]() |
'벡엔드 웹프로그래밍 > JSP' 카테고리의 다른 글
| JSP 웹프로그래밍 62일차 (25/2/13) (0) | 2025.02.13 |
|---|---|
| JSP 웹프로그래밍 61일차 (25/2/12) (0) | 2025.02.12 |
| JSP 웹프로그래밍 59일차 (25/2/10) (2) | 2025.02.10 |
| JSP 웹프로그래밍 58일차 (25/2/7) (0) | 2025.02.07 |
| JSP 웹프로그래밍 57일차 (25/2/6) (1) | 2025.02.06 |









