prepareStatement 와 createStatement 차이점.

Web/JSP 2012. 5. 18. 14:20 Posted by Request

prepareStatement

prepareStatement는 dynamic parsing으로 sql문을 parsing한 후 입력된 해당 값을 parsing된 sql문에 binding하여 실행한다.

dynamic parsing은 sql문을 먼저 parsing하여 입력되는 값이 여러개 일 경우 sql문을 여러번 parsing하지 않고 parsing된 sql문에 원하는 값을 binding하여 사용하므로 자원의 낭비가 적다.

prepareStatement사용 시 PreparedStatement를 사용하여 sql문에 필요한 데이터를 입력 받고 실행 시 발생한 데이터를 ResultSet에 저장한다.

장점 : 값의 binding없이 sql문 만을 parsing하므로 parsing된 sql문의 재사용이 용의하여 자원이 낭비으며 인젝션으로 인한 피해를 줄일 수 있다.

단점 : 무겁다.

 

createStatement

creatStatement는 static parsing으로 sql문을 parsing할 때 입력된해당 값을 sql문에 binding하여 같이 parsing하여 실행한다.

static parsing은 sql문과 입력된 값을 함께 파싱 하므로 한번 parsing된 sql문을 다른 데이터를 입력하여 사용할 수 없어 해당 서비스에 사용자 수가 많은 경우 메모리 full이 발생할 수 있다.

createStatement사용 시 Statement를 사용하여 sql문에 필요한 데이터를 입력 받고 실행 시 발생한 데이터를 ResultSet에 저장한다.

장점 : 가볍다

단점 : parsing된 sql문 사용 시 입력된 값이 다를 경우 재사용할 수 없으며 자원의 낭비가 발생할 수 있다.

인젝션으로 인한 피해가 발생할 수 있다.

 

 

 

 

정리 :

prepareStatement 

:dynamic sql parsing 으로 sql문의 재사용이 용의하나 무겁다는 단점이 있다.

 

createStatement

:static sql parsingd 으로 한번 파싱된 sql문의 데이터값이 다를 경우 재 사용 할수 없으며,

해당 서비스에 사용자 수가 많을 경우 메모리 full이 발생 할수 있다.

가겹다는 장점이 있다.

 

 

공통 : 입력 받고 실행으로 발생한 데이터를 ResultSet로 저장한다.

 

 

JSP setContentType 메소드와 MIME 타입

Web/JSP 2012. 4. 23. 20:05 Posted by Request

[JSP setContentType 메소드와 MIME 타입]

setContentType(String) : MIME 타입을 지정합니다. 캐릭터의 인코딩을 지정할 수도 있습니다.

예) response.setContentType("text/xml"); // MIME 타입만 지정
response.setContentType("text/xml;charset=utf-8"); // MIME 타입 지정, 캐릭터의 인코딩 지정

 쉽게 말해서 웹서버는 브라우저로 전송될 페이지가 html 인경우 text/html을 표준 MIME 타입으로 지정합니다.

그러나 필요에 의해서 이 MIME 타입을 변경하고자 할 경우나 또는 캐릭터의 인코딩셋을 변경하고자 할때 setContentType 메소드를 사용할 수 있습니다. 브라우져는 이 MIME 타입을 확인하고 어떤 파일의 스트림(stream)인 줄 알 수 있습니다.

MIME 타입들...

text/html
audio/mpeg
image/bmp
image/jpeg
application/pdf
application/java
application/jar
application/x-zip
application/msword
application/msaccess
application/vnd.ms-excel
application/vnd.ms-powerpoint
application/octet-stream

위의 MIME 타입에서 맨 마지막에 굵게 표기되어 있는 octet-stream 이라는 놈은 이름 그대로 8비트 바이너리 배열을 의미하며 http나 이메일상에서 application 형식이 지정되지 않았거나 형식을 모를때 사용합니다. 결국 브라우저는 octet-stream 으로 MIME 타입이 지정된 경우 단지 바이너리 데이터로서 다운로드만 가능하게 처리하게 됩니다.

 

즉, setContentType 메소드가 제일 먼저 호출되고 getOutputStream과 같은 출력 스트림 메소드가 사용되어져야 합니다.

response.setContentType("application/octet-stream");

//... 중간생략
//... 중간생략

byte[] bytestream = new byte[(int)file.length()];
filestream = new FileInputStream(file);

int i = 0, j = 0;
while((i = filestream.read()) != -1) {
bytestream[j] = (byte)i;
j++;
}
outStream = response.getOutputStream();
outStream.write(bytestream);

출처 : http://www.webmadang.net/develop/develop.do?action=read&boardid=1004&page=1&seq=107

java.lang.ClassCastException:

org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest

 

HttpServletReuest를 MultipartHttpServletRequest로 형변환하려고 할때 나타나는 에러메시지
MultipartHttpServletRequest multipartRequest =
(MultipartHttpServletRequest) request; 

     form에서 보낼때 multipart가 아닌것을 보내 놓고 변환하려고 하냐? 뭐이런 맨트 같다..
<form action="" method="post"> <--만약 form이 이렇게 되어 있으면. encType="multipart/form-data" 요것 추가
<form action="" method="post" encType="multipart/form-data">

 

 

출처 : http://www.a3040.com/bbs/board.php?bo_table=Jsp&wr_id=27

private String uploadPath;

 

//싱글톤 타입인가?  패스에 대한 경로 재 저장

public void setUploadPath(String uploadPath){

this.uploadPath = uploadPath;

}

//request 에서 attFile이라는 input name을 찾아 MultipartFile 클래스 변수에다가 담아둔다.

MultipartFile uploadFile = (MultipartHttpServletRequest) request).getFile("attFile");

 

//업로드 파일명 변수 선언

String originalFileName = uploadFile.getOriginalFilename();

 

//요놈은 머징?현재 시간 저장인가?

long currentTimeMillis = System.currentTimeMillis();

 

//소문자로 확장자명 저장

String lastName = originalFileName.substring(originalFileName.lastIndexOf(".")).toLowerCase();

 

String saveName = currentTimeMillis + "_" + lastName;

 

 

 

if(lastName.equals(".hwp") || lastName.equals(".doc") || lastName.equals(".pdf") || 
    lastName.equals(".xls") ||  lastName.equals(".gif") ||   lastName.equals(".jpg")){

 

/*

File.separator     = 

시스템마다 경로를 나타내는 구분자가 다르게 존재한다.

윈도우는 \으로 구분하지만 유닉스는 / 로구분하는 등 업로드나 다운로드시 이렇게 작성하면 File.separator부분에 \나 /가 들어간다는 간다.

*/

 

File fileToCreate = new File(uploadPath + FIlie.separator + "temp");
 

//폴더가 없을시 생성

if(fileToCreate.exists() == false){

fileToCreate.mkdirs();

}

 

//무복사 타입(DB -> Read 버퍼 -> socket 버퍼 -> NIC 버퍼 사용)

uploadFile.transferTo(new File(uploadPath + File.separator + saveName));

 

 

Map params= new HashMap();

params.put("file_nm", saveName);

params.put("file_path", uploadPath);

params.put("file_type", lastName);

 

boardDao.write(params);

.

.

.

 

 

 

jstl 태그 처리

Web/JSP 2012. 4. 10. 19:04 Posted by Request

replace 로 할려다가  <> 태그에 대한 추가를 해야 되서 검색을 하다보니

 

요놈을 쓰니 된다.

 

ㄱㄱ ㅑ~ 좋다! escapeXml="true"로 하면 된다.

 

 

 

 

<c:out value="${list.TITLE}" escapeXml="true" default="defaultValue" />

 


org.apache.tomcat.dbcp.dbcp.SQLNestedException

1차 확인)
web.xml
<display-name>Model2-Board</display-name>
   <resource-ref>
       <description>Connection</description> 
        <res-ref-name>jdbc/OracleDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>container</res-auth>
  </resource-ref>

2차 확인)
1)WebContent > META-INF > //위치 확인
2)<context.xml> 설정값  확인
   <Context>
         <Resource
           name="jdbc/OracleDB"
           auth="Container"
           driverClassName="oracle.jdbc.driver.OracleDriver"
           type="jdbc:oracle:thin:@localhost:1521:orcl"
           username="scott"
           password="tiger"
           maxActive="100"
           maxIdle="30"
           maxWait="-1"
          />
   </Context>

3차 확인)
DAO.java
Connection con;
PreparedStatement ptmt;
ResultSet rs;

Context init = new InitialContext();
DataSource ds= (DataSource)init.lookup("java"comp/env/jdbc/OracleDB");
con = ds.getConnection();

4차 확인)
ojdbc14.jar 손상
오라클에 있던  ojdbc14.jar 손상 되었는지 바꾸고 나서 정상 작동 됨.
C:\java\jre1.6.0_03\lib\ext
C:\java\jdk1.6.0_03\jre\lib\ext
두 곳에 추가 복사 한다.
당연 이클립스 WEB-INF > lib 에도 복사

JDBC, JNDI 기초 지식 정리.

Web/JSP 2011. 6. 13. 00:07 Posted by Request
JDBC(Java DataBase Connectivity)
-데이터베이스를 조작하는 API 이다.
-java.sql페키지에 위치하고 있다.


JDBC API
-데이터베이스와의 통신(Connection, Statement, Result 등 객체)
-SQL문을 구성 DB서버에서 실행
-SQL문에 대한 결과를 반환



JDBC의 특징 및 장점
 - JDBC는 인터페이스기반으로 구축 되어 있다. 어떤한 데이터베이스를 사용하더라도 동일한 코드로 작성한다.


JNDI(Java Naming and Directory Interface)
 -디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고 하기 위한 자바 API
 -J2EE 플랫폼의 일부
 -여러대의 서버간에 JNDI를 이용하여 객체를 등록, 참조하여 이용
 - javax.naming 패키지안에 존재
 - 여러 웹 서버(톰캣, 웹로직, 제우스 등)에서의 사용
 -기본 네임스페이스의 java:com/env 이다.


정리하자면


JDBC와 JNDI는 데이터베이스를 이용한 홈페이지를 만들기 위해서는 데이터베이스에 접속하기 위해 JDBC 드라이버가 필요 하고, 이 JDBC가 데이터베이스를 조작하는데 있어 객체를 발견하고
참고 하기 위해 편한 JNDI가 있다.
커넥션풀(DBCP)를 이용할 때 위와 같이 두개를 쓸것이다.
[출처] http://cafe.naver.com/buldon/681


InitialContext() 메소드에 대해서

Web/JSP 2011. 6. 12. 23:57 Posted by Request

InitialContext()는 웹 어플리케이션이 처음으로 배치될때 설정되고
모든 설정된 엔트리와 자원은 JNDI namespace의 java:comp/env 부분에 놓이게 된다.

접근 방식은,

//현재 환경의 naming context 획득하기
Context initCtx = new InitialContext();
Context envCtx = (Context)init.lookup("java:comp/env");

//DataSource 찾기
DataSource ds =(DataSource)initCtx.lookup("jdbc/OracleDB");


//컨넥션 을 얻어온다.
return ds.getConnection();


private Connection getConnection() throws Exception{

   Context initCtx = new InitialContext();
   Context envCtx = (Context)init.lookup("java:comp/env");
   DataSource ds =(DataSource)initCtx.lookup("jdbc/OracleDB");

   return ds.getConnection();
}

[출처 : http://angel_id.blog.me/60127619722]

Connection pool 및 오라클 연동 설명..

Web/JSP 2011. 6. 12. 23:18 Posted by Request
was에서 DB 연동 시 최적의 환경을 위한 커넥션 풀을 제공해준다.

그걸 사용하기 위해 기본 설정을 보면..

필요한 Commons 파일은

collections, dbcp, pool 파일이다.

(설치한 아파치 서버에 있으니  lib 폴더에 복사 하기 바란다.)
없으면 링크 ㄱㄱ : http://archive.apache.org/dist/commons/pool/

context 엘리먼트는 특정 가상 호스트 내에서 실행되는 웹 어플리케이션을 나타낸다.
context는 수신된 요청을 처리하기 위해 적절한 서블릿을 선택한다.



1. context.xml 설명
<Context>
<Resouce
name="jdbc/OracleDB" // 불러올 이름
auth="Container"          //권한 설정 [Application | Container ]
/*
Application  : 웹어플리케이션의 프로그램 코드에서 해당 자원 관리자에 서명 지정. 
Container : Container가 어플리케이션의 작동에 따라 서명 할지 지정. 
*/
driverClassName ="oracle.jdbc.driver.OracleDriver"
type ="javax.sql.DataSource"
url ="jdbc:oracle:thin:@localhost:1521:orcl"
username ="scott"
password = "tiger"
maxActive = "20"          // 최대 활성화 20
maxldle ="10"              // 최대 활성화가 넘으면 10씩 늘어남
maxWait ="-1"             //즉시 실행
/>
</Context>




2.web.xml 설명
<resource-ref>
<description>ConntectionPool</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>



3.DAO.java 설명
Connection con;
PreparedStatement pstmt;
ResultSet rs;
...

Context init = new InitialContext();
DataSource ds =
            (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
con = ds.getConnection();


public List getBoardList(){
     String board_list_sql="select * from EMP";
       
         List list = new ArrayList();

try{
         pstmt = con.prepareStatment(board_list_sql);
         rs = pstmt.executeQuery();

        while(rs.next()){
             BoarBean board = new BoardBean();
             board.setBOARD_NUM(rs.getInt("EMPNO"));
             board.setBOARD_NAME(rs.getInt("EMPNAME"));
             list.add(board);
         }

} catch (SQLException e) {
   // TODO Auto-generated catch block
   System.out.println("getBoardList 에러 : "+ e);
  }finally{
   if(rs!=null) try{rs.close();}catch(SQLException e){}
   if(pstmt!=null)try{rs.close();}catch(SQLException e){}
  }

return list;
}

EMPView.jsp

Web/JSP 2011. 5. 31. 09:26 Posted by Request

<%@page import="net.board.db.BoardBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="java.util.ArrayList"%>
<%@ page import="net.board.db.BoardDAO"  %>
<!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 code = request.getParameter("code");
 String title= request.getParameter("title");

out.print(code);
out.print("<BR>");
out.print(title);
%>
<Table border="1" Style="border-collapse:collapse">
 <Tr>
  <Td>no</Td>
  <Td>name</Td>
 </Tr>
 <%
 BoardDAO bs = new BoardDAO();
  
 List arr = null;
 
 
 arr = bs.getBoardList();
 BoardBean bean = null;
 
 
 for(int i = 0 ; i <arr.size(); i++){
  bean = (BoardBean)arr.get(i);
%>
 <Tr>
  <Td><%=bean.getBOARD_NUM() %></Td>
  <Td><%=bean.getBOARD_NAME() %></Td>
 </Tr>
<%  
 }
%>
</Table>
 
</body>
</html>