wpjr2’s Weblog

Artigos e tutoriais úteis

Archive for the ‘Curso Desenvolvimento para Web com Apache Struts e JSP’ Category

Struts Logging: Jakarta Commons Logging e Log4J

Posted by wpjr2 em julho 7, 2008

Segue abaixo alguns links relacionados aos temas que vimos na aula deste final de semana:

Jakarta Commons Logging

Log4J

Java Logging API

Estou disponibilizando tb a versão online dos slides adicionais que criei sobre o Log4J e o JCL:

Anúncios

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , , | 1 Comment »

Struts Validator: Lab 09

Posted by wpjr2 em julho 5, 2008

Segue abaixo detalhes do laboratório 9 (Struts Validator) do curso de desenvolvimento de aplicações Web com Apache Struts:

1) Criar a classe EmpresaAction que estende de LookupDispatchAction

package curso.struts.visao.action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.apache.struts.actions.LookupDispatchAction;
import org.apache.struts.validator.DynaValidatorForm;

import curso.struts.modelo.dao.EmpresaDao;

public class EmpresaAction extends LookupDispatchAction {

public ActionForward pesquisar(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// obtendo o formulario
DynaValidatorForm formulario = (DynaValidatorForm) form;
String nomeEmpresa = (String) formulario.get(“nome”);
// buscando a lista de empresa
List empresas = EmpresaDao.getInstancia().
getEmpresaPorNome(nomeEmpresa);
// salvando a lista na sessao
request.getSession().setAttribute(“empresas”, empresas);
// retornando para a lista
return mapping.findForward(“lista”);
}

protected Map getKeyMethodMap() {
Map mapa = new HashMap();
mapa.put(“acao.pesquisar”, “pesquisar”);
return mapa;
}
}

1a) Criar os arquivos de configuração (XML):

Copiar o validation-rules.xml do Lab09.zip para WEB-INF
Copiar o validation.xml do Lab09.zip para WEB-INF

2) Acrescentar no arquivo filtro.jsp a propriedade hidden:

<html:hidden property=”acao” value=”Pesquisar” />

3) Criar  no Struts-config.xml um novo form:

<form-bean name=”EmpresaForm”
type=”org.apache.struts.validator.DynaValidatorForm”>
<form-property name=”nome” type=”java.lang.String”/>
</form-bean>

4) Criar  no Struts-config.xml uma nova ação:

<action input=”/filtro.jsp” name=”EmpresaForm” parameter=”acao”
path=”/empresa” scope=”request”
type=”curso.struts.visao.action.EmpresaAction” validate=”true”>
<forward name=”lista” path=”/listaEmpresas.jsp”/>
</action>

5) Definir a validação do formulário no validation.xml:

<formset>
<form name=”EmpresaForm”>
<field depends=”required” property=”nome”>
<arg key=”empresa.nome” position=”0″ />
</field>
</form>
</formset>

6) Mudar no filtro.jsp a ação a ser executada pelo formulário:

Mudar de: <html:form action=”/pesquisaempresa”>
Para: <html:form action=”/empresa”>

7) Acrescentar no struts-config.xml o plugin do validator a ser usado:

<plug-in className=”org.apache.struts.validator.ValidatorPlugIn”>
<set-property property=”pathnames” value=”/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml”/>
</plug-in>

8) Adicionar a lib Lib commons-validator-1.3.1.jar ao projeto Web:

A Lib commons-validator-1.3.1.jar deve estar no diretório WebContent/WEB-INF/lib

9) Acrescentar a propriedade no arquivo application.properties:

acao.pesquisar=pesquisar

10) executar a aplicação via URL:

http://localhost:8080/curso/filtro.jsp

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , , | Leave a Comment »

Struts Validator: Links úteis

Posted by wpjr2 em julho 4, 2008

Segue abaixo alguns links úteis referentes ao Struts Validator:

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: | Leave a Comment »

Struts Validator: FormSet e i18n

Posted by wpjr2 em julho 4, 2008

Na aula de sábado passado, um de meus alunos (Rafael Albergaria) teve um problema ao utilizar o DynaValidatorForm para criar formulários dinâmicos no Struts e para estes serem validados pelo Jakarta Commons Validator 1.3.1. Este exercício está relacionado ao capítulo 9 que vimos na aula passada.

O problema foi que, na definição da validação do formulário (validation.xml), o <formset/> foi definido para uma localização específica (pt, BR), causando um problema ao executar a aplicação sobre um browser que não estivesse definido nesta localização.

<formset country=”BR” language=”pt”>
<form name=”EmpresaForm”>
<field depends=”required” property=”nome”>
<arg key=”empresa.nome” position=”0″ />
</field>
</form>
</formset>

Durante o exercício em sala de aula, como o meu browser estava definido para esta localização, o formset era encontrado corretamente e a validação era executada com sucesso. O problema ocorre quando a localização do browser está definida para um valor diferente do definido no <formset/>. Quando isto acontece, o Commons Validator não consegue encontrar o form definido no validation.xml, desta forma não executando a validação.

Para este problema, existem duas soluções:

a) não definir a localização no formset, tornando-o genérico para todas as localizações e idiomas

b) se for necessário definir a localização (validações para linguas específicas), implementar a validação específica em uma subclasse de DynaValidatorForm, utilizando-a na definição do form no arquivo de configurações struts-config.xml

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP | Etiquetado: , | Leave a Comment »

java.lang.OutOfMemoryError no Servidor Apache Tomcat

Posted by wpjr2 em junho 2, 2008

Segue abaixo um problema que um de meus alunos do curso de Struts teve ao configurar uma aplicação Web no servidor Tomcat. Pude auxiliá-lo na resolução do problema e pedi a ele que escrevesse um post apresentando o problema e a solução do mesmo. Este post com certeza será útil para outras pessoas que venham a ter o mesmo problema.

Por Rafael Diego

Possuo um servidor com o FreeBSD e sistema Java Web, que faz conexão com um BD, existente que rodava normalmente no servidor, sobre o Tomcat 5.5, ainda estava exibindo a tela de Login.
O usuário conseguia logar e visualizar o menu principal. Porém, quando clicava em qualquer submenu, o redirecionamento demorava alguns segundos (mais que o normal) e era exibida uma mensagem de erro, provida pelo próprio Tomcat:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.jsp.JspException: java.lang.OutOfMemoryError: Java heap space
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:842)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.pages.cadastro_005famostra_jsp._jspService(cadastro_005famostra_jsp.java:149)
org.apache..jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet..JspServlet.service(JspServlet.java:236)
javax.servlet..http.HttpServlet.service(HttpServlet.java:802)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:142)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

root cause

javax.faces.el.EvaluationException: java.lang.OutOfMemoryError: Java heap space
com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:185)
com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:136)
javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:308)
javax.faces.webapp.UIComponentTag.isSuppressed(UIComponentTag.java:828)
javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:460)
com.sun.faces.taglib.html_basic.PanelGridTag.doStartTag(PanelGridTag.java:436)
org.apache.jsp.pages.cadastro_005famostra_jsp._jspx_meth_h_panelGrid_0(cadastro_005famostra_jsp.java:269)
org.apache.jsp.pages.cadastro_005famostra_jsp._jspx_meth_h_form_0(cadastro_005famostra_jsp.java:221)
org.apache.jsp.pages.cadastro_005famostra_jsp._jspx_meth_f_view_0(cadastro_005famostra_jsp.java:191)
org.apache.jsp.pages.cadastro_005famostra_jsp._jspService(cadastro_005famostra_jsp.java:139)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet..serviceJspFile(JspServlet.java:292)
org.apache.jasper..servlet.JspServlet.service(JspServlet.java:236)
javax..servlet.http.HttpServlet.service(HttpServlet.java:802)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:142)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

note The full stack trace of the root cause is available in the Apache Tomcat/5.0.30 logs.
Após consulta na Internet, pelos sites de busca, fóruns e pedindo auxílios à outras pessoas e ainda tentando entender a mensagem de erro, vi que era problema de “memória insuficiente” alocada para a JVM.

Encontrei o seguinte comando que setava o tamanho de memória utilizado pela JVM:
export CATALINA_OPTS=”-Xms256m -Xmx512m”
Este comando seta a memória mínima (Xms) em 256MB e a memória máxima a ser usada (Xmx) em 512MB.

Adicionei o comando nas configurações do arquivo catalina.sh. Após reiniciar o servidor, o problema foi corrigido.
Agora, minha aplicação roda com memória entre 256 e 512MB.

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: , , | Leave a Comment »

Struts e o MVC: Relações entre Classes

Posted by wpjr2 em junho 1, 2008

Segue abaixo algumas tabelas do livro “Struts in Action” que apresentam algumas das relações entre o padrão MVC e o framework Apache Struts.

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: , , , | 1 Comment »

Core J2EE Patterns: Índice de Padrões

Posted by wpjr2 em maio 26, 2008

A própria Sun possui um catálogo de padrões de projeto muito utilizados em projetos de desenvolvimento de sistemas Web em JavaEE. Este catálogo apresenta cada um destes padrões, com exemplos de código, estrutura em UML, dentre outras informações.

Link da página

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: , | Leave a Comment »

Apache Struts – Introdução

Posted by wpjr2 em maio 26, 2008

por Marcelo Ribeiro Costa
extraído do site: http://www.portaljava.com.brIntrodução

Introdução

O Struts é um framework open-source do projeto Jakarta que auxilia a construção de aplicações para a Web. Ele é construído em Java, e seu coração consiste numa camada de controle flexível baseada nas tecnologias Java Servlets, JavaBeans, ResourceBundles e XML.

O Struts favorece o desenvolvimento de aplicações seguindo o paradigma MVC (Model-View-Controller). O Struts fornece um componente Controller e se integra a outras tecnologias para oferecer suporte aos componentes Model (como JDBC, EJB’s, etc.), e View (como JSP, XSLT, etc.).

2. O Design Pattern MVC

No design pattern MVC, o fluxo da aplicação é mediado por um controlador central (Controller). O controlador delega requisições para um tratadores apropriados, que estão localizados no modelo (Model), que representa a lógica de negócio e o estado da aplicação. A requisição então é respondida, através do controlador, e apresentada na visão (View), da maneira adequada. No Struts, essas respostas são orientadas através de mapeamentos, que são carregados através de um arquivo de configuração (struts-config.xml). Isso faz com que não haja dependência entre a visão e o modelo, que auxilia na criação e na manutenção da aplicação.

3. Instalação

A versão do Struts mais utilizada é a versão 1.1, que ainda se encontra em versão beta. Apesar de ainda não estar completamente finalizada, é uma versão estável e que deve sofrer poucas alterações. Para que nossos exemplos funcionem adequadamente, utilizaremos essa versão. Será então necessário fazer o download do arquivo jakarta-struts-1.1-b3.zip no site do Jakarta Struts (http://jakarta.apache.org/struts), e descompactá-lo no computador. O pacote vem com as bibliotecas necessárias para a utilização do framework e alguns exemplos.

4. Componentes do Struts

1. Componentes Model

Os componentes Model englobam dois conceitos: a lógica de negócio da aplicação e seu estado. As tecnologias utilizadas nessa camada, são JavaBeans, e freqüentemente, Enterprise JavaBeans e JDBC.

Através destas tecnologias, deverá ser construída a lógica de negócio da aplicação.

2. Componentes View

Os componentes View representam a visão da aplicação, ou seja, a maneira como o sistema interage com o usuário. A tecnologia mais comumente utilizada nessa camada é Java Server Pages.

Nessa camada, o Struts oferece suporte a dois importantes aspectos: internacionalização e construção de interfaces JSP através de custom tag’s.

Para permitir a internacionalização, é necessário que se crie, sob o diretório WEB-INF/resources da aplicação, um arquivo chamado ApplicationResources.properties, que conterá mensagens para a linguagem padrão do seu servidor. As mensagens são colocadas nos arquivos através de strings simples, como:

app.cliente.nome=Nome do cliente

Para possibilitar que se crie mensagens em outras linguagens, é necessário criar o arquivo ApplicationResources_xxx.properties, onde xxx será o nome ISO da linguagem a ser utilizada.

Outro importante recurso é a disponibilidade de custom tag’s do Struts, que permitirá, além da utilização dos arquivos de internacionalização, uma série de funcionalidades, que, na grande maioria dos casos, dispensará a utilização de código Java dentro da página (aliás, esse é um dos objetivos da arquitetura MVC, pois o fluxo de controle e lógica de negócio da aplicação não devem estar na camada de visão). Além disso, a extensibilidade de Java permite que o próprio desenvolvedor crie suas próprias custom tag’s, que, aliás, é uma tarefa bastante simples.

As custom tag’s do Struts são divididas em cinco bibliotecas:

· html: permite a criação e manipulação integrada de formulários HTML com o Struts;

· logic: permite a criação de estruturas de condição e repetição, além da administração do fluxo da aplicação;

· bean: permite a criação e manipulação de JavaBeans dentro da página;

· nested: permite a definição de modelos de objetos aninhados e a capacidade de representá-los e administrá-los;

· template: permite a criação de modelos dinâmicos de páginas JSP que compartilham de um formato comum.

3. Componentes Controller

Os componentes Controller são responsáveis pelo fluxo da aplicação. O principal componente Controller do Struts é a ActionServet, que é uma extensão de Servlet, exercendo o papel de controlador principal da aplicação. Sua principal função é fazer o mapeamento das requisições do servidor.

Para isso, é necessário criar um arquivo de configuração, denominado struts-config.xml, que é usado para mapear a navegação da aplicação. Depois disso, deverão ser criadas as classes Action (que são extensões da classe Action do Struts), que conterão as ações a serem executadas a cada requisição. O objetivo da classe Action é processar a requisição e retornar um objeto da classe ActionForward que identifica para qual componente de visão (normalmente uma página JSP) será gerada a resposta. As classes Action são compostas de um único método, com a assinatura public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, que será invocado quando a ActionServlet receber a requisição e processá-la.

O Ainda na camada controller, Struts oferece para os chamados ActionForm beans, ou, mais comumente chamados, form-beans. Form-beans são classes Java que estendem ActionForm e se integram a um formulário de entrada de dados em sua aplicação. O conceito dos form-beans é simples: são JavaBeans que contém uma propriedade para cada campo de seus formulários HTML, com seus respectivos métodos getters e setters. Os form-beans não implementam qualquer método, exceto reset e validate, servindo para limpar o conteúdo do formulário e validar seus dados, respectivamente.

5. Configuração

Antes de utilizar o Struts, é necessário configurar seu ambiente para que ele saiba como mapear todas as requisições através de uma determinada extensão de arquivo para a ActionServet do Struts. Isso deverá estar no arquivo web.xml, que fica abaixo do diretório WEB-INF de sua aplicação.

O próximo passo é configurar o arquivo fundamental do Struts, o struts-config.xml. Enquanto o arquivo web.xml define aonde a requisição deve chegar, o struts- config.xml determina exatamente o que vai acontecer com ela. Nada acontece sem sua permissão ou seu conhecimento: é onde os mapeamentos são definidos. Toda a navegação da aplicação está definida nesse arquivo, o que é uma grande vantagem, pois a mantém modularizada e de fácil manutenção. Todo esse arquivo é lido na inicialização do servidor e armazenado na memória, por questões de performance.

Além disso, é necessário que se tenha todos os arquivos .jar necessários à aplicação abaixo do diretório WEB-INF/lib, e todos os descritores de custom-tag’s abaixo do diretório WEB-INF.

6. Criando uma aplicação exemplo com o Struts

O primeiro passo será criar a estrutura padrão para aplicativos WEB utilizando Servlets, contendo uma pasta WEB-INF, onde será colocado o arquivo web.xml.

No diretório WEB-INF, deverão ser colocados os descritores de custom tag’s do Struts (arquivos .tld).

Depois disso, devemos criar o diretório WEB-INF/classes, onde serão colocados os arquivos .class, dentro de seus determinados pacotes, e o diretório WEB-INF/lib, onde serão colocados os arquivos .jar do Struts.

Após as configurações acima, pode-se criar as ações, os forms e os documentos JSPs da aplicação que se deseja desenvolver, configurando-os no arquivo struts-config.xml.

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: | 1 Comment »

MyEclipse Struts Modeler/Workbench 6.0

Posted by wpjr2 em maio 23, 2008

Na minha busca por plugins que suportam o Struts, encontrei uma página muito interessante sobre o MyEclipse Struts Modeler/Editor.

O plugin MyEclipse para a IDE Eclipse possibilita uma quantidade significativa de atividades relacionadas ao desenvolvimento de uma aplicação Web com o Apache Struts.

Uma destas permite visualizar o fluxo das páginas definidas no arquivo de configuração struts-config.xml, conforme mostrado na figura abaixo:

O Plugin não é gratuito, mas existe uma versão trial de 30 dias para quem quiser baixar.

Link da apresentação

Link oficial do MyEclipse

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: , | Leave a Comment »

Struts: Struts Blank 1.3.8 para as IDEs Eclipse 3.3 JEE e Netbeans 6.1 Web

Posted by wpjr2 em maio 23, 2008

Acabei de postar no Google Groups do curso de Desenvolvimento para Web com Apache Struts e JSP os projetos de configuração iniciais para uma aplicação Web com o Framework Apache Struts 1.3.8, o próprio framework que estamos usando no curso. Desta forma fica mais fácil a criação de projetos baseados no framework nestas duas ferramentas.

Struts_blank_138_Netbeans.zip

Struts_blank_138_Eclipse33.zip

Só é necessário descompactar os arquivos e importar os projetos direto por cada IDE específica.

Posted in Curso Desenvolvimento para Web com Apache Struts e JSP, JavaEE | Etiquetado: , , , | 1 Comment »