request.getParameter在提交按钮上给出null值

时间:2013-04-13 19:59:42

标签: java servlets multipartform-data apache-commons-fileupload

单击Generate PDF / Generate Excel submit按钮,它正在请求servlet FileUpload 进行处理。现在当我试图获取我按下的提交按钮的值时,它给我的值是 null 。我想知道为什么会这样?

这是我的HTML代码:

<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="file" id="filename" name="filename"><br>
<input type="button" value="Upload"><br>
<input type="submit"  value= "Generate PDF" name="pdf">
<input type = "submit" value="Generate Excel" name="xls">
</form>

这是我的servlet代码:

String generatePDF= request.getParameter("pdf");//null
if(generatePDF.equals("Generate PDF"))//Giving NullPointerException at this step
{
  System.out.println("generatePDF button pressed");
}

5 个答案:

答案 0 :(得分:8)

据我所知,问题似乎在于您将多部分请求发送到服务器。这个question中的第二个答案似乎可以解决您的问题。实质上,您必须使用Apache Commons FileUpload包中的FileItem类提供的方法。或者,按照建议的here,您可能必须使用HttpServletRequest类的getPart()方法。

答案 1 :(得分:3)

<强>更新

抱歉,我最初错过了enctype="multipart/form-data"部分。因此,正如用户@tomor正确指出的那样,问题背后的原因是您使用enctype="multipart/form-data"。阅读他的answer

有关您的问题的更详细说明,请阅读BalusC的以下答案:How to upload files to server using JSP/Servlet?

以下解决方案适用于Servlet v3.0 。对于旧版本,最流行的解决方案是使用Apache Commons FileUpload(请参阅BalusC答案中的详细信息)。


如果你想检查按下了什么提交按钮,其中一个解决方案可能是命名提交按钮,然后检查值。

例:
HTML

<form action="FileUpload" method="post" enctype="multipart/form-data">
    <input type="file" id="filename" name="filename"><br>
    <input type="button" value="Upload"><br>
    <input type="submit" value="Generate PDF"   name="submitAction">
    <input type="submit" value="Generate Excel" name="submitAction">
</form>

的Servlet
NB!请注意@MultipartConfig注释(自 Servlet 3.0 以来可用)。这样您就可以正确处理 multipart / form-data 请求。

TestServlet.java

package com.example;

import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.io.IOException;

@WebServlet(urlPatterns = {"/TestSubmit.do"})
@MultipartConfig
public class TestServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {

        String submitAction= request.getParameter("submitAction");
        if (submitAction != null) {
            if (submitAction.equals("Generate PDF")) {
                System.out.println("Generate PDF button pressed");
            } else if (submitAction.equals("Generate Excel")) {
                System.out.println("Generate Excel button pressed");
            }
        } else {
            // do something about it
        }
    }
}


注:
当然,您可以在 web.xml 中创建servlet配置,而不是@WebServlet(再次来自Servlet 3.0)。与@MultipartConfig相同:您可以将<multipart-config>添加为 web.xml 文件中servlet配置元素的子元素,而不是此注释。

示例(摘自 web.xml ):

<servlet>
    <servlet-name>Test Servlet</servlet-name>
    <servlet-class>com.example.TestServlet</servlet-class>
    <multipart-config>
        <!-- In this case empty, but can contain additional nested elements -->
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>Test Servlet</servlet-name>
    <url-pattern>/TestSubmit.do</url-pattern>
</servlet-mapping>

更有用的链接:

答案 2 :(得分:0)

您应首先将代码更改为null。这将防止以后出现意外错误。尝试检查提交的请求以查看其中包含的内容。 Firefox有一个名为篡改数据的插件,允许您在发送请求之前捕获和编辑请求。如果你搜索,我相信会有其他人。

这将允许您在发送之前查看数据。请记住,当它到达您的服务器时,它已经过了几个步骤,所以尽早看到它有帮助。还要考虑使用过滤器来记录请求状态,参数名称等。它可以在首次开发时提供帮助,并且可以在以后轻松删除而不会干扰您的业务代码。

答案 3 :(得分:0)

如果您的表单的MIME类型为 multipart / formdata ,则应在Servlet或 web.xml as described here中配置@MultipartConfig注释

答案 4 :(得分:0)

更改servlet代码

String generatePDF= request.getParameter("pdf");

String generatePDF= request.getParameter("filename");

因为:输入类型的属性名称将是getParameter值

`String generatePDF= request.getParameter("filename");
if(generatePDF.equals("Generate PDF")
{
 System.out.println("generatePDF button pressed");
}`