자바36일차

달달한스위츠·2024년 4월 3일

자바배우기

목록 보기
33/43

오늘의 코드
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 + "]";
	}
	
	
}

0개의 댓글