11.8일 (session/ jsp-cos.jar/ db연동-게시판)
Session
- 클라이언트를 식별할 때 사용 (클라이언트마다 세션이 생성)
식별이 가능하기 때문에 같은 클라이언트에만 클라이언트별 정보 제공 가능 == 유니크하게 클라이언트 관리 가능 - 세션 생성 -> 클라이언트에 전송 -> 클라이언트 쿠키로 저장 -> 해당 세션 접근 시 사용
- 우클릭 검사 application cookies 에서 jsessionid 확인 가능
- 만료시간 30분 / 재접속 시 30분 연장
session의 주요 메서드
메서드 | 리턴 타입 | 설명 |
getId() | String | 세션의 고유 ID를 구함 |
getCreationTime() | long | 세션이 생성된 시간을 구함. 시간은 1970년1월1일 이후 흘러간 시간을 의미. 단위는 1/1000초 |
getLastAccessedTime() | long | 웹 브라우저가 가장 마지막에 섹션에 접근한 시간을 구함. 시간은 1970년1월1일 이후 흘러간 시간을 의미. 단위는 1/1000초 |
setMaxInactiveInterval(int second) | void | 세션 유효시간을 초단위로 설정 |
getMaxinactiveInterval() | int | 설정된 세션 유효시간을 반환 |
ch08-session
s01_sessionInfo.jsp
+ 세션 유지 시간 지정 변경 설정 1) web.xml 2) jsp (세션은 안 건드리는게 제일 좋긴 함)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
Date time = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 정보</title>
</head>
<body>
세션 ID : <%= session.getId() %><br>
세션 생성 시간 : <%= session.getCreationTime() %><br> <%-- 기본값: long타입으로 출력 --%>
<%
time.setTime(session.getCreationTime());
%>
세션 생성 시간 : <%= sf.format(time) %><br>
최근 접근 시간 : <%= session.getLastAccessedTime() %><br>
<%
time.setTime(session.getLastAccessedTime());
%>
최근 접근 시간 : <%= sf.format(time) %><br>
<%-- web.xml에서 세션 유지시간 설정 가능 --%>
<%-- 1800(30분) -> 3000(50분)으로 변경됨 --%>
세션 유지 시간 변경하기 (기본 세션 유지 시간은 30분임)<br>
<%
//web.xml에 50분으로 지정된 상태임
//JSP에서 셋팅한 정보가 현재 세션에 우선 반영됨 (JSP > web.xml)
session.setMaxInactiveInterval(60*20); // 초단위로 입력
%>
세션 유지 시간 : <%= session.getMaxInactiveInterval() %>초<br> <%-- 기본값: 초단위 --%>
<%-- 3000(50분) -> 1200(20분) 으로 변경됨
근데 별로 좋은 방법은 아님 페이지마다 지정해야 하는데 어떤건 jsp 어떤건 xml 지정되면 헷갈림
사실 세션은 안건드리는게 제일 좋음
--%>
</body>
</html>
** 생성 시간 != 최근 접근 시간
** 최근 접근 시간 기준으로 +30분
** web.xml (환경설정) 에서 세션 유지 시간 지정 설정 가능 (분 단위로 지정)
web-inf
web.xml (분 단위로 지정)
<!-- 세션 유지 시간 지정 (분단위로 지정) 시작 -->
<session-config>
<session-timeout>50</session-timeout>
</session-config>
<!-- 세션 유지 시간 지정 (분단위로 지정) 끝 -->
web.xml에서 50분으로 지정했지만 JSP에서 반영한 정보가 현재 세션에 우선 반영됨 (60*20 / 초단위)
id- pw 입력 후 창 넘어가는 form과 jsp파일 만들어보기 (원래 db연동이 되어있어야 하는데 연동 없이 간략하게 생성)
로그인 정보가 맞으면 넘어가고, 세션 안에 저장되어 있는 id를 창에 표시해주는 것
s02_sessionLoginForm.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="s03_sessionLogin.jsp" method="post">
아이디 <input type="text" name="id" size="10"><br>
비밀번호 <input type="password" name="password" size="10"><br>
<input type="submit" value="login">
</form>
</body>
</html>
form에 action="s03_sessionLogin.jsp" 이라고 되어있어서 s03으로 넘어감
s03_sessionLogin.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 password = request.getParameter("password");
//테스트용으로 id와 비밀번호가 같으면 로그인 처리
if(id.equals(password)){ //로그인 성공
//세션에 아이디가 있으면 로그인 성공 없으면 실패
//속성명 속성값
session.setAttribute("user_id", id);
%>
<%-- 로그인 성공+회원 서비스 UI --%>
<%= id %>님이 로그인했습니다.<br>
<input type="button" value="로그인 체크" onclick="location.href='s05_sessionLoginCheck.jsp'"> <%-- 인라인 방식으로 js / 이동하게 만들려고 --%>
<input type="button" value="로그아웃" onclick="location.href='s04_sessionLogout.jsp'">
<%
}else{ //로그인 실패
//다시 Loginform으로 보내서 입력하게 함 (script를 이용 / history.go(-1))
%>
<script type="text/javascript">
alert('로그인에 실패했습니다.');
history.go(-1);
</script>
<%
}
%>
</body>
</html>
<% %>
* 세션값 설정하기
session.setAttribute("user_id", 세션값);
* 세션에 저장된 값 가져오기
session.getAttribute("user_id");
* 세션값 삭제
session.removeAttribute("user_id"); // 속성값 하나만 삭제
session.invalidate(); // 세션 전체 제거, 무효화
로그아웃
1) 위에 명시한 것처럼 세션 속성값 하나만 삭제
2) 세션 전체 제거/ 무효화 (세션 갱신) >> 이 방법으로 작성
s04_sessionLogout.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>
<%
//세션 안의 모든 속성을 제거해서 세션을 갱신
session.invalidate();
%>
로그아웃했습니다.<br>
<br>
<input type="button" value="로그인 체크" onclick="location.href='s05_sessionLoginCheck.jsp'"> <%--로그인 확인--%>
<input type="button" value="로그인" onclick="location.href='s02_sessionLoginForm.jsp'"> <%--다시 로그인할수도 있으니까 이동할수있도록--%>
</body>
</html>
session.invalidate()
로그인 여부 검사
세션에 user_id가 있으면 로그인된 상태
없으면 (세션 갱신으로 인해) 로그아웃된 상태
s05_sessionLoginCheck.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>
<%
String user_id = (String)session.getAttribute("user_id");
if(user_id!=null){ //로그인이 된 경우
%>
아이디 [<%= user_id %>]로 로그인한 상태!!<br>
<input type="button" value="로그아웃" onclick="location.href='s04_sessionLogout.jsp'">
<%
}else {//로그인이 안된 경우
%>
로그인하지 않은 상태
<br>
<input type="button" value="로그인" onclick="location.href='s02_sessionLoginForm.jsp'">
<%
}
%>
</body>
</html>
session.getAttribute() 는 세션값을 가져올 때 String 타입으로 입력받고, Object 타입으로 반환시킴
그래서 String으로 다운 캐스팅 시켜야함
(String)session.getAttribute()
파일 업로드
Servlet에서도 파일 업로드를 지원하긴 하는데 jsp에서 시행해볼 것임
cos 라이브러리를 다운 받고 사용해보자
좌측 메뉴 COS File Upload Library 클릭
2)
cos-22.05.zip 다운 후 압축 해제
3) 이클립스의 web-inf 하위 폴더인 lib 안에 jar 파일 넣기
하면 cos를 외부 라이브러리로 사용할 수 있다..!
업로드 경로 만들기
webapp
upload (folder) 생성
이미지 파일 올릴 폴더 새로 만들기
webapp
ch09-fileUpload (folder)
s01_fileForm.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="s02_fileUpload.jsp" method="post" enctype="multipart/form-data">
작성자 <input type="text" name="user"><br>
제목 <input type="text" name="title"><br>
파일명 <input type="file" name="uploadFile"><br>
<input type="submit" value="파일 올리기">
</form>
</body>
</html>
이미지 파일을 올릴 때 필수 설정 (form)
- method="post"
- enctype="multipart/form-data"
- input type="file"
꼭꼭 설정해야 나옴 꼭..!
s02_fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %> <%-- upload 처리 --%>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %> <%-- 파일이 중복됐을 때 덮어씌우지 않게 파일명을 바꿔서 보호 (동일 파일 보호) --%>
<%@ page import="java.io.File" %> <%-- java file객체로 변환시켜서 용량 구하려고 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드 처리</title>
</head>
<body>
<%
//파일 업로드 경로
String saveFolder = "/upload"; // 상대경로를 넣어서 절대경로를 구하려고 함
String encType = "utf-8"; //인코딩 타입
int maxSize = 5*1024*1024;//파일의 최대 업로드 사이즈(5mb)
//파일 업로드 절대 경로 구하기
String realFolder = application.getRealPath(saveFolder); //application.getRealPath로 해당 context에 있는 경로 넣어줌
out.println("파일 업로드 절대 경로 : " + realFolder + "<br>");
out.println("------------------------------------<br>");
//파일 업로드 할 때에는 request.getParameter가 동작을 안함 (이름 같은거 빼낼 때 multi.getParameter 써야함)
//그래서 통째로 request를 넘기고 MultipartRequest를 사용해야함
//파일 업로드 처리 및 정보 읽기
MultipartRequest multi = new MultipartRequest(request, //request 통째로 넘기기
realFolder, //upload 절대경로
maxSize, //파일 최대 업로드 사이즈
encType, //인코딩 타입
new DefaultFileRenamePolicy()); //이미 업로드된 파일과 동일한 파일명일 경우 파일명 교체
out.println("작성자 : " + multi.getParameter("user") + "<br>");
out.println("제목 : " + multi.getParameter("title") + "<br>");
out.println("------------------------------------<br>");
//파일 정보 읽어오기
//전송전 원래의 파일 이름 (defaultfilerenamepolicy가 이름을 변경했을 수도 있어서 originalname을 찾는거임)
String original = multi.getOriginalFileName("uploadFile"); //파라미터 name이 식별자가 됨
//서버에 저장된 파일 이름
String filename = multi.getFilesystemName("uploadFile");
out.println("전송전 원래의 파일 이름 : " + original + "<br>");
out.println("서버에 저장된 파일 이름 : " + filename + "<br>");
//전송된 file의 컨텐트 타입 / 문서 타입도 알아낼 수 있음 (zip,img,..)
//upload를 금지하는 타입이 있는데 우선 타입을 알아보고 처리할 수 있게끔 함 (컨텐트 타입에 따라 처리 달리 할 수 있음)
String type = multi.getContentType("uploadFile");
out.println("컨텐트 타입 : " + type + "<br>");
//파일의 용량 구하기 (용량구하는 메서드가 별도로 없어서 file로 변환)
File file = multi.getFile("uploadFile");
out.println("파일 용량 : " + file.length() + "bytes");
%>
</body>
</html>
application.getRealPath 로 파일을 저장하면 request.getParameter가 동작하지 않아 간단한 문자열 출력도 하지 못함
그래서 multi.getParameter를 사용하고 인자로 request를 통째로 넘겨줘야 함.
[출력결과]
파일 업로드 절대 경로 : C:\javaWork\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ch05-ServletMain\upload
------------------------------------
작성자 : 홍길동
제목 : 65
------------------------------------
전송전 원래의 파일 이름 : bag.jpg
서버에 저장된 파일 이름 : bag1.jpg
컨텐트 타입 : image/jpeg
파일 용량 : 3700bytes
form1에서 이미지 등록 후 meta-inf upload를 refresh해도 이미지 파일은 거기에 저장되지 않는다
이클립스는 tomcat영역처럼 공간을 만들고 거기서 복사해서 사용자에게 보여주는 거기 때문에 그 공간에 가야 볼 수 있음
C:\javaWork\workspace\.metadata
이클립스가 설정파일을 저장해놓는 곳
.plugins 안에 org.eclipse.wst.server.core < 톰캣 공간
C:\javaWork\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
톰캣 구조 (여기 있는 것들을 돌려서 우리가 작성한 파일들이 돌아가게끔 만드는 것)
C:\javaWork\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ch05-ServletMain\upload
이미지는 여기 저장됨
s01form을 실행하면 파일에 이미지가 올라가는 게 실시간으로 보인다
String realFolder = application.getRealPath(saveFolder); 여기서 절대경로를 구했기 때문에
출력화면에서 그 폴더 주소를 가리키고 그쪽으로 이미지가 저장됨
multipartrequest는 다중 파일 업로드도 지원함
이미지 뿐만 아니라 zip text등 다양하게 업로드 가능
이미지 파일 2개 올리는 예제
업로드 폼
ch09-fileUpload (folder)
s03_fileMultiForm.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="s04_fileMultiUpload.jsp" method="post" enctype="multipart/form-data">
이름 <input type="text" name="name"><br>
제목 <input type="text" name="title"><br>
이미지1 <input type="file" name="uploadFile1" accept="image/gif,image/png,image/jpeg"><br>
이미지2 <input type="file" name="uploadFile2" accept="image/gif,image/png,image/jpeg"><br>
<input type="submit" value="파일 올리기">
</form>
</body>
</html>
accept="" 파일 형식 지정
파일 이동
s04_fileMultiUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 다중 업로드 처리</title>
</head>
<body>
<%
String saveFolder = "/upload"; //파일 업로드 경로(상대경로)
String encType = "utf-8"; //인코딩 타입
int maxSize = 5*1024*1024; //최대 업로드 파일 크기 (5mb)
//upload의 절대 경로
String realFolder = application.getRealPath(saveFolder);
MultipartRequest multi = new MultipartRequest(request, realFolder, maxSize,
encType, new DefaultFileRenamePolicy());
String img1 = multi.getFilesystemName("uploadFile1");
String img2 = multi.getFilesystemName("uploadFile2");
%>
이름 : <%= multi.getParameter("name") %><br>
제목 : <%= multi.getParameter("title") %><br>
<img src="/ch05-ServletMain/upload/<%= img1 %>"><br><%-- 다른 경로일 경우에는 URI 방식으로 기입 --%>
<img src="/ch05-ServletMain/upload/<%= img2 %>">
</body>
</html>
인코딩/ 경로 지정/ 변수 생성/ 화면 출력
multi.getFilesystemName(s03에서 지정한 name) 으로 img를 찾고 <img> 태그로 사진 화면 출력
프로필 사진 처리하듯이 자바스크립트로 미리보기 설정 넣기
우선 사진 넣는 칸에 기본 이미지 webapp.images 안에 face.png 넣기
(java script로 미리보는 기능 + jsp로 서버에 이미지 전송)
s05_profileForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>프로필 사진 업로드 폼</title>
<script type="text/javascript">
window.onload = function(){
let image = document.getElementById('image');
let submit_btn = document.getElementById('submit_btn');
//파일을 선택할 때
let file = document.getElementById('file');
//이벤트 연결
file.onchange = function(){
if(!file.files[0]){ //선택한 파일이 없을 경우
image.src='/ch05-ServletMain/images/face.png';
submit_btn.style.display = 'none';
return;
}
//정상적으로 파일을 선택한 경우
const reader = new FileReader();
reader.readAsDataURL(file.files[0]); //보낸 파일 정보를 읽음
reader.onload=function(){
image.src = reader.result;
submit_btn.style.display = '';
};
};
};
</script>
</head>
<body>
<h2>프로필 사진 업로드하기</h2>
<img id="image" src="/ch05-ServletMain/images/face.png" width="200" height="200">
<form action="s06_profile.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" accept="image/png,image/jpeg,image/gif">
<input type="submit" value="전송" style="display:none;" id="submit_btn">
</form>
</body>
</html>
file.files[0] 처럼 배열로 처리하는 이유는 multiple 설정이 가능하기 때문임
처음 기본 화면과 선택한 파일이 없을 경우는 submit_btn.style.display = 'none'; 으로 해서 버튼 숨김
정상적으로 파일 선택한 경우는 ''를 줘서 보여줌
s06_profile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>프로필 사진 업로드 처리</title>
</head>
<body>
<%
String saveFolder = "/upload"; //파일 업로드 경로
String encType = "utf-8"; //인코딩 타입
int maxSize = 5*1024*1024; //최대 업로드 사이즈 (5mb)
//upload 절대 경로
String realFolder = application.getRealPath(saveFolder);
MultipartRequest multi = new MultipartRequest(request, realFolder, maxSize, encType, new DefaultFileRenamePolicy());
String file = multi.getFilesystemName("file");
%>
<img src="/ch05-ServletMain/upload/<%= file %>" width="500">
</body>
</html>
DB 연동
1) JSP 에서 직접 연동 (실제로는 잘 안 씀)
2) 모델 1방식
3) 모델 2방식 (mvc 패턴/ 중요)
처음부터 2,3을 하게 되면 복잡해서 1부터 해볼 것
이전에 오라클 다운 받을 때 같이 받았던 OJDBC8.jar 를 cos.jar 넣은 것처럼 lib안에 붙여넣기
db연동 확인
ch10-jdbc (folder)
connectTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>연동 테스트</title>
</head>
<body>
<%
//기본 정보 명시
String driverName = "oracle.jdbc.OracleDriver";
String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:xe";
String dbId = "c##user001";
String dbPass = "1234";
Connection conn = null;
try{
//JDBC 수행 1단계 : 드라이버 로드
Class.forName(driverName);
//JDBC 수행 2단계 : Connection 객체 생성
conn = DriverManager.getConnection(jdbcUrl, dbId, dbPass);
out.println("정상적으로 연결되었습니다.");
}catch(Exception e){
e.printStackTrace();
}finally{
//자원정리
if(conn!=null)try{conn.close();}catch(SQLException e){}
}
%>
</body>
</html>
<%-- db 연동할 때는 try~catch 구조를 만들어줌 --%>
간단 형태의 게시판 (table)
ch10-jdbc (folder)
table.sql (sql file)
create table tboard(
num number primary key,
name varchar2(30) not null,
title varchar2(150) not null,
passwd varchar2(10) not null,
content varchar2(4000) not null,
reg_date date not null
);
create sequence tboard_seq;
저장 후 오라클로 가서 f9 실행 -> table/ sequence 생성
db 연동 시 1~4단계 변수를 저장하고 공유하기 위한 파일 생성
ch10-jdbc (folder)
dbInfo.jspf
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String driverName = "oracle.jdbc.OracleDriver";
String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:xe";
String dbId = "c##user001";
String dbPass = "1234";
%>
include 방식으로 공유하면 매 페이지마다 붙여넣는 수고가 덜어짐
db를 연동하다 보면 UI가 필요한데 하나의 스타일을 만들고 모든 UI에 활용+확장하면 편함
UI 공유하기 위해 css 파일 생성
ch10-jdbc
style.css
@charset "UTF-8";
body{
padding:0;
margin:0;
}
.page-main{
width:800px;
margin:0 auto;
}
.result-display{
width:400px;
height:200px;
margin:50px auto; /*상하좌우*/
border:1px solid #000;
display:flex;
align-items:center;
justify-content:center;
}
.align-center{
text-align:center;
}
.align-right{
text-align:right;
}
/*목록*/
table{
width:100%;
border:1px solid #000;
border-collapse:collapse;
margin-top:5px;
}
table td, table th{ /*후손선택자*/
border:1px solid #000;
padding:5px;
}
form{
width:500px;
margin:0 auto;
border:1px solid #000;
padding:10px 10px 10px 30px;
}
ul{
list-style:none;
}
label{
width:100px;
float:left;
}
게시판 글 등록하는 form 작성 (script 는 form 작성 후 링크 건 것)
ch10-jdbc
insertTestForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 글 등록</title>
<link rel="stylesheet" href="style.css" type="text/css">
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<div class="page-main">
<h2>글쓰기</h2>
<form id="myForm" action="insertTest.jsp" method="post">
<ul>
<li>
<label for="name">이름</label>
<input type="text" name="name" id="name" size="20" maxlength="10">
</li>
<li>
<label for="title">제목</label>
<input type="text" name="title" id="title" size="30" maxlength="50">
</li>
<li>
<label for="passwd">비밀번호</label>
<input type="password" name="passwd" id="passwd" size="20" maxlength="10">
</li>
<li>
<label for="content">내용</label>
<textarea rows="5" cols="40" name="content" id="content"></textarea>
</li>
</ul>
<div class="align-center">
<input type="submit" value="전송">
<input type="button" value="목록" onclick="location.href='selectTest.jsp'">
</div>
</form>
</div>
</body>
</html>
insertTestForm에 null이 들어가면 에러가 나기 때문에 js로 유효성 체크를 꼭 해줘야함
script.js (javascript file)
close -> openwith -> generic text editor
window.onload=function(){
let myForm = document.getElementById('myForm');
//이벤트 연결
myForm.onsubmit=function(){
let items = document.querySelectorAll('input[type="text"],input[type="password"],textarea'); //선택자는 쉼표로 나열할 수 있음
//루프 돌면서 처리
for(let i=0; i<items.length;i++){
if(items[i].value.trim() == ''){
let label = document.querySelector('label[for="' + items[i].id + '"]');
alert(label.textContent + ' 항목은 필수입력'); //아이디 항목/비밀번호 항목 이렇게 표시하려고
items[i].value = '';
items[i].focus();
return false;
}
}
};
};
db 전송 jsp 파일
insertTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ include file="dbInfo.jspf" %> <%-- 같은 경로라서 파일명만 명시 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 등록 처리</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<%
//전송된 데이터 인코딩 처리
request.setCharacterEncoding("utf-8");
//전송된 데이터 반환 받기
String name = request.getParameter("name");
String title = request.getParameter("title");
String passwd = request.getParameter("passwd");
String content = request.getParameter("content");
//DB연동
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
//db연동때는 자원정리까지 해야해서 try~catch 실행
try{
//JDBC 수행 1단계 : 드라이버 로드
Class.forName(driverName);
//JDBC 수행 2단계 : Connection 객체 생성
conn = DriverManager.getConnection(jdbcUrl,dbId,dbPass);
//SQL문 작성 (insert 작업)
sql = "INSERT INTO tboard (num,name,title,passwd,content,reg_date)
VALUES (tboard_seq.nextval,?,?,?,?,SYSDATE)";
//JDBC 수행 3단계 : PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//?에 데이터 바인딩
pstmt.setString(1, name);
pstmt.setString(2, title);
pstmt.setString(3, passwd);
pstmt.setString(4, content);
//JDBC 수행 4단계 : sql문 실행
pstmt.executeUpdate();
%>
<%-- UI 처리 --%>
<div class="result-display">
<div class="align-center">
글 등록 성공!<br>
<input type="button" value="목록보기" onclick="location.href='selectTest.jsp'">
</div>
</div>
<%
}catch(Exception e){
%>
<%-- 예외 발생 시 영역만 보여주지 않고 예외가 발생했다는 것을 알려주기 위해 html 처리 --%>
<div class="result-display">
<div class="align-center">
오류 발생! 글 등록 실패!<br>
<input type="button" value="글쓰기" onclick="location.href='insertTestForm.jsp'">
</div>
</div>
<%
e.printStackTrace();
}finally{
//자원정리
if(pstmt!=null) try{pstmt.close();} catch(SQLException e){}
if(conn!=null) try{conn.close();} catch(SQLException e){}
}
%>
</body>
</html>
작성 후 insertTestForm.jsp 에서 데이터 입력 -> oracle 데이터 들어간 것 확인 가능
대문 페이지 + select 목록 보이기 작업
selectTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %> <%-- 목록처리 하는 곳이라 resultSet이 필요함 (루프) --%>
<%@ page import="java.sql.Date" %>
<%@ include file="dbInfo.jspf" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 목록</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<div class="page-main">
<h2>게시판 목록</h2>
<div class="align-right">
<input type="button" value="글쓰기" onclick="location.href='insertTestForm.jsp'">
</div>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try{
//JDBC 수행 1단계 : 드라이버 로드
Class.forName(driverName);
//JDBC 수행 2단계 : Connection 객체 생성
conn = DriverManager.getConnection(jdbcUrl,dbId,dbPass);
//SQL문 작성
sql = "SELECT * FROM tboard ORDER BY num DESC";
//JDBC 수행 3단계 : PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//JDBC 수행 4단계 : SQL문을 테이블에 반영하고 결과행들을 ResultSet에 담음
rs = pstmt.executeQuery();
//테이블(table)을 만들고 해당 테이블에 내용을 표시하려고 함 -> 영역분리
%>
<table>
<tr>
<th>글번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
</tr>
<%
while(rs.next()){
int num = rs.getInt("num"); //데이터를 뽑아내기 위해 변수 설정
String name = rs.getString("name");
String title = rs.getString("title");
Date reg_date = rs.getDate("reg_date");
%>
<tr>
<td><%= num %></td>
<td><a href="detailTest.jsp?num=<%= num %>"><%= title %></a></td>
<%-- get방식으로 num(pk)를 전달해서 불러오기 --%>
<td><%= name %></td>
<td><%= reg_date %></td>
</tr>
<%
}
%>
</table>
<%
}catch(Exception e){
%>
<div class="result-display">
<span>오류 발생</span>
</div>
<%
e.printStackTrace();
}finally{ //자원정리
if(rs!=null) try{rs.close();} catch(SQLException e){}
if(pstmt!=null) try{pstmt.close();} catch(SQLException e){}
if(conn!=null) try{conn.close();} catch(SQLException e){}
}
%>
</div>
</body>
</html>