<form> 태그는  반드시 POST 방식으로 해야 한다. 

또한 enctype은 "multipart/form-data"로 고정이다. 이 형태에서 벗어나지 않는다.

<form method="POST" enctype="multipart/form-data" action="처리 서블릿">
  <input type="file" name="이름"/>
  <input type="submit" value="업로드"/>
</form>


파일 업로드를 위한 컴포넌트는 몇 가지 있는데, 여기서는 Apache의 Commons 프로젝트의 fileupload를 사용하겠다.


다음 경로로 접속한다.

http://jakarta.apache.org/


Ex-Jakarta의 Commons 프로젝트를 클릭한다.


FileUpload를 클릭하여 최신 버전을 다운로드 한다.


개발 환경의 OS에 따라 맞는 것을 다운로드 한다.

commons-fileupload-1.3-bin.zip

commons-fileupload-1.3.1-bin.zip


압축 풀면 나오는 폴더 내에 commons-fileupload-1.3.1.jar 파일을 프로젝트의 WebContent\WEB-INF\lib 에 복사해준다.

※ 웹 프로젝트의 라이브러리는 프로젝트\WebContent\WEB-INF\lib 에 위치하면 된다.


해당 파일을 Build Path에 추가하자.


Java Build Path에 등록하면 라이브러리에 추가된다.


아파치 Commons 프로젝트의 파일 업로드 라이브러리는 일반적으로 자체적으로 해결하므로 IO 관련 컴포넌트도 같이 등록해주는 것이 좋다. (안넣으니 없다고 오류나더라~)


Commons의 IO를 다운로드한다.


commons-io-2.4-bin.zip


필요한 파일은 commons-io-24.jar 이다. 

FileUpload 컴포넌트와 동일한 작업(lib복사, 빌드패스 추가)을 해준다.


이로써 사용준비는 끝났고 예제로 테스트 해본다.


예제) 파일을 선택하여 지정한 디렉토리로 업로드 해본다.

FileUploadPage.htm


web.xml


FileUploadServlet.java


파일을 선택하여 업로드 후 지정한 디렉터리에 저장되었는지 확인해보자.


저장된 경로를 콘솔에서 확인하고 찾아 가보자. 



※ 이클립스에서 실행하면 저장되는 경로가 복잡하고 길다. 

그러나 실제 톰캣을 사용해 배포하면 %톰캣홈%\webapps\프로젝트\ 아래에 저장될 것이다. 


※ 이클립스의 웹브라우저를 통해 접근했을 때, 업로드 후 다음과 같은 오류가 발생하는 경우가 있다. (반드시 그런 것은 아니다) 


그냥 다른 웹브라우저로 접근하면 잘된다. (ㅡ,.ㅡ)



Posted by 후니아부지
:

서블릿에서 파일 시스템을 사용하여 데이터를 관리할 때 중요한 것이 경로를 관리하는 것이다.

웹에서는 ServletContext 객체를 사용하면 된다. 현재 서블릿이 실행되는 서버의 환경 정보를 관리하기 때문에 원하는 디렉터리까지의 주소를 추출할 수 있다.

ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/");


getRealPath() 메서드의 매개 변수에 "/" 를 사용하면 해당 프로젝트까지의 주소가 반환된다.

해당 프로젝트의 특정 디렉터리에 접근하려면 매개변수에 상대경로를 써주면 된다.

예를 들어 프로젝트 내의 test 디렉터리에 접근하려면 다음과 같이 쓰면 된다.

String realPath = context.getRealPath("/test");



예제) 서버 시작 시 파일로 저장된 카운트를 읽어 표시하고 서버 종료시에 파일에 저장한다.

web.xml


countServlet.java


countView.jsp


서버 시작 시 자동으로 init()이 호출되어(web.xml에 설정됨) count에 저장된다. 

처음 실행 시킨다면 파일이 없으므로 콘솔에 아래와 같이 출력될 것이다.


countServlet 서블릿이 불러지도록 해보면 (http://*********/count.do) 뷰 페이지에 카운팅 될 것이다.

페이지를 계속 갱신해보면 카운트가 올라갈 것이다.


그 다음, 서버를 종료하면 콘솔에 최종 카운트가 보이면서 파일로 저장될 것이다.


다시 서버를 구동시키면 앞서 기록한 내용과 동일함을 확인할 수 있을 것이다.


  


Posted by 후니아부지
:

[Servlet] 쿠키 (Cookie)

앎/web 2014. 3. 8. 23:57 |

1. 쿠키 데이터 저장하는 프로세스는 다음과 같다.

Cookie cookie = new Cookie(키, 값);
cookie.setMaxAge(유지시간_초단위);
response.addCookie(cookie);


2. 클라이언트의 Cookies 폴더에 파일로 저장된다.


3. 저장한 쿠키 데이터를 적용 시킬 페이지에서 쿠키를 불러온다.

Cookie[] cookies = request.getCookies();

for(int i=0; i<cookies.length; i++) {
  String key = cookies[i].getName();
  if (key.equals(키)) {
    String value = cookies[i].getValue();
  }
}


예제ID를 입력 받고 ID저장 체크 박스를 클릭 시 쿠키에 기록되는 것을 확인한다.

LoginProcess.java


web.xml


login.jsp


main.htm


Posted by 후니아부지
:

데이터 저장 영역

request

 연결이 유지되는 동안은 유지될 수 있는 데이터 영역을 가진다.

 Class

 ServletRequest    /     HttpServletRequest

 Set

 request.setAttribute(키, 값)

 Get

 request.getAttribute(키)

 Delete

 request.removeAttribute(키, 값)


 session

 웹 브라우저가 종료되기 전까지 유지될 수 있는 데이터 영역을 가진다.

 Class

 HttpSession

 Set

 session.setAttribute(키, 값)

 Get

 session.getAttribute(키)

 Delete

 session.removeAttribute(키, 값)


 application

 서버가 종료되기 전까지 유지될 수 있는 데이터 영역을 가진다.

 Class

 ServletContext

 Set

 application.setAttribute(키, 값)

 Get

 application.getAttribute(키) 

 Delete

 application.removeAttribute(키, 값)


예제폼에서 넘긴 데이터가 각 데이터 저장 영역에 저장되는 상태를 확인한다.

SetDataServlet.java


viewData.jsp


web.xml


setData.htm


결과를 확인해보자.


Posted by 후니아부지
:

웹 컨테이너로부터 RequestDispatcher 인터페이스를 얻어 현재 페이지 내에 다른 URL이나 페이지를 포함 시킬 수 있고, 또한 특정 페이지로 현재 request 정보를 유지하며 이동할 수 있다.


예제는 이전 포스팅(에러 처리 and URL 이동 )에 사용한 소스를 수정하여 작성한다.

추가: successPage.jsp

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

<%
  String val1 = request.getParameter("val1");
  String val2 = request.getParameter("val2");
  String sum = request.getParameter("sum");
%>    
    
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Success</title>
  </head>
  <body>
    <center>
      계산이 완료되었습니다. <br/>
      <%= val1 %> + <%= val2 %> = <%= sum %>
    </center>
  </body>
</html>


calcServlet.java

package com.study;

import java.io.IOException;

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

public class CalcServlet extends HttpServlet {
	public void init() {
	}
	
	public void service(HttpServletRequest _request, HttpServletResponse _response) 
			throws IOException, ServletException {
		String val1 = _request.getParameter("val1");
		String val2 = _request.getParameter("val2");
		int sum = 0;
		
		try {
			int iVal1 = Integer.parseInt(val1);
			int iVal2 = Integer.parseInt(val2);
			sum = iVal1 + iVal2;
			System.out.println("합: " + sum);
			
			// ServletContext 객체 얻음
			ServletContext context = this.getServletContext();
			
			// RequestDispatcher 객체 얻음
			RequestDispatcher dispatcher = context.getRequestDispatcher("/successPage.jsp?sum=" + sum);
			
			// request, response 값을 가지고 페이지 이동
			dispatcher.forward(_request, _response); 
			
			// request, response 값을 가지고 페이지 포함
			//dispatcher.include(_request, _response); 
			
		} catch(Exception _ex) {
			_response.sendError(588, "숫자로 변환할 수 없는 데이터가 입력되었습니다.");
			return;
		}
	}
	
	public void destroy() {
	}
}


정상적으로 계산되었을 경우 아래와 같이 나타난다.


 

Posted by 후니아부지
:

에러 처리 (sendError)

에러 발생시 HttpServletResponse 클래스의 sendError 메서드를 사용하여 사용자에게 에러 페이지를 보여줄 수 있다.

Method

 void

 sendError(int sc) 

 Sends an error response to the client using the specified status code and clearing the buffer.
 void

 sendError(int sc, String msg)

 Sends an error response to the client using the specified status.

응답 코드는 일반적으로 500번대의 서버 에러를 출력한다.


예제)

web.xml

  .... 
  <servlet>
    <servlet-name>CalcServlet</servlet-name>
    <servlet-class>com.study.CalcServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>CalcServlet</servlet-name>
    <url-pattern>/calc.do</url-pattern>
  </servlet-mapping>
  .... 


calcPare.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>sendError 테스트</title>
  </head>
  <body>
    <form name="myForm" method="post" action="/SendErrorTest/calc.do">
      값1 = <input type="text" name="val1"/><br/>
      값2 = <input type="text" name="val2"/><br/>
      <input type="submit" value="계산"/>   
    </form>
  </body>
</html>


CalcServlet.java

package com.study;

import java.io.IOException;

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

public class CalcServlet extends HttpServlet {
	public void init() {
	}
	
	public void service(HttpServletRequest _request, HttpServletResponse _response) 
                   throws IOException, ServletException {
		String val1 = _request.getParameter("val1");
		String val2 = _request.getParameter("val2");
		try {
			int iVal1 = Integer.parseInt(val1);
			int iVal2 = Integer.parseInt(val2);
			System.out.println("합: " + (iVal1 + iVal2));
			
		} catch(Exception _ex) {
			_response.sendError(588, "숫자로 변환할 수 없는 데이터가 입력되었습니다.");
		}
	}
	
	public void destroy() {
	}
}


입력 폼에서 숫자가 아닌 문자를 입력하고 '계산' 버튼을 누르면 예외 처리로 빠지게 되어 다음과 같은 오류 페이지가 나타난다.

예외 처리 시 설정한 에러 코드와 메시지가 보일 것이다.


URL 이동 (sendRedirect)

HttpServletResponse 클래스의 sendRedirect 메서드로 특정 URL이나 페이지로 이동할 수 있다.

이동 시 현재 페이지까지 전달된 request의 파라미터는 리셋되고 웹 브라우저의 URL도 이동하는 경로로 변경된다.


앞서 작성한 CalcServlet.java 내에 try 마지막 부분에 다음 내용을 추가한다. 

계산이 완료된 후 successPage.htm 페이지로 이동하라는 의미이다.

			_response.sendRedirect("successPage.htm");


successPage.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>sendRedirect 테스트</title>
  </head>
  <body>
    <center> 계산이 완료되었습니다.</center>
  </body>
</html>


계산이 완료되면 다음과 같이 페이지가 이동하게 된다.


Posted by 후니아부지
:

web.xml 에 서블릿 등록시 <init-param> 태그를 사용해 초기화 매개변수를 등록할 수 있다.

....

    서블릿 이름
    서블릿 클래스
    
        초기화 매개변수 명
        초기화 매개변수 값
    

....

서블릿 클래스(GenericServelt or HttpServlet)의 getInitParameter("매개변수명") 을 통해 값을 가져올 수 있다.

또는 ServletConfig를 상속 받은 다른 클래스나 ServletConfig 객체 생성 후 매개변수를 가져올 수 도 있다.


예제)

web.xml

....
  <servlet>
  	<servlet-name>InitParam</servlet-name>
  	<servlet-class>com.study.InitParamTest</servlet-class>

  	<init-param>
  		<param-name>nick</param-name>
  		<param-value>hoya</param-value>
  	</init-param>

  	<init-param>
  		<param-name>age</param-name>
  		<param-value>18</param-value>
  	</init-param>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>InitParam</servlet-name>
  	<url-pattern>/InitParam.do</url-pattern>
  </servlet-mapping>
....


InitParamTest.java

package com.study;

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

public class InitParamTest extends HttpServlet {
	public void service(HttpServletRequest _request, HttpServletResponse _response) {
		System.out.println("nick: " + this.getInitParameter("nick"));				
		System.out.println("age: " + this.getInitParameter("age"));				
	}
}


Posted by 후니아부지
:

GET 방식 요청의 한글 처리

방법1. WAS 환경 설정 파일 수정 (여기는 톰캣) 한다.

server.xml 파일 내용 중 <connector> 태그port 8080 인 태그에 URIEncoding="EUC-KR" 이라고 추가 해주면 된다.

[톰캣 폴더]\conf\server.xml

<connector port="8080" 
           protocol="HTTP/1.1" 
           connectiontimeout="20000" 
           redirectport="8443" 
           URIEncoding="EUC-KR">
</connector>


방법2. 받아온 데이터를 String 클래스를 통해 문자셋을 변환한다.

그러나 넘어온 데이터 개수가 많다면 모두 이 적용을 해야하므로 WAS 설정을 변경하는 방법이 낫다.

String data = _request.getParameter("data");
data = new String(data.getBytes("ISO8859_1"), "EUC-KR");


POST 방식 요청의 한글 처리

데이터를 가져오기(getParameter) 전에 넘어온 ServletRequest 객체의 문자 셋을 변경한다. 

_request.setCharacterEncoding("EUC-KR");
String data = _request.getParameter("data");


Posted by 후니아부지
:

GET 방식의 요청

  • 웹 브라우저의 주소 표시줄에서 접속하려는 URL을 직접 입력하는 경우
  • 웹 페이지에서 링크를 클릭한 경우
  • 웹 페이지에서 링크나 버튼에 설정된 이벤트에 의해 자바 스크립트가 실행되어 location.href 에 의해 요청이 발생한 경우
  • 웹 페이지에서 링크나 버튼에 설정된 이벤트에 의해 자바 스크립트가 실행되어 window.open() 함수가 실행 되는 경우
  • 웹 페이지에서 링크나 버튼 혹은 그에 따른 자바 스크립트가 실행되어 <form> 태그에 의해 요청이 발생한 경우
  • REDIRECT 방식에 의해 웹 페이지가 이동되는 요청이 발생하는 경우
예제)
RequestMethodTestServlet.java
package com.study;

import java.io.IOException;

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

public class RequestMethodTestServlet extends HttpServlet {
	 public void init() {		 
	 }
	 
	 public void service(HttpServletRequest _request, HttpServletResponse _response) 
					 throws IOException, ServletException {
		String method = _request.getMethod();
		System.out.println("HTTP Method: " + method);
	 }
	 
	 public void destory() {		 
	 }
}


web.xml

  <servlet>
  	<servlet-name>RequestMethod</servlet-name>
  	<servlet-class>com.study.RequestMethodTestServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>RequestMethod</servlet-name>
  	<url-pattern>/RequestMethod.do</url-pattern>
  </servlet-mapping>


GetRequest.htm

<!DOCTYPE html>
<html>
	<head>
		<meta charset="EUC-KR">
		<title>GET 방식 요청 테스트</title>
		<script language="javascript">
        <!--
			function movePage() {
            	location.href = "/GetTest.do";
			} 
        //-->
		</script>
		
	</head>
	<body>
		<a href="/GetTest.do">LINK</a>
		<br/><br/>
		<input type="button" value="버튼(javascript location.href)" onClick="movePage()"/>
	
	</body>
</html>


POST 방식의 요청

  • <form> 태그의 POST 지정

<form method="POST" action="....">

  • javascript를 통한 form method 지정

<script>

    function check_form() {

        myform.method = "POST";

        return true;

    }

</script>

<form name="myform" method="GET" action="...." onSubmit="return check_form()">

  • 서블릿에서 RequestDispatcher 객체를 사용하여 다른 페이지에서 POST로 넘어온 요청을 forward하는 경우
  • JSP의 forward 태그 라이브러리를 사용하여 다른 페이지에서 POST로 넘어온 요청을 forward하는 경우

예제)
PostRequest.htm
<!DOCTYPE html>
<html>
	<head>
		<meta charset="EUC-KR">
		<title>POST 방식 요청 테스트</title>
		<script language="javascript">
		<!--
			function movePage() {
				myform.method="POST";
				myform.submit();			
			}		
		//-->
		</script>	
	</head>
	<body>
		<form name="myform" action="/RequestTest/Request.do">
			<input type="button" value="전송" onClick="movePage()"/>
		</form>
	</body>
</html>


Posted by 후니아부지
:

서블릿 클래스의 상속 관계


사용하는 패키지는 다음과 같다.

javax.servlet.*

javax.servlet.http.*


Servlet 인터페이스


ServletConfig 인터페이스


GenericServlet 클래스


HttpServlet 클래스


ServletRequest 클래스


HttpServletRequest 클래스


ServletResponse 클래스


HttpServletResponse 클래스


Posted by 후니아부지
: