terça-feira, 29 de janeiro de 2013

Exemplo de aplicação Web Java usando Struts 1 - 3

Continuando o nosso exemplo, vamos neste artigo criar as camadas View e Controller da nossa aplicação MVC usando Struts, para listar os livros da BD fazendo uso das classes Model desenvolvidas anteriormente.


     - Exemplo de Aplicação Web Java usando Struts 1 - 2


Numa aplicação Struts 1, o ficheiro web.xml, já referido num artigo anterior, especifica que os pedidos (requests) que satisfaçam o padrão '*.do' são encaminhados para o Struts ActionServlet
O ActionServlet procura, no ficheiro de configuração struts-config.xml, qual a Ação que está mapeada no pedido que recebeu. O ActionServlet e os objetos de Ação (Actioncompõem a parte de Controlador (Controller) da arquitetura MVC de uma aplicação Struts.

Para transferir dados entre Ações e a View, tipicamente implementada em JSPs, o Struts usa objetos ActionForm.
Quando um utilizador submete um form, o ActionForm, juntamente com os dados do form, é passado para o método execute da Ação.

A Ação pode validar os dados, e depois invocar a lógica necessária, idealmente encapsulada numa camada Model, da qual o Struts não tem qualquer conhecimento.

Quando a lógica de negócio é executada, a Ação transfere o controlo para a View especificada num ou mais objetos ActionForward objects, os quais são também configurados no struts-config.xml.
As entradas ActionForward representam os possíveis outputs de uma Ação.
Podem ser definidas entradas ActioForward por Ação, ou pode ser definida uma entrada ActionForward globalmente, para se aplicar a todas as Ações.

A nossa aplicação vai ter dois conjuntos de Ações e ActionForms. Um para listar Livros, e outro para a criação e edição de um livro.

Neste artigo vamos focar-nos na listagem de livros.
Para isso, vamos alterar o ficheiro struts-config.xml, como se segue:

<struts-config>
    <form-beans>
        <form-bean name="listBooksForm" type="Controller.ListBooksForm" />
    </form-beans>
    
    <global-exceptions>
    
    </global-exceptions>

    <global-forwards>
        <forward name="welcome"  path="/Welcome.do"/>
        <forward name="listBooks" path="/ListBooks.do"/>
    </global-forwards>

    <action-mappings>
      <action path="/Welcome" forward="/welcomeStruts.jsp"/>
      <action
            path="/ListBooks"
            name="listBooksForm"
            scope="request"
            type="Controller.ListBooks"
            validate="false">
            <forward name="list" path="/listBooks.jsp" />
        </action>
    </action-mappings>

    ...


Vamos também alterar o ficheiro index.jsp:


<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<jsp:forward page="ListBooks.do"/>

para que, ao arrancar a nossa aplicação, a lista de livros seja a primeira página a aparecer.

Vamos agora criar no nosso projeto do NetBEans um package Controller, onde vamos colocar as classes para criação dos objetos de controlo, nomeadamente:

- uma classe ListBooksForm (extends ActionForm):


public class ListBooksForm  extends ActionForm {
      
      private List<Book> books;
      
      public List<Book> getBooks() {
          return books;
      }
      
      public void setBooks(List<Book> books) {
          this.books = books;
      }
      
    @Override
      public void reset(ActionMapping arg0, HttpServletRequest arg1) {
          books = new ArrayList<Book>();
      }
}


- uma classe ListBooks        (extends Action)


public class ListBooks extends org.apache.struts.action.Action {
    /**
     * This is the action called from the Struts framework.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        ListBooksForm listBooksForm = (ListBooksForm) form;
        
        List<Book> books = Book.getAllBooks();
        
        listBooksForm.setBooks(books);
        return mapping.findForward("list");
    }
}


O objeto ListBooks irá preencher o ActionForm (ListBooksForm) com a lista de livros, antes de reenviar o controlo para a JSP de listagem dos livros (listBooks.jsp).
Para isso, precisamos de acrescentar o método static Book.getAllBooks()  na classe Model.Book, criada no artigo anterior, usado no método execute da Ação ListBooks:


public static List<Book> getAllBooks(){

        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Book> books = new ArrayList<Book>(session.createQuery("from Book").list());
        session.close();
        
        return books;
    }



listBooks.jsp:


<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html lang="true">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title><bean:message key="listbooks.heading"/></title>
        <html:base/>
    </head>
    <body style="background-color: white">       
        <div style="background-color:blueviolet;height:30px;font-weight:bold;">
            <h2><bean:message key="listbooks.heading"/></h2>
        </div>
        <br/>
        <table border="0" width="90%">
            <tbody>
                <tr>
                    <td  align="right" colspan="10">
                        <html:link action="actionBook.do?method=add">
                            <img src="add.gif" border="0"/>
                        </html:link>
                    </td>
                </tr>
                <tr style="background-color:blueviolet;font-weight:bold;">
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td><bean:message key="listbooks.title"/></td>
                    <td><bean:message key="listbooks.isbn"/></td>
                    <td><bean:message key="listbooks.dateEdition"/></td>
                    <td><bean:message key="listbooks.edition"/></td>
                    <td><bean:message key="listbooks.editor"/></td>
                </tr>
                <logic:iterate name="listBooksForm" id="book" property="books">
                    <tr>
                        <td><html:link action="actionBook.do?method=edit" paramName="book"
                              paramProperty="ID" paramId="ID"><img src="images/edit.gif" border="0"/></html:link>
                        </td>
                        <td><html:link action="actionBook.do?method=delete" paramName="book"
                              paramProperty="ID" paramId="ID"><img src="images/delete.gif" border="0"/></html:link>
                        </td>
                        <td><bean:write name="book" property="title" /></td>
                        <td><bean:write name="book" property="isbn" /></td>
                        <td><bean:write name="book" property="dateEdition" /></td>
                        <td><bean:write name="book" property="edition" /></td>
                        <td><bean:write name="book" property="editor" /></td>                        
                    </tr>
                </logic:iterate>
            </tbody>
        </table>

    </body>
</html:html>


Ao executar, obtemos finalmente:


(faltam apenas as imagens dos botões Add, Edit e Delete para ficar perfeito :)...)

No próximo artigo, faremos a criação e edição de livros...

Referências:

Outros artigos relacionados:

1 comentário:

  1. Você esqueceu de explicar como o deve ficar! Não faço ideia de como configurar isso

    ResponderEliminar