This tutorial shows the basics of running the web designer and web viewer with JavaServer Faces (JSF) in the reporting tool for Java. For example, open the Master-Detail report template for editing.

First, we need to create the Dynamic Web Project.

Next add the Stimulsoft Java Libs to the project.

Also you can convert to Maven project and configure the pom.xml file to use libs from 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>
		<dependency>
			<groupId>javax.faces</groupId>
			<artifactId>javax.faces-api</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.9</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.9</version>
		</dependency>
	</dependencies>
</project>

Then, we need to create the 'web.xml' file. Here we configure the StimulsoftResource servlet that retrieves the content such as *.js and images files, the StiWebDesignerActionServlet that operate with the java web designer, the StiWebViewerActionServlet that operate with the java web viewer, and also configure the 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>

In the next step, we need to implement the StiWebDesignerBean for populating the report data and save/load the report template:
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;
	}
}

Next, we need to implement the StiWebViewerBean. Here we load the Master-Detail.mrt report template file and render the report. Also we can configure the web viewer, for example set the background color to Gray:
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;
	}
}

Then, configure the 'faces-config.xml' file and add the necessary beans:
<?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>

In the next step we need to create the 'designer.xhtml' page in the 'WebContent' folder:
<!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>

And also we need to create the 'viewer.xhtml' page in the 'WebContent' folder:
<!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>

Finally you can deploy the project to the Tomcat and run it.
In the screenshot below you can see the result of the sample code:

Running the Designer and Viewer with JavaServer Faces

By using this website, you agree to the use of cookies for analytics and personalized content. Cookies store useful information on your computer to help us improve efficiency and usability. For more information, please read the privacy policy and cookie policy.