blob: e3f67d8fb26051bfe429b7f7488b988c2cef765e [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Introdução ao Spring Web MVC
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Introdução ao Spring Web MVC - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Introdução ao Spring Web MVC
Este documento mostra como construir uma aplicação Web link:http://www.oracle.com/technetwork/articles/javase/index-142890.html[+MVC+] simples usando o link:http://www.springframework.org/[+Spring Framework+]. A aplicação permite que um usuário indique seu nome em um campo de texto e, ao clicar em OK, o nome seja retornado e exibido em uma segunda página com uma saudação de boas-vindas.
O Spring Framework é um framework de aplicação de código-fonte aberto popular que pode facilitar o desenvolvimento do Java EE. Ele consiste em um contêiner, um framework para gerenciar componentes, e um conjunto de serviços de snap-in para interfaces de usuário, transações e persistência da Web. Uma parte do Spring Framework é o Spring Web MVC, um framework MVC extensível para criação de aplicações Web.
O IDE oferece suporte incorporado para Spring Framework 4.x e 3.x. As bibliotecas de framework são fornecidas com o IDE e adicionadas automaticamente ao classpath do projeto quando o framework é selecionado. As definições de configuração são fornecidas, tais como nomeação e mapeamento do `DispatcherServlet` do Spring Web MVC. A biblioteca JSTL pode, como opção, ser registrada na criação do projeto. O suporte para arquivos de configuração de bean Spring XML também é fornecido, incluindo a seguinte funcionalidade:
* *Autocompletar código*. Chamada nos arquivos de configuração Spring XML para classes Java assim como referências de bean.
* *Navegação*. Hiperlink de classes e propriedades Java mencionadas nas definições de bean Spring, bem como hiperlink para outras referências de bean Spring.
* *Refatoração*. Renomeação de referências a classes Java nos arquivos de configuração Spring XML.
Para obter mais informações sobre o Spring Framework, visite link:http://www.springsource.org/[+http://www.springsource.org/+]. Para obter uma explicação detalhada de como os artefatos do Spring Framework se comportam e interagem com outros objetos em uma aplicação, consulte a link:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/[+Documentação de Referência do Spring Framework+] oficial ou consulte a link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/[+Documentação da API do Spring Framework+].
image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]
*Para concluir este tutorial, você precisa dos seguintes recursos e softwares.*
|===
|Software ou Recurso |Versão Necessária
|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Java EE 7.2, 7.3, 7.4, 8.0
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8
|link:http://glassfish.dev.java.net/public/downloadsindex.html[+GlassFish Server+] |3.x, 4.x
|===
*Observações:*
* A instalação Java do IDE permite, como opção, baixar e registrar o GlassFish Server com o IDE.
* Se você precisar comparar seu projeto com uma solução que funciona, link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FHelloSpring69.zip[+faça download da aplicação de amostra+].
[[setting]]
== Configurando um Novo Projeto com Suporte a Spring Web MVC
* <<creating,Criando um projeto de Esqueleto do Spring Web MVC>>
* <<running,Executando o Projeto de Esqueleto>>
[[creating]]
=== Criando um Projeto de Esqueleto do Spring Web MVC
Comece criando um novo projeto para uma aplicação Web usando o Spring Framework.
1. Selecione 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 Aplicação Web. Clique em Próximo.
2. Em Nome do Projeto, digite *HelloSpring*. Clique em Próximo.
3. Na Etapa 3: Servidor e Definições, desmarque a opção Ativar Injeção de Dependência e Contextos, já que você não está trabalhando com a especificação link:http://jcp.org/en/jsr/detail?id=299[+JSR-299+] neste tutorial.
4. Confirme se o GlassFish server está selecionado na lista drop-down Servidor. Clique em Próximo.
A versão do Java EE depende da versão do servidor que está selecionada. A versão default do Java EE é Java EE 7 Web quando o servidor selecionado for GlassFish Server 4.0
. Na Etapa 4, no painel Frameworks, selecione Spring Web MVC.
. Selecione *Spring Framework 3.x* na lista drop-down Biblioteca de Springs.
image::images/frameworks-window.png[title="Spring Web MVC exibido no painel Frameworks"]
Observe que o IDE permite adicionar a biblioteca do Spring 4.x ao projeto, mas neste tutorial você usará SimpleFormController, que não é suportado no Spring 4.x. Além disso, quando você selecionar Spring Web MVC, lembre-se de que a biblioteca JSTL (JavaServer Pages Standard Tag Library) é adicionada ao classpath durante a criação do projeto por padrão. Desmarque essa opção (conforme indicado na captura de tela acima), já que o JSTL não é necessário para este tutorial.
. Clique na guia Configuração e observe que o assistente permite especificar o nome e o mapeamento do servlet Spring Dispatcher.
image::images/spring-configuration.png[title="Especifique o nome e o mapeamento do servlet Spring Dispatcher na guia Configuração"]
. Clique em Finalizar. O IDE cria um projeto para a aplicação inteiro, incluindo todos os metadados, assim como o script de construção Ant do projeto que você pode inspecionar na janela Arquivos (Ctrl-2; &amp;#8984-2 no Mac). Você pode exibir a estrutura do modelo na janela Projetos (Ctrl-1; &amp;#8984-1 no Mac). Observe também que quatro arquivos são abertos por default no editor do IDE: `dispatcher-servlet.xml`, `applicationContext.xml`, `redirect.jsp` e `index.jsp`.
. Na janela Projetos, expanda o novo nó Bibliotecas do projeto e observe que JARs do Spring estão incluídos no classpath do projeto.
image::images/spring-libraries.png[title="Os JARs Spring são listados no nó das Bibliotecas do projeto"]
[[running]]
=== Executando o Projeto de Esqueleto
Antes de fazer quaisquer alterações nos arquivos do projeto, tente executar o novo projeto no IDE:
1. Clique em Executar Projeto (image:images/run-project-btn.png[]) na barra de ferramentas principal do IDE. O IDE inicia automaticamente o GlassFish Server se ele ainda não estiver sendo executado, compila o projeto e o implanta no servidor. Observe as saída exibida na janela de Saída do IDE (Ctrl-4; &amp;#8984-4 no Mac). A saída gerada termina com a mensagem `BUILD SUCCESSFUL.`
image::images/output.png[title="A janela de Saída exibe informações ao executar o projeto"]
O browser default do IDE é iniciado e você vê o conteúdo da view da página de boas-vindas (`/WEB-INF/jsp/index.jsp`).
image::images/browser-output.png[title="A saída de página de boas-vindas é exibida no browser"]
Quando você executa o projeto no IDE, o projeto é compilado e implantado no servidor e, em seguida, aberto no browser default. Além disso, o IDE fornece uma funcionalidade Implantar ao Salvar, que é ativado por default em projetos Web. Quando você salva arquivos no editor, o projeto é automaticamente recompilado e implantado no servidor. Para exibir alterações, você pode, simplesmente, atualizar as páginas no browser.
Para entender o que acabou de acontecer, comece examinando o descritor de implantação do projeto (`web.xml`). Para abrir esse arquivo no Editor de Código-Fonte, clique com o botão direito do mouse no nó `WEB-INF` > `web.xml` na janela Projetos e selecione Editar. O ponto de entrada default da aplicação é `redirect.jsp`:
[source,xml]
----
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
----
Em `redirect.jsp`, existe uma instrução de redirecionamento que aponta todas as solicitações para `index.htm`:
[source,java]
----
<% response.sendRedirect("index.htm"); %>
----
No descritor de implantação, observe que todas as solicitações de padrões de URL que correspondem a `*.htm` são mapeadas para link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html[+`DispatcherServlet`+] do Spring.
[source,xml]
----
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
----
O nome totalmente qualificado do servlet dispatcher, conforme mostrado acima, é `org.springframework.web.servlet.DispatcherServlet`. Essa classe está contida na biblioteca do Spring, que foi adicionada ao classpath do projeto quando o projeto foi criado. Você pode verificar isso na janela Projetos, fazendo uma busca detalhada no nó Bibliotecas. Localize o arquivo `spring-webmvc-3.1.1.RELEASE.jar` e, em seguida, expanda para encontrar `org.springframework.web.servlet` > `DispatcherServlet`.
A classe `DispatcherServlet` manipula as solicitações de entrada com base nas definições de configuração encontradas em `dispatcher-servlet.xml`. Abra `dispatcher-servlet.xml`, clicando em sua guia no editor. Observe o código a seguir:
[source,xml]
----
<bean id="urlMapping" class="org.springframework.web.servlet.handler.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.html[+SimpleUrlHandlerMapping+]">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/InternalResourceViewResolver.html[+InternalResourceViewResolver+]"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html[+ParameterizableViewController+]"
p:viewName="index" />
----
Três beans são definidos nesse arquivo: `indexController`, `viewResolver` e `urlMapping`. Quando a `DispatcherServlet` recebe uma solicitação que coincide com `*.htm` tal como `index.htm`, ela procura um controle no `urlMapping` que possa acomodar a solicitação. Acima, você vê que existe uma propriedade `mappings` que vincula `/index.htm` a `indexController`.
O ambiente de runtime procura a definição de um bean chamado `indexController`, que é convenientemente fornecido pelo projeto de esqueleto. Observe que `indexController` estende link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html[+`ParameterizableViewController`+]. Essa é uma outra classe fornecida pelo Spring, que simplesmente retorna uma view. Acima, observe que `p:viewName="index"` especifica o nome da view lógica, que é resolvida por meio de `viewResolver` acrescentado-se o prefixo `/WEB-INF/jsp/` e o sufixo `.jsp`. Isso permite que o runtime localize o arquivo no diretório da aplicação e responda com a view da página de boas-vindas (`/WEB-INF/jsp/index.jsp`).
[[overview]]
== Visão Geral da Aplicação
A aplicação criada é composta de duas páginas JSP (que se chamam _views_ na terminologia link:http://www.oracle.com/technetwork/articles/javase/index-142890.html[+MVC+]). A primeira view contém um form HTML com um campo de entrada solicitando o nome do usuário. A segunda view é uma página que exibe simplesmente uma mensagem hello contendo o nome do usuário.
As views são gerenciadas por um _controlador_, que recebe as solicitações para a aplicação e decide quais views retornar. Ele também passa para as views as informações que precisam exibir (isso é chamado de _modelo_). Esse controlador de aplicação é chamado de `HelloController`.
Em uma aplicação complexa da Web, a lógica de negócios não está contida diretamente no controlador. Em vez disso, outra entidade, denominada _serviço_, é utilizada pelo controlador sempre que ele precisar realizar a lógica de negócios. Em nossa aplicação, a lógica de negócios limita-se ao processamento da mensagem hello, sendo assim, para essa finalidade, você cria um `HelloService`.
== Implementando um Serviço
Agora que você tem certeza de que seu ambiente está configurado corretamente, você pode começar a estender o projeto de esqueleto de acordo com as suas necessidades. Comece criando a classe `HelloService`.
1. Clique no botão Novo Arquivo (image:images/new-file-btn.png[]) na barra de ferramentas do IDE. (Como alternativa, pressione Ctrl-N; ⌘-N no Mac.)
2. Selecione a categoria *Java*, *Classe Java* e clique em Próximo.
3. No assistente de Nova Classe Java exibido, digite *HelloService* no Nome da Classe e *service* no Nome do Pacote para criar um novo pacote para a classe.
4. Clique em Finalizar. O IDE cria a nova classe e a abre no editor.
A classe `HelloService` realiza um serviço muito simples. Ela pega um nome como parâmetro, prepara e retorna uma `String` que inclui o nome. No editor, crie o seguinte método `sayHello()` para a classe (alterações em *negrito*).
[source,java]
----
public class HelloService {
*public static String sayHello(String name) {
return "Hello " + name + "!";
}*
}
----
[[controller]]
== Implementando o Controlador e o Modelo
Você pode usar um link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html[+`SimpleFormController`+] para manipular dados do usuário e determinar qual view retornar.
*Observação: *SimpleFormController é obsoleto no Spring 3.x. Ele é utilizado neste tutorial para fins de demonstração. Entretanto, os controladores anotados devem ser utilizados em vez dos arquivos XML.
1. Abra o assistente de Novo Arquivo pressionando Ctrl-N (⌘-N no Mac). Em Categorias, selecione *Spring Framework* em Tipos de Arquivos e *Controlador de Form Simplificado*.
image::images/simple-form-controller.png[title="O NetBeans IDE fornece modelos para diversos artefatos do Spring"]
[tips]#O NetBeans IDE fornece modelos para vários artefatos do Spring, incluindo o Arquivo de Configuração do Spring XML, o link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html[+`AbstractController`+] e o link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html[+`SimpleFormController`+].#
. Clique em Próximo.
. Chame a classe de *HelloController* e crie um novo pacote para ela, digitando *controller* no campo de texto Pacote. Clique em Finalizar. O IDE cria a nova classe e a abre no editor.
. Especifique as propriedades do controlador, removendo o comentário dos métodos setter exibidos por default no modelo da classe. Para remover os comentários do snippet de código, realce o código como na imagem a seguir e pressione Ctrl-/ (&amp;#8984-/ no Mac).
image::images/comment-out.png[title="Realce os snippets do código e, em seguida, pressione Ctrl-/ para alternar entre os comentários"]
[tips]#Pressionar Ctrl-/ (&amp;#8984-/ no Mac) alterna entre os comentários no editor.#
. Faças as alterações a seguir (alterações em *negrito*).
[source,java]
----
public HelloController() {
link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandClass(java.lang.Class)[+setCommandClass+](*Name*.class);
link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandName(java.lang.String)[+setCommandName+]("*name*");
link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setSuccessView(java.lang.String)[+setSuccessView+]("*hello*View");
link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)[+setFormView+]("*name*View");
}
----
A definição de `FormView` permite definir o nome da view utilizada para exibir o form. Essa é a página que contém o campo de texto que permite que os usuários digitem seus nomes. A configuração de `SuccessView`, da mesma forma, permite que você defina o nome da view que deve ser exibida durante um envio bem-sucedido. Quando você configura `CommandName`, você define o nome do comando no modelo. Nesse caso, o comando é o objeto do form com os parâmetros de solicitação vinculados a ele. A configuração de `CommandClass` permite que você defina o nome da classe do comando. Uma instância dessa classe é preenchida e validada em cada solicitação.
Observe que um erro é sinalizado para `Name` no método `setCommandClass()`:
image::images/set-command-class.png[title="Um indicador de erro é exibido para setCommandClass()"]
Você precisa criar a classe `Name` como um bean simples para manter as informações de cada solicitação.
. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e selecione Nova > Classe Java. O assistente de Nova Classe Java é exibido.
. Digite *Name* para o Nome da Classe, e, para Pacote, selecione *controller* na lista drop-down.
. Clique em Finalizar. A classe `Name` é criada e aberta no editor.
. Para a classe `Name`, crie um campo denominado `value` e, em seguida, crie os métodos acessadores (por exemplo, os métodos getter e setter) para esse campo. Inicie declarando o campo `value`:
[source,java]
----
public class Name {
*private String value;*
}
----
Para digitar "`private`" rapidamente, você pode digitar "`pr`" e pressionar Tab. O modificador de acesso "`private`" é automaticamente adicionado à linha. Esse é um exemplo de como utilizar os modelos de código do editor. Para obter uma lista completa de modelos de código, selecione Ajuda > Cartão de Atalhos do Teclado.
O IDE pode criar métodos do assessor para você. No editor, clique com o botão direito do mouse em `valor` e selecione Inserir Código (ou pressione Alt-Insert; Ctrl-I no Mac). No menu pop-up, escolha Getter e Setter.
image::images/generate-code.png[title="O menu pop-up Gerar Código permite definir métodos acessadores"]
. Na caixa de diálogo exibida, selecione a opção `value : String`e clique em OK. Os métodos `getValue()` e `setValue()` são adicionados à classe `Name`:
[source,java]
----
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
----
. Pressione Ctrl-Tab e selecione `HelloController` para retornar à classe `HelloController`. Observe que o indicador de erro anterior desapareceu, mas a classe `Name` existe agora.
. Delete o método `doSubmitAction()` e remova os comentários do método link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)[+`onSubmit()`+]. O método `onSubmit()` permite que você crie seu próprio `ModelAndView`, que é o necessário aqui. Faça as seguintes alterações:
[source,java]
----
@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("helloMessage", helloService.sayHello(name.getValue()));
return mv;
}
----
Conforme indicado acima, o `command` é reconvertido como um objeto `Name`. Uma instância de `ModelAndView` é criada, e a view de sucesso é obtida por meio de um getter em `SimpleFormController`. Finalmente, o modelo é preenchido com os dados. O único item em nosso modelo é a mensagem hello obtida do `HelloService` criado anteriormente. Use o método `addObject()` para adicionar a mensagem hello ao modelo sob o nome `helloMessage`.
. Corrija os erros de importação clicando com o botão direito do mouse no editor e selecionando Corrigir importações (Ctrl-Shift-I; ⌘-Shift-I no Mac).
image::images/fix-imports70.png[title="Pressione Ctrl-Shift-I para corrigir as importações no seu arquivo"]
*Observação.* Certifique-se de que as opções * ``org.springframework.validation.BindException`` * e * ``org.springframework.web.servlet.ModelAndView`` * estejam selecionadas na caixa de diálogo Corrigir Todas as Importações.
. Clique em OK. A instrução de importação a seguir será adicionada ao início do arquivo:
[source,java]
----
import link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/ModelAndView.html[+org.springframework.web.servlet.ModelAndView+];
----
Conforme informado na documentação da API, essa classe "representa um modelo e uma view retornados por um handler, a serem resolvidos por um `DispatcherServlet`. A view pode tomar a forma de um nome de view de `String`, que precisará ser resolvido por um objeto `ViewResolver`, como alternativa, um objeto `View` poderá ser especificado diretamente. O modelo é um `Map`, que permite o uso de vários objetos, classificados por nome".
Observe que nesse estágio, nem todos os erros são corrigidos, pois a classe ainda não pode identificar a classe `HelloService` e não utiliza seu método `sayHello()`.
. No `HelloController`, declare um campo privado chamado `HelloService`:
[source,java]
----
private HelloService helloService;
----
Em seguida, crie um método setter público para o campo:
[source,java]
----
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
----
Finalmente, clique com o botão direito do mouse no editor e selecione Corrigir Importações (Ctrl-Shift-I; ⌘-Shift-I no Mac). A instrução a seguir será adicionada ao início do arquivo:
[source,java]
----
import service.HelloService;
----
Todos os erros deverão ser corrigidos agora.
. Registre `HelloService` em `applicationContext.xml`. Abra `applicationContext.xml` no editor e insira a seguinte declaração de bean:
[source,java]
----
<bean name="helloService" class="service.HelloService" />
----
O suporte a Spring no IDE inclui a funcionalidade autocompletar código nos arquivos de configuração XML para classes Java, bem como nas referências de bean. Para chamar a funcionalidade autocompletar código, pressione Ctrl-Espaço ao trabalhar no editor:
image::images/code-completion.png[title="Funcionalidade autocompletar código chamada ao pressionar Ctrl-Espaço"]
. Registre `HelloController` em `dispatcher-servlet.xml`. Abra `dispatcher-servlet.xml` no editor e insira a seguinte declaração de bean:
[source,java]
----
<bean class="controller.HelloController" p:helloService-ref="helloService"/>
----
[[view]]
== Implementando as Views
Para implementar a view desse projeto, você precisa criar duas páginas JSP. A primeira, que você pode chamar de `nameView.jsp`, serve como a página de boas-vindas e permite que os usuários insiram um nome. A outra página, `helloView.jsp`, exibe uma mensagem de saudação que inclui o nome de entrada. Comece criando `helloView.jsp`.
1. Na janela Projetos, clique com o botão direito do mouse no nó WEB-INF > `jsp ` e selecione Nova > JSP. O assistente de Novo Arquivo JSF será aberto. Chame o arquivo de *helloView*.
2. Clique em Finalizar. A nova página JSP será criada na pasta `jsp` e aberta no editor.
3. No editor, altere o título do arquivo para `Hello` e altere a mensagem de saída para recuperar a `helloMessage` do objeto `ModelandView` criado em `HelloController`.
[source,xml]
----
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>*Hello*</title>
</head>
<body>
<h1>*${helloMessage}*</h1>
</body>
----
. Crie outra página JSP da mesma maneira <<create-jsp,conforme acima>>, mas nomeie-a como `nameView`.
. No editor, adicione a declaração da biblioteca de tags do Spring a seguir a `nameView.JSP`.
[source,java]
----
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
----
Isso importa a link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html[+biblioteca de tags do Spring+], que contém tags úteis para a implementação de views como páginas JSP.
. Altere o conteúdo das tags `<title>` e `<h1>` para que se leia: `Enter Your Name`.
. Insira o código a seguir abaixo das tags `<h1>`:
[source,xml]
----
<spring:nestedPath path="name">
<form action="" method="post">
Name:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>
----
link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.bind[+spring:bind+] permite que você vincule uma propriedade de bean. A tag de vinculação fornece um status de e valor de vinculação, que você utiliza como o nome e o valor do campo de entrada. Dessa forma, quando o form for enviado, o Spring saberá como extrair o valor enviado. Aqui, nossa classe de comando (`controller.Name`) possui uma propriedade `value`, portanto, a definição de `path` como `value`.
link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.nestedPath[+spring:nestedPath+] permite que você anexe um caminho especificado a um bean. Sendo assim, quando usado com `spring:bind` conforme mostrado acima, o caminho para o bean se torna: `name.value`. Como você deve lembrar, o nome do comando de `HelloController` é `name`. Portanto, esse caminho se refere à propriedade `value` de um bean chamado `name` no escopo da página.
. Altere o ponto de entrada relativo da aplicação. Atualmente, o ponto de entrada do projeto ainda é `index.htm` que, conforme descrito em <<running,Executando o Projeto de Esqueleto>> acima, redireciona para `WEB-INF/jsp/index.jsp`. Você pode especificar um ponto de entrada para o projeto quando ele é implantado e executado. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e selecione Propriedades. A caixa de diálogo Propriedades do Projeto será exibida. Em Categorias, selecione Executar. No campo URL Relativo, digite `/hello.htm`, em seguida, clique em OK.
Nesse momento, você deve estar pensando onde o mapeamento de `hello.htm` para `HelloController` se encontra. Você não adicionou um mapeamento para o bean `urlMapping`, como é o caso de `index.htm`, a página de boas-vindas do projeto de esqueleto. Isso é possível com um pouco da mágica do Spring fornecida a seguir pela definição do bean em `dispatcher-servlet.xml`:
[source,java]
----
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
----
Esse bean é responsá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, `controller.HelloController`) e retira o nome do pacote e o sufixo `Controller`, em seguida, usa o resultado como um mapeamento de URL. Portanto, para `HelloController`, ele cria um mapeamento `hello.htm`. Entretanto, essa mágica não funciona para controladores que estão incluídos no Spring Framework, como o `ParameterizableViewController`. Eles requerem mapeamento explícito.
. Na janela Projetos, clique com o botão direito do mouse no nó do projeto e selecione Executar. Isso compilará, implantará e executará o projeto. Seu browser default abrirá, exibindo `hello.htm` como o `nameView` do projeto:
image::images/name-view.png[title="A nameView é exibida em um browser"]
Informe seu nome no campo de texto e clique Enter. O `helloView` é exibido com uma mensagem de saudação:
image::images/hello-view.png[title="A helloView é exibida em um browser"]
link:/about/contact_form.html?to=3&subject=Feedback:%20Introduction%20to%20Spring[+Envie-nos Seu Feedback+]
[[seeAlso]]
== Consulte Também
Isso inclui a Introdução ao Spring Framework no NetBeans IDE. Este documento demonstrou como construir uma aplicação Web MVC simples no NetBeans IDE utilizando o Spring Framework e apresentou a você a interface do IDE para o desenvolvimento de aplicações Web.
Recomendamos que você continue aprendendo sobre o Spring Framework trabalhando em outros tutoriais do NetBeans IDE, como link:http://sites.google.com/site/springmvcnetbeans/step-by-step/[+Desenvolvendo uma aplicação Spring Framework MVC passo a passo utilizando o NetBeans e o GlassFish Server+]. Esse é o link:http://static.springframework.org/docs/Spring-MVC-step-by-step/[+tutorial oficial do Spring Framework+] de Thomas Risberg que foi adaptado para o NetBeans IDE por Arulazi Dhesiaseelan.
Muitos dos recursos de Módulo do Spring NetBeans também podem ser aplicados a aplicações Spring Framework não baseados na Web.
Para outros tutoriais relacionados, consulte os seguintes recursos:
* link:../../docs/web/framework-adding-support.html[+Adicionando Suporte a um Framework da Web+] Um guia básico que descreve como adicionar suporte instalando um plug-in de framework da Web usando a Central de Atualização do NetBeans.
* link:jsf20-intro.html[+Introdução ao JavaServer Faces 2.0+]. Demonstra como adicionar suporte do JSF 2.0 a um projeto existente, beans gerenciados por fios e como aproveitar os modelos de Facelets.