・에러가 발생한 페이지(위에서 왼쪽)

<%@ page errorPage="errorPage.jsp"%> : 에러발생시 특정페이지로 가라


・errorPage.jsp

<%@ page isErrorPage = "true" %> :  이 페이지 지시자를 적어주지 않으면 exception 객체를 사용할 수 없다.


・<% response.setStatus(200);%> : errorPage.jsp페이지는 에러페이지가 아니라 에러를 처리하는 정상적인 페이지 이기 때문에 200status를 띄어준다.








































・쿠키는 클라이언트(브라우저)에 객체로 저장되지만 세션은 서버에 객체로 저장되기 때문에 보안에 강하다.

쿠키는 4kb 짜리 300개가 최대 용량이지만, 세션은 로컬에 저장되는 것이 아니라 서버에 저장되기 때문에 데이터한계가없다.

브라우저 1개당 하나의 세션객체를 생성할 수 있다.


・session은 new를 사용하지 않아도 기본적으로 생성되어 있는 내부 객체이다. 따라서, session.setAttribute(세션이름,세션데이터)처럼 메서드나 프로퍼티를 바로 사용가능하다


・session.getAttribute(세션이름)의 리턴값은 Object 타입으로 정해져있다.


・c:/apache-tomcat-8.5.23/conf/web.xml에 세션정보가이 저장된다.즉, 서버에 세션정보가 저장된다.

























1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
 
<%
    session.setAttribute("id""thisIsId");
    session.setAttribute("pw""12345678");
    session.setAttribute("bank""국민은행");
    session.setAttribute("account""123123");
%>
 
    <a href="./sessionTest3.jsp">click</a>
</body>
</html>
cs






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <%
    String id;
    Object obj1 = session.getAttribute("id");
    id = obj1.toString();
    out.println(id+"</br>");
    
    
    ////////////////////////////////////////////////
    String sKey;
    String sVal;
    
    Enumeration infos = session.getAttributeNames();
    while(infos.hasMoreElements()){
        sKey=infos.nextElement().toString();
        sVal=session.getAttribute(sKey).toString();
        out.println(sKey + ":" + sVal +"</br>");
    }
    
    %>
</body>
</html>
cs


・session.getAttribute의 리턴값은 Object 타입이다.


・session.getAttributeNames의 리턴값은 Enumeration 타입이다.





















・http의 특징 중 하나: 클라이언트의 리퀘스트가들어오면 서버에서 레스폰해준다.  이때 레스폰이 끝나면 서버와의 접속은 끊긴다. 이를 무상태 서버, 무상태 로직이라고 부른다. 서버쪽에서는 클라이언트가 어떤 요청을 했던간에 관계를 끊기 때문에 레스폰 했던 정보를 따로 저장해두지 않는다. 그런데 연결이 끊긴 상태에서 정보를 지속적으로 유지해야할 필요성이 생긴다면 어떻게 해야할까. 예를 들어 로그인 페이지에서 로그인과 페스워드 정보가 서버에 의해 인증 되어 클라이언트에게 레스폰되었다. 이때 서버는 레스폰후 끊기기 때문에 로그인 페이지에서의 인증결과를 가지고 있지 않다. 유저가 다음페이지로 이동할 시 서버는 로그인 아이디와 패스워드 정보를 가지고 있지 않은데 어떻게 해야할까..

이때 사용되는 것이 쿠키라는 개념이다. 위의 예를 통해 설명하면, 로그인 페이지에서 인증한 아이디와 페스워드를 쿠키객체에 담아 브라우저에 저장하고, 유저가 다음페이지로 넘어갔을 때도 다시 서버에서 인증할 필요없이 쿠키객체에서의 확인을 통해 페이지가 이동해도 지속적으로 인증될 수 있는 로직이 되는 것이다.


물리적인 텍스트가 사용자의 로컬에 저장되기 때문에 보안상의 문제로 잘 사용되지 않아지고 있는 추세지만 잘 알아둘것



・쿠키생성 : Cookie cookie = new Cookie("쿠키이름","쿠키값")

속성설정 : cookie.setMaxAge(X*Y)
response객체에 쿠키 탑재 : response.addCookie(cookie)












・Cookie cookie = new Cookie("cookieN","cookieV") : Cookie클래스를 통해 cookie인스턴스를 설정한다.

・setMaxAge(60*60) : 쿠키의 유효기간을 한시간으로 설정한다.

・response.addCookie(cookie) : response로 브라우저에 cookie객체를 보낸다. 

・Cookie[] cookie = request.getCookie() : 브라우저에 들어간 여러개의 쿠키들은 배열형태로 쌓이게 된다. 따라서 getCookie()메소드의 리턴값은 배열이다.






・setMaxAge(0)으로 설정하면, 쿠키는 삭제되게 된다.


















・forward : 포워딩시 포워딩된 페이지의 url이 찍히지 않고, 포워딩 코드를 포함하는 페이지 url 이 유지된다.

・jsp뿐만아니라 html포워딩도 가능

























・소스코드를 보면 jsp페이지(<html> ~ </html>) 내에 또 jsp페이지(<html> ~ </html>)가 온것을 알 수 있다.








・jsp:param태그를 이용하면 포워딩 하는 페이지에 파라미터를 담아서 포워딩할 수 있다.
























































・<%= %> 태그는 html안에 자바의 변수를 넣는데 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
    <%!
    int age;
    %>
    
    <%
    age = Integer.parseInt(request.getParameter("age"));
    
    if(age>20){%>
        <jsp:forward page="agePass.jsp">
            <jsp:param name="age" value="<%= age %>"/>
        </jsp:forward>
    <%}
    else{%>
        <jsp:forward page="ageFail.jsp"/>
    <%}
    %>
</body>
</html>
cs










・out.println은 콘솔에 찍는게 아니고, html에 출력할 내용을 전달하는 명령어이다.






































지시자(Directives)

<%@ %>태그 사이에 오는 코드

주로 page 지시자를 사용함

contentType, pageEncoding을 사용하여 문서타입과 인코딩을 설정함

contentType 인코딩은 JSP파일을 HTML문서로 변환할 때 적용되는 인코딩

pageEncoding 인코딩은 그냥 JSP파일에 적용되는 인코딩

요즘은 유니코드를 주로 사용하기 때문에 UTF-8을 주로 사용함(한글 문제가 있을 시 EUC-KR을 가끔 사용)

JSP코드가 사용되는 부분은 HTML에서 공백으로 처리됨

trimDirectiveWhitespaces을 설정하면 공백을 없앨 수 있음

import는 자바 프로그래밍 import와 동일한 역할을 수행

 

선언문(Declarations)

<%! %>태그 사이에 오는 코드

서블릿 클래스의 선언부에 오는 내용이라고 보면 됨 (서블릿을 모르면 그냥 PASS)

함수선언 같은 것을 여기서 할 수 있음

클래스(Class)를 따로 구현해서 임포트하는 구조가 깔끔하기 때문에 선언문을 쓸일이 별로 없음

 

스크립트릿(Scriptlet)

<% %>태그 사이에 오는 코드 (가장 기본이 됨)

자바 프로그래밍에서 할 수 있는 일을 여기서 거의 다 할 수 있음

(if문, for문, while문, switch문 등등)

out.print 함수를 사용하면 화면 출력도 가능

 

표현식(Expression)

<%= %>태그 사이에 오는 코드

내장 객체(Implicit Objects)라고 부르기도 함

출력을 할 내용을 여기에 입력함

out.print()함수의 인자로 생각하면 이해하기 쉬움

즉, <%= 출력할 것 %> 와 out.print(출력할 것)은 동일함

세미콜론(;) 사용하면 에러가 남










・jsp파일이 요청되면 jsp컨테이너에 의해 jsp 파일을 servlet(.java)파일로 변환하고, 그 자바 파일을 class파일로 컴파일 후 요청에 레스폰 하게 된다.

・공부하기 전엔 node의 express에서 ejs를 res.render하는 것처럼 서블렛도 jsp를 렌더링 해주는 것인줄 알았는데, 사실은 서블릿이나 jsp나 클라이언트의 요청에 응답해주는 동일한 서버 언어이다. 단, jsp는 html에 더욱 친근하게 생겼기 때문에 servlet에 비해서는 유저에게 친근할 수 있겠다..






・위 이미지는, helloworld.jsp파일을 요청하고 톰캣의 컴파일 디렉토리를 들춰본 것이다. helloworld.jsp가 helloworld_jsp.java 파일과 helloworld_jsp.class파일로 컴파일 된 것을 볼 수 있다...!






helloworld_jsp.java를 열어보니, 서블릿과 동일하게 생겼다.
























・xml에는 url맵핑과 초기값을 모두 기재해야 양쪽으로 맵핑이 된다.  

・ServletConfig는 하나의 서블릿페이지당 하나의 초기값 설정으로 맵핑된다.

















・servletContext는 web.xml을 통해 여러 서블렛에서 데이터를 동시에 공유할 수 있다.








・웹어플이 시작되는 가장 처음부터 가장 마지막까지 쭉 리스닝한다.

(하나의 서블릿을 바라보는게 아니다! 여러 서블릿과 html로 구성된 웹어플 전체를 리스닝하므로 서버가 구동되는 가장 시작부터 꺼지는 가장 마지막 까지 쭉 어플을 바라본다)





・이니트 시 가장먼저 contextInitialized -> PostConstruct -> init

・디스트로이시 destory -> destoryPreDestory -> contextDestroyed





+ Recent posts