반응형
향상된 for 루프는 J2SE 5.0에서 새로운 언어기능으로 소개된 것으로,
Iterator를 생성하거나, 카운트 변수의 시작과 끝을 계산할 필요 없이
콜렉션을 반복 할 수 있게 해줍니다.

일단, 기본적인 Array에서 향상된 for loop의 사용을 비교해도록 하겠습니다.

more..


이전에 제가 작성한 코드입니다. 이것을 향상된 for문으로 더 간단하게 만들어보겠습니다.

more..



무지 신기하지요??+ㅛ+
자 이제, 이게 어떻게 변하는 가를 설명하도록 하겠습니다.
기존에 for문은 카운트 변수의 시작과 끝을 계산해야했습니다.
즉, row = 0 이고, row가 rowLand(지뢰의 세로 길이 - scanner을 통해서 받은 값)보다
작을 때까지만.. row을 계속 늘려줘라-ㅅ-; 뭐 요런 것인데요.
향상된 for문을 보면
for(String[] row : landMine)

이런식으로 간단하게 줄여졌습니다.
이는, "landMine이라는 이름의 배열의 엘리멘트(row) 반복"으로 읽을 수 있습니다.
자동으로 엘리멘트의 길이를 측정한다고 볼 수 있겠네요..

향상된 for loop의 기본 syntax을 다음과 같이 나타낼 수 있습니다.
   	EnhancedForStatement:
for ( Type Identifier : Expression )
Statement   
Expression must be an instance of a new interface
    called java.lang.Iterable, or an array.

Expression java.lang.Iterable 또는 array라 일컬어지는
새로운 인터페이스의 인스턴스야만 한다.


향상된 for loop에도 단점이 있다고 합니다.

So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot use it everywhere. Consider, for example, the expurgate method. The program needs access to the iterator in order to remove the current element. The for-each loop hides the iterator, so you cannot call remove. Therefore, the for-each loop is not usable for filtering. Similarly it is not usable for loops where you need to replace elements in a list or array as you traverse it. Finally, it is not usable for loops that must iterate over multiple collections in parallel.

당신은 for-each(향상된 for) 루프를 언제 사용하여야 하는가?
언제든지 가능하다. 그러면 당신의 코드를 정말 아름답게 할 것 이다..-ㅅ-;;
허나.. 불행하게도, 당신은 for-each를 어디에서든지 사용할 수 없다.
예들들어, 삭제 메소드를 고려해보라. 프로그램은 현재 element을 제거하기 위해
iterator에 접근하는 것을 필요로 한다. for-each loop는 iterator를 숨긴다.
그래서 당신은 remove을 부를 수 없다.
그러므로, for-each loop는 필터링에 쓰기에는 편리하지 않다.
유사하게, 당신은 콜렉션을 순회하면서,
list나 array에 element들을 바꾸는 것을 필요로 할 때, 적합하지 않다.
마지막으로, 동시에 복합적인 콜렉션을 되풀이하는 것은 적합하지 않다.

아 ! 그리고,
지뢰찾기 자료 입력 부분도 for-each문으로 바꿔보고자 했는데,
잘되지가 않아서.. 많은 블로그를 돌아다니면서 예제를 찾아보았는데요.
자료를 입력해주는 부분에는
향상된 for 루프를 사용하지 않고, 일반 for loop를 사용하드라구요.
좀 더 조사해봐야 할 것 같네요.-ㅛ-

자자자자자 그렇다면,
ArrayList와 같은 콜렉션에서 향상된 for loop(for-each)는
어떻게 쓰여질까요??(제너릭과 iterator(), hasNext()등등의 사용..-ㅅ-)
그것은...............
콜렉션에 대해 좀 더 공부하는 시간을 가진 후에,
그때 다시 포스팅하도록 하겠습니다. +ㅅ+ ㅋㅋ
위에 해석한 단점도.. 그때서야 비로소 이해할 수 있을 것 같네요-ㅛ-;

< 출처: http://happystory.tistory.com >
반응형

게시판 연습

 

[여기서는 먼저 전 게시물의 JDBC 프로그래밍을 복습한 후에 내용을 보시기 바랍니다.]

 

JDBC 프로그래밍에서 실습한 GetEmp.java 순수 애플리케이션을 서블릿으로 바꾸고 실행해 보세요(servlet API 참고)

[참고] JDBC 드라이버 (ORACLE_HOME/jdbc/lib/classes12.jar, nls_charset12.jar)를 {애플리케이션홈}/WEB-INF/lib 에

복사합니다.

 

문제 1 답:

 

package example;

 

import java.sql.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class GetEmp extends HttpServlet {

         private String DB_URL;

         private String DB_USER;

         private String DB_PASSWORD;

        

         public void init(ServletConfig config) throws ServletException {

                  super.init(config);

                  //설치과정에서 자신이 정한 정보에 맞게 바꾼다.

                  DB_URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

                  DB_USER="scott";

                  DB_PASSWORD="tiger";

                 

                  try {

                           //드라이버를 로딩합니다.

                           Class.forName("oracle.jdbc.driver.OracleDriver");

                  }catch(ClassNotFoundException e){

                           e.printStackTrace();

                  }

         }

 

         public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException {

                  res.setContentType("text/html;charset=euc-kr");

                  PrintWriter out = res.getWriter();

                  Connection conn = null;

                  Statement stmt = null;

                  ResultSet rs = null;

                  String query="select * from emp";

                  try {

                           //데이터베이스의 연결을 설정합니다.

                           conn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD);

                           //Statement를 가져온다.

                           stmt=conn.createStatement();

                           //SQL문을 실행합니다.

                           rs=stmt.executeQuery(query);

                           while(rs.next())  {

                                   String empno=rs.getString(1);

                                   String ename=rs.getString(2);

                                   String job=rs.getString(3);

                                   String mgr=rs.getString(4);

                                   String hiredate=rs.getString(5);

                                   String sal=rs.getString(6);

                                   String comm=rs.getString(7);

                                   String depno=rs.getString(8);

                                   //결과를 출력합니다.

                                    out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

                           }

                  } catch (SQLException e) {

                           e.printStackTrace(out);

                  }

                  finally {

                           try{

                                   rs.close();

                                   stmt.close();

                                   conn.close();

                           }catch(SQLException e){}

                  }

         }

}


7369 : SMITH : CLERK : 7902 : 1980-12-17 00:00:00.0 : 800 : null : 20
7499 : ALLEN : SALESMAN : 7698 : 1981-02-20 00:00:00.0 : 1600 : 300 : 30
7521 : WARD : SALESMAN : 7698 : 1981-02-22 00:00:00.0 : 1250 : 500 : 30
7566 : JONES : MANAGER : 7839 : 1981-04-02 00:00:00.0 : 2975 : null : 20
7654 : MARTIN : SALESMAN : 7698 : 1981-09-28 00:00:00.0 : 1250 : 1400 : 30
7698 : BLAKE : MANAGER : 7839 : 1981-05-01 00:00:00.0 : 2850 : null : 30
7782 : CLARK : MANAGER : 7839 : 1981-06-09 00:00:00.0 : 2450 : null : 10
7788 : SCOTT : ANALYST : 7566 : 1987-04-19 00:00:00.0 : 3000 : null : 20
7839 : KING : PRESIDENT : null : 1981-11-17 00:00:00.0 : 5000 : null : 10
7844 : TURNER : SALESMAN : 7698 : 1981-09-08 00:00:00.0 : 1500 : 0 : 30
7876 : ADAMS : CLERK : 7788 : 1987-05-23 00:00:00.0 : 1100 : null : 20
7900 : JAMES : CLERK : 7698 : 1981-12-03 00:00:00.0 : 950 : null : 30
7902 : FORD : ANALYST : 7566 : 1981-12-03 00:00:00.0 : 3000 : null : 20
7934 : MILLER : CLERK : 7782 : 1982-01-23 00:00:00.0 : 1300 : null : 10

 

위와 같은 결과 화면을 웹 브라우저에서 확인하셨습니까?

GetEmp 서블릿의 57번째 줄에서 에러가 발생한다는 메시지를 보신다면 /bbs/WEB-INF/lib 에 classes12.jar 파일을 복사하지 않으셨거나 오라클이 가동중이 아니거나 리슨너가 가동중이 아니거나 한 경우입니다.

윈도우에서 오라클을 설치하셨다면 나중 2개는 무시하시고 JDBC 드라이버를 올바른 위치에 복사했는지 확인하시기 바랍니다.

 

문제 2 : 위 서블릿을 JSP로 바꾸어 보세요

 

문제 2 답: 파일명 getEmp.jsp

 

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

<%@ page import="java.sql.*" %>

<%

         String DB_URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

         String DB_USER="scott";

         String DB_PASSWORD="tiger";

         //설치과정에서 자신이 정한 정보에 맞게 바꾼다.

         try {

                  //드라이버를 로딩합니다.

                  Class.forName("oracle.jdbc.driver.OracleDriver");

         } catch(ClassNotFoundException e){

                           e.printStackTrace();

         }

 

         Connection conn = null;

         Statement stmt = null;

         ResultSet rs = null;

         String query="select * from emp";

         try {

                  //데이터베이스의 연결을 설정합니다.

                  conn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD);

                  //Statement를 가져온다.

                  stmt=conn.createStatement();

                  //SQL문을 실행합니다.

                  rs=stmt.executeQuery(query);

                  while(rs.next()) {

                           String empno=rs.getString(1);

                           String ename=rs.getString(2);

                           String job=rs.getString(3);

                           String mgr=rs.getString(4);

                           String hiredate=rs.getString(5);

                           String sal=rs.getString(6);

                           String comm=rs.getString(7);

                           String depno=rs.getString(8);

                           //결과를 출력합니다.

                           out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

                  }

         } catch (SQLException e) {

                  out.println("SQLException: " + e.getMessage());

         }

         finally {

                  try {

                           rs.close();

                           stmt.close();

                           conn.close();

                  } catch(SQLException e){}

         }

%>

 

문제 1 에서와 같은 결과를 확인했습니까?

문제1의 서블릿과 지금 JSP는 코드가 조금 다릅니다.

서블릿에서는 init 메소드에서 JDBC 드라이버에 대한 설정을 했습니다.

서블릿의 라이트 사이클에서 살펴 보았듯이 init 메소드안의 내용은 처음 사용자가 요청한 경우를 제외하고는 다음 요청 부터는 JDBC 드라이버 설정을 하지 않으므로 그렇지 않은 코드보다는 성능이 좋습니다.

JSP에서도 서블릿의 init 메소드와 같은 메소드가 있을 것입니다. 이것은 여러분이 찾아서 고치시기 바랍니다.

 

 

ConnectionPool 사용법

 

데이터베이스에 대한 Connection 을 관리하는 것은 매우 바람직한 일입니다.
왜냐하면 매 페이지마다 데이터베이스에 연결을 시도하는 것(= 커넥션 객체를 얻는것)은 시간이 많이 걸리는 작업입니다.
그럼에도 불구하고 위에서 우리는 Connection 을 얻은 후 사용 후 바로 자원을 반납했습니다
.

 

Database Connection Pool 이란 이전에 연결된 Connection 을 종료하지 않고 웹 클라이언트의 요구시 기존의 Connection을

통하여 데이터베이스에 접근할 수 있도록 하는 free Connection list 입니다.

즉, 시간이 오래 걸리는 커넥션 객체를 쓰고 난 다음에 리스트에서 넣고 관리하겠다는 의미입니다.

적절하게 리스트를 관리하면 시간을 절약하는데 크게 기여하게 하는 기법입니다.

 

. 전체 클래스 요약

 

Log.java
에러 메시지를 콘솔화면에 표시하기 위한 클래스입니다.

 

DBConnectionPoolManager.java

각 데이터베이스의 커넥션풀을 관리하기 위한 클래스입니다.

 

DBConnectionPool.java
DBConnectionPoolManager가 관리하는 데이터베이스당 가지는 커넥션 풀
실제로 이 클래스가 이미 생성된 커넥션을 관리
합니다.

 

ConnectionManager.java
DBConnectionPoolManager 클래스에 일을 시키는 클래스인데
여러 데이터베이스를 고려한 추상클래스입니다.
데이터베이스에 따라서 이 클래스를 상속받아 알맞는 클래스
를 만듭니다.

 

OracleConnectionManager.java 
데이터베이스 오라클을 사용하기 위해 ConnectionManager 클래스를 상속한 서브 클래스입니다.

 

oracle.properties
오라클 설정 파일입니다.
최대 커넥션 수, 초기 커넥션 수 등의 셋팅을 담당합니다.

이렇게 설정 내용을 코드가 아닌 파일에 저장하면 관리하기가 쉽습니다.

 

. 커넥션 풀 관련 소스

 

Log.java


package net.java_school.util;

 

import java.io.*;

import java.util.Date;

 

public class Log {

         public String dbgFile = "H:\\debug\\error.dbg"; // 윈도우  계열

         //public String dbgFile = "/debug/error.dbg"; // 유닉스 계열

 

         FileWriter fw = null;

         public Log() {

                  super();

                  try{

                           fw = new FileWriter(dbgFile, true);

                  }catch(IOException e){}

         }

 

         public void close() {

                  try{

                           fw.close();

                  }catch(IOException e){}

         }

 

         public void close(FileWriter fw) {

                  try{

                           fw.close();

                  }catch(IOException e){}

         }

 

         public void debug(String msg) {

                  try{

                           fw.write("-------------------------------------------------\r\n");

                           fw.write(new java.util.Date()+ " : ");

                           fw.write(msg + " \r\n");

                           fw.write("-------------------------------------------------\r\n");

                           fw.flush();

                  }catch(IOException e){

                           System.err.println("IOException.......!!");

                  }

         }

 

         public static void out(String msg) {

                  System.out.println(new Date() + ": "+msg);

         }

 

         public static void err(String msg) {

                  System.out.println(new Date() + ": "+msg);

         }

 

         public static void err(Throwable e,String msg) {

                  System.err.println(new Date() + ": "+msg);

                  e.printStackTrace(System.out);

         }

}


DBConnectionPool.java


package net.java_school.db.dbpool;


import java.util.*;
import java.sql.*;
import java.util.Date;
import net.java_school.util.Log;


// Connection Pool을 관리하는 클래스
class DBConnectionPool {
 
    // 현재 사용 중인 Connection 개수
    private int checkedOut;
 
    // Free Connection List
    private Vector freeConnections = new Vector();

    // Connection 최대 개수
    private int maxConn;

    // Connection 초기 개수
    private int initConn;

    // Waiting time (pool에 connection이 없을때 기다리는 최대시간)
    private int maxWait;

    // Connection Pool Name
    private String name;

    // DB Password
    private String password;

    // DB URL
    private String URL;

    // DB UserID
    private String user;

    // Constructor
    public DBConnectionPool(String name, String URL, String user, String password, int maxConn, int initConn, int waitTime) {
        this.name = name;
        this.URL = URL;
        this.user = user;
        this.password = password;
        this.maxConn = maxConn;
        this.maxWait = waitTime;
 
        for (int i = 0; i < initConn; i++) {
            freeConnections.addElement(newConnection());
        }
    }
 
    // Connection 반납
    // @param con : 반납할 Connection
    public synchronized void freeConnection(Connection con) {
        freeConnections.addElement(con);
        checkedOut--;
        // Connection을 얻기 위해 대기하고 있는 thread에 알림
        notifyAll();
    }
 
    // Connection 을 얻음
    public synchronized Connection getConnection() {
        Connection con = null;

        // Connection이 Free List에 있으면 List의 처음 것을 얻음
        if (freeConnections.size() > 0) {
            con = (Connection) freeConnections.firstElement();
            freeConnections.removeElementAt(0);
            try {
                // DBMS에 의해 Connection이 close 되었으면 다시 요구
                if (con.isClosed()) {
                    Log.err("Removed bad connection from " + name);
                    con = getConnection();
                }
            } // 요상한 Connection 발생하면 다시 요구
            catch (SQLException e) {
                Log.err(e, "Removed bad connection from " + name);
                con = getConnection();
            }
        } // Connection이 Free List에 없으면 새로 생성
        else if (maxConn == 0 || checkedOut < maxConn) {
            con = newConnection();
        }
        if (con != null) {
            checkedOut++;
        }
        return con;
    }
 
    // Connection을 얻음
    // @param timeout : Connection을 얻기 위한 최대 기다림 시간
    public synchronized Connection getConnection(long timeout) {
        long startTime = new Date().getTime();
        Connection con;

        while ((con = getConnection()) == null) {
            try {
                wait(timeout * maxWait);
            } catch (InterruptedException e) {}
            if ((new Date().getTime() - startTime) >= timeout) {
                // 기다림 시간 초과
                return null;
            }
        }
        return con;
    }
 
    // Connection 생성
    private Connection newConnection() {
        Connection con = null;

        try {
            if (user == null) {
                con = DriverManager.getConnection(URL);
            } else {
                con = DriverManager.getConnection(URL, user, password);
            }
            Log.out("Created a new connection in pool " + name);
        } catch (SQLException e) {
            Log.err(e,
                    "Can't create a new connection for " + URL + " user : "
                    + user + " passwd : " + password);
            return null;
        }
        return con;
    }
}



DBConnectionPoolManager.java


package net.java_school.db.dbpool;

 

import java.sql.*;

import java.util.*;

import net.java_school.util.Log;


public class DBConnectionPoolManager {

         // 인스턴스를 하나만 유지하기 위해 static 으로 선언

         static private DBConnectionPoolManager instance=null;

         //JDBC 드라이버 관리

         private Vector drivers = new Vector();

         // DB Connection Pool List

         private Hashtable pools = new Hashtable();

         // DBConnectionPoolManager의 instance를 얻음

         // @return DBConnectionManger

         static synchronized public DBConnectionPoolManager getInstance() {

                  if (instance == null) {

                           instance = new DBConnectionPoolManager();

                  }

                  return instance;

         }

        

         // Default Constructor

         private DBConnectionPoolManager() {}

 

         // 현재 Connection을 Free Connection List로 보냄

         // @param name : Pool Name

         // @param con : Connection

         public void freeConnection(String name, Connection con) {

                  DBConnectionPool pool = (DBConnectionPool) pools.get(name);

                  if (pool != null) {

                           pool.freeConnection(con);

                  }

                  Log.out("One Connection of " + name + " was freed");

         }

 

         // Open Connection을 얻음. 현재 열린 커넥션이 없고 최대 커넥션 개수가

         // 사용 중이 아닐 때는 새로운 커넥션을 생성. 현재 열린 커넥션이 없고

         // 최대 커넥션 개수가 사용 중일 때 기본 대기 시간을 기다림

         // @param name : Pool Name

         // @return Connection : The connection or null

         public Connection getConnection(String name) {

                  DBConnectionPool pool = (DBConnectionPool) pools.get(name);

                  if (pool != null) {

                           return pool.getConnection(10);

                  }

                  return null;

         }

 

         // Connection Pool을 생성

         // @param poolName : 생성할 Pool Name

         // @param url : DB URL

         // @param user : DB UserID

         // @param password : DB Password

         private void createPools(String poolName, String url, String user, String password, int maxConn, int initConn, int maxWait) {

                  DBConnectionPool pool = new DBConnectionPool(poolName, url, user, password, maxConn, initConn, maxWait);

                  pools.put(poolName, pool);

                  Log.out("Initialized pool " + poolName);

         }

 

         // 초기화 작업

         public void init(String poolName, String driver, String url, String user, String passwd, int maxConn, int initConn, int maxWait) {

                  loadDrivers(driver);

                  createPools(poolName, url, user, passwd, maxConn, initConn, maxWait);

         }

 

         // JDBC Driver Loading

         // @param driverClassName : 사용하고자 하는 DB의 JDBC 드라이버

         private void loadDrivers(String driverClassName) {

                  try {

                           Class.forName(driverClassName);

                           drivers.addElement(driverClassName);

                           Log.out("Registered JDBC driver " + driverClassName);

                  } catch (Exception e) {

                           Log.err(e, "Can't register JDBC driver: " + driverClassName);

                  }

         }

        

         public Hashtable getPools() {

                  return pools;

         }

        

         public int getDriverNumber() {

                  return drivers.size();

         }

}



ConnectionManager.java


package net.java_school.db.dbpool;

 

import java.sql.*;

import java.io.*;

import java.util.*;

import net.java_school.util.Log;

 

public abstract class ConnectionManager {

         protected DBConnectionPoolManager connMgr=null;

         protected String poolName, dbServer, dbName, port, userID, passwd;

         int maxConn,initConn, maxWait;

         private Properties dbProperties;

         private String configFile;

 

         public ConnectionManager(String pool) {

                  poolName = pool;

                  // mnd 컨텍스트 베이스에 config디렉토리에 Property파일이 있음을 가정

                  configFile = "F:\\apps\\tomcat\\webapps\\mnd\\config\\"+poolName+".properties";

                  try {

                           dbProperties = readProperties();

                           dbServer = getProperty( "dbServer" );

                           port = getProperty( "port" );

                           dbName = getProperty( "dbName" );

                           userID = getProperty( "userID" );

                           passwd = getProperty( "passwd" );

                           maxConn = Integer.parseInt(getProperty("maxConn"));

                           initConn = Integer.parseInt(getProperty("initConn"));

                           maxWait = Integer.parseInt(getProperty("maxWait"));

                  } catch( IOException ioe ) {

                           Log.err( "Error reading properties of " + configFile);

                  }

         }

 

         public Connection getConnection() {

                  return (connMgr.getConnection(poolName));

         }

 

         public void freeConnection(Connection conn) {

                  connMgr.freeConnection(poolName,conn);

         }

 

         private String getProperty( String prop ) throws IOException {

                  return ( dbProperties.getProperty( prop ) );

         }

 

         protected synchronized Properties readProperties() throws IOException {

                  Properties tempProperties = new Properties();

                  FileInputStream in = new FileInputStream(configFile);

                  tempProperties.load(in);

                  return tempProperties;

         }

        

         public int getDriverNumber() {

                  return connMgr.getDriverNumber();

         }

}


OracleConnectionManager.java


package net.java_school.db.dbpool;

 

public class OracleConnectionManager extends ConnectionManager {

         public OracleConnectionManager() {

                  super("oracle");

                  String JDBCDriver = "oracle.jdbc.driver.OracleDriver";

                  // 오라클용 JDBC thin driver

                  String JDBCDriverType = "jdbc:oracle:thin";

                  String url = JDBCDriverType+":@"+dbServer + ":" + port + ":" + dbName;

                  connMgr = DBConnectionPoolManager.getInstance();

                  connMgr.init(poolName, JDBCDriver, url, userID, passwd, maxConn, initConn, maxWait);

         }

}

 

oracle.properties

 

#########################################
# Database Connection Properties for Oracle 9i
#########################################

# Database Server Name OR IP address
dbServer=127.0.0.1

# The port number your DB server listents to.
port=1521

# Database Name
dbName=ORCL

# Database User
userID=scott

# Database Password
passwd=tiger

# Maximum Connection Number
maxConn=20

# Inital Connection Number
initConn=5

# Maximum Wait Time
maxWait=5

 

문제 1

getEmp.jsp 를 ConnectionPool을 이용하게 고쳐보세요

 

 

getEmpWithPool.jsp

 

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

<%@ page import="java.sql.*, net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" class="net.java_school.db.dbpool.OracleConnectionManager" scope="application" />

<%

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String query="select * from emp";

try {

          //데이터베이스의 연결을 설정합니다.커넥션풀 이용

          conn=dbmgr.getConnection();

          //Statement를 가져온다.

          stmt=conn.createStatement();

          //SQL문을 실행합니다.

          rs=stmt.executeQuery(query);

          while(rs.next()) {

                   String empno=rs.getString(1);

                   String ename=rs.getString(2);

                   String job=rs.getString(3);

                   String mgr=rs.getString(4);

                   String hiredate=rs.getString(5);

                   String sal=rs.getString(6);

                   String comm=rs.getString(7);

                   String depno=rs.getString(8);

                   //결과를 출력합니다.

                   out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

          }

} catch (SQLException e) {

         out.println("SQLException: " + e.getMessage());

} finally {

         try {

                  rs.close();

                  stmt.close();

                  dbmgr.freeConnection(conn);

         } catch(SQLException e){}

}

%>

 

문제 2 : 위 파일을 로그 클래스(Log.java)를 이용해서 SQLException이 일어날때 이를 로그 파일(error.dbg)에 기록하게 고치세요

 

: getEmpWithPooldbg.jsp

 

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

<%@ page import="java.sql.*, net.java_school.db.dbpool.*, net.java_school.util.*" %>

<jsp:useBean id="dbmgr" class="net.java_school.db.dbpool.OracleConnectionManager"

scope="application" />

<%

Log log = new Log();

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String query="select * from emp";

try {

         //데이터베이스의 연결을 설정합니다.커넥션풀 이용

         conn=dbmgr.getConnection();

         //Statement를 가져온다.

         stmt=conn.createStatement();

         //SQL문을 실행합니다.

         rs=stmt.executeQuery(query);

         while(rs.next()) {

                  String empno=rs.getString(1);

                  String ename=rs.getString(2);

                  String job=rs.getString(3);

                  String mgr=rs.getString(4);

                  String hiredate=rs.getString(5);

                  String sal=rs.getString(6);

                  String comm=rs.getString(7);

                  String depno=rs.getString(8);

                  //결과를 출력합니다.

                  out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

         }

} catch (SQLException e) {

         log.debug("Error Source:getEmpWithPooldbg.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally {

         try {

                  rs.close();

                  stmt.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch (SQLException e){}

}

%>

 

위 파일에서 select * from emp 란 스트링을 일부러 에러가 나게 select * fromemp 라고 고치고 다시 테스트해봅니다.

 

로그파일은 Log.java 파일에서 정한대로의 위치에 error.dbg 란 파일을 내용없이 만들어 위치시켜야 합니다.

 

그러면 다음과 같이 로그 파일에 기록이 쌓이는 것을 확인할 수 있습니다.

 

Sat Jun 19 14:01:58 KST 2004 : Error Source:getEmpWithPooldbg.jsp : SQLException
Sat Jun 19 14:01:58 KST 2004 : SQLState : 42000
Sat Jun 19 14:01:58 KST 2004 : message : ORA-00923: FROM 키워드가 있어야할 곳에 없습니다
Sat Jun 19 14:01:58 KST 2004 : Oracle Error Code : 923
Sat Jun 19 14:01:58 KST 2004 : Query : select * fromemp

여기까지 오셨다면 게시판을 위한 준비가 다 된 것입니다.

파일에 로그 파일 쌓이지 않은다면 ConnectionManager.java 의 코드에서 명시한 디렉토리에 error.dbg 파일이 없기 때문입니다.


 

 게시판 연습

 

먼저 테이블을 만듭니다. (오라클에 대한 내용은 오라클 카테고리의 글을 참고하세요)

 

-- 게시판 연습 테이블
create table board(
 num number primary key,
 subject varchar2(200) not null,
 sogae varchar2(4000) not null,
 content varchar2(4000),
 wdate date
);

create sequence seq_board_num
start with 1
increment by 1;

 

적당한 디렉토리에 board.sql로 위 내용으로 만들고 scott 계정으로 접속하여 (C:\에 저장했다면)

 

@C:\board.sql

 

하면 테이블과 시퀀스가 생성됩니다.

 

여기서의 게시판은 단순한 기본적인 기능만을 가진 것을 만들어 보겠습니다.

다음은 게시판을 위해 쓸 파일 흐름도 입니다.

(서블릿과 JSP 를 모두 이용하기 위해 애쓴것이지 이와 같이 프로그래밍하지는 않습니다.)

 

list.jsp ---> write_form.jsp

                  |              |--------->BoardWriter.java(서블릿) - DB insert 문 실행

                  |                                         

                  |---> view.jsp : 게시물의 내용을 보여준다.

                             |

                             |

                             |---> modify_form.jsp

                             |            |----------> BoardModifier.java(서블릿) --- DB update 문 실행

                             |

                             |---> delete_confirm.jsp

                                          |-----------> BoardDeleter.java(서블릿) -- DB delete 문 실행

 

list.jsp : 게시물을 모두 보여줍니다.(페이지분할 기능, 페이지 직접 이동 기능, 검색 기능은 후에 붙이도록 합니다.)

write_form.jsp : 새글 입력 폼 화면

BoardWriter.java : 새글 입력을 실제로 DB에 입력하는 서블릿

view.jsp : 해당 게시물의 상세 정보를 출력하는 페이지

modify_form.jsp : 수정 입력 폼 화면

BoardModifier.java : 수정을 위해 실제로 DB 테이블을 수정을 행하는 서블릿

delete_confirm.jsp : 삭제를 사용자가 선택했을 때 삭제를 정말로 할 것인가 확인하는 화면

BoardDeleter.java : 테이블에서 해당 레코드를 삭제하는 서블릿

 

각각의 소스

 

/bbs/bbs01/list.jsp


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

<%@ page import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application" class="net.java_school.db.dbpool.OracleConnectionManager" />

<html>

<body>

<%

Log log = new Log();

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String query = null;

try{

         conn = dbmgr.getConnection();

         query = "select num,subject,wdate from board order by num desc";

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

         while(rs.next()){

         int num = rs.getInt("num");

         String subject = rs.getString("subject");

         Date wdate = rs.getDate("wdate");

%>

<a href="view.jsp?num=<%= num %>"><%= subject%></a>&nbsp;&nbsp;<%= wdate.toString() %><br>

<%

         }

} catch(SQLException e){

         log.debug("Error Source:bbs/list.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally {

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch (SQLException e){}

}

%>

<br>

<br>

<p>

<a href="write_form.jsp">새글 쓰기</a>

</body>

</html>

 

/bbs/bbs01/write_form.jsp

 

<%@ page contentType="text/html;charset=euc-kr" %>
<html>
<body>
<center><h1>새글 쓰기</h1></center>
<hr>
<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">
<form name="frm" method="POST" action="../servlet/bbs01.BoardWriter">
<tr>
 <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45"></td>
</tr>
<tr>
 <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10"

cols="60"></textarea></td>
</tr>
<tr>
 <td width="100" align="center">본문</td><td><textarea name="content" rows="10"

cols="60"></textarea></td>
</tr>
<tr>
 <td colspan="2" align="center"><input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소"></td>
</tr>
</form>
</table>
<br>
<center><a href="list.jsp">목록으로</a></center>
</body>
</html>

 

/bbs/WEB-INF/classes/BoardWriter.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardWriter extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         // 입력 순서 : 시퀀스 , 제목, 소개글, 본문

         String query = "insert into board values (seq_board_num.nextval,?,?,?,sysdate)";

 

         public void init()  throws ServletException {

           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  String subject = req.getParameter("subject");

                  String sogae = req.getParameter("sogae");

                  String content = req.getParameter("content");

                  Connection con = dbmgr.getConnection();

                  try {

                           prepare = con.prepareStatement(query);

                           prepare.setString(1,subject); //제목 부분

                           prepare.setString(2,sogae); // 소개글 부분

                           prepare.setString(3,content); // 본분 부분

                           prepare.executeUpdate();      // 쿼리 실행

                  } catch (SQLException e){

                           log.debug("Error Source:BoardWriter.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/list.jsp");

                  }

         }

}

 

/bbs/bbs01/view.jsp

 

<%@ page contentType="text/html;charset=euc-kr" import="java.sql.*,

net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<html>

<body>

<%

int num = Integer.parseInt(request.getParameter("num"));

Log log = new Log();

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String query = null;

try{

         conn = dbmgr.getConnection();

         query = "select num,subject,sogae,content,wdate from board where num="+num;

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

         while(rs.next()){

                  String subject = rs.getString("subject");

                  String sogae = rs.getString("sogae");

                  String content = rs.getString("content");

                  Date wdate = rs.getDate("wdate");

%>

<%= subject %></a><br>

<hr>

<%= sogae %><br>

<hr>

<%= content %><br>

<hr>

<%= wdate.toString() %><br>

<%

         }

} catch(SQLException e){

         log.debug("Error Source:bbs/view.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<form name="modify" method="POST" action="modify_form.jsp">

<input type="submit" value="수정">

<input type="hidden" name="num" value="<%= num %>">

</form>

<form name="delete" method="POST" action="delete_confirm.jsp">

<input type="submit" value="삭제">

<input type="hidden" name="num" value="<%= num %>">

</form>

<br>

<a href="list.jsp">목록으로</a>

</body>

</html>

 

/bbs/bbs01/modify_form.jsp

 

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

import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<%

Log log = new Log();

int num = Integer.parseInt(request.getParameter("num"));

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String subject = null;

String sogae = null;

String content = null;

String query = "select subject,sogae,content from board where num ="+num;

try {

         conn = dbmgr.getConnection();

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

 

         while(rs.next()){

                  subject = rs.getString("subject");

                  sogae = rs.getString("sogae");

                  content = rs.getString("content");

         }

} catch(SQLException e){

         log.debug("Error Source:modify_form.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<html>

<body>

<center><h1>글 수정</h1></center>

<hr>

<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">

<form name="frm" method="POST" action="../servlet/bbs01.BoardModifier">

<input type="hidden" name="num" value="<%= num %>">

<tr>

         <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45" value="<%= subject %>"></td>

</tr>

<tr>

         <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10" cols="60"><%= sogae %></textarea></td>

</tr>

<tr>

         <td width="100" align="center">본분</td><td><textarea name="content" rows="10" cols="60"><%= content %></textarea></td>

</tr>

<tr>

         <td colspan="2" align="center"><input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소"></td>

</tr>

</form>

</table>

<br>

<center><a href="list.jsp">목록으로</a></center>

</body>

</html>

 

/bbs/WEB-INF/classes/BoardModifier.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardModifier extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         String query = "update board set subject=?, sogae=?, content=? where num=?";

        

         public void init()  throws ServletException {
           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  int num = Integer.parseInt(req.getParameter("num"));

                  String subject = req.getParameter("subject");

                  String sogae = req.getParameter("sogae");

                  String content = req.getParameter("content");

                  Connection con = dbmgr.getConnection();

                  try{

                           prepare = con.prepareStatement(query);

                           prepare.setString(1,subject);   //제목 부분

                           prepare.setString(2,sogae);    // 소개글 부분

                           prepare.setString(3,content);   // 본분 부분

                           prepare.setInt(4,num);     // 시퀀스 primary key

                           prepare.executeUpdate();    // 쿼리 실행

                  }catch(SQLException e){

                           log.debug("Error Source:BoardModifier.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/view.jsp?num="+num);

                  }

         }

}

 

/bbs/bbs01/delete_confirm.jsp

 

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

import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<%

Log log = new Log();

int num = Integer.parseInt(request.getParameter("num"));

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String subject = null;

String sogae = null;

String query = "select subject,sogae from board where num ="+num;

try {

         conn = dbmgr.getConnection();

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

 

         while(rs.next()){

         subject = rs.getString("subject");

         sogae = rs.getString("sogae");

         }

} catch(SQLException e){

         log.debug("Error Source:delete_confirm.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<html>

<body>

<center><h1>삭 제 확 인</h1></center>

<hr>

<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">

<form name="frm" method="POST" action="../servlet/bbs01.BoardDeleter">

<input type="hidden" name="num" value="<%= num %>">

<tr>

         <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45" value="<%= subject %>"></td>

</tr>

<tr>

         <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10" cols="60"><%= sogae %></textarea></td>

</tr>

<tr>

         <td colspan="2" align="center">위 글을 정말로 삭제하겠습니까?</td>

</tr>

<tr>

         <td colspan="2" align="center"><input type="submit" value="삭제">&nbsp;&nbsp;&nbsp;

<input type="button" value="취소" onClick="javascript:history.go(-1)"></td>

</tr>

</form>

</table>

</body>

</html>

 

/bbs/WEB-INF/classes/BoardDeleter.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardDeleter extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         String query = "delete board where num=?";

 

         public void init()  throws ServletException {
           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  int num = Integer.parseInt(req.getParameter("num"));

                  Connection con = dbmgr.getConnection();

                  try{

                           prepare = con.prepareStatement(query);

                           prepare.setInt(1,num);

                           prepare.executeUpdate();    // 쿼리 실행

                  }catch(SQLException e){

                           log.debug("Error Source:BoardDeleter.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/list.jsp");

                  }

         }

}

<출처: http://cafe.naver.com/webprogramguide >

반응형

JSP 예제

 

[예제를 실습하기에 앞서 첨부 파일(example.zip)을 다운로드 한 후 /bbs 디렉토리에 압축을 풉니다.]

 

include 지시자를 이용한 파일 인클루드 예제

 

/bbs/ex1/main.jsp : main.jsp에서 include 지시자를 사용하여 디자인 페이지인 main.html 포함.

main.jsp 내에서 다음과 같이 main.html 페이지를 인클루드 합니다.

 

<%@ include file=”main.html” %>


유지 보수의 편리함 때문에 디자인 페이지를 include 지시자를 이용하여 포함시키는 경우가 많이 발생합니다.

이때 주의해야 할 사항은 인클루드 되는 파일(main.html)내에서의 링크는(<img src=..) 인클루드하는 파일(main.jsp)이 기준으로 해야 합니다는 점입니다.

이 예제에서 만약에 main.jsp 가 /bbs/ex1/ 에 위치하고 main.html 파일이 /bbs/ex1/inc 에 그리고 이미지 파일의 디렉토리가 /bbs/img 라고 가정한다면,

main.html 내에서의 이미지에 대한 링크는 <src img=../img/image.gif > 이어야지 <src img=../../img/image.gif>이면 안됩니다.

물론 main.html 만를 요청하면 main.html 내에서 이미지는 깨집니다. 하지만 깨지는 것이 정상입니다.

우리가 서비스하는 파일은 main.html 파일 단독이 아니기 때문입니다. main.jsp 가 웹 사이트가 방문자가 방문할 페이지이지 main.html 역시 단독으로 방문할 수 있는 페이지라면 디렉토리 구조부터 바꾸어야 합니다.

 

Form 태그의 텍스트필드를 이용해서 파라미터 값 전송 예제

 

main.jsp -> welcome.jsp

 

/bbs/ex2/main.jsp : main.jsp 에서 파라미터 값으로 uid, passwd를 welcome.jsp 에 전달

main.jsp 에서 <input type=”text” name=”uid”> 로 welcome.jsp 로 전송했다면 welcome.jsp에서는 사용자가 웹 브라우저를 통해 보내는 문자열 정보를 받는 코드 조각으로 받을 수 있습니다.


<% request.getParameter(“uid”) %>

 

파라미터 값을 자바빈에 설정하고 값 가져오기(set/get) 예제

 

/bbs/ex3/main.jsp 파일에서 디자인 파일 main.html 과 welcome.jsp 파일을 인클루드 하는데

welcome.jsp는 uid, passwd 값이 넘어 올때만 인클루드 됩니다. (main.jsp 소스를 확인해 보세요)

 

또한 이 예제에는 자바빈을 이용합니다.

이 때 자바빈을 어떻게 셋팅하고 자바빈에 저장된 값을 어떻게 가지고 오는지 확인합니다.


main.jsp 에서 아래와 같이 표준액션을 이용해서 자바빈을 생성합니다.

 

<%@ page import="kr.go.mnd.baby.*" info="Simple JSP" contentType="text/html; charset=euc-kr" %>

<jsp:useBean id="login" scope="page" class="kr.go.mnd.baby.User" />

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


여기서 <jsp:useBean>은 main.jsp 가 요청되면 id가 login이고 scope가 page인 객체를 찾아서 레퍼런스를 리턴하려 합니다.

그런데 찾는 객체가 없으면 객체를 생성합니다.

객체를 생성할 때는 페이지 지시자의 임포트된 팩키지에서 클래스를 찾아서 생성하게 됩니다.

두번째 표준액션인 <jsp:setProperty>는 넘어온 파라미터값으로 자바빈의 set 메소드를 호출하여 값을 저장하는 액션인데 처음 main.jsp를 호출하게 되면 아무런 작용도 하지 않는다.

main.jsp 에서 uid, passwd를 값을 자기 자신인 main.jsp에 넘기게 되면

 

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

 

의해 이미 생성한 User 자바빈의 setUid() 메소드와 setPasswd() 메소드를 호출하게 되어 자바빈을 설정하게 됩니다.

 

main.jsp

main.jsp

User.java

<input type=”text” name=”uid”>

<jsp:setProperty name=”login” property=”uid”>

setUid(String userid)


여기서 자바빈의 setUid 메소드에서 Uid가 대문자인 것에 의구심을 가질 수도 있는데

이는 자바 언어의 메소드 이름 규칙에 의한 것입니다.

자바 언어는 메소드나 변수의 이름을 작성할 때 첫 글자는 소문자로 시작하고 여러 단어가 붙을 때는 단어의 첫글자는 대문자로 함을 권고합니다.

클래스의 작명 규칙은 첫 글자는 대문자인 것만 빼고 메소드 작명 규칙과 같습니다.

실습 : 아래 자바빈은 /bbs/ex3/main.jsp 를 실행하기 위해서 필요한 자바빈입니다. 작성한 후 /bbs/WEB-INF/claases 에 넣고

컴파일하면 /bbs/ex3/main.jsp 가 실행이 됩니다.

 

package kr.go.mnd.baby;

public class User {

         String uid;

         String passwd;

         public User(){

                  uid = null;

                  passwd = null;

         }

         public String getUid(){

                  return uid;

         }

         public String getPasswd(){

                  return passwd;

         }

         public void setUid(String uid){

                  this.uid = uid;

         }

         public void setPasswd(String passwd){

                  this.passwd = passwd;

         }

}

 

 

사용자 유틸리티 클래스 사용 예제

 

파일 : /bbs/ex4/main.jsp, welcome.jsp

 

위 예제에서 uid 값에 한글을 넣고 테스트하면 한글이 깨집니다.

이를 보완하기 위해서 사용자 유틸리티 클래스를 만들어 사용해 봅니다.


/bbs/ex4/main.jsp -> welcome.jsp 로 uid 값을 한글로 보낼 때 welcome.jsp 에서 한글이 제대로 보이도록 하는 것이 목적입니다.


JSP 엔진에 따라서 입력된 한글이 깨져 나올 수 있습니다.

한글 처리가 미흡한 경우에는 코드에서 처리해 주어야 합니다.

JSP 내에서 한글을 처리하기 위해서는 입력 받은 한글을 euc-kr 이나 KSC5601 문자 세트로 변환합니다.

(이는 JSP엔진이나 OS에 따라서 달라질 수 있습니다. 여기서는 KSC5601로 변환했습니다)

데이터베이스에 한글을 삽입할 때도 문제가 생기면 같은 방법을 사용합니다.

 

아래 사용자 유틸리티 클래스를 작성하여 예제 실현


*** Hanguel.java ***

 

package kr.go.mnd.util;

 

import java.io.UnsupportedEncodingException;

public class Hanguel {

    public Hanguel() {}   

         public static String toHanguel(String s) {

                  try {

                           if (s != null)

                                   return (new String(s.getBytes("8859_1"),"KSC5601"));

                           return s;

                  } catch (UnsupportedEncodingException e) {

                           return "Encoding Error";

                  }

    }

}

 

welcome.jsp 에서 기존의 코드 request.getParameter("uid"); 다음과 같이 바꿉니다.

 

Hanguel.toHanguel(request.getParameter("uid"));

 

Hanguel 클래스의 toHanguel메소드를 사용하기 위해서는 welcome.jsp 의 페이지 지시자에서 다음과 같은 해당 클래스를 임포트해주어야 합니다.

 

<%@ page import="kr.go.mnd.util.Hanguel" %>


여기서 주의해야 것은 welcome.jsp 내에서 Hanguel 클래스의 객체 생성하지도 않고 바로 toHanguel 메소드를 사용할 있었다는 것입니다.

이는 Hanguel 클래스의 toHanguel 메소드가 static으로 선언된 클래스 메소드이기 때문에 객체 생성 없이 해당 메소드의 호출이 가능하기 때문입니다. (자바에 대한 기초 내용입니다)


welcome.jsp 파일을 아래와 같이 고치고 테스트해 봅니다.


<%@ page import="kr.go.mnd.util.Hanguel" %>
<center>
<h1>Hello,
<%
out.println(Hanguel.toHanguel(request.getParameter("uid")));
%>
</h1>
</center>

한글을 위해서 위와 같이 사용자 유틸리티 클래스를 이용하는 것대신에 request 의 setCharacterEncoding 메소드를 이용해도 됩니다.

Welcome.jsp 내에서 아래와 같이 사용합니다.


<%

request.setCharacterEncoding("euc-kr");

%>


setCharacterEncodeing 메소드는 최근 자바 버전부터 생긴 메소드로 이전의 웹 애플리케이션을 보면 거의다 위와 유사한 한글 컨버터 사용자 유틸리티 클래스를 쓰고 있습니다.

또한 문서에 의하면 setCharacterEncodeing 메소드가 아직 버그가 있어서 함께 혼용하여 사용하는 것이 낫다고 합니다.


이번에 다운로드 한 그대로의 welcome.jsp 파일를 이용하여 한글을 나오도록 해 보겠습니다.


<center>
<h1>Hello,
<jsp:getProperty name="login" property="uid" />
</h1>
</center>


위 파일이 원래의 welcome.jsp 파일입니다.


자바 빈을 이용하는 것이므로 자바 빈의 코드 안에 위에서 만든 Hanguel 사용자 유틸리티 클래스를 이용하도록 코드를 고칩니다.

아래와 같이 User 빈이 Hanguel 사용자 유틸리티 클래스를 이용하도록 고치고 테스트 합니다.


User.java


package kr.go.mnd.baby;


import kr.go.mnd.util.Hanguel;


public class User {
    String uid;
    String passwd;

    public User() {
        uid = null;
        passwd = null;
    }

    public String getUid() {
        return uid;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setUid(String uid) {
        this.uid = Hanguel.toHanguel(uid);
    }

    public void setPasswd(String passwd) {
        this.passwd = Hanguel.toHanguel(passwd);
    }
}

<출처: http://cafe.naver.com/webprogramguide/>

+ Recent posts