파일 업로드 개요

  • 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
  • 사용자 인터페이스 (JSP에서는 Form 태그) 필요
    • form 태그 method 속성은 반드시 POST
    • form 태그 enctype 속성은 반드시 multipart/form-data
    • form 태그 action 속성은 파일 업로드를 처리할 jsp 파일로 설정
    • 파일 업로드를 위해 input 태그 type 속성을 file로 설정
  • 오픈 라이브러리를 이용해 구현 (JDK에 파일 업로드 기능 존재 x)
    • cos.jar 또는 commonsfileupload.jar 사용
  • 백엔드 작업 중 사용자에게 진행 상황을 보여주어야 한다.

파일 업로드 (MultipartRequest)

<upload.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<form action="status.jsp" enctype="multipart/form-data" method="post">
		<p>
			제목: <input type="text" name="title">
		</p>
		<p>
			파일: <input type="file" name="filename">
		</p>
		<input type="submit" value="submit">
	</form>
</body>
</html>

<status.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="com.oreilly.servlet.*, com.oreilly.servlet.multipart.*"%>
<%@ page import="java.io.*, java.util.*"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<%
	MultipartRequest multi = new MultipartRequest(request, "C:\\\\upload", 5 * 1024 * 1024, "utf-8",
			new DefaultFileRenamePolicy());
	String title = multi.getParameter("title");
	out.println("<h3>" + title + "</h3");
	Enumeration files = multi.getFileNames();
	while(files.hasMoreElements()){
		String name = (String) files.nextElement();
		String fileName = multi.getFilesystemName(name);
		String original = multi.getOriginalFileName(name);
		String type = multi.getContentType(name);
		File file = multi.getFile(name);
		out.println("<p>요청 파라미터 이름: "+ name + "</p>");
		out.println("<p>실제 파일 이름: "+ original + "</p>");
		out.println("<p>저장 파일 이름: "+ fileName + "</p>");
		out.println("<p>파일 콘텐츠 유형: "+ type + "</p>");
		if(file != null) {
		out.println("<p>파일 크기: " + file.length() + 
		"</p>");
		}
	}
	%>
</body>
</html>
  • http://www.servlets.com/cos/
  • 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스
  • 웹 브라우저가 전송한 데이터를 일반 데이터와 파일 데이터로 구분하여 파일 데이터에 접근
    • 일반 데이터: getParameterNames()
    • 파일 데이터: getFileNames()
  • 한글 인코딩 값을 얻기 쉽다, 서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명 자동으로 변경
  • 의존성 획득 방법: Maven, Gradle, 직접 다운로드 후 라이브러리 파일에 집어 넣기

파일 업로드 (Commons-FileUpload)

<upload.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<form action="status.jsp" enctype="multipart/form-data" method="post">
		<p>
			제목: <input type="text" name="title">
		</p>
		<p>
			파일: <input type="file" name="filename">
		</p>
		<input type="submit" value="submit">
	</form>
</body>
</html>

<status.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="java.io.*, java.util.*"%>

<!DOCTYPE html>
<html>
<head></head>
<body>
	<%
	String fileUploadPath = "c:\\\\upload";
	DiskFileItemFactory factory = new DiskFileItemFactory();
	ServletFileUpload upload = new ServletFileUpload(factory);
	List items = null;
	try {
	    items = upload.parseRequest(request);
	} catch (FileUploadException e) {
	    e.printStackTrace();
	}
	Iterator params = items.iterator();
	while (params.hasNext()) {
		FileItem fileItem = (FileItem) params.next();
		if (!fileItem.isFormField()) {
			String fileName = fileItem.getName();
			fileName = fileName.substring(fileName.lastIndexOf("\\\\\\\\") + 1);
			File file = new File(fileUploadPath, fileName);
			try {
			    fileItem.write(file);
			} catch (Exception e) {
			    e.printStackTrace();
			}
			out.println("<p>File name: " + fileName + "</p>");
			out.println("<p>File size: " + fileItem.getSize() + " bytes</p>");
			out.println("<p>File type: " + fileItem.getContentType() + "</p>");
		}
	}
	%>
</body>
</html>

'Development > JSP' 카테고리의 다른 글

세션 & 쿠키  (0) 2023.05.10
유효성 검사  (0) 2023.05.10
내장 객체(Implicit Object)  (0) 2023.04.19
자바 빈즈  (0) 2023.04.19
액션 태그  (0) 2023.04.19
  • JSP 페이지에서 자동으로 생성되고 사용할 수 있는 객체들을 말함

request

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="proc.jsp">
		<label for="id">아이디:</label>
		<input type="text" id="id" name="id"><br>

		<label for="passwd">비밀번호:</label>
		<input type="password" id="passwd" name="passwd"><br>

		<input type="submit" value="로그인">
	</form>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<form>
<%
	request.setCharacterEncoding("UTF-8");
	String userId = request.getParameter("id");
	String password = request.getParameter("passwd");
%>

	<p> 아이디: <%=userId %></p>
	<p> 비밀번호: <%=password %></p>
	
</form>
</body>
</html>
  • 사용자 요구 사항을 얻어내는 것이 목적 ex: form 태그를 통해 들어오는 id, password 정보
  • JSP 컨테이너는 웹 브라우저에서 서버로 전달되는 정보를 처리하기 위해 request안에 저장된 정보를 가져오는 메소드들을 가지고 있
    • request.setCharacterEncoding("UTF-8");
    • request.getHeader("name")
    • request.getCookies()
    • request.getParameter("id");

  • 서버의 JSP페이지로 전달하는 정보를 저장하는 객체

'Development > JSP' 카테고리의 다른 글

유효성 검사  (0) 2023.05.10
파일 업로드  (0) 2023.05.09
자바 빈즈  (0) 2023.04.19
액션 태그  (0) 2023.04.19
서블릿과 JSP  (0) 2023.04.19

동적 콘텐츠 개발을 위해 자바 코드를 사용하여 자바 클래스 로직을 작성시
좋은 객체 지향의 설계 SOLID 원칙의 단일 책임 원칙(SRP) 따라
JSP 페이지 화면을 표현하기 위한 계산식이나 자료 처리를 담당하는
자바 코드를 따로 분리해서 작성하는 것이 바람직하다.
이는 통상적으로 자바 빈즈 개념을 사용하는데 
JSP에서는 자바 빈즈 액션 태그를 사용해 구현 하는 것이 가능하다.  

 

 

자바 빈즈 액션 태그 권장 사양 (필수가 아니다)

package action.example;

public class Person {
	private String id="1971343";
	private String name="임준식";
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
  • 클래스는 java.io.Serializable 인터페이스를 구현해야 한다.
  • 인수가 없는 기본 생성자가 있어야 한다.
  • 모든 멤버 변수인 프로퍼티는 private 접근 지정자로 설정해야 한다.
  • 모든 멤버 변수인 프로퍼티는 getter/setter() 메소드가 존재해야 한다.

<자바 빈즈 액션 태그 사용> useBean

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
	<jsp:useBean id="person" class="action.example.Person"
	scope="request"></jsp:useBean>
	<jsp:setProperty property="id" name="person" value="20000212"/>
	<jsp:setProperty property="name" name="person" value="이름"/>
	<p>아이디: <jsp:getProperty property="id" name="person"/></p>
	<p>이름: <jsp:getProperty property="name" name="person"/></p>
	
</body>
</html>
  • id: 자바빈즈 식별 이름
  • class: 패키지 이름을 포함한 자바빈즈 이름, 자바빈즈는 인수가 없는 기존 생성자가 있어야 하며 추상 클래스로는 사용이 불가능 하다.
  • scope: 자바빈즈가 저장되는 영역을 설정, page(기본 값), request, session, application 하나 값 사용
  • <jsp:setProperty property=" " name=" " value=" "/>: 자바 빈즈에 데이터 저장
    • property: 자바 빈즈 프로퍼티 이름 
    • name: 자바 빈즈 식별을 위한 이름
    • value: 변경할 자바빈즈 프로퍼티의 값
  • <jsp:getProperty property="name" name="person"/>: 자바 빈즈에서 데이터 가져오기
    • property: 자바 빈즈 프로퍼티 이름
    • name: 자바 빈즈 식별을 위한 이름

 

'Development > JSP' 카테고리의 다른 글

파일 업로드  (0) 2023.05.09
내장 객체(Implicit Object)  (0) 2023.04.19
액션 태그  (0) 2023.04.19
서블릿과 JSP  (0) 2023.04.19
폼 (form) 태그  (0) 2023.04.17
  • 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
  • JSP 페이지에서 페이지와 페이지 사이를 제어
  • 다른 페이지의 실행 결과 내용을 현재 페이지에 포함
  • xml 형식

forward

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h3>이 파일은 First 페이지 입니다.</h3>
	<jsp:forward page="action_forward_second.jsp"/>
</body>
</html>

이동할 페이지 외부 파일명

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

  • JSP 컨테이너는 현재 JSP 페이지에서 forward 액션 태그 만난다면 해당 jsp로 이동시킴
  • 자동으로 action_second.jsp 페이지로 이동 됨

include

포함 할 페이지 외부 파일명

<jsp:include page="action_second.jsp" flush=“false”></jsp:include>

  • 디렉티브 태그의 include 처럼 현재 JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
  • 디렉티브 태그의 include와의 차이점은 데이터를 저장할 수 있다는 것
  • 해당 페이지 안에 action_second.jsp 페이지가 추가 됨
  • flush는 현재 페이지의 출력 버퍼 안에 남아있는 데이터를 먼저 비울지(true) 안비울지(false)를 정하는 속성
    • 그 후에 include page의 지정된 파일이 출력 버퍼에 들어가게 된다.

액션 태그 include와 디렉티브 태그 include의 차이점

  • 액션 태그의 include: 동적인 포함을 지원
    • jsp의 런타임 도중 동적으로 포함된다.
    • 이는 포함된 JSP 파일이 실행될 때까지 현재 JSP 파일의 실행이 일시 중지됨을 말하며 
    • JSP 파일이 비교적 작거나, 현재 JSP 파일의 실행이 일시 중지되는 것이 문제가 되지 않는 경우에만 사용해야 한다.
  • 디렉티브 태그의 include: 정적인 포함을 지원
    • 컴파일 시 정적으로 포함된다.
    • 따라서 포함된 JSP 파일이 컴파일된 후에는 현재 JSP 파일과 하나의 파일로 처리된다.
    • 이는 포함된 JSP 파일이 크거나, 런타임 시의 부하를 최소화해야 하는 경우에 사용해야 한다.

param

<jsp:forward page=“파일명” >
<jsp:param name=“매개변수명1” value=“매개변수값1” />
[ <jsp:param name=“매개변수명2” value=“매개변수값2” /> … ]
</jsp:forward
  • 현재 JSP 페이지에서 다른 페이지에 정보를 전달하는 태그
  • 단독으론 사용되지 않으며 다른 태그 안에서 사용
  • 데이터 형식은 Map과 같이 key 값과 value 값을 사용하여 request 객체에 파라미터로 추가한다.

 

'Development > JSP' 카테고리의 다른 글

내장 객체(Implicit Object)  (0) 2023.04.19
자바 빈즈  (0) 2023.04.19
서블릿과 JSP  (0) 2023.04.19
폼 (form) 태그  (0) 2023.04.17
내장 객체(Implicit Object) 2  (0) 2023.04.17

서블릿

서블릿은 HTTP 프로토콜을 통해 클라이언트와 상호작용하는 데 초점을 두고 있다.
  • 서블릿 규약에 따라 제작된 클래스로 서버에서 웹페이지 들을 동적으로 생성
  • 전송되는 데이터 처리를 수행하기 위해 java로 작성된 프로그램
  • 서블릿을 실행하기 위해서는 먼저 환경을 구축 필요
  • 아파치 톰켓 또는 IBM 웹 스피어 등이 필요함
  • HTTP 프로토콜을 기반으로 동작하며
  • HTTP 요청을 받아 JSP에서 처리된 결과를 HTTP 응답으로 반환하거나
  • JSP에서 사용되는 데이터를 서블릿에서 처리하여 JSP로 전달하는 등의 역할을 한다.

JSP(Java Server Pages)란?

JSP(JavaServer Pages)는 HTML 코드와 자바 코드를 조합하여 동적인 웹 페이지를 생성하는 데 초점을 두고 있다.
  • HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구
  • HTML 안의 자바 코드가 있는 것
    • <%! class 안으로 들어갈 내용 %>
    • HTML 코드는 service() 메소드 안으로 들어가는 내용
  • 서블릿으로 변환 되는 과정
    • twoDice.jsp (jsp 파일) -> 변환
    • twoDice_jsp.java (서블릿 소스 파일) -> 컴파일
    • twoDice_jsp.class (서블릿 클래스 파일)-> 인스턴스 생성 (_ispInit() 초기화 메소드 실행)
    • _jspService() 서블릿 인스턴스 -> 응답
    • 첫 번째 호출 때는 시간 지연이 존재한다. 변환하고 컴파일 하는 과정이 있기 때문에
    • 두 번째 호출 때 부터는 객체가 존재 하기 때문에 빠르게 응답이 가능하다.
    • jsp 파일이 변경된다면 맨 처음 변환하는 과정부터 다시 시작한다.
  • 자동으로 매핑 해주기 때문에 호출만 하면 된다.
  • 늦은 초기화가 기본 lazy - init() 지연된 초기화 (요청이 오면 객체를 만들고 초기화)
  • Spring은
    • 빠른 초기화가 기본 early - init() (요청이 오지 않아도 미리 객체를 만들어 두고 초기화)

JSP는 왜 만들어졌는가?

  • 같이 사용함으로써 서블릿의 단점을 보완하기 위해 스크립트 방식을 도입하여 Sun 사에 의해 JSP가 개발되었음
  • JSP는 서블릿과 함께 사용될 목적으로 만들어졌으며
  • 웹 페이지의 디자인과 레이아웃, UI 등을 HTML과 유사한 태그를 사용하여 쉽게 작성할 수 있도록 하는 데 초점이 맞춰져 있다.

JSP와 서블릿의 동시 사용

JSP는 HTML과 자바 코드를 모두 사용하여 동적인 웹 페이지를 생성하는 기술이며, 서블릿은 JSP와 함께 사용될 때, JSP 사이에 데이터를 전달 해주는 역활을 하면서 JSP를 처리하여 동적인 웹 페이지를 생성하고 클라이언트로 전달하는 역할을 한다.

웹 컨테이너

  • 웹 서버의 컴포넌트 중 하나로 Java 서블릿과 상호작용
  • 웹 컨테이너는 서블릿의 생명주기를 관리하고 특정 서블릿을 맵핑 하는 일을 한다
  • URL 요청이 올바르게 접근할 수 있도록 권한 보장
  • 순수 서블릿을 처리하는 경우 서블릿 컨테이너라고 하지만 서블릿 컨테이너를 포함한 JSP, HTTP 서버의 기능도 함께 포함하기 때문에 웹 컨테이너라고도 부름

REST(Representatinal State Transfer) API

  • 네트워크 상에서 클라이언트와 서버 사이 통신을 구현하는 방법 중 하나
  • 대부분 Open API는 Rest 아키텍쳐 기반
  • 서버 응답을 다양한 형태로 전달 하는 개념 (JSON,XML)
  • 데이터를 주고 받기 위한 형태
  • 성능, 안정성, 보안, 백업, 분산 등 여러 인프라 재활용 가능

 

1. 서블릿과 컨트롤러

  • @WebServlet("/~") = @Controller + @RequestMapping

 

2. 서블릿의 생명주기

  • Servlet Container가 자동으로 호출 (개발자는 내용만 채우면 됨)
  • 서블릿은 기본적으로 싱글톤 Sington 이다 -> 1개의 인스턴스만 만들어서 계속 재활용
  • init() 서블릿 생성시 초기화
  • service 실제 작업을 처리하는 메소드
    • 작업이 수행될 때마다 실행 됨
  • destroy 서블릿이 메모리에서 제거될 때 호출
    • 만약 Servlet의 내용이 바뀐다면 Spring이 자동으로 해당 서블릿을 제거시키고 다시 호출 시킴

 

3. JSP의 기본 객체 : 생성 없이 사용할 수 있는 객체

(서비스 메소드의 Lv(지역 변수)로 선언 된 것들)

  • request 
  • pageContext 
  • reponse
  • session
  • application
  • config
  • out
  • page

'Development > JSP' 카테고리의 다른 글

자바 빈즈  (0) 2023.04.19
액션 태그  (0) 2023.04.19
폼 (form) 태그  (0) 2023.04.17
내장 객체(Implicit Object) 2  (0) 2023.04.17
스크립트 태그  (0) 2023.03.30

+ Recent posts