<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Rodrigo P. Fraga</title>
	<atom:link href="https://digows.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://digows.com</link>
	<description>CTO &#38; Senior Software Architect &#124; Java, Kubernetes, Serverless and more &#124; Helping startups &#38; enterprises scale cloud-native systems</description>
	<lastBuildDate>Tue, 02 Sep 2025 19:44:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>

<image>
	<url>https://digows.com/wp-content/uploads/2018/03/cropped-xova.png?w=32</url>
	<title>Rodrigo P. Fraga</title>
	<link>https://digows.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<cloud domain='digows.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<atom:link rel="search" type="application/opensearchdescription+xml" href="https://digows.com/osd.xml" title="Rodrigo P. Fraga" />
	<atom:link rel='hub' href='https://digows.com/?pushpress=hub'/>
	<item>
		<title>The Ifless Principle: Designing APIs Without Hidden Decisions</title>
		<link>https://digows.com/2025/09/02/the-ifless-principle-designing-apis-without-hidden-decisions/</link>
					<comments>https://digows.com/2025/09/02/the-ifless-principle-designing-apis-without-hidden-decisions/#respond</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Tue, 02 Sep 2025 19:44:38 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[technology]]></category>
		<guid isPermaLink="false">http://digows.com/?p=1927</guid>

					<description><![CDATA[Introduction One of the most dangerous lines of code isn’t the one that throws an exception — it’s the one that hides a decision. As engineers, we often celebrate flexible methods: a single save() that “magically” knows when to insert or update, a send() that picks the right channel, or an approveOrReject() that decides the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><strong>Introduction</strong></h2>



<p>One of the most dangerous lines of code isn’t the one that throws an exception — it’s the one that hides a decision.</p>



<p>As engineers, we often celebrate <em>flexible</em> methods: a single save() that “magically” knows when to insert or update, a send() that picks the right channel, or an approveOrReject() that decides the outcome. At first, it feels convenient. But hidden behind that convenience lives complexity, ambiguity, and a growing army of <strong>if-statements</strong>.</p>



<p>The problem with too many ifs is not only <strong>code readability</strong>. It’s that each of the multiple scenarios your team must design, test, and maintain. What looks like “just one more condition” can easily become exponential in cost.</p>



<p>Over time, I’ve adopted a design approach I call the <strong>ifless principle</strong>: instead of burying decisions in code, we make them explicit in the design of the API and in the domain itself.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading"><strong>The Ifless Principle</strong></h2>



<p>The idea is simple:</p>



<ul class="wp-block-list">
<li><strong>Don’t let your service decide what the user already knows.</strong></li>



<li>Express different operations as <strong>different methods, commands, or entities</strong>, even if they initially share behavior.</li>



<li>Move intelligence into <strong>rich domain entities</strong> (following Domain-Driven Design), so that rules live where they belong.</li>
</ul>



<p><em>In short: <strong>ifless is not about eliminating ifs, but about putting decisions in the right place.</strong></em></p>



<h2 class="wp-block-heading"><strong>Example 1: Save vs Insert/Update</strong></h2>



<h4 class="wp-block-heading"><strong><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> If-full version:</strong></strong></h4>



<pre class="wp-block-code"><code>public void save(Order order) {
    if (order.getId() == null) {
        insert(order);
    } else {
        update(order);
    }
}</code></pre>



<h4 class="wp-block-heading"><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ifless version:</strong><br></h4>



<pre class="wp-block-code"><code>public void insert(Order order) { ... }
public void update(Order order) { ... }</code></pre>



<p>Even if both methods are identical today, the design already anticipates that <strong>inserts and updates will evolve differently</strong>. More importantly, the <em>caller</em> knows the intent, so the service doesn’t have to guess.</p>



<h2 class="wp-block-heading"><strong><strong>Example 2: Approvals</strong></strong></h2>



<h4 class="wp-block-heading"><strong><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>If hidden in the service:</strong><br></strong></strong></h4>



<pre class="wp-block-code"><code>public void approveOrReject(Transaction tx, boolean approve) {
    if (approve) { ... } else { ... }
}</code></pre>



<h4 class="wp-block-heading"><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ifless API:</strong><br></h4>



<pre class="wp-block-code"><code>public void approve(Transaction tx) { ... }
public void reject(Transaction tx) { ... }</code></pre>



<p>Each operation has its own lifecycle, rules, and evolution. Tests become more focused, and the API expresses <em>intention clearly</em>.</p>



<h2 class="wp-block-heading"><strong><strong>Example 3: Notifications</strong></strong></h2>



<h4 class="wp-block-heading"><strong><strong><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conditional channel selection:</strong><br></strong></strong></h4>



<pre class="wp-block-code"><code>notificationService.send(user, message, channel);</code></pre>



<h4 class="wp-block-heading"><strong><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ifless separation:</strong></h4>



<pre class="wp-block-code"><code>emailNotification.send(user, message);
smsNotification.send(user, message);
pushNotification.send(user, message);</code></pre>



<p>Instead of one method with multiple branching conditions, each channel implements its own rules. Adding a new channel doesn’t mean touching a giant switch-case.</p>



<h2 class="wp-block-heading"><strong>Connection with Domain-Driven Design</strong><br></h2>



<p>In Domain-Driven Design (DDD), the <strong>domain model encapsulates the core logic</strong>. That means invariants (like “an order can only ship if it is paid”) should live inside the entity itself:</p>



<pre class="wp-block-code"><code>public class Order {
    public void ship() {
        if (!this.isPaid()) {
            throw new BusinessException("Order must be paid before shipping");
        }
        // proceed with shipping...
    }
}</code></pre>



<p>Notice: there’s still an if — but it’s <strong>not scattered across services</strong>. It’s encapsulated in the place where the rule truly belongs: the Order entity.</p>



<p>This is ifless in spirit: <strong>decisions are modeled explicitly in the domain, not left to a god-service to decide.</strong></p>



<p></p>



<h2 class="wp-block-heading"><strong>Benefits of the Ifless Principle</strong></h2>



<ol start="1" class="wp-block-list"></ol>



<p><strong>1</strong>. <strong>Clarity of API</strong></p>



<p>The method name tells you exactly what it does. No hidden branching.</p>



<p><strong>2</strong>. <strong>Reduced Test Explosion</strong></p>



<p>Each if doubles the number of possible execution paths. Removing ifs from services simplifies test design.</p>



<p>Example: save() with insert/update needs at least 2 test suites; insert and update each need only 1.</p>



<p><strong>3. Evolution without Risk</strong></p>



<p>As requirements diverge, methods evolve independently. You don’t risk breaking insert logic while changing update.</p>



<p><strong>4</strong>. <strong>Alignment with SRP (Single Responsibility Principle)</strong></p>



<p>One method = one reason to change.</p>



<p><strong>5</strong>. <strong>Cleaner Architecture</strong></p>



<p>Services stay thin. Entities stay rich. Decisions are explicit.</p>



<p></p>



<h2 class="wp-block-heading"><strong>Trade-offs and Counterpoints</strong></h2>



<p>No principle is universal. <em>Ifless</em> comes with its own costs:</p>



<ul class="wp-block-list">
<li><strong>Verbosity</strong>: You might end up with more methods or services, even when differences are minimal.</li>



<li><strong>Client Burden</strong>: Sometimes, callers just want a convenient save(). Exposing too much detail can reduce ergonomics.</li>



<li><strong>Breaking conventions</strong>: Frameworks like Hibernate and Spring Data already assume methods like save() or merge(). Going against the grain might surprise new developers.</li>
</ul>



<p>That’s why I see ifless not as a <strong>dogma</strong>, but as a <strong>compass</strong>. Use it when clarity, testability, and explicit design outweigh the convenience of a single method.</p>



<h2 class="wp-block-heading"><strong>Related Ideas and References</strong></h2>



<ul class="wp-block-list">
<li><a href="https://www.domainlanguage.com/ddd/">Eric Evans – Domain-Driven Design</a></li>



<li><a href="https://martinfowler.com/refactoring/replace-conditional-with-polymorphism.html">Martin Fowler – Refactoring: Replace Conditional with Polymorphism</a></li>



<li><a href="https://www.oreilly.com/library/view/clean-code/9780136083238/">Clean Code by Robert C. Martin</a></li>



<li><a href="https://en.wikipedia.org/wiki/Merge_(SQL)">The “UPSERT” debate in SQL</a> — convenience vs explicitness.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading"><strong>Conclusion</strong></h2>



<p>Every if has a cost. Not just in code complexity, but in <strong>testing, maintenance, and evolution</strong>.</p>



<p>The ifless principle is about <strong>making decisions explicit in the design of your API and your domain</strong>. It’s about contracts that express intent without ambiguity.</p>



<p>It doesn’t mean you’ll never write an if. It means your architecture won’t hide them in the wrong places.</p>



<p><strong>In the age of scaling startups with fewer resources, clarity in design is not a luxury — it’s survival.</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2025/09/02/the-ifless-principle-designing-apis-without-hidden-decisions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:thumbnail url="https://digows.com/wp-content/uploads/2025/09/unnamed.png" />
		<media:content url="https://digows.com/wp-content/uploads/2025/09/unnamed.png" medium="image">
			<media:title type="html">unnamed</media:title>
		</media:content>

		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>
	</item>
		<item>
		<title>Nine Women Can&#8217;t Make One Baby: Why Smaller Software Teams Deliver More</title>
		<link>https://digows.com/2025/08/27/nine-women-cant-make-one-baby-why-smaller-software-teams-deliver-more/</link>
					<comments>https://digows.com/2025/08/27/nine-women-cant-make-one-baby-why-smaller-software-teams-deliver-more/#respond</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Wed, 27 Aug 2025 20:23:11 +0000</pubDate>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[agile development]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[CTO's Life]]></category>
		<category><![CDATA[productivity]]></category>
		<guid isPermaLink="false">http://digows.com/?p=1897</guid>

					<description><![CDATA[In software development, adding more developers doesn’t speed up delivery. Drawing on Brooks’s law and personal experience, the article argues small teams—around three developers—are more efficient and creative.]]></description>
										<content:encoded><![CDATA[
<p>In software engineering, scaling a project doesn’t work the same way as scaling manufacturing. While hiring more developers can increase overall capacity, it doesn’t proportionally accelerate the delivery of a single feature or project. This insight was famously captured by <strong>Fred Brooks</strong> in <em>The Mythical Man‑Month</em>, where he observed that <strong>“adding manpower to a late software project makes it later”</strong>&nbsp;. Brooks illustrated the problem with an analogy: one woman can produce a baby in nine months, but nine women working together cannot produce a baby in one month&nbsp;. This law isn’t about biology — it’s about the inherent constraints of complex work.</p>



<h3 class="wp-block-heading">Why throwing people at a project often backfires</h3>



<p>Brooks’s law identifies three fundamental reasons why adding more people to a software project can actually slow it down:</p>



<ol class="wp-block-list">
<li><strong>Ramp‑up time.</strong> New team members need time to learn the codebase and context. Experienced developers must stop what they’re doing to train newcomers, temporarily reducing productivity . In some cases, new hires even introduce bugs while still ramping up, pushing the project further from completion .</li>



<li><strong>Communication overhead.</strong> Coordination paths grow exponentially as the team grows. Each person must keep others informed, creating more meetings, emails and stand‑ups . The Nuclino blog visualizes this: a three‑person team has three communication links, but adding three more members increases the links to fifteen .</li>



<li><strong>Limited divisibility of tasks.</strong> Not all work can be partitioned into smaller pieces. Some tasks demand sequential design and integration. Brooks points out that many software tasks are inherently indivisible . The two‑pizza‑team article expands this: you can’t simply split a complex design problem into tiny independent tickets and expect the result to emerge organically .</li>
</ol>



<p>These forces mean that there is an upper limit to the productivity gains you can achieve by simply adding developers. At some point, coordination costs and integration complexity outweigh the benefit of having more hands on deck.</p>



<h3 class="wp-block-heading">The case for small, focused&nbsp;teams</h3>



<p>For decades, agile practitioners have advocated small, cross‑functional teams. Jeff Bezos famously framed Amazon’s <strong>two‑pizza team rule</strong>: if a team cannot be fed with two pizzas, it is too big&nbsp;. The rationale is that small teams minimize communication overhead, allow rapid decision‑making, and foster accountability. Harvard psychologist <strong>J. Richard Hackman</strong> also warned that larger groups suffer from process problems and dysfunctional dynamics.</p>



<p>Research backs this up. <strong>Mike Cohn</strong> cites a study in which teams were asked whether their group was too large to achieve the best result. Nearly everyone agreed that teams become inefficient above five members&nbsp;. Analysing over 1,000 software projects, <strong>Kate Armel</strong> found that projects delivered by teams of four or fewer developers were far more cost‑efficient and had fewer defects than those built by larger teams&nbsp;. The data suggests that <strong>four to five</strong> people is a sweet spot for most agile projects.</p>



<h3 class="wp-block-heading">My own “magic number”: three developers</h3>



<p>After years of experimenting with different team compositions working as CTO at <a href="http://eits.com.br" rel="noreferrer noopener" target="_blank">eits.com.br</a>, I’ve discovered a pragmatic variation on this theme: <strong>three developers</strong> can deliver remarkable results during a two‑week sprint. With trios, communication paths are minimal (three links), the team can self‑organize without excessive coordination, and everyone has a clear sense of ownership. It’s easier to maintain shared context, perform peer reviews, and collaborate closely on design decisions. If you add more people, you inevitably introduce hand‑offs and waiting, and the time spent aligning increases faster than the productive time gained.</p>



<p>This isn’t just about efficiency — it’s about <strong>creativity</strong>. Complex problem‑solving often benefits from deep focus and uninterrupted thought. When more developers are involved, everyone gravitates toward smaller sub‑tasks, and the holistic view of the solution can get fragmented. A trio can tackle architecture, coding and testing collaboratively while still preserving big‑picture coherence.</p>



<h3 class="wp-block-heading">Constraints outside the&nbsp;team</h3>



<p>Adding developers doesn’t just create internal coordination issues; it also assumes that there is enough parallelizable work to keep everyone busy. In practice, <strong>business requirements, product design and stakeholder input</strong> often limit throughput. If there aren’t enough well‑defined tasks, additional engineers either wait idle or start working on poorly defined work, increasing rework later. Similarly, <strong>creativity and solution design</strong> don’t scale linearly. Some problems require brainstorming and iterative design cycles that don’t benefit from extra hands.</p>



<h3 class="wp-block-heading">Mitigating the urge to scale&nbsp;up</h3>



<p>How can leaders resist the instinct to “manpower their way” out of a schedule slip? Here are some strategies:</p>



<ul class="wp-block-list">
<li><strong>Invest early.</strong> Brooks noted that adding developers late in a project is particularly harmful . If you anticipate needing more people, bring them in early when ramp‑up costs are easier to absorb.</li>



<li><strong>Focus on talent, not headcount.</strong> Adding one highly experienced developer may yield more benefit than hiring several junior engineers. Good programmers require less ramp‑up and introduce fewer defects .</li>



<li><strong>Prioritize architecture and requirements.</strong> Many delays stem from unclear requirements or architectural flaws. Spend time up front clarifying what needs to be built and how pieces will fit together. This reduces integration challenges later.</li>



<li><strong>Keep teams autonomous.</strong> When multiple small teams work in parallel, ensure their interfaces are well-defined to minimize cross-team dependencies. Jeff Bezos’ decentralization mantra and the two‑pizza rule were born from this philosophy.</li>
</ul>



<h3 class="wp-block-heading">Conclusion</h3>



<p>The baby metaphor endures because it cuts to the core of software project dynamics: you can’t compress all tasks simply by adding more people. There is a natural limit to how much work can be parallelized; beyond that, communication overhead, ramp‑up time and cognitive load drag the project down. Research suggests that small teams — typically <strong>four to five</strong> people — are optimal&nbsp;, and my own experience shows that <strong>three developers</strong> often deliver the best trade‑off between speed, quality and creativity.</p>



<p>Before you attempt to “scale up” your team to meet a deadline, ask whether the extra hands will actually move the delivery forward or whether they’ll simply add more complexity. Sometimes the most effective strategy is to empower a small, focused team, give them clear goals, and trust them to deliver.</p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2025/08/27/nine-women-cant-make-one-baby-why-smaller-software-teams-deliver-more/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:thumbnail url="https://digows.com/wp-content/uploads/2025/08/nine-women-one-month.png" />
		<media:content url="https://digows.com/wp-content/uploads/2025/08/nine-women-one-month.png" medium="image">
			<media:title type="html">nine-women-one-month</media:title>
		</media:content>

		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>
	</item>
		<item>
		<title>Artigo &#034;Integrando Flex com Java utilizando o BlazeDS&#034; na Java Magazine 72</title>
		<link>https://digows.com/2010/09/06/artigo-integrando-flex-com-java-utilizando-o-blazeds-na-java-magazine-72/</link>
					<comments>https://digows.com/2010/09/06/artigo-integrando-flex-com-java-utilizando-o-blazeds-na-java-magazine-72/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Mon, 06 Sep 2010 16:10:27 +0000</pubDate>
				<category><![CDATA[Random Thoughts]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=80</guid>

					<description><![CDATA[Já está nas bancas o meu mais novo artigo sobre Java e Flex na revista Java Magazine! O nome do artigo é Integrando Flex com Java utilizando o BlazeDS, e como o título já diz, este artigo é para quem quer aprender integrar o Flex com Java. Foi escrito de forma bem detalhada com vários exemplos, incluindo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.devmedia.com.br/post-14293-Artigo-Java-Magazine-72-Integrando-Flex-com-Java-utilizando-o-BlazeDS.html"><img class="aligncenter" title="Java Magazine 72" src="https://i0.wp.com/www.devmedia.com.br/loja/img/capaJava72_G.jpg" alt="Java Magazine 72" width="199" height="271" /></a></p>
<p>Já está nas bancas o meu mais novo artigo sobre Java e Flex na revista <strong>Java Magazine!</strong></p>
<p>O nome do artigo é <strong><em>Integrando Flex com Java utilizando o BlazeDS<span style="font-weight:normal;"><span style="font-style:normal;">, e como o título já diz, este artigo é para quem quer aprender integrar o Flex com Java.</span></span></em></strong></p>
<p><strong><em><span style="font-weight:normal;"><span style="font-style:normal;">Foi escrito de forma bem detalhada com vários exemplos, incluindo a utilização dos serviços de mensageria do BlazeDS.</span></span></em></strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2010/09/06/artigo-integrando-flex-com-java-utilizando-o-blazeds-na-java-magazine-72/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://www.devmedia.com.br/loja/img/capaJava72_G.jpg" medium="image">
			<media:title type="html">Java Magazine 72</media:title>
		</media:content>
	</item>
		<item>
		<title>Artigo &#034;Interfaces de qualidade com Flex&#034; na Java Magazine 68</title>
		<link>https://digows.com/2009/05/29/artigo-interfaces-de-qualidade-com-flex-na-java-magazine/</link>
					<comments>https://digows.com/2009/05/29/artigo-interfaces-de-qualidade-com-flex-na-java-magazine/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Fri, 29 May 2009 22:31:15 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Artigo]]></category>
		<category><![CDATA[Java Magazine]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=70</guid>

					<description><![CDATA[Já está nas bancas meu artigo sobre Java e Flex na revista Java Magazine! O nome do artigo é Interfaces de qualidade com Adobe Flex. Ele é voltado para quem não conhece nada, ou está começando à aprender Flex e conhece um pouco de Java. No artigo Faço uma analogia entre a Linguagem ActionScript 3.0 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=12843" target="_blank"><img class="aligncenter" title="Java Magazine 68." src="https://i0.wp.com/www.devmedia.com.br/loja/img/capaJava68_G.jpg" alt="Java Magazine 68." width="199" height="271" /></a></p>
<p style="text-align:left;">
<p style="text-align:left;">Já está nas bancas meu artigo sobre Java e Flex na revista <strong>Java Magazine!</strong></p>
<p>O nome do artigo é <strong><em>Interfaces de qualidade com Adobe Flex</em>.</strong> Ele é voltado para quem não conhece nada, ou está começando à aprender Flex e conhece um pouco de Java.</p>
<p>No artigo Faço uma analogia entre a Linguagem ActionScript 3.0 e Java 5, apresento algumas formas de consumir dados e também como fazer que um código feito para executar na Web com o Flash Player, possa ser executado no Desktop sem alterar uma linha de código funcional.</p>
<p>Estou por finalizar um próximo artigo, nesse o foco está em apresentar como utilizar o Flex em aplicações corporativas, integrando com SpringFramework e EJBs utilizando o JBoss.</p>
<p>Sem mais, por favor deixe o seu feedback!</p>
<p style="text-align:left;">Abraços.</p>
<p style="text-align:left;">o/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2009/05/29/artigo-interfaces-de-qualidade-com-flex-na-java-magazine/feed/</wfw:commentRss>
			<slash:comments>62</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://www.devmedia.com.br/loja/img/capaJava68_G.jpg" medium="image">
			<media:title type="html">Java Magazine 68.</media:title>
		</media:content>
	</item>
		<item>
		<title>Flex: Um chat simples em menos de 20 linhas.</title>
		<link>https://digows.com/2009/01/13/flex-um-chat-simples-em-menos-de-20-linhas/</link>
					<comments>https://digows.com/2009/01/13/flex-um-chat-simples-em-menos-de-20-linhas/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Wed, 14 Jan 2009 01:18:44 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Messaging]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=33</guid>

					<description><![CDATA[Uma coisas mais excepcionais que o design do framework do Adobe Flex traz, é a facilidade de trabalhar com os serviços de mensageria. Toda a complexidade que existe nas soluções de mensageria como a do JMS do Java, no Flex, basicamente foi resumido ao &#60;mx:Producer/&#62; e &#60;mx:Consumer/&#62; (ver a documentação). Assim como os outros meios [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Uma coisas mais excepcionais que o design do framework do Adobe Flex traz, é a facilidade de trabalhar com os <a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00001170.html" target="_blank">serviços de mensageria</a>. Toda a complexidade que existe nas soluções de mensageria como a do <a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fjava.sun.com%2Fproducts%2Fjms%2F&amp;ei=Wi9tSYHGFOPetgetsY39Cw&amp;usg=AFQjCNEG6NiebLJR5V5k2tRx0TwjbpgqMA&amp;sig2=v1L9IqZvOB4mpKrWDZuynQ" target="_blank">JMS</a> do Java, no <a href="http://www.adobe.com/products/flex/" target="_blank">Flex</a>, basicamente foi resumido ao <a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00001170.html" target="_blank">&lt;mx:Producer/&gt;</a> e <a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00001171.html#132296" target="_blank">&lt;mx:Consumer/&gt;</a> (ver a <a href="http://livedocs.adobe.com/flex/2/docs/00001168.html" target="_blank">documentação</a>).</p>
<p></p>
<p>Assim como os outros meios de comunicação do Flex ( HttpService, WebService, RemoteObject ) o <strong>Consumer</strong> e <strong>Producer</strong> precisam de uma funcionalidade no back-end, em específico o <strong>DataService</strong> que está usando. Como por exemplo, no <strong>Java</strong> o DataService mais comum que contém essa funcionalidade é o <a href="http://www.adobe.com/products/livecycle/dataservices/" target="_blank">Live Cycle Data Services</a> e o <a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/" target="_blank">BlazeDS</a>, este OpenSource. No PHP, tem o <a href="http://www.themidnightcoders.com/products/weborb-for-php" target="_blank">WebOrb for PHP</a>.</p>
<p></p>
<p>Como o título deste tópico informa, para provar que é muito simples trabalhar com mensageria no Flex, vamos criar um chat com nem 20 linhas (<strong>um total de linhas programadas e não de configuração</strong>) no Flex. Para tal façanha, primeiro escolha qual linguagem e DataService que irá utilizar no back-end. Eu estarei utilizando <strong><a href="http://livedocs.adobe.com/blazeds/1/blazeds_devguide/Part_Flex_Messaging_1.html" target="_blank">Java + BlazeDS</a>.<br />
</strong></p>
<p></p>
<p>Partindo do princípio que o BlazeDS já está integrado ao Java e com as configurações básicas:</p>
<ol>
<li>O primeiro passo é criar um canal de comunicação para trafegar as mensagens. Para isso, no arquivo <strong>services-config.xml </strong>do BlazeDS, adicione o seguinte canal:
<p>[xml]</p>
<p>[/xml]</p>
<p>Esse é um canal de Streaming, e só irá funcionar se for executado em Http 1.1. Outra forma de utilizar os serviços de menssageria, é criar um canal AMF normal (AMFChannel) e ativar o polling, como no exemplo abaixo:</p>
<p>[xml]</p>
<p>true</p>
<p>[/xml]</li>
<li>Criado o canal, vamos criar o <strong>destination </strong>na qual irá utilizar o canal. Para isso, crie se não existir um arquivo no mesmo diretório do services-config.xml com o nome de <strong>messaging-config.xml</strong>, nele coloque o seguinte conteúdo:</li>
<p>[xml]</p>
<p>[/xml]</p>
<p>Com o messaging-config.xml criado, é preciso informar ao services-config.xml que existem destinations de mensageria. Para isso adicione as linhas abaixo no services-config.xml:</p>
<p>[xml]</p>
<p>&#8230;</p>
<p>&#8230;</p>
<p>[/xml]</p>
<li>Adicionado o destination (<strong>chatMessage</strong>), a configuração já está completa. Vamos agora criar a Interface do Chat junto com o Producer e Consumer (menos de 20 linhas):
<p>[xml]</p>
<p>[/xml]</p>
</li>
</ol>
<p></p>
<p>Pronto! agora basta startar seu Container Web (no meu caso o TomCat) e abrir 2 browsers distintos e enviar as menssagens.<br />
Atenção com o Firefox, pois ele armazena a mesma session para abas diferentes, e por default, o BlazeDS suporta uma conexão por cliente.</p>
<p>Para todo e qualquer erro, verifique sempre o console do Tomcat, ele sempre traz informações úteis para identificar os erros.</p>
<p>[<a href="http://23.20.48.222/downloads/postagens/chat/ChatMessaging.rar" target="_blank">Download do Fonte</a>]</p>
<p><a href="https://digows.com/wp-content/uploads/2009/01/chatapp.jpg" target="_blank"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2009/01/chatapp-thumb.jpg" border="0" alt="ChatApp" width="634" height="484" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2009/01/13/flex-um-chat-simples-em-menos-de-20-linhas/feed/</wfw:commentRss>
			<slash:comments>29</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2009/01/chatapp-thumb.jpg" medium="image">
			<media:title type="html">ChatApp</media:title>
		</media:content>
	</item>
		<item>
		<title>Porqu&#234; Flex? / Why Flex?</title>
		<link>https://digows.com/2008/04/13/porqu-flex-why-flex/</link>
					<comments>https://digows.com/2008/04/13/porqu-flex-why-flex/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Mon, 14 Apr 2008 01:44:27 +0000</pubDate>
				<category><![CDATA[Adobe]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=134</guid>

					<description><![CDATA[Baseado no post do Ebertom, resolvi postar uma série de videos engraçados e interessantes sobre&#8230; Porquê Flex? AIR? Why Flex WhyFlex WhyAIR Why AIR Because is Rocks! Why Flex Because is Rocks (GuitarPro Version) Why Flex Why AIR Why Flex Why FlashPlayer? Why Flex? By IgorCosta Mais videos: http://www.youtube.com/results?search_query=Why+Flex http://www.30onair.com/all/ Abraços o/]]></description>
										<content:encoded><![CDATA[<p>Baseado no post do <a href="http://blog.flexdev.com.br/why-flex/" target="_blank">Ebertom</a>, resolvi postar uma série de videos engraçados e interessantes sobre&#8230; Porquê Flex? AIR?</p>
<p><strong>Why Flex<br />
</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:0dd8d600-c764-403a-8f8e-13fb78f5d9c2" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="97c5a9ff-a647-4924-a958-22485bb9c9bc" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=WkmH25kJ_M8" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/videod83358cbc72f.jpg" alt="" /></a></div>
</div>
</div>
<p><span id="more-143"></span></p>
<p><strong>WhyFlex</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:c06da8f0-b73b-4361-adcc-32c83f327a68" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="ace176e1-c0b3-4f31-b0ab-e63dc3798419" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=uv9ecx88xW4" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/videob8dca0705072.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>WhyAIR</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:450eef9b-8f76-432d-a603-01e5a4056680" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="2352d6b8-c7a8-4269-b607-967e2c34b3d9" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=oQ5XnfvZwxE" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video9ff69b0adf1e.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why AIR<br />
</strong>Because is Rocks!</p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:64bd7cd6-dd22-466b-8915-52908e0d4737" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="5736f647-c41e-4966-b2e8-92dd444d835d" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=d9iopziDEug" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/videocedd0763e387.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why Flex<br />
</strong>Because is Rocks (GuitarPro Version)</p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bf304d0f-5d40-4af6-bb35-00b3271360cf" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="bd5a14af-2125-423d-bc2e-b70eb0c0f993" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=XpC_IiEkg_4" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video766e2738cc9d.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why Flex</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:92f8e3b9-da9b-409d-b221-ee4b75679c85" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="75188eb5-42a3-409a-b028-ba84811c9a85" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=vwHhhPnM4b4" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/videof090e5124868.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why AIR</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bde57f65-42ed-4923-9348-1b11151abb78" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="4047dde7-6381-44e5-9de4-7c3895b929f5" style="margin:0;padding:0;display:inline;">
<div><a href="http:/&lt;br &gt;&lt;/a&gt; /www.youtube.com/watch?v=RKhx60B04Hs" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video5b252eb9e034.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why Flex</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:88d7e5bd-cdd9-4941-a4a0-cb12c56d700b" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="13860a13-6326-4bf5-b83f-50620b8632ac" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=g_m5kRqzQgQ" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video5483f75aa0b3.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why FlashPlayer?</strong></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5a485d09-0440-421d-89cf-7b5213b78758" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="39419496-a325-4a0a-97ad-4e79778ce89a" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=U0iPQGiMU0I" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video3c55d6f369ef.jpg" alt="" /></a></div>
</div>
</div>
<p><strong>Why Flex?</strong><br />
By <a href="http://www.igorcosta.com/" target="_blank">IgorCosta</a></p>
<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:2cd2b4bc-2b1e-42b4-a1c2-c81e60d0857a" class="wlWriterSmartContent" style="display:inline;margin:0;padding:0;">
<div id="a775eceb-fb56-49a0-9b0b-3998ea1c0f8d" style="margin:0;padding:0;display:inline;">
<div><a href="http://www.youtube.com/watch?v=kKNJO3P7T80" target="_new"><img src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/04/video9231e7a805dd.jpg" alt="" /></a></div>
</div>
</div>
<p>Mais videos:<br />
<a title="http://www.youtube.com/results?search_query=Why+Flex" href="http://www.youtube.com/results?search_query=Why+Flex" target="_blank">http://www.youtube.com/results?search_query=Why+Flex</a><br />
<a title="http://www.30onair.com/all/" href="http://www.30onair.com/all/" target="_blank">http://www.30onair.com/all/</a></p>
<p>Abraços</p>
<p>o/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2008/04/13/porqu-flex-why-flex/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/videod83358cbc72f.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/videob8dca0705072.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video9ff69b0adf1e.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/videocedd0763e387.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video766e2738cc9d.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/videof090e5124868.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video5b252eb9e034.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video5483f75aa0b3.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video3c55d6f369ef.jpg" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/04/video9231e7a805dd.jpg" medium="image" />
	</item>
		<item>
		<title>Manifesto Flex Brasil</title>
		<link>https://digows.com/2008/03/16/manifesto-flex-brasil/</link>
					<comments>https://digows.com/2008/03/16/manifesto-flex-brasil/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Sun, 16 Mar 2008 03:57:00 +0000</pubDate>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=124</guid>

					<description><![CDATA[[Saiba o que é o Manifesto Flex Brasil] Minhas principais contribuições para a comunidade: Post: Configurando Ambiente com Flex 2 e HelloWorld. Por que ele é relevante: Aprenda a montar um ambiente de desenvolvimento com Flex 2 e um HelloWorld. A quem ele se destina: Desenvolvedores inexperientes com Flex. Post: Simples Leitor de RSS Por [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[<a href="http://blog.dclick.com.br/2008/03/10/o-que-e-o-manifesto-flex-brasil/" target="_blank">Saiba o que é o Manifesto Flex Brasil</a>]</p>
<p><strong><em>Minhas principais contribuições para a comunidade:</em></strong></p>
<p><strong>Post:</strong> <a href="http://e-digows.blogspot.com/2007/03/configurando-um-ambiente-para.html" target="_blank"><em>Configurando Ambiente com Flex 2 e HelloWorld.</em></a><em><br />
</em><strong>Por que ele é relevante</strong>: Aprenda a montar um ambiente de desenvolvimento com Flex 2 e um HelloWorld.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores inexperientes com Flex.</p>
<p><strong>Post: </strong><a href="http://e-digows.blogspot.com/2007/03/flex-leitor-de-rss.html" target="_blank"><em>Simples Leitor de RSS</em></a><em><br />
</em><strong>Por que ele é relevante</strong>: Veja como em poucas linhas de código é possível fazer um leitor de RSS com Flex usando HttpService.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex em geral.</p>
<p><strong>Post: </strong><a href="http://e-digows.blogspot.com/2007/04/adobe-flex-e-efeitos.html" target="_blank"><em>Adobe Flex &#8211; Brincando com Efeitos</em></a><br />
<strong>Por que ele é relevante</strong>: Veja como é fácil adicionar efeitos aos componentes Flex.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex em geral.</p>
<p><strong>Post: </strong><a href="http://e-digows.blogspot.com/2007/11/trocando-objetos-flex-com-php-via.html" target="_blank"><em>Trocando objetos entre Flex e PHP</em></a><br />
<strong>Por que ele é relevante</strong>: Faça uso de uma boa prática trocando objetos do tipo VO/DTO/TO entre <em>Flex</em> e <em>PHP</em> via RemoteObject.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex que usam PHP no back-end.</p>
<p><strong>Post: </strong><a href="http://23.20.48.222/?p=36" target="_blank"><em>Censo Adobe Flex Developer</em></a><br />
<strong>Por que ele é relevante</strong>: Um pequena aplicação em Flex que armazena dados de desenvolvedores Flex.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex em geral.</p>
<p><strong>Post: </strong><a href="http://23.20.48.222/?p=79" target="_blank"><em>Trabalhando com CSS no FlexBuilder 3</em></a><br />
<strong>Por que ele é relevante</strong>: Aprenda como criar estilos no Flex através de .css usando o FlexBuilder 3.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex que tem foco em design.</p>
<p><strong>Post:</strong> <a href="http://23.20.48.222/?p=89" target="_blank"><em>Proposta de Arquitetura com Adobe Flex e PHP usando Zend Framework</em></a><br />
<strong>Por que ele é relevante</strong>: Disponibilizo a comunidade uma proposta de desenvolvimento com Flex e PHP, para que possa padronizar, arquitetar o código usando boas práticas.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex que usam PHP no back-end.</p>
<p><strong>Post:</strong> <a href="http://forum.flexbrasil.com.br/" target="_blank"><em>Fórum FlexBrasil</em></a><br />
<strong>Por que ele é relevante</strong>: Uma alternativa a listas <a href="http://www.flexbrasil.org/" target="_blank">Flex-Brasil</a> e <a href="http://groups.google.com.br/group/flexdev" target="_blank">FlexDev</a>, e armazenamento de tópicos com intenção de ajudar novos desenvolvedores Flex.<strong><br />
A quem ele se destina: </strong>Desenvolvedores Flex em geral.</p>
<p><strong>Post:</strong> <em>Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate. [</em><a href="http://23.20.48.222/?p=103" target="_blank"><em>Parte1</em></a><em>]  [</em><a href="http://23.20.48.222/?p=117" target="_blank"><em>Parte2</em></a><em>]</em><br />
<strong>Por que ele é relevante</strong>: Mostro com detalhes como integrar frameworks de mercado mais famosos no mundo Java com Flex usando RemoteObjects.<br />
<strong>A quem ele se destina: </strong>Desenvolvedores Flex que usam Java no back-end.</p>
<p>E agora eu passo a bola para o <a href="http://blog.flexdev.com.br/manifesto-flex-brasil/" target="_blank">Eberton Consolim</a>&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2008/03/16/manifesto-flex-brasil/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>
	</item>
		<item>
		<title>Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate &#8211; Uma Solu&#231;&#227;o OpenSource para Sistemas Web. (Parte 2 &#8211; Final)</title>
		<link>https://digows.com/2008/01/27/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-2-final/</link>
					<comments>https://digows.com/2008/01/27/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-2-final/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Sun, 27 Jan 2008 23:00:09 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[RIA]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=117</guid>

					<description><![CDATA[Olá Pessoal! Primeiro lugar, quero agradecer a todos pelo feedback do post anterior, isto é motivante e me dá ânimo em concluir este, e outros que virão. Hoje o foco deste artigo é que você termine ele sabendo: Configurar os Beans do Spring através de annotations; Integrar o esquema de Beans do Spring com os [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá Pessoal!</p>
<p>Primeiro lugar, quero agradecer a todos pelo feedback do <a target="_blank" href="http://23.20.48.222/?p=103">post anterior</a>, isto é motivante e me dá ânimo em concluir este, e outros que virão.</p>
<p>Hoje o foco deste artigo é que você termine ele sabendo:</p>
<blockquote><p>Configurar os Beans do <strong>Spring </strong>através de annotations;</p>
<p>Integrar o esquema de <strong>Beans </strong>do <strong>Spring</strong> com os <strong>services</strong> do Flex através de uma <strong>Factory</strong>;</p>
<p>Configurar o <strong>Spring</strong> para usar o <strong>Hibernate</strong> para abstrair nosso banco de dados;</p></blockquote>
<p>Para isso vamos a uma breve introdução a estes poderosos frameworks</p>
<h5>Breve Introdução ao Spring</h5>
<p><a target="_blank" href="http://www.springframework.org/"><img border="0" width="327" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/spring.jpg" alt="spring" height="57" style="border-width:0;" /></a></p>
<p>Como não sou fã de ficar re-escrevendo a roda, vou tentar dar a você leigo em Spring, um caminho para estudar.</p>
<blockquote><p><em><strong>Primeiro de tudo, leia este artigo feito pelo </strong></em><em><strong><a target="_blank" href="http://blog.fragmental.com.br/">Phillip Calçado (Shoes)</a></strong></em><br />
<a target="_blank" href="http://blog.flexdev.com.br/wp-content/uploads/spring/apostila-spring.pdf" title="apostila-spring.pdf">apostila-spring.pdf</a><em> <br />
Valeu </em><a target="_blank" href="http://blog.flexdev.com.br/"><em>Ebertom</em></a><em> pela hospedagem! =)</em></p>
<p><strong><em>Uma Introdução ao que o  SpringFramework pode oferecer:<br />
</em></strong><a target="_blank" href="http://blog.fragmental.com.br/2005/08/31/spring-em-acao/">http://blog.fragmental.com.br/2005/08/31/spring-em-acao/</a><br />
<a target="_blank" href="http://www.ime.usp.br/~reverbel/SMA/Slides/seminarios/spring.pdf" title="http://www.ime.usp.br/~reverbel/SMA/Slides/seminarios/spring.pdf">http://www.ime.usp.br/~reverbel/SMA/Slides/seminarios/spring.pdf</a><br />
<a target="_blank" href="http://imasters.uol.com.br/artigo/4497/java/spring_framework_introducao/" title="http://imasters.uol.com.br/artigo/4497/java/spring_framework_introducao/">http://imasters.uol.com.br/artigo/4497/java/spring_framework_introducao/</a></p>
<p><em><strong>Outros Tutoriais</strong><br />
</em><a target="_blank" href="http://www.javafree.org/content/view.jf?idContent=46" title="http://www.javafree.org/content/view.jf?idContent=46">http://www.javafree.org/content/view.jf?idContent=46</a></p>
<p><a target="_blank" href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6627" title="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6627">http://www.devmedia.com.br/articles/viewcomp.asp?comp=6627</a><br />
<a target="_blank" href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6628" title="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6628">http://www.devmedia.com.br/articles/viewcomp.asp?comp=6628</a><br />
<a target="_blank" href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6653" title="http://www.devmedia.com.br/articles/viewcomp.asp?comp=6653">http://www.devmedia.com.br/articles/viewcomp.asp?comp=6653</a></p>
<p><strong><em>Spring Annotations<br />
</em></strong><a target="_blank" href="http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/" title="http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/">http://blog.interface21.com/main/2006/11/28/a-java-configuration-option-for-spring/</a><br />
<a target="_blank" href="http://weblogs.java.net/blog/seemarich/archive/2007/11/annotation_base_1.html" title="http://weblogs.java.net/blog/seemarich/archive/2007/11/annotation_base_1.html">http://weblogs.java.net/blog/seemarich/archive/2007/11/annotation_base_1.html</a></p>
<p><strong><em>Exemplos de códigos<br />
</em></strong><a target="_blank" href="http://paulojeronimo.com/arquivos/tutoriais/tutorial-spring-framework.zip" title="http://paulojeronimo.com/arquivos/tutoriais/tutorial-spring-framework.zip">http://paulojeronimo.com/arquivos/tutoriais/tutorial-spring-framework.zip</a><br />
<a target="_blank" href="http://www.java2s.com/Code/Java/Spring/CatalogSpring.htm" title="http://www.java2s.com/Code/Java/Spring/CatalogSpring.htm">http://www.java2s.com/Code/Java/Spring/CatalogSpring.htm</a></p>
<p><strong><em>Documentação<br />
</em></strong><a target="_blank" href="http://static.springframework.org/spring/docs/2.5.x/reference/index.html" title="The Spring Framework - Reference Documentation">The Spring Framework &#8211; Reference Documentation</a></p></blockquote>
<p>Bom acredito que se você que está afim de conhecer o <strong>SpringFramewok</strong>, com esses Link&#8217;s já é possível entender quase tudo o que ele pode oferecer a sua arquitetura. Lembrando que não é recomendável seguir com este artigo, sem antes entender como funciona  <a target="_blank" href="http://www.javafree.org/content/view.jf?idContent=1">IoC</a>, <a target="_blank" href="http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_aspecto">AOP</a>, <a target="_blank" href="http://www.google.com.br/url?q=http://pt.wikipedia.org/wiki/Data_Access_Object&amp;revid=431202949&amp;sa=X&amp;oi=revisions_inline&amp;resnum=0&amp;ct=result&amp;cd=2&amp;usg=AFQjCNGQrW8xHQ3ujBGOkV86w-0pc_48MQ">DAO</a>, com o SpringFramework.</p>
<p>*<strong>Nota </strong>A abordagem aqui é sobre o <strong>SpringFramework</strong>, (Framework de Negócio) e não sobre o <strong>SpringMVC</strong>, uma vez que o Flex pode se trocar objetos através do protocolo <strong>AMF3, </strong>é totalmente dispensável o uso de Frameworks <strong><a target="_blank" href="http://www.cfgigolo.com/archives/2008/01/mvc_model_view_controller_e_os_trs_macacos_tres_macacos.html">MVC&#8217;s</a></strong>.</p>
<h5>Breve Introdução ao Hibernate</h5>
<p><a target="_blank" href="http://www.hibernate.org/"><img src="https://i0.wp.com/www.hibernate.org/tpl/jboss/img/01_oben_logo.gif" /></a></p>
<p>Como eu já disse, uma vez que já existe um bom conteúdo sobre Hibernate na Internet, não há a necessidade de re-escrever, por isso vou lhe dar a você leigo em Hibernate uma sequência de Link que irá te ajudar a entender este poderoso Framework.</p>
<blockquote><p><em><strong>Uma Introdução ao que o  Hibernate pode oferecer:<br />
</strong></em><a target="_blank" href="http://www.students.ic.unicamp.br/~ra007271/docs/white-papers/hibernate-uma_introducao_dirigida.pdf" title="http://www.students.ic.unicamp.br/~ra007271/docs/white-papers/hibernate-uma_introducao_dirigida.pdf">http://www.students.ic.unicamp.br/~ra007271/docs/white-papers/hibernate-uma_introducao_dirigida.pdf</a><br />
<a target="_blank" href="http://www.guj.com.br/java.tutorial.artigo.125.1.guj" title="http://www.guj.com.br/java.tutorial.artigo.125.1.guj">http://www.guj.com.br/java.tutorial.artigo.125.1.guj</a><br />
<a target="_blank" href="http://www.jeebrasil.com.br/mostrar/4" title="http://www.jeebrasil.com.br/mostrar/4">http://www.jeebrasil.com.br/mostrar/4</a><br />
<a target="_blank" href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149" title="http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149">http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149</a></p>
<p><strong><em>Outros Tutoriais<br />
</em></strong><a target="_blank" href="http://simundi.blogspot.com/2007/09/criar-uma-aplicao-com-hibernate.html" title="http://simundi.blogspot.com/2007/09/criar-uma-aplicao-com-hibernate.html">http://simundi.blogspot.com/2007/09/criar-uma-aplicao-com-hibernate.html</a><br />
<a target="_blank" href="http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html" title="http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html">http://www.hibernate.org/hib_docs/v3/reference/en/html/queryhql.html</a><br />
<a target="_blank" href="http://www.hibernate.org/hib_docs/tools/reference/en/html/plugins.html" title="http://www.hibernate.org/hib_docs/tools/reference/en/html/plugins.html">http://www.hibernate.org/hib_docs/tools/reference/en/html/plugins.html</a><br />
<a target="_blank" href="http://www.guj.com.br/posts/list/7249.java" title="http://www.guj.com.br/posts/list/7249.java">http://www.guj.com.br/posts/list/7249.java</a></p>
<p><strong><em>Pacotão de PDF&#8217;s<br />
</em></strong><a target="_blank" href="http://br.groups.yahoo.com/group/java-br/files/Hibernate/" title="http://br.groups.yahoo.com/group/java-br/files/Hibernate/">http://br.groups.yahoo.com/group/java-br/files/Hibernate/</a></p>
<p><strong><em>Exemplos de código<br />
</em></strong><a target="_blank" href="http://www.java2s.com/Code/Java/Hibernate/CatalogHibernate.htm" title="http://www.java2s.com/Code/Java/Hibernate/CatalogHibernate.htm">http://www.java2s.com/Code/Java/Hibernate/CatalogHibernate.htm</a></p>
<p><strong><em>Documentação<br />
</em></strong><a target="_blank" href="http://www.hibernate.org/hib_docs/v3/reference/en/html/" title="http://www.hibernate.org/hib_docs/v3/reference/en/html/">http://www.hibernate.org/hib_docs/v3/reference/en/html/</a></p></blockquote>
<p>Ok, partindo do princípio que você já entendeu como funciona o <strong>Hibernate</strong>, e o <strong>Spring, </strong>vamos ao código! +)</p>
<p><span id="more-141"></span><br />
<strong>Requerimentos:</strong></p>
<blockquote><p><font color="#333333"><strong><a target="_blank" href="http://downloads.sourceforge.net/springframework/spring-framework-2.5.1-with-dependencies.zip?modtime=1199893964&amp;big_mirror=0">SpringFramework 2.5</a></strong> ou superior;<br />
*<em>Vamos baixar o Spring com as dependências, isto é neste arquivo conterá todas as libs que nós podemos por ventura usar com o Spring, como por exemplo as libs do hibernate.</em></font></p>
<p><font color="#333333"><a target="_blank" href="http://dev.mysql.com/downloads/mysql/5.0.html">MySql 5.x Instalado;</a><br />
<em>*Eu estarei usando o pacote <a target="_blank" href="http://www.apachefriends.org/pt_br/xampp.html" title="apache friends - xampp">apache friends &#8211; xampp</a></em></font></p>
<p><font color="#333333"><strong><a target="_blank" href="http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.5.tar.gz/from/pick">MySql JConnector 5.x.x</a></strong><strong>;</strong></font></p>
<p><font color="#333333">Conhecimentos básicos sobre <strong>MySql;</strong></font></p>
<p>Plugin Eclipse <strong><a target="_blank" href="http://springide.org/updatesite/">SpringIDE</a></strong><strong>;<br />
*</strong><em>Opcional</em></p>
<p>Plugin Eclipse <strong><a target="_blank" href="http://sourceforge.net/project/downloading.php?groupname=jboss&amp;filename=HibernateTools-3.2.0.GA.zip">Hibernate Tools 3.2.x</a></strong><em>;<br />
<strong>*</strong><em>Opcional</em></em></p></blockquote>
<p>Instale os plugin&#8217;s estes opcionais na verdade este artigo não fará uso deles, mas pensando no futuro seria interessante fazer uso deles.</p>
<p>Após isso, abra seu projeto no Eclipse que nós tinhamos criado anteriormente, O <a target="_blank" href="http://23.20.48.222/downloads/postagens/javaflex/JavaFlex_part1.rar">JavaFlex</a>.</p>
<p>Vamos adicionar as seguintes libs ao projeto na pasta <strong>JavaFlexWebContentWEB-INFlib:</strong></p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image10.png"><img border="0" width="359" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image-thumb9.png" alt="Library" height="655" style="border-width:0;" /></a></p>
<p>*<em>A maioria das libs podem ser encontrada no arquivo compactado que você baixou do Spring. Lembrando também que o modelo de estilo de projeto criado no Eclipse, <strong>Dynamic Web Project,</strong> já adiciona automaticamente ao Classpath do projeto ao você colar as libs nesta pasta.</em></p>
<p>Como nós já tinhamos modelado um caso de uso chamado <strong>Cargo,</strong> vamos agora criar um banco de dados para o nosso pequeno sistema.</p>
<p>Abra seu <strong>MySql</strong>, e execute este script <strong>sql</strong> que criará a base de dados chamada <strong>JavaFlex</strong>, e também a tabela <strong>JAVAFLEX_CARGO;</strong></p>
<pre class="brush: plain; title: ; notranslate">

--
-- Banco de Dados: `javaflex`
--
CREATE DATABASE `javaflex` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `javaflex`;

--
-- Estrutura da tabela `javaflex_cargo`
--

CREATE TABLE `javaflex_cargo` (
  `ID_CARGO` int(10) unsigned NOT NULL auto_increment,
  `DS_CARGO` varchar(50) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`ID_CARGO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

</pre>
<h5>Entendendo os Pacotes, e configurando a persistência</h5>
<p>Com o banco de dados criado, vamos mapear a tabela no banco, com o nosso <strong>Entity Cargo</strong>, para isso, crie um package chamado:</p>
<p><strong>com.digows.artigos.JavaFlex.model.repository.hibernate.hbm</strong></p>
<blockquote><p>Neste package irá conter todos os nossos mapeamentos em xml, alguns preferem fazer uso de annotations, só que pessoalmente não gosto de acoplar códigos de annotations em meus beans de negócio, prefiro delegar a função <strong>Mapeamento</strong> a arquivos xml&#8217;s.</p></blockquote>
<p>Neste mesmo package crie um arquivo chamado <strong>Cargo.hbm.xml</strong>, e adicione o seguinte conteúdo:</p>
<p><strong>Cargo.hbm.xml</strong></p>
<p>[xml]</p>
<p>[/xml]</p>
<p>Perceba que estamos mapeando nosso <strong>entity</strong> <strong>Cargo</strong> que foi criado no <a target="_blank" href="http://23.20.48.222/?p=103">post anterior</a> com a tabela  <strong>JAVAFLEX_CARGO </strong>criada recém.</p>
<p><strong>com.digows.artigos.JavaFlex.model.repository.hibernate</strong></p>
<blockquote><p><font color="#333333">Este package irá conter classes que implementam o <a target="_blank" href="http://www.javafree.org/content/view.jf?idContent=183">Pattern DAO</a> usando o <strong>Hibernate</strong>. Métodos de <a target="_blank" href="http://pt.wikipedia.org/wiki/CRUD">CRUD</a> e querys em geral usando o Hibernate deverão estar neste pacote estes separados por casos de uso.</font></p></blockquote>
<p>Neste mesmo package, vamos criar um DAO usando o hibernate para o nosso <strong>entity</strong> <strong>cargo</strong>, para isso, crie uma classe java chamada <strong>CargoHibernateDao,</strong>  e adicione o seguinte conteúdo:</p>
<p><strong>CargoHibernateDao.java</strong></p>
<p>[java]</p>
<p>package com.digows.artigos.JavaFlex.model.repository.hibernate;</p>
<p>import java.util.List;</p>
<p>import org.hibernate.SessionFactory;<br />
import org.springframework.beans.factory.annotation.Autowired;<br />
import org.springframework.beans.factory.annotation.Qualifier;<br />
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br />
import org.springframework.stereotype.Repository;</p>
<p>import com.digows.artigos.JavaFlex.model.entity.Cargo;<br />
import com.digows.artigos.JavaFlex.model.repository.CargoRepository;</p>
<p>@Repository(value=&#8221;cargoRepository&#8221;)<br />
public class CargoHibernateDao extends HibernateDaoSupport<br />
						implements CargoRepository {</p>
<p>	@Autowired<br />
	public CargoHibernateDao(@Qualifier(&#8220;sessionFactory&#8221;)SessionFactory factory) {<br />
		super.setSessionFactory(factory);<br />
	}</p>
<p>	public Cargo save(Cargo p_cargo) {<br />
		getHibernateTemplate().saveOrUpdate(p_cargo);<br />
		return p_cargo;// ID POPULADA<br />
	}</p>
<p>	public void remove(Cargo p_cargo) {<br />
		getHibernateTemplate().delete(p_cargo);<br />
	}</p>
<p>	public Cargo findById(Cargo p_cargo) throws Exception {<br />
		long id = p_cargo.getIdCargo();<br />
		p_cargo = (Cargo) getHibernateTemplate().get(Cargo.class, p_cargo.getIdCargo());</p>
<p>		if (p_cargo == null)<br />
			throw new Exception(&#8220;O Cargo com a ID: &#8220;+id+&#8221; do(a) &#8220;+Cargo.class.getSimpleName()+&#8221; não foi encontrada.&#8221;);<br />
		return p_cargo;<br />
	}</p>
<p>	@SuppressWarnings(&#8220;unchecked&#8221;)<br />
	public List getList() {<br />
		return (List) getHibernateTemplate().loadAll(Cargo.class);<br />
	}<br />
}</p>
<p>[/java]</p>
<p>Perceba que esta implementa apenas métodos de acesso ao banco de dados usando o hibernate. Nesta classe faço uso de annotations para que o container Spring faça o wire dos beans.</p>
<blockquote><p><strong>@Repository </strong></p>
<p>A anotação <strong>@Repository</strong> é mais um estereótipo que foi introduzido no Spring 2.0. Esta anotação é usada para indicar que uma classe funciona como um repositório (Veremos mais adiante o que é este pattern), esta anotação faz com que o Spring envie Exceptions da persistência a camada de serviço, vindas de <strong>DataAccessException, </strong>isto é deixa tranparênte a camada de serviço o tipo de repository que foi implementado.</p>
<p><strong>@Autowired</strong></p>
<p>A anotação <strong>@Autowired </strong>é usada para a injeção de depêndencia da sessionFactory do hibernate.</p>
<p><strong>@SuppressWarnings</strong></p>
<p>Faço uso da anotação <strong>@SuppressWarnings</strong>, apenas para o compilador não gerar um Warning no cast da List, uma vez que o <strong>Hibernate</strong> foi projetado sem o uso de <a target="_blank" href="http://www.mundooo.com.br/php/modules.php?name=News&amp;file=article&amp;sid=554">Generics</a>, ao usar <a target="_blank" href="http://www.mundooo.com.br/php/modules.php?name=News&amp;file=article&amp;sid=554">Generics</a> o compilador devolve um Warning.</p></blockquote>
<p>Perceba que esta classe implementa uma interface, está interface implementa o pattern <strong>Repository, </strong>este padrão já causou muita polêmica em forums Java como o GUJ por exemplo, recomendo a leitura deste post para entender o padrão:<br />
<a target="_blank" href="http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/" title="http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/">http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/</a></p>
<p><strong>com.digows.artigos.JavaFlex.model.repository</strong></p>
<blockquote><p>Este package irá conter interfaces do tipo <strong>repository</strong> que dará comportamentos a <strong>DAO&#8217;s</strong> sejam elas implementadas por DAO&#8217;s Hibernate, DAO&#8217;s JDBC, DAO&#8217;s iBatis e etc&#8230;</p></blockquote>
<p>Neste mesmo pacote, crie uma interface chamada <strong>CargoRepository </strong>com o seguinte conteúdo:</p>
<p><strong>CargoRepository.java</strong></p>
<p>[java]</p>
<p>package com.digows.artigos.JavaFlex.model.repository;</p>
<p>import java.util.List;<br />
import com.digows.artigos.JavaFlex.model.entity.Cargo;</p>
<p>public interface CargoRepository {</p>
<p>	void remove(Cargo p_cargo);<br />
	Cargo save(Cargo p_cargo);<br />
	Cargo findById(Cargo p_cargo) throws Exception;<br />
	List getList();<br />
}</p>
<p>[/java]</p>
<p>Ok! nossa persistência já foi programada, vamos agora alterar a classe <strong>CargoService </strong>que foi criado no post anterior, para que se comporte como uma classe de serviço gerenciada pelo container <strong>Spring</strong>.</p>
<p>Para isso, altere o nome da classe <strong>CargoService </strong>que está no package <strong>com.digows.artigos.JavaFlex.model.service </strong>para <strong>CargoServiceImpl </strong>e adicione este conteúdo:</p>
<p><strong>CargoServiceImpl.java</strong></p>
<p>[java]</p>
<p>package com.digows.artigos.JavaFlex.model.service;</p>
<p>import java.util.List;</p>
<p>import org.springframework.beans.factory.annotation.Autowired;<br />
import org.springframework.stereotype.Service;<br />
import org.springframework.transaction.annotation.Propagation;<br />
import org.springframework.transaction.annotation.Transactional;</p>
<p>import com.digows.artigos.JavaFlex.model.entity.Cargo;<br />
import com.digows.artigos.JavaFlex.model.repository.CargoRepository;</p>
<p>@Service(value=&#8221;cargoService&#8221;)<br />
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)<br />
public class CargoServiceImpl implements CargoService {</p>
<p>	private CargoRepository cargoRepository;</p>
<p>	@Autowired<br />
	public void setCargoRepository(CargoRepository cargoRepository) {<br />
		this.cargoRepository = cargoRepository;<br />
	}</p>
<p>	public Cargo save(Cargo p_cargo) throws Exception {<br />
		try {<br />
			this.cargoRepository.save(p_cargo);<br />
			return p_cargo;<br />
		} catch (Exception e) {<br />
			throw new Exception(&#8220;Não foi possível salvar.&#8221; +e.getCause());<br />
		}<br />
	}</p>
<p>	public void remove(Cargo p_cargo) throws Exception {<br />
		try {<br />
			this.cargoRepository.remove(p_cargo);<br />
		} catch (Exception e) {<br />
			throw new Exception(&#8220;Não foi possível excluir.&#8221; +e.getMessage());<br />
		}<br />
	}</p>
<p>	public Cargo findById(Cargo p_cargo) throws Exception {<br />
		try {<br />
			return this.cargoRepository.findById(p_cargo);<br />
		} catch (Exception e) {<br />
			throw new Exception(&#8220;Não foi possível procurar pela ID.&#8221;+e.getMessage());<br />
		}<br />
	}</p>
<p>	public List getList() throws Exception {<br />
		try {<br />
			return this.cargoRepository.getList();<br />
		} catch (Exception e) {<br />
			throw new Exception(&#8220;Não foi possível listar.&#8221;+e.getMessage());<br />
		}<br />
	}<br />
}</p>
<p>[/java]</p>
<p>Perceba que é uma classe de serviço simples, esta apenas tem a funcão de coodernar os Entities de domínio e fazer a persistência atráves de um repository.</p>
<blockquote><p><strong>@Service </strong></p>
<p>A anotação <strong>@Service</strong> é uma forma especializada da anotação <strong>@Component</strong>. É conveniente anotar as classes da camada de serviço com <strong>@Service </strong>para facilitar o processamento por ferramentas ou antecipar qualquer futuro serviço de capacidades específicas que podem ser adicionados a esta anotação.</p>
<p><strong>@Transactional</strong></p>
<p>Como o próprio nome diz, é um estereótipo que delega ao container que esta classe de serviço deve ser transicional.</p>
<p><strong>@Autowired</strong></p>
<p>A anotação <strong>@Autowired </strong>é usada para a injeção de depêndencia que será feita pelo container de uma implementação da interface <strong>CargoService</strong>.</p></blockquote>
<p>Nessa camada de serviço faço uso também do Pattern <a href="http://www.objectmentor.com/resources/articles/dip.pdf">DIP (Dependency Inversion Principle)</a>, por isso esta classe é uma implementação (CasoDeUsoService<strong>Impl)</strong> de uma interface de serviço, no caso a <strong>CargoService</strong>.</p>
<p>Para isso no pacote <strong>com.digows.artigos.JavaFlex.model.service</strong>, crie uma interface com o nome de <strong>CargoService</strong>, com este conteúdo:</p>
<p><strong>CargoService.java</strong></p>
<p>[java]</p>
<p>package com.digows.artigos.JavaFlex.model.service;</p>
<p>import java.util.List;</p>
<p>import com.digows.artigos.JavaFlex.model.entity.Cargo;</p>
<p>public interface CargoService {</p>
<p>	void remove(Cargo p_cargo) throws Exception;<br />
	Cargo save(Cargo p_cargo) throws Exception;<br />
	Cargo findById(Cargo p_cargo) throws Exception;<br />
	List getList() throws Exception;<br />
}</p>
<p>[/java]</p>
<p>Ok, com estes passos realizados, já concluímos a implementação do nosso model. A estrutura final deverá ser esta:</p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image11.png"><img border="0" width="347" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image-thumb10.png" alt="image" height="363" style="border-width:0;" /></a></p>
<p><strong>Configurando o SpringFramework com o Hibernate e o Blaze.</strong></p>
<p>No post anterior, configuramos o <strong>Tomcat</strong> para utilizar apenas o <strong>BlazeDS</strong>, agora precisamos adicionar mais as configurações  do <strong>SpringFramework.</strong></p>
<p>Para isso abra o arquivo <strong>JavaFlexWebContentWEB-INFweb.xml </strong>e altere deixando com este conteúdo:</p>
<p><strong>web.xml</strong></p>
<p>[xml]</p>
<p>	JavaFlex</p>
<p>	<!--
		///////////////////////////////
			Configuracao Spring 2.5
		///////////////////////////////
	--></p>
<p>		contextConfigLocation</p>
<p>			/WEB-INF/applicationContext.xml</p>
<p>			org.springframework.web.context.ContextLoaderListener</p>
<p>			org.springframework.web.context.request.RequestContextListener</p>
<p>	<!--
		///////////////////////////////
			Configuracao do BlazeDS
		///////////////////////////////
	--></p>
<p>		flex.class.path<br />
		/WEB-INF/flex/hotfixes</p>
<p>	<!-- MessageBroker Servlet --></p>
<p>		MessageBrokerServlet<br />
		MessageBrokerServlet</p>
<p>			flex.messaging.MessageBrokerServlet</p>
<p>			services.configuration.file<br />
			/WEB-INF/flex/services-config.xml</p>
<p>			flex.write.path<br />
			/WEB-INF/flex</p>
<p>		1</p>
<p>		MessageBrokerServlet<br />
		/messagebroker/*</p>
<p>		index.html<br />
		index.htm<br />
		index.jsp</p>
<p>[/xml]</p>
<p>Perceba na configuração do Spring, ele faz referência a um arquivo chamado <strong>applicationContext.xml</strong>, este arquivo é o que contém as configurações do Spring em si, então no mesmo diretório que se econtra o <strong>web.xml, </strong>crie um arquivo com o nome de <strong>applicationContext.xml </strong>e coloque este conteúdo:</p>
<p><strong>applicationContext.xml </strong></p>
<p>[xml]</p>
<p>	<!--
		//////////////////////////////////////
		Integração do Spring com o Hibernate
		//////////////////////////////////////
	--></p>
<p>	<!--
		Carregamento do Arquivo de Configuracoes do JDBC
	--></p>
<p>	<!--
		Configuracao do DataSource
	--></p>
<p>			${jdbc.driverClassName}</p>
<p>			${jdbc.url}</p>
<p>			${jdbc.username}</p>
<p>			${jdbc.password}</p>
<p>	<!--
		Hibernate SessionFactory
	--></p>
<p>		<!-- Carrega todos os HBM's --></p>
<p>					classpath:com/digows/artigos/JavaFlex/model/repository/hibernate/hbm/</p>
<p>		<!-- Configuracoes do Hibernate --></p>
<p>					org.hibernate.dialect.MySQLInnoDBDialect</p>
<p>				true<br />
				&lt;!&#8211;<br />
					Atualizar o Banco de dados de acordo com os arquivos de mapeamentos.<br />
					update<br />
				&#8211;&gt;</p>
<map>
</map>
<p>	<!--
		Transaction Manager
	--></p>
<p>	<!-- Habilita os Services para serem transicionais via a Annotation @Transactional --></p>
<p>	<!-- ============================== AOP DEFINITIONS ================================ --></p>
<p>	<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= --><br />
	<!--
		Activates various annotations to be detected in bean classes:
		Spring's @Required and @Autowired, as well as JSR 250's @Resource.
	--></p>
<p>	<!-- Carrega os Beans de Servico --></p>
<p>	<!-- Carrega os Beans DAO Hibernate --></p>
<p>[/xml]</p>
<p>Perceba que as configurações do banco de dados usado, delego a um arquivo <strong>.properties</strong>, também vou precisar configurar o <strong>log4j</strong> para a impressão de log&#8217;s. Por estética o bacana seria gerar um novo source-path que contenha tais arquivos <strong>properties</strong>.</p>
<blockquote><p>Crie um pasta na raiz do projeto com o nome de <strong>resources,</strong></p>
<p>De um botão direito sobre o projeto e clique em <strong>properties;</strong></p>
<p>Em <strong>Java Build Path</strong>, clique no botão <strong>AddFolder;</strong></p>
<p>Selecione a pasta <strong>resources, </strong>clique em <strong>ok</strong>, e marque a opção <strong>Allow output folders for source folders,</strong> e <strong>ok.</strong></p></blockquote>
<p>Dentro do package <strong>resources, </strong>crie um arquivo chamado <strong>jdbc.properties</strong>, e adicione o seguinte conteúdo:</p>
<p><strong>jdbc.properties</strong></p>
<pre class="brush: plain; title: ; notranslate">

# Properties file com as configuracoes do JDBC.
# Aplicado pelo PropertyPlaceholderConfigurer do Spring

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaflex
jdbc.username=root
jdbc.password=

#Properties que determina o dialeto do Banco de Dados.
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

</pre>
<p>e outro arquivo chamado <strong>log4j.properties </strong>com este conteúdo:</p>
<p><strong>log4j.properties </strong></p>
<pre class="brush: plain; title: ; notranslate">

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# set root logger level to debug and its only appender to mtf
log4j.rootLogger=INFO,development

# only for development purposes
log4j.appender.development=org.apache.log4j.ConsoleAppender
log4j.appender.development.layout=org.apache.log4j.PatternLayout
log4j.appender.development.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%F:%L) - %m%n

log4j.logger.noModule=FATAL
log4j.logger.org.springframework=WARN

# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=DEBUG

</pre>
<p>Uma outra modificação é necessária, está a mais importante, pois delega ao <strong>Blaze</strong>, que existe uma <strong>factory</strong> de beans criada pelo <strong>Spring</strong>.</p>
<blockquote><p>Essa factory deve ser implementada, porém já existe pronto na internet para uso, esta pode ser encontrada aqui:</p>
<p><a target="_blank" href="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;loc=en_us&amp;extid=1035406" title="Spring and Flex Integration">Spring and Flex Integration Factory Class</a></p>
<p>Baixe ela, e coloque por exemplo neste pacote:</p>
<p><strong>com.digows.artigos.JavaFlex.controller</strong></p>
<p><strong>*</strong><em>O  nome controller ficou sugestivo aqui, uma vez que está factory não tem comportamentos de um controller, porém como o Flex não faz uso do controller para controlar as actions que também não existe, achei bacana preservar o package colocando a factory de beans do Spring que será usada pelo Blaze neste pacote. Se alguém tiver uma idéia melhor de onde colocar a classe, estou aceitando opniões. </em></p></blockquote>
<p>Vamos então configurar o <strong>Blaze</strong>. Abra o arquivo <strong>JavaFlexWebContentWEB-INFflexservices-config.xml </strong>e altere deixando com este conteúdo:</p>
<p><strong>services-config.xml</strong></p>
<p>[xml]</p>
<p>	<!-- Spring factory registration --></p>
<p>				false</p>
<p>				[BlazeDS]<br />
				true<br />
				false<br />
				true<br />
				true</p>
<p>				Endpoint.*<br />
				Service.*<br />
				Message.*<br />
				DataService.*<br />
				Configuration</p>
<p>			true<br />
			20</p>
<p>				{context.root}/WEB-INF/flex/services-config.xml</p>
<p>				{context.root}/WEB-INF/flex/remoting-config.xml</p>
<p>			{context.root}/WEB-INF/web.xml</p>
<p>[/xml]</p>
<p>Perceba que mapeio o local da Factory. Agora é preciso atualizar nosso servico <strong>cargoService </strong>dentro do arquivo <strong>JavaFlexWebContentWEB-INFflexremoting-config.xml. </strong>Então abra e edite deixando com este conteúdo:</p>
<p><strong>remoting-config.xml</strong></p>
<p>[xml]</p>
<p>			spring<br />
			cargoService</p>
<p>[/xml]</p>
<p>Aqui só é importante observar que a tag <strong>&lt;source /&gt;</strong> mapeia o nome do bean do tipo serviço que foi delegado na annotation, no nosso caso na classe <strong>CargoServiceImpl</strong> perceba a annotation <strong>@Service(value=&#8221;cargoService&#8221;) </strong>e também a tag <strong>&lt;factory /&gt;</strong> que faz referência a configuração no arquivo <strong>services-config.xml</strong></p>
<p>Se tudo foi efetuado corretamente, ao você dar um botão direito no projeto e ir em <strong>Run As -&gt; Run On Server</strong>, ao clicar em salvar no fomulário de cadastro criado no post anterior, o seu objeto cargo vindo do Flex já será persistido! observe o console para isso.</p>
<p>Eu alterei o arquivo <strong>comdigowsartigosJavaFlexviewscreenCargoForm.mxml </strong>para que possa usar todos os métodos do CRUD <strong>Cargo</strong>. Segue como ficou:</p>
<p><strong>CargoForm.mxml</strong></p>
<p>[xml]</p>
<p>[/xml]</p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image82.png"><img border="0" width="244" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image8-thumb.png" alt="image" height="194" style="border-width:0;" /></a></p>
<p>Bom pessoal, acredito que com estes 2 artigos consegui atingir o objetivo de dar a comunidade <strong>Java</strong> uma proposta de interface produtiva e poderosa, e também a comunidade <strong>Flex </strong>uma proposta de uma arquitetura com <strong>Flex e Java, </strong>utilizando o <strong>Blaze Data Services.</strong></p>
<p>Faça mais testes, veja que o desenvolvimento é muito rápido! muito melhor do que se matar com tags <strong>html</strong> e funções em <strong>JavaScript</strong>.</p>
<p>Fora que você pode desenvolver com o <strong>Flex </strong>aplicando os conceitos de Orientação a Objetos, a começar pela tranferência de dados, no Flex chega Objetos! e não textos (XML, WebServices, Request/Response e afins).</p>
<p>Neste artigo não fiz uso de patterns para o desenvolvimento das telas em <strong>Flex</strong>, porém nos próximos artigos irei abordar detalhadamente como você pode arquiteturar seu código <strong>Flex</strong> visando ganhar manutenabilidade, escalabilidade, e reusabilidade.</p>
<p><strong>Tópico no Forum que contém detalhes sobre o download. Flex 2.0 e Flex 3.0</strong><br />
[<strong><a target="_blank" href="http://forum.flexbrasil.com.br/viewtopic.php?f=8&amp;t=46#p139">Link</a></strong>]</p>
<p>Obrigado a todos e um <strong>Beijão</strong> especial para minha querida <strong>Liz</strong>!</p>
<p>=*****</p>
<p>Abraços</p>
<p>o/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2008/01/27/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-2-final/feed/</wfw:commentRss>
			<slash:comments>120</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/spring.jpg" medium="image">
			<media:title type="html">spring</media:title>
		</media:content>

		<media:content url="http://www.hibernate.org/tpl/jboss/img/01_oben_logo.gif" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image-thumb9.png" medium="image">
			<media:title type="html">Library</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image-thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image8-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Integrando Adobe Flex + BlazeDS + SpringFramework + Hibernate &#8211; Uma Solu&#231;&#227;o OpenSource para Sistemas Web. (Parte 1)</title>
		<link>https://digows.com/2008/01/21/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/</link>
					<comments>https://digows.com/2008/01/21/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Mon, 21 Jan 2008 09:00:22 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[SpringFramework]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=103</guid>

					<description><![CDATA[Olá Pessoal, Hoje vou começar algo que estou prometendo há um bom tempo! A integração dos seguintes frameworks: Adobe Flex; Adobe BlazeDS; Spring Framework; Hibernate; Introdução No mundo de desenvolvimento WEB principalmente com Java, temos problemas quanto ao desenvolvimento de interfaces, como incompatibilidade entre browsers, desenvolviemento lento, e outros detalhes que muitos vivenciam diariamente. Existem [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Hoje vou começar algo que estou prometendo há um bom tempo! A integração dos seguintes frameworks:</p>
<blockquote><p><strong><font color="#333333"><a target="_blank" href="http://pt.wikipedia.org/wiki/Adobe_Flex">Adobe Flex;</a></font></strong></p>
<p><strong><font color="#333333"><a target="_blank" href="http://en.wikipedia.org/wiki/BlazeDS">Adobe BlazeDS;</a></font></strong></p>
<p><font color="#333333"><strong><a target="_blank" href="http://www.springframework.org/">Spring Framework;</a></strong></font></p>
<p><strong><font color="#333333"><a target="_blank" href="http://www.hibernate.org/">Hibernate;</a></font></strong></p></blockquote>
<h5>Introdução</h5>
<p>No mundo de desenvolvimento WEB principalmente com Java, temos problemas quanto ao desenvolvimento de interfaces, como  incompatibilidade entre browsers, desenvolviemento lento, e outros detalhes que muitos vivenciam diariamente.</p>
<p>Existem soluções que prometem como o <a target="_blank" href="http://www.javafree.org/wiki/JSF">JSF</a> por exemplo, mas como dizem <strong><em>&#8220;A primeira experiência em Flex o programador Java nunca esquece.&#8221; </em></strong>logo quero convidar você que vem do mundo do Java, para conhecer uma solução de desenvolvimento de interfaces com o AdobeFlex.</p>
<h5>Apresentando Adobe Flex e Adobe BlazeDS</h5>
<p><strong><em>Adobe Flex</em></strong></p>
<p>Do Flex não vou falar muito, também por que neste blog você pode encontrar muito conteúdo explicativo como por exemplo este link: <a target="_blank" href="http://23.20.48.222/?p=32">http://23.20.48.222/?p=32</a> algumas abordagens ali já estão desatualizadas, porém a essência é a mesma como por exemplo algumas vantagens de se usar Flex:</p>
<blockquote><p><font color="#333333">O Flex é executado a partir de uma máquina virtual, logo o programador apenas se preocupa em desenvolver a interface não em programar compatibilidade entre browsers.</font></p>
<p><font color="#333333">Você programa sua interface totalmente orientada a objetos, isso visa reuso de componentes, desenvolvimento de módulos e afins.</font></p>
<p><font color="#333333">Há várias maneiras de comunicar o Java com o Flex, mas em destaque é que você pode trocar objetos Java/Flex por um protocolo que provê compactação e tranferência binária, este é o <a target="_blank" href="http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf">AMF</a>.</font></p></blockquote>
<p><strong><em>Adobe BlazeDS</em></strong></p>
<p>O <strong>BlazeDS</strong> é um produto OpenSource (<strong>Licença LGPL v3</strong>) que corresponde à tecnologia JAVA server-side que dá suporte tanto para o Remoting assim como ao Messaging de objetos trocados entre o Java e o Flex/Flash.</p>
<p>Com o <strong>BlazeDS</strong> você pode gerar vários tipos de canais de conexão, um  destaque muito importante para toda a comunidade Flex/Flash mundial, é que o serviço de <strong>data-push</strong> também foi disponibilizado de graça!, para quem não conhece, é algo semelhante ao <a target="_blank" href="http://jacques.dsc.ufcg.edu.br/cursos/map/html/arqu/observer.htm">Pattern Observer</a>.</p>
<h5>Integrando o Adobe Flex com o BlazeDS</h5>
<p><strong>Requerimentos:</strong></p>
<blockquote><p><font color="#333333"><a target="_blank" href="http://www.eclipse.org/downloads/">Eclipse 3.3;</a></font></p>
<p><font color="#333333"><a target="_blank" href="http://labs.adobe.com/technologies/flex/flexbuilder3/">Adobe Flex Builder 3 Plugin;</a><br />
<em>*No título apresento como solução OpenSource, e o FlexBuilder 3 é pago, mas irei fazer uso apenas para facilitar o entendimento, caso seja estudante, baixe o <a target="_blank" href="http://www.flexregistration.com/">FlexBuilder 2</a> é de graça para estudantes ou afins, caso não, baixe o <a target="_blank" href="http://labs.adobe.com/technologies/flex/sdk/flex3sdk.html">Flex SDK</a> e compile com Ant ou com o <a target="_blank" href="http://forum.flexbrasil.com.br/viewtopic.php?f=5&amp;t=25">FlashDeveloper</a> que é de graça.</em></font></p>
<p><font color="#333333"><a target="_blank" href="http://labs.adobe.com/technologies/blazeds/">Adobe BlazeDS;</a><br />
<em>*É recomendável que baixe a <a target="_blank" href="http://livedocs.adobe.com/labs/blazeds/blazeds_devguide_12-12-07.pdf">documentação</a> do BlazeDS, para futuros estudos.</em></font></p>
<p><a target="_blank" href="http://tomcat.apache.org/download-60.cgi">Tomcat 6.0;</a></p></blockquote>
<p>Ok, Vamos começar!</p>
<blockquote><p>Extraia o Eclipse 3.3 em algum lugar, por exemplo <strong>C:/Desenvolvimento/Eclipse 3.3/</strong></p>
<p>Instale o Plugin do Flex no Eclipse, quando pedir o local aonde instalar o flex sdk, você pode selecionar em <strong>C:/Desenvolvimento/Frameworks/Adobe/</strong></p></blockquote>
<p>Após baixado o BlazeDS, perceba que ele vem vários arquivos, o que importa agora são os seguintes:</p>
<blockquote><p><font color="#333333"><strong>blazeds-samples.war</strong></font></p>
<p><font color="#333333"><strong>blazeds.war</strong></font></p></blockquote>
<p>No <strong>blazeds-samples.war </strong>como o próprio nome diz, contém aplicações de exemplo, como implementação do data-push, um chat, e etc&#8230;</p>
<p>O <strong>blazeds.war </strong>contém tudo o que é necessário para podermos configurar nossa aplicação.</p>
<p>Você deve ter percebido que no arquivo que você baixou o BlazeDS, contém um Tomcat já com todas as libs necessárias e etc.. Algumas libs ali tem reelevância como a <strong>flex-tomcat-common.jar</strong> e <strong>flex-tomcat-server.jar</strong> mas vamos deixar isso para outro artigo =)</p>
<p>Apesar do BlazeDS já vir com um Tomcat, eu estarei usando meu próprio Tomcat 6.0.</p>
<p>Abra seu Eclipse, e faça como no screencast abaixo que mostra como criar seu projeto no Eclipse 3.3:</p>
<p><a target="_blank" href="http://23.20.48.222/downloads/screencast/JavaFlex/JavaFlex_Parte1_Criando_o_Projeto/JavaFlex_Parte1_Criando_o_Projeto.htm">Link Externo</a></p>
<p><em>*Se na aba &#8220;<strong>Problems</strong>&#8221; estiver com o erro &#8220;<strong>Cannot create HTML wrapper. Right-click here to recreate folder html-template.</strong>&#8221; clique com o botão direito, e clique em <strong>Recreate HTML Templates.</strong> Considero isso um bug do FlexBuilder.</em></p>
<p><span id="more-140"></span><br />
Com o projeto criado, vamos adicionar as libs necessárias para a execução do BlazeDS, para isso abra o <strong>blazeds.war</strong> (Com um Winrar da vida) e copie todos os Jars contidos na pasta <strong>WEB-INFlib </strong>para o nosso projeto na pasta <strong>WebContentWEB-INFlib.</strong></p>
<p>Com as Libs adicionadas, vamos criar um serviço no java que servirá como exemplo de como o Flex pode acessar uma classe java através do BlazeDS.</p>
<p>Para isso na pasta <strong>src_java, </strong>crie uma estrutura de pacotes, por exemplo:</p>
<p><strong>com/digows/artigos/JavaFlex/model/service/</strong><br />
<strong>com/digows/artigos/JavaFlex/model/entity/ </strong></p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image7.png"><img border="0" width="327" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image-thumb6.png" height="310" style="border-width:0;" /></a></p>
<p>Dentro do package <strong>entity</strong> crie uma classe java com o nome de <strong>Cargo </strong>com o seguinte conteúdo:</p>
<p><strong>Cargo.java</strong><br />
[java]</p>
<p>package com.digows.artigos.JavaFlex.model.entity;</p>
<p>public class Cargo {</p>
<p>	private long idCargo;<br />
	private String dsCargo;</p>
<p>	public long getIdCargo() {<br />
		return idCargo;<br />
	}<br />
	public void setIdCargo(long idCargo) {<br />
		this.idCargo = idCargo;<br />
	}<br />
	public String getDsCargo() {<br />
		return dsCargo;<br />
	}<br />
	public void setDsCargo(String dsCargo) {<br />
		this.dsCargo = dsCargo;<br />
	}<br />
}</p>
<p>[/java]</p>
<p><strong>Entities</strong> (ou Entidades, nenhuma relação com Entity Beans) são objetos que possuem uma identidade única.</p>
<p>Um carrinho de compras numa loja virtual web não é igual a outro, não importa que possuam os mesmos produtos, o carrinho A é o carrinho do usuário A, o carrinho B é do usuário B. Mesmo que contenham os mesmos produtos você não pode exibir o carrinho B ao usuário A, eles são diferentes! O carrinho neste exemplo segue o Padrão <strong>Entity</strong>, ele é uma entidade de negócios única.</p>
<p>Dentro do package <strong>services</strong> crie uma classe java com o nome de <strong>CargoService </strong>com o seguinte conteúdo<strong>:</strong></p>
<p><strong>CargoService.java</strong><br />
[java]</p>
<p>package com.digows.artigos.JavaFlex.model.service;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import com.digows.artigos.JavaFlex.model.entity.Cargo;</p>
<p>public class CargoService {</p>
<p>	public Cargo save(Cargo p_cargo) {<br />
		System.out.println(&#8220;Salvou o Cargo: &#8220;+p_cargo.getDsCargo());<br />
		return p_cargo;<br />
	}</p>
<p>	public void remove(Cargo p_cargo) {<br />
		System.out.println(&#8220;Excluiu o Cargo: &#8220;+p_cargo.getDsCargo());<br />
	}</p>
<p>	public List getList() {<br />
		return new ArrayList();<br />
	}</p>
<p>	public Cargo findByPrimaryKey() {<br />
		return new Cargo();<br />
	}<br />
}</p>
<p>[/java]</p>
<p><strong>Services</strong> são classes que não implementam diretamente as regras de negócio da aplicação, apenas coordenam a interação entre os componentes, elas são quase sempre beans gerenciados pelo Spring. É muito importante que as classes do tipo <strong>Services</strong> não implementem as regras de negócio, elas apenas atuam como <strong>Façades</strong> coordenando as interações.</p>
<p>O <strong>CargoService</strong> claro não proverá persistência a um banco de dados, os sysouts ali são apenas para abstração da intragração.</p>
<p>Com as classes javas feitas, vamos a configuração dos channels do BlazeDS, para isso no web.xml contido dentro da pasta <strong>WebContentWEB-INFweb.xml, </strong>deixe como mostrado abaixo:</p>
<p><strong>web.xml</strong></p>
<p>[xml]</p>
<p>	ArquiteturaJavaFlex</p>
<p>	<!-- MessageBroker Servlet --></p>
<p>		MessageBrokerServlet<br />
		MessageBrokerServlet</p>
<p>			flex.messaging.MessageBrokerServlet</p>
<p>			services.configuration.file<br />
			/WEB-INF/flex/services-config.xml</p>
<p>			flex.write.path<br />
			/WEB-INF/flex</p>
<p>		1</p>
<p>		MessageBrokerServlet<br />
		/messagebroker/*</p>
<p>		index.html<br />
		index.htm<br />
		index.jsp</p>
<p>[/xml]</p>
<p>Perceba que ao gerar a Servlet Java, é passado por parâmetro um arquivo dentro da pasta <strong>WebContentWEB-INFflex, </strong>crie um arquivo<strong> </strong>chamado <strong>services-config.xml </strong>como referênciado, este arquivo é o que contém <strong>Factorys, Channels, LogConfigs. </strong>Nós vamos usar apenas um tipo de serviço que o BlazeDS implementa, que o canal de AMF3 simples, para isso adicione o seguinte conteúdo:</p>
<p><strong>services-config.xml</strong></p>
<p>[xml]</p>
<p>                false</p>
<p>        <!-- You may also use flex.messaging.log.ServletLogTarget --></p>
<p>                [BlazeDS]<br />
                false<br />
                false<br />
                true<br />
                false</p>
<p>                &lt;!&#8211;Endpoint.*&#8211;&gt;<br />
                &lt;!&#8211;Service.*&#8211;&gt;<br />
                Message.*<br />
                DataService.*<br />
                Configuration</p>
<p>            true<br />
            20<br />
            {context.root}/WEB-INF/flex/services-config.xml<br />
            {context.root}/WEB-INF/flex/remoting-config.xml<br />
            {context.root}/WEB-INF/web.xml</p>
<p>[/xml]</p>
<p>Perceba que é feito um include em um arquivo chamado: <strong>remoting-config.xml</strong>, então crie um arquivo com este nome na pasta <strong>WebContentWEB-INFflex.</strong> Este arquivo contém alguns <strong>adapters, </strong>e nossos <strong>destinations</strong>, que nada mais é que o mapeamento das nossas classes de serviços no java. Para isso adicione o seguinte conteúdo:</p>
<p><strong>remoting-config.xml</strong></p>
<p>[xml]</p>
<p>				com.digows.artigos.JavaFlex.model.service.CargoService</p>
<p>[/xml]</p>
<p>A estrutura deverá ficar igual apresentado abaixo:</p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image8.png"><img border="0" width="328" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image-thumb7.png" alt="image" height="374" style="border-width:0;" /></a></p>
<p>Para testar se tudo está ok, de um botão direito sobre o Projeto <strong>JavaFlex</strong>, e clique em <strong>Run As -&gt; Run on Server.</strong> Na proxima janela aberta, em <strong>server runtime</strong> deixe seleciona o &#8220;<strong>Apache Tomcat v6.0</strong>&#8220;<strong> </strong>e clique em <strong>finish</strong>,  o Servidor irá iniciar, observer a aba <strong>Console</strong> para verificar possíveis erros. Se alguma Exception tiver ocorrida, verifique os passos e faça novamente.</p>
<h5>Acessando o serviço Java através do remoting do BlazeDS</h5>
<p>Como nosso serviço já foi levantado, basta gerarmos um form simples para testar nosso serviço, para isso na pasta <strong>src_flex</strong>, crie a seguinte estrutura de pastas:</p>
<p><strong>com/digows/artigos/JavaFlex/view/entity/</strong><br />
<strong>com/digows/artigos/JavaFlex/view/screen/</strong></p>
<p><a target="_blank" href="http://23.20.48.222/wp-content/uploads/2008/01/image9.png"><img border="0" width="333" src="https://i0.wp.com/23.20.48.222/wp-content/uploads/2008/01/image-thumb8.png" height="464" style="border-width:0;" /></a></p>
<p>Dentro do package <strong>Entity</strong> crie uma Classe ActionScript com o nome de <strong>Cargo</strong> com o seguinte conteúdo:</p>
<p><strong>Cargo.as</strong><br />
[as]</p>
<p>package com.digows.artigos.JavaFlex.view.entity<br />
{<br />
	[RemoteClass(alias=&#8221;com.digows.artigos.JavaFlex.model.entity.Cargo&#8221;)]<br />
	[Bindable]<br />
	public class Cargo<br />
	{<br />
		public var idCargo:Number;<br />
		public var dsCargo:String;<br />
	}<br />
}</p>
<p>[/as]</p>
<p>A Classe <strong>Cargo</strong> do Flex, é nada mais nada menos do que o espelho do <strong>Entity </strong>do java, nesta classe não realizei get&#8217;s set&#8217;s. Para fazer o espelho dos objetos usei a <strong>metatag [RemoteClass]</strong> mapeando a localização exata (Com package e nome da Classe) da mesma classe no java. A <strong>metatag Bindable</strong> é uma annotation muito importante, mais agora vamos apenas abstrair ela.</p>
<p>E dentro do package <strong>Screen, </strong>crie um arquivo MXML com o nome de CargoForm com o seguinte conteúdo:</p>
<p><strong>CargoForm.mxml </strong></p>
<p>[xml]</p>
<p>[/xml]</p>
<p>Perceba que acoplei muito código neste arquivo, isto não é uma boa prática, nos próximos artigos irei desaclopar as responsabilidades em camadas.</p>
<p>Para testar se tudo está ok, no arquivo <strong>JavaFlex.mxml</strong> que está na raiz da pasta <strong>src_flex</strong> renomeie para <strong>index.mxml</strong>, de um botão direito e clique em <strong>Set as Default Application,</strong> e deixe ele com o seguinte conteúdo:</p>
<p><strong>index.mxml</strong></p>
<p>[xml]</p>
<p>[/xml]</p>
<p>E para finalizar vamos dizer ao compilador do Flex que existe um servidor de AMF levantado, para isso de um botão direito no projeto <strong>JavaFlex</strong> <strong>-&gt; Properties -&gt; Selecione Flex Compiler -&gt; em Additional compiler arguments</strong> adicione a linha e ok:</p>
<blockquote><p>-services &#8220;../WebContent/WEB-INF/flex/services-config.xml&#8221;</p></blockquote>
<p>Para Executar, de um botão direito sobre o projeto <strong>JavaFlex</strong>, e clique em <strong>Run As -&gt; Run on Server e Finish.</strong></p>
<p>Se tudo correr bem, você verá a descrição que você digitou no flex aparecerá no console do Tomcat.</p>
<p>Bom finalizo aqui a primeira parte desta poderosa integração, logo logo posto o resto.</p>
<p><strong>Link do Source do Projeto:<br />
</strong><a target="_blank" href="http://23.20.48.222/downloads/postagens/javaflex/JavaFlex_part1.rar">Download</a></p>
<p>Abraço Pessoal!!</p>
<p>o/</p>
<p>Te Amuh Liz!! =******</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2008/01/21/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/feed/</wfw:commentRss>
			<slash:comments>93</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image-thumb6.png" medium="image" />

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image-thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://23.20.48.222/wp-content/uploads/2008/01/image-thumb8.png" medium="image" />
	</item>
		<item>
		<title>Forum sobre AdobeFlex!</title>
		<link>https://digows.com/2008/01/16/forum-sobre-adobeflex/</link>
					<comments>https://digows.com/2008/01/16/forum-sobre-adobeflex/#comments</comments>
		
		<dc:creator><![CDATA[Rodrigo Pereira Fraga]]></dc:creator>
		<pubDate>Wed, 16 Jan 2008 23:50:36 +0000</pubDate>
				<category><![CDATA[Random Thoughts]]></category>
		<guid isPermaLink="false">http://23.20.48.222/?p=102</guid>

					<description><![CDATA[Ol&#225; Pessoal!! =) &#201; com muito prazer que divulgo a todos que o forum sobre AdobeFlex ficou pronto! Est&#225; bem bacana, utilizamos o PhpBB3 que veio com um layout muito mais atrativo. http://forum.flexbrasil.com.br/ O forum tem a inten&#231;&#227;o de unir mais a comunidade, e est&#225; voltado para aqueles: Que n&#227;o conhece a tecnlogia; Que est&#227;o [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ol&#225; Pessoal!!</p>
<p>=)</p>
<p>&#201; com muito prazer que divulgo a todos que o forum sobre AdobeFlex ficou pronto! Est&#225; bem bacana, utilizamos o PhpBB3 que veio com um layout muito mais atrativo.</p>
<p><a href="http://forum.flexbrasil.com.br/" target="_blank">http://forum.flexbrasil.com.br/</a></p>
<p>O forum tem a inten&#231;&#227;o de unir mais a comunidade, e est&#225; voltado para aqueles:</p>
<ol>
<li>Que n&#227;o conhece a tecnlogia; </li>
<li>Que est&#227;o come&#231;ando a aprender; </li>
<li>Que j&#225; est&#227;o em um n&#237;vel avan&#231;ado; </li>
</ol>
<p>&#160;</p>
<p>Acredito que ficou muito bom, pesso que entre e confira!! e tamb&#233;m divulguem para que a comunidade cres&#231;a&#160; o mais r&#225;pido o poss&#237;vel!</p>
<p>Abra&#231;os e at&#233; mais!</p>
<p>o/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://digows.com/2008/01/16/forum-sobre-adobeflex/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
		
		<media:content url="https://1.gravatar.com/avatar/a1d64d422485bf34bbb51dd88f028666098b4ebfb0a42b60f17a72a68041cc3d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rodrigopfraga</media:title>
		</media:content>
	</item>
	</channel>
</rss>
