2017-04-18 7 views
1

私はjspに少し戸惑っていて、NetBeansIDE 8.0のプロジェクトで作業していました。そこではmysql workbenchからデータを取得し、そのデータをDドライブの "HelloWorld.pdf"というpdfファイルに出力する必要があります。 itext7-7.0.2とitextpdf-5.3.5.jar it.Iがthis.Hereを行うためのjspを使用していたために私のコードです:jspを使用してpdfファイルのデータベースからデータを印刷する方法は?

<%@ 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アプリケーションサーバーで実行中に4.0私は取得していますエラー:java.lang.IllegalStateException: getOutputStream() has already been called for this response

+0

catchブロック使用e.printStackTrace(); out.println(e)の代わりに。 –

+0

完了。しかし、診断された例外の変更はまだありません – Invoker

答えて

1

レスポンスの出力ストリームを使用したり、out.println(e)を呼び出すことはできません。取得している例外は、サーブレットの動作にリンクしています。応答が(サーブレットフレームワークによって)生成されたら、出力ストリームを再度使用することはできません。

これは、おそらくコードをJSPではなくJavaクラスの中に記述するべきだと言いました。後者は、通常HTMLページのみを生成するためのもので、PDF生成のような重いロジックを呼び出すためのものではありません。

関連する問題