혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가웹페이지내에뒤섞여있어서웹페이지의화면설계가점점어려워진다. - 서블릿이먼저등장하였으나, 자바내에 <html> 을사용하기가불편하여 JSP가등장하였다. JSP는 <html> 내부에자바를사용할수있는장점이있으나, 화면설계부분과기능부분이뒤섞여유지관리가힘들어진다. 서블릿을사용하기전의 JSP의역할 - 사용자의요청을받는다. - 사용자가요청한작업을수행한다.(DB 관련작업은자바빈이수행한다.) - 사용자가요청한작업의결과를출력한다. - JSP가사용자의모든요청을처리하는구성을 MVC 1 구조라고한다. JSP DataBase 자바빈즈 - 즉, 요청도 JSP 에서처리하고, 작업도 JSP 에서처리하고, 작업의결과도 JSP 에출력되는구조를가지고있다. - MVC 1 의구조는간단한형태의웹어플리케이션에유리한구조이다. 웹어플리케이션의모든작업을 JSP와서블릿이분할해서처리한다. - 사용자의요청은서블릿, 자료의처리는자바빈, 요청의결과는 JSP에출력되도록구성한다. - 이런구조를 MVC 2 구조라고한다. 제어역할 (Control) Servlet 데이터모델 (Model) 자바빈즈 JSP 출력역할 (View) DataBase
MVC 2구조의장점 - 사용자의요청처리와데이터의처리, 결과의처리등각각역할이분할되어있어서유지보수관리가용이하다. - 각역할별로특성화를할수있다. - 웹디자이너들의대부분은자바를모른다. MVC 2의구조는결과출력을위해서 JSP가사용되고 <html> 태그만을사용해서 JSP를설계할수있으므로웹디자이너은자바를배우지않아도웹설계를할수있다. 서블릿 (servlet) 이란? 서블릿의정체는? - 서블릿은자바로작성된클래스이다. - 하지만, 일반자바클래스가아닌서블릿이므로서블릿스러운, 즉서블릿다운기능을갖는클래스이다. - 서블릿스러운클래스로작성해야한다. 즉, 클래스가서블릿기능을부여받아수행할수있도록 HttpServlet 클래스를상속한다. public class 내가만든서블릿 extends HttpServlet { - 이서블릿이라는클래스는사용자로부터요청을받아서처리한다. 따라서, 사용자로부터전송되는 get이나 post 방식의요청을모두처리할수있어야한다. 왜냐하면, 사용자가 get방식으로요청할지, post방식으로요청할지를알수없기때문이다. - get방식의요청을처리하기위해서 doget() 메서드를오버라이드 ( 재정의 ) 한다. - doget() 메서드에는사용자로부터의요청에대한객체 () 와사용자로의결과출력에대한객체 () 를매개변수로갖는다. 그리고, 발생할수있는예외를상위객체로떠넘긴다.(throws IOException) public void doget(httpservletrequest, HttpServletResponse ) throws IOException { - post방식의요청을처리하기위해서 dopost() 메서드를오버라이드 ( 재정의 ) 한다. - dopost() 메서드에도사용자로부터의요청에대한객체 () 와사용자로의결과출력에대한객체 () 를매개변수로갖는다. 그리고, 발생할수있는예외를상위객체로떠넘긴다.(throws IOException) public void dopost(httpservletrequest, HttpServletResponse ) throws IOException { - 이를종합한서블릿의예 public class 내가작성한서블릿 extends HttpServlet { public void doget(httpservletrequest, HttpServletResponse ) throws IOException { public void dopost(httpservletrequest, HttpServletResponse ) throws IOException { - 서블릿, 알고보니별거아니네 ~. 그냥클래스일뿐이다.
서블릿으로요청은어떻게보내나? - 서블릿으로하여금사용자의요청을처리하도록하기위해서는사용자가서블릿으로요청을날려야한다. - 즉, 웹브라우저의 URL 창에서블릿이주소를입력하면서블릿이요청을받아야한다. - 사용자가서블릿으로보낸요청을서블릿이받도록하는행위는 web.xml을통해서가능하다. - web.xml에사용자의요청과서블릿클래스의연결을정의한다. <web-app 어쩌구저쩌구 > 어쩌구저쩌구 <servlet> <servlet-name> 서블릿이름 </servlet-name> 아래에명시된서블릿이름과동일해야한다. <servlet-class> 서블릿클래스이름 </servlet-class> 서블릿클래스의이름 </servlet> <servlet-mapping> <servlet-name> 서블릿이름 </servlet-name> <url-pattern> 사용자웹브라이저의 URL창에명시된문자열 </url-pattern> </servlet-mapping> </web-app> - 사용자의요청을서블릿클래스로대응시키는과정은다음과같다. 1 사용자가웹브라우저의 URL 창에주소를입력한다. 2 위에서입력한주소가 web.xml에있는지웹서버가검색한다. 3 web.xml에해당하는주소가존재하면, 해당주소에해당하는서블릿이름을다시검색한다. 4 서블릿이름을찾았으면, 다시서블릿이름에해당하는서블릿클래스를검색한다. 5 서블릿클래스를찾았으면, 드디어!! 사용자의 get요청혹은 post요청을서블릿클래스로전달한다. 6 서블릿클래스는 doget() 혹은 dopost() 메서드를호출해서동작하도록한다. 서블릿을사용한예 - 서블릿을이용해서오늘의날짜와시간을출력하는예 ( 클래스작성시서블릿을선택한다 ) package today; import 각종패키지 ; public class Ch1Servlet extends HttpServlet { protected void doget(httpservletrequest, HttpServletResponse ) throws.setcontenttype("text/html; charset=euc-kr"); 웹페이지에서한글출력기능설정 PrintWriter out =.getwriter(); 웹페이지에출력하기위해서 PrintWriter 생성 java.util.date today = new java.util.date(); 오늘의날짜와시간을생성 out.println("<html><body><h1 align=center> 오늘의날짜와시간 </h1><br>" + today + "</body></html>"); HTML을이용해서오늘날짜시간출력 protected void dopost(httpservletrequest, HttpServletResponse ) throws dopost() 메서드는사용하지않으므로비어있다.
- web.xml에서블릿을등록하고, 서블릿을호출할수있는서블릿이름과, 서블릿이름을호출할수있는 URL 문자열을정의한다. <?xml version="1.0" encoding="utf-8"?> <web-app 어쩌구저쩌구 > <display-name>servletexample1</display-name> <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> <servlet> <description></description> <display-name>ch1servlet</display-name> <servlet-name>ch1servlet</servlet-name> 서블릿클래스에매칭되는서블릿이름 <servlet-class>today.ch1servlet</servlet-class> 최종적으로호출되는서블릿클래스이름 </servlet> 동일해야한다. <servlet-mapping> <servlet-name>ch1servlet</servlet-name> 아래문자열과매칭되는서블릿이름 <url-pattern>/ch1servlet</url-pattern> 웹브라우저의 URL 창에입력된문자열 </servlet-mapping> </web-app> 동일해야한다. - 다음은결과화면 - 지금작성한웹어플리케이션의구성 Servlet
요청은서블릿이받고, 결과는 JSP에출력하는예 - 위의예제는날짜를직접서블릿에서출력한다. 다음예제는서블릿이사용자의요청을 JSP로전달해서 JSP가날짜를출력한다. - 다음은서블릿클래스 package today; import 각종패키지 ; public class SimpleController extends HttpServlet { protected void doget(httpservletrequest, HttpServletResponse ) throws Object resultobject = " 안녕하세요.";.setAttribute("result", resultobject); " 안녕하세요 " 를 객체에속성으로저장 RequestDispatcher dispatcher =.getrequestdispatcher("/test2.jsp"); 사용할 JSP 를정의 dispatcher.forward(, ); 정의된 JSP 로이동 protected void dopost(httpservletrequest, HttpServletResponse ) throws - 다음은서블릿이결과출력을요청하는 test2.jsp <%@ page language="java" contenttype="text/html; charset=euc-kr" pageencoding="euc-kr"%> <%@ page import = "java.util.*" %> <html> <head> <title> 서블릿이 JSP에게보냄 </title> </head> <body> <% Date nowtime = new Date(); 스크립트릿으로오늘의날짜를생성 %> 서블릿으로부터전달된데이터는 <%=.getattribute("result") %> 입니다. 서블릿이설정한 result를읽음현재시각은 <%= nowtime %> 입니다. 오늘의날짜를출력 </body> </html>
- 다음은위에서사용된서블릿클래스와서블릿이름, URL 문자열을등록한 web.xml <?xml version="1.0" encoding="utf-8"?> <web-app 어쩌구저쩌구 > <display-name>servlettest1</display-name> <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> <servlet> <description></description> <display-name>simplecontroller</display-name> <servlet-name>simplecontroller</servlet-name> <servlet-class>today.simplecontroller</servlet-class> </servlet> <servlet-mapping> <servlet-name>simplecontroller</servlet-name> <url-pattern>/simplecontroller</url-pattern> </servlet-mapping> </web-app> - 다음은결과화면 - 지금작성한웹어플리케이션의구성 Servlet JSP,
도전과제 1 : 1 부터 100 까지의합을서블릿을이용해서출력하세요. 도전과제 2 : 예전에작성했던로또번호출력을서블릿을이용해서출력하세요.