Serviços Personalizados
O JCom é uma ferramenta poderosa e abrangente para o desenvolvimento de sites e oferece ao programador a possibilidade de criar seus próprios serviços, permitindo assim, a personalização total tanto da interface aberta do site, como a sua área de administração. Para isso o sistema oferece o uso do BeanShell.
BeanShell ou BSH é um interpretador de código java muito rápido e eficiente onde podemos unir a facilidade e a poder de recursos do Java, com a capacidade de criar scripts facilmente como uma linguagem interpretada, como o PHP.
O site oficial do BeanShel é http://www.beanshell.org/ onde podemos encontrar todas as informações disponíveis para essa ferramenta.
Criando um Serviço
Para criar um serviço é muito simples, basta criarmos um arquivo com extensão .bsh no diretório ext; como exemplo, criaremos o arquivo HelloService.bsh com o código a seguir:
import java.text.SimpleDateFormat;
class HelloService{
public String sayHello(){
return "Hello BeanShell";
}
public int calcula(int x, int y){
return x+y;
}
public String getData(){
SimpleDateFormat dateFmt = new SimpleDateFormat("dd/MM/yy");
return dateFmt.format( new Date() );
}
}
Como podemos ver, usamos a mesma sintaxe java, lembrando que podemos dar import nos pacotes java que precisarmos. Após isso, devemos declarar este novo servico no arquivo /conf/jcom.xml, conforme abaixo:
<services> <service name="helloService" source="/ext/HelloService.bsh" class="HelloService"/> </services>
Agora podemos usar o nosso serviço extamente como se fossem os oferecidos pelo JCom:
$helloService.hello() $helloService.calcula(2,3) $helloService.getData()
Criando Métodos que recebem POST
Vamos imagina a situação onde o usuário precisa montar um formulário e coletar estes dados para realizar algum processamento. Com o BSH podemos fazer com que nosso serviço personalidado receba parâmetros via post e realize a ação que o programador desejar, como os métodos que são oferecidos pelo servico ContactService por exemplo.
Faremos agora um formulário com campos para o usuário preencher e enviaremos para nosso script, começaremos pelo formulário. O código está descrito logo abaixo:
<form action="" method=POST> <input type=hidden name="action" value="helloService.insertCadastro"> <input type=hidden name="redirect" value="/"> <table width="500px" border="0" cellspacing="2" cellpadding="2" summary="Cadastre aqui seus dados"> <h3>Cadastro</h3> <tr> <th> Nome</th> <td><input name="nome" type="text" id="nome" /></td> </tr> <tr> <th>Email</th> <td><input name="email" type="text" id="email" /></td> </tr> <tr> <th>Sexo</th> <td> <select name="sexo" size="1" id="sexo"> <option value="M">Masculino</option> <option value="F">Feminino</option> </select> </td> </tr> <tr> <th colspan="2"><input type="submit" name="Submit" value="Enviar" /></th> </tr> </table> </form>
No código acima, temos dois objetos hidden, o primeiro deles indica o servico e o método para onde o post deve ser direcionado e, o segundo parâmetro, indica a URL para onde o navegador deve ser redirecionado após o processamento do método.
Partiremos agora para o nosso método em questão. Vamos pegar nosso serviço anteriormente criado e vamos adicionar um novo método chamado insertCadastro. Ele receberá como parâmetro, um objeto ActionData, interno do JCom onde nos permitirá recuperar os dados enviados pelo POST e também poder redirecionar o usuário para uma página qualquer, para informar que sua ação foi bem sucedida.
É necessário que se de import no pacote com.isnet.jcom.valueObjects e em javax.servlet.http.HttpServletRequest. Abaixo o código-fonte do método:
public String insertCadastro( ActionData data ){
HttpServletRequest request = data.getRequest();
String nome = request.getParameter("nome");
String email = request.getParameter("email");
String sexo = request.getParameter("sexo");
//fazemos o que quiser aqui
return request.getParameter("redirect");
}
Acessando banco de dados de forma personalizada
Aproveitaremos o exemplo anterior e ilustraremos aqui como realizar acesso a banco de dados de forma personalizada com o JCom. Podemos através do BSH, criar também classes de objetos e relaciona-la aos nossos serviços, que é o que faremos agora.
Com o auxílio da classe Database oferecida pela JCom, podemos facilmente gravar objetos, lista-los de uma forma muito facilitada. Podemos também, modificar nossa área de administração para que possamos manipular esses dados como em qualquer outro recurso oferecido pela JCom.
Para começar nosso estudo, vamos citar aqui os tipos de dados suportados para criar objetos personalizados para o JCom, são eles:
- String
- Date
- int
- int[]
Vamos agora criar uma classe chamada Cadastro dentro de nosso arquivo HelloService.bsh com a seguinte estrutura:
class Cadastro {
public String nome;
public String email;
public String sexo;
public Date nascimento;
public String getNome(){return nome;}
public void setNome(String nome){this.nome = nome;}
public String getEmail(){return email;}
public void setEmail(String email){this.email = email;}
public String getSexo(){return email;}
public void setSexo(String sexo){this.sexo = sexo;}
public Date getNascimento(){return nascimento;}
public void setNascimento(Date nascimento){this.nascimento = nascimento;}
}
É obrigatório para a JCom que as propriedades sejam públicas. Os métodos getters e setters serão usados pela administração. Agora devemos modificar no jcom.xml para declarar essa classe e preparar a interface para a administração:
<service name="helloService" source="/ext/HelloService.bsh" class="HelloService" beanClass="Cadastro" label="Cadastro" tableName="cadastro" listOrder="nome"> <grid> <column name="nome" label="Nome" align="left" width="50%"/> <column name="email" label="Email" align="left" width="50%"/> </grid> <form> <title label="Dados do Cadastrado"/> <field name="nome" label="Nome" type="string" size="35" required="true"/> <field name="email" label="Email" type="string"/> <field name="sexo" label="Sexo" type="select"> <item value="M" label="Masculino"/> <item value="F" label="Feminino"/> </field> <field name="nascimento" label="Nascimento" type="date"/> </form> </service>
Note que adicionamos novas propriedades na definição do serviço: beanClass, que indica qual é a classe que o serviço estará referenciando; label, que dá um nome para este serviço na administração; tableName indica o nome da tabela no banco de dados onde os dados serão gravados e finalmente, listOrder, que indica qual o campo será usado para ordenar os registros.
Logo abaixo, definimos o grid para listar os itens e o formulário para manipularmos os dados. A definição do grid é simples, já o fomulário é um pouco mais complexo. Temos a tag Title que pode ser usada mais uma vez para separar de forma mais lógica os itens do formulário e a tag field onde definimos cada campo do formulário e seu tipo de objeto para apresentar os dados. Temos os seguintes tipos:
- string: Para caixas de texto simples
- text: Para grande quantidade de dados String. Com este valor, é adicionado um editor de HTML.
- date: Para dados do tipo Date (timestamp no Postgres).
- select: Para listagem de um campo select com valores pre-definidos
- radio: Para listagem de campos do tipo radio com valores pre-definidos onde somente pode selecionar uma opção.
Para criar tabelas personalizadas para uso e serviços BSH no JCom, é necessário entrar em contato com a administração requisitando a tabela e apresentando seus dados e tamanhos. Para criar esta tabela, usaríamos o seguinte comando:
CREATE TABLE template1.cadastro ( id int4, nome varchar(255), email varchar(255), sexo varchar(1), nascimento timestamp ) WITHOUT OIDS;
Note que é de uso obrigatório um campo chamado id que será de autoincremento. Teremos então a seguinte estrutura:
Voltamos novamente para nosso cadastro que agora
<form action="" method=POST> <input type=hidden name="action" value="helloService.insertCadastro"> <input type=hidden name="redirect" value="/"> <table width="500px" border="0" cellspacing="2" cellpadding="2" summary="Cadastre aqui seus dados"> <h3>Cadastro</h3> <tr> <th> Nome</th> <td><input name="nome" type="text" id="nome" /></td> </tr> <tr> <th>Email</th> <td><input name="email" type="text" id="email" /></td> </tr> <tr> <th>Nascimento (dd/mm/aaaa)</th> <td><input name="nascimento" type="text" size="12" maxlength="12" id="nascimento" /></td> </tr> <tr> <th>Sexo</th> <td> <select name="sexo" size="1" id="sexo"> <option value="M">Masculino</option> <option value="F">Feminino</option> </select> </td> </tr> <tr> <th colspan="2"><input type="submit" name="Submit" value="Enviar" /></th> </tr> </table> </form>
Nada de mais, apenas acrescentamos um campo, agora devemos modificar nosso método inserirCadastro para que grave nossos dados no banco de dados. para isso, faremos uso da classe Database disponibilizada pela JCom. Importe os seguinte pacote e modifique o código do método para que fique como a seguir:
import com.isnet.jcom.dao.Database;
......
public String insertCadastro( ActionData data ){
HttpServletRequest request = data.getRequest();
SimpleDateFormat dateFmt = new SimpleDateFormat("dd/MM/yyyy");
String nome = request.getParameter("nome");
String email = request.getParameter("email");
String sexo = request.getParameter("sexo");
Date nascimento = dateFmt.parse( request.getParameter("nascimento") );
Cadastro c = new Cadastro();
c.setNome( nome );
c.setEmail( email );
c.setSexo( sexo );
c.setNascimento( nascimento );
Database.insertBean( c, "cadastro");
return request.getParameter("redirect");
}
Inserir dados é muito simples com esta classe, passamos o objeto e o nome da tabela onde os dados devem ser inseridos.Se acessarmos nossa área restrita, teremos no menu Outras opções uma seleção chamada cadastro, como exibido abaixo:
E nosso formulário de edição:
anterior

