출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]

archive.apache.org/dist/commons/fileupload/binaries/

 

Index of /dist/commons/fileupload/binaries

 

archive.apache.org

commons.apache.org/proper/commons-io/download_io.cgi

 

Commons IO – Download Apache Commons IO

Download Apache Commons IO Using a Mirror We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours)

commons.apache.org

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드</title>
</head>
<body>

	<h1>파일 업로드</h1>
	
	<!-- 
				필수 1 : form tag 안의 속성 method="post" 
				필수 2 : form tag 안의 속성 enctype="multipart/form-data"
	 -->
	 
	<form action="upload.jsp"  method="post" enctype="multipart/form-data" >
	
		<input type="text" name="title"><br>
		
		<!-- 필수3 :  업로드 할 파일을 선택할 수 있는 input -->
		<input type="file" name="file"><br>
		
		<input type="submit">
	</form>
	

</body>
</html>

upload.jsp

<%@page import="java.io.File"%>
<%@page import="java.util.Iterator"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	boolean result = false;
	
	// 파라미터 이름이 title인 데이터를 저장할 변수
	String title = null;
	// 1. multipart/form-data 여부 확인
	boolean isMultipart = ServletFileUpload.isMultipartContent(request);
	
	if(isMultipart){
		
		// 2. 업로드 할 파일을 보관 FileIte의 Factory 설정
		DiskFileItemFactory factory = new DiskFileItemFactory();
		
		// 3. 요청을 처리(form 안의 input 들을 분리 )할 ServletFileUpload 생성
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		// 4. 사용자의 요청을 파싱(데이터를 추출해서 원하는 형식으로 만드는것)
		// FileItem ->  사용자의 요청 파라미터인 input의 객체
		List<FileItem> items = upload.parseRequest(request);
		
		Iterator<FileItem> itr = items.iterator();
		
		while(itr.hasNext()){
			
			FileItem item = itr.next();
			
			// 폼 필드와 파일 을 구분해서 처리
			if(item.isFormField()){
				
				// true -> type=file 인 것을 제외한 나머지 필드
				// 필드 이름, 파라미터 이름
				String fName = item.getFieldName();
				if(fName.equals("title")){
					title = item.getString("utf-8");
				}
				
				request.setAttribute("title", title);
				
			} else {
				
				// false -> type=file 인 필드
				String fName = item.getFieldName(); 		// 필드의 이름
				String userFileName = item.getName();		// 파일의 이름
				String contentType = item.getContentType();	// 컨텐트 타입
				long fileSize = item.getSize();				// 파일의 바이트 사이즈
				
				System.out.println("필드 이름 : "+fName);
				System.out.println("파일 이름 : "+userFileName);
				System.out.println("컨텐츠 타입 : "+contentType);
				System.out.println("File size : "+fileSize);
				
				// 파이을 서버의 특정 폴더에 저장(쓰기)
				if(!userFileName.isEmpty() && fileSize>0){
					
					// 파일을 실제 저장할 폴더의 시스템 경로
					String dir = request.getSession().getServletContext().getRealPath("/upload");
					System.out.println(dir);
					
					// 저장할 경로를 File 객체로 생성
					File saveFilePath = new File(dir);
					
					// 폴더가 존재하지 않으면 폴더를 생성
					if(!saveFilePath.exists()){
						saveFilePath.mkdir();
					}
					
					// 파일 쓰기(저장)
					item.write(new File(saveFilePath, userFileName));
					System.out.println("파일 저장 완료!");
					
					// 완료시에 전달할 데이터
					request.setAttribute("saveFileName", userFileName);
					
				}
				
			}
			
		}
		// 정상 처리
		result = true;
		request.setAttribute("result", result);
		
	}
	
	
		
%>

<jsp:forward page="upload_view.jsp"/>

upload_view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<c:if test="${result}">
		<h1>파일 업로드가 되었습니다.</h1>
		<h3>
			TITLE : ${title}<br> 파일 이름 : ${saveFileName}
		</h3> 
		<img alt="프로필 사진" src="<c:url value="/upload/${saveFileName}"/>">
	</c:if>
	
	<c:if test="${!result}">
		<h1>파일 업로에 문제가 발생했습니다. 다시 시도해주세요.</h1>
	</c:if>

</body>
</html>

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] JSTL - fmt  (0) 2020.12.23
[JSP] JSTL 설치 및 사용 / core <c:~>  (0) 2020.12.23
[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	1. <fmt:formatNumber value="1000000"/> <br>
	2. <fmt:formatNumber value="1000000" groupingUsed="false"/><br>
	3. <c:set var="number" value="123456789"/>
	 	<fmt:formatNumber value="${number}"/><br>
	4. <fmt:formatNumber var="fNumber" value="${number}"/> 
		 ${fNumber}<br>
		 
	통화 :  <fmt:formatNumber value="${number}" type="currency" currencySymbol="원"/> , <fmt:formatNumber value="${number}" type="currency"/><br>
	퍼센트 :  <fmt:formatNumber value="${number/50000000}" type="percent"/><br>
	패턴 : <fmt:formatNumber value="${number}" pattern="000,000,000.00"/>
		

</body>
</html>

 

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<%
	request.setAttribute("now", new Date());
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


 
<%-- 전부 홍콩 시간대로 바귐 <fmt:timeZone value="Hongkong"> --%>
	<b>date</b><br>
	${now}<br>
	<fmt:formatDate value="${now}"/><br>
	<fmt:formatDate value="${now}" type="date"/><br>
	<fmt:formatDate value="${now}" type="date" dateStyle="full"/><br>
	<fmt:formatDate value="${now}" type="date" dateStyle="short"/><br>
	<b>time</b><br>
	<fmt:formatDate value="${now}" type="time"/><br>
	<fmt:formatDate value="${now}" type="time" timeStyle="full"/><br>
	<fmt:formatDate value="${now}" type="time" timeStyle="short"/><br>
	<b>both</b><br>
	<fmt:formatDate value="${now}" type="both"/><br>
	<fmt:formatDate value="${now}" type="both" dateStyle="full" /><br>
	<fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short"/><br>
	<b>패턴</b> <br>
	<fmt:formatDate value="${now}" pattern="z a h:mm"/><br>
	<fmt:formatDate value="${now}" pattern="hh:mm"/><br>
	<fmt:formatDate value="${now}" pattern="yyy-MM-dd h:mm"/><br>
	<fmt:formatDate value="${now}" pattern="yyy-MM-dd h:mm" timeZone="Hongkong"/><br>
	
<%-- </fmt:timeZone> --%>
	
</body>
</html>

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] FileUpload  (0) 2020.12.24
[JSP] JSTL 설치 및 사용 / core <c:~>  (0) 2020.12.23
[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17

tomcat.apache.org/taglibs/standard/

 

서블렛과 JSP 버전에 맞는 JSTL 설치

내가쓰는 tomcat8.5는 1.2를 설치

 

 

if, forEach, Url을 많이 사용한다
ontains(x) >> contains

 

 

<c:out>태그

 

 

makeList.jsp

<%@page import="form.Member"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%


 List<Member> members = new ArrayList<Member>();
	members.add(new Member("cool1","1111","cool11","photo11.jpg"));
	members.add(new Member("cool2","2222","cool12","photo12.jpg"));
	members.add(new Member("cool3","3333","cool13",null));
	members.add(new Member("cool4","4444","cool14","photo14.jpg"));
	members.add(new Member("cool5","5555","cool15","photo15.jpg"));
	members.add(new Member("cool6","6666","cool16","photo16.jpg"));
	members.add(new Member("cool7","7777","cool17","photo17.jpg"));
	members.add(new Member("cool8","8888","cool18",null));
	members.add(new Member("cool9","9999","cool19",null));
	members.add(new Member("cool10","0000","cool10","photo10.jpg"));
	
	session.setAttribute("members", members);
	


%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!-- 코어태그사용을 위한 태그라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!-- 모듈화가능 -->
<%@ include file="makeList.jsp"%>

<%
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>회원리스트</h1>

	<table border="1">
		<tr>
			<th>ID</th>
			<th>PASS</th>
			<th>NAME</th>
			<th>PHOTO</th>
		</tr>
        
		<c:forEach items="${members}" var="member">
			<tr>
				<td>${member.userId}</td>
				<td>${member.pass}</td>
				<td>${member.userName}</td>
				
				<td>
					<c:out value="${member.userPhoto}" escapeXml="false">
						<span style="color:red">프로필 사진 없음</span>
					</c:out>				
				</td>
				
			</tr>

		</c:forEach>
	</table>


</body>
</html>

 

<c:if>태그

 

!!!!!!!!!!!!!!!!! 참고

eq : =

ne : !=

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<c:set var="msg" value="user1" />
	msg : ${msg}
	<!-- 기본으로 page 속성에 들어가있음 -->
	<br>

	<%-- <c:if test="논리값이 true일때 출력"></c:if> --%>
	<c:if test="${true}">
		1) test 속성값이 true일때 출력
	</c:if>
	<br>

	<c:if test="${msg=='user1'}">
		2) test 속성값이 true일때 출력
	</c:if>
	<br>

	<c:if test="${msg=='user1'}" var="result" scope="page">
		3) test 속성값이 true일때 출력 : ${result}
	</c:if>
	<br>

	<c:if test="${msg eq 'user1'}" var="result1" scope="page">
		4) test 속성값이 true일때 출력 : ${result1}
	</c:if>
	<br>
	
	<c:if test="${msg ne 'user1'}" var="result2" scope="page">
		5) test 속성값이 true일때 출력 : ${result2}
	</c:if>	${result2}
	
	<br>
	
</body>
</html>

 

<c:choose>,<c:when>,<c:otherwise> 태그

 

 

이들 태그는 함께 사용되며 자바의 if ~ else if 문, switch 문과 유사하다.
<c:choose> 태그 내에는 <c:when> 태그가 여러 개 올 수 있다.

 

	<c:set var="number" value="12"/>
	
	<c:choose>
		<c:when test="${number>0}">
			양수입니다.
		</c:when>
		<c:when test="${number<0}">
			음수입니다.
		</c:when>
		<c:otherwise>
			0입니다.
		</c:otherwise>	
	</c:choose>
	
	<br>

 

<c:forEach> 태그

 

반복문과 관련된 태그로 자바의 for 문과 유사하다. 

가장 중요하고 널리 쓰이는 JSTL 태그 중 하나임.
여러 옵션 활용법을 잘 익혀 두어야 한다.

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!-- 코어태그사용을 위한 태그라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!-- 모듈화가능 -->
<%@ include file="makeList.jsp"%>

<%
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>회원리스트</h1>

	<table border="1">
		<tr>
			<th>INDEX</th>
			<th>COUNT</th>
			<th>ID</th>
			<th>PASS</th>
			<th>NAME</th>
			<th>PHOTO</th>
		</tr>
		<!-- index, count -->
		<c:forEach items="${members}" var="member" varStatus="status">
			<tr>
				<td>${status.index}</td>
				<td>${status.count}</td>
				<td>${member.userId}</td>
				<td>${member.pass}</td>
				<td>${member.userName}</td>
				
				<td>
					<c:out value="${member.userPhoto}" escapeXml="false">
						<span style="color:red">프로필 사진 없음</span>
					</c:out>				
				</td>
				
			</tr>
			<!-- index, count -->

		</c:forEach>
	</table>
	
	<c:forEach var="num" begin="1" end="10" step="2">
		${num} <br>
	
	</c:forEach>

</body>
</html>

 

 

 

 

<c:forTokens> 태그

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:forTokens var="phoneNum" items="010-9999-7777" delims="-">
	${phoneNum}
</c:forTokens>


<c:forTokens var="phoneNum" items="010-9999-7777" delims="-" varStatus="stat">
	<input type="text" name="phoneNum${stat.count}" value="${phoneNum}">
	<c:if test="${stat.count<3}">-</c:if>
</c:forTokens>


</body>
</html>

 

URL 관련 태그

 

잘안씀

<c:url> 태그

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<!-- context경로/index.jsp -->
	<c:url value="/index.jsp"/><br>
	
	<c:url value="/index.jsp"/><br>
	<c:url value="/index.jsp"/><br>
	<c:url value="/index.jsp" var="indexLink"/><br>
	
	${indexLink}
	
	<br>
	<c:url value="/index.jsp">
		<c:param name="pageNumber" value="1"/>
		<c:param name="keyword" value="jstl"/>
	</c:url>
	
	
</body>
</html>

 

그외 : <c:remove>태그

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] FileUpload  (0) 2020.12.24
[JSP] JSTL - fmt  (0) 2020.12.23
[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17

 

 

 

내장객체의 표현식이 생략되었을 때 규칙.
1. pageScope영역에서 찾는다.
2. request  > 3. session > 4. application
[영역이작은쪽부터]

 

 

예제

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<% 

	request.setAttribute("userName", "김태형1");
	session.setAttribute("userName", "김태형2");
	application.setAttribute("userName", "김태형3");
	session.setAttribute("userId", "V");
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>
<!-- 
내장객체의 표현식이 생략되었을 때 규칙.
1. pageScope영역에서 찾는다.
2. request  > 3. session > 4. application
[영역이작은쪽부터]
-->

	requestScope.userName : ${requestScope.userName},
							${userName}, <!-- 영역 생략가능 -->
							<%= request.getAttribute("userName") %> <br>
	sessionScope.userId : ${sessionScope.userId}, ${userId}
							<%= session.getAttribute("userId") %> <br>
							
	param.code : <%=request.getParameter("code") %>, 
				${param.code}<br>

	pageContext : <%= pageContext.getRequest().getServletContext().getContextPath() %><br>
				${pageContext.request.requestURI}<br>
				${pageContext.request.requestURL}<br>
				${pageContext.request.contextPath}<br>
				
</h1>

<a href="view1.jsp">session페이지 확인</a>

</body>
</html>

view1.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>


<h1>
${sessionScope.userId}, ${userId}

</h1>
</body>
</html>

 

 

 

예제

test패키지 안의 자바클래스 product.java 생성

package test;

import java.util.Arrays;

//상품 정보를 가지는 beans 형식으로 정의
public class Product {
	
	// 상품 목록
	private String[] productList = {"item1","item2","item3","item4","item5",};

	// 테스트 변수
	private int price = 100;
	private int amount = 1000;
	
	public String[] getProductList() {
		return productList;
	}
	public int getPrice() {
		return price;
	}
	public int getAmount() {
		return amount;
	}
	
	public String getDisplay() {		
		return "price: "+ price + ", amount : " + amount;
	}
	@Override
	public String toString() {
		return "Product [productList=" + Arrays.toString(productList) + ", price=" + price + ", amount=" + amount + "]";
	}
	
	
	
	
}

 

productList.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>

	<jsp:useBean id="product" class="test.Product" scope="session"/>
	
	<%-- ${product} <br> --%>
	<%-- ${sessionScope.product} --%>
	
	<form action="selectProduct.jsp" method="post">
	
		<select name="sel">
		
		<%
			for(String item:product.getProductList()){
				out.println("<option>"+item+"</option>");
			}
		%>
			
		</select>
		
		<input type="submit" value="선택">
		
	</form>

</body>
</html>

selectProduct.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>


	1. 선택한 상품 : ${param.sel} <br>
	2. 상품 설명 : ${product.display} <br>
	<!-- > display라는 변수는 없음 product.getDisplay() -->
	3. 상품 : ${product.productList[0]}
</body>
</html>

 

 

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] FileUpload  (0) 2020.12.24
[JSP] JSTL - fmt  (0) 2020.12.23
[JSP] JSTL 설치 및 사용 / core <c:~>  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17

lib에 복사붙여넣기함

 

 

 

 

- aia 라는 계정에 open이라는 스키마를 만들고 그 안에 스캇계정 테이블 dept와 emp 추가해주었음

 

 

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	// 모든 JAVA API를 사용할 수 있다.

Connection conn = null;

// 1. 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. DB 연결 : connection 객체를 얻어온다.
String jdbcUrl = "jdbc:mysql://localhost:3306/open?serverTimezone=UTC";
String user = "aia";
String password = "aia";

conn = DriverManager.getConnection(jdbcUrl, user, password);

out.println("<h1>mysql 연결<h1>");

// statement 인스턴스 생성
Statement stmt = conn.createStatement();

// SQL
String sql_dept = "select * from dept";

ResultSet rs = stmt.executeQuery(sql_dept);
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mysql Connection</title>
</head>
<body>

	<h1>부서리스트</h1>


	<table border=1>
		<tr>
			<th>부서번호</th>
			<th>이름</th>
			<th>위치</th>

			<%
				while (rs.next()) {
			%>
		</tr>
		<td><%=rs.getInt(1)%></td>
		<td><%=rs.getString(2)%></td>
		<td><%=rs.getString("loc")%></td>
		</tr>

		<%
			}

		rs.close();
		stmt.close();
		conn.close();
		%>
	</table>


</body>
</html>

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] JSTL - fmt  (0) 2020.12.23
[JSP] JSTL 설치 및 사용 / core <c:~>  (0) 2020.12.23
[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17
[JSP] 에러  (0) 2020.12.17

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Date time = new Date();
	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 정보 출력</title>
</head>
<body>

	<h1>세션 정보</h1>
	<h3>
		세션 ID : <%= session.getId() %><br>
		세션 생성 시간 : <%= session.getCreationTime() %>, <%= format.format(session.getCreationTime()) %><br>
		최근 접속 시간 : <%=session.getLastAccessedTime()%>, <%= format.format(session.getLastAccessedTime())%><br>
	</h3>
</body>
</html>

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] JSTL 설치 및 사용 / core <c:~>  (0) 2020.12.23
[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] 쿠키처리를 위한 유틸리티 클래스 만들기  (0) 2020.12.17
[JSP] 쿠키  (0) 2020.12.17
[JSP] 에러  (0) 2020.12.17
[JSP] beans 빈즈  (0) 2020.12.17

CookieBox.java

package util;

import java.io.IOException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

// 쿠키 객체를 생성하고 저장하고, 저장된 쿠키를  꺼내쓰는 기능
public class CookieBox {
	
	// Cookie 객체를 저장하는 Map 객체를 생성
	  Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
	
	// 초기화 : cookieMap에 cookie 데이터를 저장
	// 생성자 :
	public CookieBox(HttpServletRequest request) {
		// request를 통해 cookie 정보를 얻을 수 있다.
		Cookie[] cookies = request.getCookies();
		
		if(cookies!=null && cookies.length>0) {
			for(int i=0; i<cookies.length; i++) {
				// cookieMp에 Cookie 객체를 저장
				cookieMap.put(cookies[i].getName(), cookies[i]);
			}
		}
	}
	
	// 이름으로 쿠키 객체를 반환
	public Cookie getCookie(String name) {
		return cookieMap.get(name);
	}
	
	// 이름으로 쿠ㅋ키의 저장값을 반환
	public String getValue(String name) throws IOException {
		
		Cookie cookie = cookieMap.get(name); // Map에 name키가 업으면 null 반환
		
		if(cookie==null) {
			return null;
		}
		
		return URLDecoder.decode(cookie.getValue(),"UTF-8");
	}
	
	// cookieMap에 특정 이름의 쿠키가 존재하는지 여부 확인
	public boolean exists(String name) {
		return cookieMap.get(name) != null;
	}
	
	// 쿠기 객체를 생성해주는 메소드 : 객체를 생성하지 않고도 사용할 수 있는 메소드로 정의 : static 멤버로 정의
	// 오버로딩
	
	// 이름, 값을 가지고 cookie 객체 생성
	public static Cookie createCookie(String name, String value) {
		Cookie cookie = new Cookie(name, value);
		
		return cookie;
	}
	
	// 이름, 값, 경로, 유지시간을 가지고 cookie 객체 생성
	public static Cookie createCookie(
			String name, String value, String path, int maxAge) {
		Cookie cookie = new Cookie(name, value);
		cookie.setPath(path);       // 경로 설정
		cookie.setMaxAge(maxAge);	// 쿠기 유지시간 설정		
		
		return cookie;
	}
	

	// 이름, 값, 경로, 유지시간, 도메인을 가지고 cookie 객체 생성
	public static Cookie createCookie(
			String name, String value, String path, int maxAge, String domain) {
		Cookie cookie = new Cookie(name, value);
		cookie.setPath(path);       // 경로 설정
		cookie.setMaxAge(maxAge);	// 쿠기 유지시간 설정		
		cookie.setDomain(domain);	// 쿠키 도메인 설정
		
		return cookie;
	}
}

 

loginForm.jsp

<%@page import="util.CookieBox"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	CookieBox cookieBox = new CookieBox(request);

	// 삼항연산자 [null값 출력을 막기 위해]
	String saveId =  cookieBox.exists("uid")? cookieBox.getValue("uid"):"";	
	String checked = cookieBox.exists("uid")? " checked " :  "";
	
%>
<!DOCTYPE html>
<html lang="ko">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 폼</title>
</head>

<body>
	<h1>회원 로그인</h1>
	<hr>
	<form action="loginResult.jsp" method="get">
		<table>
			<tr>
				<th><label for="userid">아이디</label></th>
				<td><input type="text" id="userid" name="userid" value="<%= saveId%>"></td>
			</tr>
			<tr>
				<th><label for="pw">비밀번호</label></th>
				<td><input type="password" id="pw" name="pw"></td>
			</tr>
			<tr>
				<td></td>
				<td><input type="checkbox" name="chk" value="on"<%= checked %>> 아이디
					저장</td>
			</tr>
			<tr>
				<td></td>
				<td><input type="submit" value="로그인"></td>
			</tr>
		</table>
	</form>

</body>

</html>

 

 

loginResult.jsp

<%@page import="util.CookieBox"%>
<%@page import="form.LoginFormData"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%

LoginFormData lfData = new LoginFormData();

String userId = request.getParameter("userid");
String pass = request.getParameter("pw");

String chk = request.getParameter("chk");

if(chk!=null && chk.equals("on") && userId!=null && !userId.isEmpty()){
	// 쿠키 생성 저장해준다
	// uid =  userId를 저장하자
	response.addCookie(CookieBox.createCookie("uid", userId, "/", 60*60*24*365));
	
}else{
	// 저장하지 않기 & 저장이 되었다면 삭제하기
	response.addCookie(CookieBox.createCookie("uid", userId, "/", 0));
}

lfData.setUserId(userId);
lfData.setPass(pass);

request.setAttribute("loginData", lfData);
%>

<jsp:forward page="loginView.jsp"/>

 

 

체크하면 > 체크상태가 유지 되고 아이디가 기억됨

 

체크를 다시 풀면 > 쿠키에서 아이디가 사라지고 체크상태도 풀림

 

 

번외)

 

<%@page import="util.CookieBox"%>
<%@page import="java.net.URLDecoder"%>
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%

// 쿠키 객체를 생성
Cookie c1 = new Cookie("userID", "V");
// response.addCookie(쿠키객체)
response.addCookie(c1);

Cookie c2 = new Cookie("userName", URLEncoder.encode("김태형", "UTF-8"));
c2.setMaxAge(60*20); // 20분 뒤 삭제!
response.addCookie(c2);

response.addCookie(CookieBox.createCookie("nickName","MC_JADU"));
response.addCookie(CookieBox.createCookie("age", "26","/",-1));



%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>쿠키생성, 저장</h1>
	<h3> <%= c1.getName()%>=<%=c1.getValue() %></h3>
	<h3> <%= c2.getName()%>=<%= URLDecoder.decode(c2.getValue(), "utf-8")%></h3>
	
	<a href="viewCookie.jsp">쿠키 정보 보기</a>
	
</body>
</html>

viewCookie.jsp

<%@page import="util.CookieBox"%>
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%

	CookieBox cookieBox = new CookieBox(request);
	
 
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

userID = <%= cookieBox.getValue("userID") %><br>
Age = <%= cookieBox.getCookie("age").getValue() %><br>
nickName이 존재하는가? = <%= cookieBox.exists("nickName") %>

 
 <h1><a href="editCookie.jsp">쿠키 수정하기</a></h1>
 <h1><a href="deleteCookie.jsp">쿠키 삭제하기</a></h1>

</body>
</html>

 

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] 표현언어 EL / Expression Language  (0) 2020.12.23
[JSP] mysql JDBC  (0) 2020.12.18
[JSP] session 기본 객체  (0) 2020.12.18
[JSP] 쿠키  (0) 2020.12.17
[JSP] 에러  (0) 2020.12.17
[JSP] beans 빈즈  (0) 2020.12.17
[JSP] 내장객체와 속성관리 / 생명주기  (0) 2020.12.16

 

 

구성 요소

이름 : 각각의 쿠키를 구별하는 데 사용되는 이름
값 : 쿠키의 이름과 관련된 값
유효시간 : 쿠키의 유지 시간
도메인 : 쿠키를 전송할 도메인
경로 : 쿠키를 전송할 요청 경로


쿠키 이름의 제약
쿠키의 이름은 아스키 코드의 알파벳과 숫자만을 포함할 수 있다.
콤마(,), 세미콜론(;), 공백(' ') 등의 문자는 포함할 수 없다.
'$'로 시작할 수 없다.

 

예제

makeCookie.jsp

<%@page import="java.net.URLDecoder"%>
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%

// 쿠키 객체를 생성
Cookie c1 = new Cookie("userID", "V");
// response.addCookie(쿠키객체)
response.addCookie(c1);

Cookie c2 = new Cookie("userName", URLEncoder.encode("김태형", "UTF-8"));

response.addCookie(c2);


%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>쿠키생성, 저장</h1>
	<h3> <%= c1.getName()%>=<%=c1.getValue() %></h3>
	<h3> <%= c2.getName()%>=<%= URLDecoder.decode(c2.getValue(), "utf-8")%></h3>
	
	<a href="viewCookie.jsp">쿠키 정보 보기</a>
	
</body>
</html>

viewCookie.jsp

<%@page import="java.net.URLDecoder"%>
<%@ 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>

 <%
 
 	// 쿠키 가져오기!
 	Cookie[] cookies = request.getCookies();
 
 	if(cookies != null && cookies.length>0){
 		
 		for(int i=0; i<cookies.length; i++){
 			String name = cookies[i].getName();
 			String value = URLDecoder.decode(cookies[i].getValue(),"UTF-8");
 			
 			out.println("<h1>"+name+" : "+value+"</h1>");
 		}
 		
 	}else{
 		out.println("<h1>저장된 쿠키가 없습니다.</h1>");
 		
 	}
 
 %>

</body>
</html>

 

 


 

쿠키 값 변경

쿠키값 그냥 똑같은 이름으로 해주면 덮어써짐!

 

예제

쿠키 수정하기 > editCookie.jsp 를 추가!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	// V를 BTS로 변경
	Cookie cookie = new Cookie("userID", "BTS");
	response.addCookie(cookie);

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>쿠키 userID의 값이 변경되었습니다.</h1>
<a href="viewCookie.jsp">바뀐 쿠키 정보 확인 </a>

</body>
</html>

 


 

쿠키 삭제하기

쿠키의 유지시간을 0으로 설정해준다.

예제

쿠키 수정하기 > deleteCookie.jsp 를 추가!

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>


<%
	// 쿠키 삭제를 위해 쿠키의 유지 시간을 0으로 설정해준다.
	Cookie cookie = new Cookie("userID","");
	cookie.setMaxAge(0);
	response.addCookie(cookie);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>쿠키 userID의 값이 삭제되었습니다.</h1>
<a href="viewCookie.jsp">삭제된 쿠키 정보 확인 </a>

</body>
</html>

 

 

 


 

알아만두기

 


 

ex) 하루동안 보지 않기

 

예제

<%@page import="java.net.URLDecoder"%>
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%

// 쿠키 객체를 생성
Cookie c1 = new Cookie("userID", "V");
// response.addCookie(쿠키객체)
response.addCookie(c1);

Cookie c2 = new Cookie("userName", URLEncoder.encode("김태형", "UTF-8"));
c2.setMaxAge(60*20); // 20분 뒤 삭제!
response.addCookie(c2);


%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>쿠키생성, 저장</h1>
	<h3> <%= c1.getName()%>=<%=c1.getValue() %></h3>
	<h3> <%= c2.getName()%>=<%= URLDecoder.decode(c2.getValue(), "utf-8")%></h3>
	
	<a href="viewCookie.jsp">쿠키 정보 보기</a>
	
</body>
</html>

 

에러페이지 지정 및 작성

 

에러 페이지 지정

– <%@ page errorPage="예외발생시보여질JSP지정" %>

 

에러 페이지 작성

– <%@ page isErrorPage="true" %>
   > isErrorPage 속성이 true인 경우 에러 페이지로 지정
– exception 기본 객체 : 발생한 예외 객체
 > exception.getMessage() : 예외 메시지
 > exception.printStackTrace() : 예외 추적 메시지 출력
– IE에서 예외가 올바르게 보여지려면 에러 페이지가 출력한 응답 데이터 크기가 513 바이트보다 커야 함

 

예제

<%@ page errorPage="에러가나면이동할페이지"%>를 이용

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page errorPage="viewErrorMessage.jsp"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


	<%
		// 오류발생 구문
	String name = request.getParameter("name").toUpperCase();
	
	%>

</body>
</html>

viewErrorMessage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page isErrorPage="true" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>오류가 발생했습니다. 메인페이지로 이동해주세요</h1>
<h3>
	에러타입 : <%= exception.getClass().getName() %> <br>
	에러메세지 : <%= exception.getMessage() %>
	
</h3>
<a href="../index.jsp"> INDEX로 이동</a>

</body>
</html>

 

응답 상태 코드 별 에러 페이지 작성 및 지정

 

 

 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다. IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고

ko.wikipedia.org

 

web.xml 파일에서 설정

<error-page>
    <error-code>에러코드</error-code>
    <location>에러페이지의 URI</location>
</error-page>

 

예제

 

 

error404.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page isErrorPage="true" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>요청하신 페이지가 존재하지 않습니다. 404</h1>
<h1>주소를 확인 후 다시 다시 접속해주세요 :)</h1>

</body>
</html>

 

 

error500.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page isErrorPage="true" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>서버에서 데이터를 처리하는 중 오류가 발생했습니다. 500</h1>
<h1>다시 시도해주세요 ㅠㅠ</h1>

</body>
</html>

 

 

에러 500 발생시키기 위한 페이지 > error500.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>

	<%= 10/0 %>
	
</body>
</html>

 

예외 타입 별 에러 페이지 지정

 

web.xml에서 설정

<error-page>
    <exception-type>예외클래스명</exception-type>
    <location>에러페이지의 URI</location>
</error-page>

 

예제

 

errorType.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page isErrorPage="true" %>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>NullPointerException 발생~!</h1>
<h1>다시 시도해주세요 ㅠㅠ</h1>

</body>
</html>

 

 

에러 페이지의 우선 순위

예제

똑같은 NullPointerException이 발생하는 구문이지만 이동되는 에러페이지가 다르다.

아래 쪽 readParameter에는 <% page errorPage="viewErrorMessage.jsp"%> 구문이 있어서

web.xml에 NullPointerException타입의 에러페이지로 설정된 errorType.jsp가 뜨는 것이 아니라,

viewErrorMessage.jsp가 뜬다.

 

 

 

ㅇㅇ

JSP는 HTTP 프로토콜의 사용하는 웹 환경에서 구동되는 프로그램이다. HTTP는 비연결형으로 사용자가 서버에 특정 페이지를 요청하고 요청결과를 응답받으면 서버와의 연결이 끊기는 형태이다. 예를 들어 게시판에 글을 작성하는 페이지에서 작성한 내용은 다른 jsp에서 처리해야 하고 서버는 방금 글을 작성한 사람이 누구인지 모를 수 있다. 또 다른 예로 쇼핑몰에서 여러 상품 페이지를 이동하면서 장바구니에 물건을 담아 두고 한꺼번에 구매하고자 할 때 접속된 사용자별로 선택된 상품을 처리하는 경우 지금까지 배운 JSP 문법만 가지고는 이를 처리하기 어렵다. JSP 에서  page, request, session, application 내장객체를 통해 서로 다른 페이지에서 처리된 값을 저장하고 공유하기 위한 방법을 제공한다. 이는 컨테이너 기반 프로그램의 특징 중 하나로 실제 프로그램 구현 시 매우 중요한 기법이다.

 

➊ application은 모든 사용자가 공유하는 데이터를 저장할 수 있으며 톰캣이 종료될 때 까지 데이터를 유지할 수 있다(맨 위의 user1, user2 해당).
➋ session의 경우 사용자마다 분리된 저장 영역이 있으며 Page1, Page2, Page3 모두에서 공유되는 정보를 관리할 수 있다. 물론 이 데이터는 각자 공유 영역에서 관리되며 사용자 간에는 공유되지 않는다.
➌ 페이지 흐름이 Page1, Page2, Page3순으로 진행된다고 할 때, 한 페이지에서 다른 페이지로 데이터를 전달하려면 request 내장객체를 이용해야 한다(맨 아래의 user1에 해당한다). page 마다 생성됨.

 

  • request, session, application 은 각각 생성 시점과 소멸시점이 다르며 이를 잘 이해하고 적절한 내장객체를 이용해야 한다.
  • 각각의 내장객체는 모두 getAttribute(), setAttribute() 메서드를 통해 속성을 저장하거나 가져올 수 있다.

 

 

request, session, application을 이용한 속성 관리


- request, session, application은 맵 형태의 속성 관리 기능을 제공 한다.
- 속성을 저장하기 위해서는 setAttribute(String name, Object value) 형태를 취한다.
- 반대로 속성에 저장된 값을 가져오는 getAttribute(String name) 메서드는 name에 해당하는 Object 를 리턴한다.
- 리턴되는 타입이 Object 이므로 속성을 가지고 올 때에는 적절한 형 변환이 필요하다.
- 예를 들어 page1에서 session.setAttribute("name,"홍길동")으로 문자열 객체를 저장한다면.

  page3에서는 session.getAttribute("name")으로 저장된 값을 참조할 수 있다.

 

– PAGE 영역 - 하나의 JSP 페이지를 처리할 때 사용되는 영역 
– REQUEST 영역 - 하나의 HTTP 요청을 처리할 때 사용되는 영역 
– SESSION 영역 - 하나의 웹 브라우저와 관련된 영역 
– APPLICATION 영역 - 하나의 웹 어플리케이션과 관련된 영역

 

 

 

 

application 속성확인 예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
   application.setAttribute("name", "김태형");
   application.setAttribute("age", "26");

   %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1><a href="applicationAttrView.jsp">application 속성 확인</a></h1>
	
</body>
</html>

applicationAttrView.jsp

 

<%@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>Insert title here</title>
</head>
<body>


<%
	Enumeration<String> attrNames = application.getAttributeNames();
	
	while(attrNames.hasMoreElements()){
		
		String attrName = attrNames.nextElement();
		Object value = application.getAttribute(attrName);
		out.println(attrName + " = " + value.toString()+"<br>");
				
	}
	
%>

</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	request.setAttribute("lang", "ko");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


	<%-- <jsp:forward page="forward.jsp" /> --%>

	<!-- ko가 나온다  리퀘스트공유 > 포워드 or 인클루드 -->
	<%
		response.sendRedirect("forward.jsp");
	/* null이나온다 */
	%>



</body>
</html>

forward.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>

	<h1><%= request.getAttribute("lang") %></h1>

</body>
</html>

forward page와 response의 차이

 

 

 

  • 서블릿으로 변경된 JSP 코드는 모두 _jspService() 메서드에 위치함.
  • 메서드 매개변수인 request, response 를 비롯한 pageContext, session, application, page, config, out 등 메서드 내에서 참조할 수 있는 참조변수들이 내장객체가 됨.

내장객체를 이용한 속성 관리 기법


내장객체가 단순히 특정한 기능을 제공하는 컨테이너 관리 객체라는 점 외에도 한 가지 특징이 있다. 바로 page, request, session, application 내장객체를 이용한 속성 관리 기법이다. 이들 내장객체는 각자 지정된 생명주기가 있으며 setAttribute( ), getAttribute( )라는 메서드를 통해 해당 생명주기 동안 자바 객체를 유지하는 기능을 제공한다.

 

 

 

REQUEST 내장객체

 

  • request는 사용자 요청과 관련된 기능을 제공하는 내장객체로 javax.servlet.http.HttpServletRequest 클래스에 대한 참조변수이다
  • 주로 클라이언트에서 서버로 전달되는 정보를 처리하기 위해 사용한다
  • 대표적으로 HTML 폼을 통해 입력된 값을 JSP에서 가져올 때 사용함

 

예제

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Form</title>
</head>
<body>

	<h1>Request Form</h1>
	<hr>
	
	
	<!-- 중요 -->
	<form action="requestResult.jsp" method="get">
	
	<table>
		<tr>
			<td>이름</td>
			<td><input type="text" name="userName" id="userName"></td>
		</tr>
		<tr>
			<td>직업</td>
			<td>
			<select name="job">
					<option value="프로그래머">프로그래머</option>
					<option value="디자이너">디자이너</option>
					<option value="엔지니어">엔지니어</option>	
			</select>
			</td>
		</tr>
		<tr>
			<td>관심사</td>
			<td>
				<input type="checkbox" name="interest" value="java">JAVA<br>
				<input type="checkbox" name="interest" value="html5">html5<br>
				<input type="checkbox" name="interest" value="css3">css3<br>
				<input type="checkbox" name="interest" value="javascript">javascript<br>
				<input type="checkbox" name="interest" value="jsp">jsp<br>
			
			</td>
		</tr>
		<tr>
			<td></td>
			<td><input type="submit" value="보내기"><input type="reset" value="초기화"></td>
		</tr>
	</table>

	</form>
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request Result</title>
</head>
<body>

	<h1>Request Result</h1>
	<hr>

	<table>
		<tr>
			<td>이름</td>
			<td><%=request.getParameter("userName")%></td>
		</tr>
		<tr>
			<td>직업</td>
			<td><%=request.getParameter("job")%></td>
		</tr>
		<tr>
			<td>관심사</td>
			<td>
				<%
					String[] interests = request.getParameterValues("interest");

				for (int i = 0; i < interests.length; i++) {
					out.println(interests[i]+"<br>");
				}
				
				%>

			</td>
	</table>


</body>
</html>

GET 방식

 

RESPONSE 내장객체

 

  • ddresponse는 request와 반대되는 개념으로, 사용자 응답과 관련된 기능을 제공.
  • 사용자 요청(request)을 처리하고 응답을 다른 페이지로 전달하는 등의 기능을 제공한다.
  • javax.servlet.http.HttpServletReponse 객체에 대한 참조변수로, request에 만큼 많이 사용되지는 않으나 setContentType, sendRedirect와 같은 메서드는 잘 알아두어야 한다.

 

 

예제

<%@ 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>

	<form action="resultPage.jsp">
		페이지 이동테스트 
		<select name="select">
			<option value="0">forward</option>
			<option value="1">sendRedirect</option>
		</select>
		<input type="submit">

	</form>
</body>
</html>

 

resultPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Result Page</title>
</head>
<body>

   <%
      String select = request.getParameter("select");
     int selectNum = Integer.parseInt(select);
     
     if(selectNum>0){
        out.println(selectNum);
        
        // 현재 페이지가 응답으로 처리가 되고, result.jsp 페이지를 다시 요청
        response.sendRedirect("result.jsp");
     } else {
        out.println(selectNum);
        %>
<!--          현재 페이지가 응답으로 처리되는 것이 아니라 result.jsp 페이지의 결과가 응답으로 실행
 -->   
 <jsp:forward page="result.jsp"></jsp:forward>
   <%
     }
     %>

</body>
</html>

 

result.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>

<h1>최종 결과 페이지</h1>

</body>
</html>

 

SESSION 내장객체

 

  • HTTP 프로토콜이 비연결형 프로토콜이기 때문에 한 페이지가 출력된 다음에는 클라이언트와 서버의 연결이 끊어진다. 따라서 한번 로그인한 사용자가 로그아웃할 때까지 페이지를 이동해도 보관해야 할 정보가 있다면 이에 대한 처리가 매우 곤란해진다.
  • 이러한 HTTP 프로토콜 문제점을 해결하려고 나온 것이 쿠키와 세션이다.
  • session 은 javax.servlet.http.HttpSession 인터페이스의 참조 변수 이다. 
  • session 은 접속하는 사용자 별로 따로 생성되며 일정시간 유지되고 소멸된다.
    이러한 세션의 특징을 이용해 setAttribute() 메서드를 이용해 임의의 값을 저장해 놓고 활용할 수 있음.

- 세션이 주로 사용되는 경우는 다음과 같다. 
➊ 사용자 로그인 후 세션을 설정하고 일정 시간이 지난 경우 다시 사용자 인증을 요구 할 때. 
➋ 쇼핑몰에서 장바구니 기능을 구현할 때. 
➌사용자의 페이지 이동 동선 등 웹 페이지 트래킹 분석 기능 등을 구현할 때.

 

 

예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%
	session.setAttribute("userName", "김태형");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session control</title>
</head>
<body>

	<h1>세션에 정보를 저장했습니다 :)</h1>
	<h1><a href="sessionView.jsp">세션의 속성 확인</a></h1>

</body>
</html>

sessionView.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>

	<h1>세션의 속성에 저장된 userName : <%= session.getAttribute("userName")%></h1>
	<h1><a href="../index.jsp">index로 이동</a></h1>
	
</body>
</html>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>First JSP</title>
</head>
<body>

<h1>INDEX :  <%= session.getAttribute("userName")%></h1>


</body>
</html>

 

 

 

그 밖의 내장객체

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] 쿠키  (0) 2020.12.17
[JSP] 에러  (0) 2020.12.17
[JSP] beans 빈즈  (0) 2020.12.17
[JSP] 내장객체와 속성관리 / 생명주기  (0) 2020.12.16
[JSP] 지시어 & 액션 ( include / param / forward )  (0) 2020.12.15
[JSP] JSP / 서블릿 작성  (0) 2020.12.14
[JSP] apache tomcat 톰캣 환경설정  (0) 2020.12.14

지시어

 

 

 

 

기본적인 page 지시어는 자동 생성됨.

 

 

 

 

 

예제

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Frame Include</title>
<style>

div.header {
   text-align: center;
}

div.nav {
   text-align: center;
}

div.news, div.shopping {
   width: 45%;
}

div.news {
   float: left;
}

div.shopping {
   float: right;
}

div.footer {
   clear: both;
   text-align: center;
}
</style>
</head>
<body>

   <div class="header">
      <h1>include 지시어 : Header</h1>
      <hr>
   </div>

   <div class="nav">[게임] [쇼핑] [뉴스]</div>

   <div class="contents">
      <div class="news">
         <h3>[최신 뉴스]</h3>
         <hr>
         코로나 바이러스 발생 현황
      </div>

      <div class="shopping">
         <h3>[쇼핑정보] 인기상품</h3>
         <hr>
         좋은 스마트폰
      </div>
   </div>

   <div class="footer">copyright 2020@</div>

</body>
</html>

 

 

지시어를 사용해 위와 같은 페이지 만들기

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Frame Include</title>
<style>
div.header {
	text-align: center;
}

div.nav {
	text-align: center;
}

div.news, div.shopping {
	width: 45%;
}

div.news {
	float: left;
}

div.shopping {
	float: right;
}

div.footer {
	clear: both;
	text-align: center;
}
</style>

</head>
<body>

	<%@ include file="header.jsp"%>
	<%@ include file="nav.jsp"%>

	<div class="contents">
		<%@ include file="news.jsp"%>
		<%@ include file="shopping.jsp"%>

	</div>


  <%@ include file="footer.jsp" %>

</body>
</html>

 

header.jsp / footer.jsp / nav.jsp / new.jsp / shopping.jsp 각각생성

//header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   <div class="header">
      <h1>include 지시어 : Header include 처리</h1>
      <hr>
   </div>
   
   
 //footer.jsp
 
   <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div class="footer">copyright 2020@</div>



//nav.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div class="nav">[게임] [쇼핑] [뉴스]</div>


//news.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
      <div class="news">
         <h3>[최신 뉴스]</h3>
         <hr>
         코로나 바이러스 발생 현황
      </div>
      
      
// shopping.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
      <div class="shopping">
         <h3>[쇼핑정보] 인기상품</h3>
         <hr>
         좋은 스마트폰
      </div>

 

액션

 

 

인클루드 / include 액션 / param

 

예제1)

 

위의 index.jsp에 footer 부분을 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Frame Include</title>
<style>
div.header {
	text-align: center;
}

div.nav {
	text-align: center;
}

div.news, div.shopping {
	width: 45%;
}

div.news {
	float: left;
}

div.shopping {
	float: right;
}

div.footer {
	clear: both;
	text-align: center;
}
</style>

</head>
<body>

	<%@ include file="header.jsp"%>
	<%@ include file="nav.jsp"%>

	<div class="contents">
		<%@ include file="news.jsp"%>
		<%@ include file="shopping.jsp"%>

	</div>

	<jsp:include page="footer.jsp">
		<jsp:param name="email" value="test@test.net" />
		<jsp:param name="tel" value="000-000-0000" />
	</jsp:include>



</body>
</html>

footer.jsp 부분도 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div class="footer">copyright 2020@</div>
<div class="footer">email: <%= request.getParameter("email") %> , 
tel: <%= request.getParameter("tel") %></div>

실행 결과

 

포워드 forward 액션

 

예제2)

 

index.html에 forward page를 사용하면

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Frame Include</title>
<style>
div.header {
	text-align: center;
}

div.nav {
	text-align: center;
}

div.news, div.shopping {
	width: 45%;
}

div.news {
	float: left;
}

div.shopping {
	float: right;
}

div.footer {
	clear: both;
	text-align: center;
}
</style>

</head>
<body>

	<%@ include file="header.jsp"%>
	<%@ include file="nav.jsp"%>

	<div class="contents">
		<%@ include file="news.jsp"%>
		<%@ include file="shopping.jsp"%>

	</div>

	<jsp:forward page="footer.jsp">
		<jsp:param name="email" value="test@test.net" />
		<jsp:param name="tel" value="000-000-0000" />
	</jsp:forward>


</body>
</html>

footer 페이지만 보여지게 된다.

'JAVA > Jsp&Servlet' 카테고리의 다른 글

[JSP] 쿠키  (0) 2020.12.17
[JSP] 에러  (0) 2020.12.17
[JSP] beans 빈즈  (0) 2020.12.17
[JSP] 내장객체와 속성관리 / 생명주기  (0) 2020.12.16
[JSP] 기본 객체와 영역 / 내장객체 / request / response / .. etc  (0) 2020.12.15
[JSP] JSP / 서블릿 작성  (0) 2020.12.14
[JSP] apache tomcat 톰캣 환경설정  (0) 2020.12.14

 

생성!

 

 

JSP 파일 만들고 작성하기 

 

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>

<%
	Date now = new Date();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>now Date</title>
</head>
<body>

<h1>현재시간 : <%= now %></h1>

</body>
</html>

 

 

 

서블릿 작성

 

- 서블릿이란 서블릿 클래스를 상속해서 만들어진 객체이다.
- 웹 컨테이너는 서블릿 클래스를 가지고 서블릿 객체를 만든 다음 그 객체를 초기화해서 웹 서비스를 할 수 있는 상태로 만드는데, 이 작업을 거친 서블릿 객체만 서블릿이라고 할 수 있다.

 

 

package test;

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;

/**
 * Servlet implementation class firstweb1
 */
@WebServlet("/now1")
public class firstweb1 extends HttpServlet {

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		System.out.println("GET 방식의 요청");
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// doGet(request, response);
	}

}

 

 


 

 

그냥 일반 클래스 생성 > extends HttpServlet 해주고 

shift  + alt + s 해서 do get 오버라이딩

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
      // 응답 : html 생성해서 반환
      // 응답 관련 객체 : HttpServletResponse response
      
      // 컨텐트 타입과 character set 설정
      response.setContentType("text/html; charset=UTF-8");
      
      // 응답 처리에 사용할 날짜와 시간 데이터
      Date now = new Date();
      
      // HTML의 응답 처리를 위한 스트림 생성
      PrintWriter writer = response.getWriter();
      
      // 응답 데이터를 출력 : html 구조
      writer.println("<html>");
      writer.println("<head><title>now Date</title></head>");
      writer.println("<body>");
      writer.println("<h1>현재시간 : ");
      writer.println(now); // now.toString()
      writer.println("</h1>");
      writer.println("<h1>서블릿에서 생성된 응답코드</h1>");      
      writer.println("</body>");
      writer.println("</html>");
      
      writer.close();
   }
   
}

 

 


 

-서블릿 3.0버전부터는 @WebServlet 이노테이션을 사용하면, 웹 컨테이너가 자동 등록.

  <!-- 
  	서블릿 등록
  	서블릿 이름, 서블릿 클래스의 풀네임  
  -->
  
  <servlet>
  	<servlet-name>nowServlet</servlet-name>
  	<servlet-class>test.HelloServlet</servlet-class>  
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>nowServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

 

 

 

 

정리 ) 위에했던 것

 

 

 

 

톰캣 다운받기

 

tomcat.apache.org/download-80.cgi

 

수업에선 이거 받았음 8.5

 

 

– startup.bat – 톰캣을 독립 프로세스로 시작

– shutdown.bat – 실행된 톰캣을 종료시킨다.

– catalina.bat – 톰캣을 시작하거나 종료한다.

 

 

 

이클립스 기본 환경 설정

 

preferences > server > runtime Environments

에서 add 누르고 tomcat 버전에 맞게 눌러준다.

create a new local server 체크해주고 next

 

 

 

이름 해주고 디렉토리는 톰캣이 설치된 곳으로 잡아준다.

(여기는 C드라이브에 바로 압축 풀었음)

 

 

완료후 옆에 이렇게 생기는 것을 볼 수 있다.

 

 

이클립스 기본 주석 설정하기

 

텍스트 인코딩 설정하기

 

1. [General] → [Workspace] → Text file encoding 항목을 Other 로 변경한 뒤 UTF-8로 설정

2. 자바 클래스 인코딩 설정 : [General] → [Content Types] → Java Class File에 

   대한 Default encoding 값을 UTF-8 로 입력 후 <Update> 버튼

3. JSP 파일 인코딩 설정 : [General]→[Content Types] → [Text] → JSP 항목을 UTF-8 로 변경 후 <Update> 버튼

4. CSS / HTML / JSP 코드 인코딩 설정 : [Web] → [HTML Files], [JSP Files] 항목을 ISO 10646/Unicode(UTF-8)로 변경

 

 

package dept;

public class Dept {
	
	// VO : 데이터를 저장하는 기능만 가지는 클래스, read Only
	// DTO : 데이터틀 저장하는 기능을 가지는 클래스, Write 가능
	
	public Dept(int deptno, String dname, String loc) {
		super();
		this.deptno = deptno;
		this.dname = dname;
		this.loc = loc;
	}
	
	private int deptno;
	private String dname;
	private String loc;
	
	
	
	
	@Override
	public String toString() {
		return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
	}

	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	
}

 

package dept;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionProvider {

	public static Connection getConnection() throws SQLException {
		
		Connection conn = null;

         // 2. DB 연결 localhost == 127.0.0.1
         String jdbcUrl = "jdbc:mysql://localhost:3306/project?serverTimezone=UTC";
         String user = "hyo";
         String password = "admin";
         conn = DriverManager.getConnection(jdbcUrl, user, password);

         return conn;
	}
	
}

 

 

package dept;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

// DAO : Data Access Object -> 데이터베이스 처리하는 기능만 가지는 클래스
public class DeptDao {

	private static DeptDao dao = new DeptDao();
	
	private DeptDao() {
	}
	
	public static DeptDao getInstance() {
		return dao;
	}
	
	

	// 부서 입력
	int insertDept(Dept dept, Connection conn) {

		int resultCnt = 0;

		// DB 연결 : Connection
		try {
			// Statement
			// SQL : Insert into
			String sql = "insert into dept values(?,?,?)";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, dept.getDeptno());
			pstmt.setString(2, dept.getDname());
			pstmt.setString(3, dept.getLoc());

			// sql 실행
			resultCnt = pstmt.executeUpdate();

			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}

		// 결과
		return resultCnt;

	}

	// 부서 정보를 수정 : Dept
	int updateDept(Dept dept, Connection conn) {

		int resultCnt = 0;

		// DB 연결 : Connection
		try {
			// Statement
			// SQL : Update
			String sql = "update dept set dname=?, loc=? where deptno=? ";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setInt(3, dept.getDeptno());
			pstmt.setString(1, dept.getDname());
			pstmt.setString(2, dept.getLoc());

			// sql 실행
			resultCnt = pstmt.executeUpdate();

			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}

		// 결과
		return resultCnt;

	}

	// 부서정보 삭제
	int deleteDept(int deptno, Connection conn) {

		int resultCnt = 0;

		// DB 연결 : Connection
		try {
			// Statement
			// SQL : delete
			String sql = "delete from dept where deptno=?";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, deptno);

			// sql 실행
			resultCnt = pstmt.executeUpdate();

			pstmt.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}

		// 결과
		return resultCnt;
	}

	// 부서의 전체 리스트
	List<Dept> listDept(Connection conn) {

		List<Dept> list = new ArrayList<Dept>();

		Statement stmt = null;

		try {
			stmt = conn.createStatement();

			String sql = "select * from dept order by deptno";

			ResultSet rs = stmt.executeQuery(sql);

			while (rs.next()) {
				// Dept d = new Dept(rs.getInt(1), rs.getString(2), rs.getString(3));
				// list.add(d);
				list.add(new Dept(rs.getInt(1), rs.getString(2), rs.getString(3)));
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return list;
	}

	// 부서 하나 검색
	Dept searchDept(int deptno, Connection conn) {
		
		Dept dept = null;

		Statement stmt = null;

		try {
			stmt = conn.createStatement();

			String sql = "select * from dept where deptno="+deptno;

			ResultSet rs = stmt.executeQuery(sql);

			if(rs.next()) {
				dept = new Dept(rs.getInt(1), rs.getString(2), rs.getString(3));
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return dept;

	}

}

 

 

package dept;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;

public class DeptManager {

	// 사용자 입력
	Scanner sc = new Scanner(System.in);

	DeptDao dao = DeptDao.getInstance();

	// 부서입력 메소드 : 사용자에게 입력 받은 데이터를 DAO를 이용해서 DB 입력
	void insertDept() {

		// 부서정보를 받아서 인스턴스를 생성하고 dao.insertDept()

		System.out.println("부서정보를 입력합니다.");
		System.out.println("부서번호를 입력해주세요.");
		String deptno = sc.nextLine();
		System.out.println("부서이름을 입력해주세요.");
		String dname = sc.nextLine();
		System.out.println("지역 이름을 입력해주세요.");
		String loc = sc.nextLine();

		Dept dept = new Dept(Integer.parseInt(deptno), dname, loc);

		Connection conn = null;

		int resultCnt = 0;

		try {
			conn = ConnectionProvider.getConnection();
			
			resultCnt = dao.insertDept(dept, conn);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(resultCnt>0) {
			System.out.println("입력되었습니다.");
		} else {
			System.out.println("입력이 실패했습니다.");
		}
	}


	// 부서 정보 수정 메소드 : 사용자에게 입력 받고 데이터를 DAO를 이용해서 수정
	void editDept() {
		
		System.out.println("수정을 원하시는 부서번호를 입력해주세요.");
		String deptno = sc.nextLine();
		System.out.println("새로운 부서 이름을 입력해주세요. ");
		String dname = sc.nextLine();
		System.out.println("새로운 지역 이름을 입력해주세요.");
		String loc = sc.nextLine();
		
		Dept dept = new Dept(Integer.parseInt(deptno), dname, loc);
		

		Connection conn = null;
		
		int resultCnt = 0;

		try {
			conn = ConnectionProvider.getConnection();
			
			resultCnt = dao.updateDept(dept, conn);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(resultCnt>0) {
			System.out.println("수정되었습니다.");
		} else {
			System.out.println("수정이 실패했습니다.");
		}
		
		
	}

	
	// 부서 정보를 삭제
	void delDept() {
		
		System.out.println("삭제를 원하시는 부서번호를 입력해주세요.");
		String deptno = sc.nextLine();

		Connection conn = null;
		
		int resultCnt = 0;

		try {
			conn = ConnectionProvider.getConnection();
			
			resultCnt = dao.deleteDept(Integer.parseInt(deptno), conn);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(resultCnt>0) {
			System.out.println("삭제되었습니다.");
		} else {
			System.out.println("지우려는 정보가 존재하지 않습니다.");
		}
		
		
	}
	
	void listDept() {
		
		Connection conn = null;
				
		List<Dept> list = null;

		try {
			conn = ConnectionProvider.getConnection();
			
			list = dao.listDept(conn);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(list.isEmpty()) {
			System.out.println("저장된 정보가 없습니다.");
		} else {
			
			for(Dept d : list) {
				//System.out.println(d);
				System.out.printf("%5s", d.getDeptno()+"\t" );
				System.out.printf("%12s", d.getDname()+"\t" );
				System.out.printf("%12s", d.getLoc()+"\n" );
			}
			
			
		}
		
	}
	
	void searchDept() {
		
		System.out.println("부서를 검색합니다.");
		System.out.println("찾으시는 부서의 번호를 입력해주세요.");
		String deptno = sc.nextLine();
		

		Connection conn = null;

		Dept dept = null;

		try {
			conn = ConnectionProvider.getConnection();
			
			dept = dao.searchDept(Integer.parseInt(deptno), conn);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(dept!=null) {
			System.out.println(dept);
		} else {
			System.out.println("찾으시는 정보가 존재하지 않습니다.");
		}
		
		
	}


}

 

 

package dept;

import java.util.Scanner;

public class DeptMain {

	public static void main(String[] args) {

		DeptManager manager = new DeptManager();

		Scanner sc = new Scanner(System.in);

		// 데이터 베이스 드라이버 로드
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");

			while(true) {

				System.out.println("부서관리 메뉴를 입력해주세요.");
				System.out.println("1. 입력, 2. 수정, 3.삭제, 4. 전체리스트, 5. 검색, 6. 종료");
				System.out.println("__________________________________________________");

				String select = sc.nextLine();

				switch (select.charAt(0)) {
				case '1':
					manager.insertDept();
					break;
				case '2':
					manager.editDept();
					break;
				case '3':
					manager.delDept();
					break;
				case '4':
					manager.listDept();
					break;
				case '5':
					manager.searchDept();
					break;
				case '6':
					System.out.println("프로그램을 종료합니다.");
					return;
				}
			}
			

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JDBCMysqlStatementTest {

	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		Connection conn = null;
		
		try {
			// 1. 드라이버 로드
	         Class.forName("com.mysql.cj.jdbc.Driver");
	         System.out.println("Driver Load!");
			
			// 2. DB 연결     localhost == 127.0.0.1
	         String jdbcUrl ="jdbc:mysql://localhost:3306/project?serverTimezone=UTC";
	         String user = "hyo";
	         String password = "admin";
	         
	         conn = DriverManager.getConnection(jdbcUrl, user, password);
	         System.out.println("데이터베이스에 접속했습니다!");
			
			// 3. statement 인스턴스생성
			
			Statement stmt = conn.createStatement();
			
			System.out.println("부서 이름을 입력해주세요.");
			String userDname= sc.nextLine();
			System.out.println("부서의 위치를 입력해주세요.");
			String userLoc = sc.nextLine();
			
			
			// 입력 : insert
			
			String sqlInsert = "insert into dept (deptno, dname, loc) values (80, '"+userDname+"','"+userLoc+"')";
				
			
			int resultCnt = stmt.executeUpdate(sqlInsert); // sql문을 실행하고 횟수반환
			if(resultCnt>0) {
				System.out.println("정상적인 입력");
			}
			
			// 4. sql 실행 : 부서리스트 출력
			String sql="select * from dept order by deptno";
			ResultSet rs = stmt.executeQuery(sql);
			
			// 5. ResultSet을 이용해서 결과 출력
			while(rs.next()) { 			// rs.next(); // boolean Type
	              int deptno = rs.getInt("deptno");
	              String dname = rs.getString("dname");
	              String loc = rs.getString(3);
	              
	              // System.out.println(deptno+"\t"+dname+"\t"+loc);
	              System.out.printf("%5s",deptno+"\t");
	              System.out.printf("%12s",dname+"\t");
	              System.out.printf("%12s",loc+"\n");

			}
			
			rs.close();
			stmt.close();
			conn.close();		
			
		} catch (ClassNotFoundException e) {
			System.out.println("Driver 로드 실패");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		 
		
		
		
	}

}​
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCMysqlConnectionTest {

   public static void main(String[] args) {

      Connection conn = null;
      
      try {
         // 1. 드라이버 로드
         Class.forName("com.mysql.cj.jdbc.Driver");
         System.out.println("Driver Load!");
         
         // 2. DB 연결       localhost == 127.0.0.1
         String jdbcUrl ="jdbc:mysql://localhost:3306/project?serverTimezone=UTC";
         String user = "hyo";
         String password = "admin";
         
         conn = DriverManager.getConnection(jdbcUrl, user, password);
         System.out.println("데이터베이스에 접속했습니다.");
         
         // ....
         
         
         conn.close();
         
   
      } catch (ClassNotFoundException e) {
         System.out.println("Driver 로드 실패");
         e.printStackTrace();
      } catch (SQLException e) {
         e.printStackTrace();
      }
      
      
      
      
      
   }

}
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCMysqlPreparedTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Connection conn = null;

		try {
			// 1. 드라이버 로드
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("Driver Load!");

			// 2. DB 연결 localhost == 127.0.0.1
			String jdbcUrl = "jdbc:mysql://localhost:3306/project?serverTimezone=UTC";
			String user = "hyo";
			String password = "admin";

			conn = DriverManager.getConnection(jdbcUrl, user, password);
			System.out.println("데이터베이스에 접속했습니다.");

			// Statement stmt = conn.createStatement();

			System.out.println("부서 번호 입력해주세요.");
			int userDeptno = sc.nextInt();
			sc.nextLine();
			System.out.println("부서 이름을 입력해주세요.");
			String userDname = sc.nextLine();

			System.out.println("부서의 위치를 입력해주세요.");
			String userLoc = sc.nextLine();

			// PreparedStatement 인스턴스 생성
			String sqlInsert = "insert into dept values (?, ?, ?)";

			PreparedStatement pstmt = conn.prepareStatement(sqlInsert);
			pstmt.setInt(1, userDeptno);
			pstmt.setString(2, userDname);
			pstmt.setString(3, userLoc);

			int resultCnt = pstmt.executeUpdate();

			if (resultCnt > 0) {
				System.out.println("정상적으로 입력되었음.");
			} else {
				System.out.println("데이터 입력이 되지 않았음.");
			}

			// 부서 리스트 출력
			String sqlList = "select * from dept order by loc";
			pstmt = conn.prepareStatement(sqlList);
			ResultSet rs = pstmt.executeQuery();

			while (rs.next()) {
				System.out.print(rs.getInt(1) + ", ");
				System.out.print(rs.getString(2) + ", ");
				System.out.print(rs.getString(3) + "\n");
			}

			rs.close();
			pstmt.close();
			conn.close();

		} catch (ClassNotFoundException e) {
			System.out.println("Driver 로드 실패");

		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

}

1) 커넥트 파일 위치 알아두기 

- 헛갈리지 않게 따로 복사해서 보관해두는 것도 좋다.

 

2) 라이브러리 불러오기  Build Path - Configure Build Path

 

3 Add Extenal Jars

 

 

4-1) Mysql

4-2) Oracle sql

 

package Homework;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Jdbc_Homework1 {

	public static void main(String[] args) {

			// 2020.11.18
		
		Connection conn = null;
		
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("Oracle Driver Load !!!");

			
			String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
			String user = "scott";
			String password = "tiger";
			
			conn = DriverManager.getConnection(jdbcUrl, user, password);
			System.out.println("데이터베이스에 접속했습니다.");
			System.out.println("");
			
			
			// 인스턴스 생성하기
			PreparedStatement pstmt = null;
			
////////////// 1) EMP 테이블에 새로운 사원 정보를 입력하는 프로그램을 작성해보자.
			// emp : empno, ename, job, mgr, hiredate, sal, comm, deptno
			String sqlQ1 = "insert into emp values (seq_emp_empno.nextval,?,?,?,?,?,?,?)";
			pstmt = conn.prepareStatement(sqlQ1);
			pstmt.setString(1,"hyoseon");
			pstmt.setString(2,"gamer");
			pstmt.setInt(3,7839);
			pstmt.setString(4,"20/11/18");
			pstmt.setInt(5,10000);
			pstmt.setInt(6,2000);
			pstmt.setInt(7,30);
			
			int resultCnt = pstmt.executeUpdate();			
			if (resultCnt>0) {
				System.out.println("");
				System.out.println("-------------------- 문제 1번) 정상입력");
				System.out.println("-------------------- 새로운 사원정보 입력 / ename : hyoseon");
				System.out.println("");
				resultCnt=0;
			}else {
				System.out.println("입력이 되지 않았음");
			}
			
			
			// 부서 리스트 출력
//////////////2) EMP 테이블의 모든 데이터를 출력하는 프로그램을 작성해보자.
			
			
			System.out.println("");
			System.out.println("-------------------- 문제 2번) 모든데이터출력");
			System.out.println("");
			String sqlList="select * from emp order by empno";
			pstmt=conn.prepareStatement(sqlList);
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next()) {
				System.out.print(rs.getInt(1)+"\t");
				System.out.print(rs.getString(2)+"\t");
				System.out.print(rs.getString(3)+"\t");
				System.out.print(rs.getInt(4)+"\t");
				System.out.print(rs.getString(5)+"\t");
				System.out.print(rs.getInt(6)+"\t");
				System.out.print(rs.getInt(7)+"\t");
				System.out.print(rs.getInt(8)+"\t");
				System.out.println("");
				
			}
////////////// 3) EMP 테이블에 서 “SCOTT” 사원의 급여(sal) 정보를 1000으로 바꾸는 프로그램을 작성해보자.
			String sqlQ3 = "update emp set sal=1000 where ename='SCOTT'";
			Statement stmt = conn.createStatement();
			resultCnt = stmt.executeUpdate(sqlQ3);
			if (resultCnt>0) {
				System.out.println("");
				System.out.println("-------------------- 문제 3번) 정상입력");
				System.out.println("-------------------- 스캇 월급 1000으로 수정!");
				System.out.println("");
			}else {
				System.out.println("입력이 되지 않았음");
			}
////////////// 4)EMP 테이블에 서 “SCOTT” 이름으로 검색한 결과를 출력하는 프로그램을 작성해보자.
			System.out.println("");
			System.out.println("-------------------- 문제 4번) Scott 검색 데이터 출력");
			
			String sqlQ4 = "select * from emp where ename='SCOTT'";
			
			rs = stmt.executeQuery(sqlQ4);
			if(!rs.next()) {
				System.out.println("검색결과 X");
			}else {
				do {
					System.out.print(rs.getInt(1)+"\t");
					System.out.print(rs.getString(2)+"\t");
					System.out.print(rs.getString(3)+"\t");
					System.out.print(rs.getInt(4)+"\t");
					System.out.print(rs.getString(5)+"\t");
					System.out.print(rs.getInt(6)+"\t");
					System.out.print(rs.getInt(7)+"\t");
					System.out.print(rs.getInt(8)+"\t");
					System.out.println("");
				}while(rs.next());
				}
			
			
					

//////////////5.모든 사원정보를 출력하되 부서정보를 함께 출력하는 프로그램을 작성해보자.
			System.out.println("");
			System.out.println("-------------------- 문제 5번) 사원정보 + 부서정보 함께 출력");
			System.out.println("");
			String sqlList2="select * from emp, dept where emp.deptno=dept.deptno";
			pstmt=conn.prepareStatement(sqlList2);
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				System.out.print(rs.getInt(1)+"\t");
				System.out.print(rs.getString(2)+"\t");
				System.out.print(rs.getString(3)+"\t");
				System.out.print(rs.getInt(4)+"\t");
				System.out.print(rs.getString(5)+"\t");
				System.out.print(rs.getInt(6)+"\t");
				System.out.print(rs.getInt(7)+"\t");
				System.out.print(rs.getInt(8)+"\t");
				System.out.print(rs.getInt(9)+"\t");
				System.out.print(rs.getString(10)+"\t");
				System.out.print(rs.getString(11)+"\t");
				System.out.println("");
				
			}
			
			
		} catch (ClassNotFoundException e) {
	         System.out.println("Driver 로드 실패");
	      } catch (SQLException e) {
	         e.printStackTrace();
	      }
		
		
	}

}

STATEMENT

 

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JDBCOracleStatementTest {

	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		Connection conn = null;
		
		try {
			// 1. 드라이버 로드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("Oracle Driver Load !!!");
			
			// 2. DB 연결     localhost == 127.0.0.1
			String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
			String user = "scott";
			String password = "tiger";
			
			conn = DriverManager.getConnection(jdbcUrl, user, password);
			System.out.println("데이터베이스에 접속했습니다.");
			
			// 3. statement 인스턴스생성
			
			Statement stmt = conn.createStatement();
			
			System.out.println("부서 이름을 입력해주세요.");
			String userDname= sc.nextLine();
			System.out.println("부서의 위치를 입력해주세요.");
			String userLoc = sc.nextLine();
			
			
			// 입력 : insert
			
			String sqlInsert = "insert into dept values (SEQ_DEPT_DEPTNO.NEXTVAL,'"+userDname+"','"+userLoc+"')";
				
			
			int resultCnt = stmt.executeUpdate(sqlInsert); // sql문을 실행하고 횟수반환
			if(resultCnt>0) {
				System.out.println("정상적인 입력");
			}
			
			// 4. sql 실행 : 부서리스트 출력
			String sql="select * from dept order by deptno";
			ResultSet rs = stmt.executeQuery(sql);
			
			// 5. ResultSet을 이용해서 결과 출력
			while(rs.next()) { 			// rs.next(); // boolean Type
				int deptno = rs.getInt("deptno");
				String dname = rs.getString("dname");
				String loc = rs.getString(3);
				System.out.println(deptno+", "+ dname+ ", "+loc);
				
			}
			
			rs.close();
			stmt.close();
			conn.close();		
			
		} catch (ClassNotFoundException e) {
			System.out.println("Driver 로드 실패");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		 
		
		
		
	}

}

 

 

PREPAREDSTATEMENT

 

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCOraclePreparedTest {

	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		Connection conn = null;
		
		try {
			// 1. 드라이버 로드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("Oracle Driver Load !!!");
			
			// 2. DB 연결     localhost == 127.0.0.1
			String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
			String user = "scott";
			String password = "tiger";
			
			conn = DriverManager.getConnection(jdbcUrl, user, password);
			System.out.println("데이터베이스에 접속했습니다.");
			
		
			//Statement stmt = conn.createStatement();
			
			System.out.println("부서 이름을 입력해주세요.");
			String userDname= sc.nextLine();
			System.out.println("부서의 위치를 입력해주세요.");
			String userLoc = sc.nextLine();
			
			
			// PreparedStatement 인스턴스 생성
			String sqlInsert = "insert into dept values (Seq_dept_deptno.nextval, ?, ?)";
			
			PreparedStatement pstmt = conn.prepareStatement(sqlInsert);
			pstmt.setString(1, userDname);
			pstmt.setString(2, userLoc);
			
			int resultCnt = pstmt.executeUpdate();
			
			if(resultCnt>0) {
				System.out.println("정상적으로 입력되었음.");
			}else {
				System.out.println("데이터 입력이 되지 않았음.");
			}
			
			// 부서 리스트 출력
			String sqlList ="select * from dept order by loc";
			pstmt = conn.prepareStatement(sqlList);
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next()) {
				System.out.print(rs.getInt(1)+", ");
				System.out.print(rs.getString(2)+", ");
				System.out.print(rs.getString(3)+"\n");
			}
			
			rs.close();
			pstmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			System.out.println("Driver 로드 실패");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		 
		
		
		
	}

}

 

 

PREPAREDSTATEMENT 2) 검색

 

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JDBCOraclePreparedTest2 {

   public static void main(String[] args) {

      Scanner sc = new Scanner(System.in);
      
      Connection conn = null;
      
      try {
         // 1. 드라이버 로드
         Class.forName("oracle.jdbc.driver.OracleDriver");
         System.out.println("Oracle Driver Load!");
         
         // 2. DB 연결       localhost == 127.0.0.1
         String jdbcUrl ="jdbc:oracle:thin:@localhost:1521:orcl";
         String user = "scott";
         String password = "tiger";
         
         conn = DriverManager.getConnection(jdbcUrl, user, password);
         System.out.println("데이터베이스에 접속했습니다.");
         
         
         // 3. statement 인스턴스생성
         PreparedStatement pstmt = null;

         
         System.out.println("검색하고 싶은 부서 이름을 입력하세요.");
         String searchDname = sc.nextLine();
         
         // 부서 정보 리스트 
         String sqlSelect = "select * from dept where dname=? order by loc";
         
         pstmt = conn.prepareStatement(sqlSelect);
         pstmt.setString(1, searchDname);
         
         ResultSet rs = pstmt.executeQuery();
         
         if(!rs.next()) {
            System.out.println("검색 결과 X");
         } else {
            do  {
               System.out.print(rs.getInt(1)+"\t");
               System.out.print(rs.getNString(2)+"\t");
               System.out.print(rs.getNString(3)+"\n");
            } while(rs.next());
         }
         
         
         rs.close();
         pstmt.close();
         conn.close();
         
         
         
      } catch (ClassNotFoundException e) {
         System.out.println("Driver 로드 실패");
      } catch (SQLException e) {
         e.printStackTrace();
      }
      
      
      
      
      
   }

}

소켓(Socket)이란?

소켓은 TCP를 위한 구조이다. TCP를 사용하여 응용 프로그램끼리 통신을 하기 위해서는 먼저 연결을 하여야 하는데 연결을 하기 위해서느 연결 끝점(End point)가 있어야 한다. 이 연결끝점이 바로 Socket이다.

 

 

Socket 클래스

생성자 설명
Socket (String host, int port) 호스트 이름이 host이고 포트 번호가 port인 새로운 소켓을 생성한다
Socket (InetAddress address, int port) InetAddress에 기술된 주소로 새로운 소켓을 생성한다
메소드 설명
InputStream getInputStream() 소켓이 사용하는 입력 스트림을 반환한다
OutputStream getOutputStream() 소켓이 사용하는 출력 스트림을 반환한다
Inetaddress getInetAddress() 소켓이 연결되어 있는 인터넷 주소를 반환한다
public int getLocalPort() 소켓이 연결되어 있는 포트 번호를 반환한다
public int getPort() 원격 컴퓨터의 포트번호를 반환한다
pbulic InetAddress getLocalAddress() 소케싱 연결되어 있는 인터넷 주소를 반환한다

 

ServerSocket 클래스

생성자 설명
public ServerSocket(int port) throws IOException 포트번호 Port에 대해 ServerSocket의 새로운 인스턴스를 만든다.
포트번호 0은 비어있는 포트번호를 사용한다는 의미이다.
queue는 서버가 받을 수 있는 입력 연결의 개수를 의미한다.
(디폴트는 50연결이다)
address는 컴퓨터의 인터넷 주소를 나타낸다.
public ServerSocket(int port, int queue) throws IOException
public ServerSocket(int port, int queue, InetAddress address ) throws IOException
메소드 설명
public socket accept() 접속요청을 받는다
public void close() ServerSocket을 닫는다
public Inetaddress getInetAddress() 소켓이 연결되어 있는 인터넷 주소를 반환한다
public int getSoTimeout() 소켓에 대한 타임아웃값을 밀리 초로 반환하거나 설정한다.

 

 

소켓클래스를 이용한 채팅방

 

서버)

package network;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class TCPIPChatMultichatServer {

	// 접속 사용자 정보를 저장 : 메세지를 전체에게 보내기 위해서
	// 저장정보 : name, OutputStream
	// Map<String, Object>로 저장
	HashMap<String, Object> clients;

	public TCPIPChatMultichatServer() {
		clients = new HashMap<String, Object>();
		Collections.synchronizedMap(clients); // 스레드 동기화에 안전한 상태로 해주는메서드
	}

	public void start() throws IOException {

		// Server Socket 생성
		// 사용자의 요청이 있으면 Socket 생성해서 연결 > Clients 사용자 정보를 저장
		// 연결 > Clients 사용자 정보를 저장 스레드로 처리

		ServerSocket serverSocket = new ServerSocket(7777);
		System.out.println("Chatting Server Start!");

		Socket socket = null;
		
		while(true) {
		// 요청이 들어올 때까지 대기 하다가 요청이 들어오면 새로운 소켓을 생성해서 반환
		socket = serverSocket.accept();
		// map에 정보저장, 접속한 사람들에게 메세지를 전송
		
		System.out.println("["+socket.getInetAddress()+socket.getPort()+"] 사용자 접속");
		
		ServerReceiver receiver = new ServerReceiver(socket);
		receiver.start();
			
		}

	}

	void SendToAll(String msg) {
		// 일괄처리 - Map은 순서가 없다 - Map이 가지고 있는 key를 Set으로 만든다.
		Set<String> keys = clients.keySet();
		Iterator<String> itr = keys.iterator();

		while (itr.hasNext()) {
			DataOutputStream out = (DataOutputStream) clients.get(itr.next()); // 키값가져오기
			try {
				out.writeUTF(msg);
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}

	// 내부클래스 : 데이터 받아서 저장, 메시지 전체 발송
	private class ServerReceiver extends Thread {
		// Socket, InputStream, OutputStream
		Socket socket;
		DataOutputStream out;
		DataInputStream in;

		public ServerReceiver(Socket socket) {
			this.socket = socket;

			try {
				in = new DataInputStream(socket.getInputStream());
				out = new DataOutputStream(socket.getOutputStream());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		@Override
		public void run() {
		 String name=null; // 접속한 사용자 이름
		 try {
			name= in.readUTF();		// 이름을 스트림을 통해 받는다
			clients.put(name, out); // map에 사용자 정보 저장
			SendToAll(">>>>>>>>>> " +name+"님이 접속하셨습니다.");// 내부클래스에서는 외부 클래스의 멤버를 참조할 수 있다.
			
			while(in !=null ) {
				SendToAll(in.readUTF());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			clients.remove(name);
			System.out.println(name+"님이 나가셨습니다.");
			
		}
		}

	}

	public static void main(String[] args) throws IOException {
		new TCPIPChatMultichatServer().start();

	}
}

 

클라이언트)

package network;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import thread.threadMain;

public class TCPIPMulitiChatClient {

	public static void main(String[] args) {
	
		String serverIp = "192.168.0.32"; // localhost > 호스트자신의 주소
		
		//Socket연결
		try {
			Socket socket = new Socket(serverIp, 7777);
			
			// 메세지를 받는 스레드
			Thread receiver = new ClientReceiver(socket);
			
			// 메세지를 보내는 스레드
			Thread sender = new ClientSenderThread(socket, "포그바");
			
			sender.start();
			receiver.start();
			
		} catch (UnknownHostException e) {
	
			e.printStackTrace();
		} catch (IOException e) {	
			e.printStackTrace();
		}
		
	}

}

class ClientSenderThread extends Thread{
	
	
	// 보내기 스레드는 Socket, OutputStream, name도 필요하다.
	
	Socket socket;
	DataOutputStream out;
	String name;
	
	public ClientSenderThread(Socket s, String name) {
		this.socket = s;
		
		try {
			out = new DataOutputStream(s.getOutputStream());
			this.name = name;
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {

		 Scanner sc = new Scanner(System.in);
		 
			try {
				// 접속하면 이름을 서버에 전송 
				if(out != null) {
				out.writeUTF(name);
				}
				
				while(out!=null) {
					out.writeUTF("["+name+"]"+sc.nextLine());
					
			}
			}catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	

class ClientReceiver extends Thread {
	// 메세지를 받아서 콘솔에 출력
	// Socket, InputStream, 필요
	
	Socket socket;
	DataInputStream in;
	
	public ClientReceiver(Socket socket) {
		this.socket = socket;
	
		try {
			in = new DataInputStream(socket.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while (in != null){
			try {
				System.out.println(in.readUTF());
			} catch (IOException e) {

			}
		}
	}
	
	
}

URL (Uniform Resource Locator)

인터넷상의 파일이나 데이터베이스같은 자원에 대한 주소를 지정하는 방법이다.

 

URL클래스

자바에서는 URL 객체를 이용하여 URL의 주소를 나타낸다.

URL 객체를 생성하는 방법은 다음과 같다.

(URL이 잘못 지정되었을 경우에는 MalformedURLException 예외를 발생시킨다.)

 

URL java = new URL("http:javappo.tistory.com");

 

URL 클래스의 메소드

메소드 설명
getprotocol() URL 주소의 프로토콜을 반환한다
getAuthority() URL 주소의 권한 요소를 반환한다
getHost() URL 주소의 호스트 이름을 반환한다
getPort() URL 주소의 포트 번호를 반환한다
getPath() URL 주소의 경로 요소를 반환한다
getQuery() URL 주소의 쿼리 요소를 반환한다
getFile() URL 주소의 파일 이름을 반환한다
getRef() URL 주소의 참조 요소를 반환한다

 

URLConnection 클래스

URL 객체를 생성한 후에 URL 클래스의 OpenConnection() 메소드를 호출하면 URLConnection 객체를 반환한다.

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class memojang {

	public static void main(String[] args) {
		
		try {
			URL java = new URL("https://javappo.tistory.com/");
			URLConnection uc=java.openConnection();
			//url에 대한 새로운 URLConnection 객체/인스턴스를 생성한다.			
		} catch (MalformedURLException e) { // new URL() 실패
			e.printStackTrace();
		} catch (IOException e) {    // openConnection() 실패
			e.printStackTrace();
		}

}

}
멤버변수 설명
Protected URL url 이 연결이 통신하는 대상인 파일이나 객체를 가지고 있다
Protected boolean allowUserInteraction true로 설정되면 패스워드 대화상자같은 사용자와 상호작용을 허용한다.
Protected boolen connected 현재 연결의 상태를 가지고 있다.
Protected boolean doInput true로 설정되면 이 URL이 입력을 위하여 사용됨을 의미한다.
Protected bollen doOutput true이 설정되면 이 URL이 출력을 위하여 사용됨을 의미한다.

생성자와 메소드

Protected URLconnection(URL url) url에 대한 새로운 URLConnection 객체를 생성한다
Protected abstract void connect() url에 대한 연결을 시도한다

 

 

URLConnection을 이용한 읽기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class UTLconnectionTest {

	public static void main(String[] args) {

		
		try {
			// url 인스턴스 생성
			String urlpath = "http://www.ctware.net";
			URL url = new URL(urlpath);
			
			// urlconnection 인스턴스
			URLConnection conn = url.openConnection();
			
			// 연결된 파일(자원)을 읽을 스트림 생성
			BufferedReader in = null;
			
			// URLConnection 인스턴스에서 InputStream을 얻을 수 있다.
			InputStream is = conn.getInputStream(); 
			
			Reader reader = new InputStreamReader(is);
			
			in = new BufferedReader(reader);
			
			// 한줄씩 읽어올 임시 변수
			String str=null;
			
			while(true) {
				str=in.readLine();
				System.out.println(str);
				if(str==null) {
					break;
				}
			}
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}
<출력>

<html>
<head>
</head>
<body>
<center>
<h1>DOTHOME WEB SERVER : <?php echo $_SERVER["HTTP_HOST"]?></h1>
<hr/>
<p>Copyright 2016~ DOTHOME.CO.KR</p>
</center>
</body>
</html>
null

쓰레드


– 자바에서 스레드를 사용하는 이유는 비동기적 작동 방식(독립스레드)에 대한 개념이 없음
 • 프로그래밍 방식이 자바에서는 사용이 가능하지 않음
 • 비동기적 작동 방식 구현 : ‘스레딩 기술의 사용 방법’ 숙지
– 자바가 실행되는 기반인 자바가상머신(Java virtual machine, 이하 JVM) 자체가 하나의 프로세스임
 • 언어적 차원 : 스레드의 동기화 지원 가능
 • 다중 스레드 프로그램을 쉽고 명료하게 만들 수 있음

 

다중 쓰레드

– 시분할 기법(Time-Shared)
• 멀티태스킹 및 멀티스레드를 가능하게 하는 기법
• 아주 짧은 시간 간격을 두고 여러 개의 프로그램을 전환하면서 실행
• 빠른 속도 때문에 두 개 이상의 프로그램이 동시에 실행되는 것처럼 느껴짐
• 프로그램의 실행을 전환하는 것은 OS가 담당함


– 다중 스레드의 이점
• 자원을 효율적으로 사용할 수 있음
• 사용자에 대한 응답성이 향상됨
• 작업이 분리되어 코드가 간결함


– 다중 스레드의 단점
• 동기화에 주의해야 함
• 교착상태가 발생하지 않도록 주의해야 함
• 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 함

 

–다중 스레드의 사용 예

• 스마트폰 게임
 – 메인스레드 : 게임을 하기 위한 UI부분을 그려줌
 – 그래픽 부분 담당 코드 : 순차적으로 실행, UI를 그리는 서버통신을 담당하는 소켓부분을 방치하는 수 밖에 없음.
 – 통신을 담당하는 스레드를 따로 하나를 두어 일정한 시간단위로 체크할 수 있도록 해야 함.


• 영상통신

– 영상을 받아 화면에 출력해 주는 코드와 영상을 생성하여 보내주는 코드를 만드는 경우 

   > 적어도 2개의 작업이 동시에 일어난다는 것을 알 수 있음
– 두 가지 이상의 일을 구현하기 위해 다중 스레드를 사용함

 

 


< 스레드 사용 방법 >

예제 extends Thread

package thread;

// 쓰레드 클래스의 정의는 thread클래스를 상속해서 정의
public class showThread extends Thread {

	String threadName;
	
	public showThread(String name) {
		this.threadName=name;
	}
	
	@Override
	public void run() {
		
		for(int i=0; i<100; i++) {
			System.out.println("안녕하세요" + threadName + "입니다.");
			try {
				// object클래스의 sleep() 메서드 : 현재 스레드를 1/1000초 간격으로 멈춤
				sleep(100);// 100/1000초 > 1/10초 

			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
			
		} System.out.println(threadName + " 종료 ★");
	}

}
package thread;

public class threadMain {

	public static void main(String[] args) {

		
		// Thread 생성
		
		showThread st1 =new showThread("1번 스레드");
		showThread st2 =new showThread("2번 스레드");
		
		st1.start();
		st2.start();
	
		
		for(int i=0; i<100; i++) {
			System.out.println("메인스레드");
		}
		
		System.out.println("★끝★");
	}

}

< 출력 >

main스레드에 Thread.sleep(100)을 똑같이 넣어주면 셋이 번갈아서 실행됨

 


예제 implements Runnable

package thread;

// 쓰레드 클래스 정의할 때 상속이 필요한 경우 Runnable 인터페이스를 구현해서 스레드를 생성할 수 있다.
public class ShowRunnable implements Runnable {

	
	public void run() {
		for(int i=0; i<100; i++) {
			System.out.println("러너블스레드");
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}
		
		System.out.println("★끝★");
	}

}
package thread;

public class threadMain2 {

	public static void main(String[] args) {

				
		// Runnable 인터페이스를 이용한 스레드
		Runnable target = new ShowRunnable();
		Thread st3 = new Thread(target);
		
		st3.start();
		
	
		
		for(int i=0; i<100; i++) {
			System.out.println("메인스레드");
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}
		
		System.out.println("★끝★");
	}

}

<출력 / 100개 반복>


스레드 우선순위 설정

		// 우선순위 설정 1-10 : 기본5
		st1.setPriority(Thread.MAX_PRIORITY);
		st2.setPriority(Thread.MIN_PRIORITY);

<출력> ~ 속도가 빨라서 별차이가 없지만 방법은 ARADUZA ~


t1.join(); // t1 스레드가 종료될때까지 다른 스레드는 멈춘상태

예제)

package thread;

public class Sum {
	
	int num;
	
	Sum(){
		num=0;
	}
	
	void addNum(int n) {
		num+=n;
	}
	
	int getNum() {
		return num;
	}

	public void run() {
		// TODO Auto-generated method stub
		
	}

}
package thread;

public class Adderthread extends Sum implements Runnable  {
	
	int start;
	int end;
	
	Adderthread(int n1, int n2){
		start=n1;
		end=n2;
	}

	@Override
	public void run() {
		for(int i=start; i<=end;i++) {
			addNum(i);
		}
	}
}
package thread;

public class AdderThreadMain {

	public static void main(String[] args) {
		
		Adderthread at1 = new Adderthread(1, 500000);
		Adderthread at2 = new Adderthread(500000, 1000000);
		
		// 쓰래드 생성
		Thread t1 = new Thread(at1);
		Thread t2 = new Thread(at2);
		
		t1.start();
		t2.start();
		
		try {
			t1.join(); // t1 쓰래드가 종료될 때 까지 다른 쓰래드는 멈춤상태
			t2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("1~100 합은 : " + (at1.getNum()+at2.getNum()) );
		

	}

}

<출력>

1~100 합은 : 1784793664


멀티스레드 예제

package thread;

import javax.swing.JOptionPane;

public class ThreadTestMain1 {

	// 다른 스레드에서도 참조가 가능한 클래스 변수 
	public static boolean check = false; // 10초 지나면 꺼지게하려고 만듦 (안에서사용하려고)
	
	public static void main(String[] args) {

//		String age= JOptionPane.showInputDialog("나이를 입력해주세요");		
//		int ageNumber=Integer.parseInt(age);		
//		System.out.println("저의 나이는 " + age + "세 입니다.");		
//		for(int i=10; i>0; i--) {
//			System.out.println(i);
//			try {
//				Thread.sleep(1000);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//		}                       // 나이쓰는 창뜨고 > 숫자셈
		
		InputAgeThread iat= new InputAgeThread();
		CountDownThread cdt=new CountDownThread();
		
		iat.start();
		cdt.start();
	}

}

class InputAgeThread extends Thread{

	@Override
	public void run() {
		System.out.println("10초 안에 입력하세요.");
		String age= JOptionPane.showInputDialog("나이를 입력해주세요");
		System.out.println("저의 나이는 " + age + "세 입니다.");
		ThreadTestMain1.check=true;
		
	}
	

	

}

class CountDownThread extends Thread {

	@Override
	public void run() {
		for(int i=10; i>0; i--) {
			if(ThreadTestMain1.check) {
				break;                    // 입력되면 숫자세기 STOP
			}
			System.out.println(i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.exit(0);
	}
	
	
}

'


스레드 동기화

 

Note that this implementation is not synchronized
API 문서에는 해당 클래스의 인스턴스가 둘 이상의 쓰레드가 동시에 접근을 해도 문제가 발생하지 않는지를 명시하고 있다.  따라서 쓰레드 기반의 프로그래밍을 한다면, 특정 클래스의 사용에 앞서 쓰레드에 안전한지를 확인 해야 한다.

ex) String buffer / builder

 

쓰레드의 동기화 - synchronized
- 한 번에 하나의 쓰레드만 객체에 접근할 수 있도록 객체에 락(lock)을 걸어서 데이터의 일관성을 유지하는 것.

 

아래 예제)

Sum 클래스의 Void addNum에  synchronized가 없으면 동기화가 되지 않아서 매번 값이 다르다..

그러나 엄청난 성능의 감소를 동반한다.

package thread;

public class Sum {
	
	int num;
	
	Sum(){
		num=0;
	}
	
	// 동기화~!
	synchronized void addNum(int n) {
		num+=n;
	}
	
	int getNum() {
		return num;
	}

	public void run() {
		// TODO Auto-generated method stub
		
	}

}
package thread;

public class AdderThread1 extends Thread {

	Sum sum;
	int start;
	int end;

	public AdderThread1(Sum sum, int start, int end) {
		this.sum = sum;
		this.start = start;
		this.end = end;
	}

	@Override
	public void run() {
		for (int i = start; i <= end; i++) {
			sum.addNum(i);
		}

	}

}
package thread;

public class AdderThreadhMain2 {

	public static void main(String[] args) {

		Sum sum = new Sum();
		AdderThread1 t1 = new AdderThread1(sum, 1, 5000);
		AdderThread1 t2 = new AdderThread1(sum, 5001, 10000);
		
		t1.start();
		t2.start();
		
		try {
			t1.join();
			t2.join();			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("1-100합 "+ sum.getNum());
	}

}

 

<출력>

1-100합 50005000

 

동기화블럭

public class Calculator {

	int opplCnt=0; // 몇번의 연산을 했나요?
	int opmiCnt=0;
	
	
	public int add(int n1, int n2) {
		synchronized (this) { // key
			opplCnt++;			
		}
//		opCnt++;	
		return n1+n2;
	}
	
	
	public int min(int n1, int n2) {
		synchronized (obj) { // 참조값이 달라서 다르다.
			opmiCnt++;
		}
//		opCnt++;
		return n1-n2;
	}
	
	Object obj = new Object(); // 새로운 동기화 키 생성
}

만약 opplCnt / opmiCnt가 아니라 똑같이 opCnt++;를 사용하면 똑같이 this(둘다같은거면OK)를 넣으면 된다

 

num1도 쓰고 num2도 쓰기 위해(효율성) 두개의 Key로 분리해 주는 것이라고 생각하면 되는듯하다.

 

– 버퍼 스트림 
•문자 입력 스트림으로부터 문자를 읽어 들이거나

문자 출력 스트림으로 문자를 내보낼 때 버퍼링을 함으로써 

   문자, 문자 배열, 문자열 라인 등을 보다 효율적으로 처리

 

예제1)

 

 

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteFileCopy {

	public static void main(String[] args) throws IOException {

		// 읽어올 대상 파일의 InputStream 인스턴스를 생성한다.

		InputStream in = new FileInputStream("org.pdf");

		// 출력 대상 파일의 OutpurStream 인스턴스 생성

		OutputStream out = new FileOutputStream("org_copy.pdf");

		// 필터스트림 인스턴스 생성
		BufferedInputStream bin = new BufferedInputStream(in, 1024 * 3);
		BufferedOutputStream bout = new BufferedOutputStream(out, 1024 * 3);

		int copyByte = 0; // 복사한 사이즈
		int bData = 0; // 원본에서 복사한 byte 사이즈의 데이터

		System.out.println("복사를 시작합니다.");

		while (true) {
			bData = in.read(); // 더이상 가져올 데이터가 없으면 -1을 반환

			if (bData == -1) {

				break;
			}
			out.write(bData); // 출력 : 파일에 바이터리 코드를 쓴다.
			copyByte++;
		}

		in.close(); // 스트림 인스턴스 소멸
		out.close();
		System.out.println("복사가 완료되었습니다.");
		System.out.println("복사된 사이즈 : " + copyByte + "byte");
	}
}

 

 

예제2)

 

 

package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class BufferedByteFileCopy {

	public static void main(String[] args) throws IOException  {

		
		// 읽어올 대상 파일의 InputStream 인스턴스를 생성한다.

			InputStream in = new FileInputStream("org.pdf");
			
		// 출력 대상 파일의 OutpurStream 인스턴스 생성
			
			OutputStream out = new FileOutputStream("org_copy.pdf");

		int copyByte=0; // 복사한 사이즈
		
		byte[] buf = new byte[1024]; // 1kb 버퍼생성
		int readLength = 0; // 얼마만큼 읽어왔는지.
		
		System.out.println("복사를 시작합니다.");
		
		while(true) {

			readLength = in.read(buf);
			
			if(readLength==-1) { 
				break;
			}

			out.write(buf,0,readLength);
			copyByte+= readLength;
		}
		
		in.close(); // 스트림 인스턴스 소멸
		out.close(); 
		System.out.println("복사가 완료되었습니다.");
		System.out.println("복사된 사이즈 : " + copyByte + "byte");
}
}
package io;

import java.io.File;

public class FileMove {

	public static void main(String[] args) {

		// File 클래스는 경로를 저장한다.
		// 파일의 경로, 폴더의 경로
		// 파일 또는 폴더의 속성을 변경하거나 삭제, 생성이 가능하다.
		
		// 현재 존재하는 파일의 경로를 생성
		File myFile = new File("C:"+File.separator+"myJava\\my.bin");
		
//		myFile.delete();
		
		if(!myFile.exists()) {
			System.out.println("원본 파일이 준비되어 있지 않습니다.");
			System.out.println("프로그램을 종료합니다.");
			return;
		}
		System.out.println("파일 존재");
		
		File reDir = new File("c:\\yourJava");
		reDir.mkdir(); // 해당 경로에 폴더가 있으면 그대로 유지, 없으면 생성
		System.out.println("폴더 생성 성공");
		
		//파일을 이동할 새로운 경로 생성
		File refile = new File(reDir, "Your.bin");
		System.out.println("파일 존재 유무 : " + refile.exists());
		
		//파일 이동
		myFile.renameTo(refile);
		
		if(refile.exists()) {
			System.out.println("파일 이동 성공");
		}
		
		
	}

}

예제1)

package io;

import java.io.Serializable;

public class Circle implements Serializable{
	
	//implements Serializable : 직렬화의 대상이다. 인스턴스 저장이 가능하다.
	// 직렬화를 하기 위해서는 반드시 해줘야함..
	
	int x;
	int y;
	double rad;
	
	public Circle(int x, int y, double r) {
		this.x=x;
		this.y=y;
		this.rad=r;
	}
	

	public void showCircleInfo() {
		System.out.printf("[%d,%d]", x,y);
		System.out.println("rad : " +  rad);
		
	}

}
package io;

import java.io.Serializable;

public class Circle2 implements Serializable {

	// implements Serializable : 직렬화의 대상이다. 인스턴스 저장이 가능하다.
	// 직렬화를 하기 위해서는 반드시 해줘야함..

	// transient Point p; 직렬화대상에서 제외
	Point p;
	double rad;

	public Circle2(int x, int y, double r) {
		p = new Point(x, y);
		this.rad = r;
	}

	public void showCircleInfo() {
		System.out.println("rad : " + rad);

	}

}
package io;

import java.io.Serializable;

public class Point implements Serializable {

	int x;
	int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;

	}

}
package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectSerializable {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		
		// 인스턴스 저장을 위한 스트림 생성
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("Object.ser"));
		
		// 인스턴스를 저장
		out.writeObject(new Circle(1,1,2.4));
		out.writeObject(new Circle(2,2,4.8));
		out.writeObject(new String("String class implements Serializable"));
		// String 클래스도 직렬화 가능
		out.writeObject(new Circle2(3,3,6.9));
		
		out.close(); // 저장~!
		
		// 인스턴스 복원
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("Object.ser"));
		
		
//		Circle c1 = (Circle) in.readObject(); // 형변환
		Object o1 = in.readObject();
		Circle c1 =null;
		if(o1 instanceof Circle) {
			c1 = (Circle)o1;
		}
		
		
		Circle c2 = (Circle) in.readObject();
		String str= (String) in.readObject();
		
		Object o2 = in.readObject();
		Circle2 c3=null;
		
		if(o2 instanceof Circle2) {
			c3= (Circle2)o2;
		}
		
		// 복원된 인스턴스 출력
		
		c1.showCircleInfo();
		c2.showCircleInfo();
		System.out.println(str);
		c3.showCircleInfo();
		
		
	}
}

예제2)

 

package io;

import java.beans.Transient;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class PersonInfo implements Serializable {

	String name;
	transient String secretInfo;
	int age;
	transient int secretNum;

	public PersonInfo(String name, String secretInfo, int age, int secretNum) {
		this.name = name;
		this.secretInfo = secretInfo;
		this.age = age;
		this.secretNum = secretNum;
	}

	public void showInfo() {
		System.out.println("name : " + name);
		System.out.println("secretInfo : " + secretInfo);
		System.out.println("age : " + age);
		System.out.println("secretNum : " + secretNum);

	}

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		// 인스턴스 저장 스트림 생성
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("PersonInfo.ser"));

		PersonInfo info = new PersonInfo("김태형", "뽀선이애인", 24, 1);
		info.showInfo();

		// 인스턴스 저장
		out.writeObject(info);
		out.close();

		// 인스턴스 복원을 위한 스트림 생성
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("PersonInfo.ser"));

		// 복원
		PersonInfo reInfo = (PersonInfo) in.readObject();

		// 복원된 인스턴스의 정보 출력
		reInfo.showInfo();

	}

}

–문자 스트림 


•유니코드로 된 문자를 입·출력 하는 스트림 
•2바이트를 입·출력 - 세계 모든 언어로 구성된 파일을 입·출력 하기에 적합 
•이미지, 동영상과 같은 바이너리 데이터는 입·출력 할 수 없음 
•문자 데이터만 입·출력 가능 

 

 

 

Reader의 대표적인 메소드

public int read() throws IOException
public abstract int read(char[] cbuf, int off, int len) throws IOException

Writer의 대표적인 메소드

public int write(int c) throws IOException

public abstract void write(char[] cbuf, int off, int len) throws IOException 

 

 

BufferedWriter

package io;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class StringWriter {

	public static void main(String[] args) throws IOException {

		// 필터스트림 : 기본 스트림 writer가 필요하다.
		Writer writer = new FileWriter("String.txt");  // 기본스트림
		BufferedWriter out = new BufferedWriter(writer); // 필터스트림
		
		out.write("Cos ah ah I’m in the stars tonight");
		out.newLine();
		out.write("So watch me bring the fire and set the night alight");
		out.newLine();
		out.write("Shining through the city with a little funk and soul");
		out.newLine();
		out.write("So I’mma light it up like dynamite, woah");
		out.newLine();
		out.newLine();
		out.write("BTS - Dynamite");
		
		// 스트림닫기
		out.close();
		
	}

}

BufferedReader

package io;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.BufferedReader;

public class StringReader {

	public static void main(String[] args) throws IOException{
		
	
	// 문자 기반 기본 스트림 인스턴스 생성
	Reader reader = new FileReader("String.txt");
	// 필터스트림
	BufferedReader in = new BufferedReader(reader);
	
	// 한행의 문자열을 담을 변수
	
	String str=null;
	while(true) {
		//한줄씩 읽어 문자열을 반환, 없으면 null
		str=in.readLine();
		if(str==null) {
		break;
	}
		System.out.println(str);
	
	}
}
}

 

문자 필터 스트림 PrintWriter

package io;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterStream {

	public static void main(String[] args) throws IOException {

		PrintWriter out = new PrintWriter(new FileWriter("Print.txt"));
		
		out.printf("안녕하세요 저는 %d살 %s입니다.",12,"철수");
		out.println();
		out.print("저는 자바를 좋아합니다");
		out.println("IO 재미있네요.");
		out.close();
		
		System.out.println("파일작성 완료");
	}

}

'JAVA > basic' 카테고리의 다른 글

[ 입출력 ] 버퍼 스트림  (0) 2020.10.26
[ 입출력 ] File  (0) 2020.10.26
[ 입출력 ] 직렬화 (Serializable)  (0) 2020.10.26
[ 입출력 ] Stream / 바이트스트림  (0) 2020.10.26
Map <K, V> / HashMap <K, V> key-value  (0) 2020.10.23
[ 컬렉션 Collection<E> ] TreeSet  (0) 2020.10.23
[ 컬렉션 Collection<E> ] HashSet  (0) 2020.10.23

스트림(stream)이란?
- 데이터를 운반(입출력)하는데 사용되는 연결통로
- 연속적인 데이터의 흐름을 물(stream)에 비유해서 붙여진 이름
- 하나의 스트림으로 입출력을 동시에 수행할 수 없다.(단방향 통신)
- 입출력을 동시에 수행하려면, 2개의 스트림이 필요하다.

 

•자바의 스트림
–입·출력 장치와 프로그램을 연결하며, 이들 사이의 데이터 흐름을 처리하는 소프트웨어 모듈
–데이터를 처리하기 위한 공통된 방법을 제공함
–입력 스트림 : 입력 장치로부터 자바 프로그램으로 전달되는 데이터의 흐름 혹은 데이터 전송 소프트웨어 모듈
–출력 스트림 : 자바 프로그램에서 출력 장치로 보내는 데이터의 흐름 또는 데이터 전송 소프트웨어 모듈

 

자바 입·출력 스트림의 특징
–스트림은 FIFO 구조
• FIFO : 먼저 들어간 것이 먼저 나오는 형태 → 데이터의 순서가 바뀌지 않음
–스트림은 단방향
• 읽기, 쓰기가 동시에 되지 않음
• 읽는 스트림과 쓰는 스트림을 하나씩 열어 사용해야 함
–스트림은 지연될 수 있음
• 스트림은 넣어진 데이터가 처리되기 전까지는 스트림에 사용되는 스레드가 지연상태에 빠짐
• 네트워크 내에서는 데이터가 모두 전송되기 전까지 네트워크 스레드는 지연상태를 유지함

•InputStream 클래스의 대표적인 두 메소드

  public abstract int read() throws IOException

  public void close() throws IOException

 

•OutputStream 클래스의 대표적인 메소드

 public abstract void write(int b) throws IOException

 public void close() throws IOException

 

자바 입·출력 스트림의 종류


–바이트 스트림


•문자 단위/바이트 단위
•바이트 스트림은 1바이트를 입·출력 할 수 있는 스트림
•자바에서 입·출력 스트림을 통해 흘러가는 데이터의 기본 단위
•일반적으로 바이트로 구성된 파일을 처리하기에 적합

 

•바이트 스트림 클래스
–JAVA . IO 패키지 포함
–InputStream/OutputStream

 >추상 클래스로써 바이트 입·출력 스트림을 다루는 모든 클래스의 슈퍼 클래스
–FileInputStream/FileOutputStream 

 >파일로 부터 바이트 단위로 읽거나 저장하는 클래스

 >바이너리 파일을 입·출력을 할 때 사용

 

 

package io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteFileCopy {

	public static void main(String[] args) throws IOException  {

		
		// 읽어올 대상 파일의 InputStream 인스턴스를 생성한다.

			InputStream in = new FileInputStream("org.pdf");
			
		// 출력 대상 파일의 OutpurStream 인스턴스 생성
			
			OutputStream out = new FileOutputStream("org_copy.pdf");

			
		// 필터스트림 인스턴스 생성
		BufferedInputStream bin = new BufferedInputStream(in, 1024*3);
		BufferedOutputStream bout = new BufferedOutputStream(out, 1024*3);
		
		int copyByte=0; // 복사한 사이즈
		int bData=0; // 원본에서 복사한 byte 사이즈의 데이터
		
//		byte[] buf = new byte[1024]; // 1kb 버퍼생성
//		int readLength = 0; // 얼마만큼 읽어왔는지.
		
		System.out.println("복사를 시작합니다.");
		
		while(true) {
			bData = in.read(); // 더이상 가져올 데이터가 없으면 -1을 반환
//			readLength = in.read(buf);
			
			if(bData==-1) { 
//			if(readLength==-1) { 
				break;
			}
			out.write(bData); // 출력 : 파일에 바이터리 코드를 쓴다.
//			out.write(buf,0,readLength);
//			copyByte+= readLength;
			copyByte++;
		}
		
		in.close(); // 스트림 인스턴스 소멸
		out.close(); 
		System.out.println("복사가 완료되었습니다.");
		System.out.println("복사된 사이즈 : " + copyByte + "byte");
}
}

 

public int compareTo(String anotherString)

2개의 문자열을 비교하여(A coomparTo B) 같으면 0, A가 B보다 크면 양수, 적으면음수를 반환

맨 첫자리부터 차례대로 비교한다.

 

 (역주: "A"는 feff0041, "B"는 feff0042)
 비교는 스트링내의 각각의 문자의 Unicode 값에 근거해 행해집니다.
 String 객체에 의해 나타내지는 문자열이, 인자로 전달 받은 스트링의 문자열과 사전적으로 비교됩니다.
 String 객체가 사전적으로, 전달받은 스트링보다 전에 있는 경우는, 결과는 음의 정수가 됩니다.

 

equals(Object) 메소드가 true 를 돌려줄 때, compareTo 는 0 을 돌려줍니다.

"사전적의 순서"의 정의는 다음과 같습니다.
2 개의 스트링이 다르다고 한다면,
서로 다른 문자가 문자열 중에 있거나,
2 개의 스트링의 길이가 다르거나,
혹은 그 두 경우 다 해당되는 상황입니다.

 

만일 하나 또는 그 이상의 위치 (index) 에서 문자가 서로 다를 때,
index 중 가장 작은 숫자를 k 라고 가정합니다.
k 위치에 있는 두 문자를 < 연산자 로 비교하면, 두 문자중 하나는 다른 문자보다 작습니다.
이 문자를 가진 문자열을 사전적으로 (역주: "A"가 "B"보다 앞에 있는것 처럼) 앞에 있다고 합니다.
이 경우, compareTo 는 2 개의 스트링에서 위치 k 에 있는 2 개의 문자의 값의 차이를 돌려줍니다.
식으로 표현하면 다음과 같습니다.

this.charAt(k) - anotherString.charAt(k)

 


유효한 모든 인덱스 위치에 있어서의 문자가 같은 경우는, 짧은 길이의 스트링이 사전적으로 앞이 됩니다.
이 경우 compareTo 는 스트링의 길이의 차이를 돌려줍니다. 식으로 표현하면 다음과 같습니다.

 * this.length() - anotherString.length()

정의: compareTo in interface Comparable<string></string>
파라미터: 'anotherString - 비교 대상의 String'
반환값
인수 스트링이 스트링과 동일한 경우는 0.
스트링이 주어진 스트링보다 사전식에서 작은 경우는 음수.
주어진 스트링보다 스트링이 사전식에서 큰 경우는 양수.
 

 

package Chapter15_Overriding;
 
public class CompareTo {
 
    public static void main(String[] args) {
       
        String a = "ABC";
        String b = "ABC";
        String c = "BCD";
        String d = "ABCDEF";
       
        System.out.println(a.compareTo(b));
        //출력결과  : 0
       
        System.out.println(a.compareTo(c));
        //출력결과 : -1
       
        System.out.println(a.compareTo(d));
        //출력결과 : -3
       
    }
 
}
 
package Collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class HashMapTest {

	public static void main(String[] args) {

		// Map : key-Value 형식으로 저장하는 객체
		// 대표적인 형식이 HashMap이다. HashMap<K, V>
		HashMap<Integer, String> map = new HashMap<Integer, String>();

		// 요소 추가 : put(T e)
		map.put(1, "김남준");
		map.put(2, "김석진");
		map.put(3, "민윤기");
		map.put(4, "정호석");
		map.put(5, "박지민");
		map.put(6, "김태형");
		map.put(7, "전정국");

		// 참조 : V get(K key)
		// put에서는 반복하는 Iterator가 없다
		// 그냥 하나 딱 뽑아쓰려고할 때 유용한 느낌

		System.out.println("1번 " + map.get(1));
		System.out.println("2번 " + map.get(2));
		System.out.println("3번 " + map.get(3));
		System.out.println("4번 " + map.get(4));
		System.out.println("5번 " + map.get(5));
		System.out.println("6번 " + map.get(6));
		System.out.println("7번 " + map.get(7));

		for (int i = 1; i < map.size(); i++) {
			System.out.print(map.get(i) + "\t");
		}

		// Set<Key Type>
		Set<Integer> set = map.keySet();
		Iterator<Integer> itr = set.iterator();
		
        System.out.println();
		while (itr.hasNext()) {
			int key = itr.next();
			System.out.println(key + "번 학생의 이름은 " + map.get(key));
		}

	}

}

<출력>

 

1번 김남준
2번 김석진
3번 민윤기
4번 정호석
5번 박지민
6번 김태형
7번 전정국
김남준 김석진 민윤기 정호석 박지민 김태형

1번 학생의 이름은 김남준
2번 학생의 이름은 김석진
3번 학생의 이름은 민윤기
4번 학생의 이름은 정호석
5번 학생의 이름은 박지민
6번 학생의 이름은 김태형
7번 학생의 이름은 전정국

 

 

<NavigableSet  / TreeMap에서만 사용가능>

- descendingInterator// Key값 내림차순 정렬

import java.util.Iterator;
import java.util.NavigableSet;
import java.util.TreeMap;

public class HashMapTest {

	public static void main(String[] args) {

		// Map : key-Value 형식으로 저장하는 객체
		// 대표적인 형식이 HashMap이다. HashMap<K, V>
		TreeMap<Integer, String> map = new TreeMap<Integer, String>();

		// 요소 추가 : put(T e)
		map.put(1, "김남준");
		map.put(2, "김석진");
		map.put(3, "민윤기");
		map.put(4, "정호석");
		map.put(5, "박지민");
		map.put(6, "김태형");
		map.put(7, "전정국");

		// NavigableSet<Key Type>
		NavigableSet<Integer> set = map.navigableKeySet();
		
		System.out.println("오름차순 출력...");
		Iterator<Integer> itr = set.iterator();
		while (itr.hasNext())
			System.out.println(map.get(itr.next()));

		System.out.println("내림차순 출력...");
		itr = set.descendingIterator(); // 내림차순 정렬
		while (itr.hasNext())
			System.out.println(map.get(itr.next()));
	}

}

< 출력 >

 

오름차순 출력...
김남준
김석진
민윤기
정호석
박지민
김태형
전정국


내림차순 출력...
전정국
김태형
박지민
정호석
민윤기
김석진
김남준

 

+ Recent posts