'My work space'에 해당되는 글 113건

  1. 2012.05.25 Monaca + enchant.js でお手軽スマフォゲームアプリ開発
  2. 2012.05.25 추천 크롬(chrome) 브라우저 확장 30선
  3. 2012.05.25 구글공식 블로그에서 추천하는 크롬 브라우저 플러그인 19선
  4. 2012.05.25 [팁] 현재 설치된 구글 크롬 플러그인 정리
  5. 2008.10.05 구글에 지리공간정보를 제공하는 방법(Opening the door to geospatial data)
  6. 2008.09.08 Log4j 사용법 로깅-Log4J
  7. 2008.09.08 MultipartRequest 로 파일 업로드 하기
  8. 2008.09.08 JSP: 파일 업로드 (cos.jar 이용) MultipartRequest를 통한 FIle Upload, Download, Delete
  9. 2008.09.08 Servlet API 파일
  10. 2008.09.08 session사용

Monaca + enchant.js でお手軽スマフォゲームアプリ開発

Monaca + enchant.js でお手軽スマフォゲームアプリ開発

こんにちは。松田です。
今日は弊社で開発しているスマートフォン用アプリ開発環境のMonacaと、JavaScriptベースのゲームエンジンenchant.jsを組み合わせて、スマートフォン用ゲームアプリの開発をしてみたいと思います。

Monacaの公式サイトはここ。
http://monaca.mobi/

enchant.jsの公式サイトはこちらです。
http://enchantjs.com/ja/

MonacaはHTML5ベースのコードからAndroidアプリとiOSアプリを同時に生成できるツールです。
HTML5ベースで実装されているためenchant.jsのようなJavaScriptライブラリとの相性もよく、今回の記事のようにゲームアプリも簡単に実装できます。

1. Monacaアカウントの取得


まずはMonacaのアカウントを取得しましょう。下記URLからアカウントを作成します。
https://monaca.mobi/setup
ニックネームはさほど意味がないらしいので適当に。
ここで登録したメールアドレスがログイン用IDになります。
アカウントを作成したら右上のログインボタンからログインします。


2. プロジェクトの作成


次にダッシュボードからプロジェクトの作成を行います。
「プロジェクトを追加する」ボタンを押してプロジェクト情報を入力してください。
テンプレートは「HelloWorldデモ」にしておきます。


作成が終わると「IDE起動」ボタンが現れるので、ボタンを押してIDEを起動します。



3. debuggerインストール


次はdebuggerのインスールを行います。
Monacaは現状では実機上での確認しかできないため、iPhoneやiPod touch等のiOS端末かAndroid端末を用意し、
その端末にインストールしたdebugger上で動作を確認することになります。

下記のページを参考にデバッガをインストールして下さい。
http://docs.monaca.mobi/manual/debugger/

インストールが成功するとこんなふうにデバッガーアプリが表示されます。

自分はiPod touchで開発しています。


4. enchant.jsのダウンロード


これでMonacaの準備は整ったので、次はenchant.jsの用意です。
下記のページのDownloadリンクからenchant.jsをダウンロードします。
http://enchantjs.com/ja/

ダウンロードしたファイル内のenchant-package.zipを解凍すると、サンプルのアプリが3つ入っているので、今回はこの中のrpgを使います。


5. コーディング


IDEに戻りコーディングを行います。
と言っても今回はサンプルコードを動かしてみるだけなので、index.htmlの編集とファイルのアップだけで完成です。
rpgディレクトリ内の必要そうなファイルをIDEの左側のファイルツリーにアップロードしていきます。
アップロードするには、ツリーの要素を右クリックし、「アップロード」メニューの選択です。


RPGサンプルでは素材ファイルはディレクトリ分けされていないようなので、とりあえずそれに従ってwww直下に全部アップしておきました。
いらないファイルも混じっているような気もしますが放置。

次にindex.htmlの編集です。
RPGサンプルのindex.htmlで読み込んでいるjsファイルを読み込ませ、あとはbodyタグのいらない中身を消してしまえば完成です。

index.html
  1. <!DOCTYPE HTML>
  2. <html>
  3.     <head>    
  4.         <meta name="viewport" content="initial-scale = 1, user-scalable=no">
  5.         <meta charset="utf-8">
  6.         <title>RPG sample on Monaca</title>
  7.         <script type="text/javascript" src="enchant.js"></script>
  8.         <script type="text/javascript" src="ui.enchant.js"></script>
  9.         <script type="text/javascript" src="game.js"></script>
  10.         <style type="text/css">
  11.             body {
  12.                 margin: 0;
  13.             }
  14.         </style>
  15.         {% if Device.Platform == IOS %}<script type="text/javascript" charset="utf-8" src="js/phonegap.0.9.5.1_ios.js"></script>{% endif %}
  16.         {% if Device.Platform == Android %}<script type="text/javascript" charset="utf-8" src="js/phonegap.0.9.5.1_android.js"></script>{% endif %}
  17.     </head>
  18.     <body data-role="page"></body>
  19. </html>
最終的には上記のようなコードになりました。
scriptを読み込ませてるだけですね。

6. debuggerで作成したアプリを実行


これで準備は整ったので早速debuggerで実行してみましょう。
debuggerを起動するとIDとパスワードが聞かれるので、Monacaのアカウントに登録したメールアドレスとパスワードを入力してください。
ログインに成功すると下の画像のようにMonacaで作成しているプロジェクトが表示されます。


RPGのプロジェクトを選びます。すると・・・

動きました!
パッドのアイコンをタッチするとちゃんとキャラクターが動きます!
サンプルのコードのままだと画面の長さが足りてませんが、そこはまた後々。


7. アプリのビルド


せっかくなのでアプリをインストールするところまで。
今回はデバッグ版のインストールを行います。
IDEの右上の「Android」「iOS」のうち使用しているOSを選択し、「ビルド設定」の項目をクリック。
ここで下のドキュメントに従って設定を行います。

iOS版ビルド設定
http://docs.monaca.mobi/manual/build/ios/

Android版ビルド設定
http://docs.monaca.mobi/manual/build/android/


iOS版ではAppleの開発者アカウントやら何やらが必要となるため、このあたりはAndroid版のほうが楽らしいです。

設定完了後に「iOS」→「ビルド」を選択すると、ビルドボタンがハイライトされているのでクリック。

あとはビルド完了までしばし待機です。

8. アプリのインストール


ビルドが完了すると「ネットワークインストール」のボタンが表示されますが、とりあえず無視です。
ここでもう一度debuggerを立ち上げます。
RPGプロジェクトを選択し、右下のボタンをクリックすると下のようなメニューが立ち上がります。

ここですかさず「ネットワークインストール」をクリック!


出た!


これでMonaca+enchant.jsのゲームアプリ開発の基礎は完了です。


肝心のゲームのコードについては一切ふれませんでしたが、下記のブログ等でとてもわかりやすくまとめられているので必見です。
http://www.ideaxidea.com/archives/2011/04/where_to_learn_enchant_js.html
http://www.ideaxidea.com/archives/2011/04/enchant_rgb_undocumented.html

また、MonacaはPhoneGapが組み込まれているため、加速度センサーやカメラも組み合わせてゲームを作ることも可能になります。
どんな機能が使えるかは下記のPhoneGapリファレンスを参照ください。
http://phonegap-fan.com/docs/index.html


デバッグって・・・


Monacaデバッグしづれえよ!!という方は、とりあえずjsdo.it等でコーディングを行い、完成後に移植するという形も可能です。
enchant.js+PhoneGapの機能を使わないもの限定になりますが。。 Monacaチームがんばれっ!
http://jsdo.it/
enchant.jsを使ったゲームも多数アップされてるので参考になりますよ!

2012. 5. 25. 11:45

추천 크롬(chrome) 브라우저 확장 30선

추천 크롬(chrome) 브라우저 확장 30선

DRCHOI 블로그를 방문하는 많은 분들이 사용하는 구글 크롬(Google chome) 확장자 및 앱 모음입니다. 크롬 브라우저로 즐거운 웹서핑 하십시오 :)

—-Utility—-

AdBlock
200만명 이상의 사용자와 함께 하는 가장 인기 있는 크롬 확장 프로그램. 인터넷 광고 차단!
설치된 크롬 앱에 쉽게 접근할 수 있도록 하는 확장.
appjump.jpg
중복된 북마크, 잘못된 북마크 링크를 찾아서 제거하는 확장
This is a simple scanner for your Google Chrome bookmarks. It checks for bad links and duplicates and displays a report if it finds something. It can be scheduled to run a scan every couple of days or not at all. It’s kind of like FireFox’s “Check Places”.
It looks slick, has bookmarks search and remembers the last opened folders and scroll position. It is also one of the most keyboard-accessible extensions.
IE Tab
Use Internet Explorer to display web pages in a Chrome tab. Some sites can only be displayed using IE, and with this extension you can now see those sites without leaving Chrome.
LastPass
LastPass is a free password manager and form fille.
Xmarks Bookmark Sync
여러 종류의 브라우저을 사용한다면 필수 애드온
Backup and sync your bookmarks, passwords and open tabs across computers and browsers. Xmarks is also available for Firefox, Safari and IE.
Smooth Gestures
다른 마우스 동작 확장에 비해 쉬운 사용법.
마우스 동작 확장 프로그램은 오른쪽 마우스 버튼을 누른 상태에서 마우스를 움직여 페이지 탐색 또는 탭 관리와 같은 명령을 실행합니다. 클릭하여 끌기 (마우스 동작), 클릭하여 스크롤하기 (스크롤 동작), 클릭하여 클릭하기 (로커 동작), 키보드 단축키 지원!
FreshStart – Cross Browser Session Manager
열려진 탭을 선택한 일부 또는 전부 저장하고 클릭 한 번에 열어볼 수 있는 확장.
Manage your browsing session easily with FreshStart! If you have different sets of websites that matter to you at work, at home or at different times, or if you have multiple users on your Chrome.
goo.gl URL Shortener
goo.gl url shortener is an extension which allows you to shorten the current website URL with the Google URL Shortener service http://goo.gl/

—-웹서핑 및 검색, SEO—-

신뢰할 수 있는 웹사이트를 방문하기 위한 필수 도구
Web of Trust is a safe browsing tool, which warns you about risky sites that cheat customers, deliver malware or send spam.
Wikipedia Companion – Mini Wiki Browser
Essential extension for any Wikipedia users. Full-featured: saves your recent wiki lookups, multi-lingual, back/forward and more!
TinEye Reverse Image Search
이미지로 이미지를 검색하는 확장.
Find out where an image came from, how it’s used, or find higher resolution versions.
tineye.jpg
Chrome SEO
The Google Chrome SEO Extension provides easy access to Search Engine Optimization Tools that can help you with Competitive Analysis, Keyword Research, Backlink Checks, PageRank Checks and other daily SEO tasks
seo.jpg
Ultimate Chrome Flag
This extension shows a country or region flag indicating the location of the website you’re visiting. And the following information will be shown in the popup:
• Country or region name
• Domain name and IP address
• Geo information
• Google PageRank
• Alexa Rank
• WOT (Web of Trust) information
• Copy domain name and IP address to clipboard

—-생산성 향상 및 블로그—-

iReader
iReader allows you to view news stories and other articles in a single clutter-free page.
Google Mail Checker
Gmaill 받은편지함에서 읽지 않은 메일의 수를 나타냅니다. 또한 버튼을 클릭하여 받은편지함을 열 수도 있습니다.
Google Dictionary (by Google)
With this extension, you can:
1) Double-click any word to view its definition in a small pop-up bubble.
2) View the complete definition of any word or phrase using the address bar dictionary.
Amplify
Amplify lets you share your thoughts on any page, paragraph, image or video you find on the web and post them directly to Twitter, Facebook, Tumblr, Posterous, Friendfeed, delicious, diigo, Plurk and others
ScribeFire
ScribeFire is a full-featured blog editor that integrates with your browser and lets you easily post to all of your blogs.
Write Space – Chrome Web Store
Write Space is a customizable full-screen text-editor that lives in your web-browser. It is designed to minimize the distractions that come between you and your writing.
writespace.jpg
Diigo Bookmark, Archive, Highlight & Sticky-Note
1. Bookmark links to archive webpages or to read later
2. Attach highlights & stickies to a webpage as a reminder
3. Share pages with annotation via Twitter, Facebook, Google Buzz
4. Access anywhere, via iPhone, iPad (http://bit.ly/e2ujpL), Android (http://goo.gl/tvbuq).
5. Create groups to pool findings, share resources or curate content
6. Automatically cross-post to social bookmarking site Delicious (optional)
Evernote로 클리핑
Evernote 확장을 사용하여 웹에서 본 것을 Evernote 계정에 저장하십시오. 이렇게 하면 노트에서 검색할 수도 있습니다.
Springpad – Chrome Web Store
Springpad is a free application that makes it quick and easy to take notes and save anything you want to remember in one place – from tasks and lists to products, places, movies, recipes and more. We automatically organize and enhance what you save with useful links and relevant offers to save you time and money. Everything you save is automatically synchronized and instantly accessible on the web and your phone.
chromeextension.jpg
thinkery – Chrome Web Store
thinkery helps you focus on the important things and lets you access tons of information in an instant. it is your extended brain on steroids.( thinkery)
Ibrii
Ibrii allows users to snip every type of content found on the internet no matter if it is simple text, a photo, a video or even an embedded object, like streaming audio.
ibrii.jpg
ChromeItLater
ChromeItLater is an unofficial client for Read it Later (readitlater).
Create Link
Copy current page title and URL to clipboard in various formats.
*plain text ([page title] [page URL])
*HTML link ([page title]

—-소셜네트워크—-

Chromed Bird
Chromed Bird is an awesome Twitter client extension for Google Chrome with lots of features.
HootSuite Hootlet
We call the Hootlet our secret weapon because it has the power to completely change how you use Twitter, Facebook and Linkedin.
hootsuite.jpg

2012. 5. 25. 11:42

구글공식 블로그에서 추천하는 크롬 브라우저 플러그인 19선

구글공식 블로그에서 추천하는 크롬 브라우저 플러그인 19선

구글 공식 블로그에서 크롬( google chrome) 브라우저를 프로처럼 사용할 수 있는 크롬 플러그인을 소개하고 있다. 구글러들이 가장 선호하는 플러그인 19개. 국내 사용자에게는 필요없는 플러그인도 몇 개 보이지만 크롬 플러그인 선택에 고민이 된다면 구글러들이 추천하는 플러그인은 필수.

Amplify’d from googleblog.blogspot.com
  • Opinion Cloud: Summarizes comments on YouTube videos and Flickr photos to provide an overview of the crowd’s overall opinion.
  • Google Voice: All sorts of helpful Voice features directly from the browser. See how many messages you have, initiate calls and texts, or call numbers on a site by clicking on them.
  • AutoPager. Automatically loads the next page of a site. You can just scroll down instead of having to click to the next page.
  • Turn Off the Lights: Fades the page to improve the video-watching experience.
  • Google Dictionary: Double-click any word to see its definition, or click on the icon in the address bar to look up any word.
  • After the Deadline: Checks spelling, style, and grammar on your emails, blog, tweets, etc.
  • Invisible Hand: Does a quick price check and lets you know if the product you are looking at is available at a lower price elsewhere.
  • Secbrowsing: Checks that your plug-ins (e.g. Java, Flash) are up to date.
  • Tineye: Image search utility to find exact matches (including cropped, edited, or re-sized images).
  • Slideshow: Turns photo sites such as Flickr, Picasa, Facebook, and Google Images into slideshows.
  • Google Docs/PDF Viewer: Automatically previews pdfs, powerpoint presentations, and other documents in Google Docs Viewer.
  • Readability: Reformat the page into a single column of text.
  • Chromed Bird: A nice Twitter viewing extension.
  • Feedsquares: Cool way of viewing your feeds via Google Reader.
  • ScribeFire: Full-featured blog editor that lets you easily post to any of your blogs.
  • Note Anywhere: Digital post-it notes that can be pasted and saved on any webpage.
  • Instant Messaging Notifier: IM on multiple clients.
  • Remember the Milk: The popular to-do app.
  • Extension.fm: Turns the web into a music library.
  • Read more at googleblog.blogspot.com

    2012. 5. 25. 11:26

    [팁] 현재 설치된 구글 크롬 플러그인 정리








    [FreshStart]
    작업한 세션을 저장해서 크롬을 실행할 경우 복원시켜주는 기능입니다.



    [한국어 맞춤법 검사기]
    한글 맞춤법을 검사해줍니다.
    블로그 글을 작성할 때 유용하게 쓰입니다.


    [Bookmarks Menu]
    북마크를 탑다운 메뉴로 보여줍니다. 



    [Evernote Web Clipper]
    웹페이지를 에버노트로 클립핑해서 공유합니다.


    [Allow Right-Click]
    오른쪽 클릭을 해제합니다. EXIF 정보를 볼 때 필수입니다.
    [EXIF Viewer]
    사진의 EXIF를 조회합니다. 커스터마이징이 가능합니다.


    [Jeffrey's Exif viewer]
    EXIF를 보여주는 플러그인중 가장 디테일한 정보(보정 정보를 포함)의 조회가 가능합니다.


    [AdBlock]
    유명한 플러그인으로 광고를 삭제할 수 있습니다.


    [다음/네이버 사전]
    선택한 단어의 온라인 사전에서 검색합니다. (동작은 Ctrl+더블클릭 추천)


    [IETab]
    IE엔진 사용 - 없어질 날을 기대하며...


    [Live Earnings Checker for Google AdSense]
    구글 애드센스 하루 이익을 보여줍니다.


    [Webpage Screenshot]
    웹페이지를 캡쳐합니다.


    [whos.amung.us Users Online Counter]
    사이트의 현재 동시 접속수를 보여줍니다.


    [FB Photo Zoom]
    페이스북의 이미지에 마우스를 올리면 원본 크기로 팝업됩니다.


    [Sliber Bird]
    트위터 플러그인



    [ RSS 구독 확장 프로그램 ]
    사이트에 설정된 RSS를 한 번의 클릭으로 구독할 수 있도록 합니다.



    -- 계속...

    2008. 10. 5. 17:50

    구글에 지리공간정보를 제공하는 방법(Opening the door to geospatial data)

    구글 LatLong 블로그 10월 2일자 소식입니다. 한마디로, 여러가지 지리공간정보(Geospatial data)를 구글에 제공하고자 할 때 어떻게 해야 하는지를 알려주는 글입니다.

    구글어스(Google Earth)나 구글맵(Google Maps)에 사용되는 정보는 거의 대부분 외부에서 제작된 것입니다. 구글에서 직접 생산되는 것은 거의 없다고 생각해도 무방합니다.

    위성영상의 경우 예전에는 Digital Globe사의 60cm급 QuickBird 영상을 독점적으로 사용하다가, 최근 GeoEye-1이 발사되면서 GeoEye사와 구글이 인터넷에 관한한 독점계약을 맺었습니다. 도로지도의 경우에는 예전에는 텔레아틀라스(TeleAtlas)와 나브텍(Navteq) 자료를 동시에 사용하다가 최근에 텔레아틀라스 도로지도만 사용하기로 독점계약을 맺었죠.(여기 참조)

    항공사진은 대부분 지방자치단체에서 촬영하기 때문에 구글에서 각각의 지방자치단체와 사용권계약을 맺어서 사용하고, 3차원 빌딩 자료의 경우, 지방자치단체와 계약을 맺는 경우도 있고, Sanborn과 같은 전문회사에서 제작한 자료를 사용하는 경우도 있지만, 대부분 일반 사용자들이 3D 이미지갤러리에 올린 자료중에서 품질이 좋은 것을 선별하여 올리고 있고요.

    구글어스에 어떠한 자료가 사용되는지에 대해 자세히 알고 싶으시면 영상부분, 지형/3차원모델부분 , 도로지도 및 기타 부분을 확인해 보시기 바랍니다.

    구글어스(Google Earth)의 지구 모습

    하지만, 저도 이제까지 구글에서 어떠한 방식으로 3차원 빌딩이나 항공사진 등이 제작된 지방자치단체와 접촉하는지에 대해 아는바가 없었습니다. 공개적으로 요청한 적이 있었는지나 잘 모르겠네요. 하여튼 이 글에서는 자료를 제공 혹은 공유하고자 하는 사람들이 어디로 연락하면 되는지를 공식적으로 발표했네요.

    구글에서 어떤 정보를 필요로 하는지, 어떤 포맷을 원하는지는 여기를 보시면 됩니다. 이 이외에도 항공사진(정사사진)도 원하고 있고요.
    • 텍스처가 있는 3D 빌딩(.shp, .kmz, .skp, .dae, .3ds, .max 등 포맷)
    • 텍스처가 없는 3D 빌딩(.shp, .kmz, .skp, .dae, .3ds, .max 등 포맷)
    • 높이만 있는 빌딩
    • 래스터(영상) 형태의 지형 혹은 고도 자료
    자료를 갖고 있고, 이를 공유할 의향이 있는 기관은 연락용 폼(contact form)이나, gisdata@google.com 로 연락하시면 됩니다.

    머... 우리나라에서는 (다른 나라도 마찬가지겠지만) 대부분의 지리공간정보를 국가나 지방자치단체에서 생산하고 있습니다. 국민의 세금으로 만들어진 자료를 우리나라도 아닌 외국기업에게 제공하는 일은 쉽지 않을 것 같습니다.

    참고로, 아래에 들어 있는 비디오를 보시면 구글에 지리공간정보를 제공하면 어떠한 잇점이 있는지를 설명하고 있습니다.


    민, 푸른하늘

    ====
    http://google-latlong.blogspot.com/2008/10/opening-door-to-geospatial-data.html
    Thursday, October 2, 2008 at 8:30 AM
    Posted by JL Needham, Manager of Public Sector Content Partnerships
    [This post recently appeared on the new Content Central blog; it's a great look where some of our geospatial data comes from and how organizations can share data with us. -Ed.]

    여러분의 기관이 보유한 항공사진이나 관심장소와 같은 지리공간자료(geospatial data)를 어떻게 구글맵(Google Maps)나 구글어스(Google Earth)에 추가할 수 있는지 고민해보신 적이 있으십니까? 아마도 구글맵 API를 사용하고 있으시면서 여러분의 자료를 사용하여 우리 기본도를 수정하고 싶으실지도 모르겠습니다. 혹은 여러분의 커뮤니티가 자주 마주치는 곳에 데이터를 보여줌으로써, GIS(공간정보시스템, 지리정보시스템)에 대한 여러분의 기관의 투자범위를 확대하기만 원할 수도 있겠죠.

    구글 공공부분 콘텐츠 파트너십 팀원 몇몇이 최근
    ESRI 국제 유저컨퍼런스(International User Conference)에 참석하여, 매일 GIS 자료와 먹고 자고 숨쉬는 수많은 지방정부 GIS 관리자 분들을 만났습니다. 그 자리에서 우리는 "구글과 자료를 공유하고 싶은데, 어떻게, 누구와 접촉해야 할지 모르겠다"는 말을 수없이 들었습니다.

    솔직히, 우리는 여러분의 GIS 데이터가 구글 서비스로 들어오는지에 대해 잘 설명드리지 못했던 점 인정합니다. 우리 구글에서 어떤 종류의 자료를 원하는지, 어떤 포맷 혹은 품질 수준은 어떤지 등등에 대해 말입니다. 그러나, 우리는 나름대로 노력하고 있으며, 다음과 같은 2가지 예를 참고하시기 바랍니다.

    올해초 우리는 지방정부나 커뮤니티 그룹, 교육기관 등에서 자신의 동네의 3차원 모델을 구글어스에 올릴 수 있도록 도와드리는 3차원 도시 프로그램을 도입하였습니다.  "3차원 도시" 비디오 투어
    와 성공적으로 3D 모델링을 성공한 프로젝트를 담은 성공사례(case studies)를 살펴 보시면, 3차원 모델을 구축하고 공유함으로써, 도시계획이나 경제 발전, 관광산업 혹은 단순한 구경거리로서 활용하는 사례를 보실 수 있습니다. 이 사이트는 최근 다양한 유럽언어를 지원하게 되었으며, 3D 모델링 프로젝트를 수행하는 절차를 설명하고, 구글에서 환영하는 자료의 종류 및 포맷이 설명되어 있습니다. 물론, 3차원 도시프로그램 사이트에는 공유하고자하는 3D 데이터(항공사진 및 지형자료 포함)에 대해 의견을 나눌 수 있는 연락용 폼(contact form)이 있습니다.



    GIS 데이터를 구글 사용자에게 제공할 수 있도록 열어둔 문의 또다른 예는 선거 정보 프로젝트입니다. 구글은 이 운동의 파트너로서, 미국의 유권자들이 선거 등록, 투표소의 위치, 투표소에 갔을 때 알아야 할 것 등에 대한 정보를 온라인으로 찾아볼 수 있도록 하자는 것입니다. 선거 관련 공무원들께서 더 많이 참여해 주심으로써, 우리는 투표소를 구글맵에서 확인할 수 있게 되었으며, 기타 많은 관련정보를 제공할 수 있게 되었습니다.

    구글맵 투표소 위치 정보

    이처럼, 문은 열려 있습니다. 여러분의 기관이 3차원 데이터를 공유하고 싶으시거나, 3차원 모델을 생성하는 방법에 관심이 있으시다면 알려주시기 바랍니다. 여러분의 기관에서 투표소의 위치를 포함한 공식 선거정보를 제공하여 주시거나 관내의 유권자들에게 좀더 편하게 이러한 정보를 구글맵에 제공하기를 바라신다면, 선거정보 프로젝트에 들어 있는 선거정보 공유용 공개 포맷을 확인해 보시고, 원하는 바를 VIP 팀에게 알려주세요.

    또한 기타 다른 GIS 데이터를 공유하고 싶으시다면, gisdata@google.com에 알려주시거나, 콘텐트 센트럴 블로그(Content Central blog)에 귀기울여주시기 바랍니다. 여러분의 GIS 데이터를 구글 서비스에 제공할수 있는 또다른 정보를 제공할 예정이니까요.

    ====
    2008. 9. 8. 15:07

    Log4j 사용법 로깅-Log4J

    Log4j 사용법 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

     

    Log4j 상세 설명 및 예제 프로그램

     

     

     

     

     

     

     

    작성자:          <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />홍혜성 hicomet@nate.com

    작성일:          200613

     

    Log4j 사용 예제 프로그램(1)

    [1] Log4jTest.java

     

    import org.apache.log4j.Logger;

                  

    public class Log4jTest

    {

            protected static final Logger logger = Logger.getLogger(Log4jTest.class);

                  

            public static void main(String[] args)

            {

                   if (logger.isDebugEnabled()) {

                           logger.debug("프로그램 DEBUG");

                   }

                   if (logger.isInfoEnabled()) {

                           logger.info("프로그램 INFO");

                   }

                    logger.warn("프로그램 WARN");

                   logger.error("프로그램 ERROR");

                   logger.fatal("프로그램 FATAL");

            }

    }      

     

    [2] log4j.properties

     

    ## info 이상만 출력 허용 (debug Priority은 출력되지 않음)

    ## ROOT appender R 로 지정함

    log4j.rootCategory=info, R

                  

    ## 콘솔에 출력

    log4j.appender.R=org.apache.log4j.ConsoleAppender

                  

    ## 패턴 : 날짜출력 Priority출력 클래스명출력 - 메시지출력 개행

    log4j.appender.R.layout=org.apache.log4j.PatternLayout

    log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{2} %x - %m%n

     

    [3] 결과

     

    D:\study\log4j>javac Log4jTest.java

    D:\study\log4j>java Log4jTest

    2006-01-02 16:19:18,671 INFO  Log4jTest  - 프로그램 INFO

    2006-01-02 16:19:18,671 WARN  Log4jTest  - 프로그램 WARN

    2006-01-02 16:19:18,671 ERROR Log4jTest  - 프로그램 ERROR

    2006-01-02 16:19:18,671 FATAL Log4jTest  - 프로그램 FATAL

     

    Log4j 사용 예제 프로그램 (2)

     [1] Log4jTest.java

     

    import org.apache.log4j.Logger;

    import org.apache.log4j.PropertyConfigurator;

                  

    public class Log4jTest

    {

            public static void main(String[] args)

            {

                   // ROOT

                   Logger rootLogger = Logger.getRootLogger();

                   rootLogger.info("프로그램 시작");

                  

                   // Logger1

                   Logger logger1 = Logger.getLogger("com.search1");

                   if (logger1.isDebugEnabled()) {

                           logger1.debug("프로그램 DEBUG");

                   }

                   if (logger1.isInfoEnabled()) {

                           logger1.info("프로그램 INFO");

                   }

                   logger1.warn("프로그램 WARN");

                   logger1.error("프로그램 ERROR");

                   logger1.fatal("프로그램 FATAL");

                                 

                   // Logger2

                   Logger Logger2 = Logger.getLogger("com.search2");

                   if (Logger2.isDebugEnabled()) {

                           Logger2.debug("프로그램 DEBUG");

                   }

                   if (Logger2.isInfoEnabled()) {

                           Logger2.info("프로그램 INFO");

                   }

                   Logger2.warn("프로그램 WARN");

                   Logger2.error("프로그램 ERROR");

                   Logger2.fatal("프로그램 FATAL");

                  

                   // ROOT

                   rootLogger.info("프로그램 끝");      

            }

    }

     

    [2] log4j.properties

     

    ## info 이상만 출력 허용 (debug Priority은 출력되지 않음)

    ## ROOT appender R 로 지정함

    log4j.rootCategory=info, R

     

    ## com.search1 패키지의 로깅에는 warn 이상만 출력

    ## additivity = false 로 지정했으므로 log4j.search1.log 에만 출력됨

    ## additivity = true 로 지정하면 log4j.log, log4j.search1.log 모두에 출력됨

    log4j.category.com.search1=warn, search1

    log4j.additivity.com.search1=false

     

    ## com.search2 패키지의 로깅에는 info 이상만 출력

    log4j.category.com.search2=info, search2

    log4j.additivity.com.search2=false

     

    ## DailyRollingFileAppender 는 파일 교체주기를 월, , , 하루 2, 시간, 분 별로 정할수 있는 Appender

    log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

     

    ## priority 설정, 만약 Threshold=fatal 을 설정하면

    ## log4j.category.com.search1=warn, search1 를 설정했더라고 fatal 이상만 출력 된다.

    log4j.appender.R.Threshold=debug

     

    ## ImmediateFlush 기본값은 true. 로그메세지들이 전혀 버퍼되지 않는 것을 의미

    log4j.appender.R.ImmediateFlush=true

     

    ## log4j.log 파일에 출력 (디렉토리는 미리생성해 놓아야 에러 나지 않음)

    log4j.appender.R.File=/study/log4j/log/log4j.log

     

    ## 기본값은 true이며 파일 끝에 추가하는 것을 의미한다.

    ## false 는 각각의 프로그램이 시작할때 파일에 덮어씌운다.

    log4j.appender.R.Append=true

     

    ## 교체주기를 월, , , 하루 2, 시간, 분 별로 정할수 있다.

    ## 형식은 SimpleDateFormat 을 따른다. (":" 문자는 사용 금지)

    log4j.appender.R.DatePattern='.'yyyyMMdd

     

    ## 패턴 : 날짜출력 Priority출력 클래스명출력 - 메시지출력 개행

    log4j.appender.R.layout=org.apache.log4j.PatternLayout

    log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{2} %x - %m%n

     

    log4j.appender.search1=org.apache.log4j.DailyRollingFileAppender

    log4j.appender.search1.Threshold=debug

    log4j.appender.search1.ImmediateFlush=true

    log4j.appender.search1.File=/study/log4j/log/log4j.search1.log

    log4j.appender.search1.Append=true

    log4j.appender.search1.DatePattern='.'yyyyMMdd

    log4j.appender.search1.layout=org.apache.log4j.PatternLayout

    log4j.appender.search1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

                  

    log4j.appender.search2=org.apache.log4j.DailyRollingFileAppender

    log4j.appender.search2.Threshold=debug

    log4j.appender.search2.ImmediateFlush=true

    log4j.appender.search2.File=/study/log4j/log/log4j.search2.log

    log4j.appender.search2.Append=true

    log4j.appender.search2.DatePattern='.'yyyyMMdd

    log4j.appender.search2.layout=org.apache.log4j.PatternLayout

    log4j.appender.search2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n

     

    [3] 결과

     

    (1) log4j.log

            2006-01-02 16:29:35,984 INFO  root  - 프로그램 시작

            2006-01-02 16:29:35,984 INFO  root  - 프로그램 끝

     

    (2) log4j.search1.log

            2006-01-02 16:29:35,984 프로그램 WARN

            2006-01-02 16:29:35,984 프로그램 ERROR

            2006-01-02 16:29:35,984 프로그램 FATAL

     

    (3) log4j.search2.log

            2006-01-02 16:29:35,984 프로그램 INFO

            2006-01-02 16:29:35,984 프로그램 WARN

            2006-01-02 16:29:35,984 프로그램 ERROR

            2006-01-02 16:29:35,984 프로그램 FATAL

    Log4j 상세 설명

    org.apache.log4j.Logger 사용

     

    n         Category extends 받은 Logger 클래스 사용

    ü        org.apache.log4j.Logger extends org.apache.log4j.Category)

    ü        Category.getInstance() 방식은 deprecated .
    대신 Logger.getLogger() 방식으로 대체됨

     

          public static Logger getLogger(String name);

          public static Logger getLogger(Class clazz);

          public static Logger getRootLogger();

          public static Logger getLogger(String name, LoggerFactory factory);

     

    주요 컴포넌트

     

    n         Categories

    n         appenders

    ü        콘솔, 텍스트파일, html 파일, xml 파일, 소켓, Windows NT Event Log, 이메일 전송 가능

    ü        ConsoleAppender, FileAppender, SMTPAppender, SocketAppender, NTEventLogAppender, SyslogAppender, JMSAppender, AsyncAppender, NullAppender

    n         layouts : 메시지 형식

     

    Priority(우선권)

     

          debug : 디버깅 메세지

          info : verbose 모드에서 출력될만한 메세지

          warn : 이상없이 계속 실행될 수 있는 정도의 경고메세지

          error : 그럭저럭 돌아갈만한 정도의 에러메세지

          fatal : 비정상적으로 종료될 치명적인 메시지

     

    Appender 옵션

     

    전체 옵션

    log4j.configuration=app_config.properties

    log4j.debug=true

    log4j.disable=INFO

    log4j.additivity.your.category.name=false

    log4j.defaultInitOverride=false

    log4j.disableOverride=false

    ConsoleAppender

    Threadhold=WARN

    ImmediateFlush=true

    Target=System.err

    FileAppender

    Threadhold=WARN

    ImmediateFlush=true

    File=mylog.txt

    Append=false

    RollingFileAppender

    Threadhold=WARN

    ImmediateFlush=true

    File=mylog.txt

    Append=false

    MaxFileSize=100KB

    MaxBackupIndex=2

    DailyRollingFileAppender

    Threadhold=WARN

    ImmediateFlush=true

    File=mylog.txt

    Append=false

    DatePattern='.'yyyy-ww

     

    n         log4j.configuration=app_config.properties

    ü        ex> java –Dlog4j.configuration= app_config.properties … 형식으로 속성 파일 설정

    n         log4j.debug=true

    ü        기본값은 false. log4j 를 설정하는 상세 정보를 출력

    n         Log4j.disable=INFO

    ü        모든 category에서 여기 지정한 priority 보다 같거나 낮은 priority 메세지는 로깅하지 않는다. (log4j.disableOverride=false 일때에만 동작)

    n         log4j.additivity.your.category.name=false

    ü        기본값은 true. appender ancestor(조상)으로부터 쌓이게 할지(true) 그렇게 하지 않을지(false)를 지정한다.

    n         log4j.defaultInitOverride=false

    ü        Category.getRoot() Category.getInstance(...) 메소드를 처음으로 호출하여   Log4j 의 초기화 과정을 마친다.("log4j.debug=true" 로 지정하여 초기화가 일어나는 것을 볼 수 있다) 초기화되는 동안 Log4j 는 어플리케이션의 클래스패스에서 "log4j.properties" 파일이나 "log4j.configuration=app_config.properties" 프로퍼티를 통해 지정한 파일을 찾는다. 만약 이것(프로퍼티를 통해 지정한 환경파일을 찾는 것)을 원하지 않는다면 이 프로퍼티를 true 로 세팅하라.

    ü        이것을 시스템 property로 설정할 필요가 있다. 예를 들어 다음과 같이 프로그램을 구동한다. java -Dlog4j.defaultInitOverride=true ...   왜냐하면 설정파일에 세팅했다면 이미 너무 늦기 때문이다.Log4j는 이미 그 파일을 읽기위해 시작되었을 것이다.

    n         log4j.disableOverride=false

    ü        기본값은 false. 가끔 true로 설정하여 log.disable 프로퍼티를 무시할 수 있다.

    n         Threadhold=WARN

    ü        appender category priority가 더 낮게 지정되어 있다고 할지라도 여기 명시된 priority보다 낮은 메세지들을 로깅하지 않을 것이다. 이것은 콘솔에 모든 메세지가 나타나는 동안 파일에 로깅되는 경우와 같이 메세지의 숫자를 줄이는데 유용하다.

    n         ImmediateFlush=true

    ü        기본값은 true. 로그메세지들이 전혀 버퍼되지 않는 것을 의미하며 대부분의 상황에 적당하다.

    n         Target=System.err

    ü        기본값은 System.out

    n         File=mylog.txt

    ü        로깅할 파일명. 앞부분에 경로를 나타내기 위해 ${some_property_key} (예를 들어 java.home 또는 user.home 과 같은 시스템 프로퍼티)를 사용할 수 있다. 사실 모든 옵션들의 프로퍼티키들은 이런 종류의 값을 설정 가능하다.

    n         Append=false

    ü        기본값은 true이며 파일 끝에 추가하는 것을 의미한다. false 는 각각의 프로그램이 시작할때 파일에 덮어씌운다.

    n         MaxFileSize=100KB

    ü        끝에 KB, MB 또는 GB를 붙인다. 지정한 크기에 도달하면 로그파일을 교체한다(roll).

    n         MaxBackupIndex=2

    ü        최대 2()의 백업 파일들을 유지시킨다. 오래된 파일들은 삭제한다. 0 은 백업파일을 만들지 않는다.

    n         DatePattern='.'yyyy-ww

    ü        매주마다 파일을 교체(roll)한다. 교체주기를 월, , , 하루 2, 시간, 분 별로 정할수 있다. 이 값은 교체주기를 설정할 뿐만 아니라 백업파일의 붙는 문자열도 정한다.

    ü        콜론(:) 문자를 값의 어디에도 사용하지 말라. 그것 말고는 자바의 SimpleDateFormat 의 어떤 형식 문자열을 사용할 수 있다. 특히 한쌍의 작은따옴표(single quote) 안에 있는 문자를 반드시 제어해주어야 한다.(예의 '.' 와 같이)

    ü        '.'yyyy-MM: 매달의 첫날에 로그파일을 교체한다.

    ü        '.'yyyy-ww: 매주의 첫날에 로그파일을 교체한다.

    ü        '.'yyyy-MM-dd: 매일 자정에 로그파일을 교체한다.

    ü        '.'yyyy-MM-dd-a: 매일 자정정오에 로그파일을 교체한다.

    ü        '.'yyyy-MM-dd-HH: 시간마다(시간이 시작할때) 로그파일을 교체한다.

    ü        '.'yyyy-MM-dd-HH-mm: 분마다(분이 시작할때) 로그파일을 교체한다.

     

    layout 옵션

     

    PatternLayout

    ConversionPattern=%m%n

    HTMLLayout

    LocatoinInfo=true

    Title=My app title

    XMLLayout

    LocatoinInfo=true

    TTCCLayout

    (이것 대신 더 유연한 PatternLayout을 사용하라)

    DateFormat=ISO8601

    TimeZoneID=GMT-8:00

    CategoryPrefixing=false

    ContextPrinting=false

    ThreadPrinting=false

     

    n         ConversionPattern

    ü        %d{yyyy-MM-dd HH:mm:ss,SSS} : 날짜 출력 {} 내용은 SimpleDateFormat 형식을 따름

    ü        %-5p : Priority 출력 (fatal, error, warn, info, debug)

    ü        %n : 개행 문자 출력

    ü        %t : 자바 스레드명 출력

    ü        %F : 파일명출력

    ü        %L : 라인넘버 출력

    ü        %c{2} : 클래스명 출력.

    예를 들어 category 이름이 "a.b.c" 일때 %c{2} "b.c"를 출력하며 {2}는 도트(.)로 구분된 category 이름의 마지막 두개의 컴포넌트를 의미한다. {n} 이 없으면 기본적으로 카테고리의 이름을 모두 출력한다.

    ü        %x : 로깅이벤트를 발생시킨 스레드에 관련된 내포검사항목(Nested Diagnostic Context : NDC)을 출력한다.

    ü        Java Servlet 과 같이 다수의 클라이언트가 분산된 스레드에 의해 다루어 질 때 유용하다.

    ü        %m : 메시지 출력

    ü        %r : 어플리케이션이 시작되어 로깅이벤트가 일어날때까지의 경과시간을 밀리세컨드 값으로 출력

    ü        %% : 하나의 % 기호를 출력

    ü        %l : 소스코드의 위치정보를 출력. %C. %M(%F:%L) 의 축약형

    ü        %C : 호출자의 완전한 클래스이름을 출력. %C. %M(%F:%L) 의 축약형

    ü        %M : 로깅요청을 일으킨 메소드를 출력

     

    ü        필드 안에서 완쪽 정렬을 하기위해 마이너스 기호(-)를 사용

    ü        %20c : 최소 20문자 공간에서 category 이름을 (기본적인)오른쪽 정렬

    ü        %-20c : 최소 20문자 공간에서 category 이름을 왼쪽 정렬

    ü        %.30c : 만약 category 이름이 30문자보다 길면 (앞에서부터)자른다. 최소폭이 없으므로 30문자보다 짧다고 해도 여백공간은 없다.

    ü        %20.30c : category 이름이 20문자보다 짧으면 오른쪽 정렬을 하고, 30자보다 길면 시작부터 자른다.

    ü        %-20.30c : category 이름이 20자보다 짧으면 왼쪽 정렬을 하고, 30자보다 길면 시작에서부터 자른다.

     

    è [경고] 프로그램의 실행속도를 느리게 하는 옵션 : %d, %l, %C, %M, %F, %L

    n         LocatoinInfo=true

    ü        기본값은 false. 자바파일명과 행번호를 출력한다.

    n         Title=My app title

    ü        기본값은 Log4j Log Message. HTML <title>태그에 주어진다

    n         DateFormat=ISO8601

    ü        자바의 SimpleDateFormat 의 생성자이거나 NULL, RELATIVE, ABSOLUTE, DATE, ISO8601 중 하나.

    n         TimeZoneID=GMT-8:00

    ü        TimeZone.getTimeZone(java.lang.String) 메소드에 의해 나올만한 형식의 문자열

    n         CategoryPrefixing=false

    ü        기본값은 true. category 이름을 출력한다.

    n         ContextPrinting=false

    ü        기본값은 true. 현재 스레드에 속하는 내포검사항목 정보를 출력한다.

    n         ThreadPrinting=false

    ü        기본값은 true. 스레드명을 출력한다.

     

    Log4j 참고 사항

    성능

     

    n         코드상에서 성능이 매우 중요한 곳에서는 로깅메소드의 파라미터를 만드는 시간을 절약하기 위해 다음과 같이 사용한다. (isDebugEnabled(), isInfoEnabled() 사용)

     

    if (Logger.isDebugEnabled() {

        Logger.debug("debug code");

    }

     

    n         SimpleLayout을 사용하였거나 %p, %m, %n의 패턴만 사용하여 설정한 경우 System.out.println(...) 만큼 성능이 빠르다고 테스트됐다.

    n         ConversionPattern 에서 프로그램의 실행속도를 느리게 하는 옵션 è %d, %l, %C, %M, %F, %L

     

    내포검사항목(NDC) 사용

     

    n         가끔 서블릿처럼 하나의 코드가 각각의 클라이언트를 서비스 하기위해 여러개의 스레드로 인스턴스화 되어 많은 클라이언트를 서비스한다. 이때 다른 클라이언트로 부터의 로깅 요청을 차별화하기 위해서 내포검사항목(NDC)를 사용할 수 있다. 할 수 있는 것은 로깅하기 전에 클라이언트의 고유한 정보를 NDC로 넣는다. 고유한 정보는 클라이언트의 IP주소, 호스트이름 또는 요청과 관련된 어떤 것도 될 수 있다. %x layout 패턴에 명시하면 요청한 로그 메세지에 그 문자열(고유한 정보)을 찍는다.

     

    [NDC 사용 프로그램 예제 (Log4jTest.java)]

    import org.apache.log4j.Logger;

    import org.apache.log4j.NDC;

     

    public class Log4jTest

    {

            protected static final Logger logger = Logger.getLogger(Log4jTest.class);

     

            public static void main(String[] args)

            {

                   //BasicConfigurator.configure();

                  

                   NDC.push("Client #45890");

     

                   // ROOT

                   Logger logger = Logger.getRootLogger();

                   logger.info("프로그램 시작");

     

                   switchNDC();

                  

                   // ROOT

                   logger.info("프로그램 끝");  

            }

           

            static void switchNDC() {

                   NDC.push("Client #99999");

                   logger.info("프로그램 중간");

                   NDC.pop();

            }

    }

     

    [NDC 사용 프로그램 예제 결과]

    2006-01-02 18:02:11,984 INFO  root Client #45890 - 프로그램 시작

    2006-01-02 18:02:11,984 INFO  Log4jTest Client #45890 Client #99999 - 프로그램 중간

    2006-01-02 18:02:11,984 INFO  root Client #45890 - 프로그램 끝

     

    기타 참고 사항

     

    n         root category는 항상 지정된 priority가 있다.(기본값은 Priority.DEBUG),

    n         일반적으로 Log4j 는 어플리케이션이 초기화되는 동안 보통 설정파일을 읽어들여 한번만 설정된다.

    n         appender 들은 singleton 이 아니라 추가된다는 것을 주의하라. appender 로부터 물려받는 것을 불가능하게 하기 위해 category cat.setAdditivity(false) 메소드를 사용하라.  그러면 로그 메세지는 해당 category에 특별히 설정된 appender 로만 보내질 것이다.

    n         정적 메소드인 BasicConfigurator.configure() 메소드는 System.out.println(...) 구문이 그러하듯 콘솔에 로깅한다. 이 메소드는 루트 category ConsoleAppender 를 붙여 콘솔에 프린트 하는 기능을 가지고 있다. 출력은 %-4r [%t] %-5p %c %x - %m%n 으로 세팅된 PatternLayout 을 사용하여 구성된다. 이 메소드는 log4j.properties 파일을 사용하는 것이 더 간단하고 유연하기 때문에 그다지 필요하지 않다.

    n         log4j 를 설정하는 기본 파일은 log4j.properties 이다. 이 파일을 어플리케이션의 클래스패스에 지정된 어느곳이든 위치시킨다.

    n         Java 프로퍼티 파일에서 설정 정보를 읽어오려면 정적메소드 중 하나인 PropertyConfigurator.configure(...) 메소드를 사용하라. 이미 설정되어 있는 설정은 지워지지도 재설정되지도 않는다. 이 메소드를 사용하려면 정적메소드인 BasicConfigurator.resetConfiguration() 메소드를 먼저 호출하라. 이 메소드 사용은 코드를 길고 복잡하게 할 수도 있다. 초보자는 각각의 어플리케이션의 루트디렉토리에 log4j.properties 파일 하나만 위치시켜라.

    n         참고 사이트 : http://logging.apache.org/log4j/docs/

     

    []

    2008. 9. 8. 15:06

    MultipartRequest 로 파일 업로드 하기

    파일을 업로드 한다는 것은 원격의 사용자가 서버 측으로 네트워크를 통해 파일을 전송하는 일이다<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    보통 WEB 환경에서 사용자의 입력 값을 다른 페이지로 이동시키기 위해서는 Form 통한 데이터 전송을 하게 된다.

    간단하게 사용자의 이름을 입력 받고 내용을 JSP 페이지나 기타 파일로 전송을 해야 때는 아래와 같은 HTML 폼이 작성이 되어야 것이다.

     

    <Form action=receive.jsp Method=POST>

    이름 : <Input type=TEXT name=userName> <BR>

    <input type=SUBMIT value= >

    </Form>


    위의 파일을 실행하면 Action 태그에 정의된 페이지에서 사용자의 입력 값을 전송 받을 있게 된다. 하지만 File 경우는 그리 만만치 않다. 사용자가 입력하는 값은 Text 형태의 값이 대부분이고, 전송되는 File 형태는 Binary 타입이기 때문이다.

    때문에 파일이 전송될 때에는 파일의 형태를 읽어 들일 있는 Servlet 또는 Java Bean 제작해야 한다.

     

    아래는 파일전송을 위한 HTML 형태이다.

     

    <!-- FileName : uploadForm.html  파일위치 c:\tomcat4/webapps/ROOT/uploadTest -->

    <Form action=receive.jsp Method=POST enctype=multipart/form-data>

    이름 : <Input type=TEXT name=userName> <BR>

    파일 : <Input type=FILE name=userFile><BR>

    <input type=SUBMIT value= >

    </Form>

     

    위의 파일을 보면 enctype 이라는 태그가 데이터를 전송하게 타입을 지정하는 부분이다.

    아래쪽의 Input type=FILE 이라는 부분은 파일을 선택할 있는 창이 뜨게 되는 부분이다.

     

    이렇게 전송되는 데이터를 receive.jsp 에서는 request 객체를 이용해서는 절대로 값을 가져오지 못한다.  Enctype 명시가 되면 넘어오는 파라메터들은 하나의 스트림을 통해 전송이 되게 된다. 그렇기 때문에 스트림으로 넘어오는 데이터를 각각의 구분자를 이용하여 짤라내야 한다.

    그럼 데이터는 어떻게 받아낼까.

    ServletRequest 인터페이스 에는 getInputStream() 이라는 메소드가 있다. 메소드는 클라이언트 측에서 전송되는 스트림을 서버측에서 받아줄 통로를 열어주는 메소드 이다. 위의 메소드를 통하여 사용자가 전송하는 스트림을 받아올 것이다.

    아래는 데이터를 받아오는 receive.jsp 파일이다.

     

    <%-- FileName : receive.jsp  SavePath : c:\tomcat4/webapps\ROOT\uploadTest --%>

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

    <%@ page import=java.io.* %>

    <%

             BufferedReader bufReader =

     new BufferedReader(new InputStreamReader(request.getInputStream()));

             String read = “”;

             while((read = bufReader.readLine()) != null){

                      out.print(read + <BR>);

    }

    bufReader.close();

    %>

    위의 파일을 해당 경로에 두고 브라우져에서 HTML 파일부터 실행 시키고 Text 형태의 파일을 전송해보자. JAVA SOURCE 파일도 괜찮다.   실행이 되었다면 아래와 같은 그림이 나오게 된다.

     

    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

     

     

     

     

     

     

     

    위의 그림을 자세히 보면 일정한 양식으로 입력 값이 전송된다는 것을 있다.

    -----------------------------7d33d86502e0

    위와 같은 부분을 Delimeter 라고 부른다 이렇게 넘어온 딜리미터를 이용하여 각각의 내용을 수동으로 잘라내야 한다.

    처음 나오는 딜리미터 아래를 보면 Content-Desposition: form-data; name=userName  이라는 부분이 나오는 것을 있는데 이것은 HTML 에서 넘어오는 Form Data 구분해서 그에 상응하는 Parameter Name Parameter Value 나눠서 보여준다는 것을 있다.  물론 tornado 라는 것은 파라미터 값이 되겠다.

     

    다시 딜리미터가 시작이 되고 아랫줄에 filename= 이라는 곳이 시작이 되는데 이곳부터 실제 파일이 시작이 되는 것이다. 현재 업로드 파일은 TEXT 형식이기 때문에 위와 같이 보여지지만 Binary 형태의 자료가 업로드가 된다면 이상한 문자들을 화면 가득 만날 것이다.

     

    참고로 Binary 자료를 서버측에서 받으려 한다면 절대로 Reader 계열의 IO 클래스들을 사용해서는 안된다. Reader 계열 클래스 들은 문자를 읽어 들이는 스트림 이기 때문에 Binary 자료를 읽어 들이게 되면 제대로 업로드가 되리라는 보장이 없다.

     

    위와 같이 복잡한 과정을 통해 업로드가 된다는 것을 알아보았다.

    다시 한번 강조하지만 HTML Form 태그에 enctype 명시가 되면 절대로 Request 객체로 값을 받지 못한다는 것을 상기하기 바란다. 자료를 업로드 때에는 Method 속성이  POST 여야 한다는 것도 잊지 말자.(그렇다고 GET 방식은 절대로 못한다는 것은 아니다)

    MultipartRequest 파일 업로드 하기

    위와 같은 복잡한 과정을 거쳐 업로드를 하게 된다면 자바 IO 제대로 공부하지 않은 사람은 업로드 게시판은 절대 꿈도 것이다. 하지만 이렇게 복잡한 업로드를 간단히 해결해 주는 클래스들이 인터넷 상에 제공되고 있다.

    우리가 사용할 MultipartRequest 라는 업로드 컴포넌트는 Oreilly 사에서 제공하는 컴포넌트이며 컴포넌트를 사용할 때에는 저작권이 따른다는 것을 알고 있기를 바란다.

    또한 컴포넌트를 사용하려면 Oreilly 책을 구입해야 한다고 명시하고 있다.

     

    위의 컴포넌트를 받으려면 아래의 웹사이트를 방문하여야 한다.

    http://servlets.com/cos/index.html

     

    위의 주소로 접속을 하고 화면을 아래로 스크롤 하게 되면 압축파일이 있는 표를 만나게 되는데

    날짜를 확인하고 제일 최신 버전을 다운로드 받으면 된다.

    참고로 현재 최신 버전은 2002 11 05 판이다.

     

    cos-05Nov2002.zip 같은 파일을 찾았다면 다운로드를 하고 적당한 곳에 압축을 푼다.

    압축을 풀면 아래와 같은 디렉토리가 생기게 된다.



     


    디렉토리의 구조는 아래와 같다.

    classes 디렉토리는  MultipartRequest 클래스 들이 위치한 디렉토리 이다.

    Doc 디렉토리는 MultipartRequest API Document 들어있는 디렉토리 이다

    Lib 디렉토리는 MultipartRequest 클래스들을 압축하여 놓은 Library 디렉토리이다.

    Src 디렉토리는 Source 디렉토리 이다.

    upload.war 파일은 아카이브 라는 형태의 파일로서 이것을 webapps 놓고 톰캣을 Restart 하게 되면 해당 war 파일이 압축이 풀리며 바로 사용 가능한 상태로 되는 파일형식이다. 파일을 이용하여 테스트를 있다.

     

    Lib 디렉터리에 있는 cos.jar 이라는 파일을 톰캣 설치디렉토리의 common/lib 복사 한다. (c:/tomcat4/common/lib)

    common/lib 위치 시켜야 하는데 이유는 톰캣이 처음 시작될 common/lib 있는 라이브러리를 읽어 들일 있게 해당 파일을 로딩하기 때문이다. JDBC 드라이버도 마찬가지로 이곳에 위치시켜야 한다.

    Tomcat restart 하게 되면 cos.jar 파일에 들어있는 클래스들을 이용할 있게 된다.

     

    본격적으로 업로드를 해보자.

     

    위에서 작성한 receive.jsp 파일을 아래와 같이 작성한다.

    <%-- FileName receive.jsp  SavePath c:/tomcat4/webapps/ROOT/uploadTest --%>

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

    <%@ page import="com.oreilly.servlet.MultipartRequest" %>

    <%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

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

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

     

    <%

                 String savePath="c:/tomcat4/webapps/ROOT/uploadTest";   // 저장할 디렉토리 (절대경로)

                 int sizeLimit = 10 * 1024 * 1024 ;      // 파일업로드 용량 제한.. 10Mb

                 try{

                               MultipartRequest multi = new MultipartRequest(request, savePath,

                                                                      sizeLimit,"euc-kr",new DefaultFileRenamePolicy());

                               String userName = multi.getParameter("userName");

                               String fileName= multi.getFilesystemName("userFile");

                               String originFileName = multi.getOriginalFileName("userFile");

     

                               if(fileName == null) { 

                                            out.print("파일이 업로드 되지 않았습니다!!");

                               } else {

                                            fileName=new String(fileName.getBytes("ISO-8859-1"),"euc-kr");

                                            out.print("User Name : " + multi.getParameter("userName") + "<BR>");

                                            out.print("getFilesystemName()  : " + fileName + "<BR>");

                                            out.print("getOriginalFileName() : " + originFileName +"<BR>");

                               } // end if

                 } catch(Exception e) {

                               out.print(e.getMessage());

                 }

    %>

     

    http://localhost:8080/uploadTest/uploadForm.html 부터 실행을 한다.

    업로드 파일을 선택하고 전송 버튼을 누르게 되면 아래와 같은 그림이 나오게 된다.

     

     

     

     

     

     

    다시 위의 과정을 반복해 본다. 아래와 같은 그림이 나온다.

     

     

     

     

     

    이제 업로드 디렉터리를 보게 되면 아래와 같은 그림이 나오게 된다.

     

     

     

     

     

     

    위의 결과치를 보게 되면 MultipartRequest 안에 들어있는 가지의 메소드의 용법을 있다.

    String fileName= multi.getFilesystemName("userFile");

    String originFileName = multi.getOriginalFileName("userFile");

     

    getFilesystemName() 메소드는 서버측으로 실제 업로드 파일의 이름을 얻어오는 메소드 라는 것을 수가 있다.

    getOriginalFileName() 메소드는 사용자가 업로드 실제 파일 이름을 얻어오는 메소드 이다.

    그리고 중복 파일이 있을 경우에는 자동으로 파일이름 뒤에 중복된 숫자가 붙는다는 것을 있다.

    이제 이렇게 업로드 파일의 이름을 데이터베이스에 입력을 하게 되면 자료실을 쉽게 구현 수가 있게 된다.

     

    다음으로 알아볼 것은 업로드 파일의 사이즈를 알아내는 부분이다.

    MultipartRequest 에는 파일의 사이즈를 반납해 주는 메소드는 없다. 하지만 File 객체 자체를 반납해 주는 메소드가 존재한다.

    실제 파일객체를 받게 경우 File 객체에서 사용할 있는 모든 메소드를 사용할 있다는 장점이 있다.

    파일의 사이즈는 아래와 같이 얻어오면 된다.

    File f = multi.getFile("userFile");

    같이 받아오면 된다.  이제 이렇게 받아온 파일을 통해 파일의 사이즈 각종 정보를 얻을 있게 된다.

     

     

    아래의 코드를 receive.jsp 파일에 추가한다. 위치는 userFile 이름을 받아오는 아랫쪽에 위치 시키면 된다.

    File f = multi.getFile(userFile);

    int fileSize = (int)file.length();

    out.print(<BR> 파일 사이즈 : + fileSize + <BR>);

    사이즈가 출력이 되는 것을 있을 것이다. 참고로 int 형변환 하는 것은 File 객체의 length() 메소드의 반환값이 long 이기 때문에 형변환을 해준 것이다.

     

    이제 여러 개의 파일을 업로드를 해보자. 이렇게 업로드 파일을 데이터 베이스의 테이블에 저장해 보도록 하자.

    테이블의 구조는 아래와 같다. MySQL test 데이터베이스에 만들도록 하자.

     

    Create table upTable(

                 num int unsigned not null auto_increment primary key,

                 name varchar(50) not null,

                 subject varchar(200) not null,

                 contents text not null,

                 up1 varchar(50),

                 up2 varchar(50),

                 up3 varchar(50),

                 size1 int,

                 size2 int,

                 size3 int,

    );

     

    먼저 파일을 선택할 있는 HTML 형식의 문서가 있어야 한다.

     

    ) multiUp.html 

    <HTML>

    <HEAD>

                 <TITLE>JSP UPLOAD Test</TITLE>

    <HEAD>

    <BODY>

    <FORM name="frm" method="POST" ACTION="multiUp.jsp" enctype="multipart/form-data">

    <TABLE Border="1">

                 <TR>

                               <TD>이름 <input type="text" name="userName"></td>

                 </TR>

                 <TR>

                               <TD>제목 <input type="text" name="subject" size=40></td>

                 </TR>

                 <TR>

                               <TD>내용<TextArea name="contents" rows="10" cols="60"></textArea></td>

                 </TR>

                 <TR>

                               <TD>파일 1  <input type="file" name="up1"> </TD>

                 </TR>

                 <TR>

                               <TD>파일 2  <input type="file" name="up2"> </TD>

                 </TR>

                 <TR>

                               <TD>파일 3  <input type="file" name="up3"> </TD>

                 </TR>

                 <TR>

                               <TD> <INPUT TYPE="SUBMIT" value=" "> </TD>

                 </TR>

    </TABLE>

    </FORM>

    </BODY>

    </HTML>

     

    위의 파일에서 주의 하여야 것은 enctype=multipart/form-data 부분이다. 다시 강조하지만 enctype 부분이 생략되면 업로드가 안된다는 것을 알고 있기 바란다.

    이제 위의 HTML 폼에서 넘어가는 파일들과 파라메터들을 받아서 저장해줄 JSP 파일이 필요하다.

    아래의 파일이 역할을 해주는 파일이다.

    ) multiUp.jsp

    <%-- FileName : multiUp.jsp   savePath : c:/tomcat4/webapps/ROOT/uploadTest  --%>

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

    <%@ page import="com.oreilly.servlet.MultipartRequest" %>

    <%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

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

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

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

     

    <%

     

                 String savePath = "c:/tomcat4/webapps/ROOT/uploadTest"; // 업로드 경로

                 int sizeLimit = 5 * 1024 * 1024;

     

                 MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());

                 /*

                    오라클의 경우 아래와 같이 MultipartRequest 생성자 호출시에 한글이라는 것을 명시해야 한글이 안깨진다.

                    MultipartRequest multi =

                              new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());

                 */

                

                 // 넘어오는 파라메터.

                 String userName = multi.getParameter("userName");

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

                 String contents = multi.getParameter("contents");

                

                 // 넘어오는 파일 이름

                 String fileName1 = multi.getFilesystemName("up1");

                 String fileName2 = multi.getFilesystemName("up2");

                 String fileName3 = multi.getFilesystemName("up3");

     

                 // 파일  사이즈 받기

                 int size1 = (int)(new File(savePath + "/" + fileName1).length());

                 int size2 = (int)(new File(savePath + "/" + fileName2).length());

                 int size3 = (int)(new File(savePath + "/" + fileName3).length());

                

                 // 데이터베이스 접속

                 Class.forName("org.gjt.mm.mysql.Driver").newInstance();

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

     

                 String query = "insert into upTable values(null, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

                 PreparedStatement pstmt = conn.prepareStatement(query);

                 pstmt.setString(1, userName);

                 pstmt.setString(2, subject);

                 pstmt.setString(3, contents);

                 pstmt.setString(4,  fileName1);

                 pstmt.setString(5,  fileName2);

                 pstmt.setString(6,  fileName3);

                 pstmt.setInt(7, size1);

                 pstmt.setInt(8, size2);

                 pstmt.setInt(9, size3);

                 int affectedRow = pstmt.executeUpdate();

     

                 pstmt.close();

                 conn.close();

     

                 if(affectedRow != 1){

                               out.print("데이터 베이스 입력에 실패하였습니다");

                               // 입력에 실패하였다면 서버측에 업로드 파일을 삭제한다.

                               Enumeration enum = multi.getFileNames();

                               while(enum.hasMoreElements()){

                                            new File(savePath + "/" + multi.getFilesystemName((String)enum.nextElement())).delete();

                               }

                 }else{

                               response.sendRedirect("upList.jsp");

                 }

    %>

     

    위의 파일을 보게 되면 넘어오는 파라메터를 request 객체로 받지 않고 request MultipartRequest 매개변수로 넘겨준 MultipartRequest 인스턴스인 multi 받아낸다는 것을 있다.

    특히 한글 파일이 업로드가 때에는 주의를 해야 한다. MultipartRequest 객체로 파일을 받아올 charset 지정되지 않으면 한글인 경우 파일이름이 깨지게 된다. 이때에는 주석 처리를 부분과 같이 한글문자셋을 지정해 줘야 한다.

    하지만 MySQL 경우에는 한글인코딩을 하게 되면 한글이 다시 깨지게 되기 때문에 업로드 되는 파일의 이름만 부분적으로 한글 인코딩을 해줘야 하게 된다. 여러가지 시도를 해보고 각자의 환경에 맞게 고쳐서 쓰기 바란다.

     

    파일의 사이즈를 받는 부분은 파일을 생성하고 그곳에 length() 메소드를 호출하여 int 형변환 하였다는 것을 있다.

    반환값이 long 타입이기 때문에 형변환은 해줬지만 자신의 입맛에 맞게 사용하기 바란다.

     

    앞서 했던 파일을 하나만 올리는 예제와 비교해 보면 이번 예제는 데이터베이스에 저장을 한다는 부분이 추가되었다.

    데이터베이스에 저장할 때는 파일의 이름과 파일의 사이즈를 입력해주면 된다.

    위에서 받아온 파일의 이름을 PreparedStatement IN 파라메터에 각각 대입을 해주고 executeUpdate 숫자를 받아주면 데이터베이스에 입력이 되었는가의 판단 여부를 알아 있다. 만약 데이터베이스에 입력이 되었다면 1 반환될 것이고 그렇지 않다면 0 반납이 되기 때문이다. 이렇게 나온 숫자를 이용하여 데이터 베이스에 입력이 안되었다면 기존의 업로드 파일들을 지워줘야 한다.

     

    MultipartRequest 클래스의 메소드 중에는 파일입력 파라메터들의 이름을 Enumeration 객체로 반납해 주는 메소드가 있다.

    바로 getFileNames() 라는 메소드 인데, 메소드가 해주는 역할은 파일이름을 반납하는 것이 아니라 파일이름이 담겨서 오는 파라메터들을 반납해 준다는 것이다. 이렇게 알아낸 파일들의 파라메터 이름들을 이용하여 getFilesystemName() 메소드에 알려주게 되면 실제 업로드 (중복파일이 있다면 변경된 이름을 반납) 파일의 이름을 알아 수가 있다.

    이렇게 알게 파일의 실제 이름을 File 객체로 생성하여 delete() 메소드를 호출하게 되면 업로드 파일이 서버측에서 삭제되게 된다.

     

    만약 데이터베이스에 입력이 되었다면 upList.jsp 파일로 요청이 넘어가게 되는데 upList.jsp 파일에서는 데이터베이스에 입력되어 있는 모든 레코드를 num 순서의 역방향(desc) 정렬하여 사용자 측에 보여주게 된다.

    아래의 그림은 upList.jsp 파일이다. 제목을 클릭하면 업로드된 게시물의 내용과 업로드 파일을 수가 있다.

     

    그림 . upList.jsp

     

     

     

     

                           

     

    그럼 데이터 베이스에는 어떻게 들어가 있는지 보자.

    MySQL 서버가 깔려있는 경로로 이동하여 mysql u root p test 라고 입력한 패스워드를 입력한다.

    Select * from upTable; 같이 입력하면 아래와 같은 그림이 나오게 된다.

     

     

     

     

     

     

     

    아래는 upList.jsp 파일의 소스이다.

    예제 : upList.jsp

    <%--  FileName upList.jsp    savePath=c:/tomcat4/webapps/ROOT/uploadTest  --%>

     

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

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

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

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

     

    <%

                 // 데이터베이스 접속

                 Class.forName("org.gjt.mm.mysql.Driver").newInstance();

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

     

                 String query = "select * from uptable order by num desc";

                 Statement stmt = conn.createStatement();

                 ResultSet rs = stmt.executeQuery(query);

     

                 out.print("<Table border=1>");

                 out.print(" <tr>");

                 out.print("              <td>번호</td>");

                 out.print("              <td width=100>제목</td>");

                 out.print(" </tr>");

     

                 while(rs.next()){

                   out.print("<tr>");

                   out.print("  <td>"+rs.getInt("num")+"</td>");

                   out.print("  <td><a href=upView.jsp?num="+rs.getInt("num")+">"+rs.getString("subject")+"</a></td>");

                   out.print("            </tr>");

                 }

                 out.print("</table>");

     

                 rs.close();

                 stmt.close();

                 conn.close();

    %>

     

    위에 있는 upList.jsp 그림과 같이 보인다면 제목을 클릭해 보자. upView.jsp 페이지가 이동되는 것을 있다.

    이제 upView.jsp 에서 해야 일이 머릿속에 그려질 것이다.

    먼저 해야 일은 upList.jsp  에서 넘어오는 파라메터의 값을 받아내야 한다.

    num 값을 이용하여 쿼리를 전송하고 그렇게 얻어지는 결과치를 브라우져에 알맞게 뿌려주면 된다.

    또한 파일들에 대하여 링크를 걸어줘야 파일을 클라이언트 측에서 인식을 수가 있게 된다.

    현재는 파일에 대해 파일이름을 직접 지정하지만 추후 제작할 업로드 게시판에서는 다운로드를 해주는 파일을 제작할 것이다.

    아래의 예제는 upView.jsp 파일이다. 파일이름에 대소문자 구별하여 저장한다.

     

    예제 upView.jsp

    <%-- FileName : upView.jsp   savePath : c:/tomcat4/webapps/ROOT/uploadTest --%>

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

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

    <%

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

                 // 데이터베이스 접속

                 Class.forName("org.gjt.mm.mysql.Driver").newInstance();

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

                

                 String query = "select * from upTable where num="+num;

                 Statement stmt = conn.createStatement();

                 ResultSet rs = stmt.executeQuery(query);

                

                 out.print("<table border=1>");

                 if(rs.next()){

                               out.print("<tr>");

                               out.print(" <td>번호 : " + rs.getInt("num") + "</td>");

                               out.print(" <td colspan=2>제목 : " + rs.getString("subject") + "</td>");

                               out.print("</tr>");

                               out.print("<tr>");

                               out.print(" <td colspan=3>");

                               out.print("   파일 1 <a href=/uploadTest/"+rs.getString("up1")+">"+ rs.getString("up1") + "</a>");

                               out.print("  파일 2 <a href=/uploadTest/"+rs.getString("up2")+">"+ rs.getString("up2") + "</a>");

                               out.print("  파일 3 <a href=/uploadTest/"+rs.getString("up3")+">"+ rs.getString("up3") + "</a>");

                               out.print("</tr>");

                               out.print("<tr>");

                               out.print(" <td>내용</td>");

                               out.print(" <td colspan=2 height=50>" + rs.getString("contents") + "</td>");

                               out.print("</tr>");

                               out.print("<tr>");

                               out.print(" <td colspan=3>");

                               out.print("              <a href=modify.jsp?num="+rs.getInt("num")+">수정</a>");

                               out.print("              <a href=delete.jsp?num="+rs.getInt("num")+">삭제</a>");

                               out.print("</tr>");

                 }

                 out.print("</table>");

                 rs.close();

                 stmt.close();

                 conn.close();

    %>

     

    위의 파일을 실행하면 아래와 같은 그림이 나오게 된다.

     

     

      

    화면 하단에 보면 수정/삭제 부분이 보인다. 여기서 수정이란 기존의 파일을 삭제하고 새로운 파일을 올리겠다는 것이고

    삭제는 기존의 파일과 데이터베이스에 들어있는 정보를 같이 삭제 하겠다는 것이다.

     

    그럼 삭제를 먼저 해보자. 위의 그림에서 보이는 것과 같이 삭제 라는 곳에 마우스를 올리고 브라우져 하단에 나오는 링크정보를 보도록 하자 delete.jsp?num=1 같이 정보가 넘어가는 것을 있다.

    delete.jsp  파일에서는 넘어오는 파라메터를 이용하여 데이터베이스에 쿼리를 하고 얻어진 파일이름을 이용하여 파일을 삭제하고 다시 데이터베이스의 레코드를 삭제하면 된다.  , 정보가 삭제되었다면 다시 upList.jsp 파일로 페이지를 이동시켜주면 된다.

    아래의 예제를 작성한 실행 보고 윈도우탐색기에서 파일이 삭제 되었는지 보고, 데이터베이스에서는 레코드가 삭제 되었는지 확인해 보자.

     

    예제. delete..jsp

    <%-- FileName : delete.jsp   SavePath : c:/tomcat4/webapps/ROOT/uploadTest   --%>

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

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

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

    <%

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

     

                 String savePath = "c:/tomcat4/webapps/ROOT/uploadTest";

                 String query1 = "select up1, up2, up3 from upTable where num="+num;

     

                 Class.forName("org.gjt.mm.mysql.Driver").newInstance();

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

                 Statement stmt = conn.createStatement();

                 ResultSet rs = stmt.executeQuery(query1);

                 ResultSetMetaData rsmd = rs.getMetaData();

                 int columnCount = rsmd.getColumnCount();

                

                 if(rs.next()){

                               for(int i = 1; i <= columnCount; i++){

                                            if(rs.getString(i) != null || rs.getString(i).length() > 0){

                                                         new File(savePath + "/" + rs.getString(i)).delete();                                        

                                            }

                               }

                 }

     

                 String query2 = "delete from uptable where num="+num;

                 stmt.executeUpdate(query2);

     

                 rs.close();

                 stmt.close();

                 conn.close();

              response.sendRedirect(upList.jsp);

    %>

     

    위의 파일에서는 ResultSet 에서 나오는 테이블 정보를 이용하여(ResultSetMetaData) 선택된 컬럼의 개수를 알아내고, 그렇게 알아낸 컬럼의 숫자만큼 순환문을 돌면서 파일객체를 생성하여 업로드 파일을 삭제 하는 것을 있다.

    이후 두번째 쿼리문 에서는 해당 레코드를 삭제하는 쿼리를 데이터베이스에 전송한 다는 것을 있다.

    현재의 예제 파일에는 중간에 에러발생시 전혀 복구가 불가능한 상태인데 파일을 삭제 시에 정말 삭제 하는 것이 아니라 임시디렉토리를 하나 두고 삭제할 파일을 임시 디렉토리로 이동시킨후 해당 레코드가 정상적으로 삭제가 되었으면 임시디렉토리에 있는 파일을 실제로 삭제하는 방법을 써야 한다. 물론 업로드 때에도 위와 같은 방법을 쓰는 것이 좋다.

     

    마지막으로 수정 하는 부분을 작성해 보도록 하자.

    기존 업로드 파일들을 새로운 파일로 대치 하고, 내용에 대한 사항을 수정해야 하는 것이기 때문에 위의 delete.jsp 보다는 약간 복잡하다.

    수정을 하려면 새로운 내용과 새로운 파일을 입력을 받을 있는 HTML 폼이 필요하다. 이곳에서 넘어가는 파라메터들에 대하여 작업을 해야 JSP 파일도 필요하다.

    먼저 새로운 내용을 입력받는 형식을 작성해 보도록 하자.

     

    예제. modify.jsp

    <%-- FileName : modify.jsp   SavePath : c:/tomcat4/webapps/ROOT/uploadTest  --%>

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

    <%

                 // 넘어오는 Number 값을 받아 Hidden 변수타입으로 넘겨준다.

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

    %>

    <HTML>

    <HEAD>

                 <TITLE>JSP UPLOAD Test</TITLE>

    <HEAD>

    <BODY>

    <FORM name="frm" method="POST" ACTION="modifyUp.jsp" enctype="multipart/form-data">

    <TABLE Border="1">

                 <TR>

                               <TD>이름 <input type="text" name="userName"></td>

                 </TR>

                 <TR>

                               <TD>제목 <input type="text" name="subject" size=40></td>

                 </TR>

                 <TR>

                               <TD>내용<TextArea name="contents" rows="10" cols="60"></textArea></td>

                 </TR>

                 <TR>

                               <TD>파일 1  <input type="file" name="up1"> </TD>

                 </TR>

                 <TR>

                               <TD>파일 2  <input type="file" name="up2"> </TD>

                 </TR>

                 <TR>

                               <TD>파일 3  <input type="file" name="up3"> </TD>

                 </TR>

                 <TR>

                               <TD> <INPUT TYPE="SUBMIT" value=" "> </TD>

                 </TR>

    </TABLE>

    <!-- 히든 변수로 modifyUp.jsp 파일에서 참조할 변수를 전달 한다 -->

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

    </FORM>

    </BODY>

    </HTML>

     

    modify.jsp 파일은 생각보다 상당히 단순하다. 그냥 HTML 입력폼 Hidden 변수타입만 추가된 형태이다.

    이곳에서 hidden 변수를 modifyUp.jsp 파일에 반드시 넘겨줘야 한다. 그렇지 않으면 기존의 어느 레코드에 업데이트를 해야 수가 없기 때문이다. 이렇게 넘어간 num 변수 값과 새롭게 입력된 파라메터들을 modifyUp.jsp 파일에서 데이터 베이스 쪽으로 새롭게 갱신해 줘야 한다. 새롭게 넘어오는 파일이 있다면 해당 파라메터에 상응하는 컬럼이 가지고 있는 기존의 실제 파일을 삭제 해줘야 한다. 세곳의 파일 입력폼에서 전부 파일이 전송된다면 컬럼에 들어있는 파일정보를 이용하여 실제 파일을 삭제해야 하며 만약 한군데의 입력폼 에서만 파일이 전송된다면 해당되는 입력폼에 상응하는 컬럼이 가지고 있는 실제 파일을 삭제해 줘야 한다.

     

    어렵겠지만 다음 장의 예제를 자세히 보자.

     

    예제. modifyUp.jsp 

    <%-- FileName : modifyUp.jsp   SavePath : c:/tomcat4/webapps/ROOT/uploadTest   --%>

     

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

    <%@ page import="com.oreilly.servlet.MultipartRequest" %>

    <%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

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

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

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

    <%

                 String savePath = "c:/tomcat4/webapps/ROOT/uploadTest"; // 업로드 경로

                 int sizeLimit = 10 * 1024 * 1024;

     

                 MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());

     

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

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

                 String contents = multi.getParameter("contents");

                

                 boolean selectFlag = false;

                 String selectQuery = "select ";

                 String updateQuery = "update uptable set ";

                 Enumeration e = multi.getFileNames();

                 while(e.hasMoreElements()){

                               String formName = (String)e.nextElement();

                               if(multi.getFilesystemName(formName) != null){

                                            selectQuery += formName + ",";

                                            updateQuery += formName + "='" + multi.getFilesystemName(formName) + "',";

                                            selectFlag = true;

                               }

                 }

                

                 if(selectQuery.trim().endsWith(",")){

                               selectQuery = selectQuery.substring(0, selectQuery.length()-1);

                 }

                 selectQuery += " from upTable where num="+num;

                 updateQuery += " subject='"+ subject + "', contents='"+contents+"' where num="+num;

     

    //           out.print(selectQuery + "<BR>" + updateQuery);

                 Class.forName("org.gjt.mm.mysql.Driver").newInstance();

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

                 Statement stmt = conn.createStatement();

                 if(selectFlag){

                               ResultSet rs = stmt.executeQuery(selectQuery);

                               ResultSetMetaData rsmd = rs.getMetaData();

                               int columnCount = rsmd.getColumnCount();

                               if(rs.next()){

                                            for(int i = 1; i <= columnCount; i++){

                                                         new File(savePath + "/" + rs.getString(i)).delete();

                                            }

                               }

                               rs.close();

                 }

                 stmt.executeUpdate(updateQuery);       

                 stmt.close();

                 conn.close();

                 response.sendRedirect("upList.jsp");

    %>

     

    위의 예제에서 보면 쿼리문장을 순환문을 통해 작성을 한다는 것을 수가 있다.

    이는 사용자가 새로 갱신될 파일이나 내용을 어떻게 전송할 예측할 수가 없기 때문에 순환문을 통해 실제 업로드 파라메터에 해당하는 부분만 쿼리 문장에 포함을 시키려고 것이다.

    위의 예제를 실행해 보면 실제 업로드 파일에 해당하는 부분의 컬럼 정보와 그곳에 저장되어있는 파일만 삭제 된다는 것을 있다. 어렵게 생각되는 예제 이지만 쇼핑몰의 상품 사진 업로드 부분을 작성하려면 위와 같은 방법을 응용해야 것이다.

    출처 : Tong - 훈스구락부님의 JAVA/JSP통

     
    2008. 9. 8. 15:02

    JSP: 파일 업로드 (cos.jar 이용) MultipartRequest를 통한 FIle Upload, Download, Delete

    파일 업로드 (cos.jar 이용)

    바운더리를 이용한 방법은 복잡하다. 그래서 기존의 방법을 사용하는 방법으로 다시 파일 업로드를 짜보겠다.


    //upload.html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>파일업로드</title>
    </head>
    <body>
    <h3>파일 업로드</h3>
    업로드한 파일을 선택해 주세요.<br>
    <form action="upload.jsp" method="post" enctype="multipart/form-data">
    <table>
    <tr>
     <td>제목</td>
     <td><input type="text" name="subject"></td>
    </tr>
    <tr>
     <td>파일 이름</td>
     <td><input type ="file" name="file1"></td>
    </tr>
    <tr>
     <td>파일 이름</td>
     <td><input type ="file" name="file2"></td>
    </tr>
    <tr>
     <td colspan="2">
     <input type="submit">
     <input type="reset">
     </td>
    </tr>
    </table>
    </body>
    </html>



    파일 업로드

    업로드한 파일을 선택해 주세요.
    <FORM action=upload.jsp method=post encType=multipart/form-data>

    제목 <INPUT value=파일업로드 name=subject>
    파일 이름 <INPUT type=file name=file1>
    파일 이름 <INPUT type=file name=file2>
    <INPUT type=submit value="쿼리 전송"> <INPUT type=reset value=원래대로>
    </FORM>


    //upload.jsp

    <%@ page language="java" contentType="text/html; charset=EUC-KR"
     pageEncoding="EUC-KR"%>
    <%@ page import="java.io.*" %>
    <%@ page import="com.oreilly.servlet.*" %>
    <%@ page import="com.oreilly.servlet.multipart.*" %>
    <% request.setCharacterEncoding("euc-kr"); %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>파일 업로드 결과</title>
    </head>
    <body>
    <h3>파일 업로드 결과</h3>
    <%
     String dir = application.getRealPath("/upload"); //폴더 얻기
     int max = 5 * 1024 * 1024; //최대 업로드 크기는 5M까지만 허용
     try {
      MultipartRequest m = new MultipartRequest(request, dir, max, "euc-kr",new DefaultFileRenamePolicy());
      String subject = m.getParameter("subject");
      String file1 = m.getFilesystemName("file1");
      String ofile1 = m.getOriginalFileName("file1");
     
      String file2 = m.getFilesystemName("file2");
      String ofile2 = m.getOriginalFileName("file2");
    %>
    <%  
      if(file1 != null) {
    %>
      업로드 파일1:<a href=/upload/<%=file1%>><%=ofile1%></a><br>
    <%
      }//if
     
      if(file2 != null) {
    %>
      업로드 파일2:<a href=/upload/<%=file2%>><%=ofile2%></a><br>
    <%
      }//if
     }catch(Exception e){
      e.printStackTrace(new PrintWriter(out));
     }//catch
    %>
    </body>
    </html>


    파일 업로드 결과

    업로드 파일1:hi.txt
    업로드 파일2:sleeping.jpeg

    파일저장장소는


    C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\ch1_web\upload


    최신 다운로드

    http://www.servlets.com/cos/













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

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



















    [cos]MultipartRequest를 이용한 업로드 etc lib

    2007/02/05 12:43

    http://blog.naver.com/mangchi0909/40034081389

    출처:http://aboutjsp.com

    ★ MultipartRequest를 이용하여 업로드구현하기

     


    * 강좌를 시작하기전에....

    - 기존의 jspSmartUpload를 대체해 가고 있는 MultipartRequest에 대한 간단한 사용법에 대해 강의 합니다.
    JSP만을 사용하는 강좌이며 Beans, Servlet은 다루지 않습니다.

    - MultipartRequest는 COS 패키지에 포함되어 있는 파일 업로드 컴포넌트 입니다.

    - COS 에서는 한글등(non-Latin-1)의 언어를 지원하지 않았었습니다. 그러한 이유로 이아스(이창신)님 께서 배포한 COSI(COS International) 를 주로 사용 하였으나, 이아스님의 노력에 힘입어 2002년 5월 9일 자 COS에서는 한글을 포함한 non-Latin-1 계열의 언어를 지원하게 되었습니다. 근 2년간의 국제화를 위한 투쟁이 비로서 결실을 맺는 순간이었습니다.
    이에 따라 본 강좌의 내용도 COS 맞추어 약간의 수정을 했습니다.

    COS 공식 사이트 : http://www.servlets.com/cos/index.html


    * MultipartRequest는....

    필자는 기존에 jspSmartUpload를 주로 사용하여 업로드를 구현했었다. 하지만 jspSmartUpload는 로직자체에 상당한 문제점(업로드된 파일을 메모리에 올리고 작업하여 그로인해 파생되는 문제점들)이 있음이 밝혀 졌고, 그로인해 jspSmartUpload의 사용은 급속히 줄어 들었다.

    사실 jspSmartUpload에서는 편리한 많은 메소드를 지원해주고 있어 MultipartRequest를 사용하는것 보다 훨씬 쉽게 원하는 기능을 구현 할수 있는 것이 사실이다. 하지만 jspSmartUpload는 문제점이 발견 되었으므로 가능한사용을 자제하는 것이 좋겠다.

    MultipartRequest는 아주 간단한 메소드를 몇개 지원한다. 하지만 이 메소드들 만으로도 왠만한 기능은 전부 구현이 가능하니 실망하지 말자. getFile() 메소드를 이용하면 java.io.File 객체를 얻어 낼수 있으니 이를 이용하면 될것이다.


    * 설치하기

    MultipartRequest는 oreilly에서 배포하며, http://www.servlets.com/cos/index.html에서 다운로드 받아도 되고, 필자의 홈페이지(http://aboutjsp.com/)의 자료실에도 업로드를 해놓았으니 다운받아 사용해 보기 바란다.

    설치 하는 방법은 다운로드 받아서 압축을 푼뒤, classes 디렉토리 아래를 톰캣의 classes 디렉토리에 통째로 복사한다. (예.ROOT/WEB-INF/classes) 혹은 cos.jar를 lib에 복사해도 된다.

    COS 패키지기에는 MultipartRequest 말고도 유용한 많은 클래스들이 많이 존재하므로, 여기의 API문서를 참고하여 사용하기 바란다


    * 업로드 구현

    간단한 예제를 통해서 알아 보도록 하자.

    wirte.htm

    <html>
      <body>
        <form action="up.jsp" enctype="multipart/form-data" method="post">
          이름 : <input type="text" name="userName"> <BR>
          파일 : <input type="file" name="upfile">
          <input type="submit" value="Upload">
        </form>
      </body>
    </html>

    up.jsp

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

    <%@ page import="com.oreilly.servlet.MultipartRequest,

                       com.oreilly.servlet.multipart.DefaultFileRenamePolicy,
                       java.util.*" %>

    <%
    String savePath="/usr/local/tomcat/webapps/ROOT/test/upload"; // 저장할 디렉토리 (절대경로)

    int sizeLimit = 5 * 1024 * 1024 ; // 5메가까지 제한 넘어서면 예외발생

    try{
                    MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
                    Enumeration formNames=multi.getFileNames(); // 폼의 이름 반환
                    String formName=(String)formNames.nextElement(); // 자료가 많을 경우엔 while 문을 사용
                    String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기

                    if(fileName == null) {   // 파일이 업로드 되지 않았을때
                                    out.print("파일 업로드 되지 않았음");
                    } else {  // 파일이 업로드 되었을때
                                    fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩 - 브라우져에 출력
                                    out.print("User Name : " + multi.getParameter("userName")  + "<BR>");
                                    out.print("Form Name : " + formName + "<BR>");
                                    out.print("File Name  : " + fileName);
                    } // end if

     } catch(Exception e) {
                    out.print("예외 상황 발생..! ");
    }
    %>



    위의 예제 소스를 보면 대부분이 이해가 잘 갈것이라 생각되지만.. 하나씩 살펴 보도록 하겠다. 우선 write.htm 에서는 폼에서 method="post" 형식으로 해야 하며 ecntype="multipart/form-data" 를 꼭 붙여 주어야 한다.

    다음으로 up.jsp를 하나 하나 살펴 보자. MultipartRequest 클래스를 import 하고, java.util.* 는Enumeration 객체를 사용하기 위해서 import 한다..

    savePath 는 저장될 실제 디렉토리(시스템상의 절대 경로)를 적으면 된다. sizeLimit 에서는 제한 용량을 셋팅하는데, 위와같은방법으로 메가바이트 단위로 지정할 수 있다.

    그 다음줄에서는 MultipartRequest 객체가 생성됨과 동시에 업로드가 이루어져 지정한 디렉토리에 저장된다. 이때 MultipartRequest의 여러 생성자들중 하나를 이용하면 되는데, 기존에는 새성자로 한글 "euc-kr"을 줬어야 했는데, 어쩐일인지 이제는 주지 않아아 한글 이름의 파일이 잘 저장되느는 것을 볼수 있다. 또한 가장 오른쪽의 'new DefaultFileRenamePolicy' 는 는 파일 이름 중복처리에 관한 것으로 넣을수도 있고, 뺄수도 있다. 필요하지 않다고 생각된다면 빼버리도록 하자.

    그아래에 if 문을 보면, 파일이 업로드 되었을때와 업로드 되지 않았을때의 처리를 나누어서 할수 있도록 하고 있다.

    if 문 위의 3라인은 파일의 이름을 얻기위한 로직으로 Enumeration 객체로 받은 폼의 이름을 이용하고 있다. 만약 폼이 여러개가 있을 경우엔 적절한 자료형을 이용하여 폼의 이름을 통해서 파일의 이름들을 얻어 낼수 있을 것이다. 만약 파일 업로드를 Beans로 구현할 경우엔 반드시 이러한 로직을(Enumeration 객체를 이용한 loop구문)사용해야 할 것이다.

    사실 위의 예제에서는 굳이 Enumerration 객체를 가지고 구현할 필요는 없지만, 해당 메소드의 사용법을 보여주기 위해서 사용하였다. 이러한 방법을 사용하지 않을 경우에는 if 위에 3라인을 삭제하고 아래의 내용을 추가 하면다.

    String fileName=multi.getFilesystemName("upfile");


    * FileRenamePolicy 에 관해서...

    이번 버젼의 MultipartRequest 에서 부터는 파일 중복처리 인터페이스가 추가 되었고, 위의 예제 소스는 그러한 내용이 반영되어있다. DefaultFileRenamePolicy는 FileRenamePolicy Interface 를 구현한 것으로, 중복된 파일 이름뒤에 숫자를 붙여 주고 있다. ( abcd.zip , abcd1.zip, abcd2.zip, abcd3.zip ....... )

    DefaultFileRenamePolicy Class를 바탕으로 새로운 RenamePolicy class 를 만들면 자신이 원하는 FileRenamePolicy 를 적용할수 있다.

    또한 getFilesystemName()메소드를 이용하여 변경된 파일 이름을 얻을수 있고, getOriginalFileName()메소드는 변경되기 이전의 파일이름을 넘겨준다.


    * multi.getParameter()

    write.htm 에서 서정한바와 같이 enctype="multipart/form-data" 로 지정하면, request.getParameter()로는 아무러 값도 받아 올수가 없게된다. 그러한 이유로 대부분의 파일업로드 컴포넌트에서는 getParameter() 메소드를 지원하는데, MultipartRequest에서도 이러한 메소드를 지원한다. 지원하는 메소드는 아래와 같으며, 사용법은 request.getParameter() 등과 동일하다.

    String getParameter(String name)
    Enumeration getParameterNames()
    String[] getParameterValues(String name)


    * 한글관련 문제 처리법

    MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());

    위를 아래와 같이 수정한다.

    MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());

    "euc-kr" 부분엔 "ksc5601", "ms949" 등 자신의 환경에 알맞는 캐릭터셋을 넣어 주면 된다.

    각 메소드들에 대한 자세한 사용법은 아래의 API문서를 참고 하기 바란다.

    http://aboutjsp.com/docs/cos/












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

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











    MultipartRequest를 통한 FIle Upload, Download, Delete Java

    2006/12/21 16:14

    http://blog.naver.com/nije1983/130012485962

    1. File Upload

    MultipartRequest multi = null;
       String savepath = request.getRealPath("/") + "WebContent/StyleUpload";

       int limitSize = 15 * 1024 * 1024;
       
       try {
        multi = new MultipartRequest(request, savepath, limitSize, "euc-kr",

                                                  new DefaultFileRenamePolicy());
        task = multi.getParameter("task");
        String styleNo = multi.getParameter("styleNo");
        String contents = multi.getParameter("contents");
        String attachFile = multi.getFilesystemName("attachFile");

       
        if (attachFile == null) {
         attachFile = "";
        } else {
         byte[] byteStr = attachFile.getBytes(); 
         int len = byteStr.length;
         if (len > 50) {
          File f = new File(savepath + "/" + attachFile);
          if (f.isFile()) {
           f.delete();
          }
         }
        }

    } catch (IOException ie) {
        log.debug("첨부파일 용량 초과!!! 예외발생!!!");
        throw ie;
       }


    2.File DownLoad

    if(vo.getString("fileDown").equals("true")) {
              request.setCharacterEncoding("EUC-KR");
           String fileName = new String(request.getParameter("fileUrl").getBytes("ISO-8859-1"), "KSC5601");
           String fileUrl = "WebContent/StyleUpload/" + fileName;
           if(fileUrl == null) return;
           boolean fileexists = true;
           try {
            ServletContext cxt = getServletConfig().getServletContext();
            String file = cxt.getRealPath(fileUrl);
            File fileEx = new File(file);
            if(fileEx.exists()) {
               response.setContentType("application/octet-stream");
               response.setHeader("Content-Disposition","attachment; filename="+ java.net.URLEncoder.encode(fileName,"UTF-8"));
               byte [] buffer = new byte[1024*15];
               ServletOutputStream out = response.getOutputStream();
               BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
               BufferedOutputStream bout = new BufferedOutputStream(out);
               int n = 0;
               while((n=in.read(buffer, 0, 1024*15)) != -1) {
                     bout.write(buffer, 0, n);
               bout.flush();
               }
               bout.close();
               in.close();
               } else {
               fileexists = false;
               }
           } catch(Exception e) {
              e.printStackTrace();
              }
              if(!fileexists) {
               vo.put("message", MessageUtil.getMessage("MSG00009"));
              }

          }


    3.File Delete

    request.setCharacterEncoding("EUC-KR");
          String fileName = new String(request.getParameter("fileUrl").getBytes("ISO-8859-1"), "KSC5601");
          String fileUrl = "WebContent/StyleUpload/" + fileName;
          if(fileUrl == null) return;
          boolean fileexists = true;
          try
          {
           ServletContext cxt = getServletConfig().getServletContext();
           String file = cxt.getRealPath(fileUrl);
           File fileEx = new File(file);
           if(fileEx.exists())
           {
            fileEx.delete();
           }
          }
          catch(Exception e)
          {
              e.printStackTrace();
           }













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

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













    파일 업로드하기(cos.jar사용) J2EE

    2006/02/20 02:07

    http://blog.naver.com/inwarde/80021997584

    FileSelect-inwarde.jsp
    ViewPage-inwarde.jsp

    업로드 컴포넌트로는 cos.jar를 사용하여 간단한 웹 업로드 소스를 만들어 보았습니당...

    cos.jar를 사용하기 위해서는 이것을 설정해 주어야 합니다.

    이 파일은 http://www.servlets.com/에서 다운로드 받을 수 있습니다.

    com.oreilly.servlet링크안에 cos-27May2002.zip 파일이 있습니다.

    이 안에 cos.jar파일을 찾아서 클래스 패스를 잡아주거나 , 직접 톰켓안의 웹어플리케이션/WEB-INF/lib폴더 안에 설정을 해줍니다(톰켓4.x에서는 외부클래스패스의 이용을 제한하였기 때문에 사용하는 방법).



    먼저 파일 업로드를 위한 폼형태는


    <form enctype="multipart/form-data">

       <input type="file" name="xxxx">

    </form>


    입니다.

    파일 업로드 창을 만들기 위해서 input type에 file태그를 만들고

    이것을 전송하기 위해서 enctype태그를 사용하였습니다.


    다음으로

    업로드를 하고 데이터를 분석하는 jsp페이지를 만들어 봅시다.

    com/oreilly/servlet 안의 MultipartRequest클래스를 사용합니다.

    이 객체를 생성하면 지정한 파일이 서버상의 폴더에 저장 됩니다.

    생성자

    MultipartRequest AAA = new MultipartRequset(

                                             HttpServletRequest request,

                                             String saveDirectory,

                                             int maxPostSize,

                                             String encoding,

                                             FileRenamePolicy policy)


    파라미터 이름 추출          Enumeration params = AAA.getParameterNames();

    파라미터 이름을 통한 값 추출     String paramValue = AAA.getParameter(String name);

    파일속성 파라미터 이름 추출      Enumeration files = AAA.getFileNames();

    파일 이름 추출(저장된값)          String fileName = AAA.getFilesystemName(name);

    파일 이름 추출(원래값)             String original = AAA.getOriginalFileName(name);

    컨텐트타입 반환                       String type = AAA.getContentType(name);

    파일 객체 반환                         File file = AAA.getFile(name);


    출처 : Tong - 훈스구락부님의 JAVA/JSP통

    'My work space > JSP/Servlet' 카테고리의 다른 글

    Log4j 사용법 로깅-Log4J  (0) 2008.09.08
    MultipartRequest 로 파일 업로드 하기  (0) 2008.09.08
    Servlet API 파일  (0) 2008.09.08
    session사용  (0) 2008.09.08
    세션설정,세션에서 값 가져오기  (0) 2008.09.08
    2008. 9. 8. 14:59

    Servlet API 파일

    2008. 9. 8. 14:58

    session사용

    세션


    아이디와 패스워드를 넣고 로긴을 하면 웹페이지를 종료시키지 않은 이상

    계속 로그인 상태로 웹서핑을 하는데 비접속자와 구분을 위해 꼭 필요하다.


    진짜 구식 방법으로 모든 웹페이지에 아이디 정보를 넘겨주는 방법도 있지만

    세션에 저장하게 되면 간단하게 어느 웹페이지에서나

    한줄의 명령어로 아이디를 불러와서 개인정보도 불러올 수 있게 된다.



    * 세션의 사용 *


    ┌───────────┬────────────────────────────┐

    │                                 │      session.setAttribute("mySession", "session value");    

    │        세션의 생성         ├────────────────────────────┤

    │                                 │     mySession이란 이름을 가진 세션에 session value란       │

    │                                 │     값을 설정한다.                                                           │

    ├───────────┼────────────────────────────┤

    │                                 │      session.setMaxInactiveInterval(60*5);                         │

    │   세션의 유지기간 설정 ├────────────────────────────┤

    │                                 │       세션 유지기간을 5분을 설정하여 사용자가 5분동안         │

    │                                 │      아무런 동작이 없는 경우 세션은 자동으로 종료가 된다.    │

    ├───────────┼────────────────────────────┤

    │                                 │        session.removeAttribute("mySession");                     │

    │        세션속성삭제       ├────────────────────────────┤

    │                                 │      mySession  이라는 이름의 세션값을 삭제한다.               │

    ├───────────┼────────────────────────────┤

    │                                 │       session.invalidate();                                                │

    │          세션삭제           ├────────────────────────────┤

    │                                 │        세션값을 삭제한다.                                                  │

    └───────────┴────────────────────────────┘



    로그인과 결합된 세션사용방법을 알아보자.



    아  이 디   :   miojj

    패스워드   :   1234


    입력을 누르면 자료는 디비와 접속하여 비교분석을 하게되고

    회원이라는 등식이 성립되면 변수 myId 로 반환하게 만든다.


    session.setAttribute("memID", myId); <- memID 라는 세션명으로 저장하면



    웹페이지가 살아있는 동안 또는 유지기간내에


     <%String memberId = (String)session.getAttribute("memID");%>


    getAttribute 로 꺼내서 사용할 수 있다.  이 때 세션이름 사용


    * 세션저장시 세션명을 달리하면 여러개의 세션도 저장이 된다. *



    그럼 여기서 로그인 구성의 마무리 로그아웃은

    당연히  <% session.invalidate(); %> 로 싹 지워버리자.

    그리고 스크립트로  alert!("로그아웃 되었습니다."); 을 뿌려주는 쎈스!