2012-04-27 56 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. 
相关问题