<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>marcuscavalcanti.net &#187; JSP</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/tag/jsp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Wed, 21 Jul 2010 03:52:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Oracle BPM com JSP e Ajax</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 18:54:57 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ALBPM]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=750</guid>
		<description><![CDATA[Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de presentations, é muito mais comum eu optar em utilizar páginas JSP como camada de apresentação dos meus processos. Isso se dá pelo fato de que as presentations são bastante limitadas, e quando se faz por necessário [...]]]></description>
			<content:encoded><![CDATA[<p>Nos projetos de BPM que tenho participado utilizando o Oracle BPM como solução BPMS, dificilmente faço o uso de <em>presentations</em>, é muito mais comum eu optar em utilizar páginas <a href="http://pt.wikipedia.org/wiki/JavaServer_Pages" target="_blank" style="text-decoration: underline">JSP</a> como camada de apresentação dos meus processos. Isso se dá pelo fato de que as <em>presentations</em> são bastante limitadas, e quando se faz por necessário ter interfaces mais elaboradas e customizadas, o JSP passa a ser a melhor opção.</p>
<p>Usando JSP, um novo leque de opções passou a existir e uma dessas opções passou a ser a possibilidade de usar Ajax. Ajax, para quem nunca ouviu falar, não é uma linguagem, uma API, tão pouco um framework, Ajax é o acrônimo de <strong><em>Asynchronous Javascript And XML</em></strong> e nada mais é que um conjunto de técnicas usadas para criar aplicações web interativas (<a href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank" style="text-decoration: underline">RIA</a>). Um dos pilares do Ajax é permitir comunicação assíncrona entre cliente e servidor utilizando requisições <a href="http://pt.wikipedia.org/wiki/HTTP" target="_blank" style="text-decoration: underline">HTTP</a>.</p>
<p>O Oracle BPM oferece uma maneira bem interessante de usar Ajax nas páginas JSP, mesmo não sendo nativa e também não tendo nada a respeito dizendo na documentação, é possível fazer a integração da camada de apresentação de um processo BPM com o próprio processo de uma maneira bem tranquila.</p>
<p>Para exemplificar isso melhor, criei um projeto bem simples no Oracle BPM, que na verdade só serve para mostrar como funciona essa integração entre páginas JSP e métodos dentro de um BPM Object através de Ajax.</p>
<h3>Primeiros passos</h3>
<p>Para começar, criei um BPM Object bem simples, que possui 3 atributos: name (String), mail (String), documents (String[]). Os dois primeiros atributos, que representam o nome e o email de alguém, são do tipo String e o terceiro atributo, que no caso representa os documentos de uma pessoa, é do tipo Array de String. Chamei esse objeto de: <strong>BpmObject</strong>.</p>
<p>Nesse mesmo objeto (BpmObject), criei ainda um método, esse método será responsável por retornar os documentos de um usuário. Na verdade esse é o método que irei chamar via requisição Ajax através de uma página JSP. O nome desse método ficou definido como <strong>getDocuments()</strong>.</p>
<p>No futuro precisarei alterar esse objeto, mas eu explico depois.</p>
<h3>Criando a página JSP</h3>
<p>No Oracle BPM, para informar que a apresentação de determinado BPM Object deva se dar por meio de uma página JSP, se faz por necessário a utilização de <em>Screenflows</em>. <em><a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/studio/modules/screenflows/c_What_is_a_Screenflow.html" target="_blank" style="text-decoration: underline">Screenflow</a></em> é um fluxo semelhante ao de um processo normal, mas a principal diferença é que o mesmo é executado por um participante único, ou seja, dentro de um <em>Screenflow</em> não existem <em><a href="http://vishals.blogspot.com/2007/09/lanes-and-pools.html" target="_blank" style="text-decoration: underline">lanes</a></em>.</p>
<p>Após ter criado um processo normal, apenas com uma atividade do tipo <em>Global Creation</em> (para criar uma instância do processo) e também com uma <em>Interactive Activity</em> (para apontar para o <em>Screenflow</em>), parti para criação do <em>Screenflow</em> de fato. O <em>Screenflow</em> em questão, será tão simples quanto o processo no qual ele está associado, no caso contará apenas com uma única atividade do tipo <em>Interactive Component Call</em>, que será a responsável por &#8220;chamar&#8221; uma página JSP associando-a ao BPM Object criado no passo anterior.</p>
<p>Para chamar uma página JSP, se faz por necessária associar um BPM Object a mesma, então nesse caso criei um váriavel de instância do tipo BpmObject (o mesmo criado no primeiro passo) e dei o seu nome de <strong>bpmObject</strong>. Após isso, criei uma página JSP dentro de: <strong>/projetoBPM/webRoot/customJSP/ajaxPage.jsp</strong>.</p>
<p>O nome da página em questão é <strong>ajaxPage.jsp</strong>, e por enquanto ela irá possuir o seguinte código:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #339933;">&lt;%</span>@ page session<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;c&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;f&quot;</span><span style="color: #339933;">%&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;!</span>DOCTYPE html <span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span> <span style="color: #0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span style="color: #339933;">&gt;</span></li><li><span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Teste Ajax<span style="color: #339933;">/</span>title<span style="color: #339933;">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>body leftmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span> topmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Teste Ajax</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Nome<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>c<span style="color: #339933;">:</span>out value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;${bpmObject.nome}&quot;</span> <span style="color: #339933;">/&gt;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">&gt;&lt;/</span>div<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Então, relembrando os passos até aqui:</p>
<p>1) Criação de BPM Object com 3 atributos e um método;<br />
2) Criação de processo com uma atividade do tipo <em>Global Creation</em> e outra do tipo <em>Interactive Activity</em>;<br />
3) Criação de <em>Screenflow</em>;<br />
4) Associação (<em>Implementation Type</em>) da <em>Interactive Activity</em> do processo ao <em>Screenflow</em> criado;<br />
5) Criação de atividade do tipo <em>Interactive Component Call</em> no <em>Screenflow</em>;<br />
6) Criação de váriavel de instância no <em>Screenflow</em> com o tipo sendo o mesmo do BPM Object que foi criado no primeiro passo;<br />
7) Definição do <em>Implementation Type</em> da <em>Interactive Component Call</em> como <em>BPM Object Interactive Call</em>;<br />
8) Associação do BPM Object criado como váriavel de instância da <em>Interactive Component Call</em> do <em>Screenflow</em>;<br />
9) Definição da página ajaxPage.jsp como <em>JSP Presentation</em> da <em>Interactive Component Call</em> do <em>Screenflow</em>.</p>
<p>Feito os passos acima, a estrutura do processo está pronta para criação da página JSP que irá fazer a requisição via Ajax a um método do BPM Object que foi criado no primeiro passo.</p>
<h3>Fazendo a requisição Ajax e explicando alguns components da <em>taglib</em> do Oracle BPM</h3>
<p>Para criação do mecanismo que irá fazer a requisição Ajax, se faz por necessário a utilização da <em>taglib</em> do Oracle BPM, sem ela não seria possível usar Ajax, ou então seria bastante árduo fazer tal integração.</p>
<p>Por exemplo, para incluir a biblioteca <a href="http://www.prototypejs.org/" target="_blank" style="text-decoration: underline">Prototype</a>, que no caso será a responsável por fazer o &#8220;trabalho sujo&#8221; e criar o objeto XMLHttpRequest para fazer a requisição assíncrona, utilizei a <em>tag</em> <strong>f:webResources</strong> (linha 10). Esta <em>tag</em> inclui os <em>resources</em> inclusos no projeto BPM, sem que seja necessário informar explicitamente o <em>context path</em> da aplicação para inclusão de imagens, CSS ou Javascripts.</p>
<p>Outra <em>tag</em> importante é a <strong>f:invokeUrl</strong>, que no caso irá gerar a URL para execução de um método dentro de um BPM Object. Dessa forma, a página JSP precisa ser alterada, pois agora irá contar com uma função Javascript que irá fazer a chamada via Ajax ao método <strong>getDocuments()</strong> do BPM Object criado no primeiro passo, retornando o <em>output</em> do método para div <strong>teste</strong>.</p>
<p>Página JSP alterada:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #339933;">&lt;%</span>@ page session<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://java.sun.com/jstl/core&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;c&quot;</span><span style="color: #339933;">%&gt;</span></li><li><span style="color: #339933;">&lt;%</span>@ taglib uri<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://fuego.com/jsp/ftl&quot;</span> prefix<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;f&quot;</span><span style="color: #339933;">%&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;!</span>DOCTYPE html <span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">&quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span> <span style="color: #0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;</span><span style="color: #339933;">&gt;</span></li><li><span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>Teste Ajax<span style="color: #339933;">/</span>title<span style="color: #339933;">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;text/javascript&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;f:webResources relativePath='js/prototype-1.6.0.3.js'/&gt;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function callAjaxMethod <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>		var bpmUrl	<span style="color: #339933;">=</span><span style="color: #0000ff;">'&lt;f:invokeUrl var=&quot;bpmObject&quot; methodName=&quot;getDocuments&quot; /&gt;'</span><span style="color: #339933;">;</span>		</li><li>		<span style="color: #000000; font-weight: bold;">return</span> bpmUrl<span style="color: #339933;">;</span></li><li>	<span style="color: #009900;">&#125;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;</li><li>	<span style="color: #000000; font-weight: bold;">new</span> Ajax.<span style="color: #006633;">Updater</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'teste'</span>, callAjaxMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>body leftmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span> topmargin<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;Teste Ajax</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Nome<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>c<span style="color: #339933;">:</span>out value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;${bpmObject.nome}&quot;</span> <span style="color: #339933;">/&gt;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>br<span style="color: #339933;">/&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;</span>div id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">&gt;&lt;/</span>div<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span></li><li>&nbsp;</li><li><span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Repare que foi criada a função JS <strong>callAjaxMethod</strong>. Abaixo dessa função existe ainda a função JS <strong><a href="http://www.prototypejs.org/api/ajax/updater" target="_blank" style="text-decoration: underline">Ajax.Updater</a></strong>, que no caso é uma função da biblioteca Prototype que irá fazer a chamada ao método do BPM Object, retornando seu <em>output</em> para a div <strong>teste</strong>.</p>
<h3>Criando um <em>output</em> para o método getDocuments do BPM Object</h3>
<p>Finalmente essa é a última parte desse pequeno tutorial. Agora a única coisa que falta é criar um <em>output</em> para o método do BPM Object que irá ser chamado via requisição Ajax.</p>
<p>Antes de mais nada, preciso dizer algo a respeito da <em>tag</em> <strong>f:invokeUrl</strong>, pois para ela funcionar corretamente existem algumas peculiariades. </p>
<p>Para um método de um BPM Object ser reconhecido por esta <em>tag</em>, ele deve ter uma das quatro assinaturas abaixo:</p>
<ul>
<li>methodName(Fuego.Net.HttpRequest request, Fuego.Net.HttpResponse response)</li>
<li>methodName(java.util.Map requestParameters, java.util.Map requestHeaders)</li>
<li>methodName(java.util.Map requestParameters)</li>
<li>methodName()</li>
</ul>
<p>No caso, eu optei por utilizar a primeira opção, pois para usar a função <strong>Ajax.Updater</strong> da Prototype, eu preciso escrever diretamente no <em>output</em> do método, ao invés de setar as informações necessárias através dos seus atributos.</p>
<p>Em virtude disso, o método <strong>getDocuments</strong> do objeto <strong>BpmObject</strong> agora passará a ter a seguinte assinatura:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li>getDocuments<span style="color: #009900;">&#40;</span>Fuego.<span style="color: #006633;">Net</span>.<span style="color: #006633;">HttpRequest</span> request, Fuego.<span style="color: #006633;">Net</span>.<span style="color: #006633;">HttpResponse</span> response<span style="color: #009900;">&#41;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Agora, finalmente o código do método <strong>getDocuments</strong>, que ficará da seguinte maneira:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Java"><div class="devcodeoverflow"><ol><li></li><li><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> doc <span style="color: #339933;">:</span> documents<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;response.<span style="color: #006633;">bodyTextContent</span><span style="color: #009900;">&#40;</span>arg1 <span style="color: #339933;">:</span> doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No código acima, estou percorrendo o atributo <strong>documents</strong> (array) e imprimindo no <em>output</em> todos os documentos definidos para aquele atributo, dessa forma, quando a função <strong>callAjaxMethod</strong> é chamada na página JSP, ela automaticamente chama (assincronamente) este método contido dentro do BPM Object, imprimindo todos os documentos definidos para dentro da div com o ID <strong>teste</strong>.</p>
<h3>Conclusão</h3>
<p>Utilizando os recursos corretos do Oracle BPM, como sua taglib e seus componentes, não é muito difícil fazer uma tela de apresentação mais interativa usando Ajax. No exemplo acima, foi criado um projeto bem simples, apenas para ilustrar, com o intuito de mostrar a atualização do conteúdo de uma div feita assincronamente através de uma requisição Ajax. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/03/23/oraclebpm-com-jsp-e-ajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Não utilize XMLObject para apresentação no Oracle BPM!</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 21:50:19 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[BPM]]></category>
		<category><![CDATA[BPMObject]]></category>
		<category><![CDATA[Fuego]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OracleBPM]]></category>
		<category><![CDATA[XMLObject]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=214</guid>
		<description><![CDATA[Quem trabalha com Web Services no Oracle BPM sabe que é inevitável fugir do XMLObject. E por quê é inevitável? Simplesmente porque toda vez que algum serviço é catalogado, tanto o seu request quanto o seu response são catalogados como um objeto desse tipo, que nada mais é que do que a representação XML de [...]]]></description>
			<content:encoded><![CDATA[<p>Quem trabalha com Web Services no Oracle BPM sabe que é inevitável fugir do <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/standard_components/Fuego/Xml/XMLObject/XMLObject_component.html" target="_blank" style="text-decoration: underline">XMLObject</a>. E por quê é inevitável? Simplesmente porque toda vez que algum serviço é catalogado, tanto o seu request quanto o seu response são catalogados como um objeto desse tipo, que nada mais é que do que a representação XML de um tipo complexo, ou seja, um <a href="http://www.w3schools.com/Schema/schema_elements_ref.asp" target="_blank" style="text-decoration: underline">XML Schema (XSD)</a>.</p>
<p>Na parte de apresentação no BPM existem duas opções: presentations e JSP. Em ambos os casos é necessário sempre utilizar um <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/studio/modules/bpm_objects/c_Head_BPM_Objects.html" target="_blank" style="text-decoration: underline">BPM Object</a> para fazer a representação dos dados. Um BPM Object é puramente um objeto e com isso contém atributos e métodos específicos.</p>
<p>No meu caso, tenho trabalhado com JSP para a camada de visualização, já que preciso ir um pouco além do que simplesmente exibir dados. As telas do meu processo precisam um alto nível de customização e também possuem bastantes regras de validação e fluxo no lado do cliente usando Java Script. É também comum no meu processo a utilização de serviços externos, e com isso se faz por necessário apresentar os dados retornados por esses serviços nas minhas páginas JSP. Conforme dito anteriormente, para mostrar esses dados preciso de um BPM Object e para não criar um BPM Object redudante, ou seja, um BPM Object com a estrutura idêntica do XML Object &#8211; que já está cadastrado no meu projeto &#8211; o que eu fiz foi criar um atributo nesse BPM Object que encapsula um XML Object, dessa forma poderia usar os atributos do XML Object como atributos dentro do meu BPM Object. Algo como um atributo do tipo de uma lista genérica em um objeto java.</p>
<p>Mas qual foi a minha surpresa ao iterar sobre esse atributo do tipo XML Object no meu JSP? Simplesmente não funciona, ou melhor, funciona pela metade! hehe .. deixa eu explicar.</p>
<p>Se eu tenho um BPM Object com a seguinte estrutura:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li>MyBPMObject</li><li>- name (string)</li><li>- email (string)</li><li>- address (XMLObject)</li><li>&nbsp;</li><li>Address (XMLObject)</li><li>- zipcode (int)</li><li>- city (string)</li><li>- state (string)</li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>E no JSP tentar acessar o atributo da seguinte forma:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="HTML"><div class="devcodeoverflow"><ol><li>Nome: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.name}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a><span style="color: #66cc66;">/</span>&gt;</span></li><li>Estado: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.address.state}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Funciona!</p>
<p>Agora, se o meu XMLObject fosse do tipo array, ou seja, uma lista, não funciona! Vejamos o meu BPMObject alterado para suportar uma lista de endereços (address):</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="Text"><div class="devcodeoverflow"><ol><li></li><li>MyBPMObject</li><li>- name (string)</li><li>- email (string)</li><li>- address[] (XMLObject)</li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>No JSP:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="HTML"><div class="devcodeoverflow"><ol><li></li><li>Nome: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.name}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a><span style="color: #66cc66;">/</span>&gt;</span></li><li>Estado: <span style="color: #009900;">&lt;c:out <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${bpmObject.address[0].state}&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>O exemplo acima não funciona, é como se o atributo &#8220;address&#8221; não existisse! Bizarro! Tentei inclusive usando a própria <a href="http://download.oracle.com/docs/cd/E13154_01/bpm/docs65/taglib/index.html" target="_blank" style="text-decoration: underline">taglib do BPM</a> e nada!</p>
<p>O que eu tive que fazer? Tcharammm.. criar um BPM Object idêntico ao meu XMLObject e criar um método dentro desse BPM Object que recebe como parâmetro um XML Object, o que ele faz é mapear os valores desse XML Object para os seus próprios atributos&#8230; totalmente POG! Mas foi o jeito&#8230;</p>
<p>Se alguém souber de algum &#8220;pulo do gato&#8221;, por favor me informe que eu publico aqui, mas eu sinceramente acho difícil ter alguma mágica, por mais óbvio que seja, não funciona. O mais bizarro ainda, é que se no Screenflow que antecede o JSP eu der um output do objeto da mesma forma que eu estou dando no JSP, funciona, só não funciona mesmo no JSP :(</p>
<p>Fica a dica: não usem XML Object para apresentar dados!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/02/06/nao-utilize-xmlobject-para-apresentacao-no-oraclebpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
