クライアントからサーバーにイメージファイルをアップロードできるようにするサーブレットを作成したいとします。私は私のサーブレットが準備したい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にこの属性を入れる必要はありません。このアプローチは良いことだと思いますか?これはトランザクションを安全に処理するか、またはリスクはありますか?
関連はありませんが、あなたが抱いていることは疑問ではなく、疑問です。 – asgs
簡単な質問、すべてのファイルをデータベースに保存してもよろしいですか?通常のファイルシステムに格納するほうが簡単で、ファイル情報をEJBに保存するほうが簡単です。そうすれば、データベースBLOBSなどを扱う必要がなくなり、EJBの複雑さが大幅に軽減されます。 – oberger
これは、誰かが私に先ほど教えてくれたお勧めで、おそらく私はそのようにしたいと思っています。もっと簡単な方法です。もし私がそれをすれば、私はちょうどファイル名として一意の識別子を作成する方法を見つける必要があるでしょうか? – sfrj