单击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");
}
答案 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");
}`