blob: cc8da01fa7c66f970b8e9e9b18c52753440a0d77 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="An introduction to using the Spring Framework
in NetBeans IDE">
<meta name="keywords" content="NetBeans, IDE, integrated development environment,
Spring framework, frameworks, MVC, Model View Controller, web application">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<title>Introdu&ccedil;&atilde;o ao Spring Web MVC: Tutorial do NetBeans IDE</title>
</head>
<body>
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<h1>Introdu&ccedil;&atilde;o ao Spring Web MVC</h1>
<p>Este documento mostra como construir uma aplica&ccedil;&atilde;o Web <a href="http://www.oracle.com/technetwork/articles/javase/index-142890.html">MVC</a> simples usando o <a href="http://www.springframework.org/">Spring Framework</a>. A aplica&ccedil;&atilde;o permite que um usu&aacute;rio indique seu nome em um campo de texto, e ao clicar em OK, o nome &eacute; retornado e exibido em uma segunda p&aacute;gina com uma sauda&ccedil;&atilde;o de boas-vindas.</p>
<p>O Spring Framework &eacute; uma estrutura de aplicativo de c&oacute;digo-fonte aberto popular que pode facilitar o desenvolvimento do Java EE. Ele consiste em um cont&ecirc;iner, um framework para gerenciar componentes, e um conjunto de servi&ccedil;os de snap-para interfaces de usu&aacute;rio, transa&ccedil;&otilde;es e persist&ecirc;ncia da Web. Uma parte do Spring Framework &eacute; o Spring Web MVC, um framework MVC extens&iacute;vel para criar aplicativos Web.</p>
<p>O IDE fornece suporte embutido para Spring Framework 3.0 e 2.5. As bibliotecas da estrutura s&atilde;o empacotadas com o IDE e s&atilde;o adicionadas automaticamente ao classpath do projeto quando a estrutura &eacute; selecionado. As defini&ccedil;&otilde;es de configura&ccedil;&atilde;o s&atilde;o fornecidas, tais como nomea&ccedil;&atilde;o e mapeamento do Spring Web MVC <code>DispatcherServlet</code>. A biblioteca JSTL pode, como op&ccedil;&atilde;o, ser registrada na cria&ccedil;&atilde;o do projeto. O suporte para arquivos de configura&ccedil;&atilde;o de bean Spring XML tamb&eacute;m &eacute; fornecido, incluindo a seguinte funcionalidade:</p>
<ul>
<li><strong>Auto-completar de c&oacute;digo</strong>. Chamado nos arquivos de configura&ccedil;&atilde;o Spring XML para classes Java assim como refer&ecirc;ncias de bean.</li>
<li><strong>Navega&ccedil;&atilde;o</strong>. Hyperlink de classes e propriedades Java mencionadas nas defini&ccedil;&otilde;es de bean Spring, assim como hyperlink para outras refer&ecirc;ncias de bean Spring.</li>
<li><strong>Refatora&ccedil;&atilde;o</strong>. Renomea&ccedil;&atilde;o de refer&ecirc;ncias a classes Java nos arquivos de configura&ccedil;&atilde;o Spring XML.</li>
</ul>
<p>Para obter mais informa&ccedil;&otilde;es sobre o Spring Framework, visite <a href="http://www.springsource.org/">http://www.springsource.org/</a>. Para obter uma explica&ccedil;&atilde;o detalhada de como os artefatos do Spring Framework se comportam e interagem com outros objetos em um aplicativo, consulte a <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/">Documenta&ccedil;&atilde;o de refer&ecirc;ncia do Spring Framework</a> oficial ou consulte a <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/">Documenta&ccedil;&atilde;o da API do Spring Framework</a>.</p>
<p><strong>Conte&uacute;do</strong></p>
<img src="../../../images_www/articles/69/netbeans-stamp-69-70-71.png" class="stamp" width="114" alt="O conte&uacute;do desta p&aacute;gina se aplica ao IDE NetBeans 6.9, 7.0 e 7.1" title="O conte&uacute;do desta p&aacute;gina se aplica ao IDE NetBeans 6.9, 7.0 e 7.1" />
<ul class="toc">
<li><a href="#setting">Configurando um novo projeto com o suporte a Spring Web MVC</a>
<ul>
<li><a href="#creating">Criando um projeto de esqueleto Spring Web MVC</a></li>
<li><a href="#running">Executando o projeto de esqueleto</a></li>
</ul></li>
<li><a href="#overview">Vis&atilde;o geral do aplicativo</a></li>
<li><a href="#service">Implementando um servi&ccedil;o</a></li>
<li><a href="#controller">Implementando o controlador e o modelo</a></li>
<li><a href="#view">Implementando as visualiza&ccedil;&otilde;es</a></li>
<li><a href="#seeAlso">Consulte tamb&eacute;m</a></li>
</ul>
<p><strong>Para concluir este tutorial, voc&ecirc; precisa dos seguintes recursos e softwares.</strong></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software ou recurso</th>
<th class="tblheader" scope="col">Vers&atilde;o necess&aacute;ria</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">6.8, 6.9, 7.0, 7.1, Java</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">vers&atilde;o 6</td>
</tr>
<tr>
<td class="tbltd1"><a href="https://glassfish.dev.java.net/public/downloadsindex.html">Servidor GlassFish</a></td>
<td class="tbltd1">C&oacute;digo-fonte aberto edi&ccedil;&atilde;o 3.x</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Observa&ccedil;&otilde;es:</strong></p>
<ul>
<li>A instala&ccedil;&atilde;o Java do IDE permite, como op&ccedil;&atilde;o, baixar e registrar o servidor GlassFish com o IDE.</li>
<li>Se voc&ecirc; precisar comparar seu projeto com uma solu&ccedil;&atilde;o que funciona, <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FHelloSpring69.zip">baixe o aplicativo de amostra</a>.</li>
</ul>
<h2 id="setting">Configurando um novo projeto com suporte a Spring Web MVC</h2>
<ul>
<li><a href="#creating">Criando um projeto de esqueleto Spring Web MVC</a></li>
<li><a href="#running">Executando o projeto de esqueleto</a></li>
</ul>
<div class="indent">
<h3 id="creating">Criando um projeto de esqueleto Spring Web MVC</h3>
<p>Comece criando um novo projeto para uma aplica&ccedil;&atilde;o Web usando o Spring Framework.</p>
<ol>
<li>Escolha Novo projeto (Ctrl-Shift-N; &amp;#8984-Shift-N no Mac) no menu Arquivo do IDE. Selecione a categoria Java Web e, em Projetos, selecione Aplicativo da Web. Clique em Pr&oacute;ximo.</li>
<li>Em Nome do projeto, digite <strong>HelloSpring</strong>. Clique em Pr&oacute;ximo.</li>
<li>Na Etapa 3: Servidor e configura&ccedil;&otilde;es, desmarque a op&ccedil;&atilde;o Habilitar inje&ccedil;&atilde;o de depend&ecirc;ncia e contextos, j&aacute; que voc&ecirc; n&atilde;o est&aacute; trabalhando com a especifica&ccedil;&atilde;o <a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a> neste tutorial.
<br><br>
Al&eacute;m disso, garanta que o servidor GlassFish esteja selecionado na lista suspensa Servidor e observe que Java EE 6 Web &eacute; a vers&atilde;o EE padr&atilde;o para esse servidor. Clique em Pr&oacute;ximo.</li>
<li>Na Etapa 4, o painel Frameworks, selecione Spring Web MVC.
<br>
<img src="../../../images_www/articles/71/web/spring/frameworks-window.png"
class="margin-around b-all"
title="Spring Web MVC exibido no painel Frameworks"
alt=" Spring Web MVC exibido no painel Frameworks">
<p>
Ao selecionar o Spring Web MVC, note que a biblioteca JSTL (Biblioteca de marca&ccedil;&atilde;o padr&atilde;o de p&aacute;ginas do JavaServer) &eacute; adicionada ao classpath durante a cria&ccedil;&atilde;o do projeto por padr&atilde;o. Desmarque essa op&ccedil;&atilde;o (como na captura de tela acima), j&aacute; que o JSTL n&atilde;o &eacute; necess&aacute;rio para este tutorial. Observe tamb&eacute;m, que o IDE permite adicionar a biblioteca Spring 2.5 ao projeto, se essa for sua prefer&ecirc;ncia.</p></li>
<li>Clique na aba Configura&ccedil;&atilde;o e observe que o assistente permite especificar o nome e o mapeamento do servlet Spring Dispatcher.
<br>
<img src="../../../images_www/articles/71/web/spring/spring-configuration.png"
title="Especifique o nome e o mapeamento do servlet Spring Dispatcher na aba Configura&ccedil;&atilde;o"
class="margin-around b-all" alt="Op&ccedil;&otilde;es de configura&ccedil;&atilde;o do Spring"></li>
<li>Clique em Terminar. O IDE cria um projeto para o aplicativo inteiro, incluindo todos os metadados, assim como o script de constru&ccedil;&atilde;o do projeto Ant que voc&ecirc; pode inspecionar na janela Arquivos (Ctrl-2; &amp;#8984-2 no Mac). Voc&ecirc; pode ver a estrutura do modelo na janela Projetos (Ctrl-1; &amp;#8984-1 no Mac). Note tamb&eacute;m que quatro arquivos s&atilde;o abertos por padr&atilde;o no editor do IDE: <code>dispatcher-servlet.xml</code>, <code>applicationContext.xml</code>, <code>redirect.jsp</code> e <code>index.jsp</code>.</li>
<li>Na janela Projetos, expanda o novo n&oacute; Bibliotecas do projeto e observe que JARs do Spring est&atilde;o inclu&iacute;dos no classpath do projeto.
<br>
<img src="../../../images_www/articles/71/web/spring/spring-libraries.png"
title="JARs do Spring est&atilde;o listados no n&oacute; Bibliotecas do projeto"
class="margin-around b-all" alt="JARs do Spring listados no n&oacute; Bibliotecas do projeto">
</li>
</ol>
<h3 id="running">Executando o projeto de esqueleto</h3>
<p>Antes de fazer quaisquer altera&ccedil;&otilde;es nos arquivos do projeto, tente executar o novo projeto no IDE:</p>
<ol>
<li>Clique no bot&atilde;o Executar projeto (<img src="../../../images_www/articles/71/web/spring/run-project-btn.png"
alt="bot&atilde;o Executar projeto">) na barra de ferramentas principal do IDE. O IDE inicia automaticamente o servidor GlassFish se ele ainda n&atilde;o estiver sendo executado, compila o projeto e o implanta no servidor. Note qualquer sa&iacute;da exibida na janela Sa&iacute;da do IDE (Ctrl-4; &amp;#8984-4 no Mac). A sa&iacute;da gerada termina com a mensagem <code>CONSTRU&Ccedil;&Atilde;O BEM-SUCEDIDA.</code>
<br>
<img src="../../../images_www/articles/71/web/spring/output.png"
alt="Janela Sa&iacute;da exibindo informa&ccedil;&otilde;es durante a execu&ccedil;&atilde;o do projeto"
title="A janela Sa&iacute;da exibe informa&ccedil;&otilde;es durante a execu&ccedil;&atilde;o do projeto"
class="margin-around b-all">
<br>
O navegador padr&atilde;o do IDE &eacute; iniciado e voc&ecirc; v&ecirc; o conte&uacute;do da visualiza&ccedil;&atilde;o da p&aacute;gina de boas-vindas (<code>/WEB-INF/jsp/index.jsp</code>).
<br>
<img src="../../../images_www/articles/71/web/spring/browser-output.png"
class="margin-around b-all" width="668"
title="A sa&iacute;da da p&aacute;gina de boas-vindas &eacute; exibida no navegador"
alt="Sa&iacute;da da p&aacute;gina de boas-vindas exibida no navegador"></li>
</ol>
<p class="tips">Quando voc&ecirc; executa o projeto no IDE, o projeto &eacute; compilado e implantado no servidor e, em seguida, aberto no navegador padr&atilde;o. Al&eacute;m disso, o IDE fornece um recurso Implantar ao salvar, que est&aacute; ativado por padr&atilde;o para projetos da Web. Quando voc&ecirc; salva arquivos no editor, o projeto &eacute; automaticamente recompilado e implantado no servidor. Para visualizar altera&ccedil;&otilde;es, voc&ecirc; pode, simplesmente, atualizar as p&aacute;ginas no navegador.</p>
<p>Para entender o que acabou de acontecer, comece examinando o descritor de deployment do projeto (<code>web.xml</code>). Para abrir esse arquivo no editor de c&oacute;digo-fonte, clique com o bot&atilde;o direito do mouse no n&oacute; <code>WEB-INF</code> &gt; <code>web.xml</code> na janela Projetos e escolha Editar. O ponto de entrada padr&atilde;o do aplicativo &eacute; <code>redirect.jsp</code>:</p>
<div class="indent">
<pre class="examplecode">
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;redirect.jsp&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;</pre>
</div>
<p>Em <code>redirect.jsp</code>, existe uma instru&ccedil;&atilde;o de redirecionamento que aponta todas as solicita&ccedil;&otilde;es para <code>index.htm</code>:</p>
<div class="indent">
<pre class="examplecode">&lt;% response.sendRedirect(&quot;index.htm&quot;); %&gt;</pre>
</div>
<p>No descritor de deployment, note que todas as requisi&ccedil;&otilde;es de padr&otilde;es de URL que correspondem a <code>*.htm</code> s&atilde;o mapeadas para <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html"><code>DispatcherServlet</code></a> do Spring.</p>
<div class="indent">
<pre class="examplecode">
&lt;servlet&gt;
&lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
&lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
</div>
<p class="tips">O nome completamente qualificado do servlet dispatcher, conforme mostrado acima, &eacute; <code>org.springframework.web.servlet.DispatcherServlet</code>. Essa classe &eacute; contida na biblioteca do Spring, que foi adicionada ao classpath do projeto quando o projeto foi criado. Voc&ecirc; pode verificar isso na janela Projetos, fazendo uma busca detalhada a partir do n&oacute; Bibliotecas. Localize o arquivo <code>spring-webmvc-3.0.0.RELEASE.jar</code> e, em seguida, expanda para encontrar <code>org.springframework.web.servlet</code> &gt; <code>DispatcherServlet</code>.</p>
<p>A classe <code>DispatcherServlet</code> manipula as solicita&ccedil;&otilde;es de entrada com base nas defini&ccedil;&otilde;es de configura&ccedil;&atilde;o encontradas em <code>dispatcher-servlet.xml</code>. Abra <code>dispatcher-servlet.xml</code>, clicando em sua aba no editor. Observe o c&oacute;digo seguinte.</p>
<div class="indent">
<pre class="examplecode">
&lt;bean id=&quot;urlMapping&quot; class=&quot;org.springframework.web.servlet.handler.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.html">SimpleUrlHandlerMapping</a>&quot;&gt; &lt;property name=&quot;mappings&quot;&gt; &lt;props&gt; &lt;prop key=&quot;/index.htm&quot;&gt;indexController&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/view/InternalResourceViewResolver.html">InternalResourceViewResolver</a>&quot; p:prefix=&quot;/WEB-INF/jsp/&quot; p:suffix=&quot;.jsp&quot; /&gt; &lt;bean name=&quot;indexController&quot; class=&quot;org.springframework.web.servlet.mvc.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html">ParameterizableViewController</a>&quot; p:viewName=&quot;index&quot; /&gt;</pre>
</div>
<p>Tr&ecirc;s beans s&atilde;o definidos nesse arquivo: <code>indexController</code>, <code>viewResolver</code> e <code>urlMapping</code>. Quando a <code>DispatcherServlet</code> recebe uma solicita&ccedil;&atilde;o que coincide com <code>*.htm</code> tal como <code>index.htm</code>, ela procura por um controle no <code>urlMapping</code> que possa acomodar a solicita&ccedil;&atilde;o. Acima, voc&ecirc; v&ecirc; que existe uma propriedade <code>mappings</code> que vincula <code>/index.htm</code> a <code>indexController</code>.</p>
<p>O ambiente de tempo de execu&ccedil;&atilde;o procura a defini&ccedil;&atilde;o de um bean chamado <code>indexController</code>, que &eacute; convenientemente fornecido pelo projeto de esqueleto. Observe que <code>indexController</code> estende <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html"><code>ParameterizableViewController</code></a>. Essa &eacute; uma outra classe fornecida pelo Spring, que simplesmente retorna uma visualiza&ccedil;&atilde;o. Acima, observe que <code>p:viewName=&quot;index&quot;</code> especifica o nome da visualiza&ccedil;&atilde;o l&oacute;gica, que &eacute; resolvida por meio de <code>viewResolver</code> colocando-se o prefixo <code>/WEB-INF/jsp/</code> e o sufixo <code>.jsp</code>. Isso permite que o tempo de execu&ccedil;&atilde;o localize o arquivo no diret&oacute;rio do aplicativo e responda com a visualiza&ccedil;&atilde;o da p&aacute;gina de boas-vindas (<code>/WEB-INF/jsp/index.jsp</code>).</p>
</div>
<h2 id="overview">Vis&atilde;o geral do aplicativo</h2>
<p>O aplicativo criado &eacute; composto de duas p&aacute;ginas JSP (que se chamam <em>visualiza&ccedil;&otilde;es</em> na terminologia <a href="http://www.oracle.com/technetwork/articles/javase/index-142890.html">MVC</a>). A primeira visualiza&ccedil;&atilde;o cont&eacute;m um formul&aacute;rio HTML com um campo de entrada solicitando o nome do usu&aacute;rio. A segunda visualiza&ccedil;&atilde;o &eacute; uma p&aacute;gina que exibe simplesmente uma mensagem hello contendo o nome do usu&aacute;rio.</p>
<p>As visualiza&ccedil;&otilde;es s&atilde;o gerenciadas por um <em>controlador</em>, que recebe as solicita&ccedil;&otilde;es para o aplicativo e decide quais visualiza&ccedil;&otilde;es retornar. Ele tamb&eacute;m passa para as visualiza&ccedil;&otilde;es quaisquer informa&ccedil;&otilde;es que precisam exibir (isso &eacute; chamado de <em>modelo</em>). Esse controlador do aplicativo se chama <code>HelloController</code>.</p>
<p>Em uma aplica&ccedil;&atilde;o Web complexa, a l&oacute;gica comercial n&atilde;o &eacute; contida diretamente no controlador. Em vez disso, outra entidade, denominada <em>servi&ccedil;o</em>, &eacute; utilizada pelo controlador sempre que ele precisar realizar a l&oacute;gica corporativa. Em nosso aplicativo, a l&oacute;gica corporativa est&aacute; limitada ao ato de processamento da mensagem ol&aacute;, sendo assim, para essa finalidade, voc&ecirc; cria um <code>HelloService</code>. <a name="service"></a>
<h2>Implementando um servi&ccedil;o</h2>
<p>Agora que voc&ecirc; tem certeza que seu ambiente est&aacute; configurado corretamente, &eacute; poss&iacute;vel come&ccedil;ar a estender o projeto de esqueleto de acordo com as suas necessidades. Comece criando a classe <code>HelloService</code>.</p>
<ol>
<li>Clique no bot&atilde;o Novo arquivo ( <img src="../../../images_www/articles/71/web/spring/new-file-btn.png"
alt="bot&atilde;o Novo arquivo"> ) na barra de ferramentas do IDE. (Como alternativa, pressione Ctrl-N; ⌘-N no Mac.)</li>
<li>Selecione a categoria <strong>Java</strong>, <strong>Classe Java</strong> e clique em Pr&oacute;ximo.</li>
<li>No assistente para Nova classe Java exibido, digite <strong>HelloService</strong> para Nome da classe e digite <strong>service</strong> para Nome do pacote a fim de criar um novo pacote para a classe.</li>
<li>Clique em Terminar. O IDE cria a nova classe e a abre no editor.</li>
</ol>
<p>A classe <code>HelloService</code> realiza um servi&ccedil;o muito simples. Ela pega um nome como par&acirc;metro, prepara e retorna uma <code>String</code> que inclui o nome. No editor, crie o seguinte m&eacute;todo <code>sayHello()</code> para a classe (altera&ccedil;&otilde;es em <strong>negrito</strong>).</p>
<div class="indent">
<pre class="examplecode">
public class HelloService {
<strong>public static String sayHello(String name) {
return &quot;Hello &quot; + name + &quot;!&quot;;
}</strong>
}</pre></div>
<h2 id="controller">Implementando o controlador e o modelo</h2>
<p>Voc&ecirc; pode usar um <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html"><code>SimpleFormController</code></a> para manipular dados do usu&aacute;rio e determinar qual visualiza&ccedil;&atilde;o retornar.</p>
<ol>
<li>Abra o assistente para Novo arquivo pressionando Ctrl-N (⌘-N no Mac). Em Categorias, selecione <strong>Spring Framework</strong> em Tipos de arquivos e <strong>Controlador de formul&aacute;rio simplificado</strong>.
<br>
<img src="../../../images_www/articles/71/web/spring/simple-form-controller.png"
class="b-all margin-around" style="width:668px"
alt="Assistente Novo arquivo: categoria Spring Framework "
title="O NetBeans IDE fornece modelos para v&aacute;rios artefatos do Spring">
<br>
<span class="tips">O NetBeans IDE fornece modelos para v&aacute;rios artefatos do Spring, incluindo o arquivo de configura&ccedil;&atilde;o do Spring XML, o <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html"><code>AbstractController</code></a> e o <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html"><code>SimpleFormController</code></a>.</span>
</li>
<li>Clique em Pr&oacute;ximo.</li>
<li>Chame a classe de <strong>HelloController</strong> e crie um novo pacote para ela, digitando <strong>controller</strong> no campo de texto Pacote. Clique em Terminar. O IDE cria a nova classe e a abre no editor.</li>
<li>Especifique as propriedades do controlador, removendo o coment&aacute;rio dos m&eacute;todos setter exibidos por padr&atilde;o no modelo da classe. Para retirar os coment&aacute;rios do trecho de c&oacute;digo, realce o c&oacute;digo como na imagem a seguir e pressione Ctrl-/ (&amp;#8984-/ no Mac).
<br>
<img src="../../../images_www/articles/71/web/spring/comment-out.png"
class="b-all margin-around"
alt="Trecho de c&oacute;digo real&ccedil;ado no editor"
title="Realce trechos de c&oacute;digo e pressione Ctrl-/ para alternar coment&aacute;rios">
<br>
<span class="tips">Pressionar Ctrl-/ (&amp;#8984-/ no Mac) alterna os coment&aacute;rios no editor.</span>
</li>
<li>Fa&ccedil;as as altera&ccedil;&otilde;es a seguir (altera&ccedil;&otilde;es em <strong>negrito</strong>).
<pre class="examplecode">
public HelloController() {
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandClass(java.lang.Class)">setCommandClass</a>(<strong>Name</strong>.class);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandName(java.lang.String)">setCommandName</a>(&quot;<strong>name</strong>&quot;);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setSuccessView(java.lang.String)">setSuccessView</a>(&quot;<strong>hello</strong>View&quot;);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)">setFormView</a>(&quot;<strong>name</strong>View&quot;);
}</pre>
<p>Definir <code>FormView</code> permite que voc&ecirc; defina o nome da visualiza&ccedil;&atilde;o que &eacute; usada para exibir o formul&aacute;rio. Essa &eacute; a p&aacute;gina que cont&eacute;m o campo de texto que permite aos usu&aacute;rios indicar seu nome. Configurar <code>SuccessView</code> da mesma forma permite que voc&ecirc; defina o nome da visualiza&ccedil;&atilde;o que deve ser exibida durante um envio bem sucedido. Quando configura <code>CommandName</code>, voc&ecirc; define o nome do comando no modelo. Nesse caso, o comando &eacute; o objeto do formul&aacute;rio com os par&acirc;metros de solicita&ccedil;&atilde;o vinculados a ele. Configurar <code>CommandClass</code> permite que voc&ecirc; defina o nome da classe do comando. Uma inst&acirc;ncia dessa classe &eacute; preenchida e validada em cada solicita&ccedil;&atilde;o.</p>
<p>Observe que um erro &eacute; sinalizado pra <code>Name</code> no m&eacute;todo <code>setCommandClass()</code>:</p>
<img src="../../../images_www/articles/71/web/spring/set-command-class.png" class="b-all margin-around"
alt="O editor exibindo um erro para setCommandClass()"
title="Um identificador de erro &eacute; exibido para setCommandClass()">
<p>
Voc&ecirc; precisa criar a classe <code>Nome</code> como um bean simples para manter as informa&ccedil;&otilde;es de cada requisi&ccedil;&atilde;o.</p></li>
<li>Na janela Projetos, clique com o bot&atilde;o direito do mouse no n&oacute; do projeto e escolha Novo &gt; Classe Java. O assistente para Nova classe Java &eacute; exibido.</li>
<li>Indique <strong>Name</strong> para o Nome da classe, e para Pacote, selecione <strong>controller</strong> na lista suspensa.</li>
<li>Clique em Terminar. A classe <code>Nome</code> &eacute; criada e aberta no editor.</li>
<li>Para a classe <code>Nome</code>, crie um campo denominado <code>valor</code> e, em seguida, crie os m&eacute;todos do acessor (por exemplo, os m&eacute;todos getter e setter) para esse campo. Inicie declarando o campo <code>valor</code>:
<pre class="examplecode">
public class Name {
<strong>private String value;</strong>
}</pre>
<p class="tips">Para digitar &quot;<code>private</code>&quot; rapidamente, voc&ecirc; pode digitar &quot;<code>pr</code>&quot; e pressionar Tab. O modificador de acesso &quot;<code>private</code>&quot; &eacute; automaticamente adicionado &agrave; linha. Esse &eacute; um exemplo de como utilizar os modelos de c&oacute;digo do editor. Para obter uma lista completa de modelos de c&oacute;digo, escolha Ajuda &gt; Cart&atilde;o de atalhos do teclado.</p>
<br><a name="createAccessors"></a> O IDE pode criar m&eacute;todos do assessor para voc&ecirc;. No editor, clique com o bot&atilde;o direito do mouse em <code>valor</code> e escolha Inserir c&oacute;digo (ou pressione Alt-Insert; Ctrl-I no Mac). No menu pop-up, escolha Getter e Setter.
<br>
<img src="../../../images_www/articles/71/web/spring/generate-code.png"
class="margin-around b-all"
alt="O menu pop-up Gerar c&oacute;digo exibido no editor"
title="O menu pop-up Gerar c&oacute;digo permite definir os m&eacute;todos do acessor"></li>
<li>Na caixa de di&aacute;logo exibida, selecione a op&ccedil;&atilde;o <code>value : String</code>e clique em OK. Os m&eacute;todos <code>getValue()</code> e <code>setValue()</code> s&atilde;o adicionados &agrave; classe <code>Name</code>:
<pre class="examplecode">
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}</pre></li>
<li>Pressione Ctrl-Tab e escolha <code>HelloController</code> para retornar para a classe <code>HelloController</code>. Observe que o identificador de erro anterior desapareceu, mas a classe <code>Nome</code> existe agora.</li>
<li>Exclua o m&eacute;todo <code>doSubmitAction()</code> e remova os coment&aacute;rios do m&eacute;todo <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)"><code>onSubmit()</code></a>. O m&eacute;todo <code>onSubmit()</code> permite que voc&ecirc; crie seu pr&oacute;prio <code>ModelAndView</code>, que &eacute; o necess&aacute;rio aqui. Fa&ccedil;a as seguintes altera&ccedil;&otilde;es:
<pre class="examplecode">@Override
protected ModelAndView onSubmit(
HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException errors) throws Exception {
Name name = (Name) command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject(&quot;helloMessage&quot;, helloService.sayHello(name.getValue()));
return mv;
}</pre>
Como indicado acima, o <code>comando</code> &eacute; reconvertido como um objeto <code>Name</code>. Uma inst&acirc;ncia de <code>ModelAndView</code> &eacute; criada, e a visualiza&ccedil;&atilde;o de sucesso &eacute; obtida por meio de um getter em <code>SimpleFormController</code>. Finalmente, o modelo &eacute; preenchido com os dados. O &uacute;nico item em nosso modelo &eacute; a mensagem hello obtida do <code>HelloService</code> criado anteriormente. Use o m&eacute;todo <code>addObject()</code> para adicionar a mensagem hello ao modelo sobe o nome <code>helloMessage</code>.</li>
<li>Corrija os erros de importa&ccedil;&atilde;o clicando com o bot&atilde;o direito do mouse no editor e escolhendo Corrigir importa&ccedil;&otilde;es (Ctrl-Shift-I; ⌘-Shift-I no Mac).
<br>
<img src="../../../images_www/articles/71/web/spring/fix-imports70.png"
class="margin-around b-all" alt="Caixa de di&aacute;logo Corrigir todas as importa&ccedil;&otilde;es"
title="Pressione Ctrl-Shift-I para corrigir as importa&ccedil;&otilde;es do seu arquivo">
<p class="notes"><strong>Observa&ccedil;&atilde;o.</strong> Confirme se <strong><tt>org.springframework.validation.BindException</tt></strong> e <strong><tt>org.springframework.web.servlet.ModelAndView</tt></strong> est&atilde;o selecionados na caixa de di&aacute;logo Corrigir todas as importa&ccedil;&otilde;es.</p></li>
<li>Clique em OK. A instru&ccedil;&atilde;o de importa&ccedil;&atilde;o seguinte &eacute; adicionada ao in&iacute;cio do arquivo:
<pre class="examplecode">importe <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/ModelAndView.html">org.springframework.web.servlet.ModelAndView</a>;</pre>
Conforme informado na documenta&ccedil;&atilde;o da API, essa classe &quot;representa um modelo e uma visualiza&ccedil;&atilde;o retornados por um manipulador, a serem resolvidos por um <code>DispatcherServlet</code>. A visualiza&ccedil;&atilde;o pode tomar a forma de um nome de visualiza&ccedil;&atilde;o do <code>String</code>, que precisar&aacute; ser resolvido por um objeto <code>ViewResolver</code>, como alternativa, um objeto <code>Visualiza&ccedil;&atilde;o</code> pode ser especificado diretamente. O modelo &eacute; um <code>Mapa</code>, que permite o uso de v&aacute;rios objetos, classificados por nome&quot;.
<br><br>
Note que nesse est&aacute;gio, nem todos os erros s&atilde;o corrigidos, pois a classe ainda n&atilde;o pode identificar a classe <code>HelloService</code> e n&atilde;o utiliza seu m&eacute;todo <code>sayHello()</code>.</li>
<li>No <code>HelloController</code>, declare um campo privado chamado <code>HelloService</code>:
<pre class="examplecode">private HelloService helloService;</pre>
Em seguida, crie um m&eacute;todo setter p&uacute;blico para o campo:
<pre class="examplecode">public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}</pre>
Finalmente, clique com o bot&atilde;o direito do mouse no editor e escolha Corrigir importa&ccedil;&otilde;es (Ctrl-Shift-I; ⌘-Shift-I no Mac). A instru&ccedil;&atilde;o a seguir &eacute; adicionada ao in&iacute;cio do arquivo:
<pre class="examplecode">import service.HelloService;</pre>
Todos os erros devem ser corrigidos agora.</li>
<li>Registre <code>HelloService</code> em <code>applicationContext.xml</code>. Abra <code>applicationContext.xml</code> no editor e insira a seguinte declara&ccedil;&atilde;o de bean:
<pre class="examplecode">
&lt;bean name=&quot;helloService&quot; class=&quot;service.HelloService&quot; /&gt;</pre>
<div class="tips">O suporte a Spring no IDE inclui auto-completar de c&oacute;digo nos arquivos de configura&ccedil;&atilde;o XML para classes Java, assim como refer&ecirc;ncias de bean. Para chamar o autocompletar de c&oacute;digo, pressione Ctrl-Espa&ccedil;o quando estiver trabalhando no editor:
<br>
<img src="../../../images_www/articles/71/web/spring/code-completion.png"
alt="Auto-completar de c&oacute;digo chamado ao pressionar Ctrl-Espa&ccedil;o"
title="Auto-completar de c&oacute;digo chamado ao pressionar Ctrl-Espa&ccedil;o"
class="b-all margin-around"></div></li>
<li>Registre <code>HelloController</code> em <code>dispatcher-servlet.xml</code>. Abra <code>dispatcher-servlet.xml</code> no editor e insira a seguinte declara&ccedil;&atilde;o de bean:
<pre class="examplecode">
&lt;bean class=&quot;controller.HelloController&quot; p:helloService-ref=&quot;helloService&quot;/&gt;</pre></li>
</ol>
<h2 id="view">Implementando as visualiza&ccedil;&otilde;es</h2>
<p>Para implementar a visualiza&ccedil;&atilde;o desse projeto, voc&ecirc; precisa criar duas p&aacute;ginas JSP. A primeira, que voc&ecirc; pode chamar de <code>nameView.jsp</code>, serve como a p&aacute;gina de boas-vindas e permite que um usu&aacute;rio insira um nome. A outra p&aacute;gina, <code>helloView.jsp</code>, exibe uma mensagem de sauda&ccedil;&atilde;o que inclui o nome de entrada. Comece criando <code>helloView.jsp</code>.</p>
<ol>
<li id="create-jsp">Na janela Projetos, clique com o bot&atilde;o direito do mouse no n&oacute; WEB-INF &gt; <code>jsp </code> e escolha Novo &gt; JSP. O assistente para Novo arquivo JSF se abre. Chame o arquivo de <strong>helloView</strong>.</li>
<li>Clique em Terminar. A nova p&aacute;gina JSP &eacute; criada na pasta <code>jsp</code> e &eacute; aberta no editor.</li>
<li>No editor, altere o t&iacute;tulo do arquivo para <code>Ol&aacute;</code> e altere a mensagem de sa&iacute;da para recuperar o <code>helloMessage</code> do objeto <code>ModelandView</code> criado em <code>HelloController</code>.
<pre class="examplecode">
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;<strong>Hello</strong>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;<strong>${helloMessage}</strong>&lt;/h1&gt;
&lt;/body&gt;
</pre></li>
<li>Crie outra p&aacute;gina JSP da mesma maneira <a href="#create-jsp">como acima</a>, mas nomeie-o de <code>nameView</code>.</li>
<li>No editor, adicione a declara&ccedil;&atilde;o da biblioteca de marca&ccedil;&otilde;es do Spring a seguir a <code>nameView.JSP</code>.
<pre class="examplecode">&lt;%@taglib uri=&quot;http://www.springframework.org/tags&quot; prefix=&quot;spring&quot; %&gt;</pre>
Isso importa a <a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html">biblioteca de marcas Spring</a>, que cont&eacute;m marcas &uacute;teis durante a implementa&ccedil;&atilde;o de visualiza&ccedil;&otilde;es como p&aacute;ginas JSP.
<li>Altere o conte&uacute;do das marcas <code>&lt;title&gt;</code> e <code>&lt;h1&gt;</code> para que se leia: <code>Indique seu nome</code>.</li>
<li>Insira o c&oacute;digo a seguir abaixo das marca&ccedil;&otilde;es <code>&lt;h1&gt;</code>:
<pre class="examplecode">
&lt;spring:nestedPath path=&quot;name&quot;&gt;
&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
Name:
&lt;spring:bind path=&quot;value&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;${status.expression}&quot; value=&quot;${status.value}&quot;&gt;
&lt;/spring:bind&gt;
&lt;input type=&quot;submit&quot; value=&quot;OK&quot;&gt;
&lt;/form&gt;
&lt;/spring:nestedPath&gt;
</pre>
<a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.bind">spring:bind</a> permite que voc&ecirc; vincule uma propriedade de bean. A marca de vincula&ccedil;&atilde;o fornece um status de e valor de vincula&ccedil;&atilde;o, que voc&ecirc; usa como o nome e o valor do campo de entrada. Dessa forma, quando o formul&aacute;rio &eacute; enviado, o Spring saber&aacute; como extrair o valor enviado. Aqui, nossa classe de comando (<code>controller.Name</code>) possui uma propriedade <code>value</code>, portanto, voc&ecirc; define <code>path</code> como <code>value</code>.
<br><br>
<a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.nestedPath">spring:nestedPath</a> permite que voc&ecirc; anexe um caminho especificado a um bean. Sendo assim, quando usado com <code>spring:bind</code> como mostrado acima, o caminho para o bean se torna: <code>name.value</code>. Como voc&ecirc; lembra, o nome do comando de <code>HelloController</code> &eacute; <code>name</code>. Portanto, esse caminho se refere &agrave; propriedade <code>value</code> de um bean chamado <code>name</code> no escopo da p&aacute;gina.
<li>Altere o ponto de entrada relativo do aplicativo. Atualmente, o ponto de entrada do projeto ainda &eacute; <code>index.htm</code> que, como descrito em <a href="#running">Executando o projeto de esqueleto</a> acima, redireciona para <code>WEB-INF/jsp/index.jsp</code>. Voc&ecirc; pode especificar um ponto de entrada para o projeto quando ele &eacute; implantado e executado. Na janela Projetos, clique com o bot&atilde;o direito do mouse no n&oacute; do projeto e escolha Propriedades. A caixa de di&aacute;logo Propriedades do projeto &eacute; exibida. Em Categorias, selecione Executar. No campo URL relativa, digite <code>/hello.htm</code>, em seguida, clique em OK.
<br><br>
Nesse momento, voc&ecirc; deve estar pensando onde o mapeamento de <code>hello.htm</code> para <code>HelloController</code> se encontra. Voc&ecirc; n&atilde;o adicionou um mapeamento para o bean <code>urlMapping</code>, como &eacute; o caso de <code>index.htm</code>, a p&aacute;gina de boas-vindas do projeto de esqueleto. Isso &eacute; poss&iacute;vel com um pouco da m&aacute;gica do Spring fornecida pela defini&ccedil;&atilde;o do bean seguinte em <code>dispatcher-servlet.xml</code>:
<pre class="examplecode">&lt;bean class=&quot;org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping&quot;/&gt;</pre>
Esse bean &eacute; respons&aacute;vel por criar automaticamente um mapeamento de URL para todos os controladores registrados no arquivo. Ele pega o nome de classe totalmente qualificado do controlador (em nosso caso, <code>controller.HelloController</code>) e retira o nome do pacote e o sufixo <code>Controller</code>, em seguida, usa o resultado como um mapeamento de URL. Portanto, para <code>HelloController</code>, ele cria um mapeamento <code>hello.htm</code>. Entretanto, essa m&aacute;gica n&atilde;o funciona para controladores que est&atilde;o inclu&iacute;dos no Spring Framework, tal como <code>ParameterizableViewController</code>. Eles requerem mapeamento expl&iacute;cito.</li>
<li>Na janela Projetos, clique com o bot&atilde;o direito do mouse no n&oacute; do projeto e escolha Executar. Isso compila, implanta e executa o projeto. Seu navegador padr&atilde;o se abre exibindo <code>hello.htm</code> como o <code>nameView</code> do projeto:
<br>
<img src="../../../images_www/articles/71/web/spring/name-view.png"
alt="nameView exibido em um navegador"
title="nameView &eacute; exibido em um navegador"
class="b-all margin-around">
<br>
Indique seu nome no campo de texto e clique Enter. O <code>helloView</code> &eacute; exibido com uma mensagem de sauda&ccedil;&atilde;o:
<br>
<img src="../../../images_www/articles/71/web/spring/hello-view.png"
alt="helloView exibido em um navegador"
title="helloView &eacute; exibido em um navegador"
class="b-all margin-around"></li>
</ol>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Introduction%20to%20Spring">Envie-nos seus coment&aacute;rios</a></div>
<br style="clear:both;">
<h2 id="seeAlso">Consulte tamb&eacute;m</h2>
<p>Isso inclui a Introdu&ccedil;&atilde;o ao Spring Framework no NetBeans IDE. Este documento demonstrou como construir um aplicativo da Web MVC simples no NetBeans IDE utilizando o Spring Framework e apresentou-lhe a interface do IDE para o desenvolvimento de aplicativos da Web.</p>
<p>Voc&ecirc; &eacute; encorajado a continuar a aprender sobre o Spring Framework trabalhando em outros tutoriais do NetBeans IDE, tal como <a href="http://sites.google.com/site/springmvcnetbeans/step-by-step/">Desenvolvendo um aplicativo Spring Framework MVC passo a passo utilizando o NetBeans e o GlassFish</a>. Esse &eacute; o <a href="http://static.springframework.org/docs/Spring-MVC-step-by-step/">tutorial oficial do Spring Framework</a> por Thomas Risberg que foi adaptado para NetBeans IDE por Arulazi Dhesiaseelan.</p>
<p>Muitos dos recursos de m&oacute;dulo do Spring NetBeans tamb&eacute;m podem ser aplicados a aplicativos Spring framework n&atilde;o baseados na Web.
<p>Para outros tutoriais relacionados, consulte os seguintes recursos:</p>
<ul>
<li><a href="../../docs/web/framework-adding-support.html">Adicionando suporte para um Web Framework</a> Um guia b&aacute;sico que descreve como adicionar suporte instalando um plug-in de framework da Web usando a Central de atualiza&ccedil;&otilde;es do NetBeans .</li>
<li><a href="../../docs/web/jsf20-intro.html">Introdu&ccedil;&atilde;o ao JavaServer Faces 2.0</a>. Demonstra como adicionar suporte do JSF 2.0 a um projeto existente, beans gerenciados por fios e como aproveitar os modelos de Facelets.</li>
</ul>
</body>
</html>