💡 기본적인 요청과 응답, 화면 출력, 세션, 페이지와 애플리케이션 등 모든 웹 프로그래밍에 있어 필수적인 기능
💡 내장 객체는 jsp 페이지가 실행될 때 컨테이너가 자동으로 생성해준다. 별도로 선언하거나 객체로 생성하지 않아도 즉시 사용할 수 있는데 그 이유는 jsp의 실행 과정에서 찾을 수 있다. jsp는 실행될 때 자바 파일인 서블릿으로 변환되어 컴파일된다. 이 변환 과정에서 _jspService()메서드가 생성이 되고 이 메서드안에 관련 코드가 삽입이된다.
내장 객체의 참조 변수를 컨테이너가 생성하는 부분이다.
- 컨테이너가 미리 선언해놓은 참조 변수를 이용해 사용한다.
- 별도의 객체 생성 없이 각 내장 객체의 메서드를 사용할 수 있다.
- JSP문서 안의 <% 스크립틀릿 %> 과 <%= 표현식 %> 에서만 사용할 수 있다.
- <%! 선언부 %> 에서는 즉시 사용하는 건 불가능하고, 매개변수로 전달받아 사용할 수는 있다.
내장 객채 | 타입 | 설명 |
---|---|---|
request | HttpServletRequest | 클라이언트의 요청 정보를 저장한다. |
response | HttpServletResponse | 클라이언트의 요청에 대한 응답 정보를 저장한다. |
out | JspWriter | JSP페이지에 출력할 내용을 담는 출력 스트립이다. |
session | HttpSession | 웹 브라우저 정보를 유지하기 위한 세션 정보를 저장합니다. |
application | ServletContext | 웹 애플리케이션 관련 컨텍스트 정보를 저장합니다. |
pageContext | PageContext | JSP 페이지에 대한 정보를 저장합니다. |
page | Object | JSP 페이지를 구현한 자바 클래스의 인스턴스입니다. |
config | ServletConfig | JSP 페이지에 대한 설정 정보를 저장합니다. |
exception | Throwable | 예외가 발생한 경우에 사용합니다. |
💡 클라이언트(웹 브라우저)가 전송한 요청 정보를 담고 있는 객체이다.
- 클라이언트와 서버에 대한 정보 읽기
- 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
- 요청 헤더 및 쿠키 정보 읽기
💡 클라이언트는 웹 브라우저를 통해 서버 측으로 요청을 하게 됩니다.
이때 요청은 "GET" 방식 혹은 "POST" 방식으로 구분되고,
"URL / 포트번호 / 쿼리스트링 등" 을 명시할 수 있습니다.
📌 현재 이 코드는 클라이언트의 요청을 전송하기 위한 페이지로 html로만 이루어져 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>내장 객체- request</title>
</head>
<body>
<h2> 1. 클라이언트와 서버의 환경정보 읽기</h2>
<a href="./RequestWebInfo.jsp?eng=Hell&han=안녕">
GET 방식 전송
</a>----------📌 get방식으로 요청 (?뒤 파라미터값을 지정)
<br />
<form action="RequestWebInfo.jsp" method="post">
영어 : <input type="text" name="eng" value="Bye">
한글 : <input type="text" name="han" value="잘 가"><br>
<input type="submit" value="POST 방식 전송">
</form>----------📌 post방식으로 요청
<h2> 2. 클라이언트의 요청 매개변수 읽기</h2>
<form method="post" action="RequestParameter.jsp">
아이디 : <input type="text" name="id" value=""><br>
성별 :
<input type="radio" name="sex" value="man">남자
<input type="radio" name="sex" value="woman" checked="checked">여자<br>
관심사항 :
<input type="checkbox" name="favo" value="eco">경제
<input type="checkbox" name="favo" value="pol" checked="checked">정치<br>
<input type="submit" value="전송하기">
</form>----------📌 다양한 input태그 사용
<h2> 3. HTTP 요청 헤더 정보 읽기</h2>
<a href="RequestHeader.jsp">
요청 헤더 정보 읽기
</a>----------📌 HTTP 요청 헤더 읽기
</body>
</html>
- 클라이언트와 서버의 환경정보 읽기
→ get 방식으로 요청을했기 때문에 클릭시 브라우저 url 뒷 부분에 ? input박스에 입력한 값이 담겨져 보이게됩니다.- 클라이언트의 요청 매개변수 읽기
→ post 방식으로 요청을 했기 때문에 클릭시 브라우저 url에 노출이 되지않습니다.
💡 주로 값이 하나만 전송되는 [type: text, radio, password] 경우 getParameter("name값")메서드를 이용하여 변수에 값을 저장할 수있습니다.[checkbox 경우 값이 하나일 경우는 가능]
💡 checkbox 는 보통 다수 선택을 하기 떄문에 getParameterValues("name값")메서드를 이용하여 String배열에 저장을할 수있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>내장 객체- request</title>
</head>
<body>
<%
String id = request.getParameter("id");
----📌 반환된 아이디값을 id변수에 대입한다.
String sex = request.getParameter("sex");
----📌 반환된 성별값을 sex변수에 대입한다.
String[] favo = request.getParmeterValues("favo");
----📌 반환된 관심사항값을 favo 배열변수에 대입한다.
if(favo != null)
{
String favoStr = "";
for(int i=1; i<favo.length; i++)
{
favoStr =+ favo[i] + " ";
}
return favoStr;
}
----📌 반환된 관심사항값을 favo 배열변수에 대입한다.
----📌 대입된 favo배열을 일렬로 나열하기 위해 for문을 이용하여 favoStr변수에 대입한다.
%>
<ul>
<li>아이디 : <%= id %></li>
<li>성별 : <%= sex %></li>
<li>관심사항 : <%= favoStr %></li>
</ul>
</body>
</html>
💡 클라이언트 요청에 대한 응답을 웹브라우저로 보내주는 역할을 한다.
- 페이지 이동을 위한 리다이렉트 기능
- HTTP 헤더에 응답 헤더 추가 기능
(그 외 기능도 있지만 JSP에서는 거의 사용하지 않는다.)
💡 페이지 이동을 위한 리다이렉트 기능이다.
- 페이지를 이동하기 위해 HTML은 <"a href"> 태그를 사용하고 ,
- 자바스크립트에서는 location.href 객체를 사용하고,
- JSP에서는 Response객체의 sendRedirect() 메서드를 이용한다.
📌 ResponseMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>내장객체 - response</title>
<head>
<body>
<h2>1. 로그인 폼</h2>
<% String loginErr = request.getParameter("loginErr")
if(loginErr != null)
{
out.print("로그인 실패");
}
%>
<form action="./ResponseLogin.jsp" method="post">
// 📌로그인버튼 클릭시 ResponseLogin.jsp로 이동한다.
아이디 : <input type="text" name="user_id"><br>
패스워드 : <input type="password" name="user_pwd"><br>
<input type="submit" value="로그인">
</form>
<h2>2. HTTP 응답 헤더 설정하기</h2>
<form action="./ResponseHeader.jsp" method="get">
날짜 형식 : <input type="text" name="add_date" value="2021-10-25"><br>
숫자 형식 : <input type="text" name="add_int" value="8282"><br>
문자 형식 : <input type="text" name="add_str" value="홍길동"><br>
<input type="submit" value="응답 헤더 설정 & 출력">
</form>
</body>
</html>
📌 ResponseLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title><내장 객체 - REsponse</title>
</head>
<body>
<%
String id = request.getParameter("user_id");
String pwd = request.getParmeter("user_pwd");
if(id.equalsIgnoreCase("must") && pwd.equalsIgnoreCase("1234"))
{
response.sendRedirect("ResponseWelcome.jsp");
//📌 요청하여 저장된 id,pwd값이 설정해 놓은must와 1234이 맞다면 ResponseWelcome.jsp로 이동한다.
}
else
{
request.getRequestDispatcher("ResponseMain.jsp?loginErr=1")
.forward(request, response)
//📌 id, pwd값이 일치하지 않다면 요청값(request)과 응답값(response)을 저장하여
// ResponseMain.jsp?loginErr=1 경로로 이동을 하고 이 페이지에서 처리를 할 수 있도록 한다.
}
%>
</body>
</html>
💡 getRequestDispatcher 와 sendRedirect의 차이점은?
📌 공통점 : 페이지 이동 기능
📌 차이점
- getRequestDispatcher : before.jsp에서 서블릿을 통해 after.jsp로 이동할 때 서블릿에서 처리한 데이터를 가지고 이동한다.
- sendRedirect : 데이터를 가지고 가지 않고 페이지 이동만 한다.
📌 로그인성공 페이지 ResponseWelcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>내장 객체 - response</title>
</head>
<body>
<h2>로그인 성공</h2>
</body>
</html>
💡 웹 브라우저에 변수 등의 값을 출력할 때 사용한다.
JSP 를 사용하면서 out 객체보다는 표현식<%= %> 을 더 많이 쓴다.
하지만 스크립틀릿 내에서 변수를 웹 브라우저에 출력하려면 표현식 보다는 out 내장 객체를 사용하는게 더 좋다.
<<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>내장 객체 - out</title>
</head>
<body>
<%
// 버퍼 내용 삭제하기
out.print("출력되지 않는 텍스트"); // 버퍼에 저장
out.clearBuffer(); // 버퍼를 비움(윗 줄의 출력 결과 사라짐)
↳ 📌 위에서 out.print로 출력했으나 clearBuffer()메서드로인해 버퍼 안의 내용을 지워서
위 문자열이 출력되지 않은 것
out.print("<h2>out 내장 객체</h2>");
// 버퍼 크기 정보 확인
out.print("출력 버퍼의 크기 : " + out.getBufferSize() + "<br>");
out.print("남은 버퍼의 크기 : " + out.getRemaining() + "<br>");
// 버퍼 내용 출력
out.flush();
out.print("flush 후 버퍼의 크기 : " + out.getRemaining() + "<br>");
// 다양한 타입의 값 출력
out.print(1);
out.print(false);
out.print('가');
%>
<body>
</html>
💡 웹 애플리케이션당 하나만 생성되고, 모든 JSP 페이지에서 접근할 수 있습니다.
- application객체는 ServletContext 타입입니다.
- 주로 웹 애플리케이션 전반에서 이용하는 정보를 저장 하거나
서버의 정보, 서버의 물리적 정보 등을 얻어오는데 사용합니다.
💡 ServletContext 란?
- 하나의 서블릿이 서블릿 컨테이너와 통신하기 위해 사용되는 메서드들을 가지고있는 클래스이다.
- 즉, 웹 애플리케이션의 등록 정보라고 볼 수 있다.
💡 web.xml이란?
- 웹 애플리케이션에 대한 여러 가지 설정을 저장하는 곳이다.
💡 물리적 경로란?
- 특정 파일이나 폴더의 전체 경로(절대 경로)를 말하며, 파일을 업로드하거나 입출력 작업시에 사용한다.
💡 웹 애플리케이션이란?
- 별도의 응용 소프트웨어(애플리케이션)를 설치하지 않아도 웹 브라우저를 통해 응용 소프트웨어의 기능을 이용할 수 있도록 만든 웹 서비스가 웹 애플리케이션이다.
<?xml version="1.0" encoding="UF-8"?>
<web-app xmlns:xsi= ....생략>
<display-name>MusHaveJSP</display-name>
<welcome-file-list>
.... 생략
</welcome-file-list>
<context-param>
<param-name>INIT_PARAM</param-name>
<param-value>web.xml에 저장한 초기화 매개변수</param-value>
</context-param>
</web-app>
<"context-param"> 태그를 만들고 , 그 안에 초기화 매개변수의 이름과, 값을 입력하면 된다.
💡 errorPage, isErrorPage 속성 관련하여 오류페이지를 처리했습니다.
이번에는 exception 객체를 이용하여 요류페이지를 처리해보겠습니다.
JSP로 프로그래밍을 하다 보면 404, 405, 500번 대 에러페이지가 발생 하는 경우가 있습니다.
위 코드 만으로 대략 에러 의미를 알 수 있는데 아래에서 에러 의미와 조치방법에 대하여 알아보겠습니다.
HTTP 에러 코드 | 에러 의미 | 조치 방법 |
---|---|---|
404 | Not Found : 클라이언트가 요청한 경로에서 문서를 찾을 수 없습니다. | URL상의 경로명이나 파일명이 제대로 입력되었는지 확인합니다. |
405 | Method Not Allowed : 혀용되지 않는 메서드라는 뜻으로, GET 방식 혹은 POST 방식으로 요청했는데 이를 처리할 컨트롤러가 없습니다. | 주로 서블릿으로 개발할 때 발생하게 되는데 doGet(), doPost() 메서드가 적절히 오버라이딩 되었는지 확이합니다. |
500 | Internal Server Error : 서버 내부 오류로, 코드에 오타가 있거나 로직에 문제가 있어 웹 서버가 요청 사항을 수행할 수 없습니다. | 가장 많이 발생하는 에러로, 개발 중인 코드를 전반적으로 확인하여 오류룰 처리해야 합니다. |
request 객체 : 클라이언트의 요청을 받거나 웹 브라우저에 대한 정보 혹은 요청 헤어데 대한 정보를 읽을 때 사용한다.
response 객체 : 요청에 대한 응답을 웹 브라우저로 보낼 때 사용한다. 페이지 이동이나 응답 헤더를 추가할 때도 사용한다.
out 객체 : 변수 등의 값을 웹 브라우저에 출력할 때 주로 사용한다.
exception 객체 : 예외 처리를 위해 사용한다.