반응형

 

 

 

 

 

 

 

 

 

<MVC 아키텍쳐>

MVC 이전
Model DAO
View HTML 영역
Controller java영역(서블릿)

 

MODEL(DAO)

package study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class BangMyungDAO_OracleImpl implements BangMyungDAO
{
     @Override
     public void add(BangMyungVO vo) throws Exception
     {
         Connection conn = null;
         Statement stmt = null;
         try {
                 Class.forName("oracle.jdbc.driver.OracleDriver");
                 conn =
            DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:32771/xe",
             "system", "1234");
                stmt = conn.createStatement();
             String sql = "insert into bangmyung_t values (
            seq_bangmyung.nextval, '"+
             vo.getGul() + "', sysdate )";
             stmt.executeUpdate( sql );
             }
                catch( Exception e ){ throw e; }
                finally {
                 if( stmt != null ) stmt.close();
                 if( conn != null ) conn.close();
                }
         }
         @Override
         public List<BangMyungVO> findAll() throws Exception {
             List<BangMyungVO> ls = new ArrayList<BangMyungVO>();
             Connection conn = null;
             Statement stmt = null;
             ResultSet rs = null;
         try {
             Class.forName("oracle.jdbc.driver.OracleDriver");
             conn =
        DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:32771/xe",
         "system", "1234");
             stmt = conn.createStatement();
             String sql = "SELECT no, gul, the_time FROM bangmyung_t order by
        no desc";
             rs = stmt.executeQuery( sql );
         while( rs.next() ) {
              BangMyungVO vo = new BangMyungVO();
             vo.setNo( rs.getInt("no") );
             vo.setGul( rs.getString("gul") );
             vo.setTheTime( rs.getString("the_time") );
             ls.add( vo );
         }
         }
         catch( Exception e ){}
         finally {
             if( rs != null ) rs.close();
             if( stmt != null ) stmt.close();
             if( conn != null ) conn.close();
         }
     return ls;
     }
}

VIEW(HTML)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="sso" %>
<!DOCTYPE>
<html>
    <body>
        <table border='1'>
             <tr>
             <td>No</td>
             <td>글</td>
             <td>작성시간</td>
             </tr>
             <sso:forEach varStatus="vs" var="vo" items="${ lst }">
             <tr bgColor="${ (vs.count % 2 != 0)?'#aabbcc':'#bbccdd' }">
                 <td>${ vs.count }</td>
                 <td>${ vo.no }</td>
                 <td>${ vo.gul }</td>
                 <td>${ vo.theTime }</td>
             </tr>
             </sso:forEach>
        </table>
        <form method="POST" action="bangmyung_add.jsp">
         <input type="text" name="gul" size="50"/>
         <input type="submit"/>
        </form>
    </body>
</html>

 

CONTROLLER(JAVA)

<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8" import="java.util.List, study.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="sso" %>
<%!
 public void submit() {
 System.out.println("submit");
 }
%>
<%
     // 1. 변수선언
     List<BangMyungVO> rl = null;
     Exception err = null;
     // 2. DB 연동
     BangMyungDAO dao = new BangMyungDAO_OracleImpl();
     try {
     rl = dao.findAll();
     } catch (Exception e) {
     err = e;
     }
     // 3. 흐름 만들기
     if ( rl == null || err != null ) {
     response.setCharacterEncoding("utf-8");
     response.sendRedirect("/study3/error.jsp");
     } else {
     request.setAttribute("lst", rl);
     RequestDispatcher rd = request.getRequestDispatcher("/Test125_1.jsp");
     rd.forward(request, response);
    %>
<!DOCTYPE>
<html>
    <body>
        <table border='1'>
         <tr>
             <td>No</td>
             <td>글</td>
             <td>작성시간</td>
         </tr>
         <sso:forEach varStatus="vs" var="vo" items="${ lst }">
         <tr bgColor="${ (vs.count % 2 != 0)?'#aabbcc':'#bbccdd' }">
             <td>${ vs.count }</td>
             <td>${ vo.no }</td>
             <td>${ vo.gul }</td>
             <td>${ vo.theTime }</td>
         </tr>
         </sso:forEach>
        </table>
    <form method="POST" action="bangmyung_add.jsp">
     <input type="text" name="gul" size="50"/>
     <input type="submit"/>
    </form>
    <% } %>
    </body>
</html>

 

MVC 만들기

package mvc;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public interface Controller {
         public String handleRequest(HttpServletRequest request,
        HttpServletResponse response) throws Exception;
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
    public @interface RequestMapping {
     public String value();
}
package mvc;
//import 생략~
    public class DispatcherServlet extends HttpServlet {
     private Map<String, Controller> map = null;

     @Override
     public void init(ServletConfig config) throws ServletException{
         map = new Hashtable<String, Controller>();

         String cs = "mvc.CtrlList,mvc.CtrlAdd2";
         for(String str : cs.split(",")){
         try{
             //해당 클래스 가져오고
             Class<?> cls = Class.forName(str);
             //RequestMapping에서 지정된 url 패턴 따오고
             RequestMapping an = cls.getAnnotation(RequestMapping.class);
            //얘 때문에 Controller에너는 Annotation!
             System.out.println("this is an : " + an);
             //해당 controller instance 받아오고
             Controller value = (Controller) cls.newInstance(); 
             // 이름이 str인 Controller 클래스 찾기
             // url 따기
             String key = an.value();
             //url-pattern과 controller 매핑
                 map.put(key, value);
                 }catch (Exception e) {}
                 } //String[] cs2 = cs.split(","); for(int i=0;i<cs2.length;i++)
                 System.out.println(map.toString());
         }
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse
    response)
     throws IOException, ServletException {
     }
 }
package mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

    @RequestMapping("/apple_list.do")
    public class CtrlList implements Controller {

     @Override
         public String handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
         return null;
 }
package mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RequestMapping("/apple_add2.do")
public class CtrlAdd2 implements Controller{

     @Override
     public String handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
     return null;
     }
 }

JSP MODEL1 / MVC MODEL2

 

 

model1 VS model2

<model1>

가장먼저 들어오는 곳이 JSP이다.

JSP에서 비즈니스 로직, VIEW모든 것을 처리한다.

 

<model2>

가장먼저 요청하는 곳이 서브릿단이다.

비즈니스 로직을 처리하는 서블릿을 완전히 분리시켜서 VIEW단과 로직을 처리하는 단을 분리시킨다.




 

 

Controller 추가해야할 때

<servlet>
 <servlet-name>abcd2</servlet-name>
 <servlet-class>mvc.DispatcherServlet</servlet-class>
     <init-param>
         <param-name>controllers</param-name>
         <param-value>
         mvc.CtrlList,
         mvc.CtrlAdd2
         </param-value>
     </init-param>
</servlet>

<!-- 여기 이렇게 controller를 추가하면 되지 않을까! -->

public void init(ServletConfig config) throws ServletException{
 map = new Hashtable<String, Controller>();
 String cs = config.getInitParameter("controllers");

 

HTML 소스 긁어오는애

package main;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
public class Test126 {
     public static void main(String[] args) throws Exception{
         URL rl = new URL("http://localhost:8081/0802/apple_list.do");
         URLConnection ucon = rl.openConnection();
         InputStream in = ucon.getInputStream();

     BufferedReader bin = new BufferedReader(new InputStreamReader(in,
    "UTF-8")); //>> char 단위로 읽게해주는 adapter
     //사실 UTF-8 빼도 되더라 얜 응답 내용
            String l = null;
         while((l = bin.readLine()) !=null){

         System.out.println(l);
         }
     in.close();
    }
}

java.net.URL은 이것 자체가 작은 웹브라우저의 역할을 한다. 요청을 날리고 그에 해당하는 응답을 받아들인
다 안드로이드 앱에서 버튼을 누르면 오늘의 배송정보가 넘어오는 ? 배송정보는 서버에 올라와 있는 상태! => 이
다운 받는 역할, 서버에 존재하는 배송정보를 다운받는 역할을 수행한다. 소켓으로 다 짜는 것이 아니라 http 프
로토콜로 서버와 통신할 때는 이 클래스를 주로 이용한다.
소켓으로 다 짜는 것이 아니라 http 프로토콜로 서버와 통신할 때는 이 클래스를 주로 이용한다.
앱 같은 경우에서 서버로부터 많은 데이터를 다운 받아야 할 경우에 URL 클래스를 이용하여 jsp 파일로부터 정
보를 다운받는다
이게 워낙 많이 쓰이다 보니 이를 강화한 오픈 소스 라이브러리가 등장 = apache http client 프로젝트 = 안
드로이드의 http 기반 표준 통신 수단

 

암호가 맞으면 다운, 아니면 안됨

    <%@ page contentType="text/plain; charset=UTF-8" pageEncoding="EUC-KR" %><%
     String pw = request.getParameter("pw");
     if(pw.equals("1234")){
         String[] l = {"사과", "귤", "배", "토마토"};
         String nl = "\r\n"; //줄 바꿈 표시

     for (int i = 0; i < l.length; i++) {%>
         <%=l[i]%><%=nl%>
         <%}}else{%>
         암호틀림
 <%}%>
public static void main(String[] args) throws Exception{
     URL rl = new URL("http://localhost:8081/0802/Test126.jsp?pw=1230");
     URLConnection ucon = rl.openConnection();
     InputStream in = ucon.getInputStream();

     BufferedReader bin = new BufferedReader(new InputStreamReader(in, "UTF8")); //>> char 단위로 읽게해주는 adapter
     //사실 UTF-8 빼도 되더라 얜 응답 내용

     String l = null;
     while((l = bin.readLine()) !=null){
         System.out.println(l);
         }
         in.close();
}
반응형

'Language Study > Java' 카테고리의 다른 글

5. 자바, 더 정확하게  (0) 2019.09.08
제주에서 자바_Week4  (0) 2019.08.12
##자바 헷갈리는 이론  (0) 2019.08.01
제주에서 자바_Week3_3  (0) 2019.07.31
제주에서 자바_Week3_2  (0) 2019.07.30

+ Recent posts