01. 내장 객체가 변수 선언 없이 이용될 수 있는 이유는 무엇인가요?
답: JSP 컨테이너가 내장 객체를 미리 생성하고 초기화하여 제공하기 때문.
JSP 컨테이너에 의해 자동으로 추가되고 초기화되기 때문.
내장 객체들은 JSP 페이지의 서블릿 코드로 변환될 때 자동으로 생성되고 초기화되어 '_jspService' 메서드 내에서 사용할 수 있도록 준비됨.
내장 객체의 주요 예시
1) request: 현재 요청에 대한 정보를 가진 HttpServletRequest 객체
HTTP 요청 메시지 정보를 제공한다. 주로 URL에 포함된 사용자 입력 값을 추출하기 위해 이용된다.
2) response: 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체
HTTP 응답 메시지의 연결 정보를 제공한다. 결과 페이지의 전달이나 리디렉션 등에 이용된다.
3) out: 클라이언트로 출력하기 위한 PrintWriter 객체
HTTP 응답 메시지 바디에 추가되어 브라우저로 전송될 결과 페이지 내용을 담고 있는 스트림이다.
4) session: 현재 세션에 대한 HttpSession 객체
웹 어플리케이션의 컨텍스트 정보를 저장한다. 웹 서비스 실행 시간 동안 유지되어야 하는 정보를 저장하는데 이용된다.
5) application: 웹 애플리케이션 전체에 대한 정보를 가진 ServletContext 객체
브라우저와의 연결 정보를 유지하기 위한 세션 정보를 포함한다. 세션 시간(기본 30분) 동안 유지되어야 하는 정보를 저장하는데 이용된다.
02. 쿼리 스트링에 포함된 이름이 같은 파라미터가 여러 개일 경우, 이들을 추출하기 위해 이용되는 request 객체의 함수는 무엇인가요?
답: getParameterValues()
getParameterValues(String name) 함수는 지정된 이름(name)에 해당하는 파라미터 값들을 배열로 반환함.
이를 통해 동일한 이름으로 여러 개의 값을 전달받을 수 있음.
예를 들어, 쿼리스트링이 다음과 같으면,
이 경우, request. getParameterValues("color")를 호출하면 red, green, blue 와 같은 여러 개의 값을 가지는 문자열 배열 반환됨.
?color=red&color=green&color=blue
04. JSP의 스크립팅 요소 중, out.write() 로 변환되는 요소는 무엇인가요?
답: <=% %> (표현식)
예를 들어, 이 코드는 내부적으로 out.write("Hello, World!")로 변환됨.
<%= "Hello, World!" %>
out.print와 차이점
out.write() | out.print | |
출력 방식 | 문자열을 직접 출력 스트림에 기록함. HTML 태그나 형식 지정을 하지 않고, 단순히 문자열을 출력하는 데에 사용됨. |
자바의 'System.out.print()' 와 유사하게 동작하며, 다양한 데이터 유형을 문자열로 변환하여 출력함. HTML 태그나 형식 지정을 할 수 있으며, 객체나 본 데이터 유형을 인자로 받을 수 있음. |
인자 유형 | out.wrtte(int c) 정수형 매개변수를 받아 출력함. c는 출력할 문자의 Unicode 코드임. |
out.print(Object obj) 객체나 다양한 데이터 유형을 받아서 문자열로 변환하여 출력함. |
사용 예시
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
out.write("Hello, World!"); // out.write() 사용 예시
out.print("<br>");
out.print(42); // out.print() 사용 예시
%>
out.write("Hello, World!"); 는 문자열 그대로 출력
out.print("<br>"), out.print(42); 은 각각 HTML 줄바꿈 태그와 숫자 42 출력
out.print() 는 다양한 데이터 유형 다룰 수 있고, 특정 데이터의 형식을 유연하게 다룰 수 있어 더 자주 사용됨.
05. request 객체는 주로 어떤 용도로 이용되나요?
답: 주로 URL에 포함된 사용자 입력 값을 추출하기 위해 이용된다.
HTTP 요청 메시지 정보를 제공한다.
request 객체는 웹 애플리케이션에서 클라이언트로부터 서버로 전달되는 요청에 대한 정보를 담고 있는 객체.
주로 다음과 같은 용도로 이용됨.
1) 파라미터의 수신: 사용자가 웹 페이지에서 양식(form)을 작성하고 제출할 때, 그 양식의 데이터는 request 객체를 통해 서버로 전송됨.
2) 세션 관리: 현재 요청과 관련된 세션 객체를 가져오는 데 사용됨. 세션은 사용자의 상태를 유지하고 서버와 클라이언트 간의 지속적인 상호작용을 가능케 함.
3) 헤더 정보의 획득: HTTP 요청에 포함된 헤더 정보들은 request 객체를 통해 접근할 수 있음.
이를 통해 클라이언트의 브라우저 종류, 지원하는 언어, 사용자 에이전트 등의 정보를 얻을 수 있음.
4) 쿠키의 처리: 클라이언트에서 전송된 쿠키에 대한 정보를 담고 있음. 서버는 이를 이용하여 클라이언트의 상태를 추적하거나 특정 사용자에 대한 데이터를 저장할 수 있음.
5) 포워딩 및 리다이렉트: 서버에서 클라이언트로 데이터를 전송하거나 다른 리소스로의 포워딩 및 리다이렉션을 수행할 수 있음.
6. 인증 및 권한 부여 확인: 클라이언트의 인증 정보나 권한 부여 여부를 확인하기 위해 사용.
7. 파일 업로드 처리: 클라이언트에서 서버로 파일을 업로드 할 때, request 객체 통해 해당 파일의 내용 읽어올 수 있음.
request 객체는 Servlet 의 doGet(), doPost() 등의 메서드 내에서 매개변수로 받거나, JSP 페이지에서는 스크립트릿 내에서 직접 참조하여 사용됨.
06. 세션과 쿠키의 차이점은 무엇인가요?
답: 세션은 서버에 데이터를 저장 / 쿠키는 클라이언트에 로컬 파일 형태로 저장
세션 | 쿠키 | |
정의 | 서버 측에서 정보를 저장하고 클라이언트에게 고유한 세션 식별자를 부여하여 상태를 유지하는 기술. | 클라이언트 측에 작은 양의 데이터를 저장하고, 이를 이용하여 상태를 유지하는 기술. |
저장 위치 | 서버 메모리, 데이터베이스 등 서버 측에서 관리되는 저장소에 정보를 저장함. | 클라이언트의 웹 브라우저에 작은 텍스트 파일 형태로 정보를 저장. |
용량 | 서버 측에서 관리되기 때문에 일반적으로 더 많은 데이터 저장 가능. | 브라우저가 지원하는 쿠키 크기에 제한되어 있어 작은 양의 데이터만 저장 가능. |
보안 | 서버 측에 저장되기 깨문에 클라이언트에서 직접 접근이 어려워 상대적으로 안전. | 클라이언트 측에 저장되기 때문에 사용자가 쿠키 파일에 접근할 수 있어 상대적으로 덜 안전. |
수명 | 브라우저가 닫히거나 타임아웃이 지나면 종료. | 브라우저에 저장된 쿠키에 설정된 만료기간까지 유지. |
구현 | 서블릿, JSP 등의 서버 사이드 기술에서 세션 객체 사용하여 구현. | HTTP 응답 헤더에 'Set-Cookie'를 사용해 클라이언트로 쿠키를 보내거나, JavaStript를 사용해 클라이언트에서 구현될 수 있음. |
세션은 사용자 로그인 정보 관리, 장바구니 기능, 사용자 상태 관리, 인증 및 권한 부여
-> 서버 측에 데이터를 저장하고 사용자의 상태를 유지하는 데 주로 사용.
쿠키는 사용자 추적, 언어 설정 및 사용자 환경 관리, 사용자 편의성 개선, 광고 타게팅 및 분석
-> 클라이언트 측에 작은 양의 데이터를 저장하여 사용자의 브라우저에서 정보를 유지하는 데 주로 사용.
07. session 객체를 이용할 때 세션 정보를 모두 삭제하기 위한 함수는 무엇인가요?
답: invalidate()
세션을 무효화하여 해당 세션에 저장된 모든 데이터를 삭제하고 새로운 세션을 생성함.
이를 통해 사용자의 로그아웃 또는 세션 정보 초기화 등의 상황에서 세션 비우는 데 사용됨.
HttpSession session = request.getSession();
session.invalidate(); // 세션 무효화, 모든 세션 데이터 삭제
세션을 무효화하면 해당 세션에 속한 모든 속성들이 삭제되고, 새로운 세션 ID가 생성됨.
08. visitCount.jsp를 이용하여 다음과 같이 로그인 화면에서 방문자 수를 출력해 주세요.
사용자 아이디: 홍길동
로그인 시간: Tue Jan 05 11:37:42 KST 2021
방문자 수: 5
답:
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<%
// 사용자 아이디
String userId = "홍길동";
// 현재 시간
Date loginTime = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
String formattedTime = dateFormat.format(loginTime);
// 방문자 수
int visitCount = 0;
Map<String, Integer> visitCounts = (Map<String, Integer>) application.getAttribute("visitCounts");
if (visitCounts == null) {
visitCounts = new java.util.HashMap<String, Integer>();
}
// 사용자당 방문자 수 증가
if (visitCounts.containsKey(userId)) {
visitCount = visitCounts.get(userId);
}
visitCount++;
visitCounts.put(userId, visitCount);
// 전체 방문자 수 증가
int totalVisitCount = visitCounts.values().stream().mapToInt(Integer::intValue).sum();
application.setAttribute("visitCounts", visitCounts);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Visit Count Page</title>
</head>
<body>
<h2>로그인 정보</h2>
<p>사용자 아이디: <%= userId %></p>
<p>로그인 시간: <%= formattedTime %></p>
<p>방문자 수: <%= totalVisitCount %></p>
</body>
</html>
(학교 코드)
<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
Date now = new Date();
// 해당 형식으로 날짜를 포맷하고 이를 문자열로 저장
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(now);
// 만약 현재 날짜가 12일이면, 다른 페이지인 "underCheck.jsp"로 리다이렉션하고
// 현재 페이지의 실행을 중단한다.
if (date.endsWith("11")) {
response.sendRedirect("underCheck.jsp");
return;
}
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
res += "<br>로그인 시간: " + now.toString();
out.print(res);
%>
<br><br><%@ include file="visitCount.jsp" %>
<!-- 매 페이지 요청마다 방문자 수를 증가시키고 그 값을 출력하는 예제
페이지가 로드될 때마다 application 객체를 사용하여 방문자 수를 추적하고 업데이트 한다. -->
<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
// application 객체를 사용하여 웹 애플리케이션 범위에 저장된 속성 중 counter라는 이름의
// 속성 값을 가져온다.
String strcnt = (String) application.getAttribute("counter");
// counter 속성의 값이 null이면 0으로 초기화하고,
// 그렇지 않으면 해당 값을 정수로 변환하여 count 변수에 저장
int count = (strcnt == null) ? 0 : Integer.valueOf(strcnt);
out.print("방문자수: " + count);
// 방문자 수를 증가시킨 후, 다시 counter 속성으로 설정하여 웹 애플리케이션 범위에 저장한다.
// 이렇게 하면 다음 사용자가 페이지를 요청할 때마다 방문자 수가 업데이트 된다.
application.setAttribute("counter", String.valueOf(++count));
%>
09. [예제 7-1]에서 실습한 main.jsp의 상단에 로그아웃 버튼을 추가 후, 해당 버튼을 누르면 logout.jsp가 호출되도록 main.jsp를 수정해주세요.
<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String uid = (String) session.getAttribute("id");
if(uid == null) {
out.print("로그인 정보가 없습니다");
}
else{
out.print("메인 페이지입니다.");
session.setAttribute("id", uid);
}
%>
답:
<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String uid = (String) session.getAttribute("id");
if (uid == null) {
out.print("로그인 정보가 없습니다");
} else {
out.print("메인 페이지입니다.");
// 로그아웃 버튼 추가
%>
<form action="logout.jsp" method="post">
<input type="submit" value="로그아웃">
</form>
<%
// 세션에 사용자 아이디 저장
session.setAttribute("id", uid);
}
%>
'학교 > JAVA' 카테고리의 다른 글
06) JSP (0) | 2023.12.14 |
---|---|
07) JSP 내장 객체 종류 (0) | 2023.12.14 |
모바일 웹 서비스 구현을 위한 JSP 웹 프로그래밍 연습문제_06 JSP (0) | 2023.12.13 |
모바일 웹 서비스를 위한 JSP 웹 프로그래밍 연습문제_05장 서블릿 (0) | 2023.12.13 |
컬렉션 연습문제 (Student, Main) (0) | 2023.10.27 |