3

单击生成 PDF/生成 Excel 提交按钮时,它请求 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");
}
4

5 回答 5

8

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

于 2013-04-13T22:08:57.700 回答
3

更新

对不起,我最初错过了这个enctype="multipart/form-data"部分。因此,正如用户@tomor 正确指出的那样,问题背后的原因是您使用enctype="multipart/form-data". 阅读他的回答

有关您的问题的更详细解释,请阅读 BalusC 的以下答案:如何使用 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起可用)。这样您就可以正确处理多部分/表单数据请求。

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 配置, 而不是(同样从 Servlet 3.0 开始) 。对于 : 也一样,您可以在web.xml文件中添加servlet 配置元素的子元素,而不是这个注解。@WebServlet@MultipartConfig<multipart-config>

示例(摘自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>

更多有用的链接:

于 2013-04-13T22:10:35.060 回答
0

如果您的表单具有multipart/formdata的 MIME 类型,则应按照此处所述在 Servlet 或web.xml中配置 @MultipartConfig 注释

于 2013-04-14T00:53:13.593 回答
0

您应该首先更改代码以测试 null。这将防止以后出现不必要的错误。尝试检查提交的请求以查看其中包含的内容。Firefox 有一个名为 tamper data 的插件,可让您在请求发送之前捕获和编辑请求。如果您搜索,我相信会有其他人。

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

于 2013-04-13T22:00:46.190 回答
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");
}`
于 2013-04-14T17:01:04.137 回答