本教程介绍了在Java报表工具中使用JavaServer Faces(JSF)运行Web设计器和Web查看器的基础知识。例如,打开Master-Detail报表模板以进行编辑。
首先,我们需要创建动态Web项目。
接下来将Stimulsoft Java Libs添加到项目中。
您还可以转换为Maven项目并配置pom.xml文件以使用Maven中的库。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jsfstimulsoft</groupId>
<artifactId>jsfstimulsoft</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.stimulsoft</groupId>
<artifactId>stimulsoft-reports-libs</artifactId>
<version>2017.1.1</version>
</dependency>
</dependencies>
</project>
然后,我们需要创建web.xml文件。在这里,我们配置StimulsoftResource的servlet,检索内容,如* .js文件和图像文件,该StiWebDesignerActionServlet符合Java web designer,在操作StiWebViewerActionServlet符合Java的Web浏览器操作,并且还配置了JavaServer Faces的。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>stimulsoft</display-name>
<welcome-file-list>
<welcome-file>faces/designer.xhtml</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<servlet>
<servlet-name>StimulsoftResource</servlet-name>
<servlet-class>com.stimulsoft.web.servlet.StiWebResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StimulsoftResource</servlet-name>
<url-pattern>/stimulsoft_web_resource/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>StimulsoftDesignerAction</servlet-name>
<servlet-class>com.stimulsoft.webdesigner.servlet.StiWebDesignerActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StimulsoftDesignerAction</servlet-name>
<url-pattern>/stimulsoft_webdesigner_action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>StimulsoftAction</servlet-name>
<servlet-class>com.stimulsoft.webviewer.servlet.StiWebViewerActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StimulsoftAction</servlet-name>
<url-pattern>/stimulsoft_webviewer_action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
</web-app>
在下一步中,我们需要实现StiWebDesignerBean来填充报表数据并保存/加载报表模板。
public class StiWebDesignerBean {
StiWebDesignerOptions options;
String designerID = "StimulsoftWebDesigner";
/**
* @return the handler
*/
public StiWebDesigerHandler getHandler() {
StiWebDesigerHandler handler = new StiWebDesigerHandler() {
public StiReport getEditedReport(HttpServletRequest request) {
try {
String reportPath = request.getSession().getServletContext().getRealPath("/reports/Master-Detail.mrt");
String xmlPath = request.getSession().getServletContext().getRealPath("/data/Demo.xml");
String xsdPath = request.getSession().getServletContext().getRealPath("/data/Demo.xsd");
StiReport report = StiSerializeManager.deserializeReport(new File(reportPath));
report.getDictionary().getDatabases().add(new StiXmlDatabase("Demo", xsdPath, xmlPath));
report.getCustomFunctions().add(new StiCustomFunction() {
public Object invoke(List<Object> args) {
return ((String) args.get(0)).substring(
((Long) args.get(1)).intValue(), ((Long) args.get(2)).intValue());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Class> getParametersList() {
return new ArrayList<Class>(Arrays.asList(String.class, Long.class, Long.class));
}
public String getFunctionName() {
return "subStr";
}
});
return report;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void onOpenReportTemplate(StiReport report, HttpServletRequest request) {
String xmlPath = request.getSession().getServletContext().getRealPath("/data/Demo.xml");
String xsdPath = request.getSession().getServletContext().getRealPath("/data/Demo.xsd");
report.getDictionary().getDatabases().add(new StiXmlDatabase("Demo", xsdPath, xmlPath));
}
public void onNewReportTemplate(StiReport report, HttpServletRequest request) {
String xmlPath = request.getSession().getServletContext().getRealPath("/data/Demo.xml");
String xsdPath = request.getSession().getServletContext().getRealPath("/data/Demo.xsd");
report.getDictionary().getDatabases().add(new StiXmlDatabase("Demo", xsdPath, xmlPath));
try {
StiXmlTableFildsRequest tables = StiDataColumnsUtil.parceXSDSchema(new FileInputStream(xsdPath));
for (StiXmlTable table : tables.getTables()) {
StiDataTableSource tableSource = new StiDataTableSource(
"Demo." + table.getName(), table.getName(), table.getName());
tableSource.setColumns(new StiDataColumnsCollection());
for (StiSqlField field : table.getColumns()) {
StiDataColumn column = new StiDataColumn(
field.getName(), field.getName(), field.getSystemType());
tableSource.getColumns().add(column);
}
tableSource.setDictionary(report.getDictionary());
report.getDictionary().getDataSources().add(tableSource);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void onSaveReportTemplate(StiReport report, String reportName, HttpServletRequest request) {
try {
String savePath = request.getSession().getServletContext().getRealPath("/save/");
FileOutputStream fos = new FileOutputStream(savePath + reportName);
StiSerializeManager.serializeReport(report, fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
};
return handler;
}
/**
* @return the options
*/
public StiWebDesignerOptions getOptions() {
options = new StiWebDesignerOptions();
return options;
}
/**
* @return the designerID
*/
public String getDesignerID() {
return designerID;
}
}
接下来,我们需要实现StiWebViewerBean。在这里,我们加载Master-Detail.mrt报告模板文件并呈现报表。我们还可以配置Web查看器,例如将背景颜色设置为灰色。
public class StiWebViewerBean {
StiReport report;
StiWebViewerOptions options;
String viewerID = "StimulsoftWebViewer";
StiMailProperties mailProperties;
/**
* @return the report
* @throws StiDeserializationException
* @throws SAXException
* @throws IOException
*/
public StiReport getReport() throws IOException, SAXException, StiDeserializationException {
if (report == null) {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
String reportPath = session.getServletContext().getRealPath("/reports/Master-Detail.mrt");
report = StiSerializeManager.deserializeReport(new File(reportPath));
String xmlPath = session.getServletContext().getRealPath("/data/Demo.xml");
String xsdPath = session.getServletContext().getRealPath("/data/Demo.xsd");
report.getDictionary().getDatabases().add(new StiXmlDatabase("Demo", xsdPath, xmlPath));
report.render();
}
return report;
}
/**
* @param report
* the report to set
*/
public void setReport(StiReport report) {
this.report = report;
}
/**
* @return the options
*/
public StiWebViewerOptions getOptions() {
options = new StiWebViewerOptions();
options.getAppearance().setBackgroundColor(StiColorEnum.Gray.color());
// options.getToolbar().setVisible(false);
return options;
}
/**
* @param options
* the options to set
*/
public void setOptions(StiWebViewerOptions options) {
this.options = options;
}
/**
* @return the viewerID
*/
public String getViewerID() {
return viewerID;
}
/**
* @param viewerID
* the viewerID to set
*/
public void setViewerID(String viewerID) {
this.viewerID = viewerID;
}
/**
* @return the mailProperties
*/
public StiMailProperties getMailProperties() {
mailProperties = new StiMailProperties();
return mailProperties;
}
/**
* @param mailProperties
* the mailProperties to set
*/
public void setMailProperties(StiMailProperties mailProperties) {
this.mailProperties = mailProperties;
}
}
然后,配置faces-config.xml文件并添加必要的bean。
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<managed-bean>
<managed-bean-name>webdesignerBean</managed-bean-name>
<managed-bean-class>com.stimulsoft.StiWebDesignerBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>webviewerBean</managed-bean-name>
<managed-bean-class>com.stimulsoft.StiWebViewerBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
在下一步中,我们需要在WebContent文件夹中创建designer.xhtml页面。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:stiwebdesigner="http://stimulsoft.com/webdesigner">
<head>
</head>
<stiwebdesigner:webdesigner options="#{webdesignerBean.options}"
handler="#{webdesignerBean.handler}" designerID="#{webdesignerBean.designerID}"/>
</html>
我们还需要在WebContent文件夹中创建viewer.xhtml页面。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:stiwebviewer="http://stimulsoft.com/webviewer">
<head>
</head>
<stiwebviewer:webviewer report="#{webviewerBean.report}" options="#{webviewerBean.options}"
mailProperties="#{webviewerBean.mailProperties}" viewerID="#{webviewerBean.viewerID}"/>
</html>
现在,您可以将项目部署到Tomcat并运行它。
在下面的屏幕截图中,您可以看到示例代码的结果。