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).