2012-04-27 55 views
0

以下HTML代碼段提交文件UploadHandler這是一個servlet。然後有一個標題框也需要處理。我可以在UploadHandler中處理標題框,然後打開與數據庫的連接並在那裏提交。但我不想這樣做。讓上傳處理程序處理上傳文件。那麼有什麼選擇?我如何將標題提交到表格中?我想創造一種處理這兩個工作的並行感。使用兩個不同的servlet處理兩個不同的作業,但使用單個提交按鈕

<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個不同的servlet處理?從UploadaHandler創建一個新線程似乎不是一個好主意。

由@Luiggi門多薩的評論後:

的Servlet處理上傳文件:

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); 
    } 
} 

}

+0

你可以顯示Servlet代碼來提交文件嗎? – 2012-04-27 05:01:29

+0

@ Luiggi門多薩看到編輯 – 2012-04-27 05:06:56

回答

2

我想你可以,如果你從第一次到第二個servlet的遠期合約,使用:

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

但是,這不是一個好主意,因爲它可能觸發過濾器,響應可能已經承諾了等等。

你應該做的是在輔助類中提取第二個servlet的功能,並從第一個servlet中調用它作爲簡單的java方法調用。

+0

我有一個文本字段來處理,使得3場。我未來可能會有更多。這可以嗎 ? – 2012-04-27 05:22:11

+0

字段的數量並不重要。 – Bozho 2012-04-27 05:40:04

0

嘗試類似的UploadHandler。它可以幫助

RequestDispatcher rd = getServletContext().getRequestDispatcher("pathToSecondServlet"); 
rd.forward(req, res); 
0

在你的HTML:

<input type="text" name="captionBox" size="40" /> 
在servlet代碼

然後

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

由於@Bozho建議,文件上傳代碼應該在另一個類的方法進行封裝和調用它,也許你將需要在另一個servlet上進行文件上傳。請記住keep your code DRY

0

我同意Bozho的觀點。但是他建議你可以實現helper類並實現第一個servlet中的所有操作(業務邏輯)。它比RequestDispatcher好得多。如果你的應用程序操作與其他按鈕(除了提交),那麼它是可能的。

Take your application with a simple diversion. 
相關問題