我对jsp有点新,并且正在研究NetBeansIDE 8.0中的一个项目,我需要从mysql工作台检索数据并将该数据打印到pdf文件中说" HelloWorld.pdf"在D盘中。我正在使用itext7-7.0.2和itextpdf-5.3.5.jar。我正在使用jsp来执行此操作。这是我的代码:
<%@ page trimDirectiveWhitespaces="true" %>
<%@page import="com.itextpdf.text.Element"%>
<%@page import="com.itextpdf.text.Document"%>
<%@page import="com.itextpdf.text.Chunk"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="com.itextpdf.text.Font"%>
<%@page import="java.io.File"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.OutputStream"%>
<%@page import="com.itextpdf.text.Anchor"%>
<%@page import="com.itextpdf.text.Font.FontFamily"%>
<%@page import="com.itextpdf.text.BaseColor"%>
<%@page import="com.itextpdf.text.Paragraph"%>
<%@page import="com.itextpdf.text.pdf.PdfWriter"%>
<%@page import="com.itextpdf.text.PageSize" %>
<%@page import="java.io.IOException" %>
<%@page import="java.sql.Connection" %>
<%@page import="java.sql.PreparedStatement" %>
<%@page import="java.sql.ResultSet" %>
<%@page import="javax.naming.Context" %>
<%@page import="javax.naming.InitialContext" %>
<%@page import="javax.servlet.ServletException" %>
<%@page import="javax.servlet.ServletOutputStream" %>
<%@page import="javax.servlet.http.HttpServlet" %>
<%@page import="javax.servlet.http.HttpServletRequest" %>
<%@page import="javax.servlet.http.HttpServletResponse" %>
<%@page import="javax.sql.DataSource" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
Document doc = new Document();
OutputStream os = response.getOutputStream();
PdfWriter.getInstance(doc,new FileOutputStream(new File("D:/HelloWorld.pdf")));
doc.open();
String branch1 =request.getParameter("branch");
String sem1 =request.getParameter("semester");
String sub =request.getParameter("subject");
Font bfBold18 = new Font(FontFamily.TIMES_ROMAN, 18, Font.BOLD, new BaseColor(0, 0, 0));
Font bfBold12 = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLDITALIC, new BaseColor(0, 0, 0));
Font bf12 = new Font(FontFamily.TIMES_ROMAN, 12);
try
{
String t=null;
PdfWriter.getInstance(doc, os);
doc.open();
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/projectdb","root","root");
Statement st=con.createStatement();
ResultSet rs= st.executeQuery("select qid,question from questiondb where branch='"+branch1+"' and semester='"+sem1+"' and subject='"+sub+"'");
while(rs.next())
{
t=rs.getString(2);
Paragraph paragraph = new Paragraph(t, bfBold18);
paragraph.setAlignment(Element.ALIGN_JUSTIFIED);
paragraph.setFont(new Font(Font.FontFamily.HELVETICA, 10, Font.NORMAL));
doc.add(paragraph);
doc.add( Chunk.NEWLINE );
}
rs.first();
doc.close();
con.close();
os.flush();
os.close();
}
catch(Exception e)
{
out.println(e);
}
%>
</body>
</html>
但是在GlassFish Server开源版4.0中运行时出现错误:java.lang.IllegalStateException: getOutputStream() has already been called for this response
答案 0 :(得分:1)
您无法使用响应的输出流或调出out.println(e)。您获得的异常与servlet的工作方式有关。一旦生成了响应(通过servlet框架),就无法再次使用它们的输出流
那就是说你应该把你的代码编写在Java类而不是JSP中。后者通常只用于生成HTML页面,而不是用于调用像pdf生成这样重的逻辑