0

次のHTMLスニペットは、サーブレットであるUploadHandlerにファイルを送信します。次に、処理する必要のあるキャプションボックスがあります。UploadHandlerでキャプションボックスを処理してから、データベースとの接続を開いて送信できます。しかし、私はこれをしたくありません。アップロードハンドラーにファイルのアップロードを処理させます。それでは、代替手段は何ですか?キャプションをテーブルに送信するにはどうすればよいですか?この2つの仕事を処理する際に並列性の感覚を作りたいと思います。

<form method="post" action="UploadHandler" enctype="multipart/form-data">
        <table>

            <tr>
                <td> <strong> Browse photo to submit </strong> </td>
                <td> <input type="file" name="ImageToUpload" value="Upload Photo"/> </td>
            </tr>

            <tr>
                <td> <strong> Give a Caption to this photo </strong>  </td>
                <td> <input type="text" name="caption box" size="40" /></td>
            </tr>

            <tr colspan="2">
                <td> <input type="submit" value="submit photo"/> </td>
            </tr>

        </table>
    </form>

クリックして2つの異なるジョブを送信すると、2つの異なるサーブレットによって処理される方法はありますか?UploadaHandlerから新しいスレッドを作成するのは良い考えではないようです。

@Luiggi Mendozaによるコメントの後:

ファイルのアップロードを処理するサーブレット:

package projectcodes;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.util.List;
import java.util.Iterator;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

public class UploadHandler extends HttpServlet {
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
    response.setContentType("text/plain");
    String path = request.getParameter("ImageToUpload");
    PrintWriter writer = response.getWriter();
    try {
        Boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(!isMultipart) {
            Boolean AttemptToUploadFile = true;
            RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
            request.setAttribute("UploadAttempt", AttemptToUploadFile);
            rd.forward(request, response);
        } else {
            DiskFileItemFactory diskFileItem = new DiskFileItemFactory();
            ServletFileUpload fileUpload = new ServletFileUpload(diskFileItem);
            List list = null;

            try {
                list = fileUpload.parseRequest(request);
            }catch(Exception exc) {
                Boolean AttemptToUploadFile = true;
                RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
                request.setAttribute("UploadAttempt", AttemptToUploadFile);
                rd.forward(request, response);
            }

            Iterator iterator = list.iterator();
            while(iterator.hasNext()) {
                String emailOfTheUser = null;
                FileItem fileItem = (FileItem)iterator.next();
                if(!fileItem.isFormField()) {
                    String fieldName = fileItem.getFieldName();
                    String fileName = FilenameUtils.getName(fileItem.getName());
                    HttpSession session = request.getSession();
                    if(!session.isNew()) {
                        emailOfTheUser = (String)session.getAttribute("Email");
                    }
                    File file = new File("/home/non-admin/project uploads/project users/" + emailOfTheUser ,fileName);
                    fileItem.write(file);
                    RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
                    String message = "File Uploaded successfully !";
                    request.setAttribute("SuccessMessage", message);
                    rd.forward(request, response);
                }
            }
        }
    }catch(Exception exc) {
        Boolean AttemptToUploadFile = true;
        RequestDispatcher rd = request.getRequestDispatcher("portfolio_one.jsp");
        request.setAttribute("UploadAttempt", AttemptToUploadFile);
        rd.forward(request, response);
    }
}

}

4

4 に答える 4

2

次を使用して、最初のサーブレットから2番目のサーブレットに転送する場合は可能だと思います。

getServletContext().getRequestDispatcher("/2ndServlet").forward(req, res);

ただし、これは適切なアイデアではありません。フィルターがトリガーされたり、応答がすでにコミットされている可能性があるためです。

ヘルパークラスで2番目のサーブレットの機能を抽出し、それを単純なJavaメソッド呼び出しとして1番目のサーブレットから呼び出すだけです。

于 2012-04-27T05:18:11.800 に答える
0

私はBozhoの見解に同意します。しかし、彼が提案しているように、ヘルパークラスを実装し、最初のサーブレット内にすべての操作(ビジネスロジック)を実装できます。RequestDispatcherよりもはるかに優れています。(送信以外の)他のボタンでアプリケーションを操作する場合、それは可能です。

Take your application with a simple diversion. 
于 2012-04-27T05:29:11.667 に答える
0

UploadHandlerのようなものを試してください。それは役立つかもしれません

RequestDispatcher rd = getServletContext().getRequestDispatcher("pathToSecondServlet");
rd.forward(req, res);
于 2012-04-27T05:10:01.333 に答える
0

あなたのhtmlで:

<input type="text" name="captionBox" size="40" />

次に、サーブレットコードで

String captionBox = request.getParameter("captionBox");
String anotherField = request.getParameter("anotherField");
//all your code

@Bozhoが推奨しているように、ファイルアップロードコードは別のクラスメソッドにカプセル化して呼び出す必要があります。おそらく、別のサーブレットにファイルをアップロードする必要があります。コードを乾いた状態に保つことを忘れないでください

于 2012-04-27T05:29:08.437 に答える