1
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
cs


jstl 추가


1
2
3
4
5
6
7
8
<c:choose>
    <c:when test="${fn:length(map.movKorName) > 8}">
        <c:out value="${fn:substring(map.movKorName,0,7)}"/>....
    </c:when>
    <c:otherwise>
        <c:out value="${map.movKorName}"/>
    </c:otherwise> 
</c:choose>
cs



'JSP&Servlet' 카테고리의 다른 글

getGeneratedKeys insert후 생성된 행의 키 받아오기  (0) 2017.02.26
커넥션 풀  (0) 2017.02.26
이벤트 리스너(event listener)  (0) 2017.02.26
ServletContext / ServletConfig init-param 차이점  (0) 2017.02.26
필터  (0) 2017.02.26


Oracle


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int staffNo = 0//생성된 행의 키를 받을 변수
String[] keyCol ={"no"}; //키값이 생성되는 컬럼 명
 
            staffPstmt = conn.prepareStatement //쿼리문 세팅
                    ("INSERT INTO STAFF (no,name,sn,graduateday,schoolno,religionno) VALUES"
                            + "(STAFF_SEQ.nextval,?,?,?,?,?)",keyCol);
            staffPstmt.setString(1,staff.getName());
            staffPstmt.setString(2, staff.getSn());
            staffPstmt.setString(3, staff.getGraduateday());
            staffPstmt.setInt(4, staff.getSchool().getNo());
            staffPstmt.setInt(5, staff.getReligion().getNo());
 
            staffRow = staffPstmt.executeUpdate(); //쿼리실행
            rs=staffPstmt.getGeneratedKeys(); //ResultSet 타입으로 결과 받아옴
            if(rs.next()){
                staffNo = rs.getInt(1); 
                //이부분에서 rs.getInt("컬럼명"); 이렇게하면 키값을 불러올수없다.
                //절대로 rs.getInt(1); 이렇게 해야한다.
            }
cs
 


MySql


1
2
3
4
5
6
pstmt = con.prepareStatement("insert into ......", Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if(rs.next()){
    out.println(rs.getInt(1));
}
cs


'JSP&Servlet' 카테고리의 다른 글

jstl 문자열 자르기 조건문  (0) 2017.03.14
커넥션 풀  (0) 2017.02.26
이벤트 리스너(event listener)  (0) 2017.02.26
ServletContext / ServletConfig init-param 차이점  (0) 2017.02.26
필터  (0) 2017.02.26

커넥션풀

여러명의 사용자가 하나의 DB커넥션을 공유하는경우

하나의 데이터베이스의 연결로 요청을 처리하다가 예외가 발생해 롤백한 경우에는

다른 요청에 대해 작업한 내용까지 모두 롤백되는 문제가 있다.

웹 사이트에 접속하는 사용자의수가 많으면 

웹 서버 상에서 동시 실행되는웹 애플리케이션의 수도 아주 많을것이다. 

그런 프로그램들이 동시에 같은 데이터베이스에 연결을 시도하는경우도 많다.

많은 상용DBMS들이 데이터베이스에 동시에 연결할 수 있는 수를 제한하고 있다.

데이터베이스에 대한 연결은 컴퓨터 자원을 상당히 많이 소모하기 때문에 

동시 사용자의 수가 아주 많은 웹 사이트에서는 웹 애플리케이션 프로그램마다 

제각각 데이터베이스로의 연결을 맺는것이 사실상 불가능하다.


커넥션 풀은 이런 문제를 해결하기 위한 장치이다.

여러개의 연결을 미리 맺어놓은 후에 그것을 한데 모아놓고 

웹 애플리케이션이 필요할 때마다 가져가서 사용한 후 반환하는 방식을 풀링 이라 하고

커넥션 객체들을 한데 모아놓고 필요할때 가져가서 사용후 반환하는 장소를 객체 풀 이라 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class DBConnectionPool {
  String url;
  String username;
  String password;
  ArrayList<Connection> connList = new ArrayList<Connection>();
  //커넥션 객체들을 담을 ArrayList 객체 생성
 
  //생성자 메서드
  public DBConnectionPool(String driver, String url, 
      String username, String password) throws Exception {
    //드라이버 클래스의 이름,db연결주소,ID,패스워드를 매개변수로 받고 드라이버를 로드
    this.url = url;
    this.username = username;
    this.password = password;
    
    Class.forName(driver);
  }
  //커넥션 객체 요청시 ArrayList에서 꺼내오는 메서드
  public Connection getConnection() throws Exception {
    if (connList.size() > 0) {//조건1 ArrayList에 커넥션 객체가 존재할경우
      Connection conn = connList.remove(0); 
      //객체풀의 0번인덱스 참조값을 제거하고 참조값이 제거된 해당 인스턴스 반환
      if (conn.isValid(10)) {//조건1-1 해당 객체의 유효성을 검사한다. 매개변수인 10은 대기시간(초)
        return conn;//위의 조건이 일치하다면 커넥션 객체 반환
      }
    }
    //보유한 객체가 없다면 새로운 객체를 생성해 
    return DriverManager.getConnection(url, username, password);
  }
  //객체사용후 돌려주는 메서드
  public void returnConnection(Connection conn) throws Exception {
    connList.add(conn);//매개변수로 받은 커넥션 객체를 ArrayList에 추가
  }
  //데이터베이스와 연결된 모든 커넥션객체들의 연결을 끊는 메서드
  public void closeAll() {
    for(Connection conn : connList) {
      try{conn.close();} catch (Exception e) {}
    }
  }
}
cs


DataSource

DataSource는 javax.sql 패키지에 포함된 인터페이스다. 자체적으로 커넥션 풀의 기능을 구현한다.

DriverManager보다 좋은 방법으로 db의 커넥션을 얻을수 있다.

DataSource는 서버에사 관리하기 때문에 데이터베이스나 JDBC드라이버가 변경되어도 애플리케이션을 바꿀 필요가 없다.

Connection과Statement객체를 풀링할수 있고 분산 트랜잭션을 다룰수 있다.


사용방법

톰캣 폴더의 context.xml 파일을 열고 편집한다. or META-INF/context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Context> 
    <Resource name="jdbc/mysql"
              auth="Container"
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://192.168.123.145:3306/ace
                   ?useUnicode=true&amp;characterEncoding=euckr"
              username="ace"
              password="java0000"
              maxActive="100" 
              maxIdel="30" 
              maxWait="5000"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              closeMethod="close"/>
</Context>
 
cs

 

태그 속성

name : JNDI 이름, 

auth : 자원관리의 주체 지정 Application또는Container 가능

type : 자원의 타입 지정 패키지이름을 포함한 클래스 이름

draverClassName : JDBC드라이버 클래스의 이름(패키지 이름포함)

url : 데이터베이스 커넥션 url

username : 데이터베이스 사용자 이름

password : 데이터베이스 사용자 암호

maxActive : dataSource로부터 꺼낼수있는 커넥션의 최대 개수

maxIdle : dataSource에서 유지할수 있는 사용되지 않는 커넥션의 최대 개수 ,

   최대유지 개수를 넘어서 반납되는 커넥션은 닫아버린다 기본값 8개

maxWait : 발급한 커넥션의 수가 최대값에 도달한 상태에서 커넥션을 달라는 요청이 들어왔을때 

   커넥션 준비를 위해 기다리는 최대 밀리초 최대 밀리초가 지날 때까지 반납되는 커넥션이 없으면 예외를 던진다. 

   기본값은 -1 커넥션 반납시까지 기다림

closeMethod : 톰캣 서버가 종료될 때 자원을 해제하기 위해 호출 close로 지정될경우 자동으로 해제


web.xml 안에 resource-ref 태그 작성

1
2
3
4
5
6
7
8
9
 <web-app>
     <resource-ref>
      <res-ref-name>jdbc/mysql</res-ref-name> <!-- JDNI이름 -->
      <res-type>javax.sql.DataSource</res-type> 
      <!-- 리턴될 자원의 클래스 이름 context.xml에 선언된것과 같아야한다. -->
      <res-auth>Container</res-auth> 
      <!-- 자원 관리의 주체 Container는 서버에서 관리한다는 의미-->
    </resource-ref>
</web-app>
cs


사용방법 예시 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ContextLoaderListener implements ServletContextListener {
  @Override
  public void contextInitialized(ServletContextEvent event) { //웹애플리케이션이 시작될 때 실행되는 메서드
    try {
      ServletContext sc = event.getServletContext(); //Context 객체 가져옴
      
      InitialContext initialContext = new InitialContext();
      //톰캣 서버의 자원을 찾기위한 객체 lookup 메서드로 자원을 찾을수 있다.
      DataSource ds = (DataSource)initialContext.lookup(
          "java:comp/env/jdbc/mysql");
      //매개변수는 자원의 JDNI 이름 리턴데이터타입이 DataSource이기때문에 형변환
      MemberDao memberDao = new MemberDao();
      memberDao.setDataSource(ds); //dao객체에 DataSource 
      
      sc.setAttribute("memberDao", memberDao);
 
    } catch(Throwable e) {
      e.printStackTrace();
    }
  }
 
cs


이벤트 리스너(event listener)란 

웹 컨테이너 안에서 어떤 사건(event)이 일어났을 때자동으로 호출되는 프로그램 이다.

리스너는 서블릿클래스나 필터처럼 자바클래스 형태로 작성하며 

서블릿 규격서에 정해놓은 규칙대로 작성해야한다.

DAO의 경우처럼 여러 서블릿이 사용하는 객체는 서로 공유하는것이 메모리 관리나 실행 속도측면에서 좋다.


리스너의 구현에 사용되는 인터페이스와 이벤트

분류

 이벤트

 인터페이스

 파라미터 타입

 웹 애플리케이션

 시작하거나 종료할 때

 javax.servlet.ServletContextListener

 

 ServlertContext 애트리뷰트의 

 입력 / 수정 / 삭제

 javax.servlet.ServletContextAttributeListener

 javax.servlet.ServletContextAttributeEvent

 세션

 생성,소멸할 때

 javax.servlet.http.HttpSessionListener

 javax.servlet.http.HttpSessionEvent

 활성,비활성 할 때

 javax.servlet.http.HttpSessionActivationListener

 

 HttpSession 애트리뷰트의

 입력 / 수정 / 삭제

 javax.servlet.http.HttpSessionAttributeListener

 javax.servlet.http.HttpSessionBindingEvent

 요청

 요청을 받고 응답할 때

 javax.servlet.ServletRequestListener

 javax.Servlet.RequestEvent

 ServletRequest 애트리뷰트의

 입력 / 수정 / 삭제

 javax.servlet.ServletRequestAttributeListener

 



 

이클립스에서 리스너를 생성할때 이벤트를 선택할수 있다.


세션이 시작되고 끝날 때 호출되는 이벤트 리스너

세션을 시작하거나 끝낼 때 자동으로 호출되는 이벤트 리스너는

javax.servlet.http.HttpSessionListener 인터페이스를 구현하는 클래스로 만들어야하고

public 클래스로 선언해야 한다. 

sessionCreated메서드는 세션이 시작될때 자동으로 호출되는 메서드이고

sessionDestroyed 메서드는 세션이 종료될 때 자동으로 호출되는 메서드이며

javax.servlet.http.HttpSessionEvent타입의 매개변수를 받고 리턴타입 void인 public 메서드로 선언해야 한다.


1
2
3
4
5
6
7
8
9
10
public class MyListener implements HttpSessionListener {
 
    public void sessionCreated(HttpSessionEvent se)  { 
        //세션이 시작될때 실행될 코드를 기술하는 부분
        HttpSession session = se.getSession(); //세션 객체를 가져오는 메서드
    }
    public void sessionDestroyed(HttpSessionEvent se)  { 
        //세션이 종료될때 실행될 코드를 기술하는 부분
    }
}
cs


파라미터로 넘어온 객체에 대해 getSession 메서드를 호출하면 해당 세션의 Session 객체를 얻을수 있다.


1
2
3
4
5
<web-app>
    <listener>
        <listener-class>listenerPack.MyListener</listener-class>
    </listener>
</web-app>
cs

리스너를 web.xml파일에 등록한다.



웹 애플리케이션의 시작과 종료 시점에 호출되는 리스너

1
2
3
4
5
6
7
8
9
10
public class ContextLoaderListener implements ServletContextListener {
 
    public void contextInitialized(ServletContextEvent sce)  { 
        //웹 애플리케이션이 시작될 때
    }
    
    public void contextDestroyed(ServletContextEvent sce)  { 
        //웹 애플리케이션이 종료될 때
    }
}
cs


'JSP&Servlet' 카테고리의 다른 글

getGeneratedKeys insert후 생성된 행의 키 받아오기  (0) 2017.02.26
커넥션 풀  (0) 2017.02.26
ServletContext / ServletConfig init-param 차이점  (0) 2017.02.26
필터  (0) 2017.02.26
ServletContext 객체  (0) 2017.02.26

ServletContext 매개변수는 웹 어플리케이션 전역에서 사용할수 있다.


선언

1
2
3
4
5
6
<web-app>
    <context-param>
        <param-name>contextParam</param-name>
        <param-value>paramtest</param-value>
    </context-param>
</web-app>
cs



사용방법

1
2
3
ServletContext context = this.getServletContext();
String admin = context.getInitParameter("contextParam");
System.out.println(admin);
cs

ServletContext 타입 변수를 선언하고 서블릿 클래스가 상속받은클래스인 

HttpServlet 로부터 상속받은 getServletContext() 메서드를통해 생성한다.

ServletContext 타입의 객체가 가지고있는 getInitParameter(); 메서드를 통해 

Context에 저장되어 있는 변수를 얻어올수 있다.


ServletConfig 매개변수는 변수가 선언된 해당 서블릿에서 사용할수 있다.


선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<web-app>
    서블릿에서의 선언
    <servlet>
           <servlet-name>TestServlet</servlet-name>
           <servlet-class>com.servlets.TestServlet</servlet-class>
           <init-param>
           <param-name>test</param-name>
           <param-value>test</param-value>
           </init-param>
    </servlet>
 
    필터에서의 선언
    <filter>
        <filter-name>Filter</filter-name>
        <filter-class>com.filters.FilterTest</filter-class>
        <init-param>
            <param-name>test</param-name>
            <param-value>test</param-value>
        </init-param>
    </filter>
</wev-app>
cs


서블릿에서의 사용방법


1
String test = getInitParameter("test");
cs

서블릿에서는 서블릿이 GenericServlet를 상속받는클래스이므로 

getInitParameter(); 메서드를 메서드의 이름만으로 호출이 가능하다.


필터에서의 사용방법


필터에서 사용할 때는 클래스의 멤버변수로 FilterConfig 타입 변수를 선언하고

init메서드를 통해 매개변수로 들어온 config를 멤버변수에 대입한다.

1
2
3
4
5
6
7
8
public class CharacterEncodingFilter implements Filter{
    FilterConfig config;
    
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
}
cs

 

FilterConfig타입 참조변수의 getInitParameter() 메서드를 통해 값을 얻는다.

1
String test = config.getInitParameter("test");
cs


'JSP&Servlet' 카테고리의 다른 글

커넥션 풀  (0) 2017.02.26
이벤트 리스너(event listener)  (0) 2017.02.26
필터  (0) 2017.02.26
ServletContext 객체  (0) 2017.02.26
서블릿의 초기화 파라미터 / init-param  (0) 2017.02.26

필터(filter)란 글자 그대로 여과기 역할을 하는 프로그램 이다.

여러 웹 컴포넌트에 대해 똑같은사전작업이나 사후작업을 해야할 경우에 사용한다.

ex 로그인 여부 체크

이 프로그램은 자바 클래스 형태로 구현한다. 이 클래스를 필터 클래스 라고 한다.


필터클래스를 작성할 때는 서블릿 규격서에 정해져 있는 규칙을 지켜서 작성해야 한다.

가장 중요한 규칙은 javax.servlet.Filter 인터페이스를 구현해야 한다.


Filter 인터페이스에는 3개의 메서드가 있다.

doFilter() - 웹브라우저가 컨테이너로 요청을 보냈을 때 호출되는 메서드

사전작업과 사후작업을 이 안에 구현해야 한다.

init(),destory() - 서블릿클래스의 init과destory와 같은역할


doFilter()메서드 작성방법

모든 필터 클래스에는 공통적으로 기술해야 하는 명령문이 있다.

웹 컴포넌트를 호출하는 명령문이다. 이 명령문은 doFilter 메서드의 파라미터를 이용해서 만든다.

doFilter메서드에는 세개의 파라미터가 있다. 이 파라미터들의 값은 모두 웹 컨테이너가 필터로 넘겨주는것이다.

ServletRequest request, ServletResponse response 이 파라미터는 요청객체와 응답 객체이다.

필터가 없다면 이 두 객체는 웹 컨테이너가 웹 컴포넌트로 직접 넘겨줬겠지만 필터가 존재하면 

이 메서드로 전달된다.


세번째 파라미터는 FilterChain chain 이다 이 파라미터는 웹 컴포넌트 호출시에 가장 중요하다.

하나의 웹 컴포넌트에 대해 여러개의 필터가 실행될수 있다. 

정해놓은 순서에 따라 첫번째 필터가 두번째 필터를 호출하고 두번째 필터가 세번째 필터를 호출하고

세번째 필터는 웹 컴포넌트를 호출하는 식으로 진행되어 브라우저로 응답이 도달한다. 이것을 필터 체인이라고 한다.

웹 컨테이너는 필터가 실행되기 전에 필터 체인에 대한 정보를 수집해서 FilterChain객체로 만든 다음

doFilter메서드로 전달한다. 이객체는 필터 체인의 다음번 멤버를 호출할 때 필요하다.


1
2
3
4
5
6
7
8
9
10
public void doFilter
    (ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException 
{
    System.out.println("사전작업 기술");
    request.setCharacterEncoding("euc-kr");//한글인코딩 필터에서 처리
    chain.doFilter(request, response);
    System.out.println("사후작업 기술");
}
 
cs
 

필터클래스 작성 후에는 web.xml 파일에 등록해야한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<web-app>
    <filter><!--필터 등록 엘리먼트  -->
        <filter-name>filter-ex</filter-name><!--필터이름 지정 -->
        <filter-class>cafe.jjdev.FilterEx</filter-class><!--필터클래스이름 패키지위치까지 기재-->
    </filter>
    <!--1개의 웹 컴포넌트에 필터 적용시-->
    <filter-mapping>
        <filter-name>filter-ex</filter-name><!-- 매핑할 필터의 이름 -->
        <servlet-name>test-Servlet</servlet-name><!--필터를 적용할 컴포넌트의 이름  -->
        <!--같은 웹 애플리케이션 디렉터리 내의 모든 웹 컴포넌트에 필터 적용시-->
        <url-pattern>/*</url-pattern>
        <!--같은 웹 애플리케이션 디렉터리 내의 모든 jsp 페이지 내에 필터 적용시  -->
        <url-pattern>*.jsp</url-pattern>
        <!--특정 경로명으로 시작하는 모든 웹 컴포넌트에 필터 적용시-->
        <url-pattern>/board1</url-pattern>
    </filter-mapping>
</web-app>
cs



서블릿 클래스나 JSP 페이지의 환경에 관련된 정보는 javax.servlet.ServletContext 인터페이스 타입의 객체를 이용하여 얻는다.

서블릿 클래스에서 이 타입의 객체를 구하기 위해서는 getServletContext 라는 메서드를 호출하면 된다.

이 메서드는 모든 서블릿 클래스의 상위클래스인 javax.servlet.GenericServlet 클래스에 속하므로 메서드 이름만으로 호출할수 있다.


1
ServleContext context = getServletContext();
cs

 

getServletContext() 메서드는 ServletContext 객체를 리턴한다.

이메서드가 리턴한 객체를 이용하면 Servlet 인터페이스에 속하는 여러가지 메서드를 호출할수 있다.


1
String str = context.getServletInfo();
cs
 


getServletInfo() 메서드는 서블릿이 속하는 웹 서버의 종류를 리턴한다.


1
2
3
4
int num1 = context.getMajorVersion()
 
int num1 = context.getMinorVersion()
 
cs

 

getMajorVersion 과 getMinorversion 메서드는 웹 컨테이너가 지원하는 서블릿 규격의 메이저 버전과 마이너 버전을 리턴한다.

서블릿의 초기화 파라미터란 서블릿의 초기화 작업에 필요한 데이터를 의미한다.


서블릿의 초기화 파라미터는 web.xml 파일에 기재한다.

서블릿의 등록에 사용되는 <servlet> 엘리먼트 안에 <init-param>이라는 서브 엘리먼트를 추가하고

그안에 <param-name>과<param-value>라는 서브 엘리먼트를 기술한다.

그 두 서브엘리먼트 안에 각각 파라미터의 이름과 값을 적는다.


1
2
3
4
5
6
7
8
<servlet>
    <servlet-name>agreement-servlet</servlet-name>
    <servlet-class>AgreementServlet</servlet-class>
    <init-param>
        <param-name>파라미터 이름</param-name>
        <param-value>파라미터의 값</param-value>
    </init-param>
</servlet>
cs
 


서블릿에는 두개 이상의 초기화 파라미터를 넘겨줄수도 있다.

그렇게 하려면 <servlet>엘리먼트 안에 위와 같은 형태의 <init-param>엘리먼트를 여러개 쓰면 된다.


서블릿 클래스 안에서 이 초기화 파라미터 값을 가져오려면 getInitParameter 이라는 메서드를 이용한다.

이메서드는 서블릿클래스의 상위 클래스인 javax.servlet.GenericServlet 에 속하므로 메서드 이름만 가지고 호출할수있고

초기화 파라미터의 이름을 파라미터로 넘겨줘야 한다 그렇게 하면 이 메서드는 그 이름에 해당하는 초기화 파라미터의 값을 리턴한다.


1
String filename = getInitParameter("FILE_NAME");
cs

필터에서 사용하는경우 메서드 앞에 config. 붙여야한다.



'JSP&Servlet' 카테고리의 다른 글

필터  (0) 2017.02.26
ServletContext 객체  (0) 2017.02.26
서블릿 클래스의 init 메서드/destroy 메서드  (0) 2017.02.26
서블릿 클래스에서 세션 사용하기  (0) 2017.02.26
include  (0) 2017.02.26

+ Recent posts