CallableStatement

Java / Jsp 2010/01/11 13:17
출처 반박자느리게BUT정확히 | naomi007
원문 http://blog.naver.com/naomi007/10017208097

CallableStatement는 SQL의 스토어드프로시저(Stored Procedure)를 실행시키기 위해 사용되는 인터페이스 입니다. 그럼 스토어드프로시저란 무엇일까요? 간단히 알아보면, query문을 하나의 파일 형태로 만들거나 데이터베이스에 저장해 놓고 함수처럼 호출해서 사용하는 것입니다. 이것을 이용하면 연속되는 query문에 대해서 매우 빠른 성능을 보이며, 여기서는 다루지 않지만 보안문제의 해결 등 상당한 이점이 있으니 개인적으로 DB책을 보고 공부할만할 가치가 충분히 있다고 생각합니다.

 

그럼 우리가 프로그래밍 하는 데는 또 무슨 이익이 있을까요? 위와 같은 실행능력 향상 외에 자바코드에 query문이 들어 가지 않으므로 자바 코드가 간결해지고 SQL에 독립적이 된다는 것입니다. 결코 그냥 지나칠 수 없는 부분이겠죠?.

 

스토어드프로시저로 값을 받아오려면, 호출하기에 앞서 반드시 CallableStatement인터페이스의 registerOutParameter()메서드를 호출해야 합니다. 이 인터페이스는 PreparedStatement 인터페이스로부터 상속 받았기 때문에 setXXX()메서드를 사용할 수 있습니다. 그럼 간단한 통해서 예제를 CallableStatement를 이용한 스토어드프로시저의 느낌을 알아 보겠습니다.

 

CallableStatementTest.java(CallableStatement 예제)

import java.sql.*;

public class CallableStatementTest{

   public static void main(String[] args){

       try{

          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

          Connection con = DriverManager.getConnection("jdbc:odbc:dbdsn", "id", "password");

          CallableStatement cs = con.prepareCall("{call myStoredProcedure(?,?,?)}");

          cs.setInt(1,2);

          cs.registerOutParameter(2, java.sql.Types.VARCHAR);

          cs.registerOutParameter(3, java.sql.Types.INTEGER);

          cs.execute();

          System.out.println("*name : "+ cs.getString(2) +"*age : "+ cs.getInt(3));

          cs.close();

          con.close();

       }catch(Exception e){System.out.println(e);}

   }

}

C:\JavaExample\19>javac CallableStatementTest.java

C:\JavaExample\19>java CallableStatementTest

*name : Jabook    *age : 2

 

MS-SQL에서의 스토어드프로시저 myStoredProcedure 작성구문

CREATE PROCEDURE  myStoredProcedure

   @age  int

,   @na varchar(20)  OUTPUT

,   @ageo int           OUTPUT

AS

SELECT  @na = name, @ageo = age  FROM mytest

Where age = @age

 

예제를 보시면 Java의 코드에는 SQL의 query문이 들어가 있지 않은 것을 아실 것입니다. 그리고 위에 정리해 놓은 것처럼, SQL서버 자체에 스토어드프로시저를 작성하여 query를 작성해 놓았습니다. 위에서 골뱅이(@)가 붙은 것들이 매개변수이고 그 중에서도 뒤에 OUTPUT이라고 붙은 것들이 리턴 될 값들입니다. 

 

CallableStatement객체 cs를 생성하여 프로시저를 호출하기 위한 prepareCall()메서드를 사용하고 있습니다. 여기서 물음표(?)가 프로시저로 전달되고 받아올 매개변수인 것입니다.

 

n         CallableStatement cs = con.prepareCall("{call myStoredProcedure(?, ?, ?)}");

 

 setXXX()메서드를 이용하여 프로시저에 사용할 인자값을 넣어주게 됩니다. 그리고 리턴되는 값들을 받아야 겠죠. 일반 메서드와 달리 여러 개의 인자값을 받을 수 있습니다. 이때 스토어드프로시저에서 넘어오는 값을 얻기 위해서 registerOutParameter()메서드를 이용하여 반환되는 값들을 셋팅하게 됩니다.

 

n         cs.setInt(1,2);

n         cs.registerOutParameter(2, java.sql.Types.VARCHAR);

n         cs.registerOutParameter(3, java.sql.Types.INTEGER);

 

반환되는 값을 얻기 위해서는 CallableStatement를 실행한 후 다음과 같이 반환값을 얻어 낼 수 있습니다.

 

n         cs.execute();

n         System.out.println("*name : "+ cs.getString(2) +"*age : "+ cs.getInt(3));

 

정리해 보자면, 이렇게 CallableStatement인터페이스는 데이터베이스의 스토어드프로시저를 호출하기 위해 prepareCall()메서드를 이용하여 CallableStatement객체를 생성합니다. 그 prepareCall()메서드는 Connection인터페이스의 메서드입니다. 스토어드프로시저를 실행하기 전에 받아올 값에 대비하기 위해서 registerOutParameter()메서드를 사용하는 것도 명심해야 할 점입니다.

 

 

☞ Callable

   Statement

데이터베이스의 스토어드프로시저를 실행시키기 위해 사용되는 메서드.

스토어드프로시저를 사용하면 속도, 코드의 독립성, 보안성등의 다양한 이점을 얻을 수 있다.

 

CallableStatement인터페이스 주요 메서드

public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException : 프로시저로 받아온 값을 JDBC타입으로 등록합니다. 모든 받아온 값은 반드시 이 과정을 거쳐야 합니다. 대표적인 sqlType을 알아보면 NULL, FOLAT, INTEGER, DATE등이 있습니다.

 

*PreparedStatement클래스를 상속하므로 getXXX()등, PreparedStatement가 가지고 있는 메서드를 사용할 수 있습니다.

출처 : Tong - Gayoon님의 프로그래밍통

===================================================================================================================


7. CallableStatement



7.1 개요
CallableStatement 객체는 모든 DBMS들에 대한 표준방법으로 저장 프로시져(stored procedure)를 호출하는 방법을 제공한다.
저장 프로시져를 데이터베이스에 저장하고, 저장 프로시져의 호출은 CallableStatement 객체를 사용한다.
이러한 호출은 두가지 형태중의 하나인 escape 문법으로 작성되어진다.
즉, 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태.(escape 문법에 대한 내용은 4장 "Statement"를 찹조해라). OUT 매개변수의 종류인 결과 매개변수는 저장 프로시져에 대한 리턴값이다.
두 형태 모두 입력(IN 매개변수), 출력(OUT 매개변수) , 또는 둘다(INOUT 매개변수)를 위해 사용되어지는 매개변수의 변수 번호를 가질 것이다.
?는 매개변수의 위한 저장위치로 취급된다.

JDBC에서 저장 프로시져를 호출하기 위한 문법은 아래와 같다. "[ ]"내의 내용은 선택적이다.

        {call procedure_name[(?, ?, ...)]}
결과 매개변수를 리턴하는 프로시져를 위한 문법은 다음과 같다.:

        {? = call procedure_name[(?, ?, ...)]}
매개변수가 없는 저장 프로시져를 위한 문법은 다음과 같을 것이다. :

        {call procedure_name}



보통, CallableStatement 객체를 생성하는 사람은 이미 사용하는 DBMS가 저장 프로시져를 지원하고 그러한 프로시져들이 있는 곳을 안다는 것이다.
그러나 검사할 필요가 있다면, 다양한 DatabaseMetaData 메쏘드들을 사용하여 정보를 얻는다.
예를 들어, supportsStoredProcedures 메쏘드는 DBMS가 저장 프로시져 호출을 지원하면 true를 리턴하며, getProdedures 메쏘드는 유효한 저장 프로시져의 설명을 리턴한다.

CallableStatement는 일반적으로 SQL문들을 처리하는 Statement 클래스를 상속받고, 또한 IN 매개변수를 처리하는 PreparedStatement 메쏘드들을 상속받는다.
CallableStatement에 정의된 모든 메쏘드들은 OUT 매개변수들이나 INOUT 매개변수의 출력쪽을 처리한다.
즉, 이러한 메쏘드들은 OUT 매개변수의 SQL형들을 등록하거나, 그것들로부터 값들을 검색하거나, 리턴된 값이 SQL NULL 인지를 검사한다.


7.1.1. CallableStatement 객체 생성하기

CallableStatement 객체는 Connection의 prepareCall 메쏘드에 의해 생성된다.
아래의 예제는 저장 프로시져 getTestData의 호출을 포함하는 CallableStatement의 인스턴스를 만든다.
이것은 두 개의 인자들을 가지고 있고 결과 매개변수는 없다.:

        CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
? 위치가 IN, OUT, 또는 INOUT 매개변수인지는 저장 프로시져 getTestData에 의존한다.


7.1.2 IN/OUT 매개변수들

CallableStatement객체로 IN 매개변수를 넘겨주는 것은 PreparedStatement로부터 상속받은 setXXX 메쏘드이다.
넘겨질 값의 데이터형은 사용할 setXXX 메쏘드를 결정한다.(setFloat는 float 값을 넘겨준다.등등)

만약 저장 프로시져가 OUT 매개변수를 리턴한다면, 각 OUT 매개변수의 SQL형은 CallableStatement 객체를 실행할 수 있기 전에 등록되어져야 한다.(이것은 몇몇 DBMS들이 SQL형을 필요로 하기 때문에 필요하다.)
SQL형을 등록하는 것은 registerOutParameter 메쏘드를 사용한다.
그리고나서 SQL문이 실행되어진 다음에, CallableStatement의 getXXX 메쏘드는 매개변수 값을 검색한다.
사용하는 정확한 getXXX 메쏘드는 그 매개변수를 위해 등록되어진 SQL에 상응하는 자바형이다.(SQL형들을 자바형들로의 표준 매핑은 8.5.1장의 테이블에서 보여준다.)
바꾸어말하면, registerOutParameter는 SQL형을 사용하고(데이터베이스가 리턴할 SQL형과 매칭하기위해서), getXXX는 이것을 자바형으로 캐스트(cast)한다.

다음의 코드는 OUT 매개변수들을 등록하고, cstmt에 의해 호출되는 저장 프로시져를 실행하고, 그런다음 OUT 매개변수들내에서 리턴된 값을 검색한다.
getByte 메쏘드는 첫 번째 OUT 매개변수로부터 자바 byte를 검색하고, getBigDecimal은 두 번째 OUT 매개변수로부터 (소수점 뒤에 세 개의 숫자를 가진) BigDecimal 객체를 검색한다.:

        CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
        cstmt.registerOutparameter(1, java.sql.Types.TINYINT);
        cstmt.registerOutparameter(2, java.sql.Types.DECIMAL, 3);
        cstmt.executeQuery();
        byte x = cstmt.getByte(1);
        java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);
ResultSet와는 달리, CallableStatement는 점진적으로 큰 OUT값들을 검색하기 위한 특별한 메카니즘을 제공하지 않는다.


7.1.3 INOUT 매개변수들

출력을 받아들이고 입력도 공급하는 매개변수(INOUT 매개변수)는 PreparedStatement로부터 상속받은 적당한 setXXX메소드의 호출외에 registerOutParamter 메쏘드의 호출을 요구한다.
setXXX메쏘드는 매개변수의 값을 입력 매개변수로 설정하고 registerOutParameter는 그것의 SQL형을 출력 매개변수로 등록한다.
setXXX 메쏘드는 드라이버가 SQL 값으로 변환된후에 데이터베이스로 전송할 자바 값을 제공한다.
이 IN값의 SQL형과 registerOutParameter 메쏘드에 공급되어지는 값은 같아야만한다.
그런다음 출력값을 검색하기위해서, 상응하는 getXXX 메쏘드를 사용한다.
예를 들어, 자바형이 byte인 매개변수는 입력값을 할당하기위해서 setByte 메쏘드를 사용하고, TINYINT를 registerOutParameter의 SQL형으로 공급하고, 출력값을 검색하기위해서 getByte를 사용해야한다.
(자세한 내용은 8장 "SQL과 자바형들을 매핑하기"를 참조해라)


다음의 예제는 유일한 매개변수로 INOUT 매개변수를 가지고 있는 저장 프로시져 reviseTotal이 있다는 것을 가정한다.
setByte 메쏘드는 매개변수를 25로 설정하며, 이것은 드라이버가 SQL TINYINT로써 데이터베이스에 전송할 것이다.
그런다음 registerOutParameter는 SQL TINYINT로써 매개변수를 등록한다.
저장 프로시져가 실행된 후에, 새로운 SQL TINYINT 값을 리턴하고, getByte 메쏘드는 이 새로운 값을 자바 byte로 검색할 것이다.

        CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
        cstmt.setByte(1, 25);
        cstmt.registerOutparameter(1, java.sql.Types.TINYINT);
        cstmt.executeUpdate();
        byte x = cstmt.getByte(1);



7.1.4 결과후에 OUT Parameter 검색

몇몇 DBMS들에 있는 제한 때문에, 최대이식성을 위해서 CallableStatement 객체의 실행에 의해 생성된 모든 결과들은 OUT 매개변수들이 CallableStatement.getXXX 메쏘드를 사용하여 검색되기전에 검색되어져야한다.

만약 CallableStatement 객체가 다중 ResultSet 객체들을 리턴한다면(execute 메쏘드 호출을 이용하여), 모든 결과들은 OUT 매개변수를 검색하기전에 검색되어질 것이다. 이러한 경우에, 모든 결과들이 접근되어지는 것을 확인하기위해서, Statement 메쏘드들 getResultSet, getUpdateCount, 그리고 getMoreResults는 더 이상의 결과가 없을때까지 호출되어져야한다.

이것을 실행한후에, OUT 매개변수들로부터의 값들은 CallableStatement.getXXX 메쏘드들을 사용하여 검색될 수 있다.


7.1.5 OUT 매개변수들로써 NULL 값들을 검색하기

OUT 매개변수로 리턴되는 값은 SQL NULL일 것이다. 이러한 것이 발생했을 때, SQL NULL 값은 getXXX 메쏘드에 의해 리턴된 값이 getXXX 메쏘드 형에 의존하여 null, 0 또는 false가 되도록 변환되어져야 한다.
ResultSet 객체에서 처럼, 0 또는 false값이 원래 SQL NULL인지 알 수 있는 유일한 방법은 wasNull 메쏘드를 가지고 검사하는 것이다.
wasNull 메쏘드는 getXXX 메쏘드에 의해 읽은 마지막 값이 SQL NULL 이면 true, 아니면 false를 리턴한다.
자세한 내용은 5장 "ResultSet"은 참조해라.



자바에서 Callablestatement를 통해 stored procedure를 호출하는 방법을 가지고 무진장 헤맸다... ㅠㅠ




그러나 알아내주는게 인지상정.....


<!--------------------------- 프로시져 ---------------------------->

CREATE OR REPLACE PROCEDURE PROC_GETLOGININFO

(
 P_ID  IN JS_MBR_MASTER.MBR_ID%TYPE,

 P_LOGIN_SEQ OUT JS_MBR_LOGIN_INFO.LOGIN_SEQ%TYPE,
 P_RESENT_DATE OUT JS_MBR_LOGIN_INFO.RESENT_DATE%TYPE,
 P_LOGIN_VALUE OUT JS_MBR_LOGIN_INFO.LOGIN_VALUE%TYPE,
 P_NICK_NAME OUT JS_MBR_LOGIN_INFO.NICK_NAME%TYPE,
 P_GUBUN  OUT JS_MBR_LOGIN_INFO.GUBUN%TYPE,
 P_NAME  OUT JS_MBR_LOGIN_INFO.NAME%TYPE,
 P_NOTE_NY OUT JS_MBR_LOGIN_INFO.NOTE_NY%TYPE,
 P_MBR_ID OUT JS_MBR_LOGIN_INFO.MBR_ID%TYPE,
 P_AGE  OUT JS_MBR_LOGIN_INFO.AGE%TYPE
)

IS
      
BEGIN

 SELECT LOGIN_SEQ, RESENT_DATE, LOGIN_VALUE, NICK_NAME,
  GUBUN, NAME, NOTE_NY, MBR_ID, AGE
 INTO P_LOGIN_SEQ, P_RESENT_DATE, P_LOGIN_VALUE, P_NICK_NAME,
  P_GUBUN, P_NAME, P_NOTE_NY, P_MBR_ID, P_AGE
 FROM JS_MBR_LOGIN_INFO
 WHERE MBR_ID =  P_ID;
EXCEPTION
 WHEN NO_DATA_FOUND THEN
  NULL;
 WHEN OTHERS THEN
  RAISE;
END PROC_GETLOGININFO;


/


Grant Execute on hansol_js.PROC_GETLOGININFO to hsjs;

<!--------------------------프로시져 끝 --------------------------------->

 

 

프로시져에 보면 파라미터가 10개이다.

IN 타입 1개, OUT 타입 9개..... (그외의 제공 INOUT도 있음 참고)

 

<!----------------------------- 자바 소스 ----------------------------------->

   cs = con.prepareCall("{call PROC_GETLOGININFO(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} ");
   cs.setString(1, mbr_id);
   cs.registerOutParameter(2, Types.VARCHAR);
   cs.registerOutParameter(3, Types.DATE);
   cs.registerOutParameter(4, Types.VARCHAR);
   cs.registerOutParameter(5, Types.VARCHAR);
   cs.registerOutParameter(6, Types.VARCHAR);
   cs.registerOutParameter(7, Types.VARCHAR);
   cs.registerOutParameter(8, Types.VARCHAR);
   cs.registerOutParameter(9, Types.VARCHAR);
   cs.registerOutParameter(10, Types.VARCHAR);
   cs.execute();
   rs = cs.getResultSet();

<!----------------------------- 자바 소스 끝 ----------------------------------->



처음 call 프로시저명으로 in타입의 파라미터만 넘겨주면 되는줄 알았는데 그건 오산...

아주 큰 오산 ㅠㅠ( 2시간짜리 지식)


out타입의 파라미터도 모두 세팅을 해줘야 한다. 세팅의 방법은 registerOutParameter 메서드를 통해 데이터의 출력 타입에 대해 세팅을 해주는것.

java.sql.Types에 보면 여러가지 타입들이 있는데 맞는것들로 세팅을 해야한다.


그런 다음.. 소스내용 그대로 수행하면 OK~~~~~


즐프~~~~


2010/01/11 13:17 2010/01/11 13:17

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/25

댓글을 달아 주세요

※Statement PreparedStatement의 차이점과 PreparedStatement를 사용할 때의 장점

 

java.sql.Statement Connection에서 태어난다.

코드로 말하자면, 다음과 같은 형식이다.

java.sql.Statement = java.sql.Connection.createStatement();

 

java.sql.Statement를 상속한 것이

java.sql.PreparedStatement이고,

이것을 또 상속한 것이 java.sql.CallableStatement이다.

 

상속했다 함은 이전의 메소드를 모두 사용할 수 있으며,

새로 추가된 기능을 수행하는 메소드를 갖고 있다는 뜻이다.

 

Statement에서는 executeQuery(), executeUpdate() 메소드를 실행하면서

파라미터로 SQL문을 전달한다.

PreparedStatment는 커넥션에서 생성하면서 SQL문을 먼저 보낸다.

이렇게 준비를 시켜놓은 다음에 setXXX() 메소드를 통해서 값을 정해주고,

executeQuery(), executeUpdate()를 실행하게 된다.

 

다음 예제는 15000건의 데이터를 Statement를 통해서 입력하는 소스이다.

[예제 7-1]           jdbc07.jsp

<%@ page import="java.sql.Connection,

                 java.sql.Statement,

생략

Statement stmt = null;

StringBuffer queryBuf = new StringBuffer();

try {

    // Connection을 가져온다.

    conn = DsConn.getConnection();

    // 테이블을 생성하는 쿼리

    queryBuf.append("CREATE TABLE TEST_TABLE ( ")

        .append(" SEQ NUMBER NOT NULL, ")

        .append(" SUBJECT VARCHAR(200) NOT NULL")

        .append(" ) ");

생략

    // Statement를 생성한다.

    stmt = conn.createStatement();

%>start:<%=System.currentTimeMillis()-sTime%><hr><%

    // 반복 15000

    for(int i=0; i<15000; i++) {

    //   쿼리를 만들어서 실행한다.

        queryBuf.setLength(0);

        queryBuf.append("INSERT INTO TEST_TABLE (SEQ, SUBJECT) VALUES ( " )

                .append(i).append(", '이 행은 ")

                .append(i).append(" 번째 입력되었습니다.' ) ");

        stmt.executeUpdate(queryBuf.toString());

    } // end for

이하 생략

 

쿼리(query; sql)를 만들 때, 문자열을 +로 더해주지 않고 StringBuffer를 이용해서 만든 이유는 작지만 무시할 수 없는 성능에 대한 배려이다. String 덧셈할 때 각 항마다 새로운 String 객체가 생성되어 StringBuffer로 더해지는 과정이 내부적으로 일어나기 때문에, 자원면에서, 속도면에서 차이가 나게 된다. 이것을 StringBuffer를 이용해서 구현하면, 생략되기 때문에 절약이 되는 것이다. 웹 어플리케이션같이 수많은 사람들이 동시에 접근하는 환경에서 작은 차이가 큰 결과를 가져오게 되므로 주의해야 한다.

이렇게 문자열을 나눠서 쿼리를 만들 때 또 한 가지 주의할 점은 문자열 마지막이나 맨 처음에 공백을 두는 것이 필요하다.

Statement 인스턴스인 stmt는 한 번 사용한 후에 재사용이 가능하다. 대신 다른 쿼리를 수행하기 전에 close() 로 닫아주어야 한다.

 

 

다음은 PreparedStatement를 사용할 경우이다. 앞의 예제와 비교해보면 쉽게 차이점을 알 수 있다.

[예제 7-2]           jdbc08.jsp

<%@ page import="java.sql.Connection,

                 java.sql.PreparedStatement,

                 java.sql.SQLException,

생략

PreparedStatement pstmt = null;

생략

    // 데이터를 입력하는 쿼리

    queryBuf.setLength(0);

    queryBuf.append("INSERT INTO TEST_TABLE (SEQ, SUBJECT) VALUES ")

            .append("( :seq , '이 행은 '||:subject||' 번째 입력되었습니다.' )");

// mysql 등 다른 db에서는 별칭(:필드명)를 사용하는 대신 ? 로 대치한다.

//      .append("( ? , '이 행은 '||?||' 번째 입력되었습니다.' )");

 

    // 다시 PreparedStatement를 생성한다.

    pstmt = conn.prepareStatement(queryBuf.toString());

%>start:<%=System.currentTimeMillis()-sTime%><hr><%

    // 반복 15000

    for(int i=0; i<15000; i++) {

    //   쿼리를 실행한다.

        pstmt.setInt(1, i);

        pstmt.setInt(2, i);

        pstmt.executeUpdate();

    } // end for

이하 생략


import에서 가져오는 것은 java.sql.PreparedStatement 이다.

커넥션에서 사용하는 메소드는 createStatement() 대신 prepareStatment(String) 메소드이다.

주의할 점은 클래스명은 PreparedStatement 이고 메소드는 prepareStatement() 라는 것이다.

 

executeUpdate() 메소드에 파라미터로 쿼리를 보내 줄 필요가 없다. 데이터를 입력하는 오라클의 INSERT 쿼리문을 보면 실행할 때마다 가변적으로 생성하지 않고, 값이 들어갈 자리를 :필드명 의 형태인 바인드 변수로 만들어 놓았다. 코드의 가독성을 높이는 효과가 있다. 이것은 다른 DB에서는 일반적으로 ? 로 사용되어 왔기 때문이다.

 

SQL문에서 문자열은 '(작은따옴표)로 감싸지는데 문자열의 더하기는 ||를 사용해서 더해진다. 위 문장은 "이 행은 " + :subject + " 번째 입력되었습니다." 로 해석할 수 있다.

만일 '이 행은 :subject 번째 입력되었습니다.' 처럼 안에 집어넣을 경우 :subject 가 바인드 변수로 인식되지 않고 문장의 일부로 해석되기 때문에 실행 중에 다음과 같은 에러를 발생하게 된다. 다음 에러는 바인드 변수 갯수와 setXXX()의 갯수가 맞지 않을 때 일어난다.

java.sql.SQLException: ORA-01006: 바인드 변수가 없습니다

 

단지 바인드 변수에 지정된 값만 setInt(순서, int) 메소드로 넣어주면 된다.

자바코드에서 인덱스는 0부터 시작하지만 JDBC에서 사용한 순서는 1부터 시작된다.

setInt(1, i) 대신 setString(1, String.valueOf(i) ) 와 같이 String 형태의 사용도 가능하다.

DB 필드의 타입에 상관없이 모두 String으로 처리가 가능하다.

 

getXXX(), setXXX() 모두 getString(), setString()으로 해도 상관없다.

단지 차이점이라면 데이터 타입의 검사를 DB에서 하느냐 아니면 웹 어플리케이션에서 하느냐 정도일 것이다.

즉 타입에 맞지않는 값이 처리될 경우, 예외의 발생이 DB에서 SQLException으로 나오는가, 웹어플리케이션에서 예외를 발생시키는가에 대한 차이이다.

 

- 출처 : http://www.okjsp.pe.kr "kenu"님

 
2010/01/11 13:16 2010/01/11 13:16

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/24

댓글을 달아 주세요

※Statement PreparedStatement의 차이점과 PreparedStatement를 사용할 때의 장점

 

java.sql.Statement Connection에서 태어난다.

코드로 말하자면, 다음과 같은 형식이다.

java.sql.Statement = java.sql.Connection.createStatement();

 

java.sql.Statement를 상속한 것이

java.sql.PreparedStatement이고,

이것을 또 상속한 것이 java.sql.CallableStatement이다.

 

상속했다 함은 이전의 메소드를 모두 사용할 수 있으며,

새로 추가된 기능을 수행하는 메소드를 갖고 있다는 뜻이다.

 

Statement에서는 executeQuery(), executeUpdate() 메소드를 실행하면서

파라미터로 SQL문을 전달한다.

PreparedStatment는 커넥션에서 생성하면서 SQL문을 먼저 보낸다.

이렇게 준비를 시켜놓은 다음에 setXXX() 메소드를 통해서 값을 정해주고,

executeQuery(), executeUpdate()를 실행하게 된다.

 

다음 예제는 15000건의 데이터를 Statement를 통해서 입력하는 소스이다.

[예제 7-1]           jdbc07.jsp

<%@ page import="java.sql.Connection,

                 java.sql.Statement,

생략

Statement stmt = null;

StringBuffer queryBuf = new StringBuffer();

try {

    // Connection을 가져온다.

    conn = DsConn.getConnection();

    // 테이블을 생성하는 쿼리

    queryBuf.append("CREATE TABLE TEST_TABLE ( ")

        .append(" SEQ NUMBER NOT NULL, ")

        .append(" SUBJECT VARCHAR(200) NOT NULL")

        .append(" ) ");

생략

    // Statement를 생성한다.

    stmt = conn.createStatement();

%>start:<%=System.currentTimeMillis()-sTime%><hr><%

    // 반복 15000

    for(int i=0; i<15000; i++) {

    //   쿼리를 만들어서 실행한다.

        queryBuf.setLength(0);

        queryBuf.append("INSERT INTO TEST_TABLE (SEQ, SUBJECT) VALUES ( " )

                .append(i).append(", '이 행은 ")

                .append(i).append(" 번째 입력되었습니다.' ) ");

        stmt.executeUpdate(queryBuf.toString());

    } // end for

이하 생략

 

쿼리(query; sql)를 만들 때, 문자열을 +로 더해주지 않고 StringBuffer를 이용해서 만든 이유는 작지만 무시할 수 없는 성능에 대한 배려이다. String 덧셈할 때 각 항마다 새로운 String 객체가 생성되어 StringBuffer로 더해지는 과정이 내부적으로 일어나기 때문에, 자원면에서, 속도면에서 차이가 나게 된다. 이것을 StringBuffer를 이용해서 구현하면, 생략되기 때문에 절약이 되는 것이다. 웹 어플리케이션같이 수많은 사람들이 동시에 접근하는 환경에서 작은 차이가 큰 결과를 가져오게 되므로 주의해야 한다.

이렇게 문자열을 나눠서 쿼리를 만들 때 또 한 가지 주의할 점은 문자열 마지막이나 맨 처음에 공백을 두는 것이 필요하다.

Statement 인스턴스인 stmt는 한 번 사용한 후에 재사용이 가능하다. 대신 다른 쿼리를 수행하기 전에 close() 로 닫아주어야 한다.

 

 

다음은 PreparedStatement를 사용할 경우이다. 앞의 예제와 비교해보면 쉽게 차이점을 알 수 있다.

[예제 7-2]           jdbc08.jsp

<%@ page import="java.sql.Connection,

                 java.sql.PreparedStatement,

                 java.sql.SQLException,

생략

PreparedStatement pstmt = null;

생략

    // 데이터를 입력하는 쿼리

    queryBuf.setLength(0);

    queryBuf.append("INSERT INTO TEST_TABLE (SEQ, SUBJECT) VALUES ")

            .append("( :seq , '이 행은 '||:subject||' 번째 입력되었습니다.' )");

// mysql 등 다른 db에서는 별칭(:필드명)를 사용하는 대신 ? 로 대치한다.

//      .append("( ? , '이 행은 '||?||' 번째 입력되었습니다.' )");

 

    // 다시 PreparedStatement를 생성한다.

    pstmt = conn.prepareStatement(queryBuf.toString());

%>start:<%=System.currentTimeMillis()-sTime%><hr><%

    // 반복 15000

    for(int i=0; i<15000; i++) {

    //   쿼리를 실행한다.

        pstmt.setInt(1, i);

        pstmt.setInt(2, i);

        pstmt.executeUpdate();

    } // end for

이하 생략


import에서 가져오는 것은 java.sql.PreparedStatement 이다.

커넥션에서 사용하는 메소드는 createStatement() 대신 prepareStatment(String) 메소드이다.

주의할 점은 클래스명은 PreparedStatement 이고 메소드는 prepareStatement() 라는 것이다.

 

executeUpdate() 메소드에 파라미터로 쿼리를 보내 줄 필요가 없다. 데이터를 입력하는 오라클의 INSERT 쿼리문을 보면 실행할 때마다 가변적으로 생성하지 않고, 값이 들어갈 자리를 :필드명 의 형태인 바인드 변수로 만들어 놓았다. 코드의 가독성을 높이는 효과가 있다. 이것은 다른 DB에서는 일반적으로 ? 로 사용되어 왔기 때문이다.

 

SQL문에서 문자열은 '(작은따옴표)로 감싸지는데 문자열의 더하기는 ||를 사용해서 더해진다. 위 문장은 "이 행은 " + :subject + " 번째 입력되었습니다." 로 해석할 수 있다.

만일 '이 행은 :subject 번째 입력되었습니다.' 처럼 안에 집어넣을 경우 :subject 가 바인드 변수로 인식되지 않고 문장의 일부로 해석되기 때문에 실행 중에 다음과 같은 에러를 발생하게 된다. 다음 에러는 바인드 변수 갯수와 setXXX()의 갯수가 맞지 않을 때 일어난다.

java.sql.SQLException: ORA-01006: 바인드 변수가 없습니다

 

단지 바인드 변수에 지정된 값만 setInt(순서, int) 메소드로 넣어주면 된다.

자바코드에서 인덱스는 0부터 시작하지만 JDBC에서 사용한 순서는 1부터 시작된다.

setInt(1, i) 대신 setString(1, String.valueOf(i) ) 와 같이 String 형태의 사용도 가능하다.

DB 필드의 타입에 상관없이 모두 String으로 처리가 가능하다.

 

getXXX(), setXXX() 모두 getString(), setString()으로 해도 상관없다.

단지 차이점이라면 데이터 타입의 검사를 DB에서 하느냐 아니면 웹 어플리케이션에서 하느냐 정도일 것이다.

즉 타입에 맞지않는 값이 처리될 경우, 예외의 발생이 DB에서 SQLException으로 나오는가, 웹어플리케이션에서 예외를 발생시키는가에 대한 차이이다.

 

- 출처 : http://www.okjsp.pe.kr "kenu"님

 
2010/01/11 13:16 2010/01/11 13:16

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/23

댓글을 달아 주세요

selectcolor.jsp


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h1>좋아하는 색을 선택하세요</h1>
<form action="alchol.do" method="post">                   //AlcholService.java 파일 생성시 매핑을  alchol.do 로 설정 (보안상 지정)
 <select name="color">                                            //값을 가져가서 처리 할 name값 color
  <option>빨강</option>
  <option>파랑</option>
  <option>노랑</option>
  <option>검정</option>
 </select>
 <input type="submit" value="알코올이 필요해요">
</form>


AlcholService.java


package net.bitacademy.lifecycle;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: AlcholService1
 *
 */
 public class AlcholService extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

 public AlcholService() {
  super();
 }    
 

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
  doPost(request,response);
 }   
 

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


  request.setCharacterEncoding("euc-kr");                           //한글 표현시 안깨지게 하는거
  String color=request.getParameter("color");                         //위의 selectcolor.jsp name값을 변수 color에 값을 넣어줌
  SojuExpert alchol=new SojuExpert();                                 //자바빈 파일 객체 생성


  alchol.setColor(color);                                                    
//처음 입력받은게 color 에 해당되므로 자바빈의 setColor 메소드 호출

                                                                                        //setColor메소드에 의해 alchol 클래스는 클래스내에 멤버변수에

                                                                                        //값을 할당해준다.


  RequestDispatcher rd=request.getRequestDispatcher("/Result2.jsp");     
// 객체를 통해 동적 웹 자원으로 전달하는부분

                                                                                                         // Result2.jsp로 전달한다.


  request.setAttribute("ALCHOL",alchol);                                                
// ALCHOL 이란 속성이름으로 alchol (클래스 객체) 을

                                                                                                         // 속성값을 할당 , 속성값이 alchol 이된다.

                                                                                                         // alchol 위치에 타입은 Object 이므로

                                                                                                         // 어떠한 타입도 가능하다.


   rd.forward(request,response);                                                            // rd 객체는 Result2.jsp를 가리키고 있는데

                                                                                                         // 모든제어를 rd객체가 가리키는 Result2.jsp 로 넘겨준다.

                                                                                                        // 이후 Result2.jsp 가 처리를 맡는다.
 }          
}


SojuExpert.java


package net.bitacademy.lifecycle;

public class SojuExpert {
 private String color;
 private String brand;
 
 
 public String getBrand() {
  return brand;
 }
 public void setBrand(String brand) {
  this.brand = brand;
 }
 public String getColor() {
  return color;
 }
 public void setColor(String color) {            // alchol.setColor(color); 메소드에 의해 값이 저장되는부분
  this.color = color;
 
  if(color.equals("빨강")){
   brand="참이슬";  
  }
  else if(color.equals("검정")){
   brand="처음처럼";
 
  }
  else if(color.equals("노랑")){
   brand="복분자";
  }
  else{
   brand="뱀소주";
 
  }
 }
}

Result2.jsp


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h1>비오는 날에는 감자탕에 소주가 최고야 </h1>
<h2>${ALCHOL.color }색을 좋아하는 나에게 맞는 알콜은           //속성이름이 ALCHOL 인 속성에서 color 값을 가져온다.

                                                                                           //ALCHOL 은

                                                                                           // SojuExpert alchol=new SojuExpert();  

                                                                                           // request.setAttribute("ALCHOL",alchol);

                                                                                           // 위 구문에 의해 SojuExpert 클래스 alchol 객체가 가리키고 있으며

                                                                                           // ALCHOL 로 의해 접근한다.

                                                                                           // 처음 선택한 name="color" 의 값이

                                                                                           // alchol.setColor(color); 메소드에 의해 실행되어

                                                                                           // 자바빈에 color (프로퍼티) 값과 brand (프로퍼티) 값이 저장된후

                                                                                           // ALCHOL.color 로 접근되어

                                                                                           // color (프로퍼티) 값과 brand (프로퍼티) 값을 가져온다.


    ${ALCHOL.brand }입니다.</h2>                                          //${ }      EL 태그




//------------------------------------------------------------------------------------------------------------------------

 

selectcolor.jsp JSP 페이지에서 선택된 name="color" 값을 AlcholService.java내의 doPost에서 처리

연동시키기 위해 자바빈을 사용하는데 자바빈 객체 생성 후

name="color" 값을 처리 하기 위해  자바빈에 있는 setColor(color) 메소드를 이용해서

값을 메모리에 일단 저장

동적으로 다른 웹 페이지로 전달하기 위해 RequestDispatcher rd=request.getRequestDispatcher("/Result2.jsp"); 사용

JSP페이지에서 결과를 표현할 때 접근하기 위해서 속성값을 부여하고 (Result2.jsp)에서 접근함

rd.forward(request,response); 메소드에 의해 포워딩 된다.

포워딩에 의해 Result2.jsp 호출되고

EL태그가 속성이름 ALCHOL 로 접근해서 원하는 결과를 얻는다.

 

${ALCHOL.color }

${ALCHOL.brand }

이렇게 접근해서 값을 꺼내온다.

 

p.s :  소스는 정상이라 주석과 해설 부분은 본인 생각이라 틀릴 수 있다.

 
2010/01/11 13:15 2010/01/11 13:15

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/22

댓글을 달아 주세요

자바빈의 클래스 선언은 접근 제어자로 public을 사용하고, 멤버 변수는 접근 제어자로 private을 사용해서 작성한다.

자바빈에서는 멤버 변수를 프로퍼티(property)라고 한다.


프로퍼티는 JSP 페이지의 내용을 DB에 저장하거나 DB에 저장된 내용을 JSP 페이지에 표출할 때 중간 데이터 저장소로 사용된다.


자바빈 관련 액션 태그

<jsp:useBean id="" class="" scope=""/>                             //자바빈 객체를 생성

<jsp:setProperty name="" property="" value=""/>                  //생성된 자바빈 객체에 프로퍼티 값을 저장

<jsp:getProperty name="" property=""/>                              //생성된 자바빈 객체에서 저장된 프로퍼티 값을 가져옴


<jsp:useBean> 액션 태그


<jsp:uesBean id="빈 이름" class="자바빈 클래스 이름" scope="범위"/>


id 속성은 생성될 자바빈 객체의 이름을 명시하는 곳이다.(필수 속성으로 생략이 불가능 하다)

class 속성은 객체가 생성될 자바빈 클래스명을 기술하는 곳이다.

이때 패키지명을 포함한 자바 클래스의 풀네임을 기술한다.(필수 속성으로 생략이 불가능 하다)

scope 속성은 자바빈 객체의 유효 범위로 자바빈 객체가 공유되는 범위를 지정한다.

scope 속성값으로는 page,request,session application을 가지며 scope 속성 생략시 기본값은 page이다.


ex)

<jsp:useBean id="simpleBean" class="ch08.simpleBean.SimpleBean" scop="page"/>


SimpleBean 클래스의 멤버 변수(프로퍼티)나 메소드에 접근하려면 simpleBean 레퍼런스를 사용해야 한다.

이것은 자바에서 객체를 생성하는 아래와 동일하다.

SimpleBean simpleBean = new SimpleBean();


<jsp:useBean> 액션 태그에서 id 속성값에 지정한 이름이 이미 존재하는 경우 자바빈 객체를 새로 생성하는 것이 아니라 기존에 생성된 객체를 그대로 사용한다. 이때 id 속성값, class 속성값, scope 속성값이 모두 동일해야 같은 객체가 된다.


ex)

<jsp:useBean id="simpleBean" class="ch08.simpleBean.SimpleBean" scop="page"/>

..

...

중략

..

<jsp:useBean id="simpleBean" class="ch08.simpleBean.SimpleBean" scop="page"/>


=> 같은 SimpleBean 객체를 사용




<jsp:setProperty> 액션 태그


자바빈 객체의 프로퍼티 값을 저장하기 위해 사용된다.

<jsp:setProperty name="빈 이름" property="프로퍼티 이름" value="프로퍼티에 저장할 값"/>


name 속성은 자바빈 객체의 이름을 명시하는 곳이다.(필수 속성으로 생략이 불가능하다.)

property 속성은 프로퍼티명을 기술하는 곳이다.(필수 속성으로 생략이 불가능하다.)

value 속성은 프로퍼티에 저장할 값을 기술하는 곳이다.(생략가능)


<jsp:useBean id="simpleBean" class="ch08.simpleBean.SimpleBean" scope="page">

           <jsp:setProperty name="simpleBean" property="message"/>

</jsp:useBean>


위의 <jsp:setProperty name="simpleBean" property="message"/> 액션 태그는

자바빈 클래스의 setMessage() 메소드와 자동 연동된다.

즉 프로퍼티명 message는 자바빈 클래스의 프로퍼티 message를 의미한다.

이때 사용된 액션 태그가 setProperty 이므로 setMessage() 메소드와 연동하게 되는 것이다.


public void setMessage(String message){

      this.message=message;

}

하나의 프로퍼티 값을 세팅할 때는 위와 같이 사용한다.


<jsp:useBean id="inDb" scope="page" class="bean.logon.DbDataLogin">

            <jsp:setProperty name="inDb" property="id"/>

            <jsp:setProperty name="inDb" property="userpass"/>

            <jsp:setProperty name="inDb" property="username"/>

            <jsp:setProperty name="inDb" property="socialid1"/>

            <jsp:setProperty name="inDb" property="socialid2"/>

            <jsp:setProperty name="inDb" property="birth"/>

            <jsp:setProperty name="inDb" property="email"/>

            <jsp:setProperty name="inDb" property="addr"/>

            <jsp:setProperty name="inDb" property="zip1"/>

            <jsp:setProperty name="inDb" property="job"/>           

</jsp:useBean>


위의 코드들은 아래와 같이 쓸 수 있다.

property 속성값을 *(아스테리스크)를 주면 모든 프로퍼티 값이 세팅된다.

아무 때나 되는 것은 아니다. 폼으로 부터 넘어오는 파라미터의 이름이 프로퍼티의 이름과 일치해야 한다.

 

<jsp:useBean id="inDb" scope="page" class="bean.logon.DbDataLogin">

              <jsp:setProperty name="inDb" property="*"/>

</jsp:useBean>


<tr>

       <td bgcolor="" class="normalbold" width="200">사용자 ID </td>

       <td width="400">

              <input type="text" name="id" size="10" maxlength="10">

              <input type="button" name="confirm_id" value="ID중복확인" OnClick="openConfirmid(this.form)">

       </td>

</tr>

 

자바빈을 사용하는 JSP 페이지

<jsp:useBean id="inDb" scope="page" class="bean.logon.DbDataLogin">

          <jsp:setProperty name="inDb" property="id"/>

</jsp:useBean>

 

자바빈 클래스

public void setId(String id){

     this.id=id;

}

 

 

 

<tr>

       <td bgcolor="" class="normalbold" width="200">사용자 ID </td>

       <td width="400">

              <input type="text" name="userid" size="10" maxlength="10">

              <input type="button" name="confirm_id" value="ID중복확인" OnClick="openConfirmid(this.form)">

       </td>

</tr>

 

자바빈을 사용하는 JSP 페이지

<jsp:useBean id="inDb" scope="page" class="bean.logon.DbDataLogin">

          <jsp:setProperty name="inDb" property="id" param="userid"/>

</jsp:useBean>

 

자바빈 클래스

public void setId(String id){

     this.id=id;

}


폼으로부터 넘어온 파라미터명과 자바빈의 프로퍼티가 일치하지 않는 경우 <jsp:setProperty> 액션 태그에 param 속성을 기술해야 한다. param 속성값에는 폼으로부터 넘어온 파라미터명을 기술한다.


<jsp:getProperty> 액션 태그


<jsp:getProperty name="빈 이름" property="프로퍼티 이름"/>


name 속성은 자바빈 객체의 이름을 명시하는 곳이다.(필수 속성으로 생략이 불가능하다)

property 속성은 프로퍼티명을 기술하는 곳이다.(필수 속성으로 생략이 불가능하다)


<jsp:useBean id="simpleBean" class="sh08.simpleBean.SimpleBean" scpoe="page"/>

<jsp:getProtery name="simpleBean" property="message"/>


<jsp:getProtery name="simpleBean" property="message"/> 액션 태그는 자바빈 클래스의 getMessage() 메소드와 자동 연동된다.

즉, 프로퍼티명 message는 자바빈 클래스의 프로퍼티 message를 의미한다.

이때 사용된 액션 태그가 getProperty 이므로 getMessage() 메소드와 연동하게 되는 것이다.


public String getMessge(){

             return message;

}


2010/01/11 13:11 2010/01/11 13:11

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/21

댓글을 달아 주세요

<a href="/project/view/index.jsp?CONTROL=intro$PAGENUM=01">링크</a>

CONTROL과 PAGENUM에 값을 가지고 index.jsp로 링크걸기

 

MVC

Model, View, Controller

 

모델 은 로직을 가지고 있는 부분으로 DB와 연동한다.                                   //Java Bean

는 사용자에게 제공하는 화면으로  UI (User Interface)에 해당한다.             //JSP

컨트롤러 는 뷰와 모델 사이에서 흐름을 제어한다.                                        //서블릿


템플릿 페이지는 MVC 구조에서 뷰에 해당하는 JSP페이지들을 모듈화하는 부분이다.

템플릿 페이지를 사용하면 JSP페이지의 유지, 보수가 쉬워져서 사이트 관리가 편해진다.

 
2010/01/11 13:11 2010/01/11 13:11

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/20

댓글을 달아 주세요

JSP에서 제공하는 액션 태그

· include                                                    //페이지 모듈화

· forward                                                    //페이지의 흐름 제어

· plug-in                                                    //애플릿을 사용할 때

· useBean                                                 //자바빈을 사용할 때

· serProperty                                             //자바빈의 속성값을 저장할 때

· getProperty                                             //자바빈의 속성값을 읽어올 때

 

액션 태그는 XML (=표준) 문법을 따르기 때문에 단독 태그의 경우도 반드시 종료 태그를 포함 해야 한다.


1. body 가 있는 경우 : 시작 태그와 종료 태그의 쌍으로 이루어 진다.


<jsp:include page="a.jsp" flush="false">

            <jsp:param name="paramName" value="value1"/>

</jsp:include>


2. body 가 없는 경우 : 시작 태그와 종료 태그가 포함된다.


<jsp:param name="paramName" value="value1"/>

 

include 액션 태그 <jsp:include>

 

<jsp:include> 액션 태그는 include 디렉티브 <%@ include%> 와 함께 다른 페이지를 현재 페이지에 포함시킬 수 있는 기능을 가지고 있다. include 디렉티브는 단순하게 소스의 내용이 텍스트로 포함이 되지만 <jsp:include> 액션 태그는 페이지의 처리 결과를 포함시킨다는

점이 다르다. 이때 포함되는 페이지는 html, jsp, Servlet 등 모두 가능하다.

 

또한, include 디렉티브는 주로 조각 코드를 삽입할 때 사용되고, <jsp:include> 액션 태그는 페이지를 모듈화할 때 사용된다.

즉, 템플릿 페이지를 작성할 때 사용된다.


ex)

<jsp:include page="포함될 페이지" flush="true"/>


<jsp:inlcude> 액션 태그의 page 속성의 값은 현재 페이지에 결과가 포함될 페이지 명이 된다. 이때 포함될 페이지 명은 때에 따라 상대 경로를 쓰거나 웹 어플리ㅇ케이션의 절대 경로를 사용한다. 또한 page속성의 값은 표현식을 사용할 수 있다.

String content=request.getParameter("name");

<jsp:include page="<%=content%>" flush="false"/>

 

flush 속성은 포함될 페이지로 제어가 이동될 때 현재 포함하는 페이지가 지금까지 출력 버퍼에 저장한 결과를 처리하는 방법을 결정하는

것으로, flush 속성의 값을 true로 지정하면 포함될 페이지로 제어가 이동될 때 현재 페이지가 지금 까지 버퍼에 저장한 내용을 웹 브라우저에 출력하고 버퍼를 비운다.


<jsp:include> 액션 태그의 사용법의 권장 형태

<jsp:include page="포함될 페이지" flush="false" />


<jsp:include> 액션 태그에서 flush 속성의 값은 false로 지정하는 것이 일반적이다.

만일 flush 속성의 값을 true로 지정하면 일단 출력 버퍼의 내용을 웹 브라우저에 전송하게 되는데 이때 헤더 정보도 같이 전송된다.

일단 헤더 정보가 웹 브라우저에 전송이 되고 나면 헤더 정보를 추가해도 결과가 반영되지 않는다.


처리과정

1. 웹 브라우저가 a.jsp 페이지를 웹 서버에 요청한다.

2. 서버는 요청받은 a. jsp 페이지를 처리하는데, a.jsp 페이지 내에서 출력 내용을 출력 버퍼에 저장하는 작업을 처리한다.

3. 이 때 a.jsp 소스 내에 <jsp:include page="b.jsp" flush="false" /> 문장을 만나면 하던 작업을 멈추고 프로그램 제어를 b.jsp 페이지로

   이동시킨다.

4. b.jsp 페이지는 페이지 내에 출력 내용을 출력 버퍼에 저장하는 등의 작업을 처리한다.

5. b.jsp 페이지의 처리가 끝나면 다시  a.jsp 페이지로 프로그램의 제어가 이동하는데,

   이동 위치는 <jsp: include page="b.jsp" flush="false" /> 문자 이후이다.

6. a.jsp 페이지의 나머지 부분을 처리한다. 출력할 내용이 있으면 출력 버퍼에 저장한다.

7. 출력 버퍼의 내용을 웹 브라우저로 응답한다.


<jsp:include> 액션 태그는 같은 request 내부 객체를 공유한다.

 


<jsp:include> 액션 태그에서 포함되는 페이지에 값 전달하기


<jsp:include> 액션 태그는  포함되는 JSP 페이지에 값을 전달할 수 있다.

포함되는 JSP 페이지에 값 전달은 요청 파라미터를 추가적으로 지정해서 사용할 수 있는데,

<jsp:include> 액션 태그의 바디(body)안에 <jsp:param> 액션 태그를 이용하여 다음과 같은 형태로 사용하면 된다.


<jsp:include page="포함되는 페이지" flush="false">

            <jsp:param name="paramName1" value="var1" />

            <jap:param name="paramName2" value="var2" />

</jsp:include>


<jsp:param> 액션 태그의 name 속성은 포함되는 JSP 페이지에 전달할 파라미터의 이름을 표시하고, value 속성은 전달할 파라미터의

값을 표시한다. 이때 value 속성의 값으로 표현식을 사용할 수 있다.


<jsp:include page="b.jsp" flush="false">

            <jsp:param name="p1" value="<%=var%>" />

</jsp:include>


<jsp:param> 태그는 단독으로 쓰일 수 없고 <jsp:include> 나 <jsp:forward> 안에 포함되어 쓰여져야 한다.


예제

 

includeTag2Form.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <h2>include 액션 태그에서 포함되는 페이지에 값 전달하기</h2>
 <form method=post action="includeTag2.jsp">
  이름 : <input type="text" name="name"><p>
  나이 : <input type="text" name="age"><p>
  <input type="submit" value="보내기">
 </form>
</body>
</html>

 

includeTag2.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <h2>includeTag2.jsp 페이지 입니다.</h2>
 <%
  request.setCharacterEncoding("euc-kr");
  String name=request.getParameter("name");
  String age=request.getParameter("age");
 %>
 <hr>
 <jsp:include page="includeTagTop2.jsp" flush="false">
  <jsp:param name="irum" value="<%=name %>"/>
  <jsp:param name="nai" value="<%=age %>"/>
 </jsp:include>
 includeTag2.jsp 페이지의 나머지 내용입니다.<p>
</body>
</html>

 

includeTagTop2.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  String irum2=request.getParameter("irum");
  String nai2=request.getParameter("nai");
 %>
  includeTagTop2.jsp 페이지 입니다.<p>
  이름 :  <b><%=irum2 %></b>
  나이 : <b><%=nai2 %></b>
  <hr>
</body>
</html>

 

JSP 페이지의 중복 영역 처리 : JSP 페이지의 모듈화


보통 프로그래밍을 할 때 중복되는 부분은 따로 모듈로 작성해서, 필요할 때마다 호출해 쓰는 방식을 사용하고 있다.

예를 들어


<table>

<tr>

     <td colspan="2"><jsp:include page="top.jsp" flush="false"/></td>

</tr>

<tr>

     <td><jsp:include page="left.jsp" flush="false"/></td>

     <td><jsp:include page="<%=content%>" flush="false"/></td>

</tr>

<tr>

     <td colspan="2"><jsp:include page="bottom.jsp" flush="false"/></td>

</tr>

</table>

 

사이트 수정시 각 해당 페이지만 수정할수 있지만

아래와 같은 구조라면

<table>

<tr>

     <td colspan="2">상단</td>

</tr>

<tr>

     <td>좌측</td>

     <td>중앙내용</td>

</tr>

<tr>

     <td colspan="2">하단</td>

</tr>

</table>

모든 페이지를 수정해야 할지도 모른다.

페이지를 모듈화하는 가장 큰 이유는 사이트 유지보수가 쉽기 때문이다.

 

include 디렉티브 <%@ include file="경로"> 와 <jsp: include> 액션태그와의 차이점은

<jsp:include> 액션 태그는 결과를 포함시키고, include 디렉티브는 코드를 복사해서 함께 서블릿으로 변환한다.

즉, include 디렉티브는 코드 차원에서 포함되므로 주로 공용 변수, 저작권 표시와 같은 중복 문장에 사용된다.

 

forward 액션 태그 <jsp:forward>


<jsp:forward> 액션 태그는 다른 페이지로 프로그램의 제어를 이동할 때 사용되며,

JSP 페이지 내에 <jsp:forward> 액션 태그를 만나게 되면, 그전까지 철력 버퍼에 저장되어 있던 내용을 제거하고 <jsp:forward> 액션

태그가 지정하는 페이지로 이동하게 된다.


ex)

<jsp:forward page="이동할 페이지명"/>

<jsp:forward page="이동할 페이지명"></jsp:forward>

<jsp:forward page='<%=expression+".jsp"%>'/>              // 주의 : 표현식은 따옴표 ' ' (1개짜리따옴표)


page 속성의 값인 이동할 페이지 명은 웹 어플리케이션 상대 경로나 웹 어플리케이션 절대 경로로 지정할 수 있고, 표현식도 가능하다.


포워딩은 파일은 웹 브라우저에 경로가 표시되지 않는다. 포워딩시킨 파일만 경로가 표시된다.

 

<jsp:forward> 액션 태그에서 포워딩되는 페이지에 값 전달하기

<jsp:forward page="이동할 페이지명">

     <jsp:param name="paramName1" value="var1"/>

     <jsp:param name="paramName2" value="var2"/>

</jsp:forward>

 

<jsp:forward> 액션 태그에서 <jsp:param> 태그로 프로그램의 제어가 이동할 페이지에 파라미터 값을 전달할 때 사용한다.


sendRedirect()메소드는 바인딩된 데이터가 유지 되지 않는다.(주소가 변한다.)

forward 액션태그는 데이터가 유지된다.(주소가 변하지 않는다.)

2010/01/11 13:10 2010/01/11 13:10

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/19

댓글을 달아 주세요

JSP 페이지 내에서 지정한 레퍼런스 변수와 특정 객체의 메소드로 접근을 한다.

JSP 페이지에서 사용하게 되는 특정한 변수가 아무런 선언과 객체 생성 없이 사용 할 수 있는 이유는 JSP 페이지가

서블릿으로 변환 될 때 JSP 컨테이너가 자동적으로 제공 하기 때문이다.


public final class directiveTest4_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.List _jspx_dependants;

  static {
    _jspx_dependants = new java.util.ArrayList(2);
    _jspx_dependants.add("/top.jsp");
    _jspx_dependants.add("/bottom.jsp");
  }

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


9개의 내장 객체는 사용되는 범주에 따라 4가지 형태로 분류 된다.


JSP 페이지 입출력 관련 내장 객체

JSP 페이지 외부 환경 정보 제공 내장 객체

JSP 페이지 서블릿 관련 내장 객체

JSP 페이지 예외 관련 내장 객체


JSP페이지의 내장 객체


request             javax.servlet.http.HttpServletRequest

                       javax.servlet.ServletRequest                                 //클라이언트의 요청 정보를 저장하고 있는 객체

response          javax.servlet.http.HttpServletResponse

                      javax.servlet.ServletResponse                               //요청에 대한 응답정보를 저장하고 있는 객체

out                  javax.servlet.jsp.JspWriter                                     //JSP 페이지 출력할 내용을 가지고 있는 출력 스트림 객체

session           javax.servlet.http.HttpSession                               //세션 정보를 저장하고 있는 객체

application       javax.servlet.ServletContext                                  //웹 어플리케이션 Context의 정보를 저장하고 있는 객체

pageContext     javax.servlet.jsp.PageContext                                //JSP 페이지에 대한 정보를 저장하고 있는 객체

page               java.lang.Object                                                   //JSP 페이지를 구현한 자바 클래스 객체

config              javax.servlet.ServletConfig                                    //JSP 페이지에 대한 설정정보를 저장하고 있는 객첵

exception         java.lang.Throwable                                             //JSP 페이지에서 예외가 발생시에만 사용되는 객체


내장 객체의 속성을 저장하고 읽어내는 공통 메소드


void setAttribute (String key, Object value)                                      //주어진 key 속성의 값을 value로 지정한다.

java.util.Enumeration getAttributeNames()                                        //모든 속성의 이름을 구한다.

Object getAttribute(String key)                                                       //주어진 key 속성의 값을 언더낸다.

void removeAttribute(String key)                                                      //주어진 key 속성의 값을 제거한다.


//-----------------------------------------------------------------------------------------------------------------------


request 내장 객체

 

request 내장 객체 메소드 

String getParameter(name)

String[] getParameterValues(name)

Enumeration getParameterNames()


String getParameter(name) 메소드는 이름이 name이 파라미터에 할당된 값을 리턴하며 지정된 파라미터 값이 없으면 null 값을 리턴

String[] getParameterValues(name) 메소드는 이름이 name인 파라미터의 모든 값을 String 배열로 리턴, checkbox 에서 주로 사용

Enumeration getParameterNames() 메소드는 요청에 사용된 모든 파라미터 이름을 java.util.Enumeration 타입으로 리턴


Enumeration 객체

java.util.Enumeration 인터페이스는 객체를 저장하는 객체라고 생각하면 된다.

요청된 요소의 값들을 Object 타입의 값으로 1:1 저장을 하며, 다음과 같은 메소드들을 가지고 있다.

메소드

                boolean hasMoreElements()             //더 이상의 객체가 있는지 없는지를 판단하여 객체가 있으면 true,

                                                                        없으면 false 리턴

                Object nextElement()                        //다음 객체를 가져온다. 그러면 Enumeration 타입으로 받아온 객체를

                                                                        작업에서 원하는 객체 형태로 형변환(casting)하여 사용하면 된다.

 

예제

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  String protocol=request.getProtocol();                           //사용 중인 프로토콜
  String server=request.getServerName();                        //서버의 도메인
  int port=request.getServerPort();                                   //서버 Port
  String clientIP=request.getRemoteAddr();                       //클라이언트 IP
  String clientHost=request.getRemoteHost();                    //클라이언트의 호스트 이름
  String methodType=request.getMethod();                       //method
  String url=new String(request.getRequestURL());             //URL
  String uri=request.getRequestURI();                                //URI
  String contextpath=request.getContextPath();                   //JSP 페이지가 속한 컨텍스트 경로

  String contextpath=request.getContextPath();                   //JSP 페이지가 속한 컨텍스트 경로

  String contextpath=request.getContextPath();                   //JSP 페이지가 속한 컨텍스트 경로

  String contextpath=request.getContextPath();                   //JSP 페이지가 속한 컨텍스트 경로

  String contextpath=request.getContextPath();                   //JSP 페이지가 속한 컨텍스트 경로
  String browser=request.getHeader("User-Agent");             //User-Agent -->지원 프로그램 버전 출력
  String mediaType=request.getHeader("Accept");               //HTTP 요청헤더에 지정된 문자열의 값을 리턴
 %>
 <h2>Request내장 객체 예제2</h2>
 프로토콜명 : <%=protocol %><p>
 접속한 서버명 : <%=server %><p>
 접속한 서버의 포트 번호 : <%=port %><p>
 클라이언트의 IP : <%=clientIP %><p>
 클라이언트의 호스트명 : <%=clientHost %><p>
 현재 페이지의 method방식 : <%=methodType %><p>
 요청한 현재 페이지의 경로 : <%=url %><p>
 요청한 현재 페이지의 경로 URI: <%=uri %><p>

 <%=browser %><p>
 </br>
 <%=mediaType %><p>
 </br>
 <%=contextpath %>
</body>
</html>


//-----------------------------------------------------------------------------------------------------------------------


response 내장 객체

 

response 내장 객체 메소드 

void setHeader(name, value)

void setContentType(Type)

void sendRedirect(url)


setHeader(name,value) 메소드는 웹 브라우저로 응답될 Header 정보를 새로 설정하기 위한 메소드이다.

                                  이 메소드는 헤더 설정 정보를 새로 설정하는 작업에서 주로 사용된다.

setContentType(type) 메소는 page 디렉티브의 contentType 속성과 같은 역할을 한다.

sendRedirect(url) 메소드는 해당 페이지로 리다이렉트할 때 사용된다.

sendRedirect(url) 메소드와 유사한 것으로 <jsp:forward> 액션 태그가 있는데 하는 작업은 비슷해 보이지만, 내부적으로 처리되는

                         요청의 개수가 다르고 세부적으로 적용되는 작업이 다르다.

                         둘의 차이에 대한 설명은 액션 태그에서 다룬다.


예제

 

responseTest1.jsp파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <h2>Response 내장 객체 예제</h2>
 현재 페이지는 responseTest1.jsp 페이지 입니다.
 
 <%
 response.sendRedirect("responseTest1_1.jsp");%>
</body>
</html>


responseTest1_1.jsp파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <h2>Response 내장 객체 예제</h2>
 현재 페이지는 responseTest1.jsp 페이지 입니다.
 
 <%
 response.sendRedirect("responseTest1_1.jsp");%>
</body>
</html>


//-----------------------------------------------------------------------------------------------------------------------


out 내장 객체

 

out 내장 객체 메소드

 

boolean isAutoFlush()                                //출력 버퍼가 다 찼을 때 처리여부를 결정하는것으로 자동으로 플러시 할

                                                                     경우는 true , 그렇지 않을 경우 false

int getBufferSize()                                       //출력 버퍼의 전체 크기를 리턴한다.

int getRemaining()                                      //현재 남아 있는 출력 버퍼의 크기를 리턴한다.

void clearBuffer()                                        //현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하지 않고 비운다.

String println(str)                                         //주어진 str 값을 웹 브라우저에 출력한다. 이때 줄바꿈은 적용되지 않는다.

void flush()                                                  //현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하고 비운다.

void close()                                                 //현재 출력 버퍼에 저장되어 있는 내용을 웹 브라우저에 전송하고

                                                                       출력스트림을 닫는다.

 

JSP 페이지가 생성한 결과를 웹 브라우저에 전송해 주는 출력 스트림이며, JSP페이지가 웹 브라우저에게 보내는 모든 정보는 out 객체로 통해서 전송된다.

여기서 모든 정보는 스크립트요소 뿐만 아니라 비스크립트 요소인 HTML, 일반텍스트도 모두 포함된다.

out 객체는 javax.servlet.jsp.JspWriter 클래스 타입으로 JSP에서는 out 객체로 사용 된다.

주로 많이 사용되는 메소드는 웹 브라우저에 출력을 하기 위한 println() 메소드이다.

 

<%=코드%> 과 <%out.println(코드)%> 는 같은 것이다.

JSP 페이지에서 개발자들의 편의성을 제공하기 위해서

<%=코드%> 이 만들어진 것 뿐이다.

JSP 페이지가 서블릿으로 변환될 때 <%=코드%> 부분은 out.println(코드)로 변환이 되어 실행된다.

표현식 <%=코드%> 는 스크립트릿<% %> 안에서 쓸 수 없다.

 

예제

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  int bufferSize=out.getBufferSize();
  int remainSize=out.getRemaining();
  int usedSize=bufferSize-remainSize;
 %>
 <h2>Out 내장 객체 예제</h2>
 <b>현재 페이지에서의 버퍼의 사용현황</b><p>
 출력 버퍼의 전체 크기 : <%=bufferSize %><p>
 현재 사용한 버퍼의 크기 : <%=usedSize %><p>
 남은 버퍼의 크기 : <%out.println(remainSize); %><p>
</body>
</html>

 

//-----------------------------------------------------------------------------------------------------------------------

 

page Context 내장 객체

 

pageContext 내장 객체 메소드

 

ServletRequest getRequest()                      //페이지 요청 정보를 가지고 있는 request 내장 객체를 리턴한다.

ServletResponse getResponse()               //페이지 요청에 대한 응답 정보를 가지고 있는 response 내장 객체를 리턴 한다.

JspWriter getOut()                                      //페이지 요청에 대한 응답 출력 스트림인 out 내장 객체를 리턴한다.

HttpSession getSession()                          //요청한 클라이언트의 세션 정보를 담고 있는 session 내장 객체를 리턴 한다.

ServletContext getServletContext()              //페이지에 대한 서블릿 실행 환경 정보를 담고 있는

                                                                     application 내장 객체를 리턴한다.

Object getPage()                                        //page 내장 객체를 리턴 한다.

ServletConfig getServletConfig()                  //페이지의 서블릿 초기 정보 설정 정보를 담고 있는 config 내장 객체를

                                                                     리턴한다.

Exception getException()                            //페이지 실행 중에 발생되는 에러 페이지에 대한 예외정보를 갖고 있는

                                                                      exception 내장 객체를 리턴 한다.


pageContext 객체는 현재 JSP 페이지의 컨텍스트를 나타내며, 주로 다른 내장 객체를 얻어 내거나,

페이지의 흐름제어 그리고 에러데이터를 얻어낼 때 사용된다.

javax.servlet.jsp.PageContext 객체 타입으로, JSP에서는 pageContext 객체로 사용된다.

 

ex>

JspWriter outObject=pageContext.getOut();     //pageContext 객체를 이용하여 out 객체를 얻어내는 방법이다.


//-----------------------------------------------------------------------------------------------------------------------

 

session 내장 객체

 

session 내장 객체 메소드

 

String getId()                                                 //해당 세션의 고유한 세션 ID를 리턴 한다.

long getCreationTime()                                 //해당 세션이 생성된 시간을 리턴 한다.

long getLastAccessedTime()                       //웹 브라우저의 요청이 시도된 마지막 접근시간을 리턴 한다.

void setMaxInactiveInterval(time)                  //해당 세션을 유지할 시간을 초단위로 설정한다.

                                                                       time에 해당하는 시간 '초' 이 지날경우 session 의 속성값이

                                                                       모두 제거되어 연결이 끊긴다.

int getMaxInactiveInterval()                           //기본값은 30분으로 setMaxInactiveInterval(time)로 지정된 값을 리턴 한다.

boolean isNew()                                          //새로 생성된 세션의 경우 true 값을 리턴 한다.

void invalidate()                                           //현재 설정된 세션의 속성 값을 모두 제거한다.

                                                                      주로 세션을 종료시킬 때 사용된다.

 

session 객체는 웹 브라우저의 요청시 요청한 웹 브라우저에 관한 정보를 저장하고 관리하는 내장 객체라 할 수 있다.

seesion 객체는 javax.servlet.http.HttpSession 객체 타입으로, JSP에서는 session 객체로 사용된다.

session 객체는 웹 브라우저(클라이언트)당 1개가 할당된다. 따라서 주로 회원관리에서 사용자 인증에 관련된

작업을 수행할 때 사용된다.

다른 내장 객체들은 물론 session 객체도 별도의 생성 없이 암묵적으로 사용된다. 이것은 page 디렉티브의 session 속성이

'true'로 설정이 되어 있어야 가능하다. 물론 session 속성은 기본값이 'true' 이다. 따라서 사용하는데 아무런 문제가 없다.

 

예제 


sessionTestForm1.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <h1>Session 내장객체 예제</h1>
 <form method=post action="sessionTest1.jsp">
  아이디 : <input type="text" name="id"><p>
  패스워드 : <input type="password" name="passwd"><p>
  <input type="submit" value="로그인">
 </form>
</body>
</html>


sessionTest1.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  request.setCharacterEncoding("euc-kr");
 %>
 <%
  String id=request.getParameter("id");
  String passwd=request.getParameter("passwd");
 
  session.setAttribute("id",id);         //session속성 id의 값에 id 변수값을 할당
  session.setMaxInactiveInterval(60*2);     //2분
 %>
 <h2>Session 내장 객체 예제</h2>
 <form method=post action="sessionTest2.jsp">
  ☆ 가장 좋아하는 스포츠를 선택하세요. ☆ <br>
   <input type="radio" name="sports" value="태권도">태권도
   <input type="radio" name="sports" value="유도">유도
   <input type="radio" name="sports" value="프로레슬링">프로레슬링
   <input type="radio" name="sports" value="이종격투기">이종격투기<p>
   
   ☆ 가장 좋아하는 게임을 선택하세요. ☆ <br>
   <select name="game">
    <option value="스타크">스타크(아직도 좋다)</option>
    <option value="WOW">WOW</option>
    <option value="리니지">리니지</option>
   </select>
   <input type="submit" value="전송">  
 </form>
</body>
</html>


sessionTest2.jsp 파일 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
 request.setCharacterEncoding("euc-kr");
 %>
 <h2>Session 내장 객체 예제</h2>
 <%
  String sports=request.getParameter("sports");
  String game=request.getParameter("game");
  String id=(String)session.getAttribute("id");
  String sessionId=session.getId();
 
  if(id!=null){
 %>
 <b><%=id %></b>님 접속해주셔서 갑사합니다.</br>
 <%=id %>님 좋아하는 스포츠는 <%=sports %>이고,</br>
  좋아하는 게임은 <%=game %>입니다.<p>
  현재 웹브라우저의 세션ID : <%=sessionId %><p>
 <%
  session.invalidate();   //세션의 무효화,종료
  }
  else{
   out.println("로그인을 하시기 바랍니다.");
  } 
 %>
</body>
</html>


//-----------------------------------------------------------------------------------------------------------------------

 

application 내장 객체

 

application 내장 객체 메소드

 

String getServerInfo()                                       //applcation.getServerInfo() 일경우 웹 컨테이너의 이름과 버전을 리턴한다.

 

ex> getServletInfo() 를 사용할 경우는 [page 디렉티브의 info="문자열"] 의 문자열 내용을 리턴

        위의 메소드와 혼동하지 말것

 

String getMimeType(fileName)                          //지정한 파일의 MIME 타입을 리턴한다.

String RealPath(path)                                       //지정한 경로를 웹 어플리케이션 시스템상의 경로로 변경하여 리턴한다.

void log(message)                                           //로그 파일에 message를 기록한다.

 

웹 어플리케이션의 설정 정보를 갖는 context와 관련이 있는 객체로 웹 어플리케이션과 연관이 있다.

application 객체는 웹 어플리케이션이 실행되는 서버의 설정 정보 및 자원에 대한 정보를 얻어내거나

어플리케이션이 실행되고 있는 동안에 발생할 수 있는 이벤트 로그 정보와 관련된 기능들을 제공한다.

 

application 내장 객체는 웹 어플리케이션당 1개의 객체가 생성된다.

따라서 application 내장 객체는 하나의 웹 어플리케이션에서 공유하는 변수로 사용된다.

application 객체는 웹 사이트의 방문자 기록을 카운트할 때 주로 사용된다.

 

jsp파일이 java파일로 변환된 생성위치

D:\Source1\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\startPage\org\apache\jsp

jsp파일 위치

D:\Source\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\프로젝트명\

 

예제

 

applicationTest1.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  String info=application.getServerInfo();
  int major=application.getMajorVersion();                                             //Major Version  
  int minor=application.getMinorVersion();                                             //Minor Version
  String path=application.getRealPath("/");
  application.log("로그 기록");  
 %>
 <h2>Application 내장 객체 예제</h2>
 웹 컨테이너의 이름과 버전 : <%=info %><p>
 서블릿의 버전 : <%=major %>,<%=minor %><p>
 웹 어플리케이션 폴더의 로컬 시스템 경로 : <%=path %>
</body>
</html>


출력 결과

Application 내장 객체 예제

웹 컨테이너의 이름과 버전 : Apache Tomcat/5.5.27

서블릿의 버전 : 2,4

웹 어플리케이션 폴더의 로컬 시스템 경로 :

D:\Source\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\application\


//-----------------------------------------------------------------------------------------------------------------------

 

 config 내장 객체

 

application 내장 객체 메소드

 

Enumeration getInitParameterNames()                                             //모든 초기 파라미터 이름을 리턴한다.

String getInitParameter(name)                                                          //이름이 name 인 초기 파라미터의 값을 리턴한다.

String getServletName()                                                                    //서블릿의 이름을 리턴한다.

ServletContext getServletContext()                                                     //실행하는 서블릿 ServletContext 객체를 리턴한다.


config 내장 객체는 javax.servlet.ServletConfig 객체 타입으로 ServletConfig 객체는 서블릿이 초기화되는 동안 참조해야 할

정보를 전달해 주는 역할을 한다. 즉, 서블릿이 초기화될 때 참조해야하는 정보를 가지고 있다가 전달해준다.

config 내장 객체는 컨테이너당 1개의 객체가 생성된다. 같은 컨테이너에서 서비스되는 모든 페이지는 같은 객체를 공유한다.

 

//-----------------------------------------------------------------------------------------------------------------------

 

page 내장 객체

 

page 내장 객체는 JSP 페이지 그 자체를 나타내는 객체로 JSP 페이지 내에서 page 객체는 this 키워드 (this : 자바에서 자기 자신을

가리키는 레퍼런스) 로 자기 자신을 참조할 수가 있다. 그리고 page 객체는 javax.servlet.jsp.HttpJspPage 클래스 타입으로 제공되는

JSP 내장 객체이다.

웹 컨테이너는 자바만을 스크립트 언어로 지원하기 때문에 page 객체는 현재 거의 사용되지 않는 내장 객체이다. 그러나 자바 이외의

다른 언어가 사용된다면 page 객체를 참조하는 경우가 발생할 수 있다.

 

예제

 

pageTest1.jsp 파일

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" info="Page 내장 객체 예제"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <%
  String info=this.getServletInfo();
 %>
 <h2>Page 내장 객체 예제</h2>
 page 디렉티브의 info속성값 " <%=info %> " 을 얻어낸다.
</body>
</html>


//-----------------------------------------------------------------------------------------------------------------------

exception 내장 객체

 

exception 내장 객체 메소드

 

String getMessage()                                               //발생된 예외의 메시지를 리턴한다.

String toString()                                                      //발생된 예외 클래스명과 메시지를 리턴한다.

String printStackTrace()                                          //발생된 예외를 역추적하기 위해 표준 예외 스트림을 출력한다.


exception 내장 객체는 JSP 페이지에서 예외가 발생하였을 경우 예외를 처리할 페이지를 지정하였을 때 예외 페이지에 전달되는

객체이다. exception 객체는 page 디렉티브의 isErrorpage 속성을 true로 지정한 JSP 페이지에서만 사용 가능한 내장 객체로

java.lang.Throwable 객체의 타입이다.

 

//-----------------------------------------------------------------------------------------------------------------------

2010/01/11 13:09 2010/01/11 13:09

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/18

댓글을 달아 주세요

스크립트 요소

 

JSP의 스크립트 요소는

선언문, 스크립트릿, 표현식

3가지가 있다.

 

선언문(Declaration)   <%! %>

사용될 변수나 메소드를 선언 <전역 변수로 선언된다>

 

스크립트릿(Scriptlet)  <%  %>

지역변수 선언


표현식(Expression)   <%= %>

변수의 값을 출력하거나 메소드 결과값을 표현


주석(Comment)

 

HTML 주석

<!-- JSP & <%=name%> -->

 

JSP 주석

<%-- JSP & <%=name%> --%>

 

자바 주석

<%....../*주석*/ (여러 줄에 걸친 주석) ......%>

<%......//주석 (한 줄 주석) ......%>


2010/01/11 13:08 2010/01/11 13:08

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/17

댓글을 달아 주세요

JSP 페이지의 디렉티브

 

디렉티브(Directive)는 클라이언트가 요청한 JSP 페이지가 실행이 될 때 필요한 설정 정보를 지정하는 경우에 사용된다.

디렉티브(Directive)는 설정 정보를 지정하는 것으로, 디렉티브(Directive)는 태그안에서 @로 시작하며, 다음과 같은

3가지 종류가 있다.

· page

· include

· taglib

 

page 디렉티브(Directive)        <%@ page%>

 

info="설명..."                                                          //페이지를 설명해 주는 문자열을 지정하는 속성

 

language="java"                                                      //JSP 페이지의 스크립트 요소에서 사용할 언어를 지정하는 속성

 

contentType="text/html; charset=euc-kr"                     //JSP 페이지가 생성할 문서의 타입을 지정하는 속성

 

extends="system.MasterClss"                                   //자신이 상속 받을 클래스를 지정할 때 사용하는 속성

 

import="java.util.Vector, java.text.SimpleDateFormat"     //다른 패키지에 있는 클래스를 가져다 쓸 때 사용하는 속성

 

session="true"                                                         //HttpSession을 사용할지 여부를 지정하는 속성

 

buffer="10kb"  or  buffer="none"                                  //JSP 페이지의 출력버퍼의 크기를 지정하는 속성

 

autoFlush="false"                                                     //출력버퍼가 다 찰 경우에 저장되어 있는 내용의 처리를 설정 하는 속성

 

isThreadSafe="true"                                                  //현 페이지에 다중쓰레드를 허용할지 여부를 설정하는 속성

 

errorPage="error/fail.jsp"                                           //에러발생시 에러를  처리할 페이지를 지정하는 속성

 

isErrorPage="false"                                                   //해당페이지를 에러페이지로 지정하는 속성

 

pageEncoding="euc-kr"                                             //해당페이지의 문자 인코딩을 지정하는 속성

 

isELIgnored="true"                                                     //표현언어(EL)에 대한 지원여부를 설정하는 속성

 

<% @page  info="copyright by ..." %>                         // 내용을 출력하려면 <%=getServletInfo()%>

<% @page  language="java" %>

<% @page  contentType="text/html"%>

<% @page  contentType="text/html charset=euc-kr"%>

<% @page  extends="com.samyangm.ClassDef"%>

<% @page  session="false"%>

<% @page  buffer="10kb"%>

<% @page  autoFlush="false"%>

<% @page  isThreadSafe="false"%>

<% @page  errorPage="errorPro.jsp"%>

<% @page  isErrorPage="true"%>

<% @page  pageEncoding="euc-kr"%>

 


 include 디렉티브(Directive)        <%@ include%>

 

<%@ include  file="로컬URL" %>

include 디렉티브의 처리 과정은 정적이라고 할 수가 있다.

include 디렉티브를 사용한 JSP 페이지가 컴파일 되는 과정에서

include 되는 JSP 페이지의 소스 내용을 그대로 포함해서

컴파일을 하게 된다. 즉, 복사 & 붙여넣기 방식으로 두 개의 파일이

하나의 파일로 구성된 후 같이 변환되고 컴파일된다는 것이다.

 

이 의미는 include 되는 파일의 결과가 포함되는 것이 아니라 단순히 파일의 내용이 텍스트로

include 디펙티브가 위치한 자리에 그대로 복사되는 것이다.

 

taglib 디렉티브(Directive)                 <%@ taglib%>     //이부분은 나중에 다시 자세히 다루겠다.


taglib 디렉티브는 표현 언어(EL : Expression Language), JSTL(JSP Standard Tag Library), 커스텀 태크(Cunstom Tag)를

JSP 페이지 내에 사용할 때 사용되어진다.


사용 방법은 아래와 같이 두 개의 속성인 prefix 속성과, uri 속성의 값을 지정해 주어야 한다.

사용자가 정의한 어떠한 태그라도 설정의 정보는 uri 속성의 값이 가지고 있고,

이것을 해당 페이지 내에서 사용할 때 uri 속성의 값이 복잡하므로 prefix 속성의 값이 별명과 같은 역할을 한다.

즉, prefix 속성의 값을 사용하면 uri 속성의 값을 사용하는 것과 같다.


<% taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

--중략--

<c:set var="aInt" value="123"%>

 

2010/01/11 13:08 2010/01/11 13:08

트랙백 주소 :: http://thinkit.or.kr/programming/trackback/16

댓글을 달아 주세요