본문 바로가기

Java, Spring/07일

7일차 6

Servlet

 

 

package : test.servlet class name : HelloServlet

package test.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
}

필요없는거 다 지우고나면

package test.servlet;

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 HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
}

Servlet : 단지 HttpServlet 클래스를 상속받은 클래스네..

왜 main이 없지? main은 프로그램의 수행의 흐름을 기술해주기 위한건데..

웹프로그램은 브라우저에서 요청을 하면 그 요청한 것을 수행하면 되는거니까

그 요청의 수행은 웹서버(웹컨테이너)에서 하잖아.

get방식으로 요청하면 doGet이 알아서 수행되고

post방식으로 요청하면 doPost가 알아서 수행돼.

이렇게 지가 알아서 실행되는걸 callback method라고 해..

 

tomcat 최신버전에는 @가 붙지만 6.0만 되도 안붙어.

이거 지우고 예전방식으로 짜려면

web.xml에 서블릿을 등록해줘야해

  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>test.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet.m2</url-pattern>
  </servlet-mapping>

test.servlet.HelloServlet 경로가 제대로 입력되었는지 확인하려면 마우스대고 ctrl누르면 HelloServlet클래스로 가지..

너무 경로가 길 경우에는

해서 붙이고 뒤에 .class만 지워주면 돼..

 

/HelloServlet.m2 라고 실행하면 test.servlet.HelloServlet으로 오는거지..

/webdev/WebContent/basic/source.jsp에서 post/get 바꿔가며 테스트해봐.

<form action="../HelloServlet.m2" method="post">

<form action="../HelloServlet.m2" method="get">

package test.servlet;

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 HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("GET 요청이 처리되었습니다.");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("POST 요청이 처리되었습니다.");
	}
}

 

console이 아니라 웹브라우저에 출력하려면 복잡해지지....

package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");	//response : 요청에 대한 응답개체
		PrintWriter out = response.getWriter();	//쓰기 위한 객체를 얻어와.
		out.println("GET 요청이 처리되었습니다.");
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("POST 요청이 처리되었습니다.");
	}
}

 

정말 불편하군. 소스가 엄청나게 길다고 생각해봐.(네이버 메인페이지 라인수가 1500줄 정도 되지.. )

그래서 나온게 jsp..!

보통 서블릿에서 어떤 값을 받으면 jsp에 값을 보내서 처리하게 하지.

 

값을 보내는 방법이 여러가지가 있어.

일단 페이지 이동하는 형태가 크게 두가지 있지.

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- <a href="http://naver.com">naver</a> -->
<% response.sendRedirect("source.jsp"); %>
</body>
</html>

 

response방식을 이용하는 방법과

또 RequestDispatcher 이용하는 방법

 

요청이 들어오면 서블릿에서 실행을 하는데

RequestDispatcher dispatcher = request.getRequestDispatcher("jsp파일");
dispatcher.forward(request, response);

 

보통 이렇게 servlet안에서 view단을 잘라네.

그리고 이렇게 이동하면 데이터값을 가지고 이동해. (request, response 요청받은 객체와 응답받을 객체를 가지고 이동해)

package test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dispatcher = request.getRequestDispatcher("/basic/result.jsp");
		request.setAttribute("hello", "안녕하세요");
		dispatcher.forward(request, response); 	//요청받은 객체와 응답받을 객체를 가지고 이동해
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("POST 요청이 처리되었습니다.");
	}
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%= request.getAttribute("hello") %>
</body>
</html>

 

post방식이든 get방식이든 같이 받으려면 주로 쓰는 방법이

첫번째로는 doProcess메서드 만들어서 양쪽에서 호출하는 방법

package test.servlet;

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

public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response){
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response){
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
	
		String name = request.getParameter("name");
		String say = "그래. 난 " + name + ". 절대로 포기하지 않는 남자지.";
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/basic/result.jsp");
		request.setAttribute("hello", say);
		try {
			dispatcher.forward(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 		
	}	
}

 

더 쉬운건 service method를 override해.

service method가 get방식이 들어오면 doGet을, post방식이 들어오면 doPost를 호출하거든..

package test.servlet;

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

public class HelloServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, 
			HttpServletResponse response){
		String name = request.getParameter("name");
		String say = "그래. 난 " + name + ". 절대로 포기하지 않는 남자지.";
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/basic/result.jsp");
		request.setAttribute("hello", say);
		try {
			dispatcher.forward(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}		
}

 

view단이 분리가 됐네.. 프로그래머가 servlet코딩을 하고 디자이너가 jsp만들어서 값만 뿌려주면 되잖아.

아직 result.jsp에 <%= request.getAttribute("hello") %>이런 코딩이 남아있네

최종

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="../HelloServlet.m2" method="get">
<input type = "text" name="name" /><br/>
<input type = "submit" value="전송" />
</body>
</html>
package test.servlet;

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

public class HelloServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, 
			HttpServletResponse response){
		String name = request.getParameter("name");
		String say = "그래. 난 " + name + ". 절대로 포기하지 않는 남자지.";
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("/basic/result.jsp");
		request.setAttribute("hello", say);
		try {
			dispatcher.forward(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}		
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${hello}</h1>
</body>
</html>

 

이제 view페이지에 거의 분류해냈네. 게시물 리스트 출력 등 루프돌리는 것 정도 남았지(jstl-java standard tag library).

'Java, Spring > 07일' 카테고리의 다른 글

7일차 2  (0) 2012.09.25
7일차 3  (0) 2012.09.25
7일차 4  (0) 2012.09.25
7일차 5  (0) 2012.09.25
7일차 7  (0) 2012.09.25