46일차 JSP
jsp를 배우는 것도 중요하지만 웹어플리케이션이 동작할때의 언어를 아는것이 중요하다.
세션은 jsp뿐만 아니라 다른 어플에서도 적용된다.
10.4 session 유지시간
세션을 만들어주고 파기하지 않으면 메모리가 꽉차버린다.
그래서 시간을 정해둘 필요가 있다. 기본 유지시간은 30분이다.
각각의 메소드를 사용해서 세션의 상태를 알아 볼 수 있다.
언제생성 : <%= session.getCreationTime() %>
마지막 접근 : <%=session.getLastAccessedTime() %>
유지시간(초) : <%=session.getMaxInactiveInterval()
세션 유지시간 변경하려면
session.setMaxInactiveInterval()메소드를 사용하면 된다 초단위로 결정할 수 있다.
세션 유지시간이 만료되면 새로운 세션 아이디를 들고가게 된다.
서버가 세션을 저장하고 있기 때문에 클라이언트는 만료가 된지 모른다.
요청없이 시간이 지나면 세션이 초기화된다.
<h1>세션 유지 시간</h1>
<h1> 언제생성 : <%= session.getCreationTime() %></h1>
<h1>마지막 접근 : <%=session.getLastAccessedTime() %></h1>
<h1>유지시간(초) : <%=session.getMaxInactiveInterval() %></h1>
<hr />
<h1>세션 유지시간 변경</h1>
<%
session.setMaxInactiveInterval(3); // 초단위 3초
%>
<a href="11checkSession.jsp">11번 파일로 이동</a>10.5 web.xml
그냥 설정을 하고 싶다면 배포지시자를 설정해주면된다.
deployment desciptor
web.xml을 수정하면된다.
보이지 않는다면 프로젝트 - refresh 하면보인다.
프로젝트 우클릭 - java EE tools - Generate Depolyment Descriptor stub
WEB-INF안에 web.xml이 생기게된다. 이것이 어플리케이션 설정파일이다.
마지막 request로부터 설정하는 것이다.
여기서는 분 단위로 세션 유지시간을 설정한다.
<session-config>
<session-timeout>30</session-timeout>
</session-config>결론적으로 사용자를 판단하기 위해서 세션을 사용한다
11. 쿠키
세션을 유지하기 위해서 쿠키를 사용한다.
서버가 클라이언트에게 주는 징표이다. 클라이언트는 쿠키를 저장하고 있다가 요청할때 들고간다.
쿠키는 웹브라우저가 저장하는 것이다.
서버가 지정한 쿠키 저장소에 쿠키를 저장하게 된다. 요청을 할때마다 들고가게 된다.
인증을하거나 권한을 주는 역할을 한다.
11.1 쿠키 만들기
쿠키는 서버가 응답할때 사용자에게 주는 징표이다.
서버에서 응답할때 만들어주면 된다. response객체를 사용하게 된다..
이름, 값의 쌍으로 쿠키를 만들고 response.addCookie()메소드로 사용자에게 쿠키를 준다.
이 메소드를 통해서 헤더를 조작해서 쿠키를 보내주게 된다.
클라이언트가 다시 요청할때 이 쿠키를 가지고 오게 된다.
<h1>쿠키 만들어서 클라이언트에게 응답</h1>
<%
Cookie cookie = new Cookie("my-cokie1", "my-value1");
response.addCookie(cookie);
%>쿠키를 보고 싶다면 쿠키배열타입으로 받게 된다.
request.getCookies() 메소드로 꺼내고 이름과 밸류값을 얻을 수 잇다.
<%
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies){
%>
<p><%= cookie.getName() %> : <%=cookie.getValue() %></p>
<%
}
%>11.2 쿠키 연습
쿠키가 총 세개 보이게 해보자.
<%
Cookie cookie1 = new Cookie("my-cookie1" , "my-value1");
Cookie cookie2 = new Cookie("my-cookie2" , "my-value2");
Cookie cookie3 = new Cookie("my-cookie3" , "my-value3");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.addCookie(cookie3);
%>
<a href="03view-cookie.jsp">요청에서 쿠키보기</a>11.3 쿠키 - 3
쿠키가 여러개 잇는데 쿠키를 여러개 보낼 수 있다.
특정 쿠키만 읽고 싶다면 request 객체에서 꺼내서 보면된다.
특정 이름만 보고 싶지만 무조건 배열로 받아와서 읽는 것만 가능하다.
그래서 특정 쿠키를 읽고 싶다면 배열을 탐색할 수 밖에없다.
단!!!! 스프링에서는 특정 쿠키만 가져오기 가능!!!! 나중에 알아보자.
11.4 쿠키 값 변경
쿠키의 값을 변경하려면 같은이름으로 새 쿠키를 만들어서 넣어주면된다.
<%
String name = "my-cookie2";
String value = "my-new-value2";
response.addCookie(new Cookie(name, value));
%>그런데 사실 변경한것이 아니라 새로 만들어서 추가하는 것이다.
바꾸는 것은 있으면 바꾸고 없으면 변경하고 싶은것인데 이것은 그냥 새로 추가하는 코드이다.
있을때만 추가하고 싶다면 전체탐색을 하고 조건에 따라 추가를 해줘야한다.
<h1>있는 쿠키 값 변경하기</h1>
<%
String name = "my-cookie2";
String value = "my-new-value22";
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies){
if (c.getName().equals(name)){
response.addCookie(new Cookie(name, value));
}
}
%>11.5 쿠키 유효 시간
쿠키는 기본적으로는 브라우저를 닫으면 쿠키도 없어진다.
그래서 쿠키의 유효시간을 설정을 해줘야한다.
쿠키에 세션을 보내서 아이디를 보내서 저장하는데 쿠키가 사라져서 세션을 유지할 수 없기때문이다.
cookie.setMaxAge();메소드로 설정하며 초단위의 값을 넣어줘야한다.
개발자 도구를 보면 언제 사라지는지 보여진다.
<%
//쿠키 지속시간 설정
Cookie cookie = new Cookie("123", "213");
cookie.setMaxAge(60*3); //초단위
response.addCookie(cookie);
%>
<a href="03view-cookie.jsp">요청에서 쿠키보기</a>브라우저에 저장된 쿠키를 프로그램에서 삭제하려면 지속시간을 0초로 만들어주면된다.
<%
//쿠키 지속시간 설정
Cookie cookie = new Cookie("123", "213");
//쿠키 삭제하라는 응답
cookie.setMaxAge(0);
response.addCookie(cookie);
%>서버에서 브라우저한테 maxAge를 0으로 만들어달라고 요청하면 유지시간이 0초가되서 삭제가 되는 것이다.
어차피 삭제할 것이니 value는 아무거나 줘도된다.
11.6 한글 쿠키
우리는 한글 유저이니 한글로 쿠키를 담기 위해서는 작업을 해야한다.
한글을 쿠키에 담기 위해서는 인코디을 해야한다.
URLEncoder클래스의 encode()메소드를 사용하면된다.
URLEncoder.encode(value);
<h1>쿠키에 한글값 사용</h1>
<%
String value = "내가 만든 쿠키";
String encodedValue = URLEncoder.encode(value);
Cookie cookie = new Cookie("my-cookie3", encodedValue);
cookie.setMaxAge(60*3); //초단위
response.addCookie(cookie);
%>한글로 만든 쿠키가 URLEncoder을 통해서 헤더에 들어갈수 있는 값으로 변경되어서 넘어가게 된다.
한글로 쿠키를 보기 위해서는 다시 디코딩을 해줘야한다.
URLDecoder클래스의 decode()메소드를 사용하면된다.
<h1>한글값 쿠키 보기</h1>
<%
Cookie[] cookies2 = request.getCookies();
for (Cookie cookie : cookies2){
String value = cookie.getValue();
String decodedValue = URLDecoder.decode(value);
out.println(cookie.getName() + ":" + decodedValue);
}
%>11.7 httponly
쿠키를 브라우저에 저장하는데 세션id처럼 js에서 읽을 수 있다.
그런데 다른곳에서 활용하면 js에서 갈취해서 다른데 사용할 수 있어서 js로 읽지 못하게 하고싶다면
httponly를 true로해주면된다.
브라우저에서 쿠키를 읽을 수는 있는데 js에서 값을 읽을 수는 없다.
<%
//쿠키 지속시간 설정
Cookie cookie = new Cookie("my-cookie3", "my-value3");
cookie.setHttpOnly(true);
response.addCookie(cookie);
%>11.8 cookie path
쿠키의 기본 path는 현재 경로로 세팅이된다. 하위경로에서만 사용할 수 있고 이전 경로에선 사용할 수 없다.
상위폴더에서 쿠키를 만들고 싶다면 경로를 지정해줘야한다.
cookie.setPath(); 메소드를 사용하면된다.
넣어줄 주소를 기준으로 넣어주면된다.
<h1>쿠키 경로 지정</h1>
<%
Cookie cookie = new Cookie("5", "val5");
cookie.setPath("/");
response.addCookie(cookie);
%>11.9 cookie path 연습
1.쿠키명 : my-cookie-7 / 쿠키값 : my-value-7
2.쿠키명 : my-cookie-8 쿠키값 : 뉴진스 경로 : contextPath httpOnly : true 지속시간 : 5분
<%
//1.쿠키1
Cookie cookie1 = new Cookie("my-cookie-7", "my-value-7");
//2.쿠키2
String value2 = "뉴진스";
String eValue2 = URLEncoder.encode(value2);
Cookie cookie2 = new Cookie("my-cookie-8", eValue2);
cookie2.setPath(request.getContextPath());
cookie2.setHttpOnly(true);
cookie2.setMaxAge(300);
response.addCookie(cookie1);
response.addCookie(cookie2);
%>쿠키 세션이야기하다 나왔다.
세션은 리다이렉트 사이에서 쿠키를 전달하는 방법을 배운것이다.
두개의 리퀘스트가 공유하는 값을 꺼내서 볼 수 있다.
12. 기본 object
response응답
request 요청
pageContext session application
out config page
기본 객체에는 8개가 있다.
객체 중에 attribute 저장 가능한 객체가 4가지가 있다.
pageContext (javax.servlet.jsp.PageContext)
request (javax.servlet.http.HttpServletRequest)
session (javax.servlet.http.HttpSession)
application (javax.servlet.ServletContext)
나중에 이것들이 오픈소스가 되었는데 jakarta라는 패키지에도 있다.
스프링 부트 3.0은 이 것을 사용하고 있다. jsp를 사용할때는 2.0을 사용하는 것이 좋다.
결국엔 같은 객체이다.
pageContext, request, session은 같은 이름이라 기억하기 쉽고 application은 패키지명이달라서 기억하기 어려우니 주의하자.
12.1 pageContext
setAttribute는 모든 객체를 이용하기 위해서 사용하는 것이다.
pageContext의 setAttribute는 같은 페이지 내에서만 사용할 수 있다.
다른페이지에서는 사용할 수 없다.
같은 페이지에서는 둘다 남는데 다른페이지에서는 pageContext가 넘어오지 않는다.
말그대로 page문맥이라고 보면될 것 같다. request는 page보다는 넓은 영역이란걸 알 수 있다.
<h1>request scope</h1>
<%
// page 영역
pageContext.setAttribute("attr1", "value1");
// request 영역
request.setAttribute("attr3", "value3");
%>
<jsp:include page="04sub.jsp"></jsp:include>
<%
String a1 = (String) pageContext.getAttribute("attr1");
%>
<div>
<%= a1 %>
</div>
<div>
<%= request.getAttribute("attr3") %>
</div> 12.2 session
session은 다른페이지로 넘길수도 있다.
request는 forward는 가능하지만 새로운 응답에서는 되지 않는데 세션은 같은 브라우저라면 가능하다.
<h1>session scope</h1>
<%
request.setAttribute("attr1", "value1");
session.setAttribute("attr2", "value2");
%>
<div>
attr1 : <%= request.getAttribute("attr1") %>
</div>
<div>
attr2 : <%= session.getAttribute("attr2") %>
</div>12.3 application
application은 어플리케이션 전체에 존재하게 되고 세션보다 넓은 영역이다.
다른 브라우저에서 열면 세션이 없어지는데 application은 더 넓은 영역이라 다른 브라우저에서도 볼 수 있다.
<h1>application scope</h1>
<%
session.setAttribute("attr1", "value1");
application.setAttribute("attr2", "value2!!!!!");
%>
<a href="08scope.jsp">8번 파일로 이동</a>12.4 총연습
request는 하나의 응답
session은 같은 브라우저
application은 어플리케이션 전역에서 사용할 수 있다.
<%
Object o1 = request.getAttribute("num1");
Object o2 = session.getAttribute("num2");
Object o3 = application.getAttribute("num3");
if (o1 == null) {
o1 = new AtomicInteger(0);
request.setAttribute("num1", o1);
}
if (o2 == null) {
o2 = new AtomicInteger(0);
session.setAttribute("num2", o2);
}
if (o3 == null) {
o3 = new AtomicInteger(0);
application.setAttribute("num3", o3);
}
AtomicInteger i1 = (AtomicInteger) o1;
AtomicInteger i2 = (AtomicInteger) o2;
AtomicInteger i3 = (AtomicInteger) o3;
i1.incrementAndGet();
i2.incrementAndGet();
i3.incrementAndGet();
%>
<div>num1 (request) : <%= i1.intValue() %></div>
<div>num2 (session) : <%= i2.intValue() %></div>
<div>num3 (application) : <%= i3.intValue() %></div>17. 자바빈
책 8장 jsp jsp:useBean은 안배우고 자바빈만 알고넘어가려고 한다.
자바빈은 관례로
1.클래스가 직렬화되어야한다.
2.기본 생성자를 가지고 있어야한다.
3.클래스의 속성들 get set혹은 표준명명법을 따르는 메소드로 접근할 수 있어야한다.
4.클래스는 필요한 이벤트 처리 메소드를 가지고 있어야한다
.
우리는 2번과 3번을 일단 따르고 있으면 된다.
자바빈은 자바 클래스로 만들어야한다.
자바빈은 데이터를 보관하는 역할을 한다.
MVC모델을 사용할때 요청이오면 컨트롤러가 일하고 모델에 담아서 VIEW에 보여준다.
이 모델에 담긴 객체가 자바빈 객체이다.
이 넣어놓은 객체를 모델에 담아서 건내서 VIEW가 보여준다.
컨트롤러에선 SETTER로 담고 VIEW에서는 GETTER로 꺼내서 보여주는 것이다.
public class Bean01 {
private String name;
private int age;
private boolean married;
//기본 생성자 있음
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
}17.2 자바빈 연습
id, model, price을 가진 자바빈만들기
public class Bean02 {
private int id;
private String model;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}17.3 자바빈 활용하기
억지로 꺼내서 사용해보자 현실성은 없다.
import해서 set메소드로 담고 get메소드로 꺼내면된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.study.ch05.bean.*" %>
<%
Bean01 o1 = new Bean01();
o1.setName("강백호");
o1.setAge(20);
o1.setMarried(true);
request.setAttribute("attr1", o1);
%>
<jsp:forward page="02sub.jsp" /><%@page import="com.study.ch05.bean.Bean01"%>
<%@ 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>
<%
Object o = request.getAttribute("attr1");
Bean01 b = (Bean01) o;
%>
<div>이름 : <%= b.getName() %></div>
<div>나이 : <%= b.getAge() %></div>
<div>결혼 : <%= b.isMarried() %></div>
</body>
</html>17.4 자바빈
getset메소드에서 만드는방법은 필드명 앞에 get/set을 담는다.
메소드를 기준으로 property가 결정된다.
property는 get set메소드에서 get과 set을 제외하고 첫번째 글자를 소문자로 바꾼것이 property이다.
그런데 그것이 곧 필드명 아니겟느냐 하는데 대부분 필드명과 property명이 같다.
그런데 이 두개가 같냐하면 아니다.
property는 메소드를 통해서 결정되는 것이다.
private String firstName;
private String lastName;
private int age;
세가지 필드를 가진 자바빈이 있다고 가정할때 가지고 있는 프로퍼티(property)는 다음 세가지이다.
firstName lastName age
그런데 메소드를 생성해서 프로퍼티를 조합하면 필드에는 없지만 메소드를 사용한 프로퍼티가 생기게 되는 것이다.
public String getFullName() {
return firstName + " " + lastName;
}
그래서 프로퍼티도 읽을 수 있는 프로퍼티와 쓸수 있는 프로퍼티로 되게 된다.
그래서 getFullName()로 FullName프로퍼티를 읽을 수 있게 되는 것이다.
프로퍼티와 필드명이 같아서 헷갈릴 수 있으니 구분을 잘해야한다.
이것이 표현언어로 넘어가게 되는 것이다.
2023.03.31 후기
프로퍼티의 내용에 대해서 알게 되었다. 스프링연습할때 값을 꺼낼때 get을 없애고 값을 꺼내는것이 이해가 잘안됫엇다
프로퍼티라는 의미와 그것을 조합하여 새로운 프로퍼티를 만들 수 있다는 것을 알게 되었다.
'국비 > JSP' 카테고리의 다른 글
| 2023.04.04 48일차 JSP (5) | 2023.04.04 |
|---|---|
| 2023.04.03 47일차 JSP (0) | 2023.04.03 |
| 2023.03.30 45일차 JSP (0) | 2023.03.30 |
| 2023.03.29 44일차 JSP (0) | 2023.03.29 |
| 2023.03.28 43일차 JSP (0) | 2023.03.28 |