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 (Action) compõ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:
<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> </td>
<td> </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:
No próximo artigo, faremos a criação e edição de livros...
Referências:
- Welcome to Struts 1, http://struts.apache.org/1.3.10/index.html
- Introdução ao Struts Web Framework, http://netbeans.org/kb/docs/web/quickstart-webapps-struts_pt_BR.html
- Comparing the Struts 1 and Struts 2 Web Application Frameworks, http://www.developer.com/design/article.php/3709901/Comparing-the-Struts-1-and-Struts-2-Web-Application-Frameworks.htm
Outros artigos relacionados:
Você esqueceu de explicar como o deve ficar! Não faço ideia de como configurar isso
ResponderEliminar