sábado, 2 de fevereiro de 2013

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

No artigo anterior fizemos o código para a nossa aplicação exemplo listar os livros existentes na base de dados.

Artigos anteriores:

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


Vamos hoje, acrescentar o código necessário para criar e editar livros.

Para isso, vamos acrescentar ao nosso ficheiro struts-config.xml as seguintes definições:
  - Um form bean para lidar com os dados do formulário de edição de livros (BookActionForm), ficando:


    <form-beans>
        <form-bean name="listBooksForm" 
                   type="Controller.ListBooksForm" />
        <form-bean name="actionBookForm" 
                   type="Controller.BookActionForm" />
    </form-beans>

  - Mais um global forward (actionBook) a somar aos dois que já lá estavam (note-se que o welcome, que vinha de origem, se tornou desnecessário, podendo ser apagado...):


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

  - E mais três actions (controllers). O primeiro (BookAction) irá decidir qual a view apropriada para a operação seguinte, e se for caso disso vai ler da BD o livro selecionado para pré-preencher o formulário de edição. O segundo (BookAddActionirá fazer o tratamento do ActionForm que contém os dados do formulário de criação de um novo livro, e criar o livro na BD. O terceiro (BookUpdateActionirá fazer o tratamento do ActionForm que contém os dados do formulário de edição de um livro, e atualizar os dados do livro na BD.


<action
     path="/ActionBook"
     name="actionBookForm"
     scope="request"
     type="Controller.BookAction"
     parameter="method"
     validate="false">
     <forward name="edit" path="/editBook.jsp" />
     <forward name="add" path="/addBook.jsp" />
     <forward name="list" path="/ListBooks.do" redirect="true" />
</action>
        
<action
     path="/BookAdd"
     name="actionBookForm"
     scope="request"
     type="Controller.BookAddAction"
     input="addBook.jsp"
     validate="false">
     <forward name="error" path="/errorBook.jsp" />
     <forward name="list" path="/ListBooks.do" redirect="true" />
</action>
        
<action
     path="/BookUpdate"
     name="actionBookForm"
     scope="request"
     type="Controller.BookUpdateAction"
     input="editBook.jsp"
     validate="false">
     <forward name="error" path="/errorBook.jsp" />
     <forward name="list" path="/ListBooks.do" redirect="true" />
</action>



Depois, 
é necessário criar as views JSP e as classes Java correspondentes às configurações que fizémos. 



Assim, precisamos de criar os ficheiros JSP com os forms de edição (editBook.jsp) e criação (addBook.jsp) de livros.

editBook.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="editbook.heading"/></title>
        <html:base/>
    </head>
    <body style="background-color: white">       
        <div style="background-color:blueviolet;height:30px;font-weight:bold;">
            <h2><bean:message key="editbook.heading"/></h2>
        </div>
        <br/>
        <html:form action="BookUpdate.do" focus="isbn" >
            <bean:message key="editbook.id"/>
            <html:text property="ID" size="10" maxlength="10" readonly="true"/><br/>
            <bean:message key="addbook.isbn"/>
            <html:text property="isbn" size="10" maxlength="10"/><br/>
            <bean:message key="addbook.title"/>
            <html:text property="title" size="50" maxlength="50"/><br/>
            <bean:message key="addbook.dateEdition"/>
            <html:text property="dateEdition" size="10" maxlength="10"/><br/>
            <bean:message key="addbook.edition"/>
            <html:text property="edition" size="10" maxlength="10"/><br/>
            <bean:message key="addbook.editor"/>
            <html:text property="editor" size="10" maxlength="10"/><br/>
            <html:submit><bean:message key="editbook.submit"/></html:submit>
        </html:form>
    </body>
</html:html>


Note-se, como já vimos no anterior artigo sobre struts, a utilização da tag bean:message para apresentar mensagens definidas no ficheiro de recursos (ApplicationResource.properties).
De notar, também, o nome da ação a executar ao submeter o form (action="BookUpdate.do"), a qual foi declarada no ficheiro struts-config.xml.

Como vimos no artigo anterior, na lista de livros temos, em cada linha, um link para edição do respetivo livro:

<html:link action="actionBook.do?method=edit" paramName="book" paramProperty="ID" paramId="ID">

A ação a invocar para edição de um livro é actionBook.do, a qual recebe o ID do livro nessa linha, assim como o method (method=edit).        
Vejamos o código da classe Java para onde é redirecionado o controlo (Controller.BookAction):

package Controller;

import Model.Book;
import Model.HibernateUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Session;


public class BookAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";

    /**
     * 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 {
        
        BookActionForm bookActionForm = (BookActionForm) form;
        
        String method = request.getParameter("method");
        
        if (method.equals("add")){
                return mapping.findForward("add");
        }
        else{
            Book book = new Book();
            int id = Integer.parseInt(request.getParameter("ID"));
                
            if (method.equals("delete")){
            
                Session session = HibernateUtil.getSessionFactory().openSession();
                session.beginTransaction();
                book = (Book)session.createQuery("from Book Where ID ="+String.valueOf(id)).uniqueResult();
                session.delete(book);
                session.getTransaction().commit();
                session.flush();
                session.close();
                return mapping.findForward("list");
            }
            else{

                Session session = HibernateUtil.getSessionFactory().openSession();
                book = (Book)session.createQuery("from Book Where ID ="+String.valueOf(id)).uniqueResult();
                session.close();
                
                bookActionForm.setID(book.getID());
                bookActionForm.setIsbn(book.getIsbn());
                bookActionForm.setTitle(book.getTitle());
                bookActionForm.setDateEdition(book.getDateEdition());
                bookActionForm.setEdition(book.getEdition());
                bookActionForm.setEditor(book.getEditor());
            
                return mapping.findForward("edit");
            }
        }
    }
}

O método execute, deste controlo, obtém o ActionForm:

BookActionForm bookActionForm = (BookActionForm) form;

onde, deverão estar os dados do formulário. O formulário deverá ser mostrado vazio, no caso de criação de um novo livro, ou preenchido com os dados atuais do livro, no caso de uma edição para alteração de dados.
Assim, o controlo verifica o valor de method, e caso seja "add" reencaminha o controlo para return mapping.findForward("add"). Isto envia o controlo para addBook.jsp, conforme configurado em  struts-config.xml.
Caso não se trata de um "add", é lido o valor do ID do livro:

int id = Integer.parseInt(request.getParameter("ID"));

Caso o method seja "delete", o registo é apagado.
Caso seja "edit", é lido o livro da base de dados e são preenchidos os campos do formulário, antes de reenviar o controlo para "edit", o que conduzirá à execução da view editBook.jsp, conforme configurado em  struts-config.xml.



A classe com o ActionForm é:


package Controller;
import Model.Book;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
  
public class BookActionForm  extends ActionForm {
    private int ID;
    private String isbn;
    private String title;
    private java.sql.Date dateEdition;
    private String edition;
    private String editor;

    public int getID() {
        return ID;
    }
    public void setID(int ID) {
        this.ID = ID;
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Date getDateEdition() {
        return dateEdition;
    }

    public void setDateEdition(Date dateEdition) {
        this.dateEdition = dateEdition;
    }

    public String getEdition() {
        return edition;
    }

    public void setEdition(String edition) {
        this.edition = edition;
    }
    public String getEditor() {
        return editor;
    }
    public void setEditor(String editor) {
        this.editor = editor;
    }
      
    @Override
    public void reset(ActionMapping arg0, HttpServletRequest arg1) {
          ID    = 0;
          isbn  = "";
          title = "";
          dateEdition = new java.sql.Date(0);
          edition = "";
          editor = "";
    }
}


A Action para tratamento do formulário de edição e alteração dos dados do livro na base de dados é:


package Controller;

import Model.Book;
import Model.HibernateUtil;
import java.sql.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Session;

public class BookUpdateAction extends org.apache.struts.action.Action {

    /* forward name="success" path="" */
    private static final String SUCCESS = "success";

    /**
     * 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 {
        
        BookActionForm formBean = (BookActionForm) form;
        String forwardTo = "list";
        
        int id = formBean.getID();
        String isbn = formBean.getIsbn();
        String title = formBean.getTitle();
        Date dateEdition = formBean.getDateEdition();
        String edition = formBean.getEdition();
        String editor = formBean.getEditor();

        Session session = null;
        
        try{
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();

            Book book = (Book)session.createQuery("from Book Where ID ="+String.valueOf(id)).uniqueResult();

            book.setIsbn(isbn);
            book.setTitle(title);
            book.setDateEdition(dateEdition);
            book.setEdition(edition);
            book.setEditor(editor);
        
            session.update(book);
            session.getTransaction().commit();
        }catch(Exception e){
            forwardTo="error";
        }
        finally{
            session.flush();
            session.close();
        }
        return mapping.findForward(forwardTo);
    }
}


Após alteração dos dados do livro na BD, o controlo é reencaminhado para a lista de livros.


Referências:

Outros artigos relacionados:

Sem comentários:

Enviar um comentário