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 후니아부지
:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>프로젝트명</display-name>
  
  <filter>
  	<filter-name>필터 닉네임</filter-name>
  	<filter-class>패키지명을 포함한 필터 클래스 풀 네임</filter-class>
  	<init-param>
  		<param-name>매개변수명</param-name>
  		<param-value>값</param-value>
  	</init-param>
  </filter>

  <filter>....</filter>
  <filter>....</filter>
  
  <filter-mapping>
  	<filter-name>필터 닉 네임</filter-name>
  	<url-pattern>필터 클래스가 실행될 위치</url-pattern>
  </filter-mapping>
  
  <filter-mapping>....</filter-mapping>
  <filter-mapping>....</filter-mapping>

  <servlet>
  	<servlet-name>서블릿 닉네임</servlet-name>
  	<servlet-class>패키지명을 포함한 서블릿 클래스 풀 네임</servlet-class>
  	<init-param>
  		<param-name>매개변수명</param-name>
  		<param-value>값</param-value>
  	</init-param>
  	<load-on-startup>실행 순서(숫자, 0은 서버 임의 실행)</load-on-startup>
  </servlet>
  
  <servlet>....</servlet>
  <servlet>....</servlet>
  
  <servlet-mapping>
  	<servlet-name>서블릿 닉 네임</servlet-name>
  	<url-pattern>URL 패턴</url-pattern>
  </servlet-mapping>
  
  <servlet-mapping>....</servlet-mapping>
  <servlet-mapping>....</servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>


Posted by 후니아부지
:

웹 서버 구동은 아래의 순서로 진행된다.

순서

 처리 내용

 해당 파일 및 폴더

 1

 웹서버 구동에 필요한 포트 및 설정 정보를 인식한다.

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

 2

 모든 프로젝트에 공통으로 적용되는 설정 정보 인식한다.

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

 3

 모든 프로젝트에 공통으로 적용되는 라이브러리 파일을 인식한다. 더불어 %JAVA_HOME%\lib , %JAVA_HOME%\jre\lib\ext 폴더 내의 jar 파일들도 자동으로 인식한다.

 [톰캣폴더]\common\lib

 4

 프로젝트별 환경 정보를 인식한다.

 [프로젝트이름]\WEB-INF\web.xml

 5

 프로젝트별 라이브러리를 인식한다.

 [프로젝트이름]\WEB-INF\lib

 6

 프로젝트별로 적용되는 서블릿 파일을 인식한다. 설정에 따라 init()을 실행한다.(<load-on-startup> 태그 사용)

 [프로젝트이름]\WEB-INF\classes


웹 서버 종료 시 아래의 순서로 진행된다.

 순서

 처리 내용 

 해당 파일 및 폴더 

 1

 프로젝트별로 적용되는 서블릿 파일을 인식하고 destroy()를 실행하여 메모리를 해제한다.

 [프로젝트이름]\WEB-INF\classes

 2

 프로젝트별로 환경 설정에 사용된 메모리를 해제한다.

 

 3

 모든 프로젝트에 공통적인 환경을 설정하기 위해 사용된 메모리를 해제한다.

 

 4

 웹 서버를 구동하기 위해 열어둔 포트를 닫는다.

 


서블릿라이프 사이클은 다음과 같다

 순서

 처리 내용

 1

 public void init() 또는 public void init(ServletConfig sc) {....} 에 의한 초기화 코드가 실행된다. 

 이는 web.xml 인식 시 <load-on-startup> 태그에 의해 실행되거나, 최초 접속하는 클라이언트에 의해 실행된다.

 2

 public void service(HttpServletRequest request, httpServletResponse response) throws IOException, ServletException {....}

 클라이언트의 요청에 의해 실행되는 메서드로 콘솔 프로그램의 main() 과 같은 역할을 한다.

 3

 public void destroy() {....} 에 의한 메모리 해제

 웹 서버가 종료될 때 실행되어 메모리를 해제한다.


간단한 코드로 서블릿의 라이프 사이클을 확인해보자.

ServeletLifeCycleTest.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 ServeletLifeCycleTest extends HttpServlet {
	private int callCount;
	public void init() {
		this.callCount = 0;
		System.out.println("Servlet init() called....");
	}
		
	public void service(HttpServletRequest _request, HttpServletResponse _response) 
		throws ServletException, IOException{
		System.out.println("Servlet service() called (" + (++(this.callCount)) + ")....");
	}
		
	public void destory() {
		System.out.println("Servlet destroy() called....");
	}
}	


web.xml

  ....
  <servlet>
  	<servlet-name>ServletLifeCycle</servlet-name>
  	<servlet-class>com.study.ServeletLifeCycleTest</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>ServletLifeCycle</servlet-name>
  	<url-pattern>/test</url-pattern>
  </servlet-mapping>
  ....


서버에 올리고 주소창에 URL을 입력하면 다음과 같이 init(), service()가 실행됨을 볼 수 있다.


해당 페이지를 리로딩하면 카운트가 계속 올라가며 service()가 호출됨을 확인할 수 있다.


서버 종료 시 destory()가 호출 되어야 하는데 왜 안나오나????




' > web' 카테고리의 다른 글

[Servlet] 서블릿 주요 클래스  (0) 2014.03.04
[Servlet] web.xml 설정 파일  (0) 2014.03.04
[Servlet] 웹 프로그램의 파일 구조  (0) 2014.02.27
[Servlet] MVC 패턴  (0) 2014.02.26
자바 입출력(I/O) - 객체(Obejct) 입출력  (0) 2014.02.24
Posted by 후니아부지
:

자바로 작성하는 웹 프로그램은 어떤 웹 컨테이너를 사용하든지 다음과 같은 구조를 가진다.

웹 프로그램의 파일 구조


그러나 이클립스에서는 작성이나 관리의 효율성을 위해 조금 변형된 구조를 가진다.

물론, 실제 웹 프로그램이 실행될 때는 다시 원래의 구조로 바뀐다.

이클립스의 웹 프로그램 파일 구조

 

Posted by 후니아부지
:

[Servlet] MVC 패턴

앎/web 2014. 2. 26. 15:47 |
  • Model

데이터를 담거나 DB로 데이터를 보내는 작업을 하는 객체를 말한다.

View 상의 사용자 입력을 담아 가지고 있는 역할을 하며, Controller에서 상태 변화를 알려주면 자기자신의 상태를 변경하여 View에게 알려주는 역할을 한다. 

DTO를 통해 상태를 주고 받으며 DB와의 데이터 통신을 위해 DAO를 사용한다.


  • View

Model을 화면상에 보여주는 부분을 말한다. 

Model의 변화된 상태를 가져와서 보여준다.

View에서의 데이터 입력을 Controller에 전달한다. 

Controller가 선택한 View를 보여준다.


  • Controller

Model과 View간의 데이터 전달 및 결과에 대한 View를 선택하여 응답하는 역할을 한다.


 

MVC 구조 활용 예시

사용자 등록하는 기능 구현해본다.

0. 사용자 정보를 관리하기 위한 DB 테이블을 생성한다.


1. 사용자 등록을 위한 html 페이지를 작성한다. (View)

MVC_Test_Register.htm


2. 사용자 페이지에서 넘어오는 데이터 저장을 위한 DTO 클래스를 작성한다. (Model)

MVC_Test_MemberDTO.java


3. DTO에 저장된 데이터를 DB로 저장하는 작업을 하는 DAO 클래스를 작성한다. (Model)

MVC_Test_MemberDAO.java


4. 사용자 페이지에서 넘어온 데이터를 DTO에 넣고 DAO 클래스의 관련 메서드에 전송하는 작업을 하고, 그 작업 결과에 따라 이동할 페이지를 결정하는 클래스를 작성한다. (Controller)

MVC_Test_MemberProcess.java


5. 서블릿 정보를 등록한다.

web.xml


6. 처리 결과에 따른 뷰 페이지를 작성한다. (View)

MVC_Test_Success.htm

 

MVC_Test_Failure.htm

서버에 올려 확인해보자.

 

MVC_Test.rar


 

Posted by 후니아부지
:

객체의 입출력은 스트림 기반이다.

객체의 입출력에는 직렬화가 필요하다. 이를 위해 java.io.Serializable 이라는 인터페이스를 사용한다.

사용할 객체의 클래스 선언부에 'implements Serializable'를 쓰면된다.

class 클래스명 implements Serializable {
....
}


유형별 객체 출력

FIle

File f = new File("파일이름");
FileOutputStream fos = new FileOutputStream(f, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
\


유형별 객체 입력

FIle

File f = new File("./object_io_test.txt");
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);


예제)

테스트 객체

import java.io.*;

public class TestClass1 implements Serializable {
	private byte a;
	private int b;
	private float c;
	private String d;
	
	public byte getA() {
		return a;
	}
	public void setA(byte a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public float getC() {
		return c;
	}
	public void setC(float c) {
		this.c = c;
	}
	public String getD() {
		return d;
	}
	public void setD(String d) {
		this.d = d;
	}
	
	public String toString() {
		return this.a + " / " + this.b + " / " + this.c + " / " + this.d;
	}
}


출력

import java.io.*;

public class ObjectOutputTest {
	public static void main(String[] ar) {
		try {
			File f = new File("./object_io_test.txt");
			FileOutputStream fos = new FileOutputStream(f, true);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			ObjectOutputStream oos = new ObjectOutputStream(bos);
			
			TestClass1 tc1 = new TestClass1();
			
			tc1.setA((byte)97);
			tc1.setB(18);
			tc1.setC(12.8f);
			tc1.setD("test1");
			
			TestClass1 tc2 = new TestClass1();
			
			tc2.setA((byte)98);
			tc2.setB(28);
			tc2.setC(22.8f);
			tc2.setD("test2");
			
			oos.writeObject(tc1);
			oos.writeObject(tc2);
			oos.close();
			
			
		} catch (Exception ex) {			
		}
	}
}


입력

import java.io.*;

public class ObjectInputTest {
	public static void main(String[] ar) {
		try {
			File f = new File("./object_io_test.txt");
			FileInputStream fis = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(fis);
			ObjectInputStream ois = new ObjectInputStream(bis);
			
			TestClass1 tc1 = (TestClass1)ois.readObject();
			TestClass1 tc2 = (TestClass1)ois.readObject();
			
			ois.close();
			
			System.out.println("tc1: " + tc1.toString());
			System.out.println("tc2: " + tc2.toString());
			
		} catch (Exception ex) {
		}
	}
}


객체를 파일로 출력 후 입력 테스트를 해보면 다음과 같이 읽힐 것이다.


Posted by 후니아부지
:

텍스트 스트림은 2 Byte 문자 체계를 가진 텍스트의 입출력에 사용한다.


형식별 2 Byte 출력

Console

OutputStreamWriter osw = new OutputStreamWriter(System.out);
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);


File

File f = new File("파일이름");
FileWriter fw = new FileWriter(f, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);

Network

Socket soc = new Socket(.....);
OutputStreamWriter osw = new OutputStreamWriter(soc.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
pw.println(....);


예제)

import java.io.*;

public class Text_IO_Output_test {
	public static void main(String[] ar) {
		try {
			/* 콘솔 출력 
			OutputStreamWriter osw = new OutputStreamWriter(System.out);
			BufferedWriter bw = new BufferedWriter(osw);
			PrintWriter pw = new PrintWriter(bw);
			*/
			
			File f = new File("./text_io_test.txt");
			FileWriter fw = new FileWriter(f, true);
			BufferedWriter bw = new BufferedWriter(fw);
			PrintWriter pw = new PrintWriter(bw);

			pw.println("Text I/O Output Test!");
			pw.close();			
		} catch (Exception ex) {}
	} 
}


형식별 2 Byte 입력

Console

InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader br = new BufferedReader(isr);
br.readLine();


File

File f = new File("파일이름");
FileReader fr = new FileReader(f, true);
BufferedReader br = new BufferedReader(fr);
br.readLine();

Network

Socket soc = new Socket(.....);
InputStreamReader isr = new InputStreamReader(soc.getInputStream());
BufferedReader br = new BufferedReader(isr);
br.readLine();


예제)

import java.io.*;

public class Text_IO_Input_test {
	public static void main(String[] ar) {
		try {
			/* 콘솔 입력
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			
			System.out.print("뭐든 써봐: ");
			String str = br.readLine();
			System.out.println("내용:");
			System.out.print(str);
			*/
			
                        // 파일 입력 
			File f = new File("./text_io_test.txt");
			FileReader fr = new FileReader(f);
			BufferedReader br = new BufferedReader(fr);
			
			System.out.println("읽은내용:");
			while(true) {
				String str = br.readLine();
				if (str == null) break;
				System.out.println(str);
			}
			
			br.close();
			
		} catch (Exception e) {
			
		}
	}
}

Posted by 후니아부지
:

자바 입출력은 하나의 형식으로 콘솔, 파일, 네트워크 등 모든 입출력에 사용할 수 있다.

입출력 방식이 스트림(Stream)이냐 텍스트(Text)냐의 차이이다.


자바는 입출력을 스트림에 의존한다. 모든 입출력이 1 Byte의 데이터 흐름으로 여겨진다.


형식별 1 Byte 출력

Console

FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

File

File file = new File("파일이름");
FileOutputStream fos = new FileOutputStream(file, false);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

Network

Socket soc = new Socket(.....);
BufferedOutputStream bos = new BufferedOutputStream(soc.getOutputStream(), 1024);
DataOutputStream dos = new DataOutputStream(bos);
dos.write(.....)

예제)

import java.io.*; // 입출력을 위해 I/O 패키지 추가 public class IO_Output_Test { public static void main(String[] ar) { try { /* 콘솔에 대한 출력 FileOutputStream fos = new FileOutputStream(FileDescriptor.out); BufferedOutputStream bos = new BufferedOutputStream(fos, 1024); */ // 파일에 대한 출력 File f = new File("./stream_io_test.txt"); FileOutputStream fos = new FileOutputStream(f, true); BufferedOutputStream bos = new BufferedOutputStream(fos, 1024); DataOutputStream dos = new DataOutputStream(bos); byte[] str = new byte[]{(byte)'C', (byte)'o', (byte)'n' , (byte)'s', (byte)'o', (byte)'l', (byte)'e', (byte)' '}; dos.write(str); dos.flush(); dos.close(); } catch (Exception ex) {} } }



형식별 1 Byte 입력

Console

FileInputStream fis = new FileInputStream(FileDescriptor.in);
BufferedInputStream bis = new BufferedInputStream(fis, 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

File

File file = new File("파일이름");
FileInputStream fis = new FileInputStream(file, false);
BufferedInputStream bis = new BufferedInputStream(fis, 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

Network

Socket soc = new Socket(.....);
BufferedInputStream bis = new BufferedInputStream(soc.getInputStream(), 1024);
DataInputStream dis = new DataInputStream(bis);
dis.read();

예제)

import java.io.*;

public class IO_Input_Test {
	public static void main(String[] arg){
		try {
			/* 콘솔 입력
			FileInputStream fis = new FileInputStream(FileDescriptor.in);
			BufferedInputStream bis = new BufferedInputStream(fis, 1024);
			DataInputStream dis = new DataInputStream(bis);
			
			System.out.print("입력: ");
			int x = dis.read();
			System.out.println("입력된 데이터는 " + (char)x + "이다.");
			dis.close();
			*/

                        // 파일 입력
			File f = new File("./stream_io_test.txt");
			FileInputStream fis = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(fis, 1024);
			DataInputStream dis = new DataInputStream(bis);
			
			while(true) {
				int x = dis.read();
				if (x<0) break;
				System.out.print((char)x);
			}
			
			dis.close();
		} catch (Exception e) {}
	}

}


Posted by 후니아부지
:

사용자 정의 객체

사용자 정의 객체는 자바의 클래스와 유사하다. 재사용성을 위한 방식이지 클래스가 아니다.

형식은 다음과 같다.

function 객체이름(매개변수) {
    this.멤버변수 = .....
    this.함수 = .....
}

예를 들어 아래와 같은 스크립트를 작성하고

function display() {
    document.write("이름: " + this.name);
    document.write("나이: " + this.age);
}

function Person(_name, _age) {
    this.name = _name; /// this를 사용하여 멤버로 정의한다.
    this.age = _age;
    this.disp =  display; /// 위의 display 라는 함수를 disp라는 이름으로 맵핑한다.
}

아래와 같이 사용할 수 있다.

var p = new Person("거시기", 30);
p.disp();




내장 객체

내장 객체는 JavaScript에서 미리 정의해 놓은 객체를 말한다.


아...... 쓰던거 다 날라 갔다...... 안해...... 책봐!


Posted by 후니아부지
: