9:23 학원 도착
<9:30 1교시>
어제 내용 복습
하나의 웹브라우저가 열릴 때 여러 jsp의 동시 응답으로 구성되어 열릴 수 있다.
webapp 폴더에 include 라는 폴더에 공동으로 응답할 페이지들을 모아두면 편리하다.
jsp:include로 include 페이지에 있는 jsp 페이지들을 응답시킬 수 있다.
<%-- --%> 라는 주석영역은 jsp가 해석을 무시하여 클라이언트에게 출력조차 안된다.
jsp 에서 <!-- -->를 사용하면 클라이언트에게 출력된다.
<!-- -->는 웹브라우저가 무시하는 주석인데, html로서만 무시하는 거지 jsp가 해석해버렸기 때문에 웹브라우저의 소스에서는 보인다. 웹브라우저가 해석을 무시한다고 소스코드에서조차 출력이 안되는 게 아니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
<%-- 아래 명령을 통해 resource.jsp 페이지가 응답하도록 할 수 있다. --%>
<jsp:include page="/include/resource.jsp">
<jsp:param value="index" name="current"/>
</jsp:include>
</head>
<body class="d-flex flex-column min-vh-100">
<div class="main flex-grow-1">
<%-- 아래 명령을 통해 navbar.jsp 페이지가 응답하도록 할 수 있다 --%>
<jsp:include page="/include/navbar.jsp">
<jsp:param value="index" name="current"></jsp:param>
</jsp:include>
<div class="container">
<h1 >Home</h1>
<ul>
<%--<li><a href="connection/test.jsp" >Connection 테스트</a></li>--%>
<li><a href="member/list.jsp">Member List</a></li>
<li><a href="food/list.jsp">Food List</a></li>
<li><a href="guest/list.jsp">Visitor's Log</a></li>
</ul>
</div>
</div>
<%-- footer.jsp include --%>
<jsp:include page="/include/footer.jsp"/>
<%-- 파라미터 전달할 게 없으면 바로 닫아버리면 된다 --%>
</body>
</html>
/include/footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- Footer -->
<footer class="bg-dark text-white py-3">
<div class="container d-flex justify-content-between">
<p class="mb-0">© 2025 MyWebsite. All rights reserved.</p>
<ul class="list-unstyled d-flex mb-0">
<li><a href="#" class="text-white text-decoration-none me-3">Privacy Policy</a></li>
<li><a href="#" class="text-white text-decoration-none me-3">Terms of Service</a></li>
<li><a href="#" class="text-white text-decoration-none">Contact</a></li>
</ul>
</div>
</footer>
<10:30 2교시>
fortune.jsp에서 읽을 때
String 타입의 fortuneToday를 담은걸 기억하고, (String)request.getAttribute("fortuneToday")로 가져온다.
jsp가 응답함.
EL(Expression Language) : ${ }형태의 명령어를 일컫는 말
EL을 이용하면 request 영역에 담긴 데이터를 편하게 추출할 수 있다.
index.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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
</ul>
</div>
</body>
</html>
FortuneServlet.java
package test.servlet;
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("/fortune")
public class FortuneServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//오늘의 운세를 얻어오는 비즈니스 로직을 수행(DB에서 읽어왔다고 가정)
String fortune="동쪽으로 가면 귀인을 만나요";
//여기서 html 형식으로 오늘의 운세를 응답하려면 머리가 아프다
//-> 해결 방법: webapp/에 어딘가에 있는 jsp 페이지에게 대신 응답하라고 응답을 위임할 수 있다!!!!!!
// 대신 응답에 필요한 데이터(운세)sms request scope에 담아서 전달해 주어야 한다
// 하나의 요청이 왔을 때 서블릿이 복잡한거 다 처리하게하고 jsp로 협동
//request scope이란 것은 request 라는 객체에 데이터를 담는 메소드를 이용하는 것임(jsp로 응답을 위임 시킴) <-나중에 많이 쓰이는 구조
//오늘의 운세를 request scope에 담는다.setAttribute key값과 value의 쌍을 담는데, value의 데이터 타입이 object라 아무거나 다 담을 수 있다.
request.setAttribute("fortuneToday", fortune);
//응답은 jsp 페이지에 위임한다(forward 이동)
//.getRequestDispatcher)"응답을위임할jsp페이지의위치")
RequestDispatcher rd=request.getRequestDispatcher("/test/fortune.jsp");
rd.forward(request, response);
}
}
/test/fortune.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//request scope 에 "fortuneToday"라는 키값으로 담겨 있는 String Type 데이터 얻어오기
String fortuneToday=(String)request.getAttribute("fortuneToday");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h1>운세페이지</h1>
<p>오늘의 운세: <strong><%=fortuneToday %></strong></p>
<%-- Expression Language 를 이용하면 request 영역에 담긴 데이터를 편하게추출할 수 있다 --%>
<p>오늘의 운세: <strong>${requestScope.fortuneToday}</strong></p>
<%--requestScope.은 생략 가능하다 --%>
<p>오늘의 운세: <strong>${fortuneToday}</strong></p>
</div>
</body>
</html>
MemberDto를 가져와서 새로운 requestscope 사용해보는 연습하기
<%@ 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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath}/member">회원 한명의 정보</a></li>
</ul>
</div>
</body>
</html>
/test/member.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
MemberDto dto=(MemberDto)request.getAttribute("dto");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h1>회원 1명의 정보</h1>
<p>번호: <strong><%=dto.getNum() %></strong></p>
<p>이름: <strong><%=dto.getName() %></strong></p>
<p>주소: <strong><%=dto.getAddr() %></strong></p>
<h1>회원 1명의 정보</h1>
<%-- EL을 이용해서 requestScope에 담긴 내용을 추출할 수 있다 --%>
<p>번호: <strong>${requestScope.dto.getNum()}</strong></p>
<%-- requestScope.은 생략 가능 --%>
<p>이름: <strong>${dto.getName()}</strong></p>
<%-- .필드명만 명시해도 getter 메소드가 자동 호출된다 --%>
<p>주소: <strong>${dto.addr }</strong></p>
</div>
</body>
</html>
<11:30 3교시>
멤버리스트 보기
index.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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath}/member">회원 한명의 정보</a></li>
<li><a href="${pageContext.request.contextPath}/member/list">회원 목록</a></li>
</div>
</body>
</html>
MemberListServlet
package test.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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;
import test.member.dto.MemberDto;
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//DB에서 읽어온 회원 목록이라 가정하자
MemberDto mem1=new MemberDto(1,"이름1", "주소1");
MemberDto mem2=new MemberDto(2, "이름2", "주소2");
MemberDto mem3=new MemberDto(3, "이름3", "주소3");
List<MemberDto> list = new ArrayList<>();
list.add(mem1);
list.add(mem2);
list.add(mem3);
//webapp/member/list.jsp 페이지에서 회원 목록을 table 요소를 이용해서 출력하도록 해보세요
request.setAttribute("memberlist", list);
RequestDispatcher rd= request.getRequestDispatcher("/member/list.jsp");
rd.forward(request, response);
}
}
/member/list.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
MemberDto dto=(MemberDto)request.getAttribute("dto");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h1>회원 1명의 정보</h1>
<p>번호: <strong><%=dto.getNum() %></strong></p>
<p>이름: <strong><%=dto.getName() %></strong></p>
<p>주소: <strong><%=dto.getAddr() %></strong></p>
<h1>회원 1명의 정보</h1>
<%-- EL을 이용해서 requestScope에 담긴 내용을 추출할 수 있다 --%>
<p>번호: <strong>${requestScope.dto.getNum()}</strong></p>
<%-- requestScope.은 생략 가능 --%>
<p>이름: <strong>${dto.getName()}</strong></p>
<%-- .필드명만 명시해도 getter 메소드가 자동 호출된다 --%>
<p>주소: <strong>${dto.addr }</strong></p>
</div>
</body>
</html>
만든 페이지들은 링크를 직접 요청하면 열리지 않고 인덱스 페이지를 거쳐야 열린다.
<%@ 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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath}/member">회원 한명의 정보</a></li>
<li><a href="${pageContext.request.contextPath}/member/list">회원 목록</a></li>
<%--<li><a href="${pageContext.request.contextPath}/test/fortune.jsp">테스트1</a></li>
이렇게 쓰는거는 직접 요청하면 나오지 않는다, 인덱스에서 링크를 타고 가야 함--%>
</ul>
</div>
</body>
</html>
닉네임 기억 시키기
<%@ 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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath}/member">회원 한명의 정보</a></li>
<li><a href="${pageContext.request.contextPath}/member/list">회원 목록</a></li>
<%--<li><a href="${pageContext.request.contextPath}/test/fortune.jsp">테스트1</a></li>
이렇게 쓰는거는 직접 요청하면 나오지 않는다, 인덱스에서 링크를 타고 가야 함--%>
</ul>
<form action="${pageContext.request.contextPath}/test/save.jsp" method = "post">
<input type="text" name="nick" placeholder="닉네임 입력.."/>
<button type="submit">닉네임 기억 시키기</button>
</form>
</div>
</body>
</html>
test/save.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//폼으로 전송되는 내용 추출하기
String nick = request.getParameter("nick");
session.setAttribute("nick", nick); // request.setAttribute로 응답한 내용은 1회성으로 페이지가 이동하면 사라진다.
//이걸 다회성으로 저장할 방법이 session.setAttribute();(얘는 웹브라우저 세션을 닫기 전/삭제하기 전까지 데이터가 살아 있음)
//session 영역에 "nick"이라는 키값으로 저장하기
//3 응답한다
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p><strong><%=nick %>></strong>이라는 닉네임을 기억하겠습니다</p>
<p> 30분 동안 아무런 요청을 하지 않거나 웹 브라우저를 닫으면 자동 삭제됩니다.</p>
<a href="../index.jsp">인덱스로 이동하기</a>
</body>
</html>
닉네임을 기억하고 있는지 확인하기 위해 index.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>
<div class="container">
<h1>홈페이지</h1>
<ul>
<li><a href="${pageContext.request.contextPath}/fortune">오늘의 운세</a></li>
<li><a href="${pageContext.request.contextPath}/member">회원 한명의 정보</a></li>
<li><a href="${pageContext.request.contextPath}/member/list">회원 목록</a></li>
<%--<li><a href="${pageContext.request.contextPath}/test/fortune.jsp">테스트1</a></li>
이렇게 쓰는거는 직접 요청하면 나오지 않는다, 인덱스에서 링크를 타고 가야 함--%>
</ul>
<form action="${pageContext.request.contextPath}/test/save.jsp" method = "post">
<input type="text" name="nick" placeholder="닉네임 입력.."/>
<button type="submit">닉네임 기억 시키기</button>
</form>
<%
//session scope에 "nick"이라는 키값으로 저장된 문자열이 있는지 읽어와 본다.
String nick= (String)session.getAttribute("nick");
%>
<%if(nick!=null){ %>
<p>
<strong><%=nick %></strong>님 반갑습니다.
</p>
<% } %>
</div>
</body>
</html>
<12:30 4교시>
로그인의 원리 : 세션
//세션의 유지 시간을 초단위로 전달해서 설정할 수 있다(기본값은 30분)
session.setMaxInactiveInterval(100000);
지금 해본 거는 닉네임을 세션에 기억시킨건데 이게 로그인의 원리로 사용된다.
했던거 복습하러 감.
새로운 방법으로 종이에 코딩하는 거 해보려고 함.
아무래도 컴퓨터로 하는거 기억에 잘 안남음 ㅠㅠ
여러번 반복하기에 뭔가 다른걸로 반복하고 싶은데 예제도 마땅히 생각나지도 않고 ㅠㅠ
'공부의 기록 > 자바 풀 스택 : 수업내용정리' 카테고리의 다른 글
자바 풀 스택 1/9 오후 기록 034-2 (0) | 2025.01.09 |
---|---|
자바 풀 스택 1/8 오후 기록 033-2 (0) | 2025.01.08 |
자바 풀 스택 1/8 오전 기록 033-1 (0) | 2025.01.08 |
자바 풀 스택 1/7 오후 기록 032-2 (0) | 2025.01.07 |
자바 풀 스택 1/7 오전 기록 032-1 (0) | 2025.01.07 |