// https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api
compileOnly 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.3'
// https://mvnrepository.com/artifact/javax.servlet/jstl
implementation 'javax.servlet:jstl:1.2'
jspChap11
세션은 서버에 저장되고, 쿠키는 내 컴퓨터(클라이언트)에 저장됨
쿠키 생성 단계 : 주로 웹 서버 측에서 생성. 생성된 쿠키는 응답 데이터에 함
께 저장되어 웹 브라우저에 전송됨
쿠키 저장 단계 : 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에
보관. 쿠키는 종류에 따라 메모리나 파일로 저장됨
쿠키 전송 단계 : 웹 브라우저는 한 번 저장된 쿠키를 요청이 있을 때마다 웹
서버에 전송. 웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여 필요한 작업
을 수행할 수 있음.
주의! 쿠키는 remove가 없음. setmaxAge()를 0으로 만들면 삭제가 됨
Cookie( )
메소드를 사용
Cookie cookie = new Cookie(String name, String value)
첫 번째 매개변수 name은 쿠키를 식별하기 위한 이름
두 번째 매개변수 value는 쿠키 값
쿠키를 생성한 후에는 반드시 response 내장 객체의 addCookie( )
메소드로 쿠키를 설정해야 함
사용 예
Cookie cookie = new Cookie("userId", "admin");
response.addCookie(cookie);
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<form action="cookie01_process.jsp" method="post">
<label for="user-id">아이디 : </label>
<input type="text" id="user-id" name="userId" placeholder="아이디를 입력해주세요"><br>
<label for="user-pw">비밀번호 : </label>
<input type="text" id="user-pw" name="userPw" placeholder="비밀번호를 입력해주세요"><br>
<button type="submit">버튼</button>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<%
String userId = request.getParameter("userId");
String userPw = request.getParameter("userPw");
if (userId.equals("admin") && userPw.equals("1234")) {
Cookie cookieId = new Cookie("userId", userId);
Cookie cookiePw = new Cookie("userPw", userPw);
//쿠키를 생성한 후에는 반드시 response 내장 객체의 `addCookie( )` 메소드로 쿠키를 설정해야 함
response.addCookie(cookieId);
response.addCookie(cookiePw);
out.println("쿠키 생성이 성공하였습니다.");
out.println(userId + "님 환영합니다.");
}
else {
out.println("쿠키 생성이 실패하였습니다.");
}
%>
</body>
</html>
getCookies( )
메소드를 사용Cookie[] requset.getCookies()
getName( )
, getValue( )
메소드를 사용String getName( )
/ String getValue( )
cookie02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
out.println("현재 설정된 쿠키의 개수 => " + cookies.length + "<br>");
out.println("==================================================<br>");
for (int i = 0; i < cookies.length; i++) {
out.println("설정된 쿠키의 속성 이름 [" + i + "] : " + cookies[i].getName() + "<br>");
out.println("설정된 쿠키의 속성 값 [" + i + "] : " + cookies[i].getValue() + "<br>");
out.println("==================================================<br>");
}
%>
</body>
</html>
setMaxAge( )
메소드의 형식void setMaxAge(int age)
cookie01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<form action="cookie01_process.jsp" method="post">
<label for="user-id">아이디 : </label>
<input type="text" id="user-id" name="userId" placeholder="아이디를 입력해주세요"><br>
<label for="user-pw">비밀번호 : </label>
<input type="text" id="user-pw" name="userPw" placeholder="비밀번호를 입력해주세요"><br>
<button type="submit">버튼</button>
</form>
<a href="cookie01.jsp">쿠키 생성</a>
<a href="cookie02.jsp">쿠키 확인</a>
<a href="cookie03.jsp">쿠키 삭제</a>
</body>
</html>
cookie01_process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<%
String userId = request.getParameter("userId");
String userPw = request.getParameter("userPw");
if (userId.equals("admin") && userPw.equals("1234")) {
Cookie cookieId = new Cookie("userId", userId);
Cookie cookiePw = new Cookie("userPw", userPw);
//쿠키를 생성한 후에는 반드시 response 내장 객체의 `addCookie( )` 메소드로 쿠키를 설정해야 함
response.addCookie(cookieId);
response.addCookie(cookiePw);
out.println("쿠키 생성이 성공하였습니다.");
out.println(userId + "님 환영합니다.");
}
else {
out.println("쿠키 생성이 실패하였습니다.");
}
%>
<a href="cookie01.jsp">쿠키 생성</a>
<a href="cookie02.jsp">쿠키 확인</a>
<a href="cookie03.jsp">쿠키 삭제</a>
</body>
</html>
cookie02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
out.println("현재 설정된 쿠키의 개수 => " + cookies.length + "<br>");
out.println("==================================================<br>");
for (int i = 0; i < cookies.length; i++) {
out.println("설정된 쿠키의 속성 이름 [" + i + "] : " + cookies[i].getName() + "<br>");
out.println("설정된 쿠키의 속성 값 [" + i + "] : " + cookies[i].getValue() + "<br>");
out.println("==================================================<br>");
}
%>
<a href="cookie01.jsp">쿠키 생성</a>
<a href="cookie02.jsp">쿠키 확인</a>
<a href="cookie03.jsp">쿠키 삭제</a>
</body>
</html>
cookie03.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>쿠키 사용하기</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
// JSESSIONID 빼고 다 삭제해라
for (int i = 0; i < cookies.length; i++) {
if (!cookies[i].getName().equals("JSESSIONID")) {
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);
}
}
response.sendRedirect("cookie02.jsp");
%>
<a href="cookie01.jsp">쿠키 생성</a>
<a href="cookie02.jsp">쿠키 확인</a>
<a href="cookie03.jsp">쿠키 삭제</a>
</body>
</html>
jspChap12.project
https://commons.apache.org/
빌드 시스템을 사용하지 않을때는 다운로드 받아서 프로젝트 폴더 내에 넣어야 하지만
빌드시스템 사용시에는 메이븐 레파지토리에서 해당 파일 찾아서 링크 -> build.gradle에 복붙
웹 브라우저에서 서버로 파일을 전송하기 위해서는 JSP페이지에 폼 태그 사용
웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것이며, 전송되는 파일을 서버에 저장하기 위해 오픈 라이브러리 사용해야함
웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그를 작성할 때 몇 가지 중요한 규칙
form 태그의 method 속성은 반드시 POST 방식으로 설정
form 태그의 enctype 속성은 반드시 multipart/form-data로 설정
form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일로 설정
파일 업로드를 위해 input 태그의 type 속성을 file로 설정
만약 여러 파일을 업로드하려면 2개 이상의 input 태그를 사용하고 name 속성에 서로 다른 값을 설정
// Apache Common IO
// https://mvnrepository.com/artifact/commons-io/commons-io
implementation 'commons-io:commons-io:2.11.0'
// Apache Commons FileUpload
// https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
implementation 'commons-fileupload:commons-fileupload:1.4'
DiskFileUpload 클래스의 메소드
FileItem 클래스의 메소드
fileUpload01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>파일 사용하기</title>
</head>
<body>
<form action="fileUpload01_process.jsp" method="post" enctype="multipart/form-data">
<label for="file">파일 : </label>
<input type="file" id="file" name="fileName">
<button type="submit">파일 업로드</button>
</form>
</body>
</html>
fileUpload01_process.jsp
<%--<%@ page import="org.apache.commons.fileupload.DiskFileUpload" %>--%>
<%--<%@ page import="java.util.List" %>--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%-- 고정 추가 하기 --%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%-- 3개 추가 끝 --%>
<!DOCTYPE html>
<html>
<head>
<title>파일 사용하기</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String fileUploadPath = "C:\\java505git\\upload";
DiskFileUpload upload = new DiskFileUpload();
// alt + Enter => 클래스 가져오기 (java.util)
List items = upload.parseRequest(request);
// 반복 가능한 객체로 생성
Iterator params = items.iterator();
// hasNext() : 다음 데이터가 존재하는지 확인
while (params.hasNext()) {
// next() : 다음 데이터를 가져옴
FileItem fileItem = (FileItem) params.next();
// FormField가 맞는지 확인
if (!fileItem.isFormField()) {
// FormField가 아니라면 file 객체가 가지고있는 이름 가져옴
String fileName = fileItem.getName();
// lastIndexOf : 가장 마지막에 나온 \\ 의 인덱스번호 추출
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
// 저장할경로 + / + 파일이름
File file = new File(fileUploadPath + "/" + fileName);
// 실제 파일 저장
fileItem.write(file);
}
}
%>
</body>
</html>
fileUpload02.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>파일업로드</title>
</head>
<body>
<form action="fileUpload02_process.jsp" method="post" enctype="multipart/form-data">
<label for="user-name">이름 : </label>
<input type="text" id="user-name" name="userName"><br>
<label for="subject">제목 : </label>
<input type="text" id="subject" name="subject"><br>
<label for="file">파일 : </label>
<input type="file" id="file" name="file"><br>
<button type="submit">파일 업로드</button>
</form>
</body>
</html>
fileUpload02_process.jsp
<%--<%@ page import="org.apache.commons.fileupload.FileItem" %>--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<title>파일 업로드 process</title>
</head>
<body>
<%
String path = "C:\\java505git\\upload";
DiskFileUpload upload = new DiskFileUpload();
upload.setFileSizeMax(1000000);
upload.setSizeThreshold(4096);
upload.setRepositoryPath(path);
List items = upload.parseRequest(request);
Iterator params = items.iterator();
while (params.hasNext()) {
FileItem item = (FileItem) params.next();
// 사용자 입력을 받는 input 타입인지 파일인지 확인
if (item.isFormField()) {
// input 태그일 경우 사용자 입력 정보 가져오기
String name = item.getFieldName();
String value = item.getString("utf-8");
out.println(name + "=" + value + "<br>");
}
else {
// 파일일 경우 파일 정보 가져오기
String fileFieldName = item.getFieldName();
// 파일명 가져오기
String fileName = item.getName();
// 파일 타입 가져오기
String contentType = item.getContentType();
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
// 파일 크기 가져오기
long fileSize = item.getSize();
File file = new File(path + "/" + fileName);
item.write(file);
out.println("-----------------------------------------<br>");
out.println("요청 파라미터 이름 : " + fileFieldName + "<br>");
out.println("저장 파일 이름 : " + fileName + "<br>");
out.println("파일 콘텐츠 유형 : " + contentType + "<br>");
out.println("파일 크기 : " + fileSize);
}
}
%>
</body>
</html>
MySQL WorkBench 사용
mysql 서버로 접속(동작중인지 확인)
동작중인것 확인 완료
cmd -> cd C:\Program Files\MySQL\MySQL Server 8.0\bin (mysql 경로)
mysql -u root -p 엔터 -> 패스워드 1234 입력
show databases;
mysql의 user 테이블만 사용 가능, 나머지 3개의 테이블은 건들면 절대 안됨
워크벤치 실행
접속 테스트 실행
build.gradle 추가할 것
추가할 MySQL Connector/J 코드
// https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
implementation 'commons-fileupload:commons-fileupload:1.4'
java.sql.*
패키지 임포트<%@ page import:java.sql.*%>
Class.forName(String ClassName);
getConnection(String url)
메소드 사용jspChap13.project
connection.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Connection conn = null;
try {
// 접속할 주소, id, pw 설정
String url = "jdbc:mysql://localhost:3306/javadb";
String userId = "test1";
String userPw = "java505";
// 드라이버 사용
Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager에 getConnection()을 통해 접속 -> 정상 : conn에 객체를 넘겨주고 실패 : 연결실패 출력 후 conn이 닫힘
conn = DriverManager.getConnection(url, userId, userPw);
out.println("데이터 베이스 연결이 성공하였습니다.");
}
catch (SQLException e) {
out.println("데이터 베이스 연결이 실패했습니다.");
out.println("SQLException : " + e.getMessage());
}
finally {
// 접속 해제 부분 : if 없이 그냥 conn.close(); 하면 안됨.
if (conn != null) {
conn.close();
}
}
%>
</body>
</html>
use mysql;
show tables;
SELECT host, user, authentication_string FROM user;
-- mysql 명령어
-- <사용자 추가 명령>
-- 사용자만 추가
-- create user '계정명';
-- 사용자 및 비밀번호를 추가하면서 접속할 수 있는 주소를 함께 설정
-- create user '계정명'@'접속주소' identified by '비밀번호';
-- <사용자 삭제 명령>
-- drop user '계정명'@'접속주소';
-- <사용자 비밀번호 변경
-- alter user '사용자계정'@'접속주소' identified with mysql_native_password by '변경할 비밀번호'
-- <DB 생성 명령어>
-- 단순 DB 생성
-- create database DB이름;
-- <DB 생성 및 사용 문자셋 설정>
-- create database DB이름 default character set utf8;
-- <DB 삭제 명령어>
-- drop database DB명 ;
-- <DB 사용 권한 확인>
-- show grants for '사용자계정'@'접속주소';
-- <DB 사용 권한 설정>
-- grant all privileges on DB명.테이블명 to '사용자계정'@'접속주소';
-- <DB 사용 권한 제거>
-- revoke all on DB명.* from '사용자계정'@'접속주소';
-- <변경 내용 즉시 적용>
-- flush privilleges ;
use mysql;
select host, user, authentication_string from user;
create user 'testuser1'@'localhost' identified by 'java505git';
drop user 'testuser1'@'localhost';
-- id : test1, pw : java505git
create user 'test1'@'localhost' identified by 'java505git';
-- DB 사용 권한 확인
show grants for 'test1'@'localhost';
-- DB 사용 권한 주기
grant all privileges on javadb.* to 'test1'@'localhost';
revoke all on javadb.* from 'test1'@'localhost';
alter user 'test1'@'localhost' identified with mysql_native_password by '505java';
alter user 'test1'@'localhost' identified with mysql_native_password by 'java505';
insert01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>DB 사용하기</title>
</head>
<body>
<form action="insert01_process.jsp" method="post">
<label for="user-id">아이디 : </label>
<input type="text" id="user-id" name="userId"><br>
<label for="user-pw">비밀번호 : </label>
<input type="text" id="user-pw" name="userPw"><br>
<label for="user-name">이름 : </label>
<input type="text" id="user-name" name="userName"><br>
<button type="submit">전송</button>
</form>
</body>
</html>
insert01_process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>DB 사용하기</title>
</head>
<body>
<%
Connection conn = null;
Statement stmt = null;
try {
String url = "jdbc:mysql://localhost:3306/javadb";
String user = "test1";
String passwd = "java505";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, passwd);
request.setCharacterEncoding("utf-8");
String userId = request.getParameter("userId");
String userPw = request.getParameter("userPw");
String userName = request.getParameter("userName");
String sql = "INSERT INTO member (id, passwd, name) ";
sql += "VALUES ('" + userId + "', '" + userPw + "', '" + userName + "') ";
stmt = conn.createStatement();
stmt.executeUpdate(sql);
out.println("Member 테이블에 데이터 추가가 성공했습니다.");
}
catch (SQLException e) {
out.println("Member 테이블에 데이터 추가가 실패했습니다.");
out.println("SQLException : " + e.getMessage());
}
finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
</body>
</html>