오늘의 코드
session에 관하여 35일차 한번더
<%@page import="java.util.Date"%>
<%@ 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 객체 : session 범위에 존재하는 객체
// 세션 생성 시간
Date createTime = new Date(session.getCreationTime());
// 이 웹페이지의 마지막 접속 시간
Date lastAccessTime = new Date(session.getLastAccessedTime());
// 세션 유지 시간 설정 방법1 (일반적으로 서블릿에서 세션을 건든다)
session.setMaxInactiveInterval(10); // 10초
// 세션 유지 시간 설정 방법2
// - web.xml 설정
/*
<session-config>
<session-timeout>10</session-timeout> // 분 단위
</sesstion-config>
*/
// 세션에 키-값 저장하기
session.setAttribute("userId", "운영자");
%>
<%--
* HTTP 특성
- stateless protocol : 통신이 끝나면 상태를 유지하지 않는 특성
- 쿠키와 세션은 HTTP 특성이 아닌 연결 상태를 유지하기 위해 사용
* 세션(session)
- 쿠키를 기반으로 사용
- 서버 측에서 데이터를 관리
- 세션 ID를 부여하여 브라우저를 종료할 때까지 데이터를 유지
- 세션 객체 : 사용자를 식별할 수 있는 방법을 제공
ㄴ 사용자에 대한 정보 저장
- 주의사항 : 세션은 현재에 프로젝트에 실행되는 모든 웹 페이지에 적용됨
따라서, 하나의 클라이언트에 세션을 많이 사용하면 충돌이 발생할 수 있음.
- session 객체는 session의 메소드를 사용하면 생성됨.
(예. session.setAttribute())
--%>
<h2>세션 아이디 : <%=session.getId() %></h2>
<h2>세션 생성 시간 : <%=createTime %></h2>
<h2>마지막 접속 시간 : <%=lastAccessTime %></h2>
<a href="sessionTest.jsp">sessionTest.jsp 페이지로 이동</a>
</body>
</html>
세션별 속성
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session invalidate</title>
</head>
<body>
<h1>세션 속성(attribute)값 제거/invalidate(무효화)</h1>
<%
// 세션 attribute에 데이터 저장
session.setAttribute("password", 123);
// 세션 attribute 출력
Enumeration<String> attrNames = session.getAttributeNames();
while(attrNames.hasMoreElements()) {
String name = attrNames.nextElement();
out.println(name + "<br>");
}
out.println("<p>userId 속성 제거</p>");
session.removeAttribute("userId");
attrNames = session.getAttributeNames();
while(attrNames.hasMoreElements()) {
String name = attrNames.nextElement();
out.println(name + "<br>");
}
session.invalidate(); // 세션 무효화 : 모든 세션 속성을 제거
// 유효하지 않은 세션 : 세션 속성이 아무것도 없거나 세션이 invalidate된 경우
// 현재 세션이 유효(valid)한 지 체크
if(request.isRequestedSessionIdValid()) {
out.println("유효한 세션<br>");
} else {
out.println("유효하지 않은 세션<br>");
}
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session Test</title>
</head>
<body>
<%
String userId = (String) session.getAttribute("userId");
%>
<h2><%=userId %>님, 환영합니다.</h2>
</body>
</html>
hit count에 관하여
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Hit count</title>
</head>
<body>
<%
Integer hitCount = // 형 변환도 int는 안된다 Integer로 해주어야 한다.
(Integer) application.getAttribute("hitCounter"); // 처음에는 null로 만들어진다 0이 아니다
if(hitCount == null || hitCount == 0) {
out.println("첫 방문을 환영합니다.");
hitCount = 1;
} else {
out.println(" 재방문을 환영합니다.");
hitCount += 1;
}
application.setAttribute("hitCounter",hitCount); // 여기에 저장이
// 시간이 남으면 만드는 게 좋다.
%>
<p>전체 방문 횟수 : <%=hitCount %></p>
</body>
</html>
file 업로드에 관하여
<%@ 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>
<%--
* 파일 업로드 구현 순서
1. commons-fileupload-x.x.jar을 다운로드 및 WEB-INF/lib 폴더에 저장
2. commons-in.x.x.jar을 다운로드 및 WEB-INF/lib 폴더에 저장
--%>
<h2>파일 업로드</h2>
<p>파일 선택</p>
<form action="uploadFile.jsp" method="post" enctype="multipart/form-data">
<input type="text" name="name"><br>
<input type="file" name="files" multiple="multiple"><br>
<input type="submit" value="파일 업로드"><br>
</form>
</body>
</html>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Multiple Images Display</title>
</head>
<body>
<%
List<String> fileNames = (List<String>) session.getAttribute("fileNames");
%>
<% if(fileNames != null && !fileNames.isEmpty()) {
for(String fileName : fileNames) {
String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
if (fileExtension.equalsIgnoreCase("mp4")) { %>
<video width="320" height="240" controls loop autoplay>
<source src="../images/<%=fileName %>" type="video/mp4">
</video>
<a href="../images/<%=fileName %>">링크</a>
<br>
<% } else { %>
<img alt="이미지" src="../images/<%=fileName %>" width="200" height="200">
<a href="../images/<%=fileName %>">링크</a>
<br>
<% }
}
}else {
out.print("<p>No images uploaded.</p>");
} %>
</body>
</html>
<%@page import="java.util.ArrayList"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8"); // 한글 인코딩
String realPath = "";
String savePath = "images";
String type = "utf-8";
int maxSize = 10 * 1024 * 1024; // 10MB
// 현재 애플리케이션 정보 저장
ServletContext context = request.getServletContext();
realPath = context.getRealPath(savePath);
out.println(realPath);
out.println("<hr>");
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setRepository(new File(realPath)); // 저장하는 경로(저장소)
diskFileItemFactory.setSizeThreshold(maxSize); // 넘어가면 안되는 용량(임계점)
diskFileItemFactory.setDefaultCharset(type);
// 업로드 핸들러
ServletFileUpload fileupload
= new ServletFileUpload(diskFileItemFactory);
// request 정보를 가져와서 upload 형태에 맞게 파싱
List<FileItem> items = fileupload.parseRequest(request);
List<String> fileNames = new ArrayList<>(); // 여러 파일명을 저장할 리스트
for(FileItem item : items) {
if(item.isFormField()) { // form 데이터인 경우
out.print(item.getString() + "<br>");
} else { // 파일인 경우
out.print("파일명 : " + item.getName() + ", 파일크기 : " + item.getSize() + "<br>");
String separator = File.separator;
int index = item.getName().lastIndexOf(separator);
String fileName = item.getName().substring(index + 1);
File uploadFile = new File(realPath + separator + fileName);
item.write(uploadFile); // 받은 파일을 서버에 업로드
out.print(uploadFile + "<br>");
fileNames.add(fileName); // 파일명을 리스트에 추가
}
}
// 여러 파일을 업로드한 후에 한 번에 redirect하고 파일 정보를 세션에 저장
session.setAttribute("fileNames", fileNames);
response.sendRedirect("/Web06_JSP_Servlet/ch19/imageView.jsp");
%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8"); // 한글 인코딩
String realPath = "";
String savePath = "images";
String type = "utf-8";
int maxSize = 10 * 1024 * 1024; // 10MB
// 현재 애플리케이션 정보 저장
ServletContext context = request.getServletContext();
realPath = context.getRealPath(savePath);
out.println(realPath);
out.println("<hr>");
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setRepository(new File(realPath)); // 저장하는 경로(저장소)
diskFileItemFactory.setSizeThreshold(maxSize); // 넘어가면 안되는 용량(임계점)
diskFileItemFactory.setDefaultCharset(type);
// 업로드 핸들러
ServletFileUpload fileupload
= new ServletFileUpload(diskFileItemFactory);
// request 정보를 가져와서 upload 형태에 맞게 파싱
List<FileItem> items = fileupload.parseRequest(request);
// 멀티파일을 만드는 법
List<String> fileNames = new ArrayList<>(); // 여러 파일명을 저장할 리스트
for(FileItem item : items) {
if(item.isFormField()) { // form 데이터인 경우
out.print(item.getString() + "<br>");
} else { // 파일인 경우
out.print("파일명 : " + item.getName() + ", 파일크기 : " + item.getSize() + "<br>");
String separator = File.separator;
int index = item.getName().lastIndexOf(separator);
String fileName = item.getName().substring(index + 1);
File uploadFile = new File(realPath + separator + fileName);
item.write(uploadFile); // 받은 파일을 서버에 업로드
out.print(uploadFile + "<br>");
fileNames.add(fileName); // 파일명을 리스트에 추가
}
}
// 다른 jsp에서 전송된 이미지 확인
response.sendRedirect("/Web06_JSP_Servlet/ch19/imageView.jsp");
session.setAttribute("fileName", fileNames);
%>
filter
filterTest.jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP Filter</title>
</head>
<body>
<h1>JSP 필터</h1>
</body>
</html>
Testfilter.java
package web.ch20.filter;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpFilter;
public class TestFilter extends HttpFilter implements Filter{
// * Filter의 목적
// - 서버에서 리소스에 접근하기 전에 클라이언트의 요청/응답을 인터셉트하는 기능
// - 클라이언트와 서버 간의 요청/응답을 조작
// * Filter의 유형
// - 인등
// - 데이터 압축
// - 암호화
// - 로그/감시
// - 이미지 변환
// - charEncodingSet
// * Filter 사용법
// - web.xml 파일에 필터 태그 추가
public TestFilter() {
System.out.println("TestFilter 생성자");
}
// init() : 필터가 시작할 대 호출
@Override
public void init() throws ServletException {
}
// doFilter() : 필터를 사용할 때마다 호출
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// 클라이언트로부터 IP 얻기
String ipAddress = req.getRemoteAddr();
req.setCharacterEncoding("UTF-8");
// 현재 시간과 IP 주소 출력
System.out.println("IP : " + ipAddress +
", Time : " + new Date().toString());
chain.doFilter(req, res);
}
// destroy() : 필터가 종료될 때 호출
@Override
public void destroy() {
}
}
필터를 적용 시킨 web.Xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>Web06_JSP_Servlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 필터 설정 -->
<filter>
<!-- filter-mapping의 filter-name과 일치 -->
<filter-name>TestFilter</filter-name>
<filter-class>web.ch20.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/ch20/filterTest.jsp</url-pattern>
<url-pattern>/member/*</url-pattern><!-- /*은 본재하는 모든 하위 경로 -->
</filter-mapping>
</web-app>
-------------------------------------------------회원가입에 관하여
register.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>
<h2>회원 가입하기</h2>
<form action="../register.do" method="post">
<label for="userid">사용자 ID:</label>
<input type="text" id="userid" name="userid" required><br><br>
<label for="password">비밀번호:</label>
<input type="password" id="password" name="password" required><br><br>
<label for="email">이메일:</label>
<input type="email" id="email" name="email" required><br><br>
<label for="emailAgree">이메일 수신 동의:</label>
<input type="checkbox" id="emailAgree" name="emailAgree" value="agree"><br><br>
<label for="interest">관심 분야:</label><br>
<input type="checkbox" id="interest1" name="interest" value="서버 개발">
<label for="interest1">서버 개발</label><br>
<input type="checkbox" id="interest2" name="interest" value="서버 폭팔">
<label for="interest2">서버 폭팔</label><br>
<!-- 관심 분야가 여러 개일 경우에는 반복문을 사용하여 동적으로 생성할 수도 있습니다. --><br>
<label for="phone">전화번호:</label>
<input type="tel" id="phone" name="phone"><br><br>
<label for="introduce">자기 소개:</label><br>
<textarea id="introduce" name="introduce" rows="4" cols="50"></textarea><br><br>
<input type="submit" value="제출">
</form>
</body>
</html>
-----------------------------------------------java
package web.ch21.member;
public interface DBConnection {
// DB 접속에 필요한 상수 정의
public static final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
public static final String USER = "scott";
public static final String PASSWORD = "tiger";
// DB 테이블 컬럼 상수 정의
public static final String TABLE_NAME = "TEST_MEMBER";
public static final String COL_USERID = "USERID";
public static final String COL_PASSWORD = "PASSWORD";
public static final String COL_EMAIL = "EMAIL";
public static final String COL_EMAIL_AGREE = "EMAIL_AGREE";
public static final String COL_INTEREST = "INTEREST";
public static final String COL_PHONE = "PHONE";
public static final String COL_INTRODUCE = "INTRODUCE";
// INSERT INTO TEST_MEMBER VALUES
// (?, ?, ?, ?, ?, ?, ?)
public static final String SQL_INSERT = "INSERT INTO " + TABLE_NAME
+ " VALUES (?, ?, ?, ?, ?, ?, ?)";
}
package web.ch21.member;
public interface MemberDAO {
// 맴버 등록
public abstract int insert(MemberVO vo);
}
package web.ch21.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import oracle.jdbc.OracleDriver;
public class MemberDAOImple implements MemberDAO, DBConnection {
private static MemberDAOImple instance = null;
public static MemberDAOImple getInstance() {
if(instance == null) {
instance = new MemberDAOImple();
}
return instance;
}
@Override
public int insert(MemberVO vo) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
DriverManager.registerDriver(new OracleDriver());
conn = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("DB 연결 성공");
pstmt = conn.prepareStatement(SQL_INSERT);
pstmt.setString(1, vo.getUserid());
pstmt.setString(2, vo.getPassword());
pstmt.setString(3, vo.getEmail());
pstmt.setString(4, vo.getEmailAgree());
pstmt.setString(5, vo.getInterestJoin());
pstmt.setString(6, vo.getPhone());
pstmt.setString(7, vo.getIntroduce());
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
package web.ch21.member;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/register.do")
public class MemberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static MemberDAO dao;
public MemberServlet() {
dao = MemberDAOImple.getInstance();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// sendRedirect() : 특정 경로로 이동
// request는 소멸되기 때문에 데이터를 전송할 수 없음
response.sendRedirect("/Web06_JSP_Servlet/ch21/register.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request에서 파라미터 값을 읽어옵니다.
String userid = request.getParameter("userid");
String password = request.getParameter("password");
String email = request.getParameter("email");
String emailAgree = request.getParameter("emailAgree");
String[] interest = request.getParameterValues("interest");
String phone = request.getParameter("phone");
String introduce = request.getParameter("introduce");
// MemberVO 객체를 생성하고 파라미터 값을 설정합니다.
MemberVO member = new MemberVO(userid, password, email, emailAgree, interest, phone, introduce);
// 이후에 MemberVO 객체를 이용하여 원하는 작업을 수행합니다.
int result = dao.insert(member);
System.out.println(result);
}
}
package web.ch21.member;
import java.util.Arrays;
public class MemberVO {
private String userid;
private String password;
private String email;
private String emailAgree;
private String[] interest;
private String phone;
private String introduce;
public MemberVO() {
super();
// TODO Auto-generated constructor stub
}
public MemberVO(String userid, String password, String email, String emailAgree, String[] interest, String phone,
String introduce) {
super();
this.userid = userid;
this.password = password;
this.email = email;
this.emailAgree = emailAgree;
this.interest = interest;
this.phone = phone;
this.introduce = introduce;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmailAgree() {
return emailAgree;
}
public void setEmailAgree(String emailAgree) {
this.emailAgree = emailAgree;
}
public String[] getInterest() {
return interest;
}
public void setInterest(String[] interest) {
this.interest = interest;
}
public String getInterestJoin() {
String result =
(interest == null) ? "없음" : String.join(",", interest);
return result;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
@Override
public String toString() {
return "MemberVO [userid=" + userid + ", password=" + password + ", email=" + email + ", emailAgree="
+ emailAgree + ", interest=" + Arrays.toString(interest) + ", phone=" + phone + ", introduce="
+ introduce + "]";
}
}