다연이네

[days10] 프로젝트 초기 환경설정과 MVC 다시 정리 본문

JSP

[days10] 프로젝트 초기 환경설정과 MVC 다시 정리

 다연  2021. 1. 7. 22:25
반응형


방명록을 MVC 패턴으로 구현하는 과정 적기
"방명록 목록"을 클릭했을때 웹페이지(list. jsp)가 보여지기까지


 환경구축
 0.  JDK + Eclipse + WAS + Oracle + Developer 설치
 
 1.  Dynamic Web Project : jspPro


 2.  WEB-INF > lib > 라이브러리 추가 
     ㄱ.  ojdbc6. jar
     ㄴ.  jstl-1. 2. jar (JSTL)
     ㄷ.  tomcat dbcp. jap (DBCP)
     
 3.  DBCP 설정
     ㄱ.  MATA-INF > context. xml

<?xml version="1.0" encoding="UTF-8"?>
	<Context>
		<Resource 
		name="jdbc/myoracle" 
		auth="Container"
		type="javax.sql.DataSource" 
		driverClassName="oracle.jdbc.OracleDriver"
		url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
		username="scott" 
		password="tiger" 
		maxTotal="20" 
		maxIdle="10"
		maxWaitMillis="-1"/>
	</Context>


     ㄴ.  web. xml

 <resource-ref>
		<description>Oracle Datasource example</description>
		<res-ref-name>jdbc/myoracle</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
</resource-ref>


     ㄷ.  com. util 패키지 만들어  ConnectionProvider

package com.util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
			
public class ConnectionProvider {
			
	public static Connection getConnection() 
			throws NamingException, SQLException {
				
			Context initContext = new InitialContext();
			Context envContext  = (Context)initContext.lookup("java:/comp/env");
			DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
			Connection conn = ds.getConnection();
					 
				return conn;
	}	
}


     
 4.  Filter 설정 
     ㄱ.  com. filter 패키지 생성해 

package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
			
public class CharacterEncodingFilter implements Filter {
			
	@Override
	public void destroy() {
	}
			
	@Override
	public void doFilter(
			ServletRequest request, ServletResponse response
			, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(this.encoding);
		chain.doFilter(request, response); //다음 필터 이동
	}
			
	private String encoding;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
					
		this.encoding= filterConfig.getInitParameter("encoding");
		if(this.encoding==null) this.encoding = "UTF-8";
		}
}


 ㄴ.  web. xml 필터 설정

<filter> 
	<filter-name>EncodingFilter</filter-name>
	<filter-class>com.filter.CharacterEncodingFilter</filter-class>
	<init-param>
	  <param-name>encoding</param-name>
	  <param-value>UTF-8</param-value> 
	</init-param>
</filter>

<filter-mapping>
	<filter-name>EncodingFilter</filter-name>
	<url-pattern>/*</url-pattern> 
</filter-mapping>

   
  
   ------------환경구축-------------
   
   
 5.  WebContent > days09 > guestbook 
                                               ㄴimages
                                               ㄴjs
                                               ㄴcss  등
                                                       ㄴ ex03.jsp <a>방명록 목록 요청</a>

 6.  MVC 패턴(모델2 구조)
 7.  컨트롤러(서블릿) - 모든 클라이언트의 요청을 받아 처리의 중앙에서 흐름을 제어
      list. do라는 요청이 들어오면 이를 처리하는 1모델 객체를 찾아 2일을 시켜 3결과값을 받아 4뷰가 응답하도록 함
       ㄱ.  서블릿 ControllerUsingURI.java
           1) guestbook > commandHandler.properties 설정파일
                  list. do -> 어떤 Model (Handler. java)
           2) ControllerUsingURI.init(){
                  commandHandlerMap. put("url", 생성된 실제 모델 객체);
                }
           3) doGet() or doPost() (doPost()도 doGet()을 호출하도록 설정)
                1.  URI 분석 : ~~list. do 요청이 들어왔다면
                2.  commandHandlerMap.get(url) url을 key값으로해서 실체 저리할 핸들러(모델)객체를 얻어온다. 
                3.  GetMessageListHandler
                       request.setAttribute("list",list);
                       request.setAttribute("pageBlock",pageBlock);
                       위처럼 2개 넘기지 말고
                       MessageListView viewData;
                       request.setAttribute("viewData", viewData); 
                       이렇게 하나만 넘기자 (하나의 클래스에 담아서 넘기면 편리할테니)
                       return "list. jsp" :  View페이지 경로 (return 값이 String인 이유?)
           4) CommandHandler 인터페이스
                1.  return값이 String인 process()
                    왜 return 값이 String인지 이해하고 나중에 객체로 바꿀 수 있어야 함
           5)NullHandler 클래스 
      ㄴ.  서블릿 등록(web.xml) - url패턴 *. do => 모든 확장자가 do면 컨트롤러가 모든걸 제어한다
                       요청이 없어도 서버 start시 자동으로 올려놓기 위해 <load-on startup>1</load-on startup>       
                  
  8.  핸들러(모델 객체)는 자기가 일을 처리하는 것이 아니라 핸들러 안에서 (엄밀히 따지면 프로세스 메소드 안에서)
       Service클래스를 만들었다.  (일 처리 위해)
      GetMessageListHandler.process()->GetMessageListService싱글톤(트랜잭션 처리, 로그 처리 등을 이 안에서 하려고)
      GetMessageListService
           ㄴ getMessageList()  return값이 ArrayList<Message>가 아니라
                                                       MessageListView
                                                                                    >dao.selectCount()
                                                                                    >dao.selectList()
 9.  Message(DTO)   
 10.  MessageListView 클래스 : ArrayList<Message> + 페이징 처리 필드
 11.  MessageDao 클래스 : 싱글톤     
 12.  ServiceException 사용자 예외 클래스 db에서 예외가 발생시 위로 계속 떠넘기기
                                 dao 예외 -> 서비스(부모)로 떠넘기기 -> 서비스에서 try~catch로 잡아서 사용자 정의 예외 객체로 보내기
 13.  com.util.JDBCUtil : rs, stmt, con close할 때 try~catch 묶어야 하는 것 쉽게 하도록 만듦 + rollback
 

 

반응형
Comments