56_[jsp servlet]jsp 내장 객체
JSP 내장 객체
- 서블릿 컨테이너가 JSP가 서블릿 파일로 변환될 때, 서블릿 객체가 자동으로 생성해주기 때문에, 우리는 바로 사용이 가능!
- 서블릿 컨테이너가 만든 서블릿 위치 : eclipse\web_workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\jsp-study\org\apache\jsp
- _jspService() 내부에서 객체화됨!
- jsp의 내장객체 종류
I. 입출력 관련 객체
- out 내장 객체(JspWriter 클래스의 객체!)
- 서버 ▶️ 클라이언트 로 열려있는 출력 스트림
- JSP 실행 결과를 클라이언트의 브라우저로 출력할 때 가장 효과적으로 사용할 수 있는 객체
- 더이상 서블릿에서처럼 아래와 같은 객체를 생성하여 사용하지 않아도 됨!
PrinterWriter out = response.getWrtier();
- request 내장 객체
- 클라이언트 ▶️ 서버로 전송되는 데이터를 알 수 있도록 해주는 객체
(1)
request 내장 객체를 통해서 브라우저 요청시 요청에 대한 정보를 알 수 있도록 도와주는 메서드들
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Server Info</title>
</head>
<body>
<%="<p>컨텍스트 패스: "+request.getContextPath()+"</p>" %>
<%="<p>요청 방식: "+request.getMethod()+"</p>" %>
<%="<p>요청 URL: "+request.getRequestURL()+"</p>" %>
<%="<p>요청 URI: "+request.getRequestURI()+"</p>" %>
<%="<p>쿼리스트링: "+request.getQueryString()+"</p>" %>
<%="<p>Login.jsp 로컬 RequestDispacher 객체: "+request.getRequestDispatcher("Login.jsp")+"</p>" %>
<%="<p>요청한 호스트의 완전한 이름: "+request.getRemoteHost()+"</p>" %>
<%="<p>요청한 호스트의 네트워크 주소: "+request.getRemoteAddr()+"</p>" %>
<%="<p>요청한 사용자의 이름: "+request.getRemoteUser()+"</p>" %>
<%="<p>세션: "+request.getSession()+"</p>" %>
<%="<p>서버이름: "+request.getServerName()+"</p>" %>
<%="<p>프로토콜: "+request.getProtocol()+"</p>" %>
</body>
</html>
(2) request 객체의 요청 파라미터 관련 메서드
- response 내장 객체
- 클라이언트에 대한 응답 처리
- response 객체의 기능 중 리다이렉트 기능(sendRedirect() 메서드)을 多 이용!
https://beginnersbook.com/2013/11/jsp-implicit-object-response-with-examples/
🍑 로그인 성공 실패에 따른 서로 다른 페이지 이동을 위해서 리다이렉트 기능을 사용하는 경우 多
로그인 성공, 실패에 따른 리다이렉트를 다음과 생각해볼 수 있다
response 객체로 리다이렉트하기-로그인
1) (지금은 DB연동없이 단순 값 비교만 하였지만) DB에 존재하는 값과 일치하는지 확인(회원 인증 절차 jsp 파일)
2-1) 일치한다면 메인 페이지로 리다이렉트[이때, java.net.URLEncoder 클래스의 encode 메서드로 인코딩이 깨지지 않게 하면서, 쿼리 스트링으로 실을 변수와 그 값을 넘겨줌]
2-2) 일치하지 않는다면, 로그인 페이지로 리다이렉트
- 로그인 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="testLogin.jsp" method="post">
<div class="id">
<label for="id">id: </label>
<input type="text" name="id" id="id"placeholder="아이디">
</div>
<div class="pw">
<label for="pw">pw: </label>
<input type="password" name="pw" id="pw"placeholder="비밀번호">
</div>
<div>
<input type="submit" value="로그인">
</div>
</form>
</body>
</html>
- 회원 인증 절차 jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%!
//id
String id = "";
//pw
String pw = "";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인세션</title>
</head>
<body>
<%
//response 객체에 실어서 보낼 사용자의 이름
String name ="지수";
request.setCharacterEncoding("UTF-8");
id = request.getParameter("id");
pw = request.getParameter("pw");
if(id.equals("js") && pw.equals("pw")){
response.sendRedirect("main.jsp?name="+
URLEncoder.encode(name,"UTF-8"));
}else{
response.sendRedirect("loginForm.jsp");
}
%>
</body>
</html>
- 메인 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main Page</title>
</head>
<body>
<%=request.getParameter("name")+"님 안녕하세요!<br>"+
"저희 홈페이지에 방문해 주셔서 감사합니다!<br> 즐거운 시간 되세요!<br>"%>
</body>
</html>
JSP 에서 다른 페이지로 이동하기 위한 방법
- 리다이렉트 방식 - response.sendRedirect(“리다이렉트 할 url”)
- 포워드 방식
- 리다이렉트 방식 : 브라우저의 URL을 변경하도록 하여 페이지를 이동
- request, response 객체가 유지되지 않음
- 위의 로그인 예시에서 확인해 본 것처럼, 리다이렉트 메서드에 기술했던 URL이 쿼리 스트링과 함께 나타남
- 한글 인코딩 처리를 위하여 java.net.URLEncoder 클래스의 encode 메서드로 처리해주어야 함!
response.sendRedirect(“main.jsp?name=”+ URLEncoder.encode(name,”UTF-8”));
- pageContext, request 객체가 모두 유실됨
- 포워드 방식 : requestDispatcher 객체로 접근
- requestDispatcher 객체=request.getRequestDispatcher(“URL”) 로 생성 가능
- 포워드 방식: requestDispatcher 객체.forward() 를 통하여 getRequestDispatcher 메서드로 전달된 URL, 즉 페이지로 이동됨
- 서버 상에서 페이지가 이동됨
- URL 변경 ❌
- request, response 유지된 채 이동됨 ▶️ request.setAttribute(name,value); 로 데이터를 전송(쿼리 스트링 형태로 전달 ❌) && 이동된 페이지에서는 getAttribute(name)으로 속성 값을 얻어와서 사용 가능! -단, getAttribute는 Object 형으로 반환되므로, 적절히 캐스팅해주어야 함!
- pageContext 객체만 유실됨
- 한글 인코딩을 위한 별다른 처리가 필요 ❌
- 로그인 포맷 페이지 -LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="testLogin.jsp" method="post">
<div class="id">
<label for="id">id: </label>
<input type="text" name="id" id="id"placeholder="아이디">
</div>
<div class="pw">
<label for="pw">pw: </label>
<input type="password" name="pw" id="pw"placeholder="비밀번호">
</div>
<div class="age">
<label for="age">나이: </label>
<input type="number" name="age" id="age"placeholder="나이">
</div>
<div>
<input type="submit" value="로그인">
</div>
</form>
</body>
</html>
- 나이 기준에 따른 처리 - testLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
//id
String id = "";
//pw
String pw = "";
//age
int age = 0;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Forward Login</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
id = request.getParameter("id");
pw = request.getParameter("pw");
age = Integer.valueOf(request.getParameter("age"));
if(age < 19){
%>
<script type="text/javascript">
alert(`19세 미만이므로 입장 불가`);
history.go(-1);
</script>
<%
}
else{
request.setAttribute("name", "지수");
RequestDispatcher dispatcher=
request.getRequestDispatcher("Result.jsp");
dispatcher.forward(request, response);
}
%>
</body>
</html>
- 로그인 성공 시 서버상 작동되는 페이지- Result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--get attribute --%>
<%
//선언문에서는 메서드를 사용할 수 없지만 스크립트릿에서는 사용할 수 있으므로!
//이를 이용
String id = request.getParameter("id");
String pw = request.getParameter("pw");
int age = Integer.valueOf(request.getParameter("age"));
//서버에서 보낸 값 받기
String name = (String)request.getAttribute("name");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Forward</title>
</head>
<body bgcolor=tomato>
forward 방식으로 이동된 페이지<br>
나이 : <%=age %>
이름 : <%=name %>
</body>
</html>
[history 객체의 속성과 메서드]
- application 내장 객체
- 하나의 웹 애플리케이션 안에서 자원을 공유
- 하나의 웹 애플리케이션을 관리
▶️
application.setAttribute(속성,값)
은 application 객체 내부에 속성이 저장되고, 이 속성-값이 모든 JSP 페이지 내에서 공통적으로 사용될 수 있게 됨
- javax.servlet.ServletContext 인터페이스를 구현한 객체
- 웹 애플리케이션 당 하나만 생성됨
- 서블릿 컨테이너 정보 제공, 서블릿 컨테이너에게 로그 처리를 요청 등..
📌 내장 객체의 영역 📌
- 객체의 유효기간!!
page 영역 < request 영역 < session 영역 < application 영역
- page 영역
- 하나의 JSP 페이지를 처리할 때 사용되는 영역
- 한 번의 클라이언트 요청에 하나의 JSP 페이지를 범위로 가짐(해당되는 pageContext 내장객체를 할당받음)
- request 영역
- 하나의 요청을 처리할 때 사용되는 영역
- 하나의 요청을 처리하는 데 사용되는 모든 JSP 페이지
- 브라우저가 요청을 할 때마다 새로운 request 내장 객체가 생성되고, 매번 새로운 request 영역이 생성됨
- session 영역
- 웹 브라우저를 닫기 전까지 페이지를 이동하더라도 사용자의 정보를 잃지 않고 서버에 보관할 수 있도록 하는 객체
- application 영역
- 하나의 웹 애플리케이션과 관련된 모든 페이지, 그 페이지에 대한 요청, 세션을 모두 포함
- 하나의 웹 애플리케이션에 존재하는 모든 JSP 페이지는 하나의 application 내장 객체를 공유함 (application 내장 객체는 application 영역에 포함됨)
내장객체에서 사용할 수 있는 메서드 추가!!
- getAttributeNames(): 현재 객체에 관련된 모든 속성의 이름을 추출함
- removeAttribute(name) : 매개변수로 전달된 속성의 값을 제거
- 리턴값은 Object 타입!