2013. 3. 20. 17:59
var url = "http://stackoverflow.com";    
$
(location).attr('href',url);

 

http://blog.yes24.com/blog/blogMain.aspx?blogid=metalzang&artseqno=6289726

Posted by 물색없는세상
2013. 3. 15. 01:23

안녕하세요.. ^^

파일 업로드 찾다가 요기까지 왔네요.. ^^

샘플코드는 잘 봤습니다..

(샘플코드에 변수이름이 조금 잘못 되어 있는 부분이 있었습니다. - 큰문제는 아니죠.. ^^)

파일 업로드를 구현하면서 어려움(?)을 겪었던 부분과 해결 부분을 적어보려 합니다.

(저도 도움을 받았으니, 혹시나 저와 같은 어려움(?) 을 겪으신 분들을 위하여.. ^^)

* OS : Linux
* DB : Oracle
* WAS : OC4J 10g AS

/**
* form tag의 input name들이 아래와 같이 있습니다.
*/

String sMode = "";

String sPageNo = "";
String sKeyWord = "";
String sSearchPart = "";
String sSeqNum = "";

String sAnsTitle = "";
String sAnsContent = "";

String sFileName = "";
String sTmpFileName = "";

try {

//Multipart로 넘어왔는가?
if (FileUpload.isMultipartContent(req)) {

DiskFileUpload dfuUpload = new DiskFileUpload();

/**
* 이 부분 상당히 애를 먹었습니다.
* Windows 환경에서는 문제가 없는데,
* 개발 서버(Linux)로 올리게 되면 계속해서 한글이 깨지더군요.
*
* 그래서, 아래와 같이 DiskFileUpload의 HearderEncoding을 해주었습니다.
*/

dfuUpload.setHeaderEncoding("EUC_KR");

List lsItems = dfuUpload.parseRequest(req);
Iterator iterator = lsItems.iterator();

while (iterator.hasNext()) {

FileItem fItem = (FileItem) iterator.next();

/**
* 넘어오는 form이 multipart일때도 있고 아닐 경우도 있어서
* 처리한 부분입니다.
*
* HashMap을 사용해서 put한 다음에, 필요할때 꺼내 써도 무방할듯 합니다.
*/

if ("mode".equals(fItem.getFieldName())) {
sMode = fItem.getString();
} else if ("pageNo".equals(fItem.getFieldName())) {
sPageNo = fItem.getString();
} else if ("keyWord".equals(fItem.getFieldName())) {
//한글처리
sKeyWord = fItem.getString("EUC_KR");
} else if ("searchPart".equals(fItem.getFieldName())) {
sSearchPart = fItem.getString();
} else if ("seqNum".equals(fItem.getFieldName())) {
sSeqNum = fItem.getString();
} else if ("ansTitle".equals(fItem.getFieldName())) {
//한글처리
sAnsTitle = fItem.getString("EUC_KR");
} else if ("ansContent".equals(fItem.getFieldName())) {
//한글처리
sAnsContent = fItem.getString("EUC_KR");
}

//파일 타입 폼필드라면
if (!fItem.isFormField()) {

if (fItem.getSize() > 0) {
//파일 이름을 가져온다
//- 위에서 dfuUpload.setHeaderEncoding("EUC_KR")를 안해 줬더니

// 파일이름이 자꾸 깨지더군요.
sFileName = fItem.getName().substring(fItem.getName().lastIndexOf("\\") + 1);

try {
/**
* upload변수는 servlet에서 init 할때 아래와 같이 선언해 주었습니다.
* upload = config.getServletContext().getRealPath("/upload/suggest/");
*/

File file = new File(upload + sFileName);
fItem.write(file);
} catch (IOException e) {
System.out.println(e);
}
}
}

}

} else {
//multipart가 아닐때 사용되는 parameter들을 가지고 옴

//WebUtil은 null Check를 위한 util입니다. - 빼도 상관없습니다.
sMode = WebUtil.nvl((String) req.getParameter("mode"), "");
sPageNo = WebUtil.nvl((String) req.getParameter("pageNo"), "");
sKeyWord = WebUtil.nvl((String) req.getParameter("keyWord"), "");
sSearchPart = WebUtil.nvl((String) req.getParameter("searchPart"), "");
sSeqNum = WebUtil.nvl((String) req.getParameter("seqNum"), "");
sAnsTitle = WebUtil.nvl((String) req.getParameter("ansTitle"), "");
sAnsContent = WebUtil.nvl((String) req.getParameter("ansContent"), "");

}
} catch (Exception e) {
LogManager.getLogger("error").error(e.toString());
}

 

http://levin01.blog.me/100011050050

'ApplicationPrograming > Java' 카테고리의 다른 글

[HttpURLConnection] POST로 파라미터 넘기기  (0) 2015.04.24
자바 암호화  (0) 2015.02.25
Commons-DbUtils  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
JDOM  (0) 2013.01.31
Posted by 물색없는세상
2013. 3. 15. 01:21

Commons-DbUtils

I. 어디서 다운을 받나요?

http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

II. 설치는 어떻게 하나요?

다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다

III. DbUtils란 무엇인가요?

DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.

IV. 왜 DbUtils를 사용해야 하는가요?

① resource 누출에 대한 어떠한 가능성도 없습니다
JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다


② 코드의 가독성이 높아집니다
데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.


③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다

V. 어떻게 사용하나요?

Connection, Statement, ResultSet 의 close를 간단하게!

이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!

이 클래스는 모두 static 메소드들로 구성되어있습니다

사용예)

DbUtils.close(conn);
DbUtils.close(stmt);
DbUtils.close(rs);
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(conn, stmt, rs);
DbUtils.commitAndClose(conn);

DbUtils.commitAndCloseQuietly(conn);
DbUtils.loadDriver("com.mysql.jdbc.Driver");
DbUtils.rollback(conn);

closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,

즉 자신을 call한곳으로 throw 하지 않습니다

commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다

loadDriver 는 JDBC 드라이버를 로딩 합니다

파일로 저장된 SQL을 사용하자!

이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다

이 클래스는 SingleTone 패턴의 클래스입니다

즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다

사용예)

QueryLoader queryloader = QueryLoader.getInstance(); //싱글톤
HashMap hashmap = queryloader.load("sql");

queryloader.upload("sql");

queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다

load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어

HashMap으로 저장하여 리턴하여 줍니다

unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다

Setter함수로 더이상 머리 아프지 말자!

이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다

사용예)

...

BoardVO boardVO = null;

ArrayList arraylist = new ArrayList();

resultset = statement.executeQuery("SELECT * FROM board_t");

while (resultset.next()) {

boardVO = new BoardVO();

boardVO.setTitle("title");

boardVO.setContent("content");

boardVO.setWriter("writer");

arraylist.add(boardVO);

}

..

와 같은 코드는 다음과 같이 간략화 됩니다

ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();

List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);

정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..

select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~

QueryRunner는 다음과 같은 함수를 지원합니다

사용예)

QueryRunner queryrunner = new QueryRunner();
QueryRunner queryrunner = new QueryRunner(DataSource ds);
//datasource를 바로 이용할 수 있다

queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

여기서 말하는 Object param은 파라미터 전달시 사용됩니다

ArrayList params = new ArrayList();
params.add("100");

params.add("200");

ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();

List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);

select 뿐만 아니라 update, delete역시 가능합니다

사용예)

QueryRunner queryRunner = new QueryRunner();

queryRunner.update(Connection conn, String sql)
queryRunner.update(Connection conn, String sql, Object param)
queryRunner.update(Connection conn, String sql, Object params[])

ArrayList params = new ArrayList();
params.add(boardId);
queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());

와 같이 사용할 수 있습니다

VI. 샘플코드

public class DbUtilsExample() {

public static void main(String[] args) {

HashMap map = QueryLoader.getInstance().load("sql"); // (주의) load함수는 실행할때마다 파일을 읽습니다

Connection conn = null;

try {

DbUtils.loadDriver("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "");

ArrayList params = new ArrayList();
params.add(args[0]);

ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

QueryRunner qr = new QueryRunner();

List list = qr.query(conn, (String)map.get("select"), params.toArray(), rsh);

for (int i = 0; i < list.size(); i++) {

BoardVO board = (BoardV)list.get(i);

System.out.println(board.getTitle());

System.out.println(board.getContent());

System.out.println(board.getWriter());

)

} catch (Exception e) {

System.out.println(e);

} finally {

DbUtils.closeQuitely(conn);

}

}

}

 

http://levin01.blog.me/100011050694

'ApplicationPrograming > Java' 카테고리의 다른 글

자바 암호화  (0) 2015.02.25
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
JDOM  (0) 2013.01.31
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
Posted by 물색없는세상