В разделе 2 мы представили, как создается проект с использованием UReport2. После запуска проекта автоматически генерируется директория с названием «ureportfiles» в директории WEB-INF проекта. Это является стандартной директорией хранения отчетов, предоставляемой UReport2. Другими словами, отчетные файлы будут сохраняться в директории WEB-INF/ureportfiles проекта по умолчанию.
Если проект выполняется в среде разработки Eclipse, используется jetty (например, плагин run-jetty-run для Eclipse). В этом случае вы увидите директорию с названием «ureportfiles» в директории WEB-INF проекта.
Если проект работает на основе Tomcat, нет директории «ureportfiles» в директории WEB-INF, так как Tomcat создаёт временную рабочую директорию при работе в Eclipse (обычно она находится в директории workspace.metadata.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapp). Поэтому, если проект работает на основе Tomcat, вам потребуется найти соответствующий временный рабочий каталог и затем найти соответствующую директорию «ureportfiles» в директории WEB-INF проекта.
Запустив созданный проект, откройте конструктор отчетов, щелкните кнопку Сохранить на панели инструментов и выберите «сохранить». Затем вы увидите окно, показанное ниже:
В этом окне вам нужно ввести имя отчета и выбрать директорию хранения отчета, чтобы сохранить текущий файл отчета. Вы можете видеть, что стандартное место хранения UReport2 — это «серверная файловая система», то есть директория «ureportfiles» в директории WEB-INF вашего проекта.
Эта директория автоматически создается системой по умолчанию. Вы можете изменить местоположение этой директории, добавив атрибут, если это необходимо.
Создайте файл config.properties в директории WEB-INF проекта, откройте конфигурационный файл Spring с именем context.xml в директории WEB-INF и добавьте следующий Bean для загрузки файла config.properties.
<bean id="propertyConfigurer" parent="ureport.props">
<property name="location">
<value>/WEB-INF/config.properties</value>
</property>
</bean>
Примечание: вышеуказанный конфигурационный Bean фактически представляет собой стандартную конфигурацию класса org.springframework.beans.factory.config.PropertyPlaceholderConfigurer. Мы знаем, что можно загружать внешние свойства Spring, используя конфигурацию PropertyPlaceholderConfigurer. Если проект уже настроен с помощью класса PropertyPlaceholderConfigurer, соответствующие свойства UReport2 могут быть добавлены непосредственно в файл свойств, соответствующий этому классу конфигурации, и нет необходимости настраивать файл config.properties.
Откройте файл config.properties и добавьте атрибут с именем «ureport.fileStoreDir», где значение этого атрибута используется для определения стандартной директории хранения отчетов, предоставляемой UReport2. Например, атрибут может быть определён следующим образом:
ureport.fileStoreDir=D:/ureportfiles
Это указывает на сохранение файлов отчетов в директории ureportfiles на диске D. При назначении конкретной директории важно сохранить её существование, иначе она не будет использоваться. Например, директория ureportfiles на диске D должна существовать заранее.
Механизм хранения отчетов, известный как «серверная файловая система», предоставленный UReport2 по умолчанию, действительно реализует интерфейс com.bstek.ureport.provider.report.ReportProvider, предоставленный UReport2. Исходный код интерфейса представлен ниже:
package com.bstek.ureport.provider.report; import java.io.InputStream;
import java.util.List;
/**
* @author Jacky.gao
* @since 2016 года 12 месяца 4 число
* @since 4 декабря 2016 года
*/
public interface ReportProvider {
/**
* Загрузить файл отчета по имени отчета
* Load the report file according to the report name
*@param file имя отчета
* @param file report name
*@return вернуть InputStream
* @return returned InputStream
*/
InputStream loadReport(String file);
/**
* Удалить определённый файл отчета по имени отчета
* Delete the specific report file according to the report name
* @param file имя отчета
* @param file report name
*/
void deleteReport(String file);
/**
* Получить все файлы отчетов
* Acquire all report files
* @return вернуть список файлов отчетов
* @return return the list of report file
*/
List<ReportFile> getReportFiles();
/**
* Сохранить файлы отчетов
* Save report files
*@param file имя отчета
* @param file report name
*@param content XML содержимое отчета
* @param content XML content of report
*/
void saveReport(String file,String content);
/**
* @return вернуть название хранилища
* @return return storage name
*/
String getName();
/**
* @return вернуть, отключено ли
* @return return if deactivation
*/
boolean disabled();
/**
* @return вернуть префикс имени отчета
* @return return prefix of report name
*/
String getPrefix();
}
После реализации интерфейса ReportProvider настройте реализующий класс в Spring и сделайте его стандартным Bean Spring. Затем UReport2 обнаружит, найдёт и загрузит его. Исходный код механизма хранения отчетов, известного как «серверная файловая система», предоставленный UReport2 по умолчанию, приведён ниже:
package com.bstek.ureport.provider.report.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import com.bstek.ureport.exception.ReportException;
import com.bstek.ureport.provider.report.ReportFile;
import com.bstek.урепорт.provider.report.ReportProvider;
/**
* @author Jacky.gao
* @since 2017 года 2 месяца 11 число
*/
public class FileReportProvider implements ReportProvider, ApplicationContextAware {
private String prefix = "file:";
private String fileStoreDir;
private boolean disabled;
@Override
public InputStream loadReport(String file) {
if (file.startsWith(prefix)) {
file = file.substring(prefix.length(), file.length());
}
String fullPath = fileStoreDir + "/" + file;
try {
return new FileInputStream(fullPath);
} catch (FileNotFoundException e) {
throw new ReportException(e);
}
}
@Override
public void deleteReport(String file) {
if (file.startsWith(prefix)) {
file = file.substring(prefix.length(), file.length());
}
String fullPath = fileStoreDir + "/" + file;
File f = new File(fullPath);
if (f.exists()) {
f.delete();
}
}
@Override
public List<ReportFile> getReportFiles() {
File file = new File(fileStoreDir);
List<ReportFile> list = new ArrayList<>();
for (File f : file.listFiles()) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(f.lastModified());
list.add(new ReportFile(f.getName(), calendar.getTime()));
}
Collections.sort(list, new Comparator<ReportFile>() {
@Override
public int compare(ReportFile f1, ReportFile f2) {
return f2.getUpdateDate().compareTo(f1.getUpdateDate());
}
});
return list;
}
@Override
public String getName() {
return "Серверная файловая система";
}
@Override
public void saveReport(String file, String content) {
if (file.startsWith(prefix)) {
file = file.substring(prefix.length(), file.length());
}
String fullPath = fileStoreDir + "/" + file;
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream(new File(fullPath));
IOUtils.write(content, outStream, "utf-8");
} catch (Exception ex) {
throw new ReportException(ex);
} finally {
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public boolean disabled() {
return disabled;
}
public void setDisabled(boolean disabled) {
this.disabled = disabled;
}
public void setFileStoreDir(String fileStoreDir) {
this.fileStoreDir = fileStoreDir;
}
} @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
File file = new File(fileStoreDir);
if (file.exists()) {
return;
}
if (applicationContext instanceof WebApplicationContext) {
WebApplicationContext context = (WebApplicationContext) applicationContext;
ServletContext servletContext = context.getServletContext();
String basePath = servletContext.getRealPath("/");
fileStoreDir = basePath + fileStoreDir;
file = new File(fileStoreDir);
if (!file.exists()) {
file.mkdirs();
}
}
}
@Override
public String getPrefix() {
return prefix;
}
}
Отключите стандартное хранение отчетов системы. Если вы хотите настроить свое хранение отчетов и не использовать стандартное хранение отчетов "серверной файловой системы", предоставленное системой, достаточно добавить атрибут ureport.disableFileProvider
в файл config.properties
и установить его значение как true
.
Учитывая вышеуказанное описание, легко разрабатывать другие типы хранения отчетов путем реализации интерфейса ReportProvider
, например, разработка нового хранения отчетов для сохранения отчетов в базе данных и FTP.
Откройте конструктор отчетов в UReport2. Вы можете увидеть три типа источников данных отчетов, предоставляемых UReport2, как показано на рисунке ниже:
Три типа источников данных связаны соответственно с базой данных напрямую, Spring Bean и встроенным источником данных через интерфейс com.bstek.ureport.definition.datasource.BuildinDatasource
.
Подключение к базе данных очень простое. Добавьте JAR-пакет, управляемый соответствующей базой данных, в classpath проекта и настройте информацию о соединении с источником данных в появившемся окне, как показано на рисунке ниже:
Источник данных типа Spring Bean может выбрать Bean, определённый в контексте Spring, щелкнув значок и введя имя источника данных и ID Bean для использования в появившемся окне, как показано на рисунке ниже:
После сохранения вы можете добавить конкретный набор данных под источником данных. Щелкните правой кнопкой мыши под источником данных, выберите «добавить набор данных» в появившемся меню и определите имя набора данных, соответствующее имя метода и тип объекта возврата, как показано на рисунке ниже:
В конфигурации набора данных Spring-бин мы можем щелкнуть по «выбор метода» справа, чтобы выбрать метод для типа, соответствующего текущему бину. Требования к методу следующие: метод должен состоять из трех параметров, включая соответственно String, String, Map. Например, тестовый бин, определенный выше, состоит из двух легальных методов, как показано ниже:
package com.ureport.test;
import java.util.List;
import java.util.Map;
public class TestBean {
public List<Map<String, Object>> loadReportData(String dsName, String datasetName, Map<String, Object> parameters) {
return null;
}
public List<User> buildReport(String dsName, String datasetName, Map<String, Object> parameters) {
return null;
}
}
Метод легального набора данных бина должен состоять из трех параметров, включая String, String, Map, соответственно соответствующих имени источника данных, имени источника данных и внешнему параметру Map. Метод бина может быть выбран только при такой структуре. В настоящее время здесь поддерживаются два типа значений возврата метода набора данных: список типов Map<String, Object>
, как в TestBean
, и список типов POJO, как в методе ниже:
public List<User> loadData(String dsName, String datasetName, Map<String, Object> parameters) {
return null;
}
В приведенном выше примере возвращается множество объектов User. Объект User здесь является обычным объектом POJO.
Этот тип источников данных требует реализации интерфейса BuildinDatasource
и конфигурирования реализованного класса интерфейса BuildinDatasource
в Spring. Исходный код интерфейса BuildinDatasource
представлен ниже:
package com.bstek.ureport.definition.datasource;
import java.sql.Connection;
/**
* @author Jacky.gao
* @since OnClickListener 2017-02-09
*/
public interface BuildinDatasource {
/**
* @return Возвращает имя источника данных
*/
String name();
/**
* @return Возвращает соединение с текущим источником данных
*/
Connection getConnection();
}
После конфигурирования реализованного класса интерфейса BuildinDatasource
в Spring он автоматически распознается UReport2. Затем в дизайнер отчетов нажмите кнопку "Добавить встроенное соединение" в вкладке источника данных и выберите определенный встроенный источник данных в открывшемся окне, как показано на рисунке ниже:
Три типа источников данных, предоставляемых UReport2, имеют различные характеристики и области применения. Пользователи должны гибко выбирать между ними, основываясь на их характеристиках.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )