필터는 서블릿 실행 전, 후에 어떤 작업을 하고자 할 때 사용한다. 서블릿이 실행되기 전에 필요한 자원을 미리 준비하거나, 설정해둔 것들을 필터를 통해 처리할 수 있다. 필터의 또 좋은 점은 이런 코드들이 산발되어있으면 유지보수 시 모든 파일을 건드려야 하는데, 하나의 필터로 관리함으로써 관리하기가 쉬워진다. 그래서 필터를 사용하는 것이다.
package peachy.util.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 EncodingFilter implements Filter {
private String encoding;
protected FilterConfig filterConfig;
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
}
/*
* HttpServletRequest 객체에 web.xml에서 전달된 문자 인코딩을 설정하는 메소드.
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException,ServletException {
if(request.getCharacterEncoding()==null) {
if(encoding!=null) {
request.setCharacterEncoding(encoding);
}
}
chain.doFilter(request,response);
}
/*
* web.xml에서 전달된 인코딩 값을 초기화하는 메소드
*/
public void destroy() {
this.encoding=null;
this.filterConfig=null;
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void setFilterConfig(FilterConfig filterConfig) {
this.filterConfig=filterConfig;
}
}//end of class
WEB-INF>New>Other
를 눌러준다.<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>HelloPj</display-name>
<description>Welcome to HelloPj</description>
<filter>
<filter-name>Encoding Filter</filter-name>
<filter-class>peachy.util.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
DataBase Connection Pool
의 약자로 DB와 커넥션을 맺고 있는 객체를 관리하는 역할
커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 그만큼 어플리케이션의 실행 속도가 빨라지며, 또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다.
DBCP는 WAS가 실행되면서 미리 일정량의 DB Connection 객체를 생성하고 Pool이라는 공간에 저장한다. 저장된 DB Connection 객체는 요청에 따라 필요할 때마다 Pool에서 가져다 쓰고 반환할 수 있다. 따라서 요청할 때마다 DB Driver에 로드하여 물리적인 Connection 객체를 생성하는 비용이 줄어들어 앞서 말한 문제를 해결할 수 있게 된다.
pool과 dbcp는 같은 역할을 하지만 만드는 주체가 다른 것이다. pool은 개발자가 설계한 클래스로 하는 것이고, dbcp는 tomcat(각자 쓰는 서버에 따라 다름) container에 의해 만들어지는 것이다.
server.xml
Context를 보면 아무것도 건드리지 않는다는 가정 하에 하단 이미지처럼 되어있다.<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:JAVA"
username="servlet" password="java" maxTotal="20" maxIdle="10"
maxWaitMillis="-1"/>
4. 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>
New>JSP File
로 불러준다.<%@ page language="java" contentType="text/html; charset=utf-8"
import="javax.naming.*, javax.sql.*, java.sql.*"%>
<div style="max-width:1024px;margin:0 auto;text-align:center;">
<h2>Connection Obj from DBCP</h2>
<%
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection con = ds.getConnection();
%>
생성된 con: <%=con.hashCode() %>
</div>
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HelloPj Index</title>
</head>
<body>
<div style="text-align:center">
<h1>HelloPj Index</h1>
<p>
<a href="hello_dbcp.jsp">DBCP 테스트</a><br>
</p>
</div>
</body>
</html>
127.0.0.1:8080/HelloPj/hello_dbcp.jsp
로 들어가서 잘 되는 지 확인하면 끝!
피치님거 참고하면서 공부 많이 해요~ 감사합니다^^