유디의 공간정보·개발일기
6. 0816_파일 입출력 본문
[복습]
서블릿이란
- 서버측의 작은 프로그램
- 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가 생성된 것과
입력한 내용이 파일 안에 들어가 있는 것을 확인할 수 있다.
<<데이터를 기준 문자로 나눠서 가공하기>>
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 : Samsung : 1100000";
[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 |