2011-06-19 10 views
1

クライアントからサーバーにイメージファイルをアップロードできるようにするサーブレットを作成したいとします。私は私のサーブレットが準備したい1サーブレットを使用する正しい方法についての質問

質問:私の方法で http://commons.apache.org/fileupload/using.html

私はいくつかの合併症や疑問を見つけています:私は、私はapacheのサイトで見つけチュートリアルで自分を助けています要求からのすべての値(byte []として含まれる画像)を持つオブジェクトをデータベースに挿入する@EJBに渡します。 これは可能ですか?現在のサーブレットを改善する方法に関する擬似コードのヒントを教えてください。

@WebServlet(name="uploadServlet") 
public class FileUpload extends HttpServlet { 

    @EJB 
    private DBAccessEJB ejb; 

    private static final long serialVersionUID = -1062753489906645120L; 

    // Will be triggered when a post method is sent by the user(Example: Form 
    // submit) 
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     // Check if the request is multipart 
     boolean isMultipart = ServletFileUpload.isMultipartContent(req); 

      // Create the object that willBe passed to the EJB 
       Thing thing = new Thing(); 

     if (isMultipart) { 
      // If it is multipart, save the items in a FileItemfactory 
      FileItemFactory factory = new DiskFileItemFactory(); 
      // Create an upload handler 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      try { 
       // Get the files out of the request 
       List items = upload.parseRequest(req); 
       Iterator iterator = items.iterator(); 
       while (iterator.hasNext()) { 
        // Get each of the items inside the items list 
        FileItem item = (FileItem) iterator.next(); 
        // If the item does not come from a field 
        if (!item.isFormField()) { 
         //transform the uploaded images to byte[] 
             //setTheImageValues of the object 
        } 
            else { 
             //set the text values of the object 
            } 
       } 
          //Pass the prepared object to the EJB to be inserted in DB 
          ejb.save(thing) 
      } catch (FileUploadException fue) { 
       fue.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

質問2

私の代わりにJSFページから、managaged豆を通じてサーブレットにリクエストを渡して考えたが、私は実際にどのように行うのか分かりません。いくつかのヒントを教えていただけますか?私はまた、ページからの通常の方法でそれを行う方法を知らない、あなたは何が最良の方法と思いますか? これは私がこれまで管理対象Beanに係るなかったものです:

public void save() { 

     FacesContext fc = FacesContext.getCurrentInstance(); 
     HttpServletRequest req = (HttpServletRequest)fc.getExternalContext().getRequest(); 

//私は、サーバーへの要求を渡すために、ここで他に何が必要なのでしょうか?
}

これは、マルチパートフォーム内のページで次のようになります。

私のJSFページで
<h:commandButton value="Submit" action="myBackingBean.save"/> 

質問3

私は多かれ少なかれ10個の値を持っているほとんどすべての文字列です。私はそれらをJSFから取り出し、一時的にJSFページに保管します。サーブレットが要求からすべての値を取ることができる場合、バッキングBeanにこの属性を入れる必要はありません。このアプローチは良いことだと思いますか?これはトランザクションを安全に処理するか、またはリスクはありますか?

+0

関連はありませんが、あなたが抱いていることは疑問ではなく、疑問です。 – asgs

+1

簡単な質問、すべてのファイルをデータベースに保存してもよろしいですか?通常のファイルシステムに格納するほうが簡単で、ファイル情報をEJBに保存するほうが簡単です。そうすれば、データベースBLOBSなどを扱う必要がなくなり、EJBの複雑さが大幅に軽減されます。 – oberger

+0

これは、誰かが私に先ほど教えてくれたお勧めで、おそらく私はそのようにしたいと思っています。もっと簡単な方法です。もし私がそれをすれば、私はちょうどファイル名として一意の識別子を作成する方法を見つける必要があるでしょうか? – sfrj

答えて

0

質問の1-

絶対にあなたがあなたのファイルの一意の識別子が必要になりますが、あなたがなど、日付/ユーザ名でフォルダ内のファイルを保存するようなことを行う場合には、あまり複雑になる...

ここでは、使用することができ、あなたのプログラムのための基本的なワークフローは、あなたがこれまでに示した内容に基づき、次のとおりです。

クライアントコンピュータは - > FileUploadServlet(Apacheのコモンズは、アップロードファイルの利用)

一度FileUploadServlet内側:

a)は、まだ内部の間)...など、

bは、ファイル名を含む、あなたのEJBを経由してデータベースへの要求からの情報を保存MIMEタイプ、情報サーバーにファイルをアップロードする、または必要に応じてAmazon S3やGoogle Storageなどの商用ソリューションをJetS3tなどのJava APIを使用して使用する

その後、必要な情報をクライアントに返します。

質問の2から

豆throught要求するためのあなたの推論は何ですか、なぜないだけではなく、アクションサーブレットを作成し、リクエストから情報を収集しますか? Beanの保存メソッドをJSFで利用できるようにすることはできません。その方法は安全ではないとも言えません。

質問3 -

上記と同じ、なぜ店舗情報、一時的にでもあれば、それは他の場所で入手できますか?

1

ダウト#1:

DAOを含むサービス層がセッションBeanにするためにEJBの注釈で注釈を付けて、あなたがここにEJBを使用するように見えます。私はこのアプローチが気に入らず、EJBの世界とHTTPリクエストの世界の違いによって引き起こされる問題にぶつかります。

EJBを使用する最も大きな理由の1つは、トランザクションを管理することであり、トランザクションはmsオーダーで短くしなければならないことに注意することが重要です。これは、データベースのロックなど、さまざまな理由によるものです。しかし、アップロードでHTTPリクエストを処理する場合、これはもはや有効ではありません。

もう1つの観点からは、サービスレイヤーはデータベースモデルの抽象化を表す必要があり、ユーザーの観点からモデルでできることを示す必要があります。ユーザは、画像をデータベースに保存したくないので、ユーザは自分のプロフィールにポートレートを追加したい。

代わりの

ejb.save(thing) 

私は、これは明示的にそれが何を述べ、また、短いトランザクションの要件を満たす

profileService.addPortrait(uid, byte[] image); 

のような機能を好みます。これは、プロファイルのエンティティが同時に来るかもしれない他の要求のために利用可能であることを意味し

ダウト#2(いくつかの状況の画像、または受信トレイの状態、...など):

ローマ人がそうであるように、ローマでは、やる

。 ..

そして、言語の基本を学ぶことから始めます。この場合、いくつかのチュートリアルからJSFを学んでください。

ダウト#3:ブラウザとJSFコンポーネント間の飛行中のリクエストパラメータをインターセプト

は、コンポーネントアーキテクチャおよびデータ隠蔽の原則を破ります。また、JSFコンポーネントのサーバー側で実装されているセキュリティ対策と検証をバイパスします。

JSFコンポーネントフレームワークを使用する場合は、要求自体からではなく、コンポーネントからの値のみを要求するのが理にかなっています。

3つの疑問から、私はあなたに大きな疑念を感じます:私はJSFを使用すべきですか?

あなたの雇用主から義務付けられていれば、それを吸い上げて本を叩き始める... JSFとEJBが問題を解決し、それらの問題の枠組みを特定する方法を学ぶ。

自由に選択できる場合:より軽いフレームワークを選択します(例: Spring + Spring MVC。あなたは自分のペースで経験を積み、問題に遭遇します。

+0

より良い回答が得られました。 – oberger

関連する問題