Chamada a Aplicativos e Bibliotecas Externas – Parte 03
Neste artigo iremos finalizar a chamada a aplicativos e bibliotecas externas.
Chamada a Aplicativos e Bibliotecas Externas – Parte 03
Uso correto de Runtime.exec()
Vamos criar agora dois simples servlets que irão mostrar como utilizar corretamente os conceitos apresentados nesse artigo. Nosso primeiro servlet ira listar o conteúdo dos diretórios e mostrar na tela do browser o resultado de sua execução Nossa segunda servlet será um melhoramento da nossa primeira servlet, neste exemplo ele ira executar um script ao invés de executar somente um comando.
ExecServlet – Execução de Comandos e/ou Scripts
Listagem 4. ExecServlet
1.package br.com.javatel.webmobile;
2.import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Name: ExecServlet
* Autor: Paulo Campos
* Empresa: Javatel
*/
3.public class ExecServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
/*
* @see javax.servlet.http.HttpServlet#HttpServlet()
* método Construtor
*/
4.public ExecServlet() {
5.super();
6.}
/*
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest req, HttpServletResponse res)
* método doGet
* - Pega o comando a ser executado da requicao GET, executa
*o comando e depois mostra na tela o resultado
*/
7.protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
8.try{
9.String osName = System.getProperty("os.name" );
10.String[] cmd = new String[3];
11.boolean osFound = false;
12.PrintWriter out = res.getWriter();
13.if( osName.equals( "Windows 2000" ) ) {
14.cmd[0] = "cmd.exe" ;
15.cmd[1] = "/C" ;
16.cmd[2] = "dir /w";
16.1 //cmd[2] = "c:\\temp\\maketest.bat c:\\temp\\default c:\\temp\\mid1"; //SCRIPT
17.osFound = true;
18. } else if( osName.equals( "Linux" ) ) {
19.cmd[0] = "/bin/sh” ;
20.cmd[1] = "ls” ;
20.1//cmd[1] = "maketest.sh” ; //SCRIPT
21.cmd[2] = "-la";
21.1//cmd[2] = " /home/javatel/default /home/javatel/mid1"; //SCRIPT
22.osFound = true;
23.} else {
24.osFound = false;
25.}
26.if(osFound){
27.Process p = Runtime.getRuntime().exec(cmd);
28.InputStream stdin = p.getInputStream();
29. BufferedReader br = new BufferedReader(new InputStreamReader(stdin));
30.String line = null;
31.while ( (line = br.readLine()) != null)
32. out.println(line + "<br>");
33.int exitVal = p.waitFor();
34.out.println("Status do Termino da aplicação: " + exitVal);
35.}else{
36. out.println("Erro ao identificar o Sistema Operacional");
37.}
38.} catch(IllegalThreadStateException e) {
39.e.printStackTrace();
40.} catch (InterruptedException e) {
41.e.printStackTrace();
42.} catch (Exception e) {
43.e.printStackTrace();
44.}
45.}
46.}
O resultado da excussão dessa servlet pode ser visto abaixo na Figura 1
Figura 1. Resultado de Execução do Servlet “ExecServlet”
Explicação do Código Fonte - ExecServlet
Abaixo segue uma breve explicação sobre o código fonte do servlet ExecServlet, repare que no próprio código fonte existem alguns comentários bem úteis também.
(Obs.: Somente as linhas relevantes serão comentadas pois o foco desse artigo é a execução de comandos utilizando Runtime.exec() e não a criação de servlets)
Linha 8 e 38 - 44: Abre um bloco try/catch para conseguir pegar as exceções caso elas ocorram
Linha 9: Descobre qual o sistema operacional do usuário
Linha 13 - 25: Descobre qual o sistema operacional do usuário e configura os comandos conforme o
mesmo
Linha 26 e 35 - 37: Se o sistema operacional tiver sido detectado corretamente executa os comandos a
seguir senão, exibe uma mensagem de erro.
Linha 27: Cria um sub processo e executa os comandos e parâmetros contidos no array “cmd”
Linha 28: Cria um fluxo de entrada e associa ele ao fluxo de entrada do sub processo
Linha 29: Cria um leitor com buffer a partir de um leitor de fluxo de entrada que é criado a partir do fluxo
de entrada criado na Linha 10
Linha 30: Cria a String “line” onde o programa armazenara a linha lida através do leitor criado na linha 11
Linha 31 - 32: Lê o conteúdo do leitor criado na linha 11 e o coloca na variável “line” criada na linha 12
enquanto não receber um valor null (que indica o fim do fluxo) e depois imprime no console o
valor da linha lida
Linha 33: Recebe o valor do status do fim da execução do sub processo
Linha 34: Imprime na tela o valor do status do fim da execução
Comentários
Utilizando o código fonte da servlet apresentada aqui, você já tem como criar um servlet e/ou aplicativo para executar operações mais complexas. Vou dar um exemplo prático: Cada dispositivo móvel tem sua dimensão de tela específica, portanto, coloquei em um banco de dados as marcas e modelos dos dispositivos, o tamanho da tela, e mais algumas informações úteis. Quando o device conecta na minha servlet, ele é identificado e automaticamente, utilizando Runtime.exec() e alguns scripts criados, ele gera uma midlet especifica para o device que conectou com as respectivas altura x largura de tela, logo redimensionado, entre outras coisas.
Conclusões
Utilize o método Runtime.Exec() com sabedoria evitando as armadilhas descritas nesse artigo e sabendo de suas limitações e você terá uma poderosa ferramenta em suas mãos. Não se esqueça que utilizando esse método sua aplicação perderá portabilidade, porém, ganhará funcionalidades que compensam essa perda.
Na próxima edição mostraremos como utilizar uma biblioteca nativa dentro de um programa Java. Aguardem!
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo