----------------------------------------------
오늘배울내용들 ...
DBCP
FILTER
JSP ACTION TAG들....(오늘못했음)
----------------------------------------------


<DataBase Connection 생성방법>

1. DriverManager -> Class.forName("")
 : 주로 사용않하고 , 연결이 되는지 test할때만 사용.
2. OracleDataSource -> DataSource를 이용하는 방식.
3. DBCP
4. 나중에 iBatis Framework
5. EJB
+알파...(등등 많다)
주로 3,4번이 가장많이사용하니까 잘알아둘것.

*Servers의 servers.xml에서 직접설정.
*reloadable 실무에서는 false 로 되어야한다.

JNDI를 이용한 DataSource 등록
기술문서 :
http://kr.sun.com/developers/techtips/enter_12_24.html
참고만할것.

DataSource를 이용하는데 웹어플리케이션 내에서 DB에
관현 설정을 잡아주면 DB의 IP라던지 계정같은것들이
변했을경우 웹어플리케이션 마다 설정을 잡아줘야한다.

하지만, JNDI를 이용하면 xml파일만 수정하면 모든
application 내의 자원정보를 한번에 수정하는 것이 가능하다.

so, JNDI를 이용한다.


------------------------------------------------
실습 : JNDI
------------------------------------------------

JDBC 설정하기.

1. server.xml Setting

<GlobalNamingResources>
    <Resource name="jdbc/myoracle" auth="Container"
            type="javax.sql.DataSource"
   driverClassName="oracle.jdbc.OracleDriver"
            url="jdbc:oracle:thin:@211.234.53.67:1521:ora9i"
            username="scott" password="tiger" maxActive="20" maxIdle="10"
            maxWait="-1"/>
   
 <Resource auth="Container"
   description="User database that can be updated and saved"
   factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
   name="UserDatabase" pathname="conf/tomcat-users.xml"
   type="org.apache.catalina.UserDatabase"/>  
  </GlobalNamingResources>

//한번 잡아놓고 계속 재사용.
//전역변수처럼 잡아놓는것.

2. server.xml Setting

 <Context docBase="PILOT_PROJECT" path="/pp"
         reloadable="true"
         source="org.eclipse.jst.jee.server:PILOT_PROJECT">
    <ResourceLink global="jdbc/myoracle"
         name="jdbc/myoracle"
         type="javax.sql.DataSource"/>
     </Context>
//지역변수처럼 잡는것.

3. web.xml
: <resource-ref> : 자원 참조값.

<resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 // ㄴ<res-ref-name> -> <ResourceLink>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
 //ㄴ인증방식 : Container :같은 tomcat내에서는 참조가능
 //ps. ejb에서는 서버가 달라도 참조가능하게 할 수 있다.
</resource-ref>

4. Servlet에서

DataSource ds=null;
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
ds = (DataSource)envContext.lookup("jdbc/myoracle");

*JNDI 한번 잡아놓고 더이상 제어하지 않게 하기위해 사용.


getConnection 에서 계정 pass를 넣지 말것.
getConnection에서 계정,password를 넣은경우 Exception 발생
getConnection에서 id/password를 넣는것이 지원되지 않는다 라는 Exception 임.


-------------------------------------------------------------
실습 2 : <load-on-startup>priority</load-on-startup>
   : Servlet load-on-startup 설정.
   : <load-on-startup>1/*priority*/</load-on-startup>
-------------------------------------------------------------
1. common.InitServlet 생성
web.xml
<servlet>
   <servlet-name>init</servlet-name>
   <servlet-class>common.InitServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
 //시작시에 load해라!! Startup할때 load
  </servlet>
 
 2.
 common.InitServlet class생성 후
 public void init() throws ServletException {
  DataSource ds=null;
  System.out.println("init호출");
  try {
   Context initContext = new InitialContext();
   Context envContext  = (Context)initContext.lookup("java:/comp/env");
   ds = (DataSource)envContext.lookup("jdbc/myoracle");
  } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

Ps. ServletContext에 넣어놓고 가져다 사용하도록 해놓는것.
 web.xml에 servlet구성시 load-on-startup tag사용할 경우
 서버가 뜰때 init method를 불러온다.


1. ServletContext 창고 사용법
 ServletContext context = getServletContext();
 context.setAttribute("ds", ds);
 //앞에 ds변수를 ServletContext에 저장.

C.F.) Context.xml에 <Resource ~~/>를 추가하면 모든
  웹어플리케이션에서 사용하는 것이 가능하나
  eclipse버젼에 따라 지원할 수도 안할 수도 있다.
  (server.xml 설정X)
-----------------------------------------------------------

Servlet Filter
실습: 한글처리 - request.setCharacterEncoding("euc-kr");
 : 자동으로 처리되게 하고싶다..
-----------------------------------------------------------

1. Filter 생성 <web.xml>에서 servlet과 비슷함

<filter>
 <filter-name>encfilter</filter-name>
 <filter-class>common.EncodingFilter</filter-class>
</filter>

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

" /* " 은 모든 Servlet을 의미. 모든 Servlet이 참조하게됨.


----------------------------------------------------

Filter의 init()이 먼저 호출됨
다음 Servlet init();<load-on-startup>에 따라 로딩순서가 정해짐/

System.currentTimeMillis(); : return long
현재시간의 milsec을 long type으로 반환

처음은 오래걸리지만 한번뜨고난후에는 계속빠름.

doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
 thorws IOException,ServletException{
 //request.getRequestURI(httpservletRequest)
 HttpServletRequest req = (HttpServletRequest)request;
 //강제로 형변환.
 //형변환이 가능한지 알아보는 instanceof
}

------------------------------------------------------------
------------------------------------------------------------

오늘한것 review

<1>. Database를 Context 에 넣어 놓고 사용하기

1. Context configuration

 1) server.xml
  <GlobalNamingResources>
  <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource"
     driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
              username="scott" password="tiger" maxActive="20" maxIdle="10"
              maxWait="-1"/>
  </GlobalNamingResources>

 2) server.xml
  <Context docBase="Project_Name" path="/ContextPath"
        reloadable="true"
        source="org.eclipse.jst.jee.server:Project_Name">
        
        <ResourceLink global="jdbc/myoracle"
        name="jdbc/myoracle" type="javax.sql.DataSource"/>
       </Context>

2. web.xml configuration

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

3. Code example

 Context initContext = new InitialContext();
 Context envContext  = (Context)initContext.lookup("java:/comp/env");
 DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
 Connection conn = ds.getConnection();
 //etc.

 

<2>. Filter를 사용하여 한글처리.

1. Filter 생성 <web.xml>에서 servlet과 비슷함

<filter>
 <filter-name>encfilter</filter-name>
 <filter-class>common.EncodingFilter</filter-class>
</filter>

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

" /* " 은 모든 Servlet을 의미. 모든 Servlet이 참조하게됨.

* 1) Filter가 가장먼저 실행됨.( filter init()이 먼저 호출됨) 
  2) 다음 Servlet init();

* System.currentTimeMillis(); : return long
  현재시간의 milsec을 long type으로 반환

* java의 장점: 처음은 오래걸리지만 한번뜨고난후에는 계속빠름.

doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
 thorws IOException,ServletException{
 //request.getRequestURI(httpservletRequest)
 HttpServletRequest req = (HttpServletRequest)request;
 //강제로 형변환.
 //형변환이 가능한지 알아보는 instanceof
}


3. 오늘숙제 : 방명록 마무리.(오늘배운것을 사용하여 방명록 만들어보기.)

다른 카테고리의 글 목록

웹 개발/JDBC 기초 카테고리의 포스트를 톺아봅니다