2011.05.30 22:16
대략적인 소스코드 이며, 맞지 않는 부분은 고쳐 쓸 줄 아는 지혜가 필요하겠습니다 ^__^
여기서 중요한 부분은 List 에 값을 넣고, 다시 받아와서 뿌리는 것 까지 입니다.


Class 부분 입니다. (List에 관계되는 부분만 강조하여 표시하였습니다)
 public List<String> getStatus() throws ServiceException, SQLException{
  Connection conn = ConnectionProvider.getConnection();
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String tmpStr = "";
  try{
   pstmt = conn.prepareStatement("select * from table");
   rs = pstmt.executeQuery();
   if(rs.next()){
    List<String> statList = new ArrayList<String>();
    do{
     tmpStr = "";
     tmpStr = tmpStr + rs.getString(1) + "|" + rs.getString(2);
     statList.add(tmpStr);
    }while(rs.next());
    return statList;
   }else{
    return Collections.emptyList();
   }
  }catch(SQLException e){
   throw new ServiceException("메시지 목록 구하기 실패 : " + e.getMessage(), e);
  }finally{
   JdbcUtil.close(rs);
   JdbcUtil.close(pstmt);
   JdbcUtil.close(conn);
  }
 }

- String 객체에 Select 된 결과의 칼럼1, 칼럼2 사이에 구분자 "|" 를 넣어서 붙인다음 List 에 추가 하여 리턴 하였습니다



Jsp 부분 입니다.
<%
 GetStatusService statData = new GetStatusService();
 List<String> stData = statData.getStatus();
%>

<%
 for(int i=0; i < stData.size();i++ ){
 String arrData[] = stData.get(i).split("[|]");
...(필요한 코드 추가)
 }
%>

- 해당 클래스의 인스턴스를 생성한 다음 List 를 선언하여 해당 메소드를 실행한 결과를 받아 냅니다.
- For 문을 이용하여 List의 처음부터 끝까지 돌면서 계속하여 String 값을 가져 와서 구분자단위로 끊어 arrData[]배열에 담아냅니다.
- 받아낸 데이터를 적당히 뿌려 줍니다. (이건 알아서...)
Posted by 해비
2011.02.10 11:26
x86 Windows 버젼의 톰캣 7.0.4 기준으로 작성된 내용입니다.


분량이 큰 JSP페이지 작성중에 65535 limit 어쩌고 메시지와 함게 500 서버 에러 를 내는 경우가 있다...

해당 .jsp 파일이 내부에서 .java로 변환되어 지면서 이 용량이 65535를 초과 한다고 하는데
(틀린 부분이면 지적 바랍니다 -_-)

해결책은 2가지이다..
------------------------------
1. 소스 코드의 사이즈를 줄인다
2. 커스텀 태그를 사용한다
------------------------------

중간중간에 include 시킨 것들도 내부에서 .java 파일로 변환시 전부 포함되어버리니 커지는것은 당연할 듯...

그렇다면 소스코드용량을 줄이면 좋겠지만... 이것이 불가능하다면 커스텀 태그를 사용하여 해결하도록 한다.


페이지 상단에 커스텀태그를 정의 한다.
(커스텀 태그명은 사용자 임의로 주면 되므로 적당히 알아서 설정들 하시길...)
<%@ taglib prefix="inc" tagdir="/WEB-INF/tags" %>
prefix
inc라는 태그명을 정의합니다.
include 앞 3글자 따서 정의한건데, 뭐 맘대로 암거나 알아서 주셔도 되겠습네다 -_-;;

tagdir
/WEB-INF/폴더 하단에 tags 라는 폴더를 하나 생성하여 둡니다.


import 시킬 파일에 있던 내용을 tag 파일로 작성하여 보겠습니다.
(이 파일은 /WEB-INF/tags 안에 위치시켜 주세요)
sample.tag
<%@ tag body-content="empty" pageEncoding="UTF-8" %>
<%@ attribute name="value" type="java.lang.Integer" %>
<%@ attribute name="stVar" %>
<%@ attribute name="stVar2" %>
<%
(JSP 코드 기술...)
%>
진~ 하게 표시된 부분들은... 변수 입니다.
import 와 다르게 필요한 변수값이 있을경우, 이것들을 넘겨 받아야 하기 때문이죠

위에서 value 는 정수 형으로, stVar 과 stVar2 는 문자형 데이터를 넘겨 받기 위해 설정되었습니다.
중간에 기술된 JSP 코드들이 원래의 jsp파일에서 해당 위치에 import 됩니다.


커스텀 태그를 이용하여 import !!
<%
(기존 소스코드들...)
%>
<inc:sample value='<%=Integer.parseInt(varInt) %>' stVar='<%=var1 %>' stVar2='<%=var2 %>' />
<%
(기존 소스코드들...)
%>
jsp 코드 부분인 %를 닫은 다음 커스텀태그로 내용을 import 시킵니다.
<커스텀태그:파일명 파라미터1='값1' 파라미터2='값2' ... /> 의 형태로 작성합니다.

설정한 파라미터 값을 넘겨주게 되고, sample.tag 파일에서 넘겨받은 파라미터 값을 사용한 결과가 import 됩니다.


Posted by 해비
2010.12.08 22:47
테스트 환경...
JDK 1.6_u22
Tomcat 7.0.4



1. 준비
commons-dbcp-1.4.jar
commons-pool-1.5.5.jar
상단의 2개 파일을 http://commons.apache.org 에서 다운받아서
WAS(톰캣)의 WEB-INF/lib 폴더로 복사.
각각 DBCP, Pool 항목을 받아서 압축을 풀면 안에 해당 jar 파일들이 있습니다.
(JDK 1.6, TOMCAT 7.0.4 에서 사용한 것이며, JDK나 톰캣의 버젼에 따라 다른 버젼을 사용해야 하는경우도 있음)



2. pool.jocl 작성(내용수정 필요)
파일명 pool.jocl로 저장한 다음, WEB-INF/classes 에 위치하도록 저장 합니다.

<object class="org.apache.commons.dbcp.PoolableConnectionFactory"
 xmlns ="http://apache.org/xml/xmlns/jakarta/commons/jocl">

<object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
 <string value="jdbc:mysql://localhost:3306/haebi"/>
 <string value="haebi"/>
 <string value="1234"/>
</object>

<object class="org.apache.commons.pool.impl.GenericObjectPool">
<object class="org.apache.commons.pool.PoolableObjectFactory" null="true"/>
 <int value="10"/>          <!-- maxActive -->
 <byte value="1"/>  <!-- whenExhaustedAction-->
 <long value="10000"/>  <!--maxWait -->
 <int value="10"/>  <!-- maxIdle -->
 <int value="3"/>  <!--minIdle-->
 <boolean value="true"/>  <!-- testOnBorrow-->
 <boolean value="true"/>  <!--testOnReturn--> 
 <long value="600000"/>  <!--timeBetweenEvctionRunsMillis-->
 <int value="5"/>  <!--numTestsPerEvictionRun-->
 <long value="3600000"/>  <!--minEvictableIdleTimeMillis-->
 <boolean value="true"/>  <!--testWhileIdle-->
</object>

<object class="org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory" null="true"/>
 <string null = "true"/>
 <boolean value="false"/>
 <boolean value="true"/>
</object>

(드래그로 복사&붙여넣기 해서 쓰세요 -_-)


상단의 내용중...
<string value="jdbc:mysql://localhost:3306/haebi"/>
표시된 부분에 자신이 사용할 DB명을 설정.

 <string value="haebi"/>
표시된 부분에 DB접속 계정명을 기입.

 <string value="1234"/>
표시된 부분에 DB접속에 사용되는 패스워드를 기입.



3. DBCPInit.class 작성(경우에 따라 수정필요)
파일명 DBCPInit.java로 저장한 다음, WEB-INF/classes/jdbc/loader 에 위치하도록 저장 합니다.

package jdbc.loader;

import javax.servlet.http.HttpServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.util.StringTokenizer;

public class DBCPInit extends HttpServlet {

 public void init(ServletConfig config) throws ServletException {
  try {
   String drivers = config.getInitParameter("jdbcdriver");
   StringTokenizer st = new StringTokenizer(drivers, ",");
   while (st.hasMoreTokens()) {
    String jdbcDriver = st.nextToken();
    Class.forName(jdbcDriver);
   }
   
   Class.forName("org.apache.commons.dbcp.PoolingDriver");

  } catch(Exception ex) {
   throw new ServletException(ex);
  }
 }
}

(드래그로 복사&붙여넣기 해서... 2탄 -_-)


package jdbc.loader;
패키지 명은 classes폴더 하단의 경로를 표시하는 것으로 임의로 주면 됩니다.

(예시)
package loader;
WEB-INF/classes/loader


해당 폴더로 이동한 다음 컴파일 합니다.
javac *.*

.java 파일은 Java 소스파일로서 서비스 운영에 필요한 파일은 아닙니다.
컴파일 되서 나온 .class 가 실제로 사용되는 파일입니다.



4. web.xml 수정 (자신의 환경에 맞추어서...)
WEB-INF 폴더 안에 있는 web.xml의 <web-app>태그안에 적당한 위치에 넣도록 합니다.
xml파일에 대해 잘 모르겠다... 하시는 분들은 </web-app>를 찾아서 바로 위에 붙여넣기 합세다.

<servlet>
  <servlet-name>DBCPInit</servlet-name>
  <servlet-class>jdbc.loader.DBCPInit</servlet-class>
  <init-param>
   <param-name>jdbcdriver</param-name>
   <param-value>com.mysql.jdbc.Driver</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
(드래그로 복사&붙여넣기 해서... 3탄!)


<servlet-name>DBCPInit</servlet-name>
위 3. 항목에서 저장한 파일명을 그대로 적어줍니다.

<servlet-class>jdbc.loader.DBCPInit</servlet-class>
위 3. 항목에서 파일을 위치시킨 경로를 참조해서 수정합니다.



5. DBCP를 이용한 데이터베이스 연동 예제 (옵션)

 <%@ page contentType = "text/html; charset=UTF-8" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.Statement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.sql.SQLException" %>
<html>
<head><title>회원 목록</title></head>
<body>

MEMBER 테이블의 내용
<table width="100%" border="1">
<tr>
    <td>이름</td><td>아이디</td><td>이메일</td>
</tr>
<%
   
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
   
    try {
        String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
        String query = "select * from MEMBER order by ID";
        conn = DriverManager.getConnection(jdbcDriver);
        stmt = conn.createStatement();
        rs = stmt.executeQuery(query);
        while(rs.next()) {
%>
<tr>
    <td><%= rs.getString("NO") %></td>
    <td><%= rs.getString("ID") %></td>
    <td><%= rs.getString("PASS") %></td>
</tr>
<%
        }
    } finally {
        if (rs != null) try { rs.close(); } catch(SQLException ex) {}
        if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
        if (conn != null) try { conn.close(); } catch(SQLException ex) {}
    }
%>
</table>

</body>
</html>

(드래그 & 붙여넣기... 하든말든;;; 그냥 테스트용)

소스를 환경에 맞게 수정해서 돌려보면 되겠습니다.




Posted by 해비
2010.10.19 20:59

DB 언어와 내부 코드의 언어는 모두 UTF-8 로 설정 후 작업하였습니다.
설정내용 포스트  <- 참조


JSP파일로만 구성되어있으며, 커넥션풀? 자바빈스? 이런거 하나도 안들어갔습니다.
이해를 돕기위해서(?) 만들어본 초 간단 샘플 입니다... 이 보다 더 간단하게 코딩할수는 없을듯하네요 ^^


사실은 저도 잘 몰라서 그렇습니다.. 너그러이 양해를...

첨부파일에 소스코드 & DB 포합입니다.
haebi DB를 통째로 덤프 뜬 것이므로 phpMyadmin 에서 임포트 하면 DB 생성될 것입니다.
(안에는 테이블이 2개가 있습니다.)

MySQL 계정을... 생성해야 합니다만 소스 고치셔도 되고...
ID : haebi
PW : 1234
로 설정하면 되겠네요

MySQL 계정생성 부분 역시 설정내용 포스트 링크를 참조해주세요

jdbcEx.jsp 는  테이블 cellcost의 내용을 출력하는 예제입니다.


Posted by 해비
2010.10.19 20:32
설치한 프로그램들...
- APMSetup 7 설치 (Apache, PHP, MySQL)
- JDK 1.6 Update 22
- ApacheTomcat 7.0 설치



[Java 환경변수 등록]
JDK설치 경로 예시...
C:\Java\jdk1.6.0_22

JAVA_HOME = C:\Java\jdk1.6.0_22
PATH = %JAVA_HOME%\bin



MySQL 에서 새로운 DB를 생성 (utf8_general_ci)로 생성했다고 가정...

(옵션)
DB사용자는 필요시 추가
user에 localhost, ID, PASSWORD(PW), N, N, ...
db에 localhost, ID DB, Y, Y, ...
그리고 홈에서 reload previledge 인가.... 권한 다시 읽기 해줘야 저것이 적용됨

해당 계정 또는 루트권한으로 로그인
테이블 설계를 및 생성까지...

jsp에서 해당 DB접속 하여 값을 읽어지는지 테스트

jsp에서 MySql에 값이 정상으로 들어가는지 테스트
(utf-8 문제로 한글이 깨질경우...)

-MySQL 설정
설치된 폴더안에 my.ini 라는 파일을 찾아서 아래와 같이 수정(/data 폴더 안에있네요)

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8


-Tomcat 설정
/conf/server.xml 파일의 내용 을 아래와 같이 수정

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8"/>

이부분인데 URIEncoding="utf-8" 이 부분을 추가하거나 수정한뒤 저장하고 톰캣 재시작



- JSP/Servlet 실행을 위한 설정
톰캣 설치폴더의 common/lib/servlet-api.jar 파일을
JDK가 설치된 경로의 /jre/lib/ext 에 복사



- MySQL Connector/J 설치

MySQL홈페이지에서 내려받은 다음 압축을 풀면 안에 jar파일이 있음

아래의 경로에 설치했다고 가정할때,
JDK설치경로 C:\Java\jdk1.6.0_22
TOMCAT 설치경로 C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT\WEB-INF

ex)
C:\Java\jdk1.6.0_22\jre\lib\ext 폴더에,
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT\WEB-INF\lib 폴더에 복사
(폴더가 없을경우 생성)






- JSP파일 내부에 캐릭터셋 지정

JSP의 경우는 페이지 지시자 설정
<%@ page contentType="text/html;charset=utf-8" %>

HTML페이지에 메타테그 설정
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


*이클립스에서 디폴트를 utf-8로 지정해주면 새 jsp 파일 생성시에 자동으로 붙음
Window - Preferences -> Web 에서 HTML, CSS, JSP의 인코딩을 ISO10646/UTF-8 로 지정
Window - Preferences - General - Editors - Texteditors 에서 spelling을 other선택 후, UTF-8 로 지정



- JSP에서 GET, POST 처리에서 (한글)데이터가 들어갈때는 utf-8로 변환
(안깨지고 잘 들어가면 상관없음~~ 아마도...?)

POST 방식의 처리
request.setCharacterEncoding("UTF-8");

GET 방식의 처리
String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8");





[참고한 사이트]
http://blog.naver.com/seogi1004?Redirect=Log&logNo=110045319589
http://trend21c.tistory.com/673



Posted by 해비