【问题标题】:Handling two different jobs with two different servlets but with a single submit button使用两个不同的 servlet 但使用一个提交按钮处理两个不同的作业
【发布时间】:2012-05-07 20:46:47
【问题描述】:

以下 HTML sn-p 将 file 提交给 UploadHandler,它是一个 servlet。然后还有一个标题框也需要处理。我可以处理 UploadHandler 中的标题框,然后打开与数据库的连接并在那里提交。但我不想这样做。让上传处理程序处理文件的上传。那么有什么选择呢?我如何将标题提交到表格中?我想在处理这两个工作时创造一种并行感。

<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 Mendoza 发表评论后:

处理文件上传的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);
    }
}

}

【问题讨论】:

  • 你能显示提交文件的Servlet代码吗?
  • @Luiggi Mendoza 查看编辑

标签: java html database forms servlets


【解决方案1】:

如果你从第一个 servlet 转发到第二个 servlet,我想你可以,使用:

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

但这不是一个好主意,因为它可能会触发过滤器,响应可能已经提交等等。

您应该做的是在帮助类中提取第二个 servlet 的功能,然后从第一个 servlet 中调用它,作为一个简单的 java 方法调用。

【讨论】:

  • 我还有一个文本字段要处理,这使得 3 个字段。我将来可以拥有更多。可以吗?
  • 字段数无关紧要。
【解决方案2】:

在您的 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

【讨论】:

    【解决方案3】:

    我同意博卓的观点。但正如他建议的那样,您可以实现帮助类并在第一个 servlet 中实现所有操作(业务逻辑)。它比 RequestDispatcher 好得多。如果您的应用程序使用其他按钮(除了提交)进行操作,那么它是可能的。

    Take your application with a simple diversion. 
    

    【讨论】:

      【解决方案4】:

      尝试类似 UploadHandler 的方法。它可能会有所帮助

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多