门户项目中准备用web service获取现有的制作好的报表进行展示。遂去研究了下,研究的过程也是满纠结的,总算根据多方资料,将demo跑通了。
本文参考了网上的一些资料,做一下总结而已。讲解下如何配置,成功的获取到相关报表。
biee的web service的介绍我就不说了了,官方文档如下:
http://download.oracle.com/docs/cd/E21764_01/bi.1111/e16364/soa_overview.htm
提供的服务如下:
http://download.oracle.com/docs/cd/E12096_01/books/AnyWebServ/AnyWebServTOC.html
使用axis生成WEB service的客户端代码:
步骤参考:
http://gerardnico.com/wiki/ide/eclipse/eclipse_how_to_consume_a_webservice_with_wtp
需要指定包名为:com.siebel.analytics.web.soap.v5
客户端代码生成后,在eclipse下由于下载了插件依赖包都是有的,所以可以直接写一个java程序去测试下是否调用web service成功。
如果用maven生成工程,或者最终发布的话,需要在pom。xml中增加如下的依赖配置:
<dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.1-beta1</version> </dependency>
测试代码如下:
public class TestReadCatalog { public static void main(String[] args) { String sessionID = ""; SAWSessionServiceSoapProxy myPort = new SAWSessionServiceSoapProxy(); try { sessionID = myPort.logon("jianchen", "jianchen"); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } //测试获取目录结构 WebCatalogServiceSoapProxy catalogService = new WebCatalogServiceSoapProxy(); try { CatalogObject catalogItems = catalogService.readObject("/shared", false, sessionID); System.out.println(catalogItems.getItemInfo().getPath()); ItemInfo[] items = catalogService.getSubItems("/shared", "*", false, null, sessionID); for (ItemInfo item : items) { System.out.println(item.getCaption()); } } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这里我用的登录账号是:rpd的账号。登录成功后会返回一个sessionID。跟服务器的交互必须要有sessionID作为参数。
执行后,的确能够获取到返回的catalog目录,输出目录名称。
最关键的来了,就是如何把biee中做好的报表展示到web页面上呢。biee提供了HtmlViewService,支持对biee report进行访问。
测试代码如下:
public class TestReadReport { /** * @param args */ public static void main(String[] args) { String sessionID = ""; SAWSessionParameters sessionparams = new SAWSessionParameters(); SAWSessionServiceSoapProxy myPort = new SAWSessionServiceSoapProxy(); try { sessionID = myPort.logon("jianchen", "jianchen"); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } HtmlViewServiceSoapProxy viewService = new HtmlViewServiceSoapProxy(); ReportRef reportRef = new ReportRef(); reportRef.setReportPath("/shared/"); StartPageParams startPageParams = new StartPageParams(); startPageParams.setIdsPrefix("beijixing"+Math.round(Math.random()*1000000)); startPageParams.setDontUseHttpCookies(false); try { String pageID = viewService.startPage(startPageParams, sessionID); viewService.addReportToPage(pageID, "beijixing", reportRef, null, null, null, sessionID); StringBuffer reportHTML = new StringBuffer(); /* reportHTML.append(viewService.getHeadersHtml(pageID, sessionID)); reportHTML.append(viewService.getHtmlForReport(pageID, "beijixing", sessionID));*/ reportHTML.append(viewService.getHtmlForPageWithOneReport("beijixing", reportRef, null, null, null, null, sessionID)); System.out.println(reportHTML.toString()); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
测试是能够获取到html代码的。但是在页面上展示这段代码时,只会出现一个“等待”,而没有真正的获取报表内容。
分析页面源代码:发现页面里的js以及css等资源的路径都是:“missing_xxx.css”之类的。说明获取的那些资源没有加载到。
还有一个很关键的点,在某篇老外的博客上提到:
所以在登录服务器前,需要有如下代码段:
SAWLocale sawlocale = new SAWLocale(); sawlocale.setLanguage(request.getLocale().getLanguage()); sawlocale.setCountry(request.getLocale().getCountry()); SAWSessionParameters sessionparams = new SAWSessionParameters(); sessionparams.setUserAgent(request.getHeader("User-Agent")); sessionparams.setLocale(sawlocale); sessionparams.setAsyncLogon(false);
后仔细阅读文档,内容如下:
To avoid these issues, use the setBridge() method to modify callback URLs to point to the third-party Web server. Be aware that a Web component executed by the third-party Web server to re-route requests to Oracle BI Web Services is not provided. This function would need to be fulfilled by the third-party application. For more information about the setBridge() method, read setBridge() Method.
就是说这些静态资源需要用桥接的方式向真正的服务器发起请求,返回给浏览器。
桥接的实现,可以利用servlet,该servlet里要干的事情如下:
Make a URLConnection to the URL and read the content.
Write to the output stream.
当时为了立即看到效果,该bridge的代码我是借用了别人的(代码有点bug,比如连接未关闭,不能复用的bug),等正式开发用的时候可以考虑重新改写下,优化下性能。还是贴出来吧,方便下大众。
public class MyBridge extends HttpServlet { private static final long serialVersionUID = 1L; /** * Default constructor. */ public MyBridge() { // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ @SuppressWarnings("unchecked") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String relatedtUrl = request.getParameter("RedirectURL"); relatedtUrl = relatedtUrl.replaceAll("NoAuthGo", "Go"); StringBuffer url = new StringBuffer("").append(relatedtUrl); System.out.println("relatedtUrl>>>>>*****>>>>>>>>>>" + relatedtUrl); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); Map parameterMap = request.getParameterMap(); for (Iterator iterator = parameterMap.keySet().iterator(); iterator .hasNext();) { String parameterName = (String) iterator.next(); String[] parameterValues = (String[]) parameterMap .get(parameterName); if (parameterValues != null && parameterValues.length > 0) { if (parameterName.equals("RedirectURL")) { continue; } for (int i = 0; i < parameterValues.length; i++) { NameValuePair pair = new BasicNameValuePair(parameterName, parameterValues[i]); nvps.add(pair); } } } HttpClient client = new DefaultHttpClient(); if (!url.toString().endsWith(".js") && !url.toString().endsWith(".css") && !url.toString().endsWith(".png") && !url.toString().endsWith(".gif")) { List<NameValuePair> tmp = new ArrayList<NameValuePair>(); NameValuePair pair = new BasicNameValuePair("NQUser", "jianchen"); NameValuePair pair1 = new BasicNameValuePair("NQPassword", "jianchen"); tmp.add(pair); tmp.add(pair1); HttpPost lpost = new HttpPost(url.toString()); lpost.setEntity(new UrlEncodedFormEntity(tmp, "GBK")); HttpResponse lresp = client.execute(lpost); System.out.println("登陆结果:"+lresp.getStatusLine().getStatusCode()); lpost.abort(); } if(url.toString().indexOf("?Go")<0 || url.toString().indexOf("?DocPart")>0){ HttpPost post = new HttpPost(url.toString()); post.setEntity(new UrlEncodedFormEntity(nvps,"GBK")); post.addHeader("Content-Type", "binary/data"); post.addHeader("User-Agent", request.getHeader("USER-AGENT")); HttpResponse resp = client.execute(post); HttpEntity entity = resp.getEntity(); InputStream in = entity.getContent(); if(url.toString().indexOf("?DocPart")>0){ FileOutputStream fout=new FileOutputStream("e:\\aaa.jpg"); byte buffer1[] = new byte[1024 * 128]; int k = 0; while ((k = in.read(buffer1)) != -1) { fout.write(buffer1, 0, k); } fout.flush(); fout.close(); } ServletOutputStream out = response.getOutputStream(); byte buffer1[] = new byte[1024 * 128]; int k = 0; while ((k = in.read(buffer1)) != -1) { out.write(buffer1, 0, k); } in.close(); out.close(); } else { HttpPost post = new HttpPost(url.toString()); post.setEntity(new UrlEncodedFormEntity(nvps,"GBK")); post.addHeader("Content-Type", "binary/data"); post.addHeader("User-Agent", request.getHeader("USER-AGENT")); HttpResponse resp = client.execute(post); HttpEntity entity = resp.getEntity(); InputStream in = entity.getContent(); InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); StringBuffer sb = new StringBuffer(); String r = br.readLine(); sb.append(r); while (r != null) { r = br.readLine(); sb.append(r); } String html = sb.toString();//TODO 本地 InputStream sin = new ByteArrayInputStream(html.getBytes()); ServletOutputStream out = response.getOutputStream(); byte buffer1[] = new byte[1024 * 128]; int k = 0; while ((k = sin.read(buffer1)) != -1) { out.write(buffer1, 0, k); } sin.close(); out.close(); post.abort(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
web.xml中配置servlet如下:
<servlet> <description> </description> <display-name>MyBridge</display-name> <servlet-name>MyBridge</servlet-name> <servlet-class>com.taobao.service.kunshuo.webservice.MyBridge</servlet-class> </servlet> <servlet> <display-name>Apache-Axis Servlet</display-name> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet> <display-name>Axis Admin Servlet</display-name> <servlet-name>AdminServlet</servlet-name> <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyBridge</servlet-name> <url-pattern>/MyBridge</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/servlet/AdminServlet</url-pattern> </servlet-mapping>
至此,将获取到的报表html增加到要展示的页面里,比如jsp,就可以直接展示报表了。
后面的获取xml结果,自己可以进行处理展示结果。还有待后续研究。
有几个开发同学跟我要源代码,都是通过邮箱发送的,这里我把我当时的demo发上来作为附件吧。
可以在附件中进行下载
相关推荐
然而,有时我们需要将BIEE的报表集成到其他Web应用程序中,以便在一个统一的工作流中提供分析结果。以下是如何实现这一目标的详细说明。 首先,我们关注“报表链接”的调用方式。这种调用方法适用于那些不需要参数...
通过java调用oracle的biee接口webservice,主要实现三种方式: 1.通过路径获取图片和表格数据xml。 2.通过biee的逻辑sql获取图片和表格数据xml。 3.获取biee下的所有路径。 需要jar主要为axis.jar wsdl4j-1.5.1.jar ...
要使用这些服务,开发者需要了解WSDL(Web Service Description Language)文件,它定义了Web服务的接口、消息格式和调用方式。 在Java中,我们可以使用JAX-WS(Java API for XML Web Services)框架来消费这些Web...
- **Basic安装**:Web Server由Oracle Oc4j组件提供支持。 - **Advanced安装**:需要预先安装Oracle Application Server 10g。 - **安装方式**:选择Complete(完整安装),适用于个人研究用途。 - **账户信息**...
Oracle BIEE(Business Intelligence Enterprise Edition)是一款强大的商业智能解决方案,用于数据分析和报表生成。本文主要探讨如何使用BIEE Administration Tool创建和管理BIEE资料库,包括创建物理模型、逻辑...
1. **元数据服务**:BIEE的元数据服务允许开发者通过Web Service API获取和更新业务模型信息。这包括数据源、维度、度量和分析路径等。开发者可以创建新的元数据对象,或者修改现有对象,以适应特定的业务需求。 2....
在本例中,Web接口可能通过JDeveloper中的ADF(Application Development Framework)实现,它提供了丰富的UI组件和数据绑定功能,方便与Oracle BI EE集成。 7. **安全性与权限管理**: 最后,要注意报表的访问权限...
在 Oracle BIEE 架构中,Web 服务器扮演着一个重要的角色,它提供了一个基于 Web 的接口,允许用户通过 Web 浏览器来访问商务智能应用程序。同时,Web 服务器也提供了一个安全的身份验证机制,确保只有授权的用户...
6. **发布与共享**:完成报表后,可将其发布到BIEE的Web仪表板,供团队成员或特定用户群体访问。同时,报表可以设置为定时刷新,确保数据的实时性。 7. **性能优化**:BIEE提供了多种性能优化策略,如缓存、物化...
Oracle BIEE是基于Web的BI平台,提供了一个统一的用户界面,用户可以在此平台上进行数据分析、报表创建和信息发布。BIEE的核心组件包括:数据源连接、数据仓库构建、元数据管理、分析工具和用户接口。 二、数据源与...
在“biee的webservice调用[收集].pdf”文档中,很可能是详细介绍了如何利用这些Web服务来与其他系统进行交互,例如数据集成、报告和分析等。下面是对相关知识点的详细说明: 1. **Web服务基础**:Web服务是一种通过...
Oracle官方网站提供BIEE的下载,包括所有必要的组件,如BI Server、Web Tier、Repository Manager (RMAN) 和 BI Presentation Services等。 1.2.3. 安装 BIEE 安装过程涉及几个步骤,包括接受许可协议、选择安装...
BIEE入门视频,BIEE 资料,轻松学会BIEE,BIEE教程
4. **Web分析**:BIEE的Web界面允许用户通过浏览器访问和交互数据分析。开发人员应了解如何配置和定制这个界面,以提供直观的用户体验。 5. **数据展现**:BIEE支持多种数据展现方式,如表格、图表、时间序列和地图...
4. **Web Catalog定制**:利用BIEE的Web Catalog,你可以通过JavaScript和CSS进行进一步的定制,以改变树状菜单的外观和行为。例如,你可以添加脚本来检查用户的角色,然后根据这些角色动态地展开或隐藏树节点。 5....
在企业级应用环境中,Oracle Business Intelligence Enterprise Edition (BIEE)作为一款强大的商业智能工具,为企业提供了数据分析、报告和仪表板展示等功能。然而,对于用户体验的优化同样重要,其中之一便是定制化...
- **Oracle BI Presentation Server**:用户界面,通过Web方式提供交互式报告和分析。 - **Oracle BI Analytics**:包含分析工具和报表构建器,用于创建和修改分析内容。 - **Oracle BI Publisher**:用于设计和...
BIEE11g是该产品的一个版本,提供了全面的数据洞察力和用户友好的界面。本入门培训将引导初学者逐步了解BIEE的基础知识,包括其历史、数据模型、安装过程、配置以及如何预览和使用Demo效果。 1. **ORACLE BIEE基础*...