Statement
Statement란 실제 데이터베이스에 SQL문을 보내기 위해 필요한 객체이다. 삽입, 수정, 삭제 제, 검색을 처리하는 DML문을 사용할 때는 이 인터페이스를 사용한다. 이 객체는 Connection 객체의 연결 정보를 가져와서 DB에 접근하므로 이 객체를 사용하기 위해서는 접속 상태인 Connection 객체가 먼저 존재해야 한다. Statement 객체에서 자주 사용되는 메소드는 다음 표와 같다.
executeQuery() 메소드의 경우는 SELECT문을 실행할 때 사용되는데 이 메소드는 ResultSet객체를 반환한다. ResultSet 객체는 SELECT 문을 이용하여 테이블로부터 얻어온 데이터(레코드)를 담고 있는 객체라고 할 수 있는데 executeUpdate() 메소드는 삽입,수정,삭제와 관련된 SQL문 실행에 사용되며 수정된 레코드 수를 반환한다. 만약 두 개의 레코드를 삽입하게 되면 executeQueryUpdate() 메소드는 2를 반환하게 된다. 이렇게 반환하는 값으로 모든 레코드가 정상적으로 등록되었는지도 확일할 수 있다.
그리고 자주 사용된다기보다는 필수적으로 사용해야하는 메소드 중 close()메소드가 있다. 이 메소드는 Statement 객체를 모두 사용한 후 메모리에 반환하기 위해 사용된다. 객체를 사용하지 않을 때 반환해주면 메모리가 낭비되는 것을 막을 수 있다.
PreparedStatement
PreparedStatement 객체가 하는 일은 Statement객체와 비슷하다. PreparedStatement 인어페이스가 Statement 인터페이스를 상속받기 때문이다. Statement와 같이 레코드 조작 및 검색 쿼리를 위한 SQL문을 전달하기 위해 쓰인다. 하지만 PreparedStatement를 이용하게 되면 값 매핑 기능을 사용해서 Statement 인터페이스보다 편리하게 SQL문을 전송할 수 있다.
만약 100개 이상의 레코드를 추가하게 된다면 소스 코드 또한 방대하게 늘어나게 될 것이다. 이때 PreparedStatement 객체를 이용한다면 단 한 줄의 SQL문으로 수많은 레코드를 추가할 수 있다. 또한 Statement 객체로 SQL문을 실행할 때는 SQL문을 실행할 때마다 컴파일 단계를 거치지만 PreparedStatement 객체를 사용하면 객체를 생성할 때만 단 한 번 구문 분석(컴파일)을 거치므로 반복적인 SQL 구문을 실행할 때는 PreparedStatement가 훨씬 효율이 좋다.
//여기서부터 PreparedStatement 예제 작성
- DriverManager Class
DriverManager 클래스는 데이터 원본에 JDBC드라이버를 사용해서 JSP에서 사용할 수 있는 커넥션을 만드는 역할을 한다. DriverManager는 Class.forName() 메소드를 사용해서 생성되며, 이 메소드는 Interface driver를 구현하는 작업을 수행한다.
Class.forName("com.mysql.jdbc.Driver") 메소드의 매개 변수로 "com.mysql.jdbc.Driver"와 같은 특정 드라이버 클래스를 지정하면 자동으로 로딩되어 객체가 생성되고 DriverManager에 등록된다. 드라이버 클래스를 찾지 못할 경우, forName() 메소드는 ClassNotFoundException 예외를 발생시키므로 반드시 예외처리를 해야한다.
// 예외 처리하는 방법 - ClassNotFoundException 사용
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){}
// 또는 Exception 사용
try{
Class.forName("com.mysql.jdbc.Driver");
}catch("Exception e){}
일반적으로 드라이버 클래스들은 로드될 때 자신의 객체를 생성하고, 자동적으로 DriverManager 클래스의 메소드를 호출하여 그 객체를 등록한다.
DriverManager 클래스의 모든 메소드는 static이기 때문에 반드시 객체를 생성시킬 필요가없다. DriverManager 클래스는 Connection 인터페이스를 구현하는 객체를 생성할 때 getConnection() 메소드를 사용한다. getConnection() 메소드 사용시 SQLException 예외를 발생시키므로 반드시 예외 처리를 해야 한다.
try{
Connection conn = DriverManager.getConnection(url,user,pass);
}catch(SQLException e){}
getConnection(url,user,pass) 메소드는 수행 결과로 데이터베이스와 JSP가 연동할 수 Connection 객체를 리턴한다. 이 메소드의 첫 번재 매개 변수 URL은 jdbc:subprotocol:subname과 같은 형태를 갖는 데이터베이스 URL을 기술한다. user는 데이터베이스에 접근할 수 있는 계정명이고 pass는 계정의 패스워드를 말한다.
MySQL의 경우 getConnection("jdbc:mysql://localhost:3306/bascijsp","jspid","jsppass");와 같은 형태를 갖고, 오라클의 경우 DriverManager.getConnection("jdbc:orcle:thin:@localhost:1521:orcl","scott","tiger"); 와 같은 형태를 갖는다.
프로그램을 순서대로 작성시 Class.forName() 메소드 다음에 DriverManager.getConnection() 메소드를 기술한다. 그런데 이들 메소드가 발생시키는 예외가 다르기 때문이에 예외를 각각 기술해서 프로그래밍하면 다음과 같다.
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){}
try{
Connection conn = DriverManager.getConnection(
"jdbc:mysql://loaclhost:3306/basicjsp","jspid","jsppass");
}catch(SQLException e){}
혹시 각각 예외를 기술하는 것이 번거로운 경우 모든 예외를 처리할 수 있는 Exception을 사용해서 한 번에 처리할 수 있다.
try{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/basicjsp","jspid","jsppass");
}catch(Exception e){}
Session
Cookie에서도 그렇듯 상태유지를 위한 특별한 기법이다. 상태유지는 다른페이지로 이동하더라도 그전 페이지의 정보가 유지되어야 하는것을 말한다.
Cookie는 Client의 하드웨어를 이용하여 정보를 저장하였다가 사용함으로서 페이지가 이동하더라도 상태가 유지되는 기술이다. 단, PC방처럼 여러사람이 PC를 공유하는 경우 정보가 유출될 수 있는 단점과 저장할 수 있는 데이터도 1.2MB로 한계가 있다.
이러한 단점을 극복하기 위해 Session을 사용한다.
1) Session
- Session은 Web Browser당 하나씩만 발급된다.
- 쿠키와 달리 웹브라우저에 정보를 보관하는 것이 아니라, 웹 컨테이너에 정보를 보관할 때 사용한다.
- 웹 브라우저의 여러 요청을 처리하는 JSP페이지 사이에서 공유되므로 1:1 매핑되는 값을 저장할 때 사용한다.
- API <-- 클릭
2) 세션 생성
- <@ page session = "true" %>
- session.setAttribute("세션이름", "값");
- page 디렉티브이 session 속성의 기본값은 true이므로 false로 지정하지 않으면 자동생성된다.
Session객체가 제공하는 메소드
1)
리턴값 java.lang.Object
메소드 getAttribute(java.lang.String name) :
세션에 바인딩된 객체중 name에 해당되는 객체 값을 가져온다.없을겨우에는 null을 반환
반환값은 Object형 이므로 반드시 형변환을 하여 사용한다.
2)
리턴값 java.util.Enumeration
메소드 getAttributeNames() :
세션에 바인딩된 모든 객체들의 이름을 Enumeration형으로 되돌려 준다.
서블릿 2.1과 이전 API들의 getValueNames메소드 대신 이것을 사용한다.
3)
리턴값 long
메소드 getCreationTime() :
세션이 만들어진 시간을 반환한다. 반환값은 long형이며 이값은 GMT 시간으로 1970.1.1
자정을 기준으로 단위의 값을 반환한다.
4)
리턴값 java.lang.String
메소드 getId() :
해당 세션을 가리키는 고유 id값을 String 형으로 변환한다.
5)
리턴값 long
메소드 getLastAccessedTime() :
해당 세션이 client가 마지막으로 request를 보낸 시간을 long형으로 반환한다.
반환값은 long형이며 이값은 GMT시간으로 1970.1.1 자정을 기준으로 한 밀리second
단위의 값을 되돌려 준다.
6)
리턴값 int
메소드 getMaxInactiveInterval() :
사용자가 다음 요청을 보낼때까지 세션을 유지하는 최대시간(초 단위)을 반환한다.
7)
리턴값 boolean
메소드 isNew() :
해당 세션이 처음 생성되었으면 true값을 반환하고 이전에 생성이 된 세션이라면 false
를 반환한다.
8)
리턴값 void
메소드 removeAttribute(java.lang.Strng name) :
지정된 이름에 해당하는 객체를 이 세션에서 제거한다. 서블릿 2.1과 이전 API들의
removeValue 메소드 대신 이것을 사용한다.
9)
리턴값 void
메소드 setAttribute(java.lang.String name,java.lang.Object value) :
지정된 이름을 사용하여 이 세션에 객체를 바인딩 시킨다.이전의 putValue메소드 대신 이것
을 사용해야 한다.
10)
리턴값 void
메소드 setMaxInactiveInterval(int interval) :
사용자가 다음 요청을 보낼때 까지 세션을 유지하는 최대시간(초단위)을 설정한다.
이 시간을 넘기면 서블릿 엔진은 세션을 종료한다.
11)
리턴값 void
메소드 Invalidate() :
해당 세션을 없애고 세션에 속해있는 값들을 없앤다.
자료출처 : http://freeair-textcube.blogspot.kr
1. int --> String
int i = 2;
String s = Integer.toString(i);
2. String -> int
String s = "1234";
int i = Integer.parseInt(s);
3. double --> String
double d = 2.34;
String s = Integer.toString(d);
4. String --> double
String s = "2.34";
double d = Double.valueOf(s).doubleValue();
5. float --> String
float f = 0.234F;
String s = Float.toString(f);
6. String --> float
String s = "0.234F";
float f = Float.valueOf(s).floatValue();
7. long --> String
long l = 123456L;
String s = Long.toString(l);
8. String --> long
String s = "123456";
long l = Long.parseLong(s);
9. int --> 16
int i = 12;
String hex = Integer.toHexString(i);
10. 16 --> int
String hex = "ABCD";
int i = Integer.parseInt(hex, 16);
request.getParameter()
메서드는 HTTP요청의 파라미터 값을 얻기 위한 메서드이다.
가령, 로그인 폼에서 ID를 입력하는 <input type="text" name="id">가 있다고 했을때
String input_id = request.getParameter("id")와 같은 방식으로 클라이언트가 입력한
ID값을 받아볼 수 있다.