유디의 공간정보·개발일기

6. 0816_파일 입출력 본문

JSP & Servlet

6. 0816_파일 입출력

55yudi 2021. 8. 16. 22:30

[복습]

 

서블릿이란
- 서버측의 작은 프로그램
- URL 매핑(web.xml)을 통해 요청하고 실행
- 서블릿도 하나의 자바클래스 - HttpServlet의 하위 클래스

 


- 서버에서 요청을 받으면 뭐하나?
  * 응답을 한다
  * Html을 요청했다면 그걸 응답하고 없으면 404로 응답한다.

  * Jsp를 요청했다면 (동적 페이지)
   : 내부적으로 java파일로 변환되고 변환된 자바파일에서의 메서드가 실행된다.
   : 클라이언트가 전송한 데이터 추출
      --> request 내장객체의 getParameter를 사용해서!

 

* jstl 장점

  - 이해하기 쉽다, 수정하기 편리하다.

 

예시코드

	<c:forEach var="vo" items = "${list}">
		id: ${vo.empId}, last_name:${vo.lastName} <br/><!-- 내부적으로 getEmpId(getter)라는 메서드 실행 -->
	</c:forEach>

파일 입출력 (ch.13)

사용자가                  화면으로 출력
키보드나                  파일로 저장
마우스로
Input ------> ㅁ ------> Output
read  ------> ㅁ ------> write
             변수, 호출

 

<<파일로 입력하고 출력해보기, 파일 경로 나타내기>>

package myweb4;

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

public class FilIOTest {
	public static void main(String[] args) throws Exception {
//		String dir = System.getProperty("user.dir"); //실행하면 위치를 알려줌
//		System.out.println(dir);
		
		File file = new File("list.txt");
		Reader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr); //버퍼를 이용한 입력
		//컴파일 오류 생김 -> 예외처리가 필요하다 -> 왜? 생성자에 예외처리가 정의돼있기 때문에 예외처리를 해야한다.
		String line = br.readLine();
		while(line != null) {
			System.out.println(line);//s-22:Samsung:1100000 <-- 프로그램에서는 이걸 하나의 문자열로 인식
			line = br.readLine();
		}		
	}
}

- list.txt new file생성해서 파일에 있는 데이터를 읽어오고 가져오기
   * FileReader()
   * BufferedReader(); - 버퍼를 이용한 입력
   * .readLine() - 데이터를 줄마다 읽어오기 ( 모든 줄의 데이터를 읽어 오려면  while문 사용하기)

 

 

<<입력한 문자를 파일로 저장하기, 엔터를 칠 때(null값) 반복문 탈출>>

package myweb4;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class FileIOTest2 {

	public static void main(String[] args) throws Exception {
		//사용자가 입력한 문자열을 파일로 저장하려 함
		//그냥 엔터를 칠 때까지 계속하여 입력한 내용을 저장함
        
        	//""안의 파일명으로 파일 생성해서 저장하기
		PrintWriter out = new PrintWriter(new File("inputlist.txt"));
		
        	Scanner scan = new Scanner(System.in);
		System.out.print("문자열 입력: ");
		String line = scan.nextLine();//문자열 입력
		
		while(line != null && line.length() != 0) { //사용자가 계속 입력하게 해서 출력하기, 엔터치면 종료
//			System.out.println(line); <-- 필요없어짐
			out.println(line);
			System.out.print("문자열 입력: ");
			line = scan.nextLine();
		}
		System.out.println("프로그램을 종료합니다!"); //엔터를 치면 프로그램 종료
		out.close(); //이게 없으면 파일이 생성되지 않는다.
	}
}

- 파일로 저장해보기 : PrintWrite()
- out.close() 로 파일 생성 후 실행
- 콘솔창에 사용자가 데이터를 입력한 후

- 실행 후 프로젝트를 새로고침(refresh, F5)하면 Project Explorer에 inputlist.txt가 생성된 것과

  입력한 내용이 파일 안에 들어가 있는 것을 확인할 수 있다.

1. 콘솔창에서 데이터 입력하기
inputlist.txt 파일이 만들어지고 그 안에 입력했던 내용이 들어가 있음

 

 

<<데이터를 기준 문자로 나눠서 가공하기>>

package myweb4;

public class StringTest {

	public static void main(String[] args) {
		String str = "s-22:Samsung:1100000"; // 하나를 :마다 잘라서 개별로 보겠다 = 데이터 가공하기
		String[] info = str.split(":"); //split메서드 : ":"를 기준으로 데이터를 나눔 = 유틸리티
		System.out.println(info[0]);
	}
}

- .split() 사용, 배열에 저장해서 배열 번지로 추출

String str = "s-22 : Samsung1100000";
                  [0]          [1]        [2]

 


JSP에서 파일업로드 해보기 (교재 참고)


* MutipartRequest 클래스 (메서드 8가지가 제공)

<<fileupload-form.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>
	<form method="post" action="upload-action.jsp" enctype="multipart/form-data">
		<input type="file" name="myfile"><br>
		<input type="submit" value="파일전송">
	</form>
</body>
</html>

 

<<upload-action.jsp>>

* lib폴더에 cos.jar파일 넣음 <-- 라이브러리

 

 

<%@page import="java.io.FileReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ 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>upload-action.jsp</h1>
	<%
		//request내장객체를 이용하여 파일 저장 : 복잡해서 잘 안씀 --> 라이브러리를 사용한다.
		//com.oreilly.servlet  cos.jar를 사용하려고 한다.
//		FileUtil fu = new FileUtil();
//		fu.saveUploadFiles(request);
		
							//내장객체,현재디렉토리,버퍼사이즈,인코딩타입
		MultipartRequest mr = new MultipartRequest(request, ".", 1024*10, "utf-8", new DefaultFileRenamePolicy());
		Enumeration em = mr.getFileNames();//iterator(신식)=Enumeration(구식)
		while(em.hasMoreElements()) {
			String name = (String) em.nextElement(); //형변환 해줘야 함
			out.println("name = " + name); //myfile =>
			File file = mr.getFile(name);
			out.println(file.getName()); //사용자가 선택하고 입력한 것이 파일로 들어온다. 그 후에는 파일 입출력을 사용해서 화면에 보이게 하면 된다.
			out.println("original file name = " + mr.getOriginalFileName(name));
			
			BufferedReader br = new BufferedReader(new FileReader(file));//버퍼를 이용한 입력
			String line = br.readLine();//전송한 파일 안의 값을 가져온다.
			while(line != null) {
				out.println(line + "<br>");
				line = br.readLine();
			}
		}
		
	%>
</body>
</html>

 

* .getFileNames() 사용하기

 

* .getOriginalFileName() 사용하기, 파일의 내용을 출력하기

* 흐름 이해하기

 

 

<<FileIOTest3.java>>

package myweb4;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class FileIOTest3 {

	public static void main(String[] args) throws Exception {
		//image copy test
		File file = new File("cat.png");
//		System.out.println(file.exists());
		
		//input & output
		InputStream is = new FileInputStream(file);
		OutputStream os = new FileOutputStream("./src/main/webapp/mycat.png");//실제 저장될 파일의 이름으로 적기
		
		int input = is.read(); //int 타입으로 불러옴
		while(input != -1) {
			os.write(input);
			input = is.read();
		}
		os.close();
	}
}

--> 실행 후 새로고침 하면 프로젝트에 mycat.png가 생성되고, 콘솔창에 아무것도 안뜸(정상)

 


금요일 과제 확장 <<input.jsp, result.jsp>>
자바 스크립트가
  * 어디에서 실행돼? : 웹브라우저
  * 왜? : html5 태그는 문서의 뼈대와 내용을 형성
         : css3 는 스타일을 적용
- id를 부여하면 .getElementById("id이름")으로 그 객체를 찾을 수 있다

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>0813 금요일 과제_page1</title>
<style>
	table {
		border: 1px solid;
		width: 400px;
		height: 250px;
	}
	
	tr,td {
		border: 1px solid;
	}
	
</style>


</head>
<body>
	<table>
		<form action="result.jsp" id="frm">
			<tr>
				<td colspan="2">사번</td>
				<td colspan="2"><input type="text" name="inputEmpNo" id="empNo"></td>
			</tr>
			<tr>
				<td rowspan="3" colspan="1">과목</td>
				<td colspan="1">JAVA</td>
				<td colspan="2"><input type="text" name="inputJava" id="java"></td>
			</tr>
			<tr>
				<td>Database</td>
				<td colspan="2"><input type="text" name="inputDatabase" id="db"></td>
			</tr>
			<tr>
				<td>JSP</td>
				<td colspan="2"><input type="text" name="inputJSP" id="jsp"></td>
			</tr>
			<tr>
				<td colspan="4"><input type="button" id="mybtn" value="저장"></td>
			</tr>
		</form>
	</table>
	<script>
		//jquery + ajax
		//document DOM객체를 사용해서 어떤 이벤트의 핸들러를 등록할 수 있다.
		//클라이언트에서 체크해야할 것을 체크하고 서버로 넘겨야 할 것을 넘겨준다.
		//포인트가 비어있는 값을 체크해줌
		var mybtn = document.getElementById("mybtn"); //const, let도 가능함
		mybtn.addEventListener("click", handleClick);
		
		//클릭된 엘리먼트를 참조할 수 있도록 이벤트 객체를 매개변수로 넘겨준다.
		//여러개의 엘리먼트가 클릭되면 하나의 핸들러로 매핑할 수 있다.
		function handleClick() {
			window.alert('haha');//window객체가 갖고있는 alert함수 호출
								 //window객체? : 객체는 메서드와 변수(프로퍼티, 데이터)의 합
			var javaPoint = document.getElementById("java");
			var javaPoint = document.getElementById("db");
			if(!javaPoint.value || !dbPoint.value) { //빈값이면 false인데 반대 의미인 !를 넣어주어서 =>true가 된다!
				alert('자바포인트가 비어있습니다.');
				return false; //다른 페이지로 안넘어가기 위해서
			}
			var frm = document.getElementById("frm");
			frm.submit();
		}
	</script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>0813 금요일 과제_page2</title>
</head>
<body>
	<table border="1px" width="400px" height="250px">
		<form action="input.jsp" id="frm">
			<tr>
				<td colspan="2">사번</td>
				<td colspan="2">111</td>
			</tr>
			<tr>
				<td rowspan="3" colspan="1">과목</td>
				<td colspan="1">JAVA</td>
				<td colspan="2">100</td>
			</tr>
			<tr>
				<td colspan="1">Database</td>
				<td colspan="2">100</td>
			</tr>
			<tr>
				<td colspan="1">JSP</td>
				<td colspan="2">100</td>
			</tr>
			<tr>
				<td colspan="2">평균</td>
				<td colspan="2">100</td>
			</tr>
			<tr>
				<td colspan="4"><input type="submit" value="입력화면"></td>
			</tr>
		</form>
	</table>


</body>
</html>



- document DOM 객체

- 개발자도구에 디버깅하고 콘솔에 코드 입력


c.f. 자바스크립트와 자바와 다름

 

 

자바스크립트
- 이벤트를 다루기 위해
  * 클릭, 입력, 변경(select), 체크
- 함수 정의하기
  * Element(엘리먼트)를 참조할 수 있어야 한다.
     1) 하나는 DOM객체 -> DOM트리


     2) 정적구조에 대한 참조(-> 나중에 spring할 때 더 알아봄)

 

     3) window객체(링크 둘 중 아무거나)

         https://www.w3schools.com/jsref/obj_window.asp (1)

         https://developer.mozilla.org/ko/docs/Web/API/Window (2) ⇒ 우리가 했던건 alert()

 

     4) jQuery를 사용하면 정말 편함 (+Ajax)


- 이벤트 발생 시 함수가 실행되도록 설정

 


[정리]

 

jsp의 파일업로드 기능 구현하기
- 파일 입출력
   - 입력과 출력
     * BufferedReader & PrintWriter(Text file)
     * File
     * InputStream, OutputStream
      - Binary File(이미지, 실행파일, 음성, 비디오)
   - 라이브러리 사용함
     * com.oreilly.servlet
     * cos.jar파일 사용
   - API

     * String.split()

   - Java Script

 

<<js-test.html>> --> 자바와 자바스크립트의 다른 점

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

<script>
	//자바와 자바스크립트는 다음의 이유로 다르다.
	//함수 정의
	function myf() {
		
	}
	//매개변수를 줘도 되고 안줘도 된다.
	//함수 호출
	myf();
	myf(123, 456, 789); //자바는 컴파일조차 되지 않는다. 그러나 자바스크립트는 문제없이 잘 실행된다.
						//매개변수를 여러 개 줘도 괜찮다.
	
	function myf2(mymy) {
		mymy();
	}
	myf2(myf);//함수를 매개변수로 넘겨도 문제 없다.
	
</script>

</body>
</html>

'JSP & Servlet' 카테고리의 다른 글

8. 0818_팀플 2일차  (0) 2021.08.18
7. 0817_팀플 1일차  (0) 2021.08.17
[JSP] Session (세션) 객체 사용하여 값 저장하고 불러오기  (0) 2021.08.16
5. 0813_session, Collection, sql문 연동  (0) 2021.08.13
4. 0812_Servlet  (0) 2021.08.13