Baixe o app para aproveitar ainda mais
Prévia do material em texto
78 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV Unidade IV Esta unidade pretende apresentar conceitos de aplicações web utilizando particionamento de código, bem como apresentação de estilo de trabalho em camadas. 7 Uso de roteamento de solUções mVC MVC (Model→View→Controller) pode ser considerado um pattern de arquitetura para o desenvolvimento de aplicações web. Ele pode estabelecer a segregação de três camadas: Model, View e Controller – sendo que pode considerar que a camada Model corresponde a dados e regras determinadas para a manipulação de todos os itens. Todas as estruturas são manipuladas inicialmente por Controllers, servindo, assim, como base para a implementação e apresentação de dados pela camada View. lembrete O estudo de diagramação UML, bem como diagrama de sequência, agregam no entendimento do conceito de aplicação MVC, pois são recursos que se complementam na análise e desenvolvimento de aplicações em camadas web. A camada Controller tem for finalidade tratar todas as requisições, sendo, assim, efetuada por meio de métodos declarados na mesma classe Controller. E, por fim, a camada View tem objetiva centralizar todas as ações e apresenta‑las dentro da página .aspx. saiba mais Recomendamos ao aluno a leitura do artigo a seguir: GROFFE, R. J. ASP.NET MVC: Desenvolvendo soluções para web. DevMedia, Rio de Janeiro, [s.d.]. Disponível em: <http://www. devmedia.com.br/asp‑net‑mvc‑desenvolvendo‑solucoes‑para‑web‑ revista‑net‑magazine‑91/22878>. Acesso em: 12 jul. 2015. A arquitetura de três camadas também pode ser estudada como uma solicitação enviada ao servidor na qual a interface com o cliente efetua processos de regras de negócio a fim de armazenar dados que são desenvolvidos e armazenados de maneira independente, ou até mesmo em plataformas separadas. 79 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet Camada de Apresentação ASP.NET Web Forms ASP.NET Web Users Controls ASP.NET Master Pages Camada de Negócio Classes C# VB .NET Camada de Acesso de Dados Stored Procedures Banco de Dados SQL Server Figura 82 – Fluxo de trabalho em camadas Pode‑se entender todo o fluxo da seguinte maneira: • A camada de apresentação apresenta elementos da interface do cliente do site e encapsula toda a estrutura lógica que inclui desde interação até integração de cliente e regras de negócio. • A camada de controle, também conhecida como camada de negócio, retorna ao cliente o resultado de toda a regra de negócio encapsulada na classe (C#). • A camada de acesso a dados detém todos os métodos e conexões inseridas, que retornam para a camada de negócio toda a execução efetuada em banco de dados, feita em classe (C#). observação Para o desenvolvimento de todas as classes (sejam de controle ou de acesso a dados ou modelo), recomendamos a utilização de classes C#. 80 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV Figura 83 – Exemplo de aplicação MVC Figura 84 – Identificação de projeto MVC no Visual Studio .NET Figura 85 – Escolha de Template dentro do Visual Studio 81 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet Após a seleção do Template, será criado o projeto utilizando a arquitetura ASP.NET MVC. Atualmente, mais de 80% dos projetos são desenvolvidos utilizando a arquitetura MVC, visto a segregação de código e principalmente o paralelismo que é feito com a parte de análise do projeto. O conceito de MVC vem de encontro com alguns diagramas da UML (tais como o Diagrama de Caso de Uso, Sequência e Classe) que são de extrema importância para o desenvolvimento de qualquer aplicação nos dias atuais. observação O autor recomenda o estudo de diagramas UML, tais como o diagrama de caso de uso e o diagrama de sequência, classe e atividade, que serão a base de todo o desenvolvimento web efetuado nesse livro‑texto. 7.1 razor O Razor agrega uma série de características importantes, que possibilitam, por intermédio de um objetivo natural, a construção de páginas com a estrutura de ASP. NET MVC, porém essa ideia nasceu a partir da versão 3. Uma das características importantes construídas no Razor é que ele foi desenvolvido para ser expressivo, compacto e ágil: a ideia foi construir um mecanismo capaz de reduzir ao máximo o número de caracteres necessários para a codificação de uma página aspx. View Engine Default O View Engine Default do ASP. NET (aspx), é conhecido por possuir uma sintaxe muito próxima com a do HTML, com abertura e fechamento de tags em páginas aspx. No Razor não conseguimos identificar esse item, reduzindo, portanto a quantidade de texto necessário para a codificação de itens contidos em controle, ou “parte” da página aspx. Tratando exclusivamente da redução significativa de caracteres, do ponto de vista do programador da página aspx, todo o processo passa a ficar muito mais eficaz, o que significa que se perde menos tempo na codificação das páginas aspx. Ao contrário da maioria dos View Engines, com o Razor não é necessário ficar desenvolvendo abertura e fechamento dos blocos de código. O parser do Razor é inteligente e capaz de separar o que é código HTML do código C# ou VB.NET, por exemplo. Todo esse universo garante um código eficaz e limpo, facilitando não só a sua escrita inicial, mas também deixando de fácil a manutenção posterior nessas páginas aspx. 82 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV Outra característica muito importante do Razor é a sua facilidade de aprendizagem. Como ele podemos considerar como um dos pontos a sua composição de HTML e C# (ou vb.net), qualquer programador .NET com conhecimento básico em HTML, conseguirá com grande facilidade capturar a estrutura do Razor, e em pouco tempo estará com conhecimento a escrever páginas aspx com o novo Template. Provavelmente outro ponto importante do Razor é o fato de ele não ser uma “nova linguagem”, ou seja, ao contrário de todos os View Engines existentes, o Razor faz utilização de sua própria linguagem C#/VB, o que torna sua aderência ainda mais efetiva e eficaz. Considerando também que o Razor não depende exclusivamente de nenhuma ferramenta para ser escrito, ou seja, não dependeria também do Visual Studio. É possível desenvolver páginas com Razor em qualquer editor de texto, até mesmo no Notepad, caso seja necessário utilizar essa ferramenta para tal desenvolvimento. Levando‑se em consideração também que ao escolher utilizar o Razor no Visual Studio o programador consegue ganhar todos os recursos de intelissense e statement completion (recurso que “completa” palavras do código que podem ser automaticamente identificadas). Pensando claro que com esses recursos o processo de desenvolvimento de páginas se torna ainda mais rápido e eficiente. Outro ponto interessante do Razor, é que ele é totalmente amigável para efetuar testes, trabalhando se com testes unitários. Com o Razor é possível criar testes unitários para verificação das Views da aplicação web, sem que haja necessidade de conhecer o Controller que renderiza a View e vice‑versa. Sendo assim, para atender a todas essas necessidades que a equipe do ASP.NET inseriu o Razor no ASP.NET MVC 3. E mesmo assim, ele passa a ser apenas mais uma escolha que é necessária fazer ao criar as Views de uma aplicação Web. A View Engine default do ASP.NET sempre estará funcionando e sendo uma grande opção. Adaptado de: Sendin ([s.d.]b). 83 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet 8 desenVolVimento de apliCações mVC As imagens apresentadas a seguir sãoconcebidas por meio de desenvolvimento MVC. Figura 86 – Página default construída com Template MVC Figura 87 – Classe Model 84 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace PrimeiraAPP_MVC4.Models { public class UsuarioModel { [DisplayName(“Primeiro Nome”)] [StringLength(50, ErrorMessage = “O campo Nome permite no máximo 50 caracteres!”)] public string nome { get; set; } [Required] public string sobrenome { get; set; } public string endereco { get; set; } [StringLength (50)] [Required(ErrorMessage=”Informe o Email”)] [RegularExpression(@”\w+([‑+.’]\w+)*@\w+([‑.]\w+)*\.\w+([‑.]\ w+)*”, ErrorMessage = “Email inválido.”)] public string email { get; set; } [DataType(DataType.Date)] public DateTime nascimento { get; set; } } } Figura 88 – Classe Model Usuário using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace PrimeiraAPP_MVC4.Models { public class Usuarios { public List<UsuarioModel> listaUsuarios = new List<UsuarioModel>(); public Usuarios() { listaUsuarios.Add(new UsuarioModel { nome = “Prof. Salatiel”, sobrenome = “Marinho”, endereco = “Rua Máximo Morante, 110”, email = “profsalatielmarinh@gmail.com”, nascimento = Convert.ToDateTime(“29/10/1982”) }); listaUsuarios.Add(new UsuarioModel { nome = “Andre Ricardo”, sobrenome = “Marinho”, endereco = “Rua Engenheiro Garcia, 50”, 85 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet email = “andrerick@gmail.com”, nascimento = Convert.ToDateTime(“15/10/1932”) }); listaUsuarios.Add(new UsuarioModel { nome = “Jonas Lima”, sobrenome = “Marques”, endereco = “Rua Bartolomeu Cândia, 10”, email = “jonaslimamarques@gmaill.com”, nascimento = Convert.ToDateTime(“12/12/1987”) }); } public void CriaUsuario(UsuarioModel usuarioModelo) { listaUsuarios.Add(usuarioModelo); } public void AtualizaUsuario(UsuarioModel usuarioModelo) { foreach (UsuarioModel usuario in listaUsuarios) { if (usuario.email == usuarioModelo.email) { listaUsuarios.Remove(usuario); listaUsuarios.Add(usuarioModelo); break; } } } public UsuarioModel GetUsuario(string Email) { UsuarioModel _usuarioModel = null; foreach (UsuarioModel _usuario in listaUsuarios) if (_usuario.email == Email) _usuarioModel = _usuario; return _usuarioModel; } public void DeletarUsuario(String Email) { foreach (UsuarioModel _usuario in listaUsuarios) { if (_usuario.email == Email) { listaUsuarios.Remove(_usuario); break; } } } } } Figura 89 – Implementação de Classes de persistência 86 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System.Web.Mvc; using PrimeiraAPP_MVC4.Models; namespace PrimeiraAPP_MVC4.Controllers { public class UsuarioController : Controller { // // GET: /Usuario/ private static Usuarios _usuarios = new Usuarios(); public ActionResult Index() { return View( _usuarios.listaUsuarios); } public ActionResult AdicionaUsuario() { return View(); } [HttpPost] public ActionResult AdicionaUsuario(UsuarioModel _ usuarioModel) { _usuarios.CriaUsuario(_usuarioModel); return View(); } public ViewResult DeletaUsuario(string id) { return View(_usuarios.GetUsuario(id)); } [HttpPost] public RedirectToRouteResult DeletaUsuario(string id, FormCollection collection) { _usuarios.DeletarUsuario(id); return RedirectToAction(“Index”); } } } Figura 90 – Implementação da Classe Controller 87 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet @model IEnumerable<PrimeiraAPP_MVC4.Models.UsuarioModel> @{ ViewBag.Title = “Index”; } <h2>Index</h2> <p> @Html.ActionLink(“Criar Usuário”, “AdicionaUsuario”) </p> <table> <tr> <th>@Html.DisplayNameFor(model => model.nome)</th> <th>@Html.DisplayNameFor(model => model.sobrenome)</th> <th>@Html.DisplayNameFor(model => model.endereco)</th> <th>@Html.DisplayNameFor(model => model.email)</th> <th>@Html.DisplayNameFor(model => model.nascimento)</th> <th></th> </tr> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(modelItem => item.nome)</td> <td>@Html.DisplayFor(modelItem => item.sobrenome)</td> <td>@Html.DisplayFor(modelItem => item.endereco)</td> <td>@Html.DisplayFor(modelItem => item.email)</td> <td>@Html.DisplayFor(modelItem => item.nascimento)</td> <td> @Html.ActionLink(“Edit”, “Edit”, new { /* id=item. PrimaryKey */ }) | @Html.ActionLink(“Details”, “Details”, new { /* id=item. PrimaryKey */ }) | @Html.ActionLink(“Deletar”, “DeletaUsuario”, new { id=item.email }) </td> </tr> } </table> Figura 91 – Implementação do código na página aspx @model PrimeiraAPP_MVC4.Models.UsuarioModel @{ ViewBag.Title = “AdicionaUsuario”; } <h2>AdicionaUsuario</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>UsuarioModel</legend> <div class=”editor‑label”>@Html.LabelFor(model => model. nome)</div> <div class=”editor‑field”>@Html.EditorFor(model => model.nome) @Html.ValidationMessageFor(model => model.nome) 88 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV </div> <div class=”editor‑label”>@Html.LabelFor(model => model. sobrenome)</div> <div class=”editor‑field”> @Html.EditorFor(model => model.sobrenome) @Html.ValidationMessageFor(model => model.sobrenome) </div> <div class=”editor‑label”>@Html.LabelFor(model => model. endereco)</div> <div class=”editor‑field”> @Html.EditorFor(model => model.endereco) @Html.ValidationMessageFor(model => model.endereco) </div> <div class=”editor‑label”>@Html.LabelFor(model => model. email)</div> <div class=”editor‑field”> @Html.EditorFor(model => model.email) @Html.ValidationMessageFor(model => model.email) </div> <div class=”editor‑label”>@Html.LabelFor(model => model. nascimento)</div> <div class=”editor‑field”> @Html.EditorFor(model => model.nascimento) @Html.ValidationMessageFor(model => model.nascimento) </div> <p><input type=”submit” value=”Create” /> </p> </fieldset> } <div> @Html.ActionLink(“Back to List”, “Index”) </div> @section Scripts { @Scripts.Render(“~/bundles/jqueryval”) } Figura 92 – Implementação do código na página aspx saiba mais Com o passar do tempo, muitos desenvolvedores migram aplicações WebForm para aplicação em camadas (MVC), um conceito que a cada dia ganha mais força pelo desenvolvimento, distribuição e manutenção do código. Para conhecer um pouco mais sobre MVC, leia: 89 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet SENDIN, R. ASP.NET: WebForms X MVC. DevMedia, Rio de Janeiro, [s.d.]. Disponível em: <http://www.devmedia.com.br/ artigo‑net‑magazine‑65‑asp‑net‑webforms‑x‑mvc/13896>. Acesso em: 5 ago. 2015 8.1 acessando dados com ms ado.net Existem atualmente diversas maneiras de conexão com o banco de dados: Oracle, SQL, Access, entre outros, porém, para que a conexão seja efetuada de maneira amigável, nesse livro‑texto teremos como base a construção de conexão utilizando a linguagem C#, que será utilizada como ponto entre a view (aspx) e a codificação de itens de conexão (C#). observação É importante que o aluno consiga assimilar tendo estudado conceitos vistos em banco de dados para que esse livro‑texto possa ser absorvido de maneira clara e objetiva. A seguir inserimos uma sequência de imagens que exemplifica como elaborar a aplicação em três camadas. Figura 93 – Exemplo de aplicação em 3 camadas <%@ Page Title=”Home Page” Language=”C#” MasterPageFile=”~/Site. master” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”TresCamadasAdoNet._ Default” %> <asp:Content ID=”HeaderContent” runat=”server” ContentPlaceHolderID= ”HeadContent”> </asp:Content> <asp:Content ID=”BodyContent” runat=”server” ContentPlaceHolderID=”M ainContent”> <h2> Exemplo de aplicação em 3 Camadas </h2> <p> 90 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV <asp:HyperLink ID=”hplkListarRegistros” runat=”server” NavigateUrl=”~/ListarRegistros.aspx”>Listar Registros</ asp:HyperLink> </p> <asp:Label ID=”lblMessage” runat=”Server” ForeColor=”red” EnableViewState=”False”></asp:Label> <table style=”border:2px solid #cccccc;”> <tr style=”background‑color:#507CD1;color:White;”> <th colspan=”3”>Incluir Registros</th> </tr> <tr> <td> Nome: </td> <td> <asp:TextBox ID=”txtNome” runat=”Server” Width=”227px”></asp:TextBox> </td> <td> <asp:RequiredFieldValidator ID=”req1” runat=”Server” Text=”*” ControlToValidate=”txtNome” Display=”dynamic”></ asp:RequiredFieldValidator> </td> </tr> <tr> <td> Email: </td> <td> <asp:TextBox ID=”txtEmail” runat=”Server” Width=”223px”></asp:TextBox> </td> <td> <asp:RequiredFieldValidator ID=”req2” runat=”Server” Text=”*” ControlToValidate=”txtEmail” Display=”dynamic”></asp:RequiredFieldValidator> </td> </tr> <tr> <td> Idade: </td> <td> <asp:TextBox ID=”txtIdade” runat=”Server” Columns=”4” Width=”42px”></asp:TextBox> </td> <td> <asp:RequiredFieldValidator ID=”req3” runat=”Server” Text=”*” ControlToValidate=”txtIdade” Display=”dynamic”></ asp:RequiredFieldValidator> <asp:CompareValidator ID=”Comp1” runat=”Server” Text=”Somente Inteiros” ControlToValidate=”txtIdade” Operator=”DataTypeCheck” Type=”Integer”></ 91 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet asp:CompareValidator> </td> </tr> <tr> <td> </td> <td> <asp:Button ID=”btnSubmit” runat=”server” Text=”Submeter” OnClick=”IncluirRegistros” Width=”80px” /> </td> </tr> </table> </asp:Content> Figura 94 – Estrutura de código da página Figura 95 – Estrutura do Projeto Web 92 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System.Data; using DAL; namespace BAL { public class Negocios { /// <summary> /// inserir registro no banco de dados /// </summary> /// <param name=”nome”></param> /// <param name=”email”></param> /// <param name=”idade”></param> /// <returns></returns> public int Insert(string nome, string email, int idade) { AcessoDados pDAL = new AcessoDados(); try { return pDAL.Insert(nome, email, idade); } catch { throw; } finally { pDAL = null; } } /// <summary> /// atualizar registro do banco de dados /// </summary> /// <param name=”codigo”></param> /// <param name=”nome”></param> /// <param name=”email”></param> /// <param name=”idade”></param> /// <returns></returns> public int Update(int codigo, string nome, string email, int idade) { AcessoDados pDAL = new AcessoDados(); try { return pDAL.Update(codigo, nome, email, idade); } catch { throw; } finally { pDAL = null; 93 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet } } /// <summary> /// carregar todos os registros /// </summary> /// <returns></returns> public DataTable Load() { AcessoDados pDAL = new AcessoDados(); try { return pDAL.Load(); } catch { throw; } finally { pDAL = null; } } /// <summary> /// Deletar registro do banco de dados /// </summary> /// <param name=”codigo”></param> /// <returns></returns> public int Delete(int codigo) { AcessoDados pDAL = new AcessoDados(); try { return pDAL.Delete(codigo); } catch { throw; } finally { pDAL = null; } } } } Figura 96 – Desenvolvimento efetuado na classe BAL 94 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System.Data.SqlClient; using System.Data; using System.Configuration; namespace DAL { public class AcessoDados { /// <summary> /// inserir registros no banco de dados /// </summary> /// <param name=”nome”></param> /// <param name=”email”></param> /// <param name=”idade”></param>/// <returns></returns> /// string connStr = ConfigurationManager.ConnectionStrings[“Esco laSqlServer”].ConnectionString; public int Insert(string nome, string email, int idade) { SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand dCmd = new SqlCommand(“InserirDados”, conn); dCmd.CommandType = CommandType.StoredProcedure; try { dCmd.Parameters.AddWithValue(“@nome”, nome); dCmd.Parameters.AddWithValue(“@email”, email); dCmd.Parameters.AddWithValue(“@idade”, idade); return dCmd.ExecuteNonQuery(); } catch { throw; } finally { dCmd.Dispose(); conn.Close(); conn.Dispose(); } } /// <summary> /// atualiza registro do banco de dados /// </summary> /// <param name=”codigo”></param> /// <param name=”nome”></param> /// <param name=”email”></param> /// <param name=”idade”></param> /// <returns></returns> 95 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet public int Update(int codigo, string nome, string email, int idade) { SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand dCmd = new SqlCommand(“AtualizarDados”, conn); dCmd.CommandType = CommandType.StoredProcedure; try { dCmd.Parameters.AddWithValue(“@nome”, nome); dCmd.Parameters.AddWithValue(“@email”, email); dCmd.Parameters.AddWithValue(“@idade”, idade); dCmd.Parameters.AddWithValue(“@codigo”, codigo); return dCmd.ExecuteNonQuery(); } catch { throw; } finally { dCmd.Dispose(); conn.Close(); conn.Dispose(); } } /// <summary> /// carrega todos os registros do banco de dados /// </summary> /// <returns></returns> public DataTable Load() { SqlConnection conn = new SqlConnection(connStr); SqlDataAdapter dAd = new SqlDataAdapter(“CarregarDados”, conn); dAd.SelectCommand.CommandType = CommandType. StoredProcedure; DataSet dSet = new DataSet(); try { dAd.Fill(dSet, “Contatos”); return dSet.Tables[“Contatos”]; } catch { throw; } finally { dSet.Dispose(); dAd.Dispose(); conn.Close(); conn.Dispose(); } 96 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV } /// <summary> /// Exclui o registro do banco de dados /// </summary> /// <param name=”codigo”></param> /// <returns></returns> public int Delete(int codigo) { SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand dCmd = new SqlCommand(“DeletarDados”, conn); dCmd.CommandType = CommandType.StoredProcedure; try { dCmd.Parameters.AddWithValue(“@codigo”, codigo); return dCmd.ExecuteNonQuery(); } catch { throw; } finally { dCmd.Dispose(); conn.Close(); conn.Dispose(); } } } } Figura 97 – Desenvolvimento efetuado na classe DAL observação Classe BAL é a camada de negócio e Classe DAL é a camada de dados. A nomenclatura das camadas pode variar em diferentes implementações de projetos, nos quais poderão ser apresentadas, em outras bibliografias, como BLL (classe de negócio) e DAO (classe de dados). Toda a nomenclatura apresentada não tem impacto no desenvolvimento do código, servindo apenas para fazer referências de todas as camadas distribuídas da solução da aplicação web. 97 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet <?xml version=”1.0”?> <!‑‑ For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 ‑‑> <configuration> <connectionStrings> <add name=”ApplicationServices” connectionString=”data source=.\SQLEXPRESS;Integrated Security =SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true” providerName=”System.Data.SqlClient” /> Caminho para a base de dados! <add name=”LocalSqlServer” connectionString=”Data Source=.\SQLEXPRESS;database=Escola;Integ rated Security=True;” providerName=”System.Data.SqlClient”/> </connectionStrings> <system.web> <compilation debug=”true” targetFramework=”4.0” /> <authentication mode=”Forms”> <forms loginUrl=”~/Account/Login.aspx” timeout=”2880” /> </authentication> <membership> <providers> <clear/> <add name=”AspNetSqlMembershipProvider” type=”System.Web. Security.SqlMembershipProvider” connectionStringName=”ApplicationServi ces” enablePasswordRetrieval=”false” enablePasswordReset=”true” requiresQuestionAndAnswer=”false” requiresUniqueEmail=”false” maxInvalidPasswordAttempts=”5” minRequiredPasswordLength=”6” minRequiredNonalphanumericCharacters=”0” passwordAttemptWindow=”10” applicationName=”/” /> </providers> </membership> <profile> <providers> <clear/> <add name=”AspNetSqlProfileProvider” type=”System.Web.Profile. SqlProfileProvider” connectionStringName=”ApplicationServices” applicationName=”/”/> </providers> </profile> <roleManager enabled=”false”> <providers> <clear/> 98 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV <add name=”AspNetSqlRoleProvider” type=”System.Web.Security. SqlRoleProvider” connectionStringName=”ApplicationServices” applicationName=”/” /> <add name=”AspNetWindowsTokenRoleProvider” type=”System.Web. Security.WindowsTokenRoleProvider” applicationName=”/” /> </providers> </roleManager> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests=”true”/> </system.webServer> </configuration> Figura 98 – Arquivo Web.config contendo caminho para a base de dados Figura 99 – Página que gera lista de registros using System; using System.Web.UI.WebControls; using BAL; using System.Data; namespace TresCamadasAdoNet { public partial class ListarRegistros : System.Web.UI.Page { DataTable tabela = null; protected void Page_Load(object sender, EventArgs e) { 99 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet if (!IsPostBack) BindGrid(); } /// <summary> /// Disparado quando o botão Cancel for clicado /// </summary> /// <param name=”sender”></param> /// <param name=”e”></param> protected void CancelRecord(object sender, GridViewCancelEditEventArgs e) { GridView1.EditIndex = ‑1;BindGrid(); } /// <summary> /// Disparado quando o botão Edit for clicado /// </summary> /// <param name=”sender”></param> /// <param name=”e”></param> protected void EditRecord(object sender, GridViewEditEventArgs e) { GridView1.EditIndex = e.NewEditIndex; BindGrid(); } private DataTable BindGrid() { Negocios p = new Negocios(); try { tabela = p.Load(); GridView1.DataSource = tabela; GridView1.DataBind(); } catch (Exception ee) { lblMensagem.Text = ee.Message.ToString(); } finally { p = null; } return tabela; } protected void DeleteRecord(object sender, GridViewDeleteEventArgs e) { int personID = Int32.Parse(GridView1.DataKeys[e.RowIndex]. Value.ToString()); 100 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV // instancia uma BAL Negocios pBAL = new Negocios(); try { pBAL.Delete(personID); lblMensagem.Text = “Registro deletado com sucesso.”; } catch (Exception ee) { lblMensagem.Text = ee.Message.ToString(); } finally { pBAL = null; } GridView1.EditIndex = ‑1; // atualiza a lista BindGrid(); } protected void UpdateRecord(object sender, GridViewUpdateEventArgs e) { int codigo = Int32.Parse(GridView1.DataKeys[e.RowIndex]. Value.ToString()); int resultado = 0; GridViewRow row = GridView1.Rows[e.RowIndex]; TextBox tNome = (TextBox)row.FindControl(“txtNome”); TextBox tEmail = (TextBox)row.FindControl(“txtEmail”); TextBox tIdade = (TextBox)row.FindControl(“txtIdade”); // instancia uma BAL Negocios pBAL = new Negocios(); try { resultado = pBAL.Update(codigo, tNome.Text, tEmail. Text, int.Parse(tIdade.Text)); if (resultado > 0) lblMensagem.Text = “Registro atualizado com sucesso.”; else lblMensagem.Text = “Registro não pode ser atualizado.”; } catch (Exception ee) { lblMensagem.Text = ee.Message.ToString(); } finally { pBAL = null; 101 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet } GridView1.EditIndex = ‑1; // atualiza a lista BindGrid(); } /// <summary> /// Fires when page links are clicked /// </summary> /// <param name=”sender”></param> /// <param name=”e”></param> protected void ChangePage(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex; // atualiza a lista BindGrid(); } /// <summary> /// Pega o GridView DataSource /// </summary> private DataTable GridDataSource() { Negocios p = new Negocios(); DataTable tabela = new DataTable(); try { tabela = p.Load(); } catch (Exception ee) { lblMensagem.Text = ee.Message.ToString(); } finally { p = null; } return tabela; } protected void CancelaEdicao(object sender, GridViewCancelEditEventArgs e) { } } } Figura 100 – Código encapsulado na página ListaRegistros 102 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System; using System.Web.UI; using BAL; namespace TresCamadasAdoNet { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void IncluirRegistros(object sender, EventArgs e) { //valida pagina if (!Page.IsValid) return; int intResult = 0; // Para pagina valida continua a inserir // instancia um objeto BAL Negocios pBAL = new Negocios(); // define os valores que serão incluídos string nome = txtNome.Text; string email = txtEmail.Text; int idade = Int32.Parse(txtIdade.Text); try { intResult = pBAL.Insert(nome, email, idade); if (intResult > 0) lblMessage. Text = “Novo registro incluído com sucesso.”; else lblMessage.Text = “Nome [<b>” + txtNome. Text + “</b>] já existe, tente outro nome”; } catch (Exception ee) { lblMessage.Text = ee.Message.ToString(); } finally { pBAL = null; } } } } Figura 101 – Código encapsulado na página Default 103 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet observação Os códigos encapsulados nas páginas ListarRegistros e Default foram criados utilizando a linguagem de programação C#, sendo, assim, construídos nos arquivos ListarRegistros.aspx.cs e Default.aspx.cs. Para se rodar uma página web na IDE do Visual Studio .NET basta acionar o botão F5 do teclado ou clicar na seta verde contida no menu da IDE. lembrete A aplicação web será executada, desde que esta não esteja com nenhum erro de codificação no projeto. Figura 102 – Página Default.aspx sendo executada no navegador Firefox 8.2 linQ para Xml Podemos definir que Linq para XML nada mais é do que um provedor de dados que se utiliza da implementação do namespace System.Xml.LINQ, que foi implementado desde da versão do framework 3.5, no qual ele disponibiliza recursos como leitura, escrita e construção de dados XML. O trabalho com o LINQ nada mais é do que efetuar consulta de dados. Todas as consultas de dados serão extraídas de XML, podendo retornar arquivos de aplicação web, de memória ou até mesmo de web service. 104 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV saiba mais Vale ressaltar que a partir da versão 2008 do Visual Studio, inseriu‑se o conceito de LINQ, que é considerada a consulta integrada à linguagem, de maneira que se possa aplicar recursos de consulta levando‑se em consideração a sintaxe da linguagem C#. Para conhecer mais sobre LINQ, acesse: LINQ to XML. Microsoft Developer Network. 2015. Disponível em: <https://msdn.microsoft.com/pt‑br/library/bb387098(v=vs.120).aspx>. Acesso em: 5 ago. 2015. Nas figuras a seguir, apresentamos um exemplo em que será criada uma aplicação que deverá listar dados por meio da aplicação de conceitos LINQ. <%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx. cs” Inherits=”_Default” %> <!DOCTYPE html PUBLIC “‑//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1‑transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head id=”Head1” runat=”server”> <title>LINQ para XML</title> <style type=”text/css”> .style1 { width: 100%; } .style2 {font‑family: “Trebuchet MS”; font‑size: small; } </style> </head> <body> <form id=”form1” runat=”server”> <div style=”width: 450px”> <table class=”style1” border=”1”> <tr> <td class=”style2”> Exibir Todos os dados</td> <td> <asp:Button ID=”butGetXML” runat=”server” Text=”Exibir XML” onclick=”butGetXML_Click” /> </td> </tr> <tr> 105 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet <td class=”style2”> Filtrar por Cidade:</td> <td> <span class=”style2”>Cidade</span>: <asp:DropDownList ID=”ddlCidade” runat=”server” Height=”17px” Width=”115px”> </asp:DropDownList> <asp:Button ID=”butFiltraXML” runat=”server” Text=”Filtrar XML” onclick=”butFiltraXML_Click” /> </td> </tr> <tr> <td class=”style2” colspan=”2”> App_data/Clientes.xml</td> </tr> <tr> <td colspan=”2” bgcolor=”#FFFFCE”> <asp:Literal ID=”litXMLDados” runat=”server”></asp:Literal> </td> </tr> </table> </div> </form> </body> </html> Figura 103 – Página Default.aspx Figura 104 – Página Default.aspx em modo design 106 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Xml; public partial class _Default : System.Web.UI.Page { protected void butGetXML_Click(object sender, EventArgs e) { XDocument xmlDoc = XDocument.Load(Server.MapPath(“App_Data/ Clientes.xml”)); var clientes = from cliente in xmlDoc.Descendants(“Cliente”) select new { Nome = cliente.Element(“Nome”).Value, Cidade = cliente.Element(“Cidade”).Value, Idade = cliente.Element(“Idade”).Value, }; litXMLDados.Text = “”; foreach (var cliente in clientes) { litXMLDados.Text = litXMLDados. Text + “Nome : “ + cliente.Nome + “<br />”; litXMLDados.Text = litXMLDados. Text + “Cidade: “ + cliente.Cidade + “<br />”; litXMLDados.Text = litXMLDados. Text + “Idade : “ + cliente.Idade + “<br /><br />”; } if (litXMLDados.Text == “”) litXMLDados.Text = “Nada encontrado.”; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) carregaDLL(); } protected void carregaDLL() { XmlDocument doc = new XmlDocument(); doc.Load(Server.MapPath(“App_Data/Clientes.xml”)); XmlNodeList nodeList = doc.SelectNodes(“Clientes/Cliente”); foreach (XmlNode node in nodeList) 107 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Desenvolvimento De software para internet ddlCidade.Items.Add(new ListItem(node. SelectSingleNode(“Cidade”).InnerText)); } protected void butFiltraXML_Click(object sender, EventArgs e) { XDocument xmlDoc = XDocument.Load(Server.MapPath(“App_Data/ Clientes.xml”)); var clientes = from cliente in xmlDoc.Descendants(“Cliente”) where cliente.Element(“Cidade”). Value == ddlCidade.SelectedItem.ToString() select new { Nome = cliente.Element(“Nome”).Value, Cidade = cliente.Element(“Cidade”).Value, Idade = cliente.Element(“Idade”).Value, }; litXMLDados.Text = “”; foreach (var cliente in clientes) { litXMLDados.Text = litXMLDados. Text + “Nome : “ + cliente.Nome + “<br />”; litXMLDados.Text = litXMLDados. Text + “Cidade: “ + cliente.Cidade + “<br />”; litXMLDados.Text = litXMLDados. Text + “Idade : “ + cliente.Idade + “<br /><br />”; } if (litXMLDados.Text == “”) litXMLDados.Text = “Nada encontrado.”; } } Figura 105 – Programação da página Default utilizando C# resumo Nesta unidade, vimos como podemos combinar e integrar técnicas de desenvolvimento web, tais como o bootstrap, que, de fato, enriquece todo o desenvolvimento de aplicação web, principalmente tratando de sua recursividade, disponibilizando, assim, a visualização de páginas tanto em desktop quando em smartphones e tablets, sem perder a qualidade da página. Vimos também conceitos de conexão com banco de dados, utilizando como base a linguagem C#. Trabalhando com desenvolvimento de aplicações web, utilizamos recursos da linguagem C# para efetuar a codificação de banco de dados, bem como toda a lógica de botões inseridos nas páginas aspx. 108 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Unidade IV Conceitos de Linq e XML enriqueceram o desenvolvimento de aplicação web, bem como todo o trabalho com o Linq, que, na verdade, nada mais é do que efetuar consulta de dados. Entretanto, atuando com XML, todas as consultas de dados serão extraídas dela, podendo retornar arquivos de aplicação web, de memória ou até mesmo de web service. Finalmente, ressaltamos toda a construção de arquitetura web e sua execução, lembrando da preocupação atual em desenvolver com qualidade, agilidade e principalmente com a intenção de visualização de página em qualquer dispositivo conectado à internet. 109 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 FIGURAS E ILUSTRAÇÕES Figura 68 DESMAJAXRPFIG01.JPG. Disponível em: <http://www.devmedia.com.br/imagens/javamagazine/ desmajaxrpfig01.jpg>. Acesso em: 5 ago. 2015. REFERênCIAS Textuais BORGES JÚNIOR, M. P. ASP.NET utilizando C#: de programador para programador. Rio de Janeiro: Ciência Moderna, 2006. CAMARA, F. Orientação a objeto com .NET. 2. ed. Santa Catarina: Visual Books. 2006. CC BY. Bootstrap. [s.d.]. Disponível em: <http://twitter.github.com/bootstrap/index.html>. Acesso em: 29 jul. 2015. GROFFE, R. J. ASP.NET MVC: Desenvolvendo soluções para web. DevMedia, Rio de Janeiro, [s.d.]. Disponível em: <http://www.devmedia.com.br/asp‑net‑mvc‑desenvolvendo‑solucoes‑para‑web ‑revista‑net‑magazine‑91/22878>. Acesso em: 12 jul. 2015. SENDIN, R. ASP.NET: WebForms X MVC. DevMedia, Rio de Janeiro, [s.d.]a. Disponível em: <http://www. devmedia.com.br/artigo‑net‑magazine‑65‑asp‑net‑webforms‑x‑mvc/13896>. Acesso em: 5 ago. 2015 ___. ASP.NET MVC 3 com Razor. DevMedia, Rio de Janeiro, [s.d.]b. Disponível em: <http://www. devmedia.com.br/asp‑net‑mvc‑3‑com‑razor‑revista‑net‑magazine‑91/22872>. Acesso em: 29 jul. 2015. DURÃES, R. Desenvolvendo para web usando o Visual Studio 2008. Rio de Janeiro: Brasport, 2011. INTRODUÇÃO ao .NET Framework. Microsoft Developer Network, 2015. Disponível em: <https://msdn. microsoft.com/pt‑br/library/hh425099(v=vs.110).aspx>. Acesso em: 30 jul. 2015. JANONES, R. de S. Qualidade de software: uma questão de eficiência. DevMedia, Rio de Janeiro, [s.d.]. Disponível em: <http://www.devmedia.com.br/qualidade‑de‑software‑uma‑questao‑de‑eficiencia/ 17803>. Acesso em: 5 ago. 2015. KLEINA, N. A história da internet: pré‑década de 60 até anos 80 [infográfico]. Tecmundo, Curitiba, 29 abr. 2011. Disponívelem: <http://www.tecmundo.com.br/infografico/9847‑a‑historia‑da‑internet‑ pre‑decada‑de‑60‑ate‑anos‑80‑infografico‑.htm>. Acesso em: 22 jul. 2015. 110 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 KOBAYACHI, C.; BEU, E. L.; Webdesigner: estrutura e programação. 9. ed. São Paulo: Erica, 2004. LINQ to XML. Microsoft Developer Network, 2015. Disponível em: <https://msdn.microsoft.com/pt‑br/ library/bb387098(v=vs.120).aspx>. Acesso em: 5 ago. 2015 LOTAR, A. Programando com ASP.NET MVC. São Paulo: Novatec, 2011. MANZANO, J. A. N.; TOLEDO, S. A. Guia de orientação e desenvolvimento de sites – HTML, XHTML, CSS e JavaScript/JScript. 2. ed. São Paulo: Erica, 2010. MÉTODO TraceWrite (String, String). Microsoft Developer Network, 2015. Disponível em: <https:// msdn.microsoft.com/pt‑br/pt/library/247w289d%28v=vs.110%29.aspx>. Acesso em: 28 jul. 2015. PISA, P. O que é IP? Techtudo, 7 maio 2012. Disponível em: <http://www.techtudo.com.br/artigos/ noticia/2012/05/o‑que‑e‑ip.html>. Acesso em: 27 jul. 2015. PROFFITT, B.; ZUPAN, A. XHTML: desenvolvimento web. São Paulo: Makron Books, 2001. SHEPHERD, G. Microsoft ASP.NET 2.0: passo a passo. Porto Alegre: Bookman, 2008. TAKAHASHI, T. (Org.). Sociedade da informação no Brasil: o livro verde. Brasília: Ministério da Ciência e Tecnologia, 2000. Site <http://www.microsoft.com/brasil/msdn> 111 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 112 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 113 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 114 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 115 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 116 Re vi sã o: G io va nn a / R os e - Di ag ra m aç ão : M ár ci o - 06 /0 8/ 20 15 Informações: www.sepi.unip.br ou 0800 010 9000
Compartilhar