[SpringMVC] 20240126 [프로그램 소스]
SpringMVCStudy
FileSystemApp01
체크할 사항
Ⅰ. 웹 어플리케이션 루트를 통해 얻어낸 경로 = 실제 파일의 물리적 존재 경로
지금까지 eclips 를 통해 코드를 작성할 때마다, [Java Resources > src] 혹은 [WebContent] 에 파일을 생성했었다.
그런데, 여기에 곧바로 파일을 생성할 수 있는 것은
eclips 가 우리의 편의를 위해 파일 생성을 보다 편리하게 할 수 있도록 제공해 주는 기능일 뿐이고
실제 그 위치에 물리적인 원본 데이터가 저장되는 것이 아니다.
AppRoot.jsp [Scriptlet `<% ... %>`]
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// "/" 로 구분하여 현재 위치를 가져온다.
※ 웹 어플리케이션 루트
`C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp01\`
→ 어플리케이션 루트를 통해 확인한 위의 경로가, 파일이 존재하는 『실제 물리적 경로』인 것이다.
※ 생성한 파일 위치
`C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp01\data\test.txt`
Ⅱ. 파일 (`.txt`) 생성
[생성 - 공통부분]
실제 물리적 경로 얻어오기
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
① 파일을 쓰기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
② 파일이 존재할 디렉터리가 없는 경우라면, 파일이 위치할 곳까지의 디렉터리를 생성
// 상위 디렉터리가 존재하지 않을 경우
if ( !newFile.getParentFile().exists() )
{
// 파일이 위치할 곳까지의 디렉터리를 생성
newFile.getParentFile().mkdirs();
}
③-1 파일을 쓰기 위한 FileWriter 객체 생성
FileWriter fw = new FileWriter(newFile);
③-2 FileWriter 객체를 좀 더 편하게 사용하기 위해 PrintWriter 로 감싸줌
▶ PrintWriter 를 이용하여, File 안에 내용을 작성한다.
PrintWriter pw = new PrintWriter(fw);
⑤ 실질적으로 파일에 내용을 씀(기록)
pw.println("테스트이다...");
pw.println("확인해보자...");
[생성, 읽기 - 공통부분]
⑥ 리소스 반납 - ★반드시 객체를 생성한 순서의 역순으로 닫아주도록 한다.
// PrintWriter 리소스 반납(닫아줌)
pw.close();
// FileWriter 리소스 반납(닫아줌)
fw.close();
※ FileWrite.jsp - 총 소스
<%
/* FileWrite.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 1. 파일을 쓰기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
// 2. 파일이 존재할 디렉터리가 없는 경우라면...
if ( !newFile.getParentFile().exists() )
{
// 파일이 위치할 곳까지의 디렉터리를 생성
newFile.getParentFile().mkdirs();
//--> 경로에 빠져있는 부분들을 경로가 존재할 수 있도록
// 디렉터리를 만들어 달라. (make directory)
}
// 3. 파일을 쓰기 위한 FileWriter 객체 생성
// → 출력 스트림을 활용하여 파일에 내용을 기록
FileWriter fw = new FileWriter(newFile);
// 4. FileWriter 객체를 좀 더 편하게 사용하기 위해 PrintWriter 로 감싸줌
PrintWriter pw = new PrintWriter(fw);
// 5. 실질적으로 파일에 내용을 씀(기록)
pw.println("테스트이다...");
pw.println("확인해보자...");
// 6-1. PrintWriter 리소스 반납(닫아줌)
pw.close();
// 6-2. FileWriter 리소스 반납(닫아줌)
fw.close();
// 해당 경로의 디렉토리로 확인하는 것은 서버단에서 확인하는 것이다.
%>
→ `C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp02\`
경로에 실제로 접근해 보면
[data] 디렉토리 하위에 `test.txt` 메모장 파일이 새롭게 형성되어 있음을 확인할 수 있다.
또한, 이 메모장 내부에는 `PrintWriter` 객체로 기록했던 내용이 적혀져 있다.
실제 디렉토리 경로를 통해 메모장 내용을 확인하는 것은 서버단에서 파일을 확인하는 것이다.
이 파일을 실제로 클라이언트측에서 확인하도록 하려면 `FileReader` 객체와 `BufferedReader` 객체를 통해 읽어들여야 한다.
Ⅲ. 파일 (`.txt`) 읽어들이기
실제 물리적 경로 얻어오기
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
① 파일을 읽기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
② 파일이 존재하는지의 여부 확인
▶ 지정된 경로에 파일이 존재하는지의 여부를 확인하여
존재하는 경우에만 처리하여 `FileNotFoundException` 방지
if (newFile.exists())
{
....
③-1 파일을 읽기 위한 FileReader 객체 생성
FileReader fr = new FileReader(newFile);
③-2 FileReader 객체를 좀 더 편하게 사용하기 위해 BufferedReader 로 감싸기
BufferedReader br = new BufferedReader(fr);
④ 실질적으로 파일의 내용을 읽어냄
String readData;
while ( (readData=br.readLine()) != null ) // 라인별로 읽어들이는 기능 반복
{
out.println(readData + "<br>");
}
⑤ 리소스 반납
// BufferedReader 리소스 반납(닫아줌)
br.close();
// FileReader 리소스 반납(닫아줌)
fr.close();
※ FileRead.jsp - 총 소스
<%
/* FileRead.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 1. 파일을 읽기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
// 2. 파일이 존재하는지의 여부 확인
// → 지정된 경로에 파일이 존재하는지의 여부를 확인하여
// 존재하는 경우에만 처리하여 FileNotFoundException 방지
if (newFile.exists())
{
// 3-1. 파일을 읽기 위한 FileReader 객체 생성
FileReader fr = new FileReader(newFile);
// 3-2. FileReader 객체를 좀 더 편하게 사용하기 위해
// BufferedReader 로 감싸기
BufferedReader br = new BufferedReader(fr);
// *[Buffered : 임시 저장공간.]
// 4. 실질적으로 파일의 내용을 읽어냄
String readData;
while ( (readData=br.readLine()) != null ) // 라인별로 읽어들이는 기능 반복
{
out.println(readData + "<br>");
}
// 5-1. BufferedReader 리소스 반납(닫아줌)
br.close();
// 5-2. FileReader 리소스 반납(닫아줌)
fr.close();
}
else // 지정된 경로에 파일이 존재하지 않을 경우 처리
{
out.println("정상적으로 파일을 읽어들일 수 없습니다.");
}
%>
Ⅳ. Object 생성하여 (`~.ser`) 파일로 생성 [객체 직렬화]
실제 물리적 경로 얻어오기
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
① 파일 객체 생성
File newFile = new File(appRoot, "objData/data.ser");
② 파일이 존재하지 않을 경우 파일이 위치할 경로까지 디렉토리 생성
if ( !newFile.getParentFile().exists() )
{
newFile.getParentFile().mkdirs();
}
③ 파일에 넣기 위한 Hashtable 객체를 만들어 데이터에 포함시키기
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("key1", "사과");
h.put("key2", "수박");
④-1 파일을 내보내기 위한 스트림 구성
FileOutputStream fos = new FileOutputStream(newFile);
④-2 Object 를 파일에 기록하기 위해 ObjectOutputStream 객체 생성
▶ 생성한 객체로 FileOutputStream 객체 감싸기
ObjectOutputStream oos = new ObjectOutputStream(fos);
⑤ ObjectOutputStream 을 이용하여 파일에 Object 를 기록
oos.writeObject(h);
⑥ 리소스 반납
oos.close();
fos.close();
Ⅴ. `~.ser` 파일로 내보냈던 파일 읽기 [객체 역직렬화]
실제 물리적 경로 얻어오기
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
① 파일 객체 생성
File newFile = new File(appRoot, "objData/data.ser");
② 파일이 존재하는지 확인한 후 처리 [파일이 존재할 경우]
if ( newFile.exists() )
{
파일 존재
....
}
else
{
System.out.println("해당 파일이 존재하지 않습니다~!!!");
}
③-1 파일을 읽어들이기 위해 FileInputStream 객체 생성
FileInputStream fis = new FileInputStream(newFile);
③-2 파일에서 Object 를 읽어들이기 위해 ObjectInputStream 객체 생성
ObjectInputStream ois = new ObjectInputStream(fis);
④ ObjectInputStream 을 이용하여 파일로부터 Object 읽어오기
▶ 읽어온 Object 를 원래의 형(타입)으로 캐스팅
<%
...
// 파일로부터 Object 읽어오기 → Hashtable 형태로 다운캐스팅
Hashtable h = (Hashtable)ois.readObject();
// 리소스 반납
ois.close();
fis.close();
// Hashtable의 keys() 메소드로 Enumeration 반환받기
Enumeration e = h.keys();
while(e.hasMoreElements())
{
String key = (String)e.nextElement();
String value = (String)h.get(key);
%>
<%=key %> 의 값은 <%=value %> 입니다. <br>
<%
}
...
%>
※ ObjectRead.jsp - 총 소스
<%
/* ObjectRead.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 파일 객체 생성
File newFile = new File(appRoot, "objData/data.ser");
// 파일이 존재하는지 확인한 후 처리
if ( newFile.exists() )
{
// 파일을 읽어들이기 위해 FileInputStream 객체 생성
FileInputStream fis = new FileInputStream(newFile);
// 파일에서 Object 를 읽어들이기 위해 ObjectInputStream 객체 생성
ObjectInputStream ois = new ObjectInputStream(fis);
// ObjectInputStream 을 이용하여 파일로부터 Object 읽어오기
// 읽어온 Object 를 원래의 형(타입)으로 캐스팅
Hashtable h = (Hashtable)ois.readObject();
// 리소스 반납
ois.close();
fis.close();
Enumeration e = h.keys();
while(e.hasMoreElements())
{
String key = (String)e.nextElement();
String value = (String)h.get(key);
%>
<%=key %> 의 값은 <%=value %> 입니다. <br>
<%
}
}
else
{
out.println("해당 파일이 존재하지 않습니다~!!!");
}
// 아래 보여주기 위한 템플릿 모두 제거
%>
※ 발생했던 에러
ⅰ. Tomcat 서버 에러
에러 발생 원인
서버가 돌아가고있는 상태에서, 컨테이너에서 프로젝트를 제거해 버리고
다시 새로운 프로젝트를 적재하게 되면 문제가 발생한다.
에러 해결 방법
서버를 멈춘 후에 서버 안에 적재되어 있는 컨텐츠들을 (Tomcat directory)모두 `Clean` 하고,
다시 프로젝트를 올리게 되면 문제가 해결된다.
ⅱ. ~.ser 파일
에러 발생 원인
객체를 생성하여 `~.ser` 파일을 생성했을 때, 파일을 열어서 공백(`spacebar`)이나 다른 문자를 입력하거나
저장과 같은 (`ctrl`+`s`) 단축키를 사용하면 발생한다
에러 해결 방법
`~.ser` 파일을 다시 생성한다.
FileSystemApp01
실행 결과 스크린샷
WebContent
AppRoot.jsp
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// "/" 로 구분하여 현재 위치를 가져온다.
File newFile = new File(appRoot, "data/test.txt");
// 경로 어느 경로에 어떤 파일 객체를 만들 것인지.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AppRoot.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
</head>
<body>
<div>
<h1>관찰</h1>
<hr>
</div>
<div>
<h2>웹 어플리케이션 루트 : <%=appRoot %></h2>
<!--
C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp01\
워크스페이스 실제 물리적 데이터 : metadata
WebContent 에 작성하거나 src에 작성한다고 해서 실제 물리적으로 그 원본 데이터가
그 위치에 들어있는 것이 아니다.
어플리케이션 루트를 통해 확인한 위의 경로가 『실제 물리적 경로』인 것이다.
-->
<h2>생성할 파일 위치 : <%=newFile %></h2>
<!--
C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp01\data\test.txt
-->
</div>
</body>
</html>
FileSystemApp02
실행 스크린샷 - `FileWrite.jsp`
WebContent
FileWrite.jsp
<%@page import="java.io.PrintWriter"%>
<%@page import="java.io.FileWriter"%>
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* FileWrite.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 1. 파일을 쓰기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
// 2. 파일이 존재할 디렉터리가 없는 경우라면...
if ( !newFile.getParentFile().exists() )
{
// 파일이 위치할 곳까지의 디렉터리를 생성
newFile.getParentFile().mkdirs();
//--> 경로에 빠져있는 부분들을 경로가 존재할 수 있도록
// 디렉터리를 만들어 달라. (make directory)
}
// 3. 파일을 쓰기 위한 FileWriter 객체 생성
// → 출력 스트림을 활용하여 파일에 내용을 기록
FileWriter fw = new FileWriter(newFile);
// 4. FileWriter 객체를 좀 더 편하게 사용하기 위해 PrintWriter 로 감싸줌
PrintWriter pw = new PrintWriter(fw);
// 5. 실질적으로 파일에 내용을 씀(기록)
pw.println("테스트이다...");
pw.println("확인해보자...");
// 6-1. PrintWriter 리소스 반납(닫아줌)
pw.close();
// 6-2. FileWriter 리소스 반납(닫아줌)
fw.close();
// 해당 경로의 디렉토리로 확인하는 것은 서버단에서 확인하는 것이다.
//System.out.println(appRoot);
//--> C:\SpringMVCStudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileSystemApp02\
%>
실행 스크린샷 - `FileRead.jsp`
WebContent
FileRead.jsp
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.FileReader"%>
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* FileRead.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 1. 파일을 읽기 위해 File 객체를 생성
File newFile = new File(appRoot, "data/test.txt");
// 2. 파일이 존재하는지의 여부 확인
// → 지정된 경로에 파일이 존재하는지의 여부를 확인하여
// 존재하는 경우에만 처리하여 FileNotFoundException 방지
if (newFile.exists())
{
// 3-1. 파일을 읽기 위한 FileReader 객체 생성
FileReader fr = new FileReader(newFile);
// 3-2. FileReader 객체를 좀 더 편하게 사용하기 위해
// BufferedReader 로 감싸기
BufferedReader br = new BufferedReader(fr);
// *[Buffered : 임시 저장공간.]
// 4. 실질적으로 파일의 내용을 읽어냄
String readData;
while ( (readData=br.readLine()) != null ) // 라인별로 읽어들이는 기능 반복
{
out.println(readData + "<br>");
}
// 5-1. BufferedReader 리소스 반납(닫아줌)
br.close();
// 5-2. FileReader 리소스 반납(닫아줌)
fr.close();
}
else // 지정된 경로에 파일이 존재하지 않을 경우 처리
{
out.println("정상적으로 파일을 읽어들일 수 없습니다.");
}
%>
FileSystemApp03
실행결과 스크린샷
WebContent
ObjectWrite.jsp
<%@page import="java.io.ObjectOutputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.util.Hashtable"%>
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* ObjectWrite.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
// 테스트
System.out.println(appRoot);
// 파일 객체 생성
File newFile = new File(appRoot, "objData/data.ser");
//-- 객체 직렬화
// 파일이 존재할 디렉터리가 존재하지 않을 경우는
// 파일이 위치할 경로까지의 디렉터리들을 생성해준다.
if ( !newFile.getParentFile().exists() )
{
newFile.getParentFile().mkdirs();
}
// 파일에 넣기 위한 Hashtable 객체를 만들어 데이터에 포함시킨다.
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("key1", "사과");
h.put("key2", "수박");
// 파일을 내보내기 위한 스트림 구성
FileOutputStream fos = new FileOutputStream(newFile);
// Object 를 파일에 기록하기 위해 ObjectOutputStream 객체 생성
// → 생성한 객체로 FileOutputStream 객체 감싸기
ObjectOutputStream oos = new ObjectOutputStream(fos);
// ObjectOutputStream 을 이용하여 파일에 Object 를 기록
oos.writeObject(h);
// 리소스 반납
oos.close();
fos.close();
// 아래 보여주는 템플릿 제거
%>
WebContent
ObjectReade.jsp
<%@page import="java.util.Enumeration"%>
<%@page import="java.util.Hashtable"%>
<%@page import="java.io.ObjectInputStream"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.File"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* ObjectRead.jsp */
String appRoot = "/";
appRoot = pageContext.getServletContext().getRealPath(appRoot);
File newFile = new File(appRoot, "objData/data.ser");
// 파일이 존재하는지 확인한 후 처리
if ( newFile.exists() )
{
// 파일을 읽어들이기 위해 FileInputStream 객체 생성
FileInputStream fis = new FileInputStream(newFile);
// 파일에서 Object 를 읽어들이기 위해 ObjectInputStream 객체 생성
ObjectInputStream ois = new ObjectInputStream(fis);
// ObjectInputStream 을 이용하여 파일로부터 Object 읽어오기
// 읽어온 Object 를 원래의 형(타입)으로 캐스팅
Hashtable h = (Hashtable)ois.readObject();
ois.close();
fis.close();
Enumeration e = h.keys();
while(e.hasMoreElements())
{
String key = (String)e.nextElement();
String value = (String)h.get(key);
%>
<%=key %> 의 값은 <%=value %> 입니다. <br>
<%
}
}
else
{
out.println("해당 파일이 존재하지 않습니다~!!!");
}
// 아래 보여주기 위한 템플릿 모두 제거
%>
FileSystemApp04
실행결과 스크린샷
WebContent
Send.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Send.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>파일 시스템 및 파일 업로드</h1>
<hr>
</div>
<div>
<!-- 『enctype="multipart/form-data"』 : 파일을 물리적으로 업로드 하기 위한 속성 -->
<!-- 『method="post"』 : 파일을 물리적으로 업로드 하기 위한 요청 및 전송 방식 -->
<form action="Receive.jsp" method="post" enctype="multipart/form-data">
이름 : <input type="text" name="name">
<br>
<!-- 파일 업로드 대화창 구성 -->
<!-- → 파일을 업로드할 수 있도록 하는 대화창이 구성된다. -->
파일 : <input type="file" name="upload">
<br>
<!-- submit 액션 처리 -->
<button type="submit" class="btn">전송</button>
</form>
</div>
<!--
※ 『Send.jsp』의 form 엘리먼트 enctype 속성의 속성값을
『enctype="multipart/form-data"』와 같이 구성할 경우
form 의 내용을 바이너리 값의 형태로 전송한다는 의미로 활용되며,
이와 같은 방식을 통해 전송할 경우 수신된 데이터는
이름 : null
파일 : null
로 확인된다.
==> 이는, 바이너리 값을 getParameter() 를 통해 수신할 수 없다는 의미이다.
-->
</body>
</html>
실행결과 스크린샷
ⓐ `request.getParameter("name")` 으로 수신시 제대로 전달받지 못함.
※ 참고 : `<form>` 태그에, `enctype="multipart/form-data"` 를 추가하지 않았을 경우, 제대로 보인다.
Receive.jsp
// 이전 페이지(Send.jsp)로부터 넘어온 데이터 수신
// → name, upload
String name = request.getParameter("name");
String upload = request.getParameter("upload");
WebContent
Recieve.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
// 이전 페이지(Send.jsp)로부터 넘어온 데이터 수신
// → name, upload
String name = request.getParameter("name");
String upload = request.getParameter("upload");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Receive.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<!-- 이름 : 어쩌구<br> -->
이름 : <%=name %><br>
<!-- 파일 : 저쩌구<br> -->
파일 : <%=upload %><br>
</div>
</body>
</html>
FileSystemApp05
실행결과 스크린샷
WebContent
UploadForm.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>UploadForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<div>
<h1>파일 입력 폼</h1>
<hr>
</div>
<div>
<form action="Receive.jsp" method="post" enctype="multipart/form-data">
file : <input type="file" name="file" size="50">
<br>
text : <input type="text" name="data" size="30">
<br>
<input type="submit" value="upload">
</form>
</div>
</body>
</html>
WebContent
Receive.jsp
<%@page import="java.io.DataInputStream"%>
<%@page import="java.util.Enumeration"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<%
/* Receive.jsp */
String contentType = request.getContentType();
Enumeration e = request.getHeaderNames();
out.println("[[ 브라우저로부터 날아오는 헤더 정보들 ]]<br>");
while(e.hasMoreElements())
{
String key = (String)e.nextElement();
String value = request.getHeader(key);
out.println(key + " " + value + " " + "<br>");
}
out.println("[[ request 로 넘어오는 데이터들 ]]<br>");
DataInputStream dis = new DataInputStream(request.getInputStream());
String line = null;
while((line=dis.readLine()) != null)
{
//out.println(new String(line.getBytes("UTF-8"), "UTF-8") + "<br>");
out.println(new String(line.getBytes("ISO-8859-1"), "UTF-8") + "<br>");
// =====================
// 해체하는 방식을 Window의 기본 Encoding 방식인
// MS949로 해체한 후, 다시 UTF-8 형식으로 변경하는 것.
}
// 아래 보여주는 템플릿 모두 제거
%>
내일 이어서!
FileSystemApp06
WebContent
Test.jsp
WebContent
Test_ok.jsp