12. 데이터 삽입 작업
=> 입력한 내용을 현재 프로젝트의 insert 디렉토리에 현재 날짜이름.txt 파일에 저장하고 결과 출력
=> insert 디렉토리에 input -> process -> output.jsp 파일 이용
1) input.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력</title>
</head>
<body>
<form action="process.jsp">
<input type="email" name="email"
placeholder="email을 입력하시오" required="required"/>
<input type="password" name="password"
placeholder="password를 입력하시오" required="required"/>
<input type="text" name="nickname"
placeholder="별명을 입력하시오" required="required"/>
<br/>
<input type="submit" value="회원 가입" />
</form>
</body>
</html>
2) process.jsp
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.OutputStreamWriter"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.io.PrintWriter"%>
<%@page import="java.sql.Date"%>
<%@page import="java.util.GregorianCalendar"%>
<%@page import="java.util.Calendar"%>
<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 파라미터 읽기
String email = request.getParameter("email");
String password = request.getParameter("password");
String nickname = request.getParameter("nickname");
//콘솔에 출력하는 코드
//null이 출력되면 파라미터 이름이 잘못 되었거나 선택하지 않은 것
System.out.println("email : " + email);
System.out.println("password : " + password);
System.out.println("nickname : " + nickname);
//2. business logic을 수행하고 결과를 생성
boolean result = true;
//오늘 날짜를 문자열로 만들기
Calendar calendar = new GregorianCalendar();
Date today = new Date(calendar.getTimeInMillis());
String filename = today.toString();
//insert의 경로 가져오기
String filepath = application.getRealPath("/insert");
String logfile = filepath + "/" + filename + ".txt";
//현재 프로젝트의 insert 디렉토리에 오늘날짜.txt파일에
//email, password, nickname 기록
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(logfile, true)));
//파일에 기록
pw.println(email + " : " + password + " : " + nickname + " : "
+ request.getRemoteAddr() + "\n");
//버퍼 비우고 스트림 닫기
pw.flush();
pw.close();
//3. 결과를 저장하고 결과 페이지로 이동
request.setAttribute("result", result);
//포워딩 하기
RequestDispatcher dispatcher = request.getRequestDispatcher("output.jsp");
dispatcher.forward(request, response);
%>
3) output.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과 출력</title>
</head>
<body>
<%
//앞에서 넘겨준 데이터 가져오기
Boolean result = (Boolean)request.getAttribute("result");
if(result == true){
out.println("회원 가입 성공");
}else{
out.println("회원 가입 실패");
}
%>
</body>
</html>
=> 파라미터 만들기 -> 파라미터 읽기
결과 저장(setAttribute) -> 결과 페이지로 이동(forwarding, redirect의 개념)
4) 비밀번호 입력란이 있는데 비밀번호가 주소 표시줄에 보이는 문제
=> form의 데이터를 POST방식으로 전송하여 header에 숨겨야 함
=> form 태그에 method="post"를 추가
5) post방식으로 전송하면 기본 인코딩이 ISO-8859-1로 설정되어 한글이 깨짐
=> 파라미터를 읽기 전에 request.setCharacterEncoding("utf-8")을 추가
6) forwarding을 이용하여 결과 출력페이지로 이동시 URL이 변경되지 않고 결과페이지의 결과만 가져와서 출력
=> 새로고침시 처리부분이 재수행
=> 삽입, 삭제, 갱신 작업의 경우 결과페이지 이동시 포워딩을 하면 안됨
7) process.jsp 파일 수정
//포워딩 하기
/* RequestDispatcher dispatcher = request.getRequestDispatcher("output.jsp");
dispatcher.forward(request, response); */
//리다이렉트 하기
response.sendRedirect("output.jsp");
8) redirect를 하게되면 request 객체가 새로 만들어짐
=> redirect를 할 때는 request 객체에 데이터를 저장하면 안되고 sesstion이나 application객체에 데이터를 저장
//3. 결과를 저장하고 결과 페이지로 이동
//request.setAttribute("result", result);
//포워딩이 아니라 리다이렉트로 이동할거라 수정
session.setAttribute("result", result);
=> output.jsp 파일의 데이터 가져오는 부분을 수정
//앞에서 넘겨준 데이터 가져오기
//Boolean result = (Boolean)request.getAttribute("result");
Boolean result = (Boolean)session.getAttribute("result");
**프로그램 처리 흐름
=> 요청(request - input) -> 처리(process) -> 결과 출력(response - output)
=> 요청에서 처리하는 쪽으로 넘겨주는 데이터 : parameter
=> 처리하고 결과를 출력하기 위해서 넘겨주는 데이터 : attribute
=> 요청하는 방법
- a나 form 태그
- javascript 코드
=> 처리를 끝내고 결과를 출력하기 위한 방법
- forwarding
- redirect
**<jsp:include>
=> 다른 페이지를 태그가 위치한 부분에 포함 시킬때 사용하는 태그
<jsp:include page="포함할 페이지" flush="true" 또는 "false">
=> 페이지의 수행 결과를 포함
**<%@ include @>
=> 다른 페이지를 태그가 위치한 부분에 포함시킬때 사용하는 태그
<%@ include file="포함할 파일" %>
=> 페이지의 코드를 포함
**2개의 태그 목적
=> 동일한 코드가 여러곳에서 사용되는 경우 하나만 만들어서 사용하기 위해
=> 페이지 수행결과를 가져오면 페이지 코드를 사용할 수 없지만 코드를 가져오면 사용 가능
**웹 프로그래밍에서의 요청과 결과 출력
1. Web Client Page에서 서버에게 요청하는 방법
1) 태그를 이용하는 방법
- a태그 이용 : href 속성에 요청할 URL을 설정
- form 태그 이용 : action 속성에 요청할 URL 설정, form안에 submit type의 버튼 제작 후, 누르면 설정 URL에 요청
2) 자바스크립트를 이용한 요청
- location.href = "요청할 URL" 대신에 window.location을 이용해도 동일한 결과
- form객체.submit() : form안에서 submit 버튼을 누른 것과 동일한 효과
- ajax 요청
- location.reload() : 새로고침
- history.go(인덱스), history.back(), history.foward()
2. Parameter 생성
=> parameter는 Web Client에서 Web Server에게 전송하는 데이터
=> parameter는 인코딩하여 전송해야 함
1) a태그의 경우 URL뒤에 ?를 추가하고 이름=값&이름=값 의 형태로 직접 설정
2) form태그, form태그의 submit()을 직접 호출하는 경우 form안에 name속성을 갖는 객체들의 합이 parameter가 됨
=> get 방식이면 URL뒤에 붙여서 전송, post방식이면 header에 감추어서 전송
3) ajax의 경우 데이터(Formdata 객체를 만들어도 되고 {이름=값, 이름=값..})를 별도로 만들어서 전송
3. WebServer에서 파라미터 읽기
=> request객체의 getParameter(String 리턴)나 getParameterValues(String[] 리턴) 메소드를 이용
4. WebServer에서 결과를 전송
=> HTML이나 JSP : Web Client에서만 사용 가능
=> json이나 xml : 모든 Client에서 사용 가능
1) 서버에서 만든 결과를 attribute라고 함
2) attribute를 저장할 수 있는 객체
=> page : 현재 페이지에서만 공유
=> request : forwarding 했을 때 만 공유
=> session : forwarding이나 redirect 모두 공유(ex - 내로그인 정보)
=> application : 전체가 공유(ex - 전체 접속자 수)
3) 메소드
- setAttribute(String name, Object value) : 저장
- getAttribute(String name) : name에 해당하는 데이터를 Object 타입으로 리턴
=> Object타입으로 리턴되므로 출력시 바로 출력되지만 타용도로 사용시 원래 자료형으로 강제 형변환 하여 사용
- removeAttribute(String name) : 삭제
4) 결과 페이지 이동
=> forwarding : URL을 변경하지 않고 결과페이지를 가져오는 방식으로 이동
- 새로고침시 결과페이지가 다시보이는 것이 아니라 처리를 다시하고 결과를 재출력하는 방식
- 자신의 서버외의 요청을 못함
- 조회작업 : forwarding(로그인은 조회지만 redirect)
=> redirect : URL을 변경하고 결과 페이지로 이동
- 새로고침을 하면 결과만 다시 출력
- 자신의 서버 이외의 요청을 할 수 있음
- 조회작업이 아니면 : redirect(거의 대부분)
**HTTP & HTTPS
=> HTTP와 HTTPS는 연결에 사용된 어떠한 정보도 저장하지 않음(연결후에는 이전상태 확인 불가)
=> 이전 요청과 연관된 작업을 연속해서 수행하는데 문제가 발생
1. Cookie
=> 정보 저장후, 클라이언트 브라우저에 보관하고, 서버에 요청이 발생시마다 같이 전송하여 서버가 클라이언트의 상태를 알게 하는 개체
2. HttpSession - session
=> 정보를 서버의 객체에 저장하고 사용자가 세션을 강제 소멸시키거나 브라우저 종료시까지 정보를 유지하는 객체
3. HTML5의 WebStorage, Web SQL, Indexed DB
=> 이전 상태를 사용은 하지만 서버가 알 필요가 없는 데이터들을 Cookie나 Session에 저장하는 것은 불필요한 행동
=> 브라우저에만 저장되고 서버에는 전송되지 않는 기술
4. HTML5의 WebSocket
=> Web환경에서 TCP 통신을 하기 위한 기술
**Cookie
=> Web Server와 Web Browser 간의 상태를 주고 받는 방법 중의 하나
=> Web Browser에 데이터를 저장하고 Web Server에 요청시마다 전송되는 데이터
=> 클라이언트의 브라우저에 저장되어 클라이언트가 임의조작이 가능하여 보안이 필요한 데이터 저장에는 부적합
1. 쿠키의 동작 방식
=> 쿠키 생성
=> 쿠키를 저장
=> 쿠키를 전송
2. 구성요소
=> 이름 : 구별하기 위한 요소
=> 값 : 실제 저장된 내용
=> 유효시간
=> 사용가능한 도메인
=> 사용가능한 경로
3. 생성과 저장
1) 생성 : new Cookie(String name, String value)
=> name이나 value는 인코딩하여 저장해야 함
2) 저장 : response객체.addCookie(Cookie cookie)
4. Cookie의 메소드
=> String getName()
=> String getValue()
=> void setValue(String value)
=> void setMaxAge(int 유효시간)
5. 서버에서 모든 쿠키 읽기
- Cookie[] request객체.getCookies()
6. Cookie의 수정과 삭제
=> Cookie를 수정하고자 할 경우 setValue 메소드 이용
=> Cookie를 삭제하는 메소드는 없고, setMaxAge를 이용하여 유효시간을 0으로 설정하는 방식 이용
7. Cookie를 이용한 아이디 저장
1) index.jsp 파일을 만들고 로그인화면 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션과 쿠키</title>
</head>
<body>
<form action="login.jsp" method="post">
아이디<input type="text" name="id" required="required" size="40"/><br/>
비밀번호<input type="password" name="pw" required="required" size="40"/><br/>
<input type="checkbox" name="idsave" value="save"/>아이디저장
<input type="submit" value="로그인"/>
</form>
</body>
</html>
2) login.jsp에서 로그인을 처리
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 처리</title>
</head>
<body>
<%
//파라미터 읽기
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String idsave = request.getParameter("idsave");
//idsave의 값을 확인
//value에 설정된 save가 나오면 체크를 한 것이고 null이면 체크를 안한 것
//System.out.println(idsave);
//아이디 저장에 체크 하지 않은 경우
if(idsave == null){
//id를 저장한 쿠키가 있으면 삭제
//모든 쿠키를 전부 가져오기
Cookie[] cookies = request.getCookies();
//쿠키가 존재한다면
if(cookies != null){
//쿠키를 전부 순회
for(Cookie cookie : cookies){
//id라는 이름의 쿠키가 존재한다면
if(cookie.getName().equals("id")){
//쿠키 삭제(쿠키의 수명을 0으로 만들어 삭제)
cookie.setMaxAge(0);
response.addCookie(cookie);
break;
}
}
}
}else{
//쿠키 생성
Cookie cookie = new Cookie("id", id);
//쿠키 저장
response.addCookie(cookie);
}
//결과 페이지로 리다이렉트
response.sendRedirect("loginresult.jsp");
%>
</body>
</html>
3) loginresult.jsp를 생성하고 결과를 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 결과</title>
</head>
<body>
<a href="index.jsp">메인페이지</a>
</body>
</html>
4) index.jsp 페이지 수정
=> id를 저장한 쿠키가 있으면 쿠키의 값을 id란에 출력하고 아이디 저장란을 체크하기
<%
//세션에 nickname값을 가져와서 변수에 저장
//세션에 저장된 상태가 아니면 null
String nickname = (String)session.getAttribute("nickname");
%>
<%if(nickname == null){ %>
<form action="login.jsp" method="post">
아이디<input type="text" name="id" value='<%=id %>'
required="required" size="40"/><br/>
비밀번호<input type="password" name="pw" required="required" size="40"/><br/>
<input type="checkbox" name="idsave" value="save" <%=idsave %>/>아이디저장
<input type="submit" value="로그인"/>
</form>
<%}else{%>
<%=nickname %>님 환영합니다.<br/>
<a href="logout.jsp">로그아웃</a>
<%} %>
**Session
=> 자료형은 HttpSession
=> jsp 파일에는 처음부터 존재하고 다른 곳에서 사용하고자 할 때는 request객체.getSession()으로 리턴 받아서 사용
=> 하나의 브라우저에서 서버에 접속을 하면 그 브라우저를 위한 Map을 서버에 하나 생성하는데 이 Map을 Session 이라고 합니다.
=> 사용자가 10명까지 접속할 수 있다라는 애기는 Session을 10개 까지 생성할 수 있다라는 의미입니다.
=> Session이라는 말 대신 Token 이라는 단어를 이용하기도 합니다.
1. 용도
=> 브라우저가 접속을 시작해서 종료할때까지 유지해야하는 데이터를 저장
(로그인 정보나 장바구니 정보 같은 것을 저장하는 용도로 많이 사용)
2. 사용
1) 데이터 저장 : void setAttribute("이름", 데이터)
2) 데이터 읽기 : Object getAttribute("이름");
=> 데이터 사용시에는 원래 자료형으로 강제형변환 하여 사용
3) 데이터 삭제 : void removeAttribute("이름");
4) 데이터 수정 : 존재하는 일므을 이용해서 저장하면 수정
3. 세션 초기화 - 모든 데이터 삭제 : 로그아웃
1) 세션 객체가 invalidate() 호출
2) web.xml 파일에 설정
<session-config>
<session-timeout>분단위 시간</session-timeout>
</session-config>
=> 설정한 시간동안 세션을 사용하지 않으면 초기화되는 시간을 설정
4. 로그인 처리
1) 아이디와 비밀번호를 입력하여 로그인 시도시 데이터베이스에 가서 확인
2) 아이디와 비밀번호 정보가 맞으면 필요정보(아이디나 닉네임)을 세션에 저장
3) 이후 로그인 여부는 저장된 데이터를 가지고 판단하며, 로그아웃은 세션에 저장된 데이터를 삭제하는 형태로 진행
5. 세션 사용시 고려사항
=> 세션은 서버의 메모리를 사용
=> 세션에 많은 양의 정보를 저장하는 것은 권장하지 않음
=> 세션에 많은 데이터 저장시 메모리 데이터베이스 사용을 권장
6. 세션을 이용한 로그인 처리
1) login.jsp 하단에 로그인된 경우 세션에 정보를 저장하는 코드를 추가
//로그인이 되었을 때 필요한 정보를 Session에 저장
session.setAttribute("id", id);
session.setAttribute("nickname", "SG");
//결과 페이지로 리다이렉트 - 로그인 페이지로 돌아가기
response.sendRedirect("loginresult.jsp");
2) index.jsp 파일을 수정
=> 로그인이 안된 경우는 로그인 화면, 로그인 된 경우는 nickname을 출력하고 로그아웃 링크를 출력하도록 수정
<%
//세션에 nickname값을 가져와서 변수에 저장
//세션에 저장된 상태가 아니면 null
String nickname = (String)session.getAttribute("nickname");
%>
<%if(nickname == null){ %>
<form action="login.jsp" method="post">
아이디<input type="text" name="id" value='<%=id %>'
required="required" size="40"/><br/>
비밀번호<input type="password" name="pw" required="required" size="40"/><br/>
<input type="checkbox" name="idsave" value="save" <%=idsave %>/>아이디저장
<input type="submit" value="로그인"/>
</form>
<%}else{%>
<%=nickname %>님 환영합니다.<br/>
<a href="logout.jsp">로그아웃</a>
<%} %>
3) logout.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>
<%
//세션을 초기화
session.invalidate();
//메일 페이지로 이동
response.sendRedirect("index.jsp");
%>
</body>
</html>
4) web.xml파일에 세션 만료 시간 설정
<!-- 3분동안 세션을 사용하지 않으면 세션이 자동으로 초기화 -->
<session-config>
<session-timeout>3</session-timeout>
</session-config>
5) web.xml 파일 수정시 서버를 다시 시작
=> web.xml 파일은 서버가 구동 될 때 1번만 읽어서 사용하기 때문
'수업 정리' 카테고리의 다른 글
52일차 수업 정리(HttpServlet, Model2 MVC 구조의 프로젝트 생성) (0) | 2020.06.19 |
---|---|
51일차 수업 정리(예외 처리, EL, JSTL) (0) | 2020.06.18 |
49일차 수업정리(Request, Response 객체, web.xml) (0) | 2020.06.16 |
48일차 수업정리(HttpServlet, JSP) (0) | 2020.06.15 |
47일차 수업정리(jquery) (0) | 2020.06.12 |