Как отобразить PDF файл на странице JSF?

160
22 марта 2019, 20:00

Имеется БД, в которой лежат книги. Контент книги в базе записан в типе blob. Как можно отобразить контент средствами браузера? Перед тем как написать сюда гуглил, но в основном запросы не соответствуют моим требованиям (или плохо смотрел). Спасибо. n/ UPD. Как советуют @Roman C и @Sckoriy написал простенький сервлет:

protected void processRequest(HttpServletRequest request, 
HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/pdf");
    OutputStream out = response.getOutputStream();
    try {
        int id = Integer.valueOf(request.getParameter("id"));
        SearchController sc = (SearchController) request.getSession(false).getAttribute("searchController");
        byte[] pdf = sc.getPdf(id);
        response.setContentLength(pdf.length);
        out.write(pdf);
    } catch(Exception ex) {
        ex.printStackTrace();
    } finally {
        out.close();
    }
}

Объект searchController хранит в себе текущий список книг — объектов типа book. Метод getPdf возвращает массив байтов нужной книги (id), который я безуспешно пытаюсь отобразить в <iframe src="/Reader?id=1"></iframe> — получаю свой заслуженный 404.

Answer 1

Допустим,что есть бд с такой таблицей :

Как один с вариантов,который позволяет вывести на страницу Blob вот :

1.Создаем html страницу

Куча тегов..//
<iframe src = "http://172.16.108.183:8080/PracticeV0/IFrame?id=4" 
height = "500" weight = "500"></iframe>

Тег iframe создает плавающий фрейм - то,что вам надо.Он будет делать запрос на сервлет,который будет записывать в исходящий поток файлы.(Но,об этом чуть позже)

2.Для того,чтобы убрать по максиму бизнес-логику от сервлета нужно создать класс Модель, в которой будут производится "вычисления".(Шаблон MVC)

public class ModelFiles {
private Connection connect;
private PreparedStatement prepare;
private Statement stat;
private ResultSet result;
private Blob blob;
public ModelFiles(Connection connect){
  this.connect = connect;
}
public Blob readPDF(int id) {
        try {
            stat = connect.createStatement();
            result = stat.executeQuery("Select PDF from files where id = " + id + ";");
            result.next();
            blob = result.getBlob("PDF");
            result.close();
        }catch(SQLException ex) {
            ex.printStackTrace();
    }
        return blob;
}

Теперь перейдем к контроллеру - сервлету . package Controllers;

public class toIfraime extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
//Создаем модель и передаем ей подключение(У меня подключение
//хранится в атрибутах контекста приложения)Добавляю я его туда при запуске
//приложения - Слушателям сервлетов , привет!
ModelFiles model = new 
ModelFiles((Connection)getServletContext().getAttribute("Connection");
//Дальше,получаем Blob от модели
//В параметр передаем id файла
Blob blob = model.readPDF(3);
//Теперь можно и заголовки подготовить
response.setContentLength(blot.getSize());//эту строчку нужно поместить в try catch ибо метод getSize может выбросить исключение SQLException
response.setContentType("application/pdf");
//Теперь начинаем само чтение и записывание Blob
InputStream is = null;
BufferedInputStream buff = null;
OutputStream out = null;
BufferedOutputStream buffOut = null;
   try{
      is = blob.getBinaryStream();//Создаем простой входящий поток байтов.
      buff = new BufferedInputStream(is);//Создаeм буфферизированный входящий поток 
      //байтов
      out = response.getOutputStream();//Создаем просто исходящий поток байтов
      buffOut = new BufferedOutputStream(out);//Буфферизируем исходящий поток
      int bit = 0 ; //будем читать байтами
          while((bit = buff.read()) != -1){//Пока не закончиться входящий 
          //поток,записывай байт в исходящий
            buffOut.write(bit);//В response записываем байт   
          }
   catch(SQLException ex){
    ex.printStackTrace();
   }finally{
      if(buff != null){
          buff.close();
       }
      if(buffOut != null){
          buffOut.close();
   }

Вот web.xml

<servlet>
<servlet-name>FrameFile</servlet-name>
<servlet-class>Controllers.toIfraime</servlet-class>
 </servlet>
 <servlet-mapping>
<servlet-name>FrameFile</servlet-name>
<url-pattern>/LoadPDF</url-pattern>
<servlet-mapping>

Вот результат :

READ ALSO
Многопоточность на android

Многопоточность на android

Я разрабатываю приложение под android, и уже в течении долгого времени не могу решить одну проблему, а именно:

192
как получить все магазины из google maps?

как получить все магазины из google maps?

Вот если зайти на саму карту гугл и ввести в поиск магазины, то будет примерно такой результат

164