21.01.13

민주·2021년 1월 17일
0

[내장객체]

- request와 response객체는 웹서비스에 있어서 핵심 객체이다.
- JSP는 두 객체 처럼 자주 사용하는 객체는 따로 선언하지 않도록 내장객체로 만들었다.
(request, reponse, Out, Cookie, Session 등)

[Request객체]

<form action="result.jsp" method="post">
<!-- <form action="jsUse.jsp" method="get"> -->
   <table>
<!--index.jsp 테이블 내용은 자름-->
<form> : 태그안에 입력된 데이터 값을 서버로 전송
- action : 데이터를 전달할 서버 이름 명시
- method : 데이터 전송 방식
    - "get" : 전송하는 내용이 URL에 나타난다
    - "POST" : 전달하는 내용이 URL에 나타나지 않는다

<index.jsp의 테이블>
- index.jsp에서 서버로 보낼 정보를 담은 테이블을 만들었다.
<h1>결과페이지</h1>
    	<table>
    			<tr>
    				<td>이름</td>
    				<td><%= request.getParameter("userName")%></td>
    			</tr>
    			<tr>
    				<td>성별</td>
    				<td><%= request.getParameter("gender")%></td>
    			</tr>
    			<tr>
    				<td>취미</td>
    				<td>
    					<% //hobby라는 하나의 이름으로 여러개의 값이 들어올 경우
    					String[] hobbys = request.getParameterValues("hobby");
    					for(String hobby : hobbys){
    					%>
    					<%= hobby %>	
    					<%} %>
    				</td>
    			</tr>
    		</table>
            <h1>요청정보</h1>
    		<table>
    			<tr>
    				<td>도메인</td>
    				<td><%=request.getServerName() %></td>
    			</tr>
    			<tr>
    				<td>포트번호</td>
    				<td><%=request.getServerPort() %></td>
    			</tr>
    			<tr>
    				<td>URL(link)</td>
    				<td><%=request.getRequestURL() %></td>
    			</tr>
    			<tr>
    				<td>URI(information)</td>
    				<td><%= request.getRequestURI() %></td>
    			</tr>
    			<tr>
    				<td>호스트명</td>
    				<td><%= request.getRemoteHost() %></td>
    			</tr>
    			<tr>
    				<td>IP주소(기본 IPv6)</td>
    				<td><%= request.getRemoteAddr() %></td>
    			</tr>
    		</table>
- result.jsp, index.jsp의 서버가 된다
- request는 내장객체 이므로 따로 객체화를 하지 않고 사용할 수 있다.
- request객체는 클라이언트로 부터 온 요청에 관한 모든 정보를 다루고 있다.
- request.getParameter(name) : 클라이언트에서 보낸 데이터의 name의 값을 넣어주면 해당 내용을 받아올 수 있다.
- hobby라는 하나의 name으로 여러개 값이 들어올 경우 request.getParameterValuses(name)을 배열로 받아야 한다.
배열로 받고 for문으로 값을 하나씩 받아오면 정상출력 되는것을 확인할 수 있다.
- index.jsp에서 input으로 보낸 값 말고도 도메인, 포트번호, URL, URI, 호스트명, IP주소 등을 알수 있다.
- IP주소는 기본적으로 IPv6로 나오며 IPv4로 나오게 하고싶으면 설정을 해줘야한다.

<result.jsp의 테이블>
- index.jsp 브라우저 상에서 전송을 누르면 form의 action을 통해 
result.jsp로 데이터를 보내게 되고 result.jsp로 이동되어 결과값을 확인 할 수 있다.
//jsUse.jsp
var name="<%= request.getParameter("userName")%>";
    var gender="<%= request.getParameter("gender")%>";
    var hobby=[];
	<%
		String[] hobbys = request.getParameterValues("hobby");
		for(String hobby : hobbys){
	%>	
		hobby.push("<%=hobby%>");	
		<%}%>
		$("#name").html(name);
		$("#gender").html(gender);
		$("#hobby").html(hobby.join(", "));//배열안에 값과 값 사이의 구분자를 줄수 있다.
- index.jsp <form action="jsUse.jsp>로 변경하고 실행
- 서버에서는 자바스크립트로 받아오는것도 가능하다.

[Out객체 & Response객체]

- out객체 : 
	- 서버에서 페이지로 outputStream하는 기능을 한다.
    - 하지만 실제적으로는 페이지에 문자열을 출력하는 것 정도로만 사용한다고 보자
- response객체 : 
    - 클라이언트 요청에 대해 응답 페이지를 전달 해주는 객체이다.
	- 페이지를 만드는 객체이다 보니 out객체처럼 출력이 가능하다.
    - 특정페이지로 이동하는 것도 가능하다.
<!--<index.jsp>-->
<p><a href="print.jsp">각 객체별 페이지 출력</a></p>
<p><a href="redirect.jsp">response 객체를 이용한 redirect</a></p>
<!--<print.jsp>-->
<!-- 2순위 -->
<h3>scriptlet 출력문</h3>
<p>1~100까지의 합 : <%= sumWhile() %></p> <!-- 사용하지 못하는경우가 있다. -->
<% //3순위
out.print("<h3>out객체 출력문</h3>");
out.print("<p>1~100까지의 합 : "+sumWhile()+"</p>");
%>
<% //응답객체를 이용해서 찍기 때문에 제일 먼저 찍힌다.(1순위)
response.getWriter().write("<h3>reponse객체 출력문</h3>");
response.getWriter().write("<p>1~100까지의 합 :"+sumWhile()+"</p>");
- sumWhile() : 1~100까지 더하는 함수, 위에서 선언해줌
- 17~18 : scriptlet을 이용한 출력
- 20~21 : out객체를 이용한 출력	
	- out.print();
- 24~25 : response객체를 이용한 출력
	- response.getWriter().write();

<print.jsp 브라우저>
- 코드에 상관없이 response객체 ->  scriptlet을 이용 -> out객체를 이용한 출력순으로 찍힌다.
<%
	//리다이렉트는 특정한 페이지로 이동시키는것
	//이곳은 그냥 스쳐 지나가는곳
	response.sendRedirect("goToPage.jsp");
%>
<redirect.jsp>
- response.sendRedirect("주소") : 해당 주소 페이지로 이동시킨다.

[Cookie객체]

<!--<index.jsp>-->
<%
	//쿠키는 PC에 저장되어 있으므로 서버에서 사용할 때 request로 가져오고 response로 저장시킨다.
	Cookie cookie = new Cookie("name","kim");//쿠키는 String, String으로만 저장된다.(값에 ,가 있으면 안된다)
	cookie.setMaxAge(60*10);//10분동안 유지 (초단위)
	response.addCookie(cookie); //클라이언트에 쿠키 저장
%>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
		<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    	<style>
            
    	</style>
    </head>
    <body>
    	<h2>쿠키 이름: <%=cookie.getName() %></h2>
		<h2>쿠키 값: <%=cookie.getValue() %></h2>
		<h2>쿠키 만료시간: <%= cookie.getMaxAge() %></h2>
		<input type="button" value="저장된 쿠키값 불러오기 " onclick="javascript:location.href='cookieResult.jsp'"/>
		<input type="button" value="쿠키예제" onclick="javascript:location.href='example/infoInput.jsp'"/>
	</body>
- 쿠키는 클라이언트에 저장되기 때문에 보안에 취약하다.
- 쿠키는 String으로만 저장된다. (Name,Value)로 저장.
- cookie.setMaxAge(초) : 쿠키 만료 시간을 정해줄 수 있다. (초단위)
- response.addCookie(cookie) : 클라이언트에 새로만든 쿠키를 저장함
- cookie.getName() : 쿠키의 name을 가져옴.
- cookie.getValue() : 쿠키의 값을 가져옴.
- cookie.getMaxAge() : 쿠키의 만료시간을 가져옴 

<index.jsp 브라우저>
<!--<cookieResult.jsp>-->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% //pc에 저장된 쿠키를 가져오는 내용
	Cookie[] cookies = request.getCookies(); //쿠키는 하나이상인 경우가 많기 때문에 배열로 받아오게 되어있음.
	String name = "";
	String value = "";
	if(cookies.length > 0){//쿠키가 1개라도 있으면
		for(int i=0; i<cookies.length; i++){
			if(cookies[i].getName().equals("name")){ //그 쿠키가 우리가 만든 이름이면
				//해당 이름과 값을 빼서 넣어라!
				name = cookies[i].getName();
				value = cookies[i].getValue();
			}
		}
	}
%>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
    </head>
    <body>
    	<h2>쿠키이름 : <%=name %></h2>
    	<h2>쿠키 값 : <%=value %></h2>
    </body>
</html>
- 쿠키를 클라이언트에 저장되기 때문에 request로 가져와야한다.
- request.getCookies() : 쿠키는 두개이상인 경우가 많기 때문에 배열로 가져온다.
- if ~ : 쿠키가 1개라도 있으면
- for ~ : 가져온 모든 쿠키에서
- 1f ~ : 쿠키의 name이 "name"과 같다면 변수에 해당 쿠키의 name과 value를 넣어라
- 라인 22, 23 : 브라우저에 출력

<cookieResult.jsp 브라우저>
<!--<example/infoInput.jsp>-->
<h3>언어를 설정해주세요!</h3>
<!-- 쿠키정보를 만들어서 쿠키값에 따라 다른 메시지를 보여주는 내용 -->
<form action="cookieSet.jsp" method="post">
    <input type="radio" name="lang" value="kor"/>한국어
    <input type="radio" name="lang" value="eng"/>English
    <input type="submit" value="설정"/>    		
</form>
<a href="cookieGet.jsp">welcome page</a>

<example/infoInput.jsp 브라우저>
<!--<cookieGet.jsp>-->
<%
	String name="";
	String val="kor";
	//클라이언트 서버에서 쿠키를 가져오는 내용
	Cookie[] cookies = request.getCookies();
	if(cookies.length>0){ //만약 쿠키의 name이 "lang"이라면
		for(Cookie cookie : cookies){ //val에 해당 쿠키의 Value값을 넣어라
			name = cookie.getName();
			if(name.equals("lang")){
				val = cookie.getValue();
				cookie.setMaxAge(0);
				response.addCookie(cookie);
			}}}%>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
    </head>
    <body>
    	<%if(val.equals("kor")){%>
    		<h2>한글 페이지 오신것을 환영합니다.</h2>
    	<%}else{%>
    		<h2>Welcome to English page!</h2>
		<%}%>
    </body>
</html>
- 기본 val = "kor";
- cookie.setMaxAge(0); : 현재 쿠키의 수명을 0으로 만든다. 해주지 않으면 쿠키가 남아있어 현재 val 값을 제대로 인식을 못한다.
- response.addCookie(cookie); : 클라이언트에 해당 쿠키 저장

[Session]

<!--<index.jsp>-->
<%
	/*객체에서 무언가를 가져올때 get, 넣을때, set으로 시작되는 메서드를 사용한다.*/
	String name = (String)session.getAttribute("name");//session은 objbect형태로 값을 저장한다.(형변환해줘야함)
	if(name == null){
		name="세션값이 존재  하지 않습니다.";
	}else{
		//세션의 값을 처리
	}
	/*세션에 대한 기타 정보들...*/
	//아무것도 하지 않을 경우 세션의 유지 시간(로그인하고 아무것도 안했을 때 얼마후 로그아웃되는 것처럼)
	System.out.println("세션유지시간 :" + session.getMaxInactiveInterval()+"초");//default : 30분
	//세션의 특정 값 가져오기
	System.out.println("세션 값 :" + session.getValue("name"));//웬만하면쓰지 말라고 경고(Attribute지향)
	//세션에 있는 속성들의 값
	String[] names = session.getValueNames();
	for(String n : names){
		System.out.println(n+" : "+session.getValue(n));
	}
%>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
	</head>
    <body>
    	<h2>세션테스트</h2>
    	<h3>세션에 저장된 값:<%=name %></h3>
		<h3>세션에 ID :<%=session.getId() %></h3>
		<a href="sessionSet.jsp">세션값 저장</a><br/>
		<a href="sessionDel.jsp">세션값 삭제</a><br/><!-- 세션을 삭제하는것 아니라 세션값만 삭제하는것 -->
		<a href="sessioninit.jsp">세션 초기화</a><br/><!-- 세션 자체를 초기화 -->
		<a href="./example/login.jsp">로그인예제</a><br/>
    </body>
</html>
- session은 서버에 저장돼서 보안성이 우수하다.
- 세션은 getAttribute로 값을 가져올 수 있으며 기본적으로 object이기때문에 
어떠한 변수에 넣을 때에는 형변환을 해줘야 한다. "name"이라는 이름의 세션을 만들어주었다.
- 세션에 이름만 있고 저장된 값은 없기 때문에 아직은 세션값이 존재하지 않는다로 나온다.
- session.getMaxInactiveInterval() : 아무것도 하지 않을 경우 세션의 유지시간을 가져온다.
- 세션 유지시간은 설정해주지 않으면 기본적으로 1800초 이다.
- session.getValue("name") : 세션의 값을 가져올수 있는 명령어이지만 웬만하면 사용하지 않는 것이 좋고 getAttribute로 사용하자
- session.getId() : 세션의 Id를 가져옴
<%
	//session에 name이라는 이름으로 무언가를 넣어준다.
	session.setAttribute("name", "new name change!!");//String, Object
	//세션 유지 시간을 1분으로 조정
	session.setMaxInactiveInterval(60);
	response.sendRedirect("index.jsp");
%>
<세션  저장, sessionSet.jsp>
- session.setAttribute(세션이름, 세션에 넣을 값) : 세션에 값을 넣어준다.
- session.setMaxInactinveInterval(초) : 세션 유지 시간 변경해주기
- reponse.sendRedirect("주소") : 해당 페이지로 이동하는데 index.jsp에서는 sessionSet.jsp에 해당하는 태그를 눌렀을 때 
이 과정이 빠르게 이루어지고 Redirect를 하기 때문에 값만 바뀌는 것처럼 보인다.
<%
	//session에서 name이라는 이름의 세션 값을 지운다.
	session.removeAttribute("name");
	response.sendRedirect("index.jsp");
%>
<세션  삭제, sessionDel.jsp>
- session.removeAttribute() : 세션을 삭제하는 것이 아니라 세션값(.setAttribute로 넣어준 값)만
삭제 하는 것이기 때문에 아이디는 유지하고 세션값만 삭제 된다.
<%
//세션 초기화 - 기존 세션을 지우고 다시 만드므로 세션의 아이디가 변경 된다.
	session.invalidate();
	response.sendRedirect("index.jsp");
%>
<세션 초기화, sessioninit.jsp>
- session.invalidate() : 세션초기화, 기존 세션을 지우고 다시 만드므로 세션 값도 삭제되고 
세션유지시간도 다시 기본값으로 돌아가고, 세션의 아이디도 변경된다.
<!--<로그인 예제, login.jsp>-->
<form action="loginResult.jsp" method="post">
    	<table border="1">
    		<tr>
    			<td>아이디</td>
    			<td>
    				<input type="text" name="id"/>
    			</td>
    		</tr>
    		<tr>
    			<td>비밀번호</td>
    			<td>
    				<input type="password" name="pw"/>
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2" align="center">
    				<input type="submit" name="LOGIN"/>
    				<input type="reset" name="RESET"/>
    			</td>
    		</tr>
    	</table>   
	</form>
<% //원래는 디비에서가져와서 아이디와 패스워드를 비교하는 작업을 한다.

String loginId = (String)session.getAttribute("userId");

if(loginId == null){ //로그인상태가 아니면
	String adminId = "admin";
	String adminPw = "pass";
	request.setCharacterEncoding("UTF-8");
	//1.파라메터를 받아온다.
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	System.out.println(id +"/"+pw);
	
	if(id == null || pw== null){//아이디나 비밀번호가 null로 들어오면..
		response.sendRedirect("login.jsp");
	}else{
		//2.아이디와 패스워드가 맞는지 확인
		if(id.equals(adminId) && pw.equals(adminPw)){ //3.맞으면..session에 받아온 아이디를 넣는다.
			session.setAttribute("userId", id);
		}else{//4.틀리면 login.jsp로 돌려보낸다
			response.sendRedirect("login.jsp");
		}
	}
}
%>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
		<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    </head>
    <body>
    	<h2>LOGIN SUCCESS</h2>
    	<h3>LOGIN ID : <%=session.getAttribute("userId") %> </h3>
    	<input type="button" value="logout" onclick="logout()"/>
    </body>
    <script>
		function logout(){
			location.href="logout.jsp";
		}
    </script>
</html>
<loginResult.jsp>
- 변수 loginId에 userId라는 이름으로 세션을 넣어줌
- loginId가 null이라는건 로그인 상태가 아니라는 거
- 원래는 DB에서 값을 받아오는데 아직 배우지 않았으므로 임의로 ID와 password를 만들어줌
- 클라이언트에서 name이 id인 것과 pw인것을 받아온다.
- 아이디나 비밀번호가 null로 들어오면(주소창에 loginResult.jsp를 입력해서 강제진입하는경우)
- response.sendRedirect("login.jsp"); : login.jsp로 돌려보낸다.
<!--<logout.jsp>-->
<% 
	session.removeAttribute("userId");
	response.sendRedirect("login.jsp");
%>

<login.jsp> , <로그인 성공했을  loginResult.jsp> 브라우저
profile
개발이좋아요

0개의 댓글