<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Loiane Groner</title><link>http://www.loiane.com</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Loiane" /><description>Java, desenvolvimento e tecnologia</description><language>en</language><lastBuildDate>Thu, 02 Sep 2010 04:30:50 PDT</lastBuildDate><generator>http://wordpress.org/?v=3.1-alpha</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Loiane" /><feedburner:info uri="loiane" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><feedburner:emailServiceId>Loiane</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>ExtJS, Spring MVC 3 e Hibernate 3.5: Exemplo de um CRUD Grid</title><link>http://feedproxy.google.com/~r/Loiane/~3/NYJ9PGvASPo/</link><category>Ext JS</category><category>Hibernate</category><category>Spring</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Thu, 02 Sep 2010 04:30:50 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1764</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Este tutorial demonstra como implementar um CRUD Grid (Create, Read, Update, Delete) usando ExtJS, Spring MVC 3 e Hibernate 3.5</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/03/extjs_spring_crud_grid.png"><img class="aligncenter size-full wp-image-1643" title="extjs_spring_crud_grid" src="http://www.loiane.com/wp-content/uploads/2010/03/extjs_spring_crud_grid.png" alt="" width="552" height="291" /></a></p>
<p style="text-align: justify;">O que geralmente queremos fazer com os dados</p>
<ul style="text-align: justify;">
<li>Create (Criar) &#8211; (Insert)</li>
<li>Read (Ler/Visualizar) &#8211; (Select)</li>
<li>Update (Atualizar) &#8211; (Update)</li>
<li>Delete (Deletar) &#8211; (Delete)</li>
</ul>
<p style="text-align: justify;">Até a versão 3.0 do ExtJS, podíamos apenas LER dados utilizando o componente dataGrid. Se você quisesse fazer um update, insert ou delete, você tinha que codificar funções específicas para essas ações no lado ExtJS. Com a versão 3.0 (e versões mais recentes) do ExtJS, a biblioteca javascript introduziu o ext.data.writer, e você não tem todo aquele trabalho de criar as funções específicas, pode utilizar o Writer para ter um CRUD Grid.</p>
<p style="text-align: justify;">Mas o que é preciso para ter todas as funcionalidades funcionando apenas com o uso desse writer?</p>
<p style="text-align: justify;">No exemplo desse tutorial, estou usando JSON como formato de dados para troca de informações entre brwoser e servidor.</p>
<h3>Código ExtJS</h3>
<p style="text-align: justify;">Primeiro, é preciso criar um Ext.data.JsonWriter:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
 // The new DataWriter component.
    var writer = new Ext.data.JsonWriter({
        encode: true,
        writeAllFields: true
    });
</pre>
<p>Onde writeAllFields significa que queremos enviar todos os campos do registro para o banco de dados. identifies that we want to write all the fields from the record to the database. Se você tem uma estrutura de dados um pouco complicada ou o usuário irá fazer muitas iterações de update, é melhor deixar setado como false.</p>
<p>Por exemplo, Essa é a declaração da minha estrutura de dados no ExtJS:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var Contact = Ext.data.Record.create([
	{name: 'id'},
    {
        name: 'name',
        type: 'string'
    }, {
        name: 'phone',
        type: 'string'
    }, {
        name: 'email',
        type: 'string'
    }]);
</pre>
<p style="text-align: justify;">Se eu apenas atualizar o nome do contato, a aplicação irá apenas enviar o nome do contato e a id do mesmo para o servidor dizendo que foi atualizado (se o campo writeallfields estiver como false). Se tiver setado como true, irá enviar todos os campos, e o trabalho para descobrir o que sofreu alteração ficará para o server. Como o hibernate possui o método saveOrUpdate, precisamos enviar o objeto completo para o server, pois o hibernate descobre sozinho o que é preciso fazer update ou não.</p>
<p>Agora, é necessário configurar o proxy, como esse:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var proxy = new Ext.data.HttpProxy({
        api: {
            read : 'contact/view.action',
            create : 'contact/create.action',
            update: 'contact/update.action',
            destroy: 'contact/delete.action'
        }
    });
</pre>
<p>E só para constar, é assim que meu reader se parece:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var reader = new Ext.data.JsonReader({
        totalProperty: 'total',
        successProperty: 'success',
        idProperty: 'id',
        root: 'data',
        messageProperty: 'message'  // &lt;-- New &quot;messageProperty&quot; meta-data
    },
    Contact);
</pre>
<p>O próximo passo é juntat tudo (writer, proxy e reader) no objeto store:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
 // Typical Store collecting the Proxy, Reader and Writer together.
    var store = new Ext.data.Store({
        id: 'user',
        proxy: proxy,
        reader: reader,
        writer: writer,  // &lt;-- plug a DataWriter into the store just as you would a Reader
        autoSave: false // &lt;-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton.
    });
</pre>
<p style="text-align: justify;">O autosave significa que deseja salvar as alterações automaticamente no servidor (não precisa de um botão salvar na tela, assim que o usuário atualizar, deleter ou criar um novo dado, será enviado automaticamente para o servidor). Para este exemplo, implementei um botão salvar, assim, qualquer registro ou dado que for adicionado ou alterado terá uma marcação vermelha (no canto superior esquerdo da célula), assim quando o evento (ou botão) salvar for disparado, serão enviados para o servidor os dados que sofreram alteração (marcados com o flag vermelho). Você pode fazer múltiplos updates e enviar todos para o servidor em apenas uma vez (Observe como isso foi tratado no código da classe de serviço no código fonte desse projeto).</p>
<p>E para deixar a vida ainda mais fácil (afinal, pra isso que usamos bibliotecas como ExtJS <img src='http://www.loiane.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), vamos usar o plugin RowEditor, que permite a edição dos dados de forma muito simples. Tudo o que precisa fazer para usar esse plugin é primeiro adicionar os arquivos necessários na sua página HTML (ou JSP, ou outra extensão!):</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;!-- Row Editor plugin css --&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/css/rowEditorCustom.css&quot; /&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/shared/examples.css&quot; /&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/css/RowEditor.css&quot; /&gt;

&lt;!-- Row Editor plugin js --&gt;
	&lt;script src=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/RowEditor.js&quot;&gt;&lt;/script&gt;
</pre>
<p>E adicionar o plugin na declaração do grid:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var editor = new Ext.ux.grid.RowEditor({
        saveText: 'Update'
    });

    // create grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {header: &quot;NAME&quot;,
             width: 170,
             sortable: true,
             dataIndex: 'name',
             editor: {
                xtype: 'textfield',
                allowBlank: false
            }},
            {header: &quot;PHONE #&quot;,
             width: 150,
             sortable: true,
             dataIndex: 'phone',
             editor: {
                 xtype: 'textfield',
                 allowBlank: false
            }},
            {header: &quot;EMAIL&quot;,
             width: 150,
             sortable: true,
             dataIndex: 'email',
             editor: {
                xtype: 'textfield',
                allowBlank: false
            }})}
        ],
        plugins: [editor],
        title: 'My Contacts',
        height: 300,
        width:610,
		frame:true,
		tbar: [{
            iconCls: 'icon-user-add',
            text: 'Add Contact',
            handler: function(){
                var e = new Contact({
                    name: 'New Guy',
                    phone: '(000) 000-0000',
                    email: 'new@loianetest.com'
                });
                editor.stopEditing();
                store.insert(0, e);
                grid.getView().refresh();
                grid.getSelectionModel().selectRow(0);
                editor.startEditing(0);
            }
        },{
            iconCls: 'icon-user-delete',
            text: 'Remove Contact',
            handler: function(){
                editor.stopEditing();
                var s = grid.getSelectionModel().getSelections();
                for(var i = 0, r; r = s[i]; i++){
                    store.remove(r);
                }
            }
        },{
            iconCls: 'icon-user-save',
            text: 'Save All Modifications',
            handler: function(){
                store.save();
            }
        }]
    });
</pre>
<h3>Código Java</h3>
<p>E Finalmente, precisamos de código no lado servidor.</p>
<h4>Controller:</h4>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.web;

@Controller
public class ContactController  {

	private ContactService contactService;

	@RequestMapping(value=&quot;/contact/view.action&quot;)
	public @ResponseBody Map&lt;String,? extends Object&gt; view() throws Exception {

		try{

			List&lt;Contact&gt; contacts = contactService.getContactList();

			return getMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error retrieving Contacts from database.&quot;);
		}
	}

	@RequestMapping(value=&quot;/contact/create.action&quot;)
	public @ResponseBody Map&lt;String,? extends Object&gt; create(@RequestParam Object data) throws Exception {

		try{

			List&lt;Contact&gt; contacts = contactService.create(data);

			return getMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to create contact.&quot;);
		}
	}

	@RequestMapping(value=&quot;/contact/update.action&quot;)
	public @ResponseBody Map&lt;String,? extends Object&gt; update(@RequestParam Object data) throws Exception {
		try{

			List&lt;Contact&gt; contacts = contactService.update(data);

			return getMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to update contact.&quot;);
		}
	}

	@RequestMapping(value=&quot;/contact/delete.action&quot;)
	public @ResponseBody Map&lt;String,? extends Object&gt; delete(@RequestParam Object data) throws Exception {

		try{

			contactService.delete(data);

			Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(3);
			modelMap.put(&quot;success&quot;, true);

			return modelMap;

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to delete contact.&quot;);
		}
	}

	private Map&lt;String,Object&gt; getMap(List&lt;Contact&gt; contacts){

		Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(3);
		modelMap.put(&quot;total&quot;, contacts.size());
		modelMap.put(&quot;data&quot;, contacts);
		modelMap.put(&quot;success&quot;, true);

		return modelMap;
	}

	private Map&lt;String,Object&gt; getModelMapError(String msg){

		Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(2);
		modelMap.put(&quot;message&quot;, msg);
		modelMap.put(&quot;success&quot;, false);

		return modelMap;
	}

	@Autowired
	public void setContactService(ContactService contactService) {
		this.contactService = contactService;
	}

}
</pre>
<p>Algumas observações:</p>
<p style="text-align: justify;">No Spring 3, é possível obter os objetos do request diretamente nos parâmetros do método utilizando a anotação @RequestParam. Não sei porque, mas não funcionou com o CRUD do ExtJS. Tive que deixar como Object e fazer o parser de JSON-Objeto &#8220;na mão&#8221;. Por isso que utilizei uma classe Util &#8211; para fazer o parser do Objeto do request para a minha classe POJO. Se souber de um jeito para consertar isso, por favor, deixe um comentário ou entre em contato. Realmente quero saber a solução! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Classe de Serviço:</h4>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.service;

@Service
public class ContactService {

	private ContactDAO contactDAO;
	private Util util;

	@Transactional(readOnly=true)
	public List&lt;Contact&gt; getContactList(){

		return contactDAO.getContacts();
	}

	@Transactional
	public List&lt;Contact&gt; create(Object data){

        List&lt;Contact&gt; newContacts = new ArrayList&lt;Contact&gt;();

		List&lt;Contact&gt; list = util.getContactsFromRequest(data);

		for (Contact contact : list){
			newContacts.add(contactDAO.saveContact(contact));
		}

		return newContacts;
	}

	@Transactional
	public List&lt;Contact&gt; update(Object data){

		List&lt;Contact&gt; returnContacts = new ArrayList&lt;Contact&gt;();

		List&lt;Contact&gt; updatedContacts = util.getContactsFromRequest(data);

		for (Contact contact : updatedContacts){
			returnContacts.add(contactDAO.saveContact(contact));
		}

		return returnContacts;
	}

	@Transactional
	public void delete(Object data){

		//it is an array - have to cast to array object
		if (data.toString().indexOf('[') &gt; -1){

			List&lt;Integer&gt; deleteContacts = util.getListIdFromJSON(data);

			for (Integer id : deleteContacts){
				contactDAO.deleteContact(id);
			}

		} else { //it is only one object - cast to object/bean

			Integer id = Integer.parseInt(data.toString());

			contactDAO.deleteContact(id);
		}
	}

	@Autowired
	public void setContactDAO(ContactDAO contactDAO) {
		this.contactDAO = contactDAO;
	}

	@Autowired
	public void setUtil(Util util) {
		this.util = util;
	}
}
</pre>
<h4>Classe Contato &#8211; POJO:</h4>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.model;

@JsonAutoDetect
@Entity
@Table(name=&quot;CONTACT&quot;)
public class Contact {

	private int id;
	private String name;
	private String phone;
	private String email;

	@Id
	@GeneratedValue
	@Column(name=&quot;CONTACT_ID&quot;)
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(name=&quot;CONTACT_NAME&quot;, nullable=false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Column(name=&quot;CONTACT_PHONE&quot;, nullable=false)
	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	@Column(name=&quot;CONTACT_EMAIL&quot;, nullable=false)
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
}
</pre>
<h4>Classe DAO:</h4>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.dao;

@Repository
public class ContactDAO implements IContactDAO{

	private HibernateTemplate hibernateTemplate;

	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		hibernateTemplate = new HibernateTemplate(sessionFactory);
	}

	@SuppressWarnings(&quot;unchecked&quot;)
	@Override
	public List&lt;Contact&gt; getContacts() {
		return hibernateTemplate.find(&quot;from Contact&quot;);
	}

	@Override
	public void deleteContact(int id){
		Object record = hibernateTemplate.load(Contact.class, id);
		hibernateTemplate.delete(record);
	}

	@Override
	public Contact saveContact(Contact contact){
		hibernateTemplate.saveOrUpdate(contact);
		return contact;
	}
}
</pre>
<h4>Classe Util:</h4>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.util;

@Component
public class Util {

	public List&lt;Contact&gt; getContactsFromRequest(Object data){

		List&lt;Contact&gt; list;

		//it is an array - have to cast to array object
		if (data.toString().indexOf('[') &gt; -1){

			list = getListContactsFromJSON(data);

		} else { //it is only one object - cast to object/bean

			Contact contact = getContactFromJSON(data);

			list = new ArrayList&lt;Contact&gt;();
			list.add(contact);
		}

		return list;
	}

	private Contact getContactFromJSON(Object data){
		JSONObject jsonObject = JSONObject.fromObject(data);
		Contact newContact = (Contact) JSONObject.toBean(jsonObject, Contact.class);
		return newContact;
	}
)
	private List&lt;Contact&gt; getListContactsFromJSON(Object data){
		JSONArray jsonArray = JSONArray.fromObject(data);
		List&lt;Contact&gt; newContacts = (List&lt;Contact&gt;) JSONArray.toCollection(jsonArray,Contact.class);
		return newContacts;
	}

	public List&lt;Integer&gt; getListIdFromJSON(Object data){
		JSONArray jsonArray = JSONArray.fromObject(data);
		List&lt;Integer&gt; idContacts = (List&lt;Integer&gt;) JSONArray.toCollection(jsonArray,Integer.class);
		return idContacts;
	}
}
</pre>
<p style="text-align: justify;">Se quiser visualizar o código inteiro dessa app de exemplo (ou fazer o donwload do código completo), visite o meu repositório do GitHub: <a href="http://github.com/loiane/extjs-crud-grid-spring-hibernate" target="_blank">http://github.com/loiane/extjs-crud-grid-spring-hibernate</a></p>
<p style="text-align: justify;">Este post foi um pedido de alguns leitores do<a href="http://www.loiane.com/2010/03/extjs-e-spring-framework-exemplo-de-um-crud-grid/" target="_blank"> post anterior de CRUD Grid</a> (<a href="http://loianegroner.com/2010/03/extjs-and-spring-mvc-framework-crud-datagrid-example/" target="_blank">e do blog em inglês</a>), além de ter recebido alguns emails. Fiz alguns ajustes em relação ao post anterior, mas a idéia ainda é a mesma. Espero ter respondido a todas as perguntas em relação a esse assunto. <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1764&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/hgqW9ncWLjw7BT8j6P7ZVEmhNFE/0/da"><img src="http://feedads.g.doubleclick.net/~a/hgqW9ncWLjw7BT8j6P7ZVEmhNFE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hgqW9ncWLjw7BT8j6P7ZVEmhNFE/1/da"><img src="http://feedads.g.doubleclick.net/~a/hgqW9ncWLjw7BT8j6P7ZVEmhNFE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=NYJ9PGvASPo:fx3FTUx2BZ8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=NYJ9PGvASPo:fx3FTUx2BZ8:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=NYJ9PGvASPo:fx3FTUx2BZ8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/NYJ9PGvASPo" height="1" width="1"/>]]></content:encoded><description>Este tutorial demonstra como implementar um CRUD Grid (Create, Read, Update, Delete) usando ExtJS, Spring MVC 3 e Hibernate 3.5 O que geralmente queremos fazer com os dados Create (Criar) &amp;#8211; (Insert) Read (Ler/Visualizar) &amp;#8211; (Select) Update (Atualizar) &amp;#8211; (Update) Delete (Deletar) &amp;#8211; (Delete) Até a versão 3.0 do ExtJS, podíamos apenas LER dados utilizando [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/09/extjs-spring-mvc-3-e-hibernate-3-5-exemplo-de-um-crud-grid/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.loiane.com/2010/09/extjs-spring-mvc-3-e-hibernate-3-5-exemplo-de-um-crud-grid/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-spring-mvc-3-e-hibernate-3-5-exemplo-de-um-crud-grid</feedburner:origLink></item><item><title>Como Redimensionar ExtJS Panel, Grid, ou Outro Componente Quando Redimensionar o Browser</title><link>http://feedproxy.google.com/~r/Loiane/~3/Dv5E6elDTGE/</link><category>Ext JS</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Tue, 24 Aug 2010 04:30:03 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1759</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Este post mostrará como redimensionar um ExtJS Panel, Grid, ou qualquer outro componente quando redimensionar a janela do browser sem utilizar Ext.Viewport.</p>
<p style="text-align: center;"><a title="Como Redimensionar ExtJS Panel, Grid, ou Outro Componente Quando Redimensionar o Browser" href="http://www.loiane.com/wp-content/uploads/2010/08/extjs-fit-to-parent_loiane_01.jpg" target="_blank"><img class="aligncenter size-full wp-image-1760" title="extjs-fit-to-parent_loiane_01" src="http://www.loiane.com/wp-content/uploads/2010/08/extjs-fit-to-parent_loiane_01.jpg" alt="Como Redimensionar ExtJS Panel, Grid, ou Outro Componente Quando Redimensionar o Browser" width="491" height="419" /></a></p>
<p style="text-align: center;">
<h3>Problema:</h3>
<p style="text-align: justify;">Você tem uma página legada e quer trocar um grid feito em html por um grid em ExtJS (porque possui recursos bem legais). Ou a página possui algum design e você apenas quer usar um componente em ExtJS. Em ambos os casos, você deseja renderizar o componente ExtJS em um DIV específico. E você também quer que este componente ExtJS seja redimensionado quando o browser for redimensionado.</p>
<p style="text-align: justify;">Como fazer isso, sendo que este não é comportamento padrão de um componente ExtJS? Só para esclarecer, os componentes ExtJS só sofrem redimensionamento se estiverem dentro de um Viewport, e este ocupa todo o espaço disponível na tela, não sendo possível utilizar nenhum outro design em HTML, JPEG, etc.</p>
<h3 style="text-align: justify;">Solução:</h3>
<p style="text-align: justify;"><strong><em>Condor </em></strong>(do <a href="http://www.sencha.com/forum/member.php?343-Condor" target="_blank"><strong>ExtJS </strong></a><a href="http://www.sencha.com/forum/member.php?343-Condor" target="_blank"><strong>Community Support Team</strong></a>) desenvolveu um plugin que consegue resolver este problema.</p>
<p style="text-align: justify;">Gastei algum tempo para entender como o plugin funciona, e finalmente consegui fazê-lo funcionar do jeito que desejava.</p>
<p style="text-align: justify;">Bem, em primeiro lugar, recomendo que passe algum tempo lendo a thread do forum para enteder bem o cenário: <a href="http://www.sencha.com/forum/showthread.php?28318" target="_blank">http://www.sencha.com/forum/showthread.php?28318</a> (se tiver alguma pergunta, por favor, publique diretamente no fórum para que o autor do plugin e outros membros lhe forneçam o suporte que precisa).</p>
<h3>Como fazer o plugin funcionar:</h3>
<p>É preciso aplicar o seguinte estilo (css) no DIV  (o atributo de largura &#8211; width é com o designer; o outros estilos são obrigatórios para fazer o plugin funcionar):</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;div id=&quot;reportTabContent&quot; style=&quot;overflow: hidden; position:absolute; width:98%;&quot;&gt;&lt;/div&gt;
</pre>
<p style="text-align: justify;">Se tiver alguma borda ao redor do componente ExtJS, é necessário setar a altura  - HEIGHT. E também será ncessário setar a altura no componente ExtJS. Neste caso, o autoHeight (altura automática) não irá funcionar. Se não tiver nenhuma borda ou nenhum outro design nos lados no componente, não é necessário setar a altura e neste caso, o autoHeight funciona. No meu caso (exemplo aqui do blog), coloquei uma borda no DIV exterior (apenas para simular o design), então tive que setar a altura:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;div style=&quot;border:3px solid #000000; padding:1px; width:99%; height:500px;&quot;&gt;
</pre>
<p>Código HTML do meu &#8220;design&#8221;:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
				&lt;div style=&quot;border:3px solid #000000; padding:1px; width:99%; height:500px;&quot;&gt;
					&lt;table&gt;
					&lt;tr&gt;
					&lt;td style=&quot;overflow: hidden; width:100%;&quot;&gt;
						&lt;div id=&quot;reportTabContent&quot; style=&quot;overflow: hidden; position:absolute; width:98%;&quot;&gt;&lt;/div&gt;
					&lt;/td&gt;
					&lt;/tr&gt;
					&lt;/table&gt;
				&lt;/div&gt;
</pre>
<p>E também é preciso adicionar o plugin no componente (Neste caso, estou usando o ExtJS DataGrid):</p>
<pre class="brush: jscript; collapse: false; first-line: 1; highlight: [20]; toolbar: true; wrap-lines: false;">
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {header: 'Company', width: 160, sortable: true, dataIndex: 'company'},
            {header: 'Price', width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
            {header: 'Change', width: 75, sortable: true, renderer: change, dataIndex: 'change'},
            {header: '% Change', width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
            {header: 'Last Updated', width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
        ],
        stripeRows: true,
        autoExpandColumn: 'company',
        height: 490,
        autoWidth:true,
        title: 'Array Grid',
        // config options for stateful behavior
        stateful: true,
        stateId: 'grid'
        ,viewConfig:{forceFit:true}
    	,renderTo: 'reportTabContent' // render the grid to the specified div in the page
    	,plugins: [new Ext.ux.FitToParent(&quot;reportTabContent&quot;)]
    });
</pre>
<p>Pronto! Quando redimensionar browser, o componente ExtJS fará também!</p>
<p>Testei no Firefox, Chrome e IE6.</p>
<p>Você també pode fazer o download do projeto de exemplo no meu <strong>GitHub</strong>: <a href="http://github.com/loiane/extjs-fit-to-parent" target="_blank">http://github.com/loiane/extjs-fit-to-parent</a></p>
<p>PS.: Se quiser usar todo o espaço disponível na tela, utilize <strong>Viewport</strong>.</p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1759&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/xtEKDBivZrtzRSCISodmB6TRTko/0/da"><img src="http://feedads.g.doubleclick.net/~a/xtEKDBivZrtzRSCISodmB6TRTko/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xtEKDBivZrtzRSCISodmB6TRTko/1/da"><img src="http://feedads.g.doubleclick.net/~a/xtEKDBivZrtzRSCISodmB6TRTko/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=Dv5E6elDTGE:5_bPoJ5WgPc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=Dv5E6elDTGE:5_bPoJ5WgPc:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=Dv5E6elDTGE:5_bPoJ5WgPc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/Dv5E6elDTGE" height="1" width="1"/>]]></content:encoded><description>Este post mostrará como redimensionar um ExtJS Panel, Grid, ou qualquer outro componente quando redimensionar a janela do browser sem utilizar Ext.Viewport. Problema: Você tem uma página legada e quer trocar um grid feito em html por um grid em ExtJS (porque possui recursos bem legais). Ou a página possui algum design e você apenas [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/08/como-redimensionar-extjs-panel-grid-ou-outro-componente-quando-redimensionar-o-browser/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.loiane.com/2010/08/como-redimensionar-extjs-panel-grid-ou-outro-componente-quando-redimensionar-o-browser/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-redimensionar-extjs-panel-grid-ou-outro-componente-quando-redimensionar-o-browser</feedburner:origLink></item><item><title>Happy Hour Ágil Campinas – 19/08 – Eu Fui!</title><link>http://feedproxy.google.com/~r/Loiane/~3/7sYodVhmr48/</link><category>eventos</category><category>agile</category><category>Happy Hour Ágil</category><category>HHA</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Fri, 20 Aug 2010 06:17:43 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1753</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><a href="http://www.loiane.com/2010/08/happy-hour-agil-em-campinas-dia-190810/" target="_blank">Ontem teve o Happy Hour Ágil em Campinas</a>, no Giovanetti do Cambuí.</p>
<p>Foi a primeira vez em Campinas e foi muito legal, Abordamos vários assunto, ligados à Agile e não ligados à Agile, apenas para jogar conversa fora! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Alguns tópicos abordados:</p>
<ul>
<li>Scrum &#8211; se usa, como usa atualmente na empresa, coisas legais que aprendeu, etc</li>
<li>Certificação Scrum</li>
<li><a href="http://www.scrum.org/" target="_blank">Scrum.org</a> versus <a href="http://www.scrumalliance.org/" target="_blank">ScrumAliance.org</a></li>
<li>Artigo do PMI sobre Agile: <a href="http://www.pmi.org/resources/pages/agile.aspx" target="_blank">http://www.pmi.org/resources/pages/agile.aspx</a></li>
<li>Livro <a href="http://pt.wikipedia.org/wiki/A_Arte_da_Guerra" target="_blank">A Arte da Guerra</a> &#8211; e suas lições (ou não! rs)</li>
<li>Cavaleiros do Zodíaco (anime e mangá) !!!</li>
<li>E voltou para Scrum</li>
</ul>
<p>Bem, depois disso fui embora; o papo deve ter continuado! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Outro ponto do encontro foi o Betthoven (São Bernado) rondando pelo Giovanetti. Muito fofo!</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/08/photo-1.jpg" target="_blank"><img class="aligncenter size-full wp-image-1754" title="photo (1)" src="http://www.loiane.com/wp-content/uploads/2010/08/photo-1.jpg" alt="" width="480" height="640" /></a></p>
<p style="text-align: left;">E uma foto dos participantes:</p>
<p style="text-align: left;"><a href="http://www.loiane.com/wp-content/uploads/2010/08/DSC02215.jpg" target="_blank"><img class="aligncenter size-full wp-image-1755" title="DSC02215" src="http://www.loiane.com/wp-content/uploads/2010/08/DSC02215.jpg" alt="" width="480" height="360" /></a></p>
<p style="text-align: left;">Na foto: <a href="http://twitter.com/albertoleal" target="_blank">@albertoleal</a>, <a href="http://twitter.com/loiane" target="_blank">@loiane</a>, <a href="http://twitter.com/pigodinho" target="_blank">@pigodinho</a>, <a href="http://twitter.com/samuelmenezes" target="_blank">@samuelmenezes</a>, <a href="http://twitter.com/felipero" target="_blank">@felipero</a>, <a href="http://twitter.com/flavia_oliv" target="_blank">@flavia_oliv</a>, <a href="http://twitter.com/peralles" target="_blank">@peralles</a>, <a href="http://twitter.com/rafajagua" target="_blank">@rafajagua</a>, <a href="https://twitter.com/renatorfr" target="_blank">@renatorfr</a>.</p>
<p style="text-align: left;">Se esqueci de alguém avisa! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">Todas as fotos podem ser conferidas no Flickr: <a href="http://www.flickr.com/photos/loiane/sets/72157624641855823/">http://www.flickr.com/photos/loiane/sets/72157624641855823/</a></p>
<p style="text-align: left;">E fique ligado nos próximos <strong>HHA</strong>: <a href="http://groups.google.com/group/happy-hour-agil?pli=1" target="_blank"><strong>http://groups.google.com/group/happy-hour-agil</strong></a></p>
<p style="text-align: left;">Até o próximo <strong>HHA</strong>!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1753&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/sWn7Lo_A4LXhI03lqtq9kuQkdrc/0/da"><img src="http://feedads.g.doubleclick.net/~a/sWn7Lo_A4LXhI03lqtq9kuQkdrc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/sWn7Lo_A4LXhI03lqtq9kuQkdrc/1/da"><img src="http://feedads.g.doubleclick.net/~a/sWn7Lo_A4LXhI03lqtq9kuQkdrc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=7sYodVhmr48:xRBqnneyw4k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=7sYodVhmr48:xRBqnneyw4k:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=7sYodVhmr48:xRBqnneyw4k:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/7sYodVhmr48" height="1" width="1"/>]]></content:encoded><description>Ontem teve o Happy Hour Ágil em Campinas, no Giovanetti do Cambuí. Foi a primeira vez em Campinas e foi muito legal, Abordamos vários assunto, ligados à Agile e não ligados à Agile, apenas para jogar conversa fora! Alguns tópicos abordados: Scrum &amp;#8211; se usa, como usa atualmente na empresa, coisas legais que aprendeu, etc [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/08/happy-hour-agil-campinas-1908-eu-fui/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><feedburner:origLink>http://www.loiane.com/2010/08/happy-hour-agil-campinas-1908-eu-fui/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=happy-hour-agil-campinas-1908-eu-fui</feedburner:origLink></item><item><title>Happy Hour Ágil em Campinas – dia 19/08/10</title><link>http://feedproxy.google.com/~r/Loiane/~3/z6EIbYWmC2U/</link><category>eventos</category><category>agile</category><category>campinas</category><category>Happy Hour Ágil</category><category>HHA</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Tue, 17 Aug 2010 05:27:10 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1747</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><a href="http://www.loiane.com/wp-content/uploads/2010/08/hha1.jpg"><img class="aligncenter size-full wp-image-1748" title="hha1" src="http://www.loiane.com/wp-content/uploads/2010/08/hha1.jpg" alt="" width="205" height="212" /></a></p>
<p style="text-align: justify;">Está sendo organizado, através do twitter (e lista de discussão),  um <strong>Happy Hour Ágil</strong> que acontecerá em <strong>Campinas/SP</strong>.  Será no dia <strong>19/08</strong> às <strong>19:30h</strong> no <strong>Giovannetti</strong> da Rua Padre Vieira, 1277 &#8211; <strong>Cambuí</strong> &#8211; Campinas, ao lado da Prefeitura. Esta vai ser a primeira vez que o evento vai ser realizado na cidade.</p>
<p>Mapa do local onde será o encontro:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/08/giovanetti.jpg" target="_blank"><img class="aligncenter size-full wp-image-1749" title="giovanetti" src="http://www.loiane.com/wp-content/uploads/2010/08/giovanetti.jpg" alt="" width="556" height="309" /></a></p>
<p style="text-align: justify;">Queremos reservar mesa, então precisamos saber qtas pessoas vão. Para confirmar presença, responda ao tópico na <strong>lista de discussão</strong> (<a href="http://groups.google.com/group/happy-hour-agil?pli=1" target="_blank"><strong>http://groups.google.com/group/happy-hour-agil</strong></a>) &#8211; <strong>HHA dia 19/8 em Campinas.</strong></p>
<p style="text-align: justify;">Para acompanhar o que estamos falando sobre este Happy Hour lá no twitter, procure pela tag <strong>#HHA</strong>.</p>
<p style="text-align: justify;">Vamos tomar um chopp ou refri e conversar sobre <strong><em>Agile</em></strong>!</p>
<p style="text-align: justify;">obs.: post copiado do blog do <a href="http://albertoleal.eti.br/" target="_blank">Alberto Leal</a></p>
<p style="text-align: justify;">Nos vemos lá! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1747&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/G2hVsgkgShtxHN4AyRjPUMu8Q8A/0/da"><img src="http://feedads.g.doubleclick.net/~a/G2hVsgkgShtxHN4AyRjPUMu8Q8A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/G2hVsgkgShtxHN4AyRjPUMu8Q8A/1/da"><img src="http://feedads.g.doubleclick.net/~a/G2hVsgkgShtxHN4AyRjPUMu8Q8A/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=z6EIbYWmC2U:jRWmrDlNNHM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=z6EIbYWmC2U:jRWmrDlNNHM:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=z6EIbYWmC2U:jRWmrDlNNHM:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/z6EIbYWmC2U" height="1" width="1"/>]]></content:encoded><description>Está sendo organizado, através do twitter (e lista de discussão),  um Happy Hour Ágil que acontecerá em Campinas/SP.  Será no dia 19/08 às 19:30h no Giovannetti da Rua Padre Vieira, 1277 &amp;#8211; Cambuí &amp;#8211; Campinas, ao lado da Prefeitura. Esta vai ser a primeira vez que o evento vai ser realizado na cidade. Mapa do [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/08/happy-hour-agil-em-campinas-dia-190810/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/08/happy-hour-agil-em-campinas-dia-190810/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=happy-hour-agil-em-campinas-dia-190810</feedburner:origLink></item><item><title>ExtJS plugin: PagingToolbarResizer</title><link>http://feedproxy.google.com/~r/Loiane/~3/RVBN0uyQ_bQ/</link><category>Ext JS</category><category>ExtJS plugin</category><category>PagingToolbar</category><category>PagingToolbarResizer</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 02 Aug 2010 04:04:54 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1740</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Ei pessoal,</p>
<p>Este é o meu primeiro plugin em ExtJS. Apesar de não ser algo complicado, estou muito feliz e é um grande feito para mim!</p>
<p>Bem, chega e introduções e vamos ao que realmente interessa.</p>
<h3>O problema:</h3>
<p style="text-align: justify;">O componente ExtJS PagingToolbar permite ao desenvolvedor setar um valor predeterminado para o tamanho da página (atributo <strong>page size</strong>), que é o número total de itens/registros que serão exibidos pelo grid de vez só (por página).</p>
<p style="text-align: justify;">Suponha que queremos exibir 10.000 (dez mil) itens no grid e que vamos usar o recurso de paginação. Vamos exibir apenas 50 itens por página. Se fizer a matemática, são 200 página no total a serem exibidas. Até agora nenhum problema, pois este é o comportamento normal do componente de paginação.</p>
<p style="text-align: justify;">O usuário Pessoa1 quer ver 100 itens por página, e o usuário Pessoa2 quer visualizar 150 itens por página. Pode ser que depois de 10 minutos eles mudem de opinião e queiram visualizar um outro número de itens por página. Se você for fazer uma pesquisa no Ebay (ou americanas.com, saraiva, etc), vai ver uma opção de quantos itens deseja ver ao mesmo tempo. E é isto que desejamos fazer.</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/08/extjs_plugin_ebay.png" target="_blank"><img class="aligncenter size-full wp-image-1742" title="extjs_plugin_ebay" src="http://www.loiane.com/wp-content/uploads/2010/08/extjs_plugin_ebay.png" alt="" width="506" height="224" /></a></p>
<p style="text-align: center;">
<h3>A solução/plugin:</h3>
<p style="text-align: justify;">Por esta razão, implementei o plugin PagingToolbarResizer, que adiciona uma (dropdown) na barra de paginação (paging toolbar) com algumas opções de quantos itens serão exibidos por página. O plugin deve ser acoplado no objeto PagingToolbar e é totalmente customizável.</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/08/extjs_plugin_pagingtoolbarresizer.png" target="_blank"><img class="aligncenter size-full wp-image-1743" title="extjs_plugin_pagingtoolbarresizer" src="http://www.loiane.com/wp-content/uploads/2010/08/extjs_plugin_pagingtoolbarresizer.png" alt="" width="493" height="351" /></a></p>
<p>Vamos dar uma olhada nas opções de configuração:</p>
<ul>
<li><strong><em>options</em></strong>: pode ser uma <em>store</em> ou um array de inteiros. Se desejar obter a lista de opções de um banco de dados, por exemplo, deve usar uma <em>store</em>, caso contrário, use um array. Os valores padrões são: [5, 10, 15, 20, 25, 30, 50, 75, 100, 200, 300, 500, 1000].</li>
<li><strong><em>displayText</em></strong>: É a mensagem a ser exibida junto ao combobox (label). A mensagem padrão é &#8216;Records per Page&#8217;. Neste caso, pode-se usar um mensagem em qualquer outra língua, como o Português.</li>
<li><strong><em>prependCombo</em></strong>: esta flag indica se deseja exibir o combobox antes do botões de paginação. Padrão é false (no caso da imagem acima, está setado como true).</li>
</ul>
<p>E o plugin é bem simples de usar:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; highlight: [20]; toolbar: true; wrap-lines: false;">
        // paging bar on the bottom
        bbar: new Ext.PagingToolbar({
            pageSize: 25,
            store: store,
            displayInfo: true,
            displayMsg: 'Displaying topics {0} - {1} of {2}',
            emptyMsg: &quot;No topics to display&quot;,
            items:[
                '-', {
                pressed: true,
                enableToggle:true,
                text: 'Show Preview',
                cls: 'x-btn-text-icon details',
                toggleHandler: function(btn, pressed){
                    var view = grid.getView();
                    view.showPreview = pressed;
                    view.refresh();
                }
            }],
            plugins : [new Ext.ux.plugin.PagingToolbarResizer( {options : [ 5, 10, 15, 20, 25 ], prependCombo: true})]
        })
</pre>
<h3>Links:</h3>
<ul>
<li><strong><a href="http://loianegroner.com/extjs-plugins/pagingtoolbarresizer/" target="_blank">Página &#8220;</a></strong><em><a href="http://loianegroner.com/extjs-plugins/pagingtoolbarresizer/" target="_blank"><strong>oficial</strong></a></em><a href="http://loianegroner.com/extjs-plugins/pagingtoolbarresizer/" target="_blank"><strong>&#8221; do plugin &#8211; está em Inglês</strong></a></li>
<li>Você também pode conferir um <a href="http://loianegroner.com/extjs/examples/PagingToolbarResizer/" target="_blank"><strong>exemplo ao vivo &#8211; em execução</strong></a> (é o mesmo exemplo do PagingToolbar, que irá encontrar em <a href="http://www.sencha.com/deploy/dev/examples/grid/paging.html" target="_blank"><strong>Sencha website &#8211; ExtJS examples &#8211; PagingToolbar</strong></a>). Só adicionei o plugin.</li>
<li><strong><a href="http://www.sencha.com/forum/showthread.php?105843-PagingToolbarResizer-plugin" target="_blank">A thread no forum oficial do ExtJS</a></strong></li>
<li><strong><a href="http://github.com/loiane/Ext.ux.plugin.PagingToolbarResizer" target="_blank">Repositório no GitHub</a></strong></li>
</ul>
<h3 style="text-align: justify;">E também pode fazer o download neste link:</h3>
<p style="text-align: justify;"><a href="http://loianegroner.com/extjs/PagingToolbarResizer.zip" target="_blank">http://loianegroner.com/extjs/PagingToolbarResizer.zip</a></p>
<p style="text-align: justify;">Espero que ajude alguém! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1740&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/_008nAgRUd-N-0y6CzHRKEghjg8/0/da"><img src="http://feedads.g.doubleclick.net/~a/_008nAgRUd-N-0y6CzHRKEghjg8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_008nAgRUd-N-0y6CzHRKEghjg8/1/da"><img src="http://feedads.g.doubleclick.net/~a/_008nAgRUd-N-0y6CzHRKEghjg8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=RVBN0uyQ_bQ:8LsgNWGIxfI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=RVBN0uyQ_bQ:8LsgNWGIxfI:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=RVBN0uyQ_bQ:8LsgNWGIxfI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/RVBN0uyQ_bQ" height="1" width="1"/>]]></content:encoded><description>Ei pessoal, Este é o meu primeiro plugin em ExtJS. Apesar de não ser algo complicado, estou muito feliz e é um grande feito para mim! Bem, chega e introduções e vamos ao que realmente interessa. O problema: O componente ExtJS PagingToolbar permite ao desenvolvedor setar um valor predeterminado para o tamanho da página (atributo page [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/08/extjs-plugin-pagingtoolbarresizer/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/08/extjs-plugin-pagingtoolbarresizer/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-plugin-pagingtoolbarresizer</feedburner:origLink></item><item><title>PodCasts Gratuitos para Aprender Inglês (e outras línguas)</title><link>http://feedproxy.google.com/~r/Loiane/~3/zninJh4XR2U/</link><category>Inglês</category><category>carreira</category><category>alemão</category><category>apple</category><category>chinês</category><category>francês</category><category>inglês</category><category>italiano</category><category>iTunes</category><category>podCasts</category><category>universidade</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Thu, 29 Jul 2010 10:50:31 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1727</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Tempos atrás twittei que estava gostando bastante de alguns podcasts, e estava aprendendo novos vocabulários. Algumas pessoas pediram para postar um artigo aqui no blog com a lista dos meus podcasts favoritos.</p>
<h3>Bem, em primeiro lugar vem a pergunta? Em que lugar eu acho esses podcasts?</h3>
<p style="text-align: justify;">Recentemente fiz a aquisição de um iPhone (agora faço parte do clubinho dos felizes e endividados! rs). Comecei a explorar o iTunes e achei ótimos podcasts por lá. E o melhor: são todos free. Uma outra coisa legal é que você não precisa de ter um iPod ou iPhone para ouvir os podcasts. Você pode usar o iTunes para acompanhar e ouvir/ver os podcasts que você baixar ou pode escutar num mp3 player qualquer.</p>
<p style="text-align: justify;">Muitos podcasts divulgam seus sites/blogs, e você também tem a opção de acompanhar o RSS do blog, sem precisar do iTunes. O legal do iTunes é que você pode clicar no botão &#8220;Subscribe&#8221; e toda vez que você abrir o iTunes, vai verificar se tem alguma atualização e vai fazer o download automático para você!</p>
<h3>Então vamos lá!</h3>
<p style="text-align: justify;">O primeiro passo é fazer o download do iTunes, se ainda não tiver instalado na sua máquina: <a href="http://www.apple.com/br/itunes/download/" target="_blank">http://www.apple.com/br/itunes/download/</a></p>
<p style="text-align: justify;">Depois de instalado, você deve criar uma conta na Apple Store:  <a href="http://iphoneapps.com.br/itunes/como-criar-uma-conta-na-app-store-united-states-sem-cartao/" target="_blank">http://iphoneapps.com.br/itunes/como-criar-uma-conta-na-app-store-united-states-sem-cartao/</a></p>
<p style="text-align: justify;"><strong><em>Abra o iTunes:</em></strong></p>
<p style="text-align: justify;">1 &#8211; No meu esquerdo, clique em iTunes Store. Vai abrir a Home Page.</p>
<p style="text-align: justify;">2 &#8211; No menu superior da iTunes Store, tem a opção de PodCasts: (clique nas imagens para ver em tamanho original)</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_011.jpg" target="_blank"><img class="aligncenter size-full wp-image-1729" title="EnglishPodcasts_Loiane_01" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_011.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: left;">3 &#8211; No menu direito, clique em Language Learning:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_02.jpg" target="_blank"><img class="aligncenter size-full wp-image-1731" title="EnglishPodcasts_Loiane_02" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_02.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: left;">4 &#8211; Irá abrir a seguinte tela. Nela, você pode escolher outras línguas além do inglês:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_03.jpg" target="_blank"><img class="aligncenter size-full wp-image-1732" title="EnglishPodcasts_Loiane_03" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_03.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: justify;">5 &#8211; Vai abrir a lista dos podcasts disponíveis. Aí é só você escolher o que quiser. Como já disse anteriormente, você pode acompanhar todos os podcasts através do botão subscribe. Só que só irá fazer o download dos mais novos.</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_04.jpg" target="_blank"><img class="aligncenter size-full wp-image-1733" title="EnglishPodcasts_Loiane_04" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_04.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: justify;">6 &#8211; se quiser fazer o download dos anteriores, basta clicar no ícone do podcast e depois escolher o botão &#8220;Free&#8221; de cada episódio, que irá adicionar à lista de transferências:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_05.jpg" target="_blank"><img class="aligncenter size-full wp-image-1734" title="EnglishPodcasts_Loiane_05" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_05.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: justify;">7 &#8211; Depois que terminar a transferência, basta ir na sua biblioteca de podcasts e começar a ouvir! Os listados abaixo são os meus preferidos! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_06.jpg" target="_blank"><img class="aligncenter size-full wp-image-1735" title="EnglishPodcasts_Loiane_06" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_06.jpg" alt="" width="538" height="319" /></a></p>
<p style="text-align: justify;">8 &#8211; se você quiser ouvir os podcasts em algum mp3 player, basta pegar os arquivos mp3 da pasta do iTunes. Se você usa o Ruindows Windows, fica na pasta Minhas Músicas:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_07.jpg" target="_blank"><img class="aligncenter size-full wp-image-1736" title="EnglishPodcasts_Loiane_07" src="http://www.loiane.com/wp-content/uploads/2010/07/EnglishPodcasts_Loiane_07.jpg" alt="" width="577" height="272" /></a></p>
<p style="text-align: justify;">Simples, fácil, e totalmente free! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Aproveite para dar uma olhada nos outros podcasts da iTunes Store, e vídeo aulas da iTunes University. Várias universidades como Havard e outras conhecidas mundialmente publicam cursos super legais e grátis!</p>
<p style="text-align: justify;">Happy learning and enjoy! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1727&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/Jhtwj3veaPrYrSTVSjz_dVMx59I/0/da"><img src="http://feedads.g.doubleclick.net/~a/Jhtwj3veaPrYrSTVSjz_dVMx59I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Jhtwj3veaPrYrSTVSjz_dVMx59I/1/da"><img src="http://feedads.g.doubleclick.net/~a/Jhtwj3veaPrYrSTVSjz_dVMx59I/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=zninJh4XR2U:Qefpw721Khk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=zninJh4XR2U:Qefpw721Khk:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=zninJh4XR2U:Qefpw721Khk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/zninJh4XR2U" height="1" width="1"/>]]></content:encoded><description>Tempos atrás twittei que estava gostando bastante de alguns podcasts, e estava aprendendo novos vocabulários. Algumas pessoas pediram para postar um artigo aqui no blog com a lista dos meus podcasts favoritos. Bem, em primeiro lugar vem a pergunta? Em que lugar eu acho esses podcasts? Recentemente fiz a aquisição de um iPhone (agora faço [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/07/podcasts-gratuitos-para-aprender-ingles-e-outras-linguas/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.loiane.com/2010/07/podcasts-gratuitos-para-aprender-ingles-e-outras-linguas/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=podcasts-gratuitos-para-aprender-ingles-e-outras-linguas</feedburner:origLink></item><item><title>ExtJS agora é Sencha!</title><link>http://feedproxy.google.com/~r/Loiane/~3/oV1iOkFykFk/</link><category>Ext JS</category><category>Sencha</category><category>ExtJS</category><category>JQTouch</category><category>Raphaël</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Tue, 15 Jun 2010 05:16:14 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1718</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Notícia super quente que foi divulgada nessa manhã. ExtJS agora é Sencha!</p>
<p style="text-align: justify;">Juntaram a ExtJS, e os projetos JQTouch e  Raphaël e a Sencha nasceu!</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/06/ExtJS_sencha.png"><img class="aligncenter size-full wp-image-1720" title="ExtJS_sencha" src="http://www.loiane.com/wp-content/uploads/2010/06/ExtJS_sencha.png" alt="" width="316" height="124" /></a></p>
<p style="text-align: justify;">Devo continuar com as tags ExtJS aqui no blog, mas vou acrescentar Sencha também daqui por diante.</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/06/sencha_logo.png"><img class="aligncenter size-full wp-image-1719" title="sencha_logo" src="http://www.loiane.com/wp-content/uploads/2010/06/sencha_logo.png" alt="" width="339" height="151" /></a></p>
<p style="text-align: justify;">Segue a notícia traduzida do blog da Sencha/ExtJS: <a href="http://www.sencha.com/blog/2010/06/14/ext-js-jqtouch-raphael-sencha/">http://www.sencha.com/blog/2010/06/14/ext-js-jqtouch-raphael-sencha/</a> (viva ao Google Translator! rs)</p>
<blockquote style="text-align: justify;"><p>Coisas boas estão acontecendo! Hoje, estamos unindo forças com os projetos jQTouch e Raphaël, mudando o nosso nome da empresa para Sencha e mover o nosso endereço web a partir de <a href="http://www.extjs.com" target="_blank">www.extjs.com</a> para <a href="http://www.sencha.com">www.sencha.com</a>.</p>
<p>jQTouch e Raphaël são a principal fonte de projetos opensource em suas áreas, e nós estamos incrivelmente animados para ter seus criadores, David e Kaneda Dmitry Baranovskiy, juntando-se com a equipe Ext JS para formar Sencha. Nós acreditamos que essas colaborações conduzirão a algumas coisas novas. Nos próximos meses, fique atento para isso. Você não terá que esperar muito tempo, eu prometo!</p>
<p>Acreditamos que os elementos gráficos ricos e suporte touch serão componentes essenciais  do framework Ajax nos próximos anos. Se você tem acompanhado o nosso blog sobre HTML5, você vai saber que não só HTML5 e CSS3 trarão recursos significativos para internet, mas que isso já está chegando em dispositivos móveis (em verdade, ele já está aqui).</p>
<p><strong>Por Sencha</strong>?<br />
Estamos escolhendo Sencha como o nosso nome, pois ele evoca próxima geração de desenvolvimento de software e é fácil de lembrar, soletrar e pronunciar. Sencha &#8211; o nome de um chá verde japonês popular &#8211; é a tradição de <strong>Java</strong>, e representa um novo patamar de desenvolvimento. É uma sensação inesquecível para nós. Nós esperamos que você goste também.</p>
<p>Os roteiros para a Ext JS, Ext GWT, Designer, Direct, etc não mudam, como resultado disso. Estamos muito animados sobre as coisas novas no Ext JS 4.0 e do resto da linha de produtos. Alguns dos nomes de cada produto pode evoluir no futuro (por exemplo, estamos pensando em mudar o nome para Designer Ext Sencha Designer), mas não esperem grandes alterações imediatas aqui.</p>
<p style="text-align: justify;"><strong>Raphaël e jQTouch permanecerão licenciados do MIT</strong>.<br />
Estamos na criação de uma fundação chamada <strong>Sencha Labs</strong>, que detém os direitos autorais e marcas para todos os projetos não-comerciais associados ao Sencha. Nossa licença de escolha para estes projetos é, e continuará a ser, a licença MIT. Vamos manter nossos projetos não-comerciais com as contribuições de Sencha e as comunidades destes projetos. Temos o prazer de anunciar que Jonathan Stark, um desenvolvedor de dispositivos móveis conhecido e autor de dois livros O&#8217;Reilly sobre Android e desenvolvimento de aplicativos iPhone, será o mantenedor oficial para jQTouch daqui para frente. (Bem-vindo a bordo, Jonathan!)</p>
</blockquote>
<p>Bem, vamos esperar mais novidades e consequentemente, novidades aqui no blog também!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1718&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/FyesO10giQrIIpRAtNz3UouCtS4/0/da"><img src="http://feedads.g.doubleclick.net/~a/FyesO10giQrIIpRAtNz3UouCtS4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FyesO10giQrIIpRAtNz3UouCtS4/1/da"><img src="http://feedads.g.doubleclick.net/~a/FyesO10giQrIIpRAtNz3UouCtS4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=oV1iOkFykFk:6pHIfDZzwUo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=oV1iOkFykFk:6pHIfDZzwUo:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=oV1iOkFykFk:6pHIfDZzwUo:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/oV1iOkFykFk" height="1" width="1"/>]]></content:encoded><description>Notícia super quente que foi divulgada nessa manhã. ExtJS agora é Sencha! Juntaram a ExtJS, e os projetos JQTouch e  Raphaël e a Sencha nasceu! Devo continuar com as tags ExtJS aqui no blog, mas vou acrescentar Sencha também daqui por diante. Segue a notícia traduzida do blog da Sencha/ExtJS: http://www.sencha.com/blog/2010/06/14/ext-js-jqtouch-raphael-sencha/ (viva ao Google Translator! [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/06/extjs-agora-e-sencha/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.loiane.com/2010/06/extjs-agora-e-sencha/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-agora-e-sencha</feedburner:origLink></item><item><title>Como popular um ExtJS ComboBox usando um Spring Controller</title><link>http://feedproxy.google.com/~r/Loiane/~3/oxFi2bkpOtY/</link><category>Ext JS</category><category>Spring</category><category>ExtJS + JEE</category><category>ExtJS ComboBox</category><category>json</category><category>spring</category><category>Spring 3</category><category>Spring MVC</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 14 Jun 2010 04:30:23 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1699</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Para popular/carregar um ExtJS ComboBox usando  um Controller Spring, é necessário criar um request em Ajax usando <em>Ext.data.HttpProxy</em><em> </em>e como response/resposta do server, você pode retornar um objeto JSON (ou um XML – neste exemplo, vou usar JSON, mas funcionar da memsa maneira que XML). Usando um J<em>sonReader (ou XMLReader)</em>, pode-se ler os valores dos erver e popular o <em>ComboBox</em>. É a mesma lógica utilizada para popular um ExtJS DataGrid.</p>
<p>Frameworks/Bibliotecas que estou usando nesse tutorial:</p>
<ul>
<li>ExtJS (download da      última versão <a href="http://www.extjs.com/products/js/download.php" target="_blank">aqui</a>);</li>
<li><a href="http://www.springsource.org/download" target="_blank">Spring MVC 3</a></li>
<li><a href="http://jackson.codehaus.org/" target="_blank">Jackson</a> (usado para retornar o JSON do Controller)</li>
</ul>
<p>Se você estiver usando Spring 2.5, pode conferir outros exemplo de como popular um JSONStore <a href="http://www.loiane.com/sitemap-loiane/" target="_blank">other examples</a> e retornar JSON do Spring <a href="http://www.loiane.com/2009/07/json-spring/" target="_blank">JSON from Spring using Spring-JSON lib</a>.</p>
<p>Neste exemplo, vamos criar um combobox para listar todos os estados brasileiros. O screenshot pode ser conferido na figura abaixo:</p>
<p><a href="http://www.loiane.com/wp-content/uploads/2010/06/ExtJS_ComboBox_SpringController_Loiane_01.gif"><img class="aligncenter size-full wp-image-1713" title="ExtJS_ComboBox_SpringController_Loiane_01" src="http://www.loiane.com/wp-content/uploads/2010/06/ExtJS_ComboBox_SpringController_Loiane_01.gif" alt="" width="250" height="380" /></a></p>
<p><a href="http://loianegroner.com/wp-content/uploads/2010/05/ExtJS_ComboBox_SpringController_Loiane_01.gif"></a></p>
<p>O primeiro passo é crier um <a href="http://en.wikipedia.org/wiki/Plain_Old_Java_Object" target="_blank">POJO </a>(Objeto java com constructor e métodos getters e setters dos atributos):</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
public class State {

	private String code;
	private String name;

	public State(String code, String name) {
		super();
		this.code = code;
		this.name = name;
	}

        //get and set methods
}
</pre>
<p>Abaixo segue o Controller. O request está mapeado no método loadStates(), que busca/seleciona os estados de um repositório de dados (Estou usando apenas um método por motivos acadêmicos (e portabilidade, sem precisar instalar banco de dados, etc, porém, você pode buscar essas informações de um banco de dados):</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
@Controller
public class StateController {

	private StateService stateService;

	@RequestMapping(value=&quot;getStates.json&quot;, method = RequestMethod.GET)
	public @ResponseBody Map&lt;String,? extends Object&gt; loadStates() {

		HashMap&lt;String, List&lt;State&gt;&gt; modelMap = new HashMap&lt;String,List&lt;State&gt;&gt;();
		modelMap.put(&quot;states&quot;, stateService.getBrazilianStates());

		return modelMap;
	}

	@Autowired
	public void setStateService(StateService stateService) {
		this.stateService = stateService;
	}
}
</pre>
<p>A anotação @ResponseBody converte automaticamento o objeto Map em um objeto JSON, por causa do framework Jackson. Você pode ver mais sobre as simplificações Ajax do Spring 3 <a href="http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/" target="_blank">neste link</a>. E este é o objeto JSON que foi retornado do método loadStates para o browser:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
{&quot;states&quot;:[{&quot;name&quot;:&quot;Acre&quot;,&quot;code&quot;:&quot;AC&quot;},{&quot;name&quot;:&quot;Alagoas&quot;,&quot;code&quot;:&quot;AL&quot;},{&quot;name&quot;:&quot;Amapá&quot;,&quot;code&quot;:&quot;AP&quot;},{&quot;name&quot;:&quot;Amazonas&quot;,&quot;code&quot;:&quot;AM&quot;},{&quot;name&quot;:&quot;Bahia&quot;,&quot;code&quot;:&quot;BA&quot;},{&quot;name&quot;:&quot;Ceará&quot;,&quot;code&quot;:&quot;CE&quot;},{&quot;name&quot;:&quot;Distrito Federal&quot;,&quot;code&quot;:&quot;DF&quot;},{&quot;name&quot;:&quot;Espírito Santo&quot;,&quot;code&quot;:&quot;ES&quot;},{&quot;name&quot;:&quot;Goiás&quot;,&quot;code&quot;:&quot;GO&quot;},{&quot;name&quot;:&quot;Maranhão&quot;,&quot;code&quot;:&quot;MA&quot;},{&quot;name&quot;:&quot;Mato Grosso&quot;,&quot;code&quot;:&quot;MT&quot;},{&quot;name&quot;:&quot;Mato Grosso do Sul&quot;,&quot;code&quot;:&quot;MS&quot;},{&quot;name&quot;:&quot;Minas Gerais&quot;,&quot;code&quot;:&quot;MG&quot;},{&quot;name&quot;:&quot;Pará&quot;,&quot;code&quot;:&quot;PA&quot;},{&quot;name&quot;:&quot;Paraíba&quot;,&quot;code&quot;:&quot;PB&quot;},{&quot;name&quot;:&quot;Paraná&quot;,&quot;code&quot;:&quot;PR&quot;},{&quot;name&quot;:&quot;Pernambuco&quot;,&quot;code&quot;:&quot;PE&quot;},{&quot;name&quot;:&quot;Piauí&quot;,&quot;code&quot;:&quot;PI&quot;},{&quot;name&quot;:&quot;Rio de Janeiro&quot;,&quot;code&quot;:&quot;RJ&quot;},{&quot;name&quot;:&quot;Rio Grande do Norte&quot;,&quot;code&quot;:&quot;RN&quot;},{&quot;name&quot;:&quot;Rio Grande do Sul&quot;,&quot;code&quot;:&quot;RS&quot;},{&quot;name&quot;:&quot;Rondônia&quot;,&quot;code&quot;:&quot;RO&quot;},{&quot;name&quot;:&quot;Roraima&quot;,&quot;code&quot;:&quot;RR&quot;},{&quot;name&quot;:&quot;Santa Catarina&quot;,&quot;code&quot;:&quot;SC&quot;},{&quot;name&quot;:&quot;São Paulo&quot;,&quot;code&quot;:&quot;SP&quot;},{&quot;name&quot;:&quot;Sergipe&quot;,&quot;code&quot;:&quot;SE&quot;},{&quot;name&quot;:&quot;Tocantins&quot;,&quot;code&quot;:&quot;TO&quot;}]}
</pre>
<p>E o conteúdo acima foi retornado por um método da classe StateService (neste caso, meu repositório de dados):</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
@Service
public class StateService {

	public List&lt;State&gt; getBrazilianStates(){

		List&lt;State&gt; states = new ArrayList&lt;State&gt;();

		states.add(new State(&quot;AC&quot;,&quot;Acre&quot;));
		states.add(new State(&quot;AL&quot;,&quot;Alagoas&quot;));
		states.add(new State(&quot;AP&quot;,&quot;Amapá&quot;));
		states.add(new State(&quot;AM&quot;,&quot;Amazonas&quot;));
		states.add(new State(&quot;BA&quot;,&quot;Bahia&quot;));
		states.add(new State(&quot;CE&quot;,&quot;Ceará&quot;));
		states.add(new State(&quot;DF&quot;,&quot;Distrito Federal&quot;));
		states.add(new State(&quot;ES&quot;,&quot;Espírito Santo&quot;));
		states.add(new State(&quot;GO&quot;,&quot;Goiás&quot;));
		states.add(new State(&quot;MA&quot;,&quot;Maranhão&quot;));
		states.add(new State(&quot;MT&quot;,&quot;Mato Grosso&quot;));
		states.add(new State(&quot;MS&quot;,&quot;Mato Grosso do Sul&quot;));
		states.add(new State(&quot;MG&quot;,&quot;Minas Gerais&quot;));
		states.add(new State(&quot;PA&quot;,&quot;Pará&quot;));
		states.add(new State(&quot;PB&quot;,&quot;Paraíba&quot;));
		states.add(new State(&quot;PR&quot;,&quot;Paraná&quot;));
		states.add(new State(&quot;PE&quot;,&quot;Pernambuco&quot;));
		states.add(new State(&quot;PI&quot;,&quot;Piauí&quot;));
		states.add(new State(&quot;RJ&quot;,&quot;Rio de Janeiro&quot;));
		states.add(new State(&quot;RN&quot;,&quot;Rio Grande do Norte&quot;));
		states.add(new State(&quot;RS&quot;,&quot;Rio Grande do Sul&quot;));
		states.add(new State(&quot;RO&quot;,&quot;Rondônia&quot;));
		states.add(new State(&quot;RR&quot;,&quot;Roraima&quot;));
		states.add(new State(&quot;SC&quot;,&quot;Santa Catarina&quot;));
		states.add(new State(&quot;SP&quot;,&quot;São Paulo&quot;));
		states.add(new State(&quot;SE&quot;,&quot;Sergipe&quot;));
		states.add(new State(&quot;TO&quot;,&quot;Tocantins&quot;));

		return states;
	}
}
</pre>
<p>E finalmente, o código ExtJS com a declaração do reader e do comboBox:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
Ext.onReady(function(){

	var store = new Ext.data.Store({
		proxy: new Ext.data.HttpProxy({
			url: 'getStates.json'
		}),
		reader: new Ext.data.JsonReader({
			root:'states'
		},
		[{name: 'code'},
		 {name: 'name'}
		])
	});

	var combo = new Ext.form.ComboBox({
		id: 'statesCombo',
		store: store,
		displayField: 'name',
		valueField: 'code',
		hiddenName : 'codeId',
		typeAhead: true,
		mode: 'local',
		fieldLabel: 'States of Brazil',
		anchor: '100%',
		forceSelection: true,
		triggerAction: 'all',
		emptyText:'Select a state...',
		selectOnFocus:true
	});

	var stateForm = new Ext.FormPanel({
		frame:true,
		url: 'saveState.json',
		title: 'Combo Box Example',
		bodyStyle:'padding:5px 5px 0',
		width: 250,
		labelAlign: 'top',
		layout: 'form',
		items: [combo]
	});

	store.load();

	stateForm.render(document.body);

});
</pre>
<p>Você pode fazer o download do projeto complete (incluindo todos os jars e arquivos ExtJS nencessários) do meu repositório do GitHub: <a href="http://github.com/loiane/extjs-combobox" target="_blank">http://github.com/loiane/extjs-combobox</a><br />
Este projeto foi desenvolvido no Eclipse e usei o TomCat como webserver.</p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1699&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/qsKwDjjyIhRYLE7HGmUqqNbpMcc/0/da"><img src="http://feedads.g.doubleclick.net/~a/qsKwDjjyIhRYLE7HGmUqqNbpMcc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/qsKwDjjyIhRYLE7HGmUqqNbpMcc/1/da"><img src="http://feedads.g.doubleclick.net/~a/qsKwDjjyIhRYLE7HGmUqqNbpMcc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=oxFi2bkpOtY:9P5f3G7Xhdg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=oxFi2bkpOtY:9P5f3G7Xhdg:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=oxFi2bkpOtY:9P5f3G7Xhdg:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/oxFi2bkpOtY" height="1" width="1"/>]]></content:encoded><description>Para popular/carregar um ExtJS ComboBox usando  um Controller Spring, é necessário criar um request em Ajax usando Ext.data.HttpProxy e como response/resposta do server, você pode retornar um objeto JSON (ou um XML – neste exemplo, vou usar JSON, mas funcionar da memsa maneira que XML). Usando um JsonReader (ou XMLReader), pode-se ler os valores dos erver [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/06/como-popular-um-extjs-combobox-usando-um-spring-controller/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.loiane.com/2010/06/como-popular-um-extjs-combobox-usando-um-spring-controller/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-popular-um-extjs-combobox-usando-um-spring-controller</feedburner:origLink></item><item><title>Me tornei DZone MVB (Most Valuable Blogger)!</title><link>http://feedproxy.google.com/~r/Loiane/~3/-fuNkyOAPzg/</link><category>pessoal</category><category>DZone</category><category>DZone MVB</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 07 Jun 2010 04:30:18 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1703</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Ei pessoal, me tornei DZone <a href="http://www.dzone.com/page/mvbs" target="_blank">MVB (Most Valuable Blogger)</a>!</p>
<p>Quero agradecer ao time do Dzone (especialmente à editora do portal) pelo convite. Estou muito honrada em fazer parte do programa!</p>
<blockquote>
<p style="text-align: justify;">O programa DZone MVB reúne um grupo de blogueiros de grande talento, autores, e tecnólogos que estão sempre escrevendo sobre temas de interesse para a comunidade de desenvolvedores. Estas pessoas são reconhecidas na indústria para a suas contribuições e conhecimentos técnicos profundos sobre temas que vão desde design e arquitetura de software à programação de uma série de plataformas, incluindo Java,. NET, Ruby e outros.</p>
</blockquote>
<p>Já publicaram o primeiro post, <a href="http://www.dzone.com/articles/how-populate-ext-js-combobox">How to Populate Ext JS ComboBox using Spring Controller</a>, como pode ser conferido pela foto abaixo (É oficial! Yay!) <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Este post ainda não foi postado aqui no blog, publicarei em breve!</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/06/Loiane_dzone_mvb.png" target="_blank"><img class="aligncenter size-large wp-image-1704" title="Loiane_dzone_mvb" src="http://www.loiane.com/wp-content/uploads/2010/06/Loiane_dzone_mvb-694x1024.png" alt="" width="555" height="819" /></a></p>
<p style="text-align: justify;">Todo o conteúdo do portal é publicado em inglês, mas como publico os artigos aqui no blog em português e no <a href="http://loiane.com" target="_blank">loiane.com</a> em inglês, então é o mesmo conteúdo! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">As minhas contribuições serão publicadas no <a href="http://java.dzone.com/" target="_blank">JavaLobby</a>.</p>
<p style="text-align: justify;">Bem legal fazer parte do programa, sempre fui fã do Dzone, especialmente por causa dos RefCardz, que uso bastante no dia a dia. E agora também vou ter a oportunidade de dar dicas e poder revisar os RefCardz antes de serem publicados.</p>
<p style="text-align: justify;">Estou muito feliz, pois muitos profissionais e blogueiros talentosos fazem parte do programa. Me sinto honrada também por ser a segunda brasileira a fazer parte (o único brasileiro que fazia parte é o <a href="http://java.dzone.com/content/rip-felipe-ga%C3%BAcho-dzone-mvb" target="_blank">Felipe Gaúcho</a>). Um honra poder ajudar a divulgar conteúdo escrito por nós, brasileiros.</p>
<p style="text-align: justify;">Feliz também porque poucas mulheres estão no time de blogueiros do DZone, mais uma para ajudar a aumentar esse número!</p>
<p style="text-align: justify;">Você pode conferir a lista de todos os blogueiros e profissionais que fazem parte neste link: <a href="http://www.dzone.com/page/mvbs" target="_blank">http://www.dzone.com/page/mvbs</a></p>
<p style="text-align: justify;">E obrigada a você que continua lendo esse blog! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1703&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/5K7bas8s8iW134IEgOqwjb1WB0M/0/da"><img src="http://feedads.g.doubleclick.net/~a/5K7bas8s8iW134IEgOqwjb1WB0M/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5K7bas8s8iW134IEgOqwjb1WB0M/1/da"><img src="http://feedads.g.doubleclick.net/~a/5K7bas8s8iW134IEgOqwjb1WB0M/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=-fuNkyOAPzg:RJhBYiceJSk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=-fuNkyOAPzg:RJhBYiceJSk:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=-fuNkyOAPzg:RJhBYiceJSk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/-fuNkyOAPzg" height="1" width="1"/>]]></content:encoded><description>Ei pessoal, me tornei DZone MVB (Most Valuable Blogger)! Quero agradecer ao time do Dzone (especialmente à editora do portal) pelo convite. Estou muito honrada em fazer parte do programa! O programa DZone MVB reúne um grupo de blogueiros de grande talento, autores, e tecnólogos que estão sempre escrevendo sobre temas de interesse para a comunidade [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/06/me-tornei-dzone-mvb-most-valuable-blogger/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">9</slash:comments><feedburner:origLink>http://www.loiane.com/2010/06/me-tornei-dzone-mvb-most-valuable-blogger/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=me-tornei-dzone-mvb-most-valuable-blogger</feedburner:origLink></item><item><title>ExtJS: Páginas SSL com itens não seguros</title><link>http://feedproxy.google.com/~r/Loiane/~3/fXhU4JfEXK0/</link><category>Ext JS</category><category>extjs warning</category><category>https warning</category><category>SSL</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Fri, 28 May 2010 04:30:11 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1691</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Quando você acessa uma página SSL da sua aplicação web, o sistema mostra um warning com a mensagem: &#8221;<strong>This page contains both secure and nonsecure items. Do you want to display the nonsecure items?</strong>&#8221; (Esta página contém itens seguros e não seguros. Deseja visualizar os items não seguros?)</p>
<p><a href="http://www.loiane.com/wp-content/uploads/2010/05/ie7-security-warning.gif"><img class="aligncenter size-full wp-image-1693" title="ie7-security-warning" src="http://www.loiane.com/wp-content/uploads/2010/05/ie7-security-warning.gif" alt="" width="332" height="150" /></a></p>
<p style="text-align: justify;">Este é um erro comum que ocorre quando algum elemento numa página web segura (que é acessada via <strong>https://</strong> na barra de endereço) não é acessado de uma fonte segura (ou seja, do mesmo domínio). Isso geralmente ocorrer com imagens, frames, iframes, Flash e JavaScripts.</p>
<h3>Como resolver esse &#8220;pequeno problema&#8221; quando sua página/projeto foi desenvolvido com ExtJS?</h3>
<p>Existe uma propriedade na classe <a href="http://www.extjs.com/deploy/ext/docs/output/Ext.html" target="_blank">Ext</a> chamada <a href="http://www.extjs.com/deploy/ext/docs/output/Ext.html#BLANK_IMAGE_URL">BLANK_IMAGE_URL</a>:</p>
<blockquote>
<p style="text-align: justify;">&#8220;URL to a 1&#215;1 transparent gif image used by Ext to create inline icons with CSS background images. (Defaults to &#8220;<em><strong>http://extjs.com/s.gif</strong></em>&#8221; and you should change this to a URL on your server).&#8221;</p>
<p style="text-align: justify;"><strong><em>ou seja:</em></strong></p>
<p style="text-align: justify;">&#8220;URL para uma imagem gif transparente 1&#215;1 usado pelo Ext para criar ícones alinhados com imagens de fundo CSS. (O padrão é &#8220;<strong>http://extjs.com/s.gif</strong>&#8221; e você deve alterar essa caminho para uma URL no seu servidor).&#8221;</p>
</blockquote>
<p>Segue abaixo um screenshot do Firebug quando tentei carregar uma aplicação que usa a biblioteca ExtJS:</p>
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/05/extjs_secure_warning_loiane1.gif"><img class="aligncenter size-full wp-image-1694" title="extjs_secure_warning_loiane1" src="http://www.loiane.com/wp-content/uploads/2010/05/extjs_secure_warning_loiane1.gif" alt="" width="518" height="38" /></a></p>
<p style="text-align: justify;">A solução é bem simples. É preciso apontar a propriedade BLANK_IMAGE_URL para a imagem &#8220;s.gif&#8221; que está no diretório da sua aplicação.</p>
<p style="text-align: left;">Por exemplo:  se o nome da sua aplicação é &#8220;<em><a href="http://github.com/loiane/extjs-crud-grid" target="_blank">extjs-crud-grid</a></em>&#8220;, deve apontar para:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
Ext.onReady(function(){
     Ext.BLANK_IMAGE_URL = '/extjs-crud-grid/ext-3.1.1/resources/images/default/s.gif';
)};
</pre>
<p><em><a href="http://github.com/loiane/extjs-crud-grid" target="_blank">extjs-crud-grid</a></em> &#8211; diretório da aplicação:</p>
<p><a href="http://www.loiane.com/wp-content/uploads/2010/05/extjs_nonsecure_warning_02.gif"><img class="aligncenter size-full wp-image-1695" title="extjs_nonsecure_warning_02" src="http://www.loiane.com/wp-content/uploads/2010/05/extjs_nonsecure_warning_02.gif" alt="" width="365" height="815" /></a></p>
<p>Espero que tenha ajudado!</p>
<p>Bons códigos! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1691&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/uaijGpewPSdGbPDgniY7bThvbks/0/da"><img src="http://feedads.g.doubleclick.net/~a/uaijGpewPSdGbPDgniY7bThvbks/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uaijGpewPSdGbPDgniY7bThvbks/1/da"><img src="http://feedads.g.doubleclick.net/~a/uaijGpewPSdGbPDgniY7bThvbks/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=fXhU4JfEXK0:kEQf4QwAxgs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=fXhU4JfEXK0:kEQf4QwAxgs:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=fXhU4JfEXK0:kEQf4QwAxgs:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/fXhU4JfEXK0" height="1" width="1"/>]]></content:encoded><description>Quando você acessa uma página SSL da sua aplicação web, o sistema mostra um warning com a mensagem: &amp;#8221;This page contains both secure and nonsecure items. Do you want to display the nonsecure items?&amp;#8221; (Esta página contém itens seguros e não seguros. Deseja visualizar os items não seguros?) Este é um erro comum que ocorre quando [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/05/extjs-paginas-ssl-com-itens-nao-seguros/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/05/extjs-paginas-ssl-com-itens-nao-seguros/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-paginas-ssl-com-itens-nao-seguros</feedburner:origLink></item><item><title>8++ perguntas para @loiane – por @hlegius</title><link>http://feedproxy.google.com/~r/Loiane/~3/uSbP-CS7es0/</link><category>pessoal</category><category>certificação</category><category>entrevista</category><category>java</category><category>php</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Tue, 11 May 2010 05:09:50 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1685</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/05/question-mark.jpg"><img class="aligncenter size-full wp-image-1686" title="8++ perguntas para @loiane" src="http://www.loiane.com/wp-content/uploads/2010/05/question-mark.jpg" alt="" width="210" height="186" /></a></p>
<p>Tempos atrás o <a href="http://www.hlegius.pro.br" target="_blank">Helio</a> me enviou um questionário para eu responder, uma espécie de &#8220;entrevista&#8221;. E agora ele publicou no blog dele! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>São minhas opiniões pessoais, e isso não quer dizer que estou certa ou errada, é apenas meu ponto de vista (e cada um tem o seu né?).</p>
<p>Quero agradecer ao <a href="http://www.hlegius.pro.br" target="_blank">Helio</a> pela oportunidade. Obrigada mocinho! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Segue o link do post: <a href="http://www.hlegius.pro.br/8-perguntas-para-loiane/" target="_blank">http://www.hlegius.pro.br/8-perguntas-para-loiane/</a></p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1685&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/K08CVzOSg_UIWMv8iNgWWWHVx68/0/da"><img src="http://feedads.g.doubleclick.net/~a/K08CVzOSg_UIWMv8iNgWWWHVx68/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/K08CVzOSg_UIWMv8iNgWWWHVx68/1/da"><img src="http://feedads.g.doubleclick.net/~a/K08CVzOSg_UIWMv8iNgWWWHVx68/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=uSbP-CS7es0:uekXFnkPk2s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=uSbP-CS7es0:uekXFnkPk2s:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=uSbP-CS7es0:uekXFnkPk2s:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/uSbP-CS7es0" height="1" width="1"/>]]></content:encoded><description>Tempos atrás o Helio me enviou um questionário para eu responder, uma espécie de &amp;#8220;entrevista&amp;#8221;. E agora ele publicou no blog dele! São minhas opiniões pessoais, e isso não quer dizer que estou certa ou errada, é apenas meu ponto de vista (e cada um tem o seu né?). Quero agradecer ao Helio pela oportunidade. [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/05/8-perguntas-para-loiane-por-hlegius/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.loiane.com/2010/05/8-perguntas-para-loiane-por-hlegius/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=8-perguntas-para-loiane-por-hlegius</feedburner:origLink></item><item><title>[Pessoal] Diário de Bordo – Maio</title><link>http://feedproxy.google.com/~r/Loiane/~3/1-jxQuUWW-M/</link><category>pessoal</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Sun, 02 May 2010 05:00:21 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1675</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Me deu vontade de escrever este post para fazer um update do que está acontecendo no momento e para dizer o porquê de estar meio sumida no último mês.</p>
<p style="text-align: justify;">Nas últimas semanas, tenho trabalhado mais com manutenção de um projeto e estou participando da fase de elaboração de um novo projeto, com direto a <a href="http://pt.wikipedia.org/wiki/Scrum" target="_blank">Scrum</a>, etc. A parte mais divertida disso tudo são as reuniões de <a href="http://www.planningpoker.com/" target="_blank">planning poker</a>! Estou tendo muitas reuniões e está sobrando pouco tempo para trabalhar (leia: codificar), e com isso, pouco tempo para estudar coisas novas no trabalho e conseqüentemente postar coisas novas aqui no blog. Ainda está meio incerto, mas provavelmente deve vir um terceiro projeto na minha mão. E detalhe: projetos só com um desenvolvedor, neste caso, euzinha. Meu foco agora está totalmente no trabalho e tentar estudar ainda mais para melhorar.</p>
<p style="text-align: justify;">Estou estudando alguns componentes novos no <a href="http://www.extjs.com/" target="_blank">ExtJS</a> (novos no sentido de nunca ter usado antes) e estou estudando <a href="http://www.springsource.org/" target="_blank">Spring 3</a> e <a href="http://www.infoq.com/br/articles/rest-introduction" target="_blank">REST</a>. Tem um problema que estou um pouco mais de um mês tentado resolver com ExtJS e Spring 3, e isso está tirando meu sono.</p>
<p style="text-align: justify;">Tenho alguns projetos de exemplo prontos, mas está faltando tempo para escrever o tutorial e postar nos blogs (<a href="http://www.loiane.com/" target="_blank">loiane.com</a> e <a href="http://loianegroner.com/" target="_blank">loianegroner.com</a>).</p>
<p style="text-align: justify;">Comecei a estudar <a href="http://pt.wikipedia.org/wiki/Ruby_(linguagem_de_programa%C3%A7%C3%A3o)" target="_blank">Ruby </a>de verdade. Antes sempre lia artigos, tutoriais para tentar ficar por dentro, mas nunca coloquei a mão na massa de fato. Agora comecei a ler o livro <a href="http://oreilly.com/catalog/9780596516178" target="_blank">The Ruby Programming Language</a> e estou praticando aos poucos.</p>
<p style="text-align: justify;">Claro que a vida não se resume somente a trabalho, certo? Também estou lendo <a href="http://www.amazon.com/Lightning-Thief-Percy-Jackson-Olympians/dp/0786838655" target="_blank">Percy Jackson &#8211; The Lightning Thief</a>. Meu <a href="http://cantodobardo.com/" target="_blank">esposo </a>(que é devorador de livros) acompanha a série desde que publicaram o primeiro livro aqui no Brasil, e agora eu comecei a ler em inglês, para aprender mais vocabulário. Por se tratar de um livro infanto-juvenil, a linguagem é bem tranquila para ler em inglês.</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/05/93233862.jpg"><img class="aligncenter size-full wp-image-1677" title="93233862" src="http://www.loiane.com/wp-content/uploads/2010/05/93233862.jpg" alt="" width="384" height="512" /></a></p>
<p style="text-align: justify;">Tenho adotado a prática de comprar livros não técnicos em inglês agora. Primeiro que são mais baratos do que os traduzidos para o português. Segundo porque tô aprendendo muito com a leitura. Não olho no dicionário quando não sei uma palavra. Leio mais um pouco para tentar descobrir o significado no contexto. Se a palavra aparecer mais de uma vez e mesmo assim que não entender, aí pesquiso num dicionário em inglês mesmo, não faço tradução. Isso tem me ajudado muito. Falando nisso, esse ano já li 6 livros não técnicos em inglês, que são os da série <a href="http://www.houseofnightseries.com/" target="_blank">House of Night</a> (pode zuar, eu não ligo! rs). A linguagem é ótima para aprender, tem bastante gírias. Semana passada lançaram o sétimo livro e já encomendei o meu na amazon!</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/05/houseofknightbooks.jpg"><img class="aligncenter size-full wp-image-1676" title="houseofknightbooks" src="http://www.loiane.com/wp-content/uploads/2010/05/houseofknightbooks.jpg" alt="" width="340" height="340" /></a></p>
<p><img class="size-full wp-image-1678 alignleft" title="0511-0709-0401-3307_English_Teacher_clipart_image" src="http://www.loiane.com/wp-content/uploads/2010/05/0511-0709-0401-3307_English_Teacher_clipart_image.jpg" alt="" width="126" height="113" /></p>
<p style="text-align: justify;">Falando em inglês, também virei professora voluntária de inglês básico numa igreja aqui de Campinas. Uma irmã da igreja me convidou e já tem quase 2 meses que dou aula uma vez por semana. Está sendo uma experiência muito legal, principalmente porque a aula é no domingo, e ver adolescentes na sala querendo aprender algo em pleno domingo, simplesmente não tem preço! Vejo que ainda há esperança neste país.</p>
<p style="text-align: justify;">Bem, é isso. Como toda mulher, estou tentando conciliar casa, cachorro, trabalho, família, atividades extras e vida pessoal. Já trabalho faz uns 4+ anos e nunca tirei férias. Tirar um tempo para relaxar também não faz mal a ninguém. Bom que depois volto com muita vontade de escrever para o blog e com tutoriais fresquinhos!</p>
<p style="text-align: justify;"> <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1675&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/VvukFfQWZ3QdXlVRTaJoB4_e1gI/0/da"><img src="http://feedads.g.doubleclick.net/~a/VvukFfQWZ3QdXlVRTaJoB4_e1gI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VvukFfQWZ3QdXlVRTaJoB4_e1gI/1/da"><img src="http://feedads.g.doubleclick.net/~a/VvukFfQWZ3QdXlVRTaJoB4_e1gI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=1-jxQuUWW-M:9yneJcW1FyE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=1-jxQuUWW-M:9yneJcW1FyE:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=1-jxQuUWW-M:9yneJcW1FyE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/1-jxQuUWW-M" height="1" width="1"/>]]></content:encoded><description>Me deu vontade de escrever este post para fazer um update do que está acontecendo no momento e para dizer o porquê de estar meio sumida no último mês. Nas últimas semanas, tenho trabalhado mais com manutenção de um projeto e estou participando da fase de elaboração de um novo projeto, com direto a Scrum, [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/05/pessoal-diario-de-bordo-maio/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">6</slash:comments><feedburner:origLink>http://www.loiane.com/2010/05/pessoal-diario-de-bordo-maio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pessoal-diario-de-bordo-maio</feedburner:origLink></item><item><title>Sorteio de 1 mês de curso de inglês gratuito na Englishtown</title><link>http://feedproxy.google.com/~r/Loiane/~3/Fa28MLp9DQg/</link><category>carreira</category><category>inglês</category><category>sorteio</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Sun, 11 Apr 2010 03:55:02 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1664</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Há algum tempo que venho destacando a importância de inglês para nós, que trabalhamos na área de TI.</p>
<p style="text-align: justify;"><img class="aligncenter" title="sorteio curso englishTown" src="http://ak1.englishtown.com/_imgs/logo_englishtown_global.png" alt="" width="162" height="49" /></p>
<p style="text-align: justify;">Esse blog foi um dos  selecionados  para parceria com a Englishtown, a maior <a href="http://www.englishtown.com.br/online/school.aspx" target="_blank"><span style="text-decoration: underline;">escola  de inglês</span></a> online  do mundo. “O<em>s profissionais de TI usam o inglês diariamente, por  isso a Englishtown oferece módulos especificos para profissionais dessa  área. O blog da Loiane é um bom canal para divulgação desses cursos</em>”,  explica Paula Albocino, relações públicas da Englishtown. Os blogs  e sites selecionados irão oferecer bolsas de estudo a seus leitores.</p>
<p style="text-align: justify;">Para participar do <strong>sorteio</strong> de 1 mês de acesso gratuito aos <a href="http://www.englishtown.com.br/online/online-courses.aspx" target="_blank"><span style="text-decoration: underline;">cursos  de inglês</span></a> online  da Englishtown, basta deixar  um comentário nesse post respondendo a seguinte pergunta:</p>
<p style="text-align: justify;">“<strong>Com qual frequência você  fala inglês no trabalho e por que a fluência no idioma é tão importante  para profissionais de TI?</strong>”</p>
<p style="text-align: justify;">O leitor <strong>sorteado</strong> pelo Blog  da Loiane irá ganhar 1 mês de curso gratuito na Englishtown.</p>
<p style="text-align: justify;">A Englishtown oferece cursos de inglês online, com aulas em grupo e  individuais, com <a href="http://www..englishtown.com.br/online/teachers.aspx" target="_blank"><span style="text-decoration: underline;">professores   nativos</span></a> ao vivo  24 horas. O site da Englishtown possui uma área gratuita com teste  de nivelamento, diversos vídeos, artigos, dicas, exercícios para todos  os níveis, e uma comunidade online com alunos de todo o mundo.</p>
<p style="text-align: justify;">Para quem já é fluente, a Englishtown oferece aulas de preparação  para o <a href="http://www.englishtown.com.br/online/test-preparation.aspx" target="_blank"><span style="text-decoration: underline;">Toefl</span></a> e para o Toeic, além de <a href="http://www.englishtown.com.br/online/business-english.aspx" target="_blank"><span style="text-decoration: underline;">inglês  para negócios</span></a> e  indústrias específicas.</p>
<p style="text-align: justify;">Os leitores terão até o dia 12 de abril (segunda feira) para deixar os comentários!</p>
<p style="text-align: justify;">Boa sorte a todos!</p>
<p style="text-align: justify;">Update: Resultado do sorteio: o ganhador do curso foi o <strong>Glaydson Maget</strong>. Parabéns e obrigado a todos que participaram!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1664&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/6ZvoR07wU6khg_bwJ-FOHcA_oNo/0/da"><img src="http://feedads.g.doubleclick.net/~a/6ZvoR07wU6khg_bwJ-FOHcA_oNo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/6ZvoR07wU6khg_bwJ-FOHcA_oNo/1/da"><img src="http://feedads.g.doubleclick.net/~a/6ZvoR07wU6khg_bwJ-FOHcA_oNo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=Fa28MLp9DQg:zTzoA7Cdq8w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=Fa28MLp9DQg:zTzoA7Cdq8w:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=Fa28MLp9DQg:zTzoA7Cdq8w:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/Fa28MLp9DQg" height="1" width="1"/>]]></content:encoded><description>Há algum tempo que venho destacando a importância de inglês para nós, que trabalhamos na área de TI. Esse blog foi um dos selecionados para parceria com a Englishtown, a maior escola de inglês online do mundo. “Os profissionais de TI usam o inglês diariamente, por isso a Englishtown oferece módulos especificos para profissionais dessa [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/04/sorteio-de-1-mes-de-curso-de-ingles-gratuito-na-englishtown/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">11</slash:comments><feedburner:origLink>http://www.loiane.com/2010/04/sorteio-de-1-mes-de-curso-de-ingles-gratuito-na-englishtown/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sorteio-de-1-mes-de-curso-de-ingles-gratuito-na-englishtown</feedburner:origLink></item><item><title>O que Aprendi em 1 Ano de IBM</title><link>http://feedproxy.google.com/~r/Loiane/~3/__ek_Pt_KXE/</link><category>pessoal</category><category>IBM</category><category>Off-Topic</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 05 Apr 2010 04:40:18 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1647</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Na semana passada completei <a href="http://www.loiane.com/2009/03/off-tempo-de-mudancas/" target="_blank">1 ano de IBM</a>. E também um pouquinho mais de 1 ano que estou em Campinas &#8211; SP. Apenas 1 ano e parece que passaram uns 5 anos, pois cresci muito tanto profissionalmente quanto pessoalmente.</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/03/ibm_hortolandia.jpg"><img class="aligncenter size-full wp-image-1648" title="ibm_hortolandia" src="http://www.loiane.com/wp-content/uploads/2010/03/ibm_hortolandia.jpg" alt="" width="303" height="227" /></a>Bem, neste post vou tentar resumir como foi meu último ano profissional e quais foram as tecnologias que aprendi.</p>
<p style="text-align: justify;">Atuo no meu trabalho como analista de sistemas e desenvolvedora de software pleno. De vez em quando dou uns pitacos como arquiteta de solução e dou uns palpites na hora de escolher certas tecnologias. Amooo estudar (por isso que mantenho esse blog, entre outras razões), e isso me dá liberdade de pesquisar, testar e apresentar novas sugestões na hora de desenvolver um sistema.</p>
<p style="text-align: justify;">Essa parte de pesquisar também faz parte do meu trabalho. Às vezes tenho um dia para estudar, às vezes tenho uma semana para estudar uma tecnologia. Aprender coisas novas é crucial na nossa profissão. Adoro pesquisar, e hoje tenho espaço para fazer os dois.</p>
<p style="text-align: justify;">Em um ano já participei de 3 projetos. O primeiro foi um sistema grande, o segundo foram apenas 3 meses e desenvolvi boa parte do sistema sozinha e o terceiro está começando agora, também com uma equipe bem pequena de desenvolvedores.</p>
<p style="text-align: justify;">Algumas tecnologias que aprendi para desenvolvê-los &#8211; só tinha ouvido falar antes de entrar na IBM, nunca nem tinha feito um hello world:</p>
<ul style="text-align: justify;">
<li><a href="http://www.springsource.org/" target="_blank">Spring MVC e Security</a></li>
<li><a href="http://www.extjs.com/" target="_blank">ExtJS</a> (core e componentes)</li>
<li><a href="http://jquery.com/" target="_blank">JQuery</a> (core)</li>
<li> <a href="http://ibatis.apache.org/" target="_blank">iBatis</a> (alternativa ao Hibernate &#8211; e bem mais leve)</li>
</ul>
<p style="text-align: justify;">Aperfeiçoei (e muuuito): CSS, HTML e javascript. Também comecei a aprender <a href="http://www-03.ibm.com/systems/power/software/aix/index.html" target="_blank">UNIX/AIX</a> e usamos <a href="http://www.scrumalliance.org/" target="_blank">Scrum</a> nos projetos agora. Bem bacana.</p>
<p style="text-align: justify;">Sem falar que meu inglês melhorou horrores. Ganhei muito vocabulário e estou melhorando a gramática bastante (sabe esses erros bobos que a gente comete?). Isso graças às reuniões diárias com o time (que fica todo nos EUA), então tenho muitas oportunidades de praticar (por isso que também criei um <a href="http://loianegroner.com" target="_blank">blog em inglês</a> &#8211; para praticar). Explicando: trabalho diretamente com americanos (chefe, desenvolvedores, tudo), de brasileira só tem a minha pessoa.</p>
<p style="text-align: justify;">O bom de trabalhar para americanos é que você aprende muito com eles. É um nível totalmente diferente daqui. E o legal é que eles levam em consideração idéias de uma pessoa sem muita experiência como eu (que adora experimentar tecnologias novas e desconhecidas). No início as reuniões eram basicamente só escutar. Agora já falo, dou pitaco. O ruim é quando quero falar alguma coisa que não sei expressar em inglês, aí entra o embromation! rs</p>
<p style="text-align: justify;">Bem, a maior parte do conteúdo desse blog vem das minhas horas de estudo. Aprendo uma coisa nova, escrevo e publico aqui. É meu diário de aprendizado profissional. E quase tudo usei nas minhas tarefas do trabalho.</p>
<p style="text-align: justify;">Nesse 1 ano, virei embaixadora acadêmica pelo programa <a href="http://www.loiane.com/2009/09/voce-conhece-o-ibm-academic-initiative/" target="_blank">IBM Academic Initiative</a> e sempre que posso, tento atuar no programa, seja conversando e trocando idéias com alunos, seja ajudando a divulgar as notícas do programa. Já fiz algumas amizadades por isso e aprecio isso.</p>
<p style="text-align: justify;">Também virei mentora de Java no último mês. Ou seja, se algum padawan entrar para o projeto e precisar de treinamento Java, é só falar com a &#8220;tia&#8221; Loiane, que passa umas coisas pra estudar e depois analisa se já pode começar a atuar em um projeto para praticar o que aprendeu. Quando comecei a estagiar, tive dois ótimos mentores, o Thiagão e o <a href="http://www.jeveaux.com/blog/" target="_blank">Jeveaux</a>, que foram muito pacientes e me ensinaram muitas coisas. E por isso sou eternamente grata a eles (e também tenho um carinho especial por terem sidos meus &#8220;tios&#8221;). Espero que agora eu possa repassar o que aprendi a outras pessoas, e assim continuar essa corrente.</p>
<p style="text-align: justify;">Toda essa experiência tem sido muito gratificante para mim. Mudar de estado (ES), entrar numa empresa com uma cultura organizacional bem diferente do que estava acostumada, enfim, sou muito grata aos que me deram essa oportunidade, e espero retribuir toda a confiança que depositaram em mim. Aos responsáveis e a todos que sempre me deram suporte, meu <strong>MUITO OBRIGADA</strong>!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1647&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/EhNAPs4FVAyRzfhwHJsWcMd3s_s/0/da"><img src="http://feedads.g.doubleclick.net/~a/EhNAPs4FVAyRzfhwHJsWcMd3s_s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/EhNAPs4FVAyRzfhwHJsWcMd3s_s/1/da"><img src="http://feedads.g.doubleclick.net/~a/EhNAPs4FVAyRzfhwHJsWcMd3s_s/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=__ek_Pt_KXE:X40Ty2gqBFc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=__ek_Pt_KXE:X40Ty2gqBFc:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=__ek_Pt_KXE:X40Ty2gqBFc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/__ek_Pt_KXE" height="1" width="1"/>]]></content:encoded><description>Na semana passada completei 1 ano de IBM. E também um pouquinho mais de 1 ano que estou em Campinas &amp;#8211; SP. Apenas 1 ano e parece que passaram uns 5 anos, pois cresci muito tanto profissionalmente quanto pessoalmente. Bem, neste post vou tentar resumir como foi meu último ano profissional e quais foram as [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/04/o-que-aprendi-em-1-ano-de-ibm/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">9</slash:comments><feedburner:origLink>http://www.loiane.com/2010/04/o-que-aprendi-em-1-ano-de-ibm/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=o-que-aprendi-em-1-ano-de-ibm</feedburner:origLink></item><item><title>ExtJS e Spring Framework: Exemplo de um CRUD Grid</title><link>http://feedproxy.google.com/~r/Loiane/~3/g7-_cIxefEE/</link><category>Ext JS</category><category>CRUD Grid</category><category>ExtJS</category><category>ExtJS + JEE</category><category>ExtJS Writer</category><category>grid extjs</category><category>RowEditor</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Thu, 25 Mar 2010 05:59:53 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1640</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Este tutorial demonstra como implementar um CRUD Grid (Create, Read, Update, Delete) usando ExtJS e Spring Framework</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/03/extjs_spring_crud_grid.png"><img class="aligncenter size-full wp-image-1643" title="extjs_spring_crud_grid" src="http://www.loiane.com/wp-content/uploads/2010/03/extjs_spring_crud_grid.png" alt="" width="552" height="291" /></a></p>
<p style="text-align: justify;">O que geralmente queremos fazer com os dados</p>
<ul style="text-align: justify;">
<li>Create (Criar) &#8211; (Insert)</li>
<li>Read (Ler/Visualizar) &#8211; (Select)</li>
<li>Update (Atualizar) &#8211; (Update)</li>
<li>Delete (Deletar) &#8211; (Delete)</li>
</ul>
<p style="text-align: justify;">Até a versão 3.0 do ExtJS, podíamos apenas LER dados utilizando o componente dataGrid. Se você quisesse fazer um update, insert ou delete, você tinha que codificar funções específicas para essas ações no lado ExtJS. Com a versão 3.0 (e versões mais recentes) do ExtJS, a biblioteca javascript introduziu o ext.data.writer, e você não tem todo aquele trabalho de criar as funções específicas, pode utilizar o Writer para ter um CRUD Grid.</p>
<p style="text-align: justify;">Mas o que é preciso para ter todas as funcionalidades funcionando apenas com o uso desse writer?</p>
<p style="text-align: justify;">No exemplo desse tutorial, estou usando JSON como formato de dados para troca de informações entre brwoser e servidor.</p>
<p style="text-align: justify;">Primeiro, é preciso criar um Ext.data.JsonWriter:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
 // The new DataWriter component.
    var writer = new Ext.data.JsonWriter({
        encode: true,
        writeAllFields: false
    });
</pre>
<p>Onde writeAllFields significa que queremos enviar todos os campos do registro para o banco de dados. identifies that we want to write all the fields from the record to the database. Se você tem uma estrutura de dados um pouco complicada ou o usuário irá fazer muitas iterações de update, é melhor deixar setado como false.</p>
<p>Por exemplo, Essa é a declaração da minha estrutura de dados no ExtJS:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var Contact = Ext.data.Record.create([
	{name: 'id'},
    {
        name: 'name',
        type: 'string'
    }, {
        name: 'phone',
        type: 'string'
    }, {
        name: 'email',
        type: 'string'
    }, {
        name: 'birthday',
        type: 'date',
        dateFormat: 'm/d/Y'
    }]);
</pre>
<p style="text-align: justify;">Se eu apenas atualizar o nome do contato, a aplicação irá apenas enviar o nome do contato e a id do mesmo para o servidor dizendo que foi atualizado (se o campo writeallfields estiver como false). Se tiver setado como true, irá enviar todos os campos, e o trabalho para descobrir o que sofreu alteração ficará para o server.</p>
<p>Agora, é necessário configurar o proxy, como esse:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var proxy = new Ext.data.HttpProxy({
        api: {
            read : 'contact/view.action',
            create : 'contact/create.action',
            update: 'contact/update.action',
            destroy: 'contact/delete.action'
        }
    });
</pre>
<p>E só para constar, é assim que meu reader se parece:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var reader = new Ext.data.JsonReader({
        totalProperty: 'total',
        successProperty: 'success',
        idProperty: 'id',
        root: 'data',
        messageProperty: 'message'  // &lt;-- New &quot;messageProperty&quot; meta-data
    },
    Contact);
</pre>
<p>O próximo passo é juntat tudo (writer, proxy e reader) no objeto store:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
 // Typical Store collecting the Proxy, Reader and Writer together.
    var store = new Ext.data.Store({
        id: 'user',
        proxy: proxy,
        reader: reader,
        writer: writer,  // &lt;-- plug a DataWriter into the store just as you would a Reader
        autoSave: false // &lt;-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton.
    });
</pre>
<p style="text-align: justify;">O autosave significa que deseja salvar as alterações automaticamente no servidor (não precisa de um botão salvar na tela, assim que o usuário atualizar, deleter ou criar um novo dado, será enviado automaticamente para o servidor). Para este exemplo, implementei um botão salvar, assim, qualquer registro ou dado que for adicionado ou alterado terá uma marcação vermelha (no canto superior esquerdo da célula), assim quando o evento (ou botão) salvar for disparado, serão enviados para o servidor os dados que sofreram alteração (marcados com o flag vermelho). Você pode fazer múltiplos updates e enviar todos para o servidor em apenas uma vez (Observe como isso foi tratado no código da classe de serviço no código fonte desse projeto).</p>
<p>E para deixar a vida ainda mais fácil (afinal, pra isso que usamos bibliotecas como ExtJS <img src='http://www.loiane.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), vamos usar o plugin RowEditor, que permite a edição dos dados de forma muito simples. Tudo o que precisa fazer para usar esse plugin é primeiro adicionar os arquivos necessários na sua página HTML (ou JSP, ou outra extensão!):</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;!-- Row Editor plugin css --&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/css/rowEditorCustom.css&quot; /&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/shared/examples.css&quot; /&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/css/RowEditor.css&quot; /&gt;

&lt;!-- Row Editor plugin js --&gt;
	&lt;script src=&quot;/extjs-crud-grid/ext-3.1.1/examples/ux/RowEditor.js&quot;&gt;&lt;/script&gt;
</pre>
<p>E adicionar o plugin na declaração do grid:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
    var editor = new Ext.ux.grid.RowEditor({
        saveText: 'Update'
    });

    // create grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {header: &quot;NAME&quot;,
             width: 170,
             sortable: true,
             dataIndex: 'name',
             editor: {
                xtype: 'textfield',
                allowBlank: false
            }},
            {header: &quot;PHONE #&quot;,
             width: 150,
             sortable: true,
             dataIndex: 'phone',
             editor: {
                 xtype: 'textfield',
                 allowBlank: false
            }},
            {header: &quot;EMAIL&quot;,
             width: 150,
             sortable: true,
             dataIndex: 'email',
             editor: {
                xtype: 'textfield',
                allowBlank: false
            }},
            {header: &quot;BIRTHDAY&quot;,
             width: 100,
             sortable: true,
             dataIndex: 'birthday',
             renderer: Ext.util.Format.dateRenderer('m/d/Y'),
             editor: new Ext.form.DateField ({
                allowBlank: false,
                format: 'm/d/Y',
                maxValue: (new Date())
            })}
        ],
        plugins: [editor],
        title: 'My Contacts',
        height: 300,
        width:610,
		frame:true,
		tbar: [{
            iconCls: 'icon-user-add',
            text: 'Add Contact',
            handler: function(){
                var e = new Contact({
                    name: 'New Guy',
                    phone: '(000) 000-0000',
                    email: 'new@loianetest.com',
                    birthday: '01/01/2000'
                });
                editor.stopEditing();
                store.insert(0, e);
                grid.getView().refresh();
                grid.getSelectionModel().selectRow(0);
                editor.startEditing(0);
            }
        },{
            iconCls: 'icon-user-delete',
            text: 'Remove Contact',
            handler: function(){
                editor.stopEditing();
                var s = grid.getSelectionModel().getSelections();
                for(var i = 0, r; r = s[i]; i++){
                    store.remove(r);
                }
            }
        },{
            iconCls: 'icon-user-save',
            text: 'Save All Modifications',
            handler: function(){
                store.save();
            }
        }]
    });
</pre>
<p>E Finalmente, precisamos de código no lado servidor. O Controller que implementei ficou assim:</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.web;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.loiane.model.Contact;
import com.loiane.service.ContactService;

public class ContactController extends MultiActionController  {

	private ContactService contactService;

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		try{

			List&lt;Contact&gt; contacts = contactService.getContactList();

			return getModelMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to retrieve contacts.&quot;);
		}
	}

	public ModelAndView create(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		try{

			Object data = request.getParameter(&quot;data&quot;);

			List&lt;Contact&gt; contacts = contactService.create(data);

			return getModelMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to create contact.&quot;);
		}
	}

	public ModelAndView update(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		try{

			Object data = request.getParameter(&quot;data&quot;);

			List&lt;Contact&gt; contacts = contactService.update(data);

			return getModelMap(contacts);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to update contact.&quot;);
		}
	}

	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		try{

			String data = request.getParameter(&quot;data&quot;);

			contactService.delete(data);

			Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(3);
			modelMap.put(&quot;success&quot;, true);

			return new ModelAndView(&quot;jsonView&quot;, modelMap);

		} catch (Exception e) {

			return getModelMapError(&quot;Error trying to delete contact.&quot;);
		}
	}

	/**
	 * Generates modelMap to return in the modelAndView
	 * @param contacts
	 * @return
	 */
	private ModelAndView getModelMap(List&lt;Contact&gt; contacts){

		Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(3);
		modelMap.put(&quot;total&quot;, contacts.size());
		modelMap.put(&quot;data&quot;, contacts);
		modelMap.put(&quot;success&quot;, true);

		return new ModelAndView(&quot;jsonView&quot;, modelMap);
	}

	/**
	 * Generates modelMap to return in the modelAndView in case
	 * of exception
	 * @param msg message
	 * @return
	 */
	private ModelAndView getModelMapError(String msg){

		Map&lt;String,Object&gt; modelMap = new HashMap&lt;String,Object&gt;(2);
		modelMap.put(&quot;message&quot;, msg);
		modelMap.put(&quot;success&quot;, false);

		return new ModelAndView(&quot;jsonView&quot;,modelMap);
	}

	/**
	 * Spring use - DI
	 * @param dadoService
	 */
	public void setContactService(ContactService contactService) {
		this.contactService = contactService;
	}

}
</pre>
<p>Se quiser visualizar o código inteiro dessa app de exemplo (ou fazer o donwload do código completo), visite o meu repositório do GitHub: <a href="http://github.com/loiane/extjs-crud-grid" target="_blank">http://github.com/loiane/extjs-crud-grid</a></p>
<p>Só mais uma observação: você pode usar o dataWriter para salvar as informações que foram arrastadas para o grid com o plugin DataDrop (<a href="http://www.loiane.com/2010/03/como-importar-arquivo-excel-para-um-extjs-datagrid-usando-datadrop-grid-plugin/" target="_blank">Lembra do plugin?</a>). Também incluí o plugin no projeto, caso deseje testar.</p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1640&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/SYHRvH4-KlGy_STt7b1HazL3yv4/0/da"><img src="http://feedads.g.doubleclick.net/~a/SYHRvH4-KlGy_STt7b1HazL3yv4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SYHRvH4-KlGy_STt7b1HazL3yv4/1/da"><img src="http://feedads.g.doubleclick.net/~a/SYHRvH4-KlGy_STt7b1HazL3yv4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=g7-_cIxefEE:UvBzG100HV0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=g7-_cIxefEE:UvBzG100HV0:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=g7-_cIxefEE:UvBzG100HV0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/g7-_cIxefEE" height="1" width="1"/>]]></content:encoded><description>Este tutorial demonstra como implementar um CRUD Grid (Create, Read, Update, Delete) usando ExtJS e Spring Framework O que geralmente queremos fazer com os dados Create (Criar) &amp;#8211; (Insert) Read (Ler/Visualizar) &amp;#8211; (Select) Update (Atualizar) &amp;#8211; (Update) Delete (Deletar) &amp;#8211; (Delete) Até a versão 3.0 do ExtJS, podíamos apenas LER dados utilizando o componente dataGrid. [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/03/extjs-e-spring-framework-exemplo-de-um-crud-grid/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">10</slash:comments><feedburner:origLink>http://www.loiane.com/2010/03/extjs-e-spring-framework-exemplo-de-um-crud-grid/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-e-spring-framework-exemplo-de-um-crud-grid</feedburner:origLink></item><item><title>Cartão de Referência Unix e Vi – Linha de Comando</title><link>http://feedproxy.google.com/~r/Loiane/~3/FU4KOfWqbuE/</link><category>Unix</category><category>AIX</category><category>cheat sheets</category><category>linux</category><category>Mac OS</category><category>ref cards</category><category>Vi</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Wed, 17 Mar 2010 10:44:28 PDT</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1630</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/03/3cheating.jpg"><img class="aligncenter size-full wp-image-1638" title="3cheating" src="http://www.loiane.com/wp-content/uploads/2010/03/3cheating.jpg" alt="" width="326" height="216" /></a></p>
<p style="text-align: justify;">No começo dessa semana, comecei a usar <strong>Unix/Aix</strong> no trabalho para algumas tarefas.  E tenho que confessar: fiquei muito confusa com todos aqueles comandos que não são nada intuitivos.</p>
<p style="text-align: justify;">Estava parecendo aquelas pessoas que nunca ligaram um computador na vida e você precisa ensiná-los como usar o mouse e como move o cursor na tela. Totalmente iniciante.</p>
<p style="text-align: justify;">E com isso, é claro que preciso daquelas&#8221;<em> colinhas</em>&#8220;, estilo cartão de referência quando trabalho no ambiente de linha de comando. Até imprimi e coloquei algumas na baia do meu trabalho.</p>
<p style="text-align: justify;">Resolvi procurar no Google e encontrei algumas cheat sheets/ref cards bem interessantes. E resolvi compartilhar (caso também precise disso como eu):</p>
<p style="text-align: justify;"><object width="500" height="410"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=dd-unixcheatsheet-100317121119-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=dd-unixcheatsheet-100317121119-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="410"></embed></object></p>
<p style="text-align: justify;"><object width="500" height="410"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=dd-vieditorcheatsheet-100317121328-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=dd-vieditorcheatsheet-100317121328-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="410"></embed></object></p>
<p style="text-align: justify;"><object width="500" height="410"><param name="movie" value="http://static.slideshare.net/swf/ssplayerd.swf?doc=vicheatsheet-100317121048-phpapp01"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayerd.swf?doc=vicheatsheet-100317121048-phpapp01"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="410"></embed></object></p>
<p style="text-align: justify;"><object width="500" height="410"><param name="movie" value="http://static.slideshare.net/swf/ssplayerd.swf?doc=bashvieditingmodecheatsheet-100317122507-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayerd.swf?doc=bashvieditingmodecheatsheet-100317122507-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="410"></embed></object></p>
<p style="text-align: justify;"><strong>Referências:</strong></p>
<p style="text-align: justify;"><a href="http://www.atmos.albany.edu/deas/atmclasses/atm350/vi_cheat_sheet.pdf" target="_blank">vi Editor “Cheat Sheet”</a><br />
<a href="http://www.scottklarr.com/topic/115/linux-unix-cheat-sheets---the-ultimate-collection/" target="_blank"> Linux-Unix cheat sheets &#8211; The ultimate collection</a><br />
<a href="http://www.devdaily.com/blog/post/page-1/unix-vi-editor-cheat-sheets" target="_blank"> Free Unix/Linux and vi/vim cheat sheets</a></p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1630&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/P8aPLwYC9802dPWKPDRp59X7mPg/0/da"><img src="http://feedads.g.doubleclick.net/~a/P8aPLwYC9802dPWKPDRp59X7mPg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/P8aPLwYC9802dPWKPDRp59X7mPg/1/da"><img src="http://feedads.g.doubleclick.net/~a/P8aPLwYC9802dPWKPDRp59X7mPg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=FU4KOfWqbuE:CLN0qwgYjEk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=FU4KOfWqbuE:CLN0qwgYjEk:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=FU4KOfWqbuE:CLN0qwgYjEk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/FU4KOfWqbuE" height="1" width="1"/>]]></content:encoded><description>No começo dessa semana, comecei a usar Unix/Aix no trabalho para algumas tarefas.  E tenho que confessar: fiquei muito confusa com todos aqueles comandos que não são nada intuitivos. Estava parecendo aquelas pessoas que nunca ligaram um computador na vida e você precisa ensiná-los como usar o mouse e como move o cursor na tela. [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/03/cartao-de-referencia-unix-e-vi-linha-de-comando/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">5</slash:comments><feedburner:origLink>http://www.loiane.com/2010/03/cartao-de-referencia-unix-e-vi-linha-de-comando/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cartao-de-referencia-unix-e-vi-linha-de-comando</feedburner:origLink></item><item><title>Como Importar Arquivo Excel para um ExtJS DataGrid usando DataDrop Grid Plugin</title><link>http://feedproxy.google.com/~r/Loiane/~3/dMTOEUVZo-c/</link><category>Ext JS</category><category>excel</category><category>ExtJS</category><category>grid extjs</category><category>importar excel</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 08 Mar 2010 05:31:13 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1619</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/03/extjs_datadrop_excel_grid_plugin.jpg"><img class="aligncenter size-full wp-image-1621" title="extjs_datadrop_excel_grid_plugin" src="http://www.loiane.com/wp-content/uploads/2010/03/extjs_datadrop_excel_grid_plugin.jpg" alt="" width="749" height="396" /></a></p>
<p style="text-align: justify;">Este tutorial mostra como importar dados de uma planilha excel para um grid/tabela do ExtJS usando o plugin DataDrop (por <a href="http://www.vinylfox.com/" target="_blank">Shea Freaderick</a>) &#8211; selecionar, clicar e arrastar.</p>
<p style="text-align: justify;">Semana passada estava procurando um plugin que permite importar dados do excel diretamente para um grid.</p>
<p style="text-align: justify;">Não achei nenhum plugin que fizesse isso no <a href="http://www.extjs.com/forum/" target="_blank">forum ExtJS</a> que funcione como o <a href="http://www.loiane.com/2010/02/extjs-exportar-de-grid-para-excel/" target="_blank">plugin para exportar dados do grid para excel</a>; isto é, em plugin que não precise de nenhum código no lado servidor –  bem, se quisesse algum código do lado servidor eu poderia simplesmente usar o <a href="http://www.loiane.com/2010/03/tutorial-upload-de-arquivo-com-extjs-e-spring-framework/" target="_blank">plugin para fazer upload de arquivo</a> e fazer toda a parte da lógica no lado servidor (com Java, PHP ou qualquer outra linguagem), mas não era isso que eu estava procurando.</p>
<p style="text-align: justify;">Entretanto, achei um plugin muito interessante. Na verdade, esse plugin é tudo de bom. Até agora, é o plugin mais legal que já vi para data grid do ExtJS! Realmente é incrível e virei super fã dos envolvidos no desenvolvimento deste.</p>
<p style="text-align: justify;"><strong>Ok, mas o que é este plugin de que tanto estou falando?</strong></p>
<p style="text-align: justify;">É chamado de <a href="http://www.vinylfox.com/datadrop-drag-grid-data-from-spreadsheet/" target="_blank">DataDrop</a> desenvolvido por <a href="http://www.vinylfox.com/" target="_blank">Shea Frederick</a> (também conhecido como <a href="http://www.vinylfox.com/" target="_blank">VinylFox</a> no fórum do ExtJS) e você pode fazer drag e drop a partir de uma planilha excel. Muito legal!</p>
<p style="text-align: justify;">Esse plugin é muito útil se você precisa importar dados do excel de maneira super rápida. Mas no meu ponto de vista, se você precisar importar uma quantidade grande de dados de uma planilha, esse plugin não é muito prático, quer dizer, não é prático selecionar várias linhas e colunas da planilha (digamos, umas 10 mil linhas &#8211; isso vai ser um pouco chato de fazer). Bem, de qualquer maneira, o plugin funciona!</p>
<p style="text-align: justify;"><strong>O que é preciso para usar o plugin?</strong></p>
<p style="text-align: justify;"><strong>1 &#8211; Download do plugin do repositório do autor (</strong><a href="http://code.google.com/p/ext-ux-datadrop/" target="_blank"><strong>Google code</strong></a><strong>)</strong></p>
<p style="text-align: justify;"><strong>2 &#8211; Adicionar os imports dos arquivos javascript na sua página html (juntamente com os outros imports de outros arquivos ExtJS)</strong></p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
	&lt;script src=&quot;/extjs-grid-dragdrop-excel/js/datadrop-plugin/Override.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;/extjs-grid-dragdrop-excel/js/datadrop-plugin/Ext.ux.DataDrop.js&quot;&gt;&lt;/script&gt;
</pre>
<p style="text-align: justify;"><strong>3 &#8211; Adicionar o “</strong><em><strong>Ext.ux.grid.DataDrop</strong></em><strong>” na declaração de plugins do datagrid:</strong></p>
<pre class="brush: jscript; collapse: false; first-line: 1; highlight: [11]; toolbar: true; wrap-lines: false;">
    // create grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {header: &quot;NAME&quot;, width: 170, sortable: true, dataIndex: 'name'},
            {header: &quot;PHONE #&quot;, width: 150, sortable: true, dataIndex: 'phone'},
            {header: &quot;EMAIL&quot;, width: 150, sortable: true, dataIndex: 'email'},
            {header: &quot;BIRTHDAY&quot;, width: 100, sortable: true, dataIndex: 'birthday',
            	renderer: Ext.util.Format.dateRenderer('m/d/Y')}
        ],
        plugins: [Ext.ux.grid.DataDrop],
        title: 'My Contacts',
        autoHeight:true,
        width:590,
		renderTo: document.body,
		frame:true
    });
</pre>
<p style="text-align: justify;">Você pode fazer o donwload do exemplo que fiz a partir do meu respositório GitHub: <a href="http://github.com/loiane/extjs-grid-dragdrop-excel" target="_blank">http://github.com/loiane/extjs-grid-dragdrop-excel</a></p>
<p style="text-align: justify;"><strong>Outras observações:</strong></p>
<p style="text-align: justify;">No <a href="http://www.vinylfox.com/datadrop-drag-grid-data-from-spreadsheet/" target="_blank">website do VinylFox</a>, tem um vídeo que demonstra como o plugin funciona, e ele usa o Open Office.</p>
<p style="text-align: justify;">Na minha primeira tentativa para fazer o plugin funcionar, tentei selecionar dados do Microsoft Excel e fazer o drag e drop no grid, mas não sabia como arrastar os dados do excel (sim, eu sei, sou totalmente newbie quando se trata de M$ Excel– só sei fazer matemática básica – realmente vergonhoso! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ) – Com Open Office e Lotus Symphony é tão simples, você pode selecionar e clicar em qualquer lugar da seleção para arrastar!</p>
<p style="text-align: justify;">If you are newbie just like me, Bem, se você for um newbie como eu, fiz um pequeno vídeo demonstrando como fazer (tem que clicar na borda da seleção para arrastar):</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/Seq7rQgILvg&amp;hl=pt_BR&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/Seq7rQgILvg&amp;hl=pt_BR&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p style="text-align: justify;">Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1619&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/B72nDVsO_KIjDisxh6dVrGaAAmg/0/da"><img src="http://feedads.g.doubleclick.net/~a/B72nDVsO_KIjDisxh6dVrGaAAmg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/B72nDVsO_KIjDisxh6dVrGaAAmg/1/da"><img src="http://feedads.g.doubleclick.net/~a/B72nDVsO_KIjDisxh6dVrGaAAmg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=dMTOEUVZo-c:HGx6RSJk9Rg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=dMTOEUVZo-c:HGx6RSJk9Rg:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=dMTOEUVZo-c:HGx6RSJk9Rg:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/dMTOEUVZo-c" height="1" width="1"/>]]></content:encoded><description>Este tutorial mostra como importar dados de uma planilha excel para um grid/tabela do ExtJS usando o plugin DataDrop (por Shea Freaderick) &amp;#8211; selecionar, clicar e arrastar. Semana passada estava procurando um plugin que permite importar dados do excel diretamente para um grid. Não achei nenhum plugin que fizesse isso no forum ExtJS que funcione [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/03/como-importar-arquivo-excel-para-um-extjs-datagrid-usando-datadrop-grid-plugin/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/03/como-importar-arquivo-excel-para-um-extjs-datagrid-usando-datadrop-grid-plugin/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=como-importar-arquivo-excel-para-um-extjs-datagrid-usando-datadrop-grid-plugin</feedburner:origLink></item><item><title>Tutorial: Upload de Arquivo com ExtJS e Spring Framework</title><link>http://feedproxy.google.com/~r/Loiane/~3/AnrT2GaaQ5I/</link><category>Ext JS</category><category>Spring</category><category>ExtJS</category><category>ExtJS + JEE</category><category>file upload</category><category>upload arquivo</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 01 Mar 2010 03:30:59 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1583</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: center;"><a href="http://www.loiane.com/wp-content/uploads/2010/02/file_upload_spring_extjs_loiane.png"><img class="aligncenter size-full wp-image-1587" style="border: 1px solid black;" title="file_upload_spring_extjs_loiane" src="http://www.loiane.com/wp-content/uploads/2010/02/file_upload_spring_extjs_loiane.png" alt="" width="513" height="149" /></a></p>
<p>Esse tutorial aborda como implementar um form para upload de arquivo usando o form ExtJS no lado cliente e Spring Framework no lado servidor.</p>
<p>O que você precisa antes de começar esse tutorial?</p>
<ul>
<li><a href="http://www.extjs.com/" target="_blank">ExtJS</a></li>
<li><a href="http://www.springsource.com/download/community" target="_blank">Spring Framework</a> (MVC) e dependências (há uma opção com dependência para download)</li>
<li><a href="http://commons.apache.org/downloads/download_io.cgi" target="_blank">commons-io-1.4.jar</a></li>
<li><a href="http://commons.apache.org/downloads/download_fileupload.cgi" target="_blank">commons-fileupload-1.2.jar</a></li>
</ul>
<p>Primeiro precisa implementar o form de upload. você pode usar o que está disponível na página de exemplo do ExtJS (<a href="http://www.extjs.com/deploy/dev/examples/form/file-upload.html" target="_blank">File Upload example</a>) para ver as opções disponíveis (Estou usando o terceiro form).<br />
Abaixo está o código que implementei (ou melhor, copiei da página de exemplo do ExtJS e adaptei de acordo com minha necessidade &#8211; Spring):</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
Ext.onReady(function(){

    Ext.QuickTips.init();

    var msg = function(title, msg){
        Ext.Msg.show({
            title: title,
            msg: msg,
            minWidth: 200,
            modal: true,
            icon: Ext.Msg.INFO,
            buttons: Ext.Msg.OK
        });
    };

    var fp = new Ext.FormPanel({
        renderTo: 'fi-form',
        fileUpload: true,
        width: 500,
        frame: true,
        title: 'File Upload Form',
        autoHeight: true,
        bodyStyle: 'padding: 10px 10px 0 10px;',
        labelWidth: 50,
        defaults: {
            anchor: '95%',
            allowBlank: false,
            msgTarget: 'side'
        },
        items: [{
            xtype: 'fileuploadfield',
            id: 'form-file',
            emptyText: 'Select a File to import',
            fieldLabel: 'File',
            name: 'file',
            buttonCfg: {
                text: '',
                iconCls: 'upload-icon'
            }
        }],
        buttons: [{
            text: 'Upload',
            handler: function(){
                if(fp.getForm().isValid()){
	                fp.getForm().submit({
	                    url: 'fileUpload/import.action',
	                    waitMsg: 'Uploading your file...',
	                    success: function(fp, o){
	                        msg('Success', 'Processed file on the server');
	                    }
	                });
                }
            }
        },{
            text: 'Reset',
            handler: function(){
                fp.getForm().reset();
            }
        }]
    });

});
</pre>
<p>E aqui tem o exemplo de como usar (página HTML):</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Spring FileUpload Example with ExtJS Form&lt;/title&gt;

    &lt;!-- Ext JS files --&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-file-import-spring/ext-3.1.1/resources/css/ext-all.css&quot; /&gt;

	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-file-import-spring/ext-3.1.1/examples/shared/examples.css&quot; /&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/extjs-file-import-spring/ext-3.1.1/examples/ux/fileuploadfield/css/fileuploadfield.css&quot;/&gt;

	&lt;style type=text/css&gt;
        .upload-icon {
            background: url('/extjs-file-import-spring/ext-3.1.1/examples/shared/icons/fam/image_add.png') no-repeat 0 0 !important;
        }
    &lt;/style&gt;

	&lt;script src=&quot;/extjs-file-import-spring/ext-3.1.1/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;/extjs-file-import-spring/ext-3.1.1/ext-all.js&quot;&gt;&lt;/script&gt;

	&lt;script src=&quot;/extjs-file-import-spring/ext-3.1.1/examples/ux/fileuploadfield/FileUploadField.js&quot;&gt;&lt;/script&gt;

	&lt;!-- file upload form --&gt;
	&lt;script src=&quot;/extjs-file-import-spring/js/file-upload.js&quot;&gt;&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;

	&lt;h1&gt;Spring File Upload Example Integrated with ExtJS FileUpload Form&lt;/h1&gt;
	&lt;p&gt;Click on &quot;Browse&quot; button (image) to select a file and click on Upload button&lt;/p&gt;
	&lt;div id=&quot;fi-form&quot;&gt;&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Antes de começar a codificar o Controoler, é necessário ter um FileUploadBean (não é obrigatório, mas para deixar mais organizado):</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.beans;

import org.springframework.web.multipart.MultipartFile;

public class FileUploadBean {

	private MultipartFile file;

	public MultipartFile getFile() {
		return file;
	}

	public void setFile(MultipartFile file) {
		this.file = file;
	}

}
</pre>
<p>E aqui está o FileUploadController (apenas estou gravando o arquivo que foi feito upload para o diretório C:). Você pode adicionar alguma validação ou processar o arquivo nesta classe (mas por favor, adicione uma classe de serviço para isso &#8211; controller é apenas para redirecionar o request! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Você também pode retornar mensagens para o ExtJS dizendo que foi um sucesso ou alguma mensagem de erro.</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.web;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import com.loiane.beans.FileUploadBean;

public class FileUploadController extends SimpleFormController  {

	protected ModelAndView onSubmit(
			HttpServletRequest request,
			HttpServletResponse response,
			Object command,
			BindException errors) throws ServletException, IOException {

		// cast the bean
		FileUploadBean bean = (FileUploadBean) command;

		MultipartFile file = bean.getFile();
		String fileName = null;

		if (file == null) {
			System.out.println(&quot;User Did not upload file&quot;);
		}
		else {
			System.out.println(&quot;Uploaded File Name is :&quot; + file.getOriginalFilename());
		}

		InputStream inputStream = null;
		OutputStream outputStream = null;
		if (file.getSize() &gt; 0) {
			inputStream = file.getInputStream();
			String root = &quot;C:\\&quot;;
			fileName = root + file.getOriginalFilename();
			outputStream = new FileOutputStream(fileName);
			int readBytes = 0;
			byte[] buffer = new byte[10000];
			while ((readBytes = inputStream.read(buffer, 0 , 10000))!=-1){

				outputStream.write(buffer, 0, readBytes);
			}
			outputStream.close();
			inputStream.close();
		}

		return null;

	}

	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
	throws ServletException {
		// to actually be able to convert Multipart instance to byte[]
		// we have to register a custom editor
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
		// now Spring knows how to handle multipart object and convert them
	}

}
</pre>
<p>Também é preciso adicionar esse bloco de código no arquivo servlet.xml:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
	&lt;!-- max upload size in bytes --&gt;
     &lt;bean id=&quot;multipartResolver&quot; class=&quot;org.springframework.web.multipart.commons.CommonsMultipartResolver&quot;&gt;
     	&lt;property name=&quot;maxUploadSize&quot; value=&quot;1000000&quot;/&gt;
     &lt;/bean&gt;
</pre>
<p>Bem simples!</p>
<p>Você pode fazer o download do projeto de exemplo do meu github: <a href="http://github.com/loiane/extjs-file-import-spring" target="_blank">http://github.com/loiane/extjs-file-import-spring</a></p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1583&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/52OUJjPG-FfTToBCKEUIqerQSAc/0/da"><img src="http://feedads.g.doubleclick.net/~a/52OUJjPG-FfTToBCKEUIqerQSAc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/52OUJjPG-FfTToBCKEUIqerQSAc/1/da"><img src="http://feedads.g.doubleclick.net/~a/52OUJjPG-FfTToBCKEUIqerQSAc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=AnrT2GaaQ5I:Bc_3TcjOn7w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=AnrT2GaaQ5I:Bc_3TcjOn7w:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=AnrT2GaaQ5I:Bc_3TcjOn7w:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/AnrT2GaaQ5I" height="1" width="1"/>]]></content:encoded><description>Esse tutorial aborda como implementar um form para upload de arquivo usando o form ExtJS no lado cliente e Spring Framework no lado servidor. O que você precisa antes de começar esse tutorial? ExtJS Spring Framework (MVC) e dependências (há uma opção com dependência para download) commons-io-1.4.jar commons-fileupload-1.2.jar Primeiro precisa implementar o form de upload. [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/03/tutorial-upload-de-arquivo-com-extjs-e-spring-framework/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.loiane.com/2010/03/tutorial-upload-de-arquivo-com-extjs-e-spring-framework/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-upload-de-arquivo-com-extjs-e-spring-framework</feedburner:origLink></item><item><title>Concurso de Mainframes IBM</title><link>http://feedproxy.google.com/~r/Loiane/~3/TFaKwUdSzPQ/</link><category>IBM</category><category>IBM Academic Initiative</category><category>developerWorks</category><category>concurso</category><category>mainframe</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Thu, 25 Feb 2010 05:45:14 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1564</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Os participantes do concurso deverão desenvolver aplicações em linguagem EGL para Mainframe e para isso poderão utilizar a versão gratuita do IBM Rational EGL Community Edition, disponível no <a href="http://www.ibm.com/developerworks/downloads/r/eglcommunity/index.html?S_TACT=105AGX15&amp;S_CMP=LP">portal developerWorks</a>.</p>
<p>Os projetos apresentados deverão ter uma proposta detalhada de uma aplicação Mainframe, que serão posteriormente analisadas e avaliadas por um painel de juízes qualificados. A IBM também irá disponibilizar para <a href="http://download.boulder.ibm.com/ibmdl/pub/software/rational/mainframecontest/sbc_template.doc">download</a> um modelo de abstract, que poderá ajudar os estudantes na composição de seus projetos.</p>
<p>As aplicações desenvolvidas serão julgadas quanto a sua complexidade, funcionalidade e usabilidade das aplicações propostas. Ao todo serão 4 critérios de avaliação, em que cada item terá uma nota de 1 a 25 pontos.</p>
<h2>Critérios de avaliação:</h2>
<p>1. Objetividade da documentação<br />
2. Entendimento técnico<br />
3. Usabilidade real da aplicação de acordo com os benefícios propostos<br />
4. Conjunto de funcionalidades apresentadas pela aplicação (de acordo com os requisitos submetidos e com a documentação proposta)</p>
<p>Vale lembrar que os participantes poderão desenvolver seus projetos em duplas. Os vencedores serão premiados com notebook Lenovo (1º lugar), GPS (2º lugar) e MP3 Players (3º lugar), de acordo com o ranking de classificação.</p>
<p>O abstract de cada projeto deverá ser enviado para análise até o dia 20 de Março de 2010.</p>
<table>
<tbody>
<tr>
<td bgcolor="white"><img class="aligncenter size-full wp-image-1569" title="Banner - Developer Works" src="http://www.loiane.com/wp-content/uploads/2010/02/ibm_concurso_mainframe01.jpeg" alt="Banner - Developer Works" width="600" height="89" /></td>
</tr>
<tr>
<td bgcolor="white"><img class="aligncenter size-full wp-image-1570" title="Concorra a prêmios participando do Concurso de Mainframes! Subtitle: Proponha uma aplicação inovadora para um Planeta mais Inteligente." src="http://www.loiane.com/wp-content/uploads/2010/02/ibm_concurso_mainframe02.jpeg" alt="Concorra a prêmios participando do Concurso de Mainframes! Subtitle: Proponha uma aplicação inovadora para um Planeta mais Inteligente." width="600" height="120" /></td>
</tr>
<tr>
<td bgcolor="white"><img class="aligncenter size-full wp-image-1571" title="Prove seu talento ao propor a criação de uma aplicação para uso na plataforma Mainframe que traga benefícios reais para o nosso planeta. Que tipo de aplicativo poderia ajudar profissionais ou mesmo uma empresa ao usar toda a potência desse servidor? Reúna seus colegas, pensem em desafios reais e desafie sua criatividade!" src="http://www.loiane.com/wp-content/uploads/2010/02/ibm_concurso_mainframe03.jpeg" alt="Prove seu talento ao propor a criação de uma aplicação para uso na plataforma Mainframe que traga benefícios reais para o nosso planeta. Que tipo de aplicativo poderia ajudar profissionais ou mesmo uma empresa ao usar toda a potência desse servidor? Reúna seus colegas, pensem em desafios reais e desafie sua criatividade!" width="600" height="120" /></td>
</tr>
<tr>
<td bgcolor="white"><img class="aligncenter size-full wp-image-1572" title="As duplas vencedoras poderão ganhar: 1º lugar: 2 Notebooks Lenovo; 2º lugar: 2 GPS; 3º lugar: 2 MP3 Players." src="http://www.loiane.com/wp-content/uploads/2010/02/ibm_concurso_mainframe04.jpeg" alt="As duplas vencedoras poderão ganhar: 1º lugar: 2 Notebooks Lenovo; 2º lugar: 2 GPS; 3º lugar: 2 MP3 Players." width="600" height="120" /></td>
</tr>
<tr>
<td bgcolor="white"><a href="http://www.ibm.com/software/br/rational/mainframecontest" target="_blank"><img class="aligncenter size-full wp-image-1573" title="Faça a sua inscrição agora mesmo" src="http://www.loiane.com/wp-content/uploads/2010/02/ibm_concurso_mainframe05.jpeg" alt="Faça a sua inscrição agora mesmo" width="600" height="120" /></a></td>
</tr>
</tbody>
</table>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1564&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/-Ajtps_50baY7JryX4rGVp-lcBk/0/da"><img src="http://feedads.g.doubleclick.net/~a/-Ajtps_50baY7JryX4rGVp-lcBk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-Ajtps_50baY7JryX4rGVp-lcBk/1/da"><img src="http://feedads.g.doubleclick.net/~a/-Ajtps_50baY7JryX4rGVp-lcBk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=TFaKwUdSzPQ:Eu4sHw-WXDs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=TFaKwUdSzPQ:Eu4sHw-WXDs:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=TFaKwUdSzPQ:Eu4sHw-WXDs:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/TFaKwUdSzPQ" height="1" width="1"/>]]></content:encoded><description>Os participantes do concurso deverão desenvolver aplicações em linguagem EGL para Mainframe e para isso poderão utilizar a versão gratuita do IBM Rational EGL Community Edition, disponível no portal developerWorks. Os projetos apresentados deverão ter uma proposta detalhada de uma aplicação Mainframe, que serão posteriormente analisadas e avaliadas por um painel de juízes qualificados. A IBM [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/concurso-de-mainframes-ibm/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/concurso-de-mainframes-ibm/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=concurso-de-mainframes-ibm</feedburner:origLink></item><item><title>Carreira em TI: Currículo para Primeiro Estágio</title><link>http://feedproxy.google.com/~r/Loiane/~3/_HiKVF1ZTPo/</link><category>carreira</category><category>currículo</category><category>currículo estágio</category><category>currículo estudante</category><category>estágio</category><category>primeiro currículo</category><category>primeiro emprego</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 22 Feb 2010 05:33:32 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1503</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/02/curriculum_ti_primeiro_estagio.jpg"><img class="aligncenter size-medium wp-image-1561" title="curriculum_ti_primeiro_estagio" src="http://www.loiane.com/wp-content/uploads/2010/02/curriculum_ti_primeiro_estagio-300x123.jpg" alt="" width="300" height="123" /></a>Fazer um bom currículo é considerado uma tarefa difícil. Fazer um currículo para o primeiro estágio ou primeiro emprego é considerado por muitos uma tarefa impossível. Este post tem como objetivo apresentar algumas dicas para deixar essa tarefa mais fácil.</p>
<p style="text-align: justify;">Mesmo em início de carreira, o estudante e o profissional recém-formado devem ter os mesmos cuidados de um profissional ao elaborar o seu currículo. Apesar de muitas vezes não ter atuado na área de interesse, ele deve enfatizar o seu potencial, mencionando os conhecimentos que adquiriu durante a fase de faculdade.</p>
<p style="text-align: justify;">Um ponto importante é escrever o currículo em <strong>3ª pessoa</strong>. Lembre-se que currículo é um documento, e não uma cartinha que está escrevendo.</p>
<p style="text-align: justify;">Um bom currículo deve começar com seu nome seguido ou não dos seus dados pessoais (pode colocar no final do currículo). Pausa para explicação: dados pessoais são os seus dados de contato. N<strong>ão coloque RG, CPF, endereço</strong>. Se o empregador quiser saber esses dados, ou vai te perguntar na entrevista ou vai pedir isso explicitamente no anúncio da vaga. Se o empregador não pedir explicitamente, não coloque. Só vai deixar o currículo mais feio. Coloque <strong>apenas nome, telefone de contato e email</strong>.</p>
<p style="text-align: justify;">Logo após o seu nome ou dados pessoais, vem o <strong>sumário</strong>. O sumário é um resumo da sua carreira profissional. Por exemplo: <em>Desenvolvedor Java com X anos de experiência, etc.</em></p>
<p style="text-align: justify;">No próprio sumário (ou após ele), você deve colocar os seus <em>conhecimentos técnicos</em>:<br />
<em>Linguagens: Java, C++;</em><em><br />
<em>IDEs: Eclipse, Netbeans, etc.</em><br />
</em><em>Frameworks: JSF, Struts, Spring</em></p>
<p style="text-align: justify;"><em>Se for o seu primeiro currículo, ou seja, se você não tem nenhuma experiência, coloque as ferramentas e linguages que viu/trabalhou na faculdade.</em></p>
<p style="text-align: justify;">Após o sumário e conhecimento técnicos, coloque quais são as <strong>experiências/empresas</strong> pelas quais já passou. Além disso, coloque um resumo das suas responsabilidade e/ou projetos relevantes nos quais participou.</p>
<p style="text-align: justify;">O que fazer se não tiver nenhuma experiência nesse caso?</p>
<p style="text-align: justify;">A graduação, apesar de parecer ser apenas graduação, é uma fonte de oportunidades. Quem estudou, teve iniciativa, participou de ONGs ou outras atividades — até grêmio escolar — ou seja, se mexeu, tem boas chances de fazer um bom currículo e ter um bom diferencial. Quem nunca fez nada, vai ter um pouco de problema (essa é uma boa hora para começar a fazer e não ficar para trás).</p>
<p style="text-align: justify;"><em>Trabalhar em ONGs, projetos voluntários, grêmio estudantil, ser presidente/líder de turma é uma boa forma de mostrar que tem iniciativa, liderança e capacidade de comunicação, características que toda empresa procura em um profissional.</em></p>
<p style="text-align: justify;"><em>É importante destacar que não se deve fazer auto elogios no currículo: “Tenho espírito de equipe e liderança, etc”. Isso deve ficar implícito pelas atividades que descrever.</em></p>
<p style="text-align: justify;">Os próximos ítens são Formação Acadêmica e Idiomas. Algumas informações como escola de primeira linha e idiomas fluentes são utilizados como critério de seleção, portanto, são características que merecem destaque no currículo.</p>
<p style="text-align: justify;">No item de formação, reforce seu desempenho nos estudos. Se tirava boas notas, deixe isso claro. Se seu resultado foi excepcional em uma determinada disciplina ou grupo de disciplinas, fale sobre este assunto e explique o que o motivou a ter este resultado exemplar. Por outro lado, se sua notas não são tão boas, não escreva no currículo, mas esteja preparado para ser questionado sobre o assunto na entrevista. Muitas empresas pedem para anexar o histórico/boletim. É bom estar preparado para isso.</p>
<p style="text-align: justify;"><strong>Proefiência em línguas estrangeiras</strong>. Ah, essa é uma parte importantíssima e que a maioria das pessoas não organizam muito bem.</p>
<p style="text-align: justify;">Muitos colocam:</p>
<p style="text-align: justify;">Inglês: leitura: intermediário; conversão: bom, escrita: bom</p>
<p style="text-align: justify;">Não coloque isso no seu currículo profissional. Isso é para bolsas escolares ou outras posições acadêmicas (como professor). <strong>Para mercado de trabalho: NÃO</strong>!</p>
<p style="text-align: justify;">Então como se deve colocar: existem 4 níveis de proeficiência: <em>básico</em>, <em>intermediário</em>, <em>avançado </em>e <em>fluente</em>. Como cada um “acha” que está em um nível, muitas vezes, o empregador não sabe interpretar o que cada nível significa. Se quiser (e deve), é bom colocar uma <strong><em>legenda</em></strong>, assim, o empregador não terá dúvidas:</p>
<ul style="text-align: justify;">
<li><strong>Fluente</strong>: está apto para trabalhar no      exterior</li>
<li><strong>Avançado</strong>: apto para viajar para o      exterior desacompanhado</li>
<li><strong>Intermediário</strong>: leitura e escrita com      conhecimentos verbais limitados (apto para viajar para o exterior com um      assistente)</li>
<li><strong>Básico</strong>: capaz de se comunicar com      pessoas de outros países a um nível mínimo.</li>
</ul>
<p style="text-align: justify;">Depois, se for necessário, pode colocar uma parte de outras informações/atividades complementares, como por exemplo: <strong>prêmios </strong>que ganhou, se tem experiência internacional (<strong>intercâmbio</strong>), se é palestrante, cursos que participou, etc.</p>
<p style="text-align: justify;">Outros pontos importantes para primeiro currículo de estágio:</p>
<p style="text-align: justify;"><strong>Seminários e congressos.</strong> Outro item importante para o primeiro currículo é a participação em seminários e congressos. Mesmo que não sejam diretamente ligados à vaga que está se candidatando, servem para mostrar que é uma pessoa interessada e ávida por conhecimento. Muitos congressos também oferecem mini-cursos que ser citados, desde que tenha participado deles.</p>
<p style="text-align: justify;"><strong>Iniciação científica, monitoria, estágios e programas de trainee.</strong> Muitas pessoas com pouca experiência profissional já participaram de programas de estágio ou trainee. Outras fizeram iniciação científica ou monitoria de disciplinas durante o curso universitário. Se este é o seu caso, reforce sua participação, mesmo que tenha sido em uma área diferente da pretendida. Artigos publicados em congressos também são interessantes.</p>
<p style="text-align: justify;"><strong>Cursos, Palestras, concursos do Academic Initiative</strong> ou outro programa acadêmico (ex: SAI): ótima oportunidade de adquirir novos conhecimentos, aumentar seu networking e um novo item para seu currículo!</p>
<p style="text-align: justify;"><strong>Maratona de Programação ICPC</strong>: torneio de programação organizado pela SBC (Sociedade Brasileira de Computação) no Brasil, e pela ACM (Association for Computinger Machinery – um dos maiores órgãos de computação mundial) a nível mundial, além de ser patrocinado pela IBM. Uma atividade que vale outro para o currículo e que é super bem vista por grandes empresas, como IBM.</p>
<p style="text-align: justify;"><strong>Ter um blog</strong> e escrever notas de aula, pequenos tutoriais sobre tópicos que está aprendendo ou até mesmo publicar a monografia/trabalhos acadêmicos é uma forma legal de mostrar seu desempenho acadêmico e que domina a linguagem ou tecnologia que citou no currículo. Após o contato, pode citar o link do seu blog/wesite.</p>
<p style="text-align: justify;">E o mais importante de todos: <strong>Não minta. Nunca</strong>!</p>
<p style="text-align: justify;">Outra dica valiosa: se for enviar seu currículo por email, nunca envie em formato .doc ou outro formato de editor de texto. Sempre envie em <strong>pdf</strong>, que é o formato de troca de arquivos mundialmente. Isso pode pegar mal, pois você pode enviar formato open office e o empregador que só usa o Micorosft Office não vai conseguir abrir. Já com pdf, seu documento poderá ser lido em qualquer plataforma.</p>
<p style="text-align: justify;">E se quiser ter uma base, segue um modelo de currículo para primeiro estágio (fiz baseado em experiência própria):</p>
<p style="text-align: justify;">
<p><a style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;" title="View Currículo para Primeiro Estágio em TI on Scribd" href="http://www.scribd.com/doc/26881071/Curriculo-para-Primeiro-Estagio-em-TI">Currículo para Primeiro Estágio em TI</a> <object id="doc_12416" style="outline: none;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="600" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="doc_12416" /><param name="data" value="http://d1.scribdassets.com/ScribdViewer.swf" /><param name="wmode" value="opaque" /><param name="bgcolor" value="#ffffff" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="FlashVars" value="document_id=26881071&amp;access_key=key-1gwg0tnv6ak9lsx7qqhp&amp;page=1&amp;viewMode=list" /><param name="src" value="http://d1.scribdassets.com/ScribdViewer.swf" /><param name="allowfullscreen" value="true" /><param name="flashvars" value="document_id=26881071&amp;access_key=key-1gwg0tnv6ak9lsx7qqhp&amp;page=1&amp;viewMode=list" /><embed id="doc_12416" style="outline: none;" type="application/x-shockwave-flash" width="100%" height="600" src="http://d1.scribdassets.com/ScribdViewer.swf" flashvars="document_id=26881071&amp;access_key=key-1gwg0tnv6ak9lsx7qqhp&amp;page=1&amp;viewMode=list" allowscriptaccess="always" allowfullscreen="true" bgcolor="#ffffff" wmode="opaque" data="http://d1.scribdassets.com/ScribdViewer.swf" name="doc_12416"></embed></object></p>
<p style="text-align: justify;">Boa sorte e sucesso!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1503&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/noWBxWraPwPTMSkHjIsKLw8d-FE/0/da"><img src="http://feedads.g.doubleclick.net/~a/noWBxWraPwPTMSkHjIsKLw8d-FE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/noWBxWraPwPTMSkHjIsKLw8d-FE/1/da"><img src="http://feedads.g.doubleclick.net/~a/noWBxWraPwPTMSkHjIsKLw8d-FE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=_HiKVF1ZTPo:DRv7CW81LK0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=_HiKVF1ZTPo:DRv7CW81LK0:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=_HiKVF1ZTPo:DRv7CW81LK0:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/_HiKVF1ZTPo" height="1" width="1"/>]]></content:encoded><description>Fazer um bom currículo é considerado uma tarefa difícil. Fazer um currículo para o primeiro estágio ou primeiro emprego é considerado por muitos uma tarefa impossível. Este post tem como objetivo apresentar algumas dicas para deixar essa tarefa mais fácil. Mesmo em início de carreira, o estudante e o profissional recém-formado devem ter os mesmos [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/carreira-em-ti-curriculo-para-primeiro-estagio/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/carreira-em-ti-curriculo-para-primeiro-estagio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=carreira-em-ti-curriculo-para-primeiro-estagio</feedburner:origLink></item><item><title>Meu Primeiro Projeto em Java</title><link>http://feedproxy.google.com/~r/Loiane/~3/KZ4rvZaPjLM/</link><category>java</category><category>hangman</category><category>jogo da forca</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 15 Feb 2010 03:00:47 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1495</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Nesse post vou descrever sobre como foi meu primeiro contato e projeto desenvolvido em Java.</p>
<p style="text-align: justify;">Aproveitando o fato que todo mundo faz uma pausa durante o carnaval, resolvi postar algo mais light essa semana. E  também atendendo à pedidos, vou comentar como foi meu primeiro contato com java e postar o código fonte do meu primeiro projeto desenvolvido em java (esses projeto que a gente faz para aprender mais a linguagem).</p>
<p style="text-align: justify;">Meu primeiro contato com uma linguagem de programação foi <a href="http://pt.wikipedia.org/wiki/Pascal_%28linguagem_de_programa%C3%A7%C3%A3o%29" target="_blank">Pascal</a>, se é que se pode considerar <a href="http://pt.wikipedia.org/wiki/Pascal_%28linguagem_de_programa%C3%A7%C3%A3o%29" target="_blank">Pascal</a> uma linguagem. Na época, todo mundo falava em Java e uma professora (Cinthia Caliari) nos convidou para começar um grupo de estudos fora do horário escolar.</p>
<p style="text-align: justify;">O grupo era formado pela professora e mais 5 pessoas. Três vezes por semana, ficávamos uma hora a mais na faculdade para aprender os conceitos básicos de OO e os comandos básicos em Java. Dois meses de estudo depois, a professora sugeriu um projeto para ver se tínhamos aprendido mesmo. O projeto era um <a href="http://pt.wikipedia.org/wiki/Jogo_da_forca" target="_blank">jogo da forca</a> voltado para crianças que estão aprendendo a ler/escrever. Usamos swing para contruir a interface gráfica e várias figuras bonitinhas para ser bem intuitivo para as crianças.</p>
<p style="text-align: justify;">Não me lembro muito bem, mas acho que demorei quase um mês para fazer esse projeto (Janeiro de 2006). Valeu muito a pena ter colocado a mão na massa e valeu ter participado do grupo de estudos, pois 4 meses depois consegui meu primeiro estágio, e os conceitos que aprendemos ajudaram muito na entrevista.</p>
<p style="text-align: justify;">Screenshot do joguinho:</p>
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_1496" class="wp-caption aligncenter" style="width: 583px;">
<dt class="wp-caption-dt"><a href="http://www.loiane.com/wp-content/uploads/2010/02/jogodaforca.png" target="_blank"><img class="size-full wp-image-1496 " style="border: 1px solid black;" title="jogodaforca" src="http://www.loiane.com/wp-content/uploads/2010/02/jogodaforca.png" alt="" width="573" height="400" /></a></dt>
<dd class="wp-caption-dd">Clique para ampliar</dd>
</dl>
</div>
<p style="text-align: justify;">
<p style="text-align: justify;">Código fonte: <a href="http://github.com/loiane/JogoDaForca" target="_blank">http://github.com/loiane/JogoDaForca</a></p>
<p style="text-align: justify;">Olhando esse código novamente, dá pra perceber que não tinha noção nenhuma de documentação (tudo é comentário! rs). Percebo que melhorei bastante, tanto no quesito de lógica, quanto na beleza do código (que tá horrível).</p>
<p style="text-align: justify;">Esse tipo de coisa é legal pra gente ver o quanto a gente melhorou e o quanto a gente ainda precisa melhorar. É legal acompanhar o progresso que você fez.</p>
<p style="text-align: justify;">E uma dica: tá aprendendo uma nova linguagem? Estude a parte básica, faça aqueles probleminhas de lógica de programação com a nova linguagem para aprender bem os comandos básicos e depois desenvolva um projeto para treinar. Vai perceber que isso faz uma diferença danada!</p>
<p style="text-align: justify;">Até a próxima e um ótimo carnaval para aqueles que estão curtindo!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1495&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/ngnqEhm_HY7jEu6S7VA9IFEr3IQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/ngnqEhm_HY7jEu6S7VA9IFEr3IQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ngnqEhm_HY7jEu6S7VA9IFEr3IQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/ngnqEhm_HY7jEu6S7VA9IFEr3IQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=KZ4rvZaPjLM:Ox-XxnI6mT4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=KZ4rvZaPjLM:Ox-XxnI6mT4:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=KZ4rvZaPjLM:Ox-XxnI6mT4:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/KZ4rvZaPjLM" height="1" width="1"/>]]></content:encoded><description>Nesse post vou descrever sobre como foi meu primeiro contato e projeto desenvolvido em Java. Aproveitando o fato que todo mundo faz uma pausa durante o carnaval, resolvi postar algo mais light essa semana. E  também atendendo à pedidos, vou comentar como foi meu primeiro contato com java e postar o código fonte do meu [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/meu-primeiro-projeto-em-java/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/meu-primeiro-projeto-em-java/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=meu-primeiro-projeto-em-java</feedburner:origLink></item><item><title>Entrevista para o Jornal A Tribuna Jan/2010: Profissões em que Sobram Vagas de Emprego</title><link>http://feedproxy.google.com/~r/Loiane/~3/zGBdtHcOv9A/</link><category>carreira</category><category>pessoal</category><category>A Tribuna</category><category>FAESA</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Thu, 11 Feb 2010 03:30:53 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1484</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2009/05/materia_loiane_tribuna_2010.png" target="_blank"><img class="size-full wp-image-1476 alignleft" title="materia_loiane_tribuna_2010" src="http://www.loiane.com/wp-content/uploads/2009/05/materia_loiane_tribuna_2010.png" alt="" width="244" height="145" /></a>Na última de semana de janeiro tive a honra de conceder mais uma entrevista para o jornal <a href="http://www.redetribuna.com.br" target="_blank">A Tribuna</a> &#8211; vendido no Espírito Santo, meu estado natal &#8211; sobre mercado de trabalho na área de TI.</p>
<p style="text-align: justify;">A reportagem fala sobre os profissionais que são difíceis de achar, o que fazer para se destacar no mercado. Tem uma outra página também sobre quais são as profissões mais procuradas e qual o salário médio destas.</p>
<p style="text-align: justify;">Foi matéria de capa do jornal do dia 31 de janeiro de 2010, e matéria chefe do caderno de economia do jornal.</p>
<p style="text-align: justify;">A entrevista que dei foi sobre como está o mercado de trabalho na área de TI; na matéria destaquei a importância do profissional que possui <strong>inglês</strong>. Outro ponto foram as <strong>atividades extras</strong> durante a graduação, que podem ajudar a alavancar a sua carreira.</p>
<p style="text-align: justify;">Agradeço mais uma vez à coordenação de computação e ao núcleo de comunicação da <a href="http://www.faesa.br" target="_blank">Faesa</a> pela indicação para participar da matéria.</p>
<p style="text-align: center;"><object width="500" height="410"><param name="movie" value="http://static.slideshare.net/swf/ssplayerd.swf?doc=no31011034-100209133140-phpapp02"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayerd.swf?doc=no31011034-100209133140-phpapp02"  type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="410"></embed></object></p>
<p style="text-align: justify;"><strong>Aproveite as oportunidades</strong></p>
<p style="text-align: justify;">Aproveito o post para deixar algumas dicas para aqueles que fazem faculdade. Quase todas as oportunidades que tive nos primeiros 3 anos de carreira foi a faculdade que proporcionou de alguma forma:</p>
<ul style="text-align: justify;">
<li> Meu primeiro estágio foi pela indicação do coordenador do curso;</li>
<li>convite para participar da <a href="http://maratona.ime.usp.br" target="_blank">Maratona de Programação</a> &#8211; fomos pra final nacional (primeiro time capixaba a conseguir isso), o que rendeu <a href="http://www.loiane.com/nerdices/" target="_blank">propaganda no site da faculdade e propaganda nos dois jornais do estado</a> (isso nos deu bastante destaque na faculdade)</li>
<li>saí do estágio para o primeiro emprego, indicação de um colega de monitoria</li>
<li>algumas <a href="http://www.loiane.com/nerdices/" target="_blank">outras matérias</a> para o jornal e no próprio site da faculdade</li>
</ul>
<p style="text-align: justify;">O que estou querendo dizer é: a faculdade apenas não nos fornace parte do conteúdo que precisamos saber para começar nossa carreira. O seu networking começa na sala de aula, com seus futuros colegas de profissão, que poderão te ajudar a conseguir um emprego depois. Os professores não são apenas professores, podem se tornar amigos, que também te ajudam fora da sala de aula (e até participam da cervejada!). E essa parceria não precisa terminar quando você se formar!</p>
<p style="text-align: justify;">Aproveite também os eventos na sua área! São ótimos para conhecer novas pessoas e trocar idéias com os mais experientes.</p>
<p style="text-align: justify;">São as pequenas coisas, que às vezes nem damos a devida importância, que fazem muita diferença na nossa carreira!</p>
<p style="text-align: justify;">Até a próxima!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1484&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/aH9hruvhnE_r0ogjN9kd-ph6hYE/0/da"><img src="http://feedads.g.doubleclick.net/~a/aH9hruvhnE_r0ogjN9kd-ph6hYE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/aH9hruvhnE_r0ogjN9kd-ph6hYE/1/da"><img src="http://feedads.g.doubleclick.net/~a/aH9hruvhnE_r0ogjN9kd-ph6hYE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=zGBdtHcOv9A:2ckIVMNd7z8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=zGBdtHcOv9A:2ckIVMNd7z8:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=zGBdtHcOv9A:2ckIVMNd7z8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/zGBdtHcOv9A" height="1" width="1"/>]]></content:encoded><description>Na última de semana de janeiro tive a honra de conceder mais uma entrevista para o jornal A Tribuna &amp;#8211; vendido no Espírito Santo, meu estado natal &amp;#8211; sobre mercado de trabalho na área de TI. A reportagem fala sobre os profissionais que são difíceis de achar, o que fazer para se destacar no mercado. [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/entrevista-para-o-jornal-a-tribuna-jan2010-profissoes-em-que-sobram-vagas-de-emprego/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/entrevista-para-o-jornal-a-tribuna-jan2010-profissoes-em-que-sobram-vagas-de-emprego/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=entrevista-para-o-jornal-a-tribuna-jan2010-profissoes-em-que-sobram-vagas-de-emprego</feedburner:origLink></item><item><title>ExtJS: Exportar de GRID para Excel</title><link>http://feedproxy.google.com/~r/Loiane/~3/04-usest7FU/</link><category>Ext JS</category><category>excel</category><category>exportar grid excel</category><category>grid</category><category>grid extjs</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 08 Feb 2010 04:01:30 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1114</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/01/extjs_export_gridpanel_excel.png"><img class="aligncenter size-full wp-image-1450" title="extjs_export_gridpanel_excel" src="http://www.loiane.com/wp-content/uploads/2010/01/extjs_export_gridpanel_excel.png" alt="" width="599" height="340" /></a></p>
<p style="text-align: justify;">Esse tutorial irá abordar como exportar dados de um ExtJS DataGrid para um arquivo Excel.</p>
<p style="text-align: justify;">Às vezes, o usuário deseja exportar os dados de um graid para um arquivo excel (.xls ou .csv).<br />
Existe um <a title="plugin ExtJS" href="http://www.extjs.com/forum/showthread.php?t=32400">plugin ExtJS</a> desenvolvido por terceiros que faz isso para você.</p>
<p style="text-align: justify;">Existem alguns &#8220;probleminhas&#8221; que você deve saber antes de começar:</p>
<ul style="text-align: justify;">
<li>Só funciona em browsers que suportam <a title="data URLs" href="http://en.wikipedia.org/wiki/Data_URI_scheme">data URLs</a> (URL com dados), como Firefox, Opera e IE<strong>8</strong>.</li>
<li>Testei com as seguintes versões do ExtJS: 2.2.1, 3.0, 3.0.3 e 3.1, mas só funcionou na versão 3.0. Se alguém estiver usando alguma outra versão e conseguir fazer funcionar, me avise, pois posso ter esquecido de algum detalhe.</li>
<li>Só funcionad com os dados que estão no data Store &#8211; se você usar paginação, então crie um método para exportar no lado servidor. Esse plugin apenas é útil para quem desejar exportar uma pequena tabela para o Excel (todos os dados visíveis na tela).</li>
<li>Se os dados no Store forem voláteis (podem mudar, sofrer update, etc), a URL para exportação deve ser recalculada.</li>
</ul>
<p style="text-align: justify;">Vamos começar:</p>
<p style="text-align: justify;">Primeiro, crie um arquivo javascript no projeto e cole o seguinte código (criei um arquivo exporter.js): <a href="http://github.com/loiane/extjs-export-excel/blob/master/WebContent/js/exporter.js" target="_blank">http://github.com/loiane/extjs-export-excel/blob/master/WebContent/js/exporter.js</a> (esse arquivo tem muitas linhas, por isso não coloquei/colei o conteúdo aqui).</p>
<p style="text-align: justify;">E no código que contém o grid, adiciona o seguinte código:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
var linkButton = new Ext.LinkButton({
        id: 'grid-excel-button',
        text: 'Export to Excel'
});

//create the Grid
var grid = new Ext.grid.GridPanel({
    bbar: new Ext.Toolbar({
        buttons: [linkButton]
    })
});

linkButton.getEl().child('a', true).href = 'data:application/vnd.ms-excel;base64,' +
Base64.encode(grid.getExcelXml());
</pre>
<p style="text-align: justify;">Se tentar exportar a tabela da figura (por exemplo) para o arquivo excel, vai ficar mais ou menos assim:</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/01/extjs_export_gridpanel_excel_file.png"><img class="aligncenter size-full wp-image-1451" title="extjs_export_gridpanel_excel_file" src="http://www.loiane.com/wp-content/uploads/2010/01/extjs_export_gridpanel_excel_file.png" alt="" width="627" height="359" /></a></p>
<p style="text-align: justify;">Você também pode trocar as cores, fontes, etc. Dê uma olhada no código do exporter.js, tente enterder e faça a mudanças que desejar.</p>
<p style="text-align: justify;"><a title="Ed Spencer" href="http://edspencer.net/">Ed Spencer</a> também desenvolveu um <a title="similar plugin" href="http://github.com/edspencer/Ext.ux.Exporter">plugin similar</a>. O código fonte dele está mais limpo que este. Porém, o arquivo Excel gerado será o mesmo.</p>
<p style="text-align: justify;">Você pode fazer o donwload do projeto exemplo (JEE) do meu repositório GitHub: <a href="http://github.com/loiane/extjs-export-excel" target="_blank">http://github.com/loiane/extjs-export-excel</a></p>
<p style="text-align: justify;">Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1114&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/rqwb4SccjtMglcG0coz9SFmmFn0/0/da"><img src="http://feedads.g.doubleclick.net/~a/rqwb4SccjtMglcG0coz9SFmmFn0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rqwb4SccjtMglcG0coz9SFmmFn0/1/da"><img src="http://feedads.g.doubleclick.net/~a/rqwb4SccjtMglcG0coz9SFmmFn0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=04-usest7FU:UAUnATF2wH8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=04-usest7FU:UAUnATF2wH8:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=04-usest7FU:UAUnATF2wH8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/04-usest7FU" height="1" width="1"/>]]></content:encoded><description>Esse tutorial irá abordar como exportar dados de um ExtJS DataGrid para um arquivo Excel. Às vezes, o usuário deseja exportar os dados de um graid para um arquivo excel (.xls ou .csv). Existe um plugin ExtJS desenvolvido por terceiros que faz isso para você. Existem alguns &amp;#8220;probleminhas&amp;#8221; que você deve saber antes de começar: [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/extjs-exportar-de-grid-para-excel/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/extjs-exportar-de-grid-para-excel/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-exportar-de-grid-para-excel</feedburner:origLink></item><item><title>Integrando Spring Security com a página de Login do ExtJS</title><link>http://feedproxy.google.com/~r/Loiane/~3/6IDumIl19_0/</link><category>Ext JS</category><category>Spring</category><category>Spring Security</category><category>ExtJS + JEE</category><category>ExtJS Login</category><category>spring</category><category>Spring Security login</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 01 Feb 2010 03:09:40 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1429</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><a href="http://www.loiane.com/wp-content/uploads/2010/01/spring_security_extjs_login.png"><img class="aligncenter size-full wp-image-1434" title="spring_security_extjs_login" src="http://www.loiane.com/wp-content/uploads/2010/01/spring_security_extjs_login.png" alt="" width="445" height="257" /></a></p>
<p>Esse tutorial irá abordar como configurar o form de login da biblioteca ExtJS (Ajax) ao invés de utilizar a página de login (login.jsp) padrão do Spring Security..</p>
<p>Em vez de usar a página de login do Spring Security, por que não usar um form feito com Ajax?</p>
<p>E como integrar a página de login do ExtJS com o framework Spring Security?</p>
<p>Ok, você já tentou fazer isso, o usuário foi autenticado com sucesso, mas o usuário não é redirecionado para a página principal da aplicação. Como consertar isso?</p>
<p>Não importa de você setou a opção default-target-url no arquivo applicationContext-security.xml, ou setou uma URL para redirecionamento no lado do servidor. Não vai funcionar.</p>
<p>O problema é que o ExtJS faz uma chamada/request Ajax, e nenhum redirecionamento irá funcionar no lado servidor (spring). Você deve fazer esse redirecionamento no lado cliente, que é no código ExtJS/javascript.</p>
<p>Primeiro, você precisa crier o form do login. Você pode utilizar o código de exemplo disponibilizado pelo ExtJS: <a href="http://www.extjs.com/learn/Tutorial:Basic_Login" target="_blank">http://www.extjs.com/learn/Tutorial:Basic_Login</a> e customizá-lo/modificá-lo para funcinoar com o Spring Security.</p>
<p>Se der uma olhada no arquivo login.jsp (padrão do Spring Security), você irá perceber três pontos chaves do form:</p>
<ol>
<li>URL / form action: <strong>j_spring_security_check</strong></li>
<li>Username input name: <strong>j_username</strong></li>
<li>Password input name: <strong>j_password</strong></li>
</ol>
<p>É isso que precisa customizar no login do ExtJS para fazê-lo funcinar com o Spring Security. Mas não pense que é assim tão fácil, ainda tem um pequeno detalhe que precisa consertar para funcionar perfeitamente.</p>
<p>O login.js irá ficar assim após as moficações:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
Ext.onReady(function(){
	Ext.QuickTips.init();

	// Create a variable to hold our EXT Form Panel.

	// Assign various config options as seen.
	var login = new Ext.FormPanel({
		labelWidth:80,
		url:'j_spring_security_check',
		frame:true,
		title:'Please Login',

		defaultType:'textfield',
		width:300,
		height:150,
		monitorValid:true,
		// Specific attributes for the text fields for username / password.
		// The &quot;name&quot; attribute defines the name of variables sent to the server.

		items:[{
			fieldLabel:'Username',
			name:'j_username',
			allowBlank:false
		},{
			fieldLabel:'Password',

			name:'j_password',
			inputType:'password',
			allowBlank:false
		}],

		// All the magic happens after the user clicks the button
		buttons:[{

			text:'Login',
			formBind: true,
			// Function that fires when user clicks the button
			handler:function(){
			login.getForm().submit({

				method:'POST',

				// Functions that fire (success or failure) when the server responds.
				// The server would actually respond with valid JSON,
				// something like: response.write &quot;{ success: true}&quot; or

				// response.write &quot;{ success: false, errors: { reason: 'Login failed. Try again.' }}&quot;
				// depending on the logic contained within your server script.
				// If a success occurs, the user is notified with an alert messagebox,

				// and when they click &quot;OK&quot;, they are redirected to whatever page
				// you define as redirect.

				success:function(){
				Ext.Msg.alert('Status', 'Login Successful!', function(btn, text){

					if (btn == 'ok'){
						window.location = 'main.action';
					}
				});

			},

			// Failure function, see comment above re: success and failure.
			// You can see here, if login fails, it throws a messagebox
			// at the user telling him / her as much.

			failure:function(form, action){
				if(action.failureType == 'server'){
					obj = Ext.util.JSON.decode(action.response.responseText);

					Ext.Msg.alert('Login Failed!', obj.errors.reason);
				}else{
					Ext.Msg.alert('Warning!', 'Authentication server is unreachable : ' + action.response.responseText);

				}
				login.getForm().reset();
			}

			});
		}
		}]
	});

	login.render('login');

});
</pre>
<p>O que está faltando?</p>
<p>É necessário customizar a classe AuthenticationProcessingFilter para o Spring Security executar a ação no login.</p>
<p>Os métodos “onSuccessfulAuthentication” e “onUnsuccessfulAuthentication” precisam retornar algum conteúdo JSON. Se o usuário for autenticado com sucesso, então redireciona-o para a página principal da aplicação, senão, a aplicação irá mostrar uma mensagem de erro.</p>
<p>Essa é a classe MyAuthenticationProcessingFilter customizada:</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
package com.loiane.security;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;

public class MyAuthenticationProcessingFilter extends AuthenticationProcessingFilter {

	protected void onSuccessfulAuthentication(HttpServletRequest request,
			HttpServletResponse response, Authentication authResult)
	throws IOException {
		super.onSuccessfulAuthentication(request, response, authResult);

		HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(response);

		Writer out = responseWrapper.getWriter();

		String targetUrl = determineTargetUrl( request );
		out.write(&quot;{success:true, targetUrl : \'&quot; + targetUrl + &quot;\'}&quot;);
		out.close();

	}

	protected void onUnsuccessfulAuthentication( HttpServletRequest request,
			HttpServletResponse response, AuthenticationException failed )
	throws IOException {

		HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(response);

		Writer out = responseWrapper.getWriter();

		out.write(&quot;{ success: false, errors: { reason: 'Login failed. Try again.' }}&quot;);
		out.close();

	}

}
</pre>
<p>E o arquivo applicationContext-security.xml ficará assim:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
	xmlns:security=&quot;http://www.springframework.org/schema/security&quot;
	xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd&quot;&gt;

	&lt;security:global-method-security /&gt;

	&lt;security:http auto-config=&quot;false&quot; entry-point-ref=&quot;authenticationProcessingFilterEntryPoint&quot;&gt;
		&lt;security:intercept-url pattern=&quot;/index.jsp&quot; filters=&quot;none&quot; /&gt;
		&lt;security:intercept-url pattern=&quot;/*.action&quot; access=&quot;ROLE_USER&quot; /&gt;
	&lt;/security:http&gt;

	&lt;bean id=&quot;authenticationProcessingFilter&quot; class=&quot;com.loiane.security.MyAuthenticationProcessingFilter&quot;&gt;
		&lt;security:custom-filter position=&quot;AUTHENTICATION_PROCESSING_FILTER&quot; /&gt;
		&lt;property name=&quot;defaultTargetUrl&quot; value=&quot;/main.html&quot; /&gt;
		&lt;property name=&quot;authenticationManager&quot; ref=&quot;authenticationManager&quot; /&gt;
	&lt;/bean&gt;

	&lt;security:authentication-manager alias=&quot;authenticationManager&quot; /&gt;

	&lt;bean id=&quot;authenticationProcessingFilterEntryPoint&quot;
		class=&quot;org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint&quot;&gt;
		&lt;property name=&quot;loginFormUrl&quot; value=&quot;/index.jsp&quot; /&gt;
		&lt;property name=&quot;forceHttps&quot; value=&quot;false&quot; /&gt;
	&lt;/bean&gt;

    &lt;!--
    Usernames/Passwords are
        rod/koala
        dianne/emu
        scott/wombat
        peter/opal
    These passwords are from spring security app example
    --&gt;
    &lt;security:authentication-provider&gt;
        &lt;security:password-encoder hash=&quot;md5&quot;/&gt;
        &lt;security:user-service&gt;
            &lt;security:user name=&quot;rod&quot; password=&quot;a564de63c2d0da68cf47586ee05984d7&quot; authorities=&quot;ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER&quot; /&gt;
            &lt;security:user name=&quot;dianne&quot; password=&quot;65d15fe9156f9c4bbffd98085992a44e&quot; authorities=&quot;ROLE_USER,ROLE_TELLER&quot; /&gt;
            &lt;security:user name=&quot;scott&quot; password=&quot;2b58af6dddbd072ed27ffc86725d7d3a&quot; authorities=&quot;ROLE_USER&quot; /&gt;
            &lt;security:user name=&quot;peter&quot; password=&quot;22b5c9accc6e1ba628cedc63a72d57f8&quot; authorities=&quot;ROLE_USER&quot; /&gt;
	    &lt;/security:user-service&gt;
	&lt;/security:authentication-provider&gt;
&lt;/beans&gt;
</pre>
<p>Agora irá logar normalmente com o form de login do ExtJS.</p>
<p>Fiz uma pequena aplicação de exemplo. Se desejar, pode fazer o download do meu repositório no GitHub: <a href="http://github.com/loiane/spring-security-extjs-login" target="_blank">http://github.com/loiane/spring-security-extjs-login</a></p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1429&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/VRWtt3iPIrx41dUzA2a14elzjQY/0/da"><img src="http://feedads.g.doubleclick.net/~a/VRWtt3iPIrx41dUzA2a14elzjQY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VRWtt3iPIrx41dUzA2a14elzjQY/1/da"><img src="http://feedads.g.doubleclick.net/~a/VRWtt3iPIrx41dUzA2a14elzjQY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=6IDumIl19_0:QMhXT642yXs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=6IDumIl19_0:QMhXT642yXs:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=6IDumIl19_0:QMhXT642yXs:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/6IDumIl19_0" height="1" width="1"/>]]></content:encoded><description>Esse tutorial irá abordar como configurar o form de login da biblioteca ExtJS (Ajax) ao invés de utilizar a página de login (login.jsp) padrão do Spring Security.. Em vez de usar a página de login do Spring Security, por que não usar um form feito com Ajax? E como integrar a página de login do [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/02/integrando-spring-security-com-a-pagina-de-login-do-extjs/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.loiane.com/2010/02/integrando-spring-security-com-a-pagina-de-login-do-extjs/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=integrando-spring-security-com-a-pagina-de-login-do-extjs</feedburner:origLink></item><item><title>Spring Security: Página login.jsp e Logout</title><link>http://feedproxy.google.com/~r/Loiane/~3/H3DqLUbbqys/</link><category>Spring</category><category>Spring Security</category><category>spring</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 25 Jan 2010 03:00:18 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1390</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/01/spring_security_login.jpg"><img class="aligncenter size-full wp-image-1425" title="spring_security_login" src="http://www.loiane.com/wp-content/uploads/2010/01/spring_security_login.jpg" alt="" width="360" height="289" /></a></p>
<p style="text-align: justify;">Quando você faz a configuração do Spring Security na sua aplicação, você tem a opção de dizer qual é a sua página de login (<strong><em>login.jsp</em></strong>) no arquivo <strong>applicationContext-security.xml</strong>.</p>
<p style="text-align: justify;">Mas como esse arquivo login.jsp se parece? Como faço para a página ser reconhecida pelo framework no processo de autenticação? Se você fizer uma busca pelo Google, não irá encontrar tão facilmente. Há muitos artigos sobre como configurar o framework, mas poucos (poucos mesmo) que mostram a tal página. Devido a dificuldade que tive quando comecei a estudar, resolvi compartilhar aqui no blog.</p>
<p style="text-align: justify;">A verdade é: basta olhar nos arquivos .jar de exemplo que vem quando faz o download do spring security. Você vai encontrar tanto a página de login (login.jsp) quando o link de logout:</p>
<h3>login.jsp</h3>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;%@ taglib prefix='c' uri='http://java.sun.com/jstl/core_rt' %&gt;
&lt;%@ page import=&quot;org.springframework.security.ui.AbstractProcessingFilter&quot; %&gt;
&lt;%@ page import=&quot;org.springframework.security.ui.webapp.AuthenticationProcessingFilter&quot; %&gt;
&lt;%@ page import=&quot;org.springframework.security.AuthenticationException&quot; %&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Login&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;h1&gt;Login&lt;/h1&gt;

    &lt;c:if test=&quot;${not empty param.login_error}&quot;&gt;
      &lt;font color=&quot;red&quot;&gt;
        Your login attempt was not successful, try again.&lt;br/&gt;&lt;br/&gt;
        Reason: &lt;c:out value=&quot;${SPRING_SECURITY_LAST_EXCEPTION.message}&quot;/&gt;.
      &lt;/font&gt;
    &lt;/c:if&gt;

    &lt;form name=&quot;f&quot; action=&quot;&lt;c:url value='j_spring_security_check'/&gt;&quot; method=&quot;POST&quot;&gt;
      &lt;table&gt;
        &lt;tr&gt;&lt;td&gt;User:&lt;/td&gt;&lt;td&gt;&lt;input type='text' name='j_username' value='&lt;c:if test=&quot;${not empty param.login_error}&quot;&gt;&lt;c:out value=&quot;${SPRING_SECURITY_LAST_USERNAME}&quot;/&gt;&lt;/c:if&gt;'/&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Password:&lt;/td&gt;&lt;td&gt;&lt;input type='password' name='j_password'&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;_spring_security_remember_me&quot;&gt;&lt;/td&gt;&lt;td&gt;Don't ask for my password for two weeks&lt;/td&gt;&lt;/tr&gt;

        &lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name=&quot;submit&quot; type=&quot;submit&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name=&quot;reset&quot; type=&quot;reset&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p style="text-align: justify;">Observação muito importante: o nome do campos de input DEVEM continuar os mesmos. NÃO MUDE! Caso mudar, o processo de autenticação irá falhar.</p>
<p style="text-align: justify;">E para o logout, a única coisa que deve fazer é enviar o usuário para um determindado servlet definido pelo framework spring security.</p>
<h3>logout link:</h3>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;a href=&quot;&lt;c:url value=&quot;/j_spring_security_logout&quot;/&gt;&quot;&gt;Logout&lt;/a&gt;
</pre>
<p>Bons códigos e até a próxima!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1390&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/QGmxkG_FyvjUh-Yp-E-aCQnB5ok/0/da"><img src="http://feedads.g.doubleclick.net/~a/QGmxkG_FyvjUh-Yp-E-aCQnB5ok/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QGmxkG_FyvjUh-Yp-E-aCQnB5ok/1/da"><img src="http://feedads.g.doubleclick.net/~a/QGmxkG_FyvjUh-Yp-E-aCQnB5ok/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=H3DqLUbbqys:1xF8qRJLXfc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=H3DqLUbbqys:1xF8qRJLXfc:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=H3DqLUbbqys:1xF8qRJLXfc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/H3DqLUbbqys" height="1" width="1"/>]]></content:encoded><description>Quando você faz a configuração do Spring Security na sua aplicação, você tem a opção de dizer qual é a sua página de login (login.jsp) no arquivo applicationContext-security.xml. Mas como esse arquivo login.jsp se parece? Como faço para a página ser reconhecida pelo framework no processo de autenticação? Se você fizer uma busca pelo Google, [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/01/spring-security-login-e-logout-form-jsp/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.loiane.com/2010/01/spring-security-login-e-logout-form-jsp/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=spring-security-login-e-logout-form-jsp</feedburner:origLink></item><item><title>Tutorial: Começando com Spring Security</title><link>http://feedproxy.google.com/~r/Loiane/~3/vTKmBPyt7lA/</link><category>Spring Security</category><category>Acegi</category><category>spring</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 18 Jan 2010 03:00:41 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1381</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2010/01/spring-security.jpg"><img class="aligncenter size-full wp-image-1420" title="spring security" src="http://www.loiane.com/wp-content/uploads/2010/01/spring-security.jpg" alt="" width="360" height="232" /></a></p>
<p style="text-align: justify;">Esse tutorial vai cobrir um cenário básico onde integra um módulo do framework Spring &#8211; <a href="http://static.springsource.org/spring-security/site/index.html" target="_blank">Spring Security</a>, utilizando autenticação via banco de dados, em uma aplicação web que já utiliza o Spring.</p>
<p style="text-align: justify;">Como qualquer outro assunto relacionado à Spring, a curva de aprendizado em um pouco grande. Mas como qualquer outro assunto Spring, uma vez que você faz a primeira configuração e aprende, pode usá-la sempre em outras aplicações, ou seja, o famoso Ctrl C + Ctrl V.</p>
<p style="text-align: justify;">Quando comecei a estudar Spring Security no final de dezembro, encontrei esses <a href="http://static.springsource.org/spring-security/site/start-here.html" target="_blank">primeiros passos sugeridos</a> na página do Spring Security.</p>
<p style="text-align: justify;">E se você quiser configurar a parte de segurança na sua aplicação web utilizando Spring Security, segia os seguintes passos:</p>
<p style="text-align: justify;">A primeira coisa que precisa fazer é adicionar os arquivos do framework no classpath da aplicação. Faça o <a href="http://static.springsource.org/spring-security/site/downloads.html" target="_blank">download do Spring Security</a>, e copie os seguintes arquivos da pasta dist; cole-os na pasta lib da sua aplicação:</p>
<ul>
<li>spring-security-core-2.0.4.jar</li>
<li>spring-security-core-tiger-2.0.4.jar</li>
<li>spring-security-acl-2.0.4.jar</li>
<li>spring-security-taglibs-2.0.4.jar</li>
</ul>
<p>Também é necessário fazer o download do <a href="http://commons.apache.org/codec/download_codec.cgi" target="_blank">Apache Commons Codec</a>:  <em>commons-codec-1.3.jar</em></p>
<p>Vamos começar com a configuração dos XMLs:</p>
<h3><strong><span style="color: #800000;">Web.xml</span></strong></h3>
<p>Cole o seguinte código no arquivo web.xml. Deve ser inserido logo após ao final da tag /context-param.</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;context-param&gt;
	&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
	&lt;param-value&gt;
           /WEB-INF/applicationContext-security.xml
	&lt;/param-value&gt;
&lt;/context-param&gt;

&lt;filter&gt;
	&lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
	&lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
	&lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
	&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
<h3><span style="color: #800000;"><strong>applicationContext-security.xml</strong></span></h3>
<p style="text-align: justify;">Foi feita uma referência ao arquivo applicationContext-security.xml dentro do web.xml. Vamos criá-lo.</p>
<p style="text-align: justify;">Seguindo o tutorial da página do Spring Security, sugiro começar com o XML encontrado no tutorial de exemplo, e incrementá-lo aos poucos. Esse é o arquivo básico:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;!--
  - Sample namespace-based configuration
  -
  - $Id: applicationContext-security.xml 3019 2008-05-01 17:51:48Z luke_t $
  --&gt;

&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/security&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security-2.0.1.xsd&quot;&gt;

	&lt;global-method-security secured-annotations=&quot;enabled&quot;&gt;
	&lt;/global-method-security&gt;

    &lt;http auto-config=&quot;true&quot;&gt;
        &lt;intercept-url pattern=&quot;/**&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;
    &lt;/http&gt;

    &lt;!--
    Usernames/Passwords are
        rod/koala
        dianne/emu
        scott/wombat
        peter/opal
    --&gt;
    &lt;authentication-provider&gt;
        &lt;password-encoder hash=&quot;md5&quot;/&gt;
        &lt;user-service&gt;
            &lt;user name=&quot;rod&quot; password=&quot;a564de63c2d0da68cf47586ee05984d7&quot; authorities=&quot;ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER&quot; /&gt;
            &lt;user name=&quot;dianne&quot; password=&quot;65d15fe9156f9c4bbffd98085992a44e&quot; authorities=&quot;ROLE_USER,ROLE_TELLER&quot; /&gt;
            &lt;user name=&quot;scott&quot; password=&quot;2b58af6dddbd072ed27ffc86725d7d3a&quot; authorities=&quot;ROLE_USER&quot; /&gt;
            &lt;user name=&quot;peter&quot; password=&quot;22b5c9accc6e1ba628cedc63a72d57f8&quot; authorities=&quot;ROLE_USER&quot; /&gt;
	    &lt;/user-service&gt;
	&lt;/authentication-provider&gt;
&lt;/beans:beans&gt;
</pre>
<p>Agora você pode tentar executar a aplicação.</p>
<p>Após tentar executar a sua app, e se a seguinte <strong>exception for lançada</strong>:</p>
<pre class="brush: java; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/applicationContext-security.xml]; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/Signature
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:420)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
	at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:448)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
</pre>
<p>Download <strong><em>aspectjrt-1.5.4.jar</em></strong> e o adicione no classpath.</p>
<p><strong>Vamos então fazer algumas mudanças no arquivo applicationContext-security.xml.</strong></p>
<p>Primeira mudança: substitua o bloco de código abaixo</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http auto-config=&quot;true&quot;&gt;
        &lt;intercept-url pattern=&quot;/**&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;
&lt;/http&gt;
</pre>
<p>por</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http auto-config=&quot;true&quot;&gt;

    	&lt;!-- Don't set any role restrictions on login.jsp --&gt;
    	&lt;intercept-url pattern=&quot;/login.jsp&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot; /&gt;

    	&lt;!-- Restrict access to ALL other pages --&gt;
        &lt;intercept-url pattern=&quot;/**&quot; access=&quot;ROLE_USER&quot; /&gt;

        &lt;!-- Set the login page and what to do if login fails --&gt;
        &lt;form-login login-page=&quot;/login.jsp&quot; authentication-failure-url=&quot;/login.jsp?login_error=1&quot; /&gt;

&lt;/http&gt;
</pre>
<p style="text-align: justify;">O atributo <strong>auto-config</strong> basicamente diz para o spring-security configurar as opções padrões sozinho, ou seja, o framework faz tudo automático.</p>
<p style="text-align: justify;">A página <strong>login.jsp</strong> pode ser acessada por qualquer ROLE.</p>
<p style="text-align: justify;">Restringir acessor à página delogin siginifcaria que ninguém poderia acessá-la. Ficaria muito estranho, posi como pode autenticar um usuário se este ainda não efetuou o login?</p>
<p style="text-align: justify;">Note que a página de login é um <em>jsp, </em>e não uma action. A página de login não precisa ser acessada através de uma action.</p>
<p style="text-align: justify;">Na configuração acima, também foi restringido o acesso a todas as outras página. Apenas os usuários com a ROLE_USER podem acessá-la.</p>
<p style="text-align: justify;">Digamos que tenha mais uma role. Fazer o <strong>mapeamento das URLS para as roles</strong> é bem fácil. Dentro da tag <em>http</em>, coloque as URLS e as roles assim:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;intercept-url pattern=&quot;/admin/*.do&quot; access=&quot;ROLE_ADMIN&quot;  /&gt;
&lt;intercept-url pattern=&quot;/manager/*.do&quot; access=&quot;ROLE_MANAGER&quot;  /&gt;
&lt;intercept-url pattern=&quot;/**.do&quot; access=&quot;ROLE_USER,ROLE_ADMIN, ROLE_MANAGER&quot;  /&gt;
</pre>
<p style="text-align: justify;">É claro que você não quer colocar (nem deve) todos os <strong>usernames (usuários) </strong>e <strong>passwords (senhas) </strong>e suas respectivas <strong>roles </strong>no arquivo <em>applicationContext-security.xml</em>. Como então dizemos ao spring-security para obter essas informações do banco de dados?</p>
<p style="text-align: justify;">Coloque o seguinte bloco de código no <em>applicationContext-security.xml</em> (substitua o bloco com os usuários e senhas)</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;!-- Configure the authentication provider --&gt;
&lt;security:authentication-provider&gt;
	&lt;security:jdbc-user-service data-source-ref=&quot;dataSource&quot; /&gt;
&lt;/security:authentication-provider&gt;
</pre>
<p style="text-align: justify;">Para isso é necessário já ter um dataSource criado (não vou abordar esse assunto nesse post).</p>
<p style="text-align: justify;">Agora a pergunta: <em>para isso funcionar, como é que o framework espera que o meu banco de dados se pareça?</em></p>
<p style="text-align: justify;">A autenticação padrão do spring security requer que a estrutura do banco de dados seja dessa maneira:</p>
<p><a href="http://loianegroner.com/wp-content/uploads/2010/01/spring-security-tutorial-database.png"><img class="aligncenter size-full wp-image-169" title="spring-security-tutorial-database" src="http://loianegroner.com/wp-content/uploads/2010/01/spring-security-tutorial-database.png" alt="" width="542" height="164" /></a></p>
<pre class="brush: sql; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
CREATE TABLE users
(
  username character varying(50) NOT NULL,
  &quot;password&quot; character varying(50) NOT NULL,
  enabled boolean NOT NULL,
  CONSTRAINT users_pkey PRIMARY KEY (username)
);

CREATE TABLE authorities
(
  username character varying(50) NOT NULL,
  authority character varying(50) NOT NULL,
  CONSTRAINT fk_authorities_users FOREIGN KEY (username)
      REFERENCES users (username) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE UNIQUE INDEX ix_auth_username
  ON authorities
  USING btree
  (username, authority);
</pre>
<p style="text-align: justify;">Mas se desejar configurar as queries que são usadas, pode utilizar a sua própria estrutura do banco de dados, só deve tomar cuidado para que os atributos/colunas da sua query &#8220;casem&#8221; (sejam os mesmos) com os atributos esperados pelo framework.</p>
<p style="text-align: justify;">Por exemplo? você quer apenas ter uma tabela com todas essas informações no banco de dados (ou até uma tabela com nome e colunas diferentes). Vamos ver como fica a configuração do XML:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;jdbc-user-service data-source-ref=&quot;dataSource&quot;
    authorities-by-username-query=&quot;select username,authority from users where username=?&quot;/&gt;
</pre>
<p style="text-align: justify;">Talvex você ainda também queira configurar outras páginas:</p>
<p style="text-align: justify;"><strong>Access Denied</strong>: essa página será exibida caso o usuário tente acessar uma página que não pertença a sua role:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http ... access-denied-page=&quot;/accessDenied.jsp&quot;&gt;
     ...
&lt;/http&gt;
</pre>
<p style="text-align: justify;"><strong>Default Target URL:</strong> essa é a página que o usuário será redirecionado caso seja autenticado com sucesso no login:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http ... &gt;
    ...
        &lt;form-login ... default-target-url=&quot;/home.do&quot;/&gt;
    ...
&lt;/http&gt;
</pre>
<p style="text-align: justify;"><strong>Logout URL</strong>: essa é a página que o suusário será redirecionado quando fizer logout:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http ... &gt;
    ...
    	&lt;logout logout-success-url=&quot;/home.do&quot;/&gt;
    ...
&lt;/http&gt;
</pre>
<p style="text-align: justify;"><strong>Login Failure URL</strong>: essa é a página que o usuário será redirecionado caso a autenticação falhe (login). Geralmente é a própria página de login, com algum parâmetro indicando um erro:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;http ... &gt;
    ...
        &lt;form-login ... authentication-failure-url=&quot;/login.jsp?login_error=1&quot;/&gt;
    ...
&lt;/http&gt;
</pre>
<p>Bem, é isso que você precisa para começar com Spring Security.</p>
<p>Na próxima semana, posto como a página <strong>login.jsp</strong> do Spring Security se parece.</p>
<p>Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1381&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/h_Q-kLQjxZKpjAyoskxOnKg19LY/0/da"><img src="http://feedads.g.doubleclick.net/~a/h_Q-kLQjxZKpjAyoskxOnKg19LY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/h_Q-kLQjxZKpjAyoskxOnKg19LY/1/da"><img src="http://feedads.g.doubleclick.net/~a/h_Q-kLQjxZKpjAyoskxOnKg19LY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=vTKmBPyt7lA:aRHrLg9sh1w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=vTKmBPyt7lA:aRHrLg9sh1w:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=vTKmBPyt7lA:aRHrLg9sh1w:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/vTKmBPyt7lA" height="1" width="1"/>]]></content:encoded><description>Esse tutorial vai cobrir um cenário básico onde integra um módulo do framework Spring &amp;#8211; Spring Security, utilizando autenticação via banco de dados, em uma aplicação web que já utiliza o Spring. Como qualquer outro assunto relacionado à Spring, a curva de aprendizado em um pouco grande. Mas como qualquer outro assunto Spring, uma vez [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/01/tutorial-comecando-com-spring-security/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">14</slash:comments><feedburner:origLink>http://www.loiane.com/2010/01/tutorial-comecando-com-spring-security/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-comecando-com-spring-security</feedburner:origLink></item><item><title>My DeveloperWorks: Como é a vida para um desenvolvedora Java no Brasil?</title><link>http://feedproxy.google.com/~r/Loiane/~3/-EaqwFqBYrQ/</link><category>My developerWorks</category><category>developerWorks</category><category>pessoal</category><category>IBM</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Tue, 12 Jan 2010 04:53:45 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1401</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Queria compartilhar com vocês a entrevista que a Valerie fez comigo e publicou no blog dela no My developerWorks (em inglês): <a href="https://www.ibm.com/developerworks/mydeveloperworks/blogs/yinmeetsyang/entry/interview_with_loiane_groner_java_developer_in_brazil7?lang=en_us&amp;ca=dth-mydw" target="_blank">Interview with Loiane Groner, Java developer in Brazil</a>.</p>
<p>Fiquei muito feliz quando vi o post publicado ontem, e mais feliz ainda quando vi que foi o post mais visto de todos os blogs do developerWorks:</p>
<div id="attachment_1404" class="wp-caption aligncenter" style="width: 657px"><a href="http://www.loiane.com/wp-content/uploads/2010/01/developerworks_loiane.png" target="_blank"><img class="size-full wp-image-1404" title="developerworks_loiane" src="http://www.loiane.com/wp-content/uploads/2010/01/developerworks_loiane.png" alt="clique para ver tamanho original" width="647" height="445" /></a><p class="wp-caption-text">clique para ver tamanho original</p></div>
<p style="text-align: center;">
<p>E se você olhar no canto, vai ser meu blog no &#8220;Featured Blogs&#8221;! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Também tem alguns status do twitter:</p>
<p>Da conta da Valerie:</p>
<blockquote>
<div id="_mcePaste">Cool new interview on my blog w/ Loiane Groner, java developer making her mark in Brazil: <a href="http://bit.ly/8FbnzL" target="_blank">http://bit.ly/8FbnzL</a> (<a href="http://twitter.com/vmichelle/status/7634056149" target="_blank">http://twitter.com/vmichelle/status/7634056149</a> )</div>
</blockquote>
<p>Da conta do developerWorks:</p>
<blockquote><p>What&#8217;s life like for a female #javadeveloper in Brazil? Interview w/ Loiane Groner<a href="http://bit.ly/8FbnzL" target="_blank">http://bit.ly/8FbnzL</a> (<a href="http://twitter.com/developerworks/status/7634404961" target="_blank">http://twitter.com/developerworks/status/7634404961</a> )</p></blockquote>
<p>Obrigada Valeria, por esta oportunidade!</p>
<p>Obrigada também a todos os meu queridos amigos e leitores aqui do blog!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1401&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/q4CF_9qJHv4KTHEaKoq99xSF2xk/0/da"><img src="http://feedads.g.doubleclick.net/~a/q4CF_9qJHv4KTHEaKoq99xSF2xk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/q4CF_9qJHv4KTHEaKoq99xSF2xk/1/da"><img src="http://feedads.g.doubleclick.net/~a/q4CF_9qJHv4KTHEaKoq99xSF2xk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=-EaqwFqBYrQ:fuTAPu2v8CI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=-EaqwFqBYrQ:fuTAPu2v8CI:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=-EaqwFqBYrQ:fuTAPu2v8CI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/-EaqwFqBYrQ" height="1" width="1"/>]]></content:encoded><description>Queria compartilhar com vocês a entrevista que a Valerie fez comigo e publicou no blog dela no My developerWorks (em inglês): Interview with Loiane Groner, Java developer in Brazil. Fiquei muito feliz quando vi o post publicado ontem, e mais feliz ainda quando vi que foi o post mais visto de todos os blogs do developerWorks: E [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/01/my-developerworks-como-e-a-vida-para-um-desenvolvedora-java-no-brail/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.loiane.com/2010/01/my-developerworks-como-e-a-vida-para-um-desenvolvedora-java-no-brail/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=my-developerworks-como-e-a-vida-para-um-desenvolvedora-java-no-brail</feedburner:origLink></item><item><title>ExtJS: Como colocar Ícone e Link nas Células do GRID</title><link>http://feedproxy.google.com/~r/Loiane/~3/YU7dcMXxVFU/</link><category>Ext JS</category><category>grid extjs</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 11 Jan 2010 03:00:16 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1117</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Esse tutorial aborda como colocar/fazer o display de um ícone ou link em uma célula do componente Grid do ExtJS.</p>
<p style="text-align: justify;"><a href="http://www.loiane.com/wp-content/uploads/2009/12/extjs-grid-cell-with-image-and-link.png"><img class="aligncenter size-full wp-image-1370" title="extjs-grid-cell-with-image-and-link" src="http://www.loiane.com/wp-content/uploads/2009/12/extjs-grid-cell-with-image-and-link.png" alt="" width="602" height="278" /></a></p>
<p style="text-align: justify;">Para explicar isso, vamos utilizar um grid com informações básicas de uma pessoa (agenda), e ao invés de apenas mostrar o email do contato, vamos mostrar um icone (envelope), além de colocar um link do tipo <em>mailto</em>. Assim, quando o usuário clicar em cima do link, irá abrir o cliente de email, e este poderá enviar sua mensagem. Um processo bem simples.</p>
<h3>Como fazer:</h3>
<p style="text-align: justify;">Primeiro, precisamos de dados para o grid (dados ficticios):</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
//array with data - dummy data
var myData = [
    ['Meyers, Quyn R.',	    '(943) 570-5141', 'Proin@nullamagna.ca',    '05/13/1990'],
	['Whitney, Tad T.',	    '(547) 743-0343', 'vulputate@acurnaUt.org', '05/10/1987'],
	['Lawrence, Flavia J.',	'(404) 826-4553', 'dapibus.id@accumsan.ca',	'01/05/1988'],
	['Morales, Susan I.',	'(276) 707-8084', 'tristique@seacmetus.com','03/09/1992'],
	['Merrill, Desiree Q.', '(911) 546-0559', 'dictum.cursus@vel.ca',   '01/07/1981'],
	['Hampton, Willa Y.',	'(729) 562-8303', 'nascetur@stellus.ca',    '06/17/1991'],
	['Brewer, Brynne F.',	'(818) 302-4393', 'ligula@ullamcorper.org',	'04/20/1989'],
	['Marsh, Drew D.',	    '(645) 671-2779', 'et.euismod.et@eget.ca',	'02/13/1990']
];
</pre>
<p style="text-align: justify;">Depois vem a definição do Grid:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
// create grid
var grid = new Ext.grid.GridPanel({
    store: store,
    columns: [
        {header: 'NAME', width: 170, sortable: true, dataIndex: 'name'},
        {header: 'PHONE #', width: 150, sortable: true, dataIndex: 'phone'},
        {header: 'BIRTHDAY', width: 100, sortable: true, dataIndex: 'birthday',
        	renderer: Ext.util.Format.dateRenderer('d/m/Y')},
        {header: 'EMAIL', width: 160, sortable: true, dataIndex: 'email',
        	renderer: renderIcon }
    ],
    title: 'My Contacts',
    autoHeight:true,
    width:600,
	renderTo: document.body,
	frame:true
});
</pre>
<h3>Como funciona:</h3>
<pre class="brush: jscript; collapse: false; wrap-lines: false;">
{header: 'EMAIL', width: 160, sortable: true, dataIndex: 'email', renderer: renderIcon }
</pre>
<p style="text-align: justify;">Repare a coluna <strong>email</strong>, na definição do ColumnModel do data grid. Há um atributo chamado renderer. Uma função renderer é um método/função que intercepta e que pode modificar o valor de uma célula antes que esta seja renderizada (apareça no grid).</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
//image path
var IMG_EMAIL = '/gridcell-with-image/img/email_link.png';

//renderer function
function renderIcon(val) {
    return '&lt;a href=&quot;mailto:' + val + '&quot;&gt;'+ '&lt;img src=&quot;' + IMG_EMAIL + '&quot;&gt; ' + val  +'&lt;/a&gt;';
}
</pre>
<p style="text-align: justify;">Na função, colocamos apenas um HTML básico de link com função mailto, mais o valor do email e o ícone.</p>
<p style="text-align: justify;">Muito simples né?</p>
<p style="text-align: justify;">Agora você pode ficar brincando e criar suas funções renderer!</p>
<p>Download (J2EE project):&nbsp;<a href="http://github.com/loiane/gridcell-with-image" target="_blank"><img title="public" src="http://www.loiane.com/wp-content/uploads/2009/11/public.png" alt="public" height="16" width="16"> http://github.com/loiane/gridcell-with-image</a></p>
<p>English: <a href=" http://loianegroner.com/2010/01/how-to-display-an-imagelink-inside-an-ext-js-gridpanels-cell/" target="_blank"> http://loianegroner.com/2010/01/how-to-display-an-imagelink-inside-an-ext-js-gridpanels-cell/</a></p>
<p style="text-align: justify;">Bons códigos!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1117&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/nuMbxP55Y1y18RM6fclyY7ux6oc/0/da"><img src="http://feedads.g.doubleclick.net/~a/nuMbxP55Y1y18RM6fclyY7ux6oc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nuMbxP55Y1y18RM6fclyY7ux6oc/1/da"><img src="http://feedads.g.doubleclick.net/~a/nuMbxP55Y1y18RM6fclyY7ux6oc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=YU7dcMXxVFU:cZ1Kkbeq5bU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=YU7dcMXxVFU:cZ1Kkbeq5bU:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=YU7dcMXxVFU:cZ1Kkbeq5bU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/YU7dcMXxVFU" height="1" width="1"/>]]></content:encoded><description>Esse tutorial aborda como colocar/fazer o display de um ícone ou link em uma célula do componente Grid do ExtJS. Para explicar isso, vamos utilizar um grid com informações básicas de uma pessoa (agenda), e ao invés de apenas mostrar o email do contato, vamos mostrar um icone (envelope), além de colocar um link do [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/01/extjs-como-colocar-icone-e-link-nas-celulas-do-grid/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.loiane.com/2010/01/extjs-como-colocar-icone-e-link-nas-celulas-do-grid/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-como-colocar-icone-e-link-nas-celulas-do-grid</feedburner:origLink></item><item><title>ExtJS: Ext.Window: hide ou close?</title><link>http://feedproxy.google.com/~r/Loiane/~3/1IwV3kjSRH0/</link><category>Ext JS</category><category>Ext.Window</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 04 Jan 2010 03:00:22 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1353</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">Neste curto tutorial, você vai aprender como controlar o componente Ext.Window Panel do ExtJS.<br />
<a href="http://www.loiane.com/wp-content/uploads/2009/12/ext.window_hide_or_close.png"><img class="aligncenter size-full wp-image-1354" title="ext.window_hide_or_close" src="http://www.loiane.com/wp-content/uploads/2009/12/ext.window_hide_or_close.png" alt="" width="511" height="312" /></a></p>
<p style="text-align: justify;"><strong>Problema</strong>: você criou uma janela com ExtJS, e ela funcionou perfeitamente na primeira vez. Quando a aplicação disparou o evento para abrir a janela pela segunda vez, nada aconteceu, ou você viu um erro no firebug (algum coisa is not defined ou alguma coisa is null). Como reparar isso?</p>
<p style="text-align: justify;"><strong>Solução</strong>: quando você não diz como o Ext.Window deve trabalhar, o comportamento padrão é fechar (close) o componente, e com isso, destruí-lo (destroy). Devemos então, esconder (hide) o componente, assim, poderemos reutilizá-lo nas próximas vezes.</p>
<p style="text-align: justify;">Código de Exemplo (referência: http://www.extjs.com/deploy/dev/examples/window/hello.html):</p>
<p style="text-align: justify;"><strong>HTML</strong>:</p>
<pre class="brush: xml; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Ext.Window: close or hide&lt;/title&gt;

	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/ext-window/ext-3.0.3/resources/css/ext-all.css&quot; /&gt;

	&lt;script src=&quot;/ext-window/ext-3.0.3/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;/ext-window/ext-3.0.3/ext-all.js&quot;&gt;&lt;/script&gt;

	&lt;script src=&quot;/ext-window/js/ext-window.js&quot;&gt;&lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
	&lt;input type=&quot;button&quot; id=&quot;show-btn&quot; value=&quot;Show Window&quot; /&gt;

	&lt;div id=&quot;hello-win&quot; class=&quot;x-hidden&quot;&gt;

    &lt;div class=&quot;x-window-header&quot;&gt;Hello Dialog&lt;/div&gt;
    &lt;div id=&quot;hello-tabs&quot;&gt;
        &lt;!-- Auto create tab 1 --&gt;
        &lt;div class=&quot;x-tab&quot; title=&quot;Hello World&quot;&gt;
            &lt;p&gt;Ext.Window Panel: Close or Hide?&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>JS</strong>:</p>
<pre class="brush: jscript; collapse: false; first-line: 1; toolbar: true; wrap-lines: false;">
Ext.onReady(function(){

	Ext.BLANK_IMAGE_URL = '/ext-window/ext-3.0.3/resources/images/default/s.gif';

    var win;
    var button = Ext.get('show-btn');

    var tab = new Ext.TabPanel({
        applyTo: 'hello-tabs',
        autoTabs:true,
        activeTab:0,
        deferredRender:false,
        border:false
    });

    button.on('click', function(){

        // create the window on the first click and reuse on subsequent clicks
    	//cria a janela no primeiro clique e a reusa nos próximos cliques
        if(!win){
            win = new Ext.Window({
                applyTo:'hello-win',
                layout:'fit',
                width:500,
                height:300,
                closeAction:'hide', //'close' - destroy the component
                plain: true,

                items: tab,

                buttons: [{
                    text: 'Close',
                    handler: function(){
                        win.hide();
                    }
                }]
            });
        }
        win.show(this);
    });
});
</pre>
<p>Bons códigos!</p>
<p>English Version of this post: <a href="http://loianegroner.com/2010/01/ext-window-panel-show-or-hide/" target="_blank">Ext.Window Panel: Show or Hide?</a></p>
<p>Download do projeto: <a href="http://github.com/loiane/ext-window" target="_blank"><img title="public" src="http://www.loiane.com/wp-content/uploads/2009/11/public.png" alt="public" width="16" height="16" /> http://github.com/loiane/ext-window</a></p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1353&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/nLP1loFj9xETMvXTfYqQZP8NDU0/0/da"><img src="http://feedads.g.doubleclick.net/~a/nLP1loFj9xETMvXTfYqQZP8NDU0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nLP1loFj9xETMvXTfYqQZP8NDU0/1/da"><img src="http://feedads.g.doubleclick.net/~a/nLP1loFj9xETMvXTfYqQZP8NDU0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=1IwV3kjSRH0:S4u-56_8L-I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=1IwV3kjSRH0:S4u-56_8L-I:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=1IwV3kjSRH0:S4u-56_8L-I:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/1IwV3kjSRH0" height="1" width="1"/>]]></content:encoded><description>Neste curto tutorial, você vai aprender como controlar o componente Ext.Window Panel do ExtJS. Problema: você criou uma janela com ExtJS, e ela funcionou perfeitamente na primeira vez. Quando a aplicação disparou o evento para abrir a janela pela segunda vez, nada aconteceu, ou você viu um erro no firebug (algum coisa is not defined [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2010/01/extjs-ext-window-hide-ou-close/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.loiane.com/2010/01/extjs-ext-window-hide-ou-close/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=extjs-ext-window-hide-ou-close</feedburner:origLink></item><item><title>Retrospectiva 2009</title><link>http://feedproxy.google.com/~r/Loiane/~3/PLkSb-606rA/</link><category>pessoal</category><category>carreira</category><category>git</category><category>GitHub</category><category>Google Wave</category><category>IBM</category><category>IBM Academic Initiative</category><category>java</category><category>javascript</category><category>json</category><category>spring</category><category>XML</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Loiane</dc:creator><pubDate>Mon, 28 Dec 2009 10:49:02 PST</pubDate><guid isPermaLink="false">http://www.loiane.com/?p=1341</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p style="text-align: justify;">2009 foi um ano de muitas bençãos na minha carreira profissional. Espero que 2010 continue abençoado, e cheio de conquistas maravilhosas.</p>
<p style="text-align: justify;">Aqui vai um resumo e meus planos profissionais para 2010. Bom que fica tudo registrado, assim poderei me cobrar no final de 2010! <img src='http://www.loiane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Bem, em janeiro decidi <a href="http://www.loiane.com/2009/01/primeiro-post/" target="_blank">criar esse blog</a>, influenciada por alguns amigos blogueiros. Esse blog surgiu na idéia de fazer um log de tudo que estudo, com o objetivo de não ter que ficar estudando tudo de novo (se no futuro precisar, aí só voltar aqui e relembrar). Além do log de tutoriais, também fiz um log das notícias que julguei importante para mim.</p>
<p style="text-align: justify;">Fiquei muito feliz ao longo do ano, pois as visitas do blog aumentaram muuuito, e comecei e receber comentários e emails carinhosos. Fiquei feliz porque o conteúdo que publiquei aqui, além de me ajudar, também ajudou/ajuda outras pessoas! Não existe coisa melhor do que ter um retorno positivo do esforço que você faz.</p>
<p style="text-align: justify;">A primeira série de post que fiz foi sobre XML, e até agora, a mais comentada e elogiada aqui no blog! Muito obrigada a todos!</p>
<ul style="text-align: justify;">
<li><a title="Manipulando arquivos XML em Java com a API SAX - Parte II" href="../2009/05/manipulando-arquivos-xml-em-java-com-a-api-sax-parte-ii/" target="_blank">Manipulando arquivos XML em Java com a API SAX &#8211; Parte II</a></li>
<li><a title="Manipulando arquivos XML em Java com a API SAX - Parte I" href="../2009/05/manipulando-arquivos-xml-em-java-com-a-api-sax-parte-i/" target="_blank">Manipulando arquivos XML em Java com a API SAX &#8211; Parte I</a></li>
<li><a title="Manipulando arquivos XML em Java com a API DOM - Parte III" href="../2009/05/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-iii/" target="_blank">Manipulando arquivos XML em Java com a API DOM &#8211; Parte III</a></li>
<li><a title="Manipulando arquivos XML em Java com a API DOM - Parte II" href="../2009/05/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-ii/" target="_blank">Manipulando arquivos XML em Java com a API DOM &#8211; Parte II</a></li>
<li><a title="Manipulando arquivos XML em Java com a API DOM - Parte I" href="../2009/04/manipulando-arquivos-xml-em-java-com-a-api-dom-parte-i/" target="_blank">Manipulando arquivos XML em Java com a API DOM &#8211; Parte I</a></li>
<li><a title="Java e XML" href="../2009/04/java-e-xml/" target="_blank">Java e XML</a></li>
<li><a title="Validação de documentos XML com Schema – Introdução ao XML - Parte VIII" href="../2009/04/validacao-de-documentos-xml-com-schema-%e2%80%93-introducao-ao-xml-parte-viii/" target="_blank">Validação de documentos XML com Schema – Introdução ao XML &#8211; Parte VIII</a></li>
<li><a title="Validação de documentos XML com DTD – Introdução ao XML - Parte VII" href="../2009/04/validacao-de-documentos-xml-com-dtd-%e2%80%93-introducao-ao-xml-parte-vii/" target="_blank">Validação de documentos XML com DTD – Introdução ao XML &#8211; Parte VII</a></li>
<li><a title="Construindo um DTD – Introdução ao XML - Parte VI" href="../2009/04/construindo-um-dtd-%e2%80%93-introducao-ao-xml-parte-vi/" target="_blank">Construindo um DTD – Introdução ao XML &#8211; Parte VI</a></li>
<li><a title="Validação de documentos XML – Introdução ao XML - Parte V" href="../2009/03/validacao-de-documentos-xml-%e2%80%93-introducao-ao-xml-parte-v/" target="_blank">Validação de documentos XML – Introdução ao XML &#8211; Parte V</a></li>
<li><a title="Documento XML Bem Formado - Introdução ao XML: Parte IV" href="../2009/03/documento-xml-bem-formado-introducao-ao-xml-parte-iv/" target="_blank">Documento XML Bem Formado &#8211; Introdução ao XML: Parte IV</a></li>
<li><a title="Como criar um documento XML - Introdução ao XML: Parte III" href="../2009/03/como-criar-um-documento-xml-introducao-ao-xml-parte-iii/" target="_blank">Como criar um documento XML &#8211; Introdução ao XML: Parte III</a></li>
<li><a title="XML: como posso usar, vantagens e desvantagens - Introdução ao XML: Parte II" href="../2009/02/xml-como-posso-usar-vantagens-e-desvantagens-introducao-ao-xml-parte-ii/" target="_blank">XML: como posso usar, vantagens e desvantagens &#8211; Introdução ao XML: Parte II</a></li>
<li><a title="Introdução ao XML" href="../2009/02/introducao-ao-xml/" target="_blank">Introdução ao XML</a></li>
</ul>
<p style="text-align: justify;">Ainda preciso unir todos esses posts em um pdf, tá na minha lista TO DO!</p>
<p style="text-align: justify;">Em março, me <a href="http://www.loiane.com/2009/03/off-tempo-de-mudancas/" target="_blank">mudei de Vitória &#8211; ES para Campinas</a> &#8211; interior de São Paulo, por conta de uma proposta de <a href="http://www.loiane.com/2009/04/como-foi-o-processo-seletivo-na-ibm/" target="_blank">trabalho na IBM</a> de Hortolândia. Um dos meses mais feliz da minha vida, pois esse era um dos meus sonhos.  Essa proposta me fez ver que com esforço, dedicação e muita força de vontade, a gente pode realizar muitas coisas! Com a mudança de cidade, mais 10 kilos na balança também (que ainda não consegui perder =/)!</p>
<p style="text-align: justify;">Me tornei embaixadora do IBM Academic Initiative em abril, e a série sobre XML rendeu um <a href="http://www.loiane.com/2009/10/apresentacao-do-mini-curso-de-xml-pelo-ibm-academic-initiative/" target="_blank">mini-curso</a>.</p>
<p style="text-align: justify;">Desque que entrei na IBM, aprendi várias coisas novas. E isso me deu a oportunidade de fazer novos posts. Para meu primeiro projeto, aprendi Spring, ExtJS (principalmente o componente DataGrid), JQuery, iBatis (concorrente do Hibernate),  algumas ferramentas da Rational, além de ter melhorado meu inglês pra caramba! Aqui no blog, foquei mais em Spring + Extjs + JSON. Eis os posts:</p>
<ul style="text-align: justify;">
<li><a title="Impressão de GRID no EXTJS com GridPrinter" href="../2009/11/impressao-de-grid-no-extjs-com-gridprinter/" target="_blank">Impressão de GRID no EXTJS com GridPrinter</a></li>
<li><a title="Ext JS: Eventos disparados pelos componentes" href="../2009/10/ext-js-eventos-disparados-pelos-componentes/" target="_blank">Ext JS: Eventos disparados pelos componentes</a></li>
<li><a title="Ajax de primeira com ExtJS + JSON no seu projeto Spring: Minha palestra do IV EJES" href="../2009/10/ajax-de-primeira-com-extjs-json-no-seu-projeto-spring-minha-palestra-do-iv-ejes/" target="_blank">Ajax de primeira com ExtJS + JSON no seu projeto Spring: Minha palestra do IV EJES</a></li>
<li><a title="ExtJS: seleção de linha no grid" href="../2009/09/extjs-selecao-de-linha-no-grid/" target="_blank">ExtJS: seleção de linha no grid</a></li>
<li><a title="Como construir um grid dinâmico utilizando Ext JS" href="../2009/07/como-construir-um-grid-dinamico-utilizando-ext-js/" target="_blank">Como construir um grid dinâmico utilizando Ext JS</a></li>
<li><a title="Como Montar um Grid com Paginação utilizando Ext JS" href="../2009/07/como-montar-um-grid-com-paginacao-utilizando-ext-js/" target="_blank">Como Montar um Grid com Paginação utilizando Ext JS</a></li>
<li><a title="Como Montar um Grid utilizando Ext JS + Json + Spring" href="../2009/07/como-montar-um-grid-utilizando-ext-js-json-spring/" target="_blank">Como Montar um Grid utilizando Ext JS + Json + Spring</a></li>
<li><a title="Como Montar um Grid utilizando Ext JS + Json + Java" href="../2009/07/como-montar-um-grid-utilizando-ext-js-json-java/" target="_blank">Como Montar um Grid utilizando Ext JS + Json + Java</a></li>
<li><a title="Como Montar um Grid utilizando Ext JS" href="../2009/06/como-montar-um-grid-utilizando-ext-js/" target="_blank">Como Montar um Grid utilizando Ext JS</a></li>
<li><a title="Começando com Ext JS" href="../2009/06/comecando-com-ext-js/" target="_blank">Começando com Ext JS</a></li>
<li><a title="JSON + Spring" href="../2009/07/json-spring/" target="_blank">JSON + Spring</a></li>
<li><a title="JSON e Java" href="../2009/06/json-e-java/" target="_blank">JSON e Java</a></li>
<li><a title="Breve Introdução ao JSON" href="../2009/06/breve-introducao-ao-json/" target="_blank">Breve Introdução ao JSON</a></li>
</ul>
<p style="text-align: justify;">Comecei a aprender Git também, após fazer minha conta no GitHub &#8211; nova modinha nerd para compartilhar código:</p>
<ul style="text-align: justify;">
<li><a title="Tutorial: Usando o EGit Eclipse Plugin com o GitHub" href="../2009/11/tutorial-usando-o-egit-eclipse-plugin-com-o-github/" target="_blank">Tutorial: Usando o EGit Eclipse Plugin com o GitHub</a></li>
<li><a title="Egit (GitHub Eclipe Plugin): Problema com Auth Fail no Windows" href="../2009/11/egit-github-eclipe-plugin-problema-com-auth-fail-no-windows/" target="_blank">Egit (GitHub Eclipe Plugin): Problema com Auth Fail no Windows</a></li>
<li><a title="Todos os projetos do blog agora no GitHub" href="../2009/10/todos-os-projetos-do-blog-agora-no-github/" target="_blank">Todos os projetos do blog agora no GitHub</a></li>
</ul>
<p style="text-align: justify;">Publiquei alguns outros posts sobre carreira também, além de um <a href="http://www.loiane.com/2009/07/como-instalar-o-my-sql-server/" target="_blank">tutorial sobre como instalar My SQL</a>:</p>
<ul style="text-align: justify;">
<li><a title="Carreira em TI: Currículo em Inglês" href="../2009/11/carreira-em-ti-curriculo-em-ingles/" target="_blank">Carreira em TI: Currículo em Inglês</a></li>
<li><a title="Fluência no Inglês: ter ou não ter, eis a questão" href="../2009/10/fluencia-no-ingles-ter-ou-nao-ter-eis-a-questao/" target="_blank">Fluência no Inglês: ter ou não ter, eis a questão</a></li>
<li><a title="Como o Linkedin pode te ajudar a conseguir um emprego" href="../2009/08/como-o-linkedin-pode-te-ajudar-a-conseguir-um-emprego/" target="_blank">Como o Linkedin pode te ajudar a conseguir um emprego</a></li>
<li><a title="Oportunidade de trabalhar na IBM através do My developerWorks" href="../2009/08/oportunidade-de-trabalhar-na-ibm-atraves-do-my-developerworks/" target="_blank">Oportunidade de trabalhar na IBM através do My developerWorks</a></li>
<li><a title="Livro: The Adventures of an IT Leader" href="../2009/06/livro-the-adventures-of-an-it-leader/" target="_blank">Livro: The Adventures of an IT Leader</a></li>
<li><a title="10 palavras poderosas para seu currículo em inglês" href="../2009/05/10-palavras-poderosas-para-seu-curriculo-em-ingles/" target="_blank">10 palavras poderosas para seu currículo em inglês</a></li>
<li><a title="Como foi o processo seletivo na IBM" href="../2009/04/como-foi-o-processo-seletivo-na-ibm/" target="_blank">Como foi o processo seletivo na IBM</a></li>
<li><a title="Como manter-se atualizado em Java" href="../2009/01/como-manter-se-atualizado-em-java/" target="_blank">Como manter-se atualizado em Java</a></li>
</ul>
<p style="text-align: justify;">Além de outros posts, que você pode conferir a lista <a href="http://www.loiane.com/sitemap-loiane/" target="_blank">aqui</a>.</p>
<p style="text-align: justify;">No total: 100 posts publicados &#8211; 101 com esse,  10 posts ainda tem em modo rascunho (fica pra 2010 &#8211; além de mais 5 sobre Spring security &#8211; estudei nesse fim de semana do Natal &#8211; também pra 2010).</p>
<p style="text-align: justify;">Comecei também meu blog em inglês (<a href="http://loianegroner.com" target="_blank">http://loianegroner.com</a>) &#8211; para treinar mais a língua inglesa &#8211; minha conversação técnica ainda precisa melhorar bastante &#8211; são muitos termos!</p>
<p style="text-align: justify;">Projetos e metas para 2010:</p>
<ul style="text-align: justify;">
<li>Melhorar como falar em público &#8211; acho que não me sai muito bem na <a href="http://www.loiane.com/2009/10/ajax-de-primeira-com-extjs-json-no-seu-projeto-spring-minha-palestra-do-iv-ejes/" target="_blank">palestra do IV EJES</a> &#8211; até agora só me dou bem em sala de aula mesmo -vocação mais pra professora do que palestrante.</li>
<li>Investir mais na série sobre XML &#8211; levantado por alguns leitores aqui do blog.</li>
<li>Ler mais livros técnicos &#8211; li apenas 5 esse ano. Mas li livros não técnicos também.</li>
<li>Emagrecer os 10 kilos que ganhei &#8211; o <a href="http://blogs.opovo.com.br/tempodecorrer/categorias/desafio-do-christiano/" target="_blank">Milfont teve uma experiência bem legal</a>.</li>
<li>Estudar mais &#8211; perco muito tempo jogando (The Sims 3, Counter Strike, Sacred 2).</li>
<li>Casar! rs</li>
<li>Comprar um MAC! &#8211; esse não sei se vai entrar em 2010 por causa do casamento, mas meu prazo é até 2011.</li>
</ul>
<p>Bem, é isso!</p>
<p>Um Feliz 2010 e um ano cheio de realizações maravilhosas para todos nós!</p>

<img src="http://www.loiane.com/?ak_action=api_record_view&id=1341&type=feed" alt="" /><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.loiane.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>
<p><a href="http://feedads.g.doubleclick.net/~a/lb9T83jFjod1wM8imVK36zD21c8/0/da"><img src="http://feedads.g.doubleclick.net/~a/lb9T83jFjod1wM8imVK36zD21c8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lb9T83jFjod1wM8imVK36zD21c8/1/da"><img src="http://feedads.g.doubleclick.net/~a/lb9T83jFjod1wM8imVK36zD21c8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Loiane?a=PLkSb-606rA:Oz7HWOEdwv4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Loiane?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=PLkSb-606rA:Oz7HWOEdwv4:nQ_hWtDbxek"><img src="http://feeds.feedburner.com/~ff/Loiane?d=nQ_hWtDbxek" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Loiane?a=PLkSb-606rA:Oz7HWOEdwv4:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/Loiane?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Loiane/~4/PLkSb-606rA" height="1" width="1"/>]]></content:encoded><description>2009 foi um ano de muitas bençãos na minha carreira profissional. Espero que 2010 continue abençoado, e cheio de conquistas maravilhosas. Aqui vai um resumo e meus planos profissionais para 2010. Bom que fica tudo registrado, assim poderei me cobrar no final de 2010! Bem, em janeiro decidi criar esse blog, influenciada por alguns amigos [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.loiane.com/2009/12/retrospectiva-2009/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">8</slash:comments><feedburner:origLink>http://www.loiane.com/2009/12/retrospectiva-2009/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=retrospectiva-2009</feedburner:origLink></item></channel></rss>
