Arquivo de novembro, 2014

SAP MaxDB – Soluções Enterprise com Java

Publicado: 13 de novembro de 2014 em Abap, Java

SAP MaxDB é um banco de dados estratégico criado para rodar em todas as soluções SAP e substituir os bancos de dados Oracle, IBM DB2 e MSSQL Server  tornando as soluções SAP mais acessíveis em termos de custo para clientes de grande e médio porte. O SAP MaxDB foi construído como uma solução open source baseado em MySQL sob a licença GNU GPL, as versão anteriores do MaxDB ainda são mantidas pela comunidade open source mas a SAP não contribui mais com estas versões.

Ao longo dos últimos anos, a tecnologia SAP MaxDB continuou a evoluir com investimentos muito significativos em inovações e essas inovações não são em código aberto. Assim o mais recente produto SAP MaxDB não é open source, entretanto ele é gratuito em sua versão comunitária para uso com aplicações não SAP e possui licença comercial para uso com aplicações SAP.

Com 40 anos de inovação atuando em mais de 130 países e com mais de 100 mil clientes que utilizam soluções SAP, o SAP MaxDB ainda é um banco de dados jovem mas conta com mais de 6.500 clientes em 15.000 instalações mais soluções que utilizam liveCache e Content Server.

SAP MaxDB: http://maxdb.sap.com/

Softwares Requeridos

Para utilizar este walkthrough completo integrando uma solução Java com a linguagem de programação ABAP, você precisa instalar vários software entres eles o NetWeaver Application Server ABAP no qual já possui uma instalação completa do ambiente de desenvolvimento SAP com uma instancia do banco de dados MaxDB, caso queira utilizar somente o lado Java você pode baixar o SAP MaxDB diretamente da SAP Store:

NetWeaver Application Server ABAP: Mini SAP

Download SAP MaxDB sistemas não SAP: SAP Store

SAP MaxDB SQL Studio: Desenvolvimento Aberto walkthrough

 SAP MaxDB JDBC Drivers

A instalação do SAP MaxDB incluída nos produtos SAP como o núcleo de desenvolvimento do sistema SAP R/3 chamado de NetWeaver Application Sever ABAP já comtempla os Drivers Java para que você possa acessar o banco de dados MaxDB.

C:\sapdb\NSP\db\runtime\jar
C:\sapdb\NSP\db\doc\FirstSteps\Java

SAP MaxDB JDBC Drivers: Documentação.

Conectando ao MaxDB em instancia SAP com Java

1 – Caso utilize este tutorial com o NetWeaver primeiro tenha certeza que servidor de aplicação e a instancia SAP do banco de dados está rodando, caso utilize apenas o MaxDb e Java ignore este passo:

SAP - Servidor de Aplicação - e Banco de dados - NetWeaver/MaxDB

SAP – Servidor de Aplicação – e Banco de dados – NetWeaver/MaxDB

2 – Abra o SQL Studio utilizando o servidor MaxDB e o banco de dados NSP ou seu próprio banco de dados caso não utilize o sistema SAP:

NSP - NetWeaver Database

NSP – NetWeaver Database

3 – Crie uma tabela Z que significa uma tabela não SAP Standard que não será transparente no conceito do dicionário de dados do sistemas SAP para isto utilize o script logo abaixo, não se assuste para desenvolvedores não SAP isto é apenas uma tabela comum do banco de dados:

Tabela Não Transparente

Tabela Z Não Transparente

4 – Utilize o Driver descrito acima, através da opção propriedades do seu projeto Java e adicione o arquivo sapdbc.jar nas bibliotecas externas do seu projeto:

Bibliotecas Externas

Bibliotecas Externas

5 – Utilize o código abaixo na IDE Eclipse:

Eclipse - SAPDBC

Eclipse – SAPDBC

 

6 – Compile o programa para manipular dados utilizando o SAP MaxDB:

MaxDB - Java - Programa

MaxDB – Java – Programa

7 – Para utilizar o ABAP para ler ou gravar dados nesta mesma tabela não transparente utilizando uma Stored Procedure no MaxDB através de códigos Native SQL, utilize o link abaixo para o procedimento ABAP:

Stored Procedure - Abap

Stored Procedure – Abap

Programa SAP – ABAP Native SQL: MaxDB Stored Procedure parâmetros IN e OUT

 Caso conecte em um banco de dados MaxDB utilizando soluções SAP tenha em mente que você deve respeitar o conceito de dados dos sistemas SAP e verificar os termos de garantia de cada produto SAP, visto que este método ao contrario do RFC  ignora a camada de banco de dados SAP e o dicionário de dados ABAP.

Como você pode verificar na imagem acima no ambiente ABAP o valor flutuante não vem formatado por padrão como estão acostumados os desenvolvedores SAP que utilizam instruções Open SQL e o dicionário ABAP no entanto você pode utilizar campos criados no dicionário apenas para a manipulação do valor de saída da Stored Procedure neste caso você deve alinhar os tipos de dados entre as aplicações Java e aplicações ABAP.

Exemplo:

Neste exemplo utilizamos a linguagem de programação Java para se conectar ao banco de dados SAP MaxDB em uma instancia do banco de dados do NetWeaver e integrar uma tabela não transparente que pode ser manipulada tanto do lado Java como dentro do sistema SAP utilizando Native SQL.

SQL – SAP MaxDB

-- Cria tabela no schema SAPNSP
CREATE TABLE SAPNSP.ZFUNCIONARIO
(
            ID_FUNCIONARIO INT,
            NOME VARCHAR (30),
            SOBRENOME VARCHAR(70),
            CARGO VARCHAR(30),
            SALARIO DECIMAL(9,2)
)
 
-- Insere dados na tabela
Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56)
Insert into SAPNSP.ZFUNCIONARIO values (2,'Bill','Jobs','Diretor',5143.71)

Java

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ConectarMaxDB implements ActionListener, ItemListener {
	// Cria componentes
	private JTable tabela;
	private JRadioButton banco1;
	private JButton botao;

	// Declara objetos de conexão
	private static Connection conn;
	private static Statement query;
	private static String bancodedados;

	public void conectar(String login, String senha) {

		// Verifica strings de conexão
		// SAP MaxDB
		// Utilize senhas com caracteres UPPERCASE
		if (bancodedados == "maxdb") {
			try {
				// Define Driver de conexão JDBC SAP MaxDB
				Class.forName("com.sap.dbtech.jdbc.DriverSapDB");

				// Servidor / Banco de Dados
				conn = DriverManager.getConnection(
						"jdbc:sapdb://localhost/NSP", login, senha);

				// Executa pedido SQL
				query = conn.createStatement();

			}

			catch (ClassNotFoundException ex) {
				ex.printStackTrace();
			}

			catch (SQLException ex) {
				ex.printStackTrace();
			}
		}
	}

	public ResultSet retornaTabela() throws SQLException {
		// Cria uma nova conexão
		Statement query;
		query = conn.createStatement();
		String sql;

		sql = "Select * from SAPNSP.ZFUNCIONARIO";

		// Executa Script
		ResultSet dados = query.executeQuery(sql);

		// Retorna set de dados
		return dados;
	}

	// Modelo
	public static DefaultTableModel criaTableModel(ResultSet rs)
			throws SQLException {

		// Cria um modelo de tabela
		ResultSetMetaData metaData = rs.getMetaData();

		// Retorna as colunas
		Vector<String> colunas = new Vector<String>();

		int columnCount = metaData.getColumnCount();

		for (int column = 1; column <= columnCount; column++) {
			colunas.add(metaData.getColumnName(column));
		}

		// Retorna dados
		Vector<Vector<Object>> dados = new Vector<Vector<Object>>();

		while (rs.next()) {
			Vector<Object> vector = new Vector<Object>();

			for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
				vector.add(rs.getObject(columnIndex));
			}
			dados.add(vector);
		}

		return new DefaultTableModel(dados, colunas);

	}

	public void itemStateChanged(ItemEvent arg0) {

		// Verifica item banco de dados selecionado
		Object fonte = arg0.getItemSelectable();
		int estado = arg0.getStateChange();

		if (estado == arg0.SELECTED) {

			if (fonte == banco1) {
				bancodedados = "maxdb";
			}

		}

	}

	public void actionPerformed(ActionEvent arg0) {
		// Efetua login no banco de dados
		ConectarMaxDB acesso = new ConectarMaxDB();

		// SAP MaxDB utiliza senhas com caracteres maiusculos (UPPERCASE)
		if (bancodedados == "maxdb") {
			acesso.conectar("SAPNSP", "PASSWORD");
		}

		try {
			tabela.setModel(criaTableModel(acesso.retornaTabela()));
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public Container criaPainel() throws SQLException {
		// Cria painel principal
		JPanel painel = new JPanel();

		// Seleciona layout
		painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS));
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

		// Cria painel de escolha de conexão
		JPanel pescolha = new JPanel();

		pescolha.setLayout(new BoxLayout(pescolha, BoxLayout.LINE_AXIS));
		pescolha.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

		ButtonGroup grupo = new ButtonGroup();

		// Cria componentes de radio
		banco1 = new JRadioButton("SAP MaxDB");

		// Agrupa botões de radio
		grupo.add(banco1);

		// Cria ouvinte dos botões
		banco1.addItemListener(this);

		// Seleciona primeira conexão
		banco1.setSelected(true);

		// Adiciona botões ao painel
		pescolha.add(banco1);

		// Efetua primeira conexão ao banco (SAP MAXDB)
		// SAP MaxDB utiliza senhas com caracteres maiusculos (UPPERCASE)
		ConectarMaxDB acesso = new ConectarMaxDB();
		acesso.conectar("SAPNSP", "PASSWORD");

		// Cria modelo de tabela
		tabela = new JTable(criaTableModel(acesso.retornaTabela()));

		// Adiciona um painel de rolagem
		JScrollPane rolar = new JScrollPane(tabela);

		// Cria painel do botão
		JPanel pbotao = new JPanel();

		// Seleciona layout
		pbotao.setLayout(new BoxLayout(pbotao, BoxLayout.PAGE_AXIS));

		// cria botão
		botao = new JButton("Ler dados");
		botao.addActionListener(this);

		// Adiciona botão ao painel
		pbotao.add(botao);

		// componentes ao painel principal
		painel.add(pescolha);
		painel.add(rolar);
		painel.add(Box.createVerticalStrut(10));
		painel.add(pbotao);

		return painel;
	}

	public static void criaGUI() {
		// Cria formulario
		JFrame formulario = new JFrame("SAP MaxDB - Acessando Dados");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria painel de conteudo
		ConectarMaxDB acesso = new ConectarMaxDB();

		try {
			formulario.setContentPane(acesso.criaPainel());
		}

		catch (SQLException e) {
			e.printStackTrace();
		}

		// Exibe o formulario
		formulario.pack();
		formulario.setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// Cria e mostra a GUI
				criaGUI();

			}
		});
	}
}

SAP MaxDB é um banco de dados estratégico criado para rodar em todas as soluções SAP e substituir os bancos de dados Oracle, IBM DB2 e MSSQL Server  tornando as soluções SAP mais acessíveis em termos de custo para clientes de grande e médio porte. O SAP MaxDB foi construído como uma solução open source baseado em MySQL sob a licença GNU GPL, as versão anteriores do MaxDB ainda são mantidas pela comunidade open source mas a SAP não contribui mais com estas versões.

Ao longo dos últimos anos, a tecnologia SAP MaxDB continuou a evoluir com investimentos muito significativos em inovações e essas inovações não são em código aberto. Assim o mais recente produto SAP MaxDB não é open source, entretanto ele é gratuito em sua versão comunitária para uso com aplicações não SAP e possui licença comercial para uso com aplicações SAP.

Com 40 anos de inovação atuando em mais de 130 países e com mais de 100 mil clientes que utilizam soluções SAP, o SAP MaxDB ainda é um banco de dados jovem mas conta com mais de 6.500 clientes em 15.000 instalações mais soluções que utilizam liveCache e Content Server.

SAP MaxDB: http://maxdb.sap.com/

SAP MaxDB e Python

O Python é uma poderosa linguagem de scripts que já vem se destacando a algum tempo em aplicações para web e ambiente corporativos, a maior empresa de soluções corporativas não poderia deixar de integrar sua aplicações e utilizar os vários benéficos da linguagem de programação Python e da sua crescente comunidade de desenvolvedores.

A SAP disponibiliza módulos para utilizar o MaxDB com a linguagem de programação Python utilizando os sistemas operacionais Unix, Linux e Windows, possibilitando integrar soluções Enterprise SAP que utilizam o banco de dados MaxDB com aplicações escritas em Python ou permite que aplicações Python utilizem o SAP MaxDB gratuitamente também em soluções que não possuem o intuito de integrar dados com os sistemas SAP.

Wiki Python: Sap MaxDB

IMPORTANTE:  Para utilizar este walkthrough completo integrando uma solução Python com a linguagem de programação ABAP, você precisa instalar vários software entres eles o NetWeaver Application Server ABAP no qual já possui uma instalação completa do ambiente de desenvolvimento SAP com uma instancia do banco de dados MaxDB, caso queira utilizar somente o lado Python você pode baixar o SAP MaxDB diretamente da SAP Store:

NetWeaver Application Server ABAP: Mini SAP

Download SAP MaxDB sistemas não SAP: SAP Store

SAP MaxDB SQL Studio: Desenvolvimento Aberto walkthrough

Módulos Python e Drivers ODBC

A instalação do SAP MaxDB incluída nos produtos SAP como o núcleo de desenvolvimento do sistema SAP R/3 chamado de NetWeaver Application Sever ABAP já comtempla módulos Python para que você possa acessar o banco de dados MaxDB porem a instalação suporta apenas a versão Python 2.3 e se encontra no seguinte local:

C:\sapdb\clients\NSP\lib\python2.3
C:\sapdb\NSP\db\doc\FirstSteps\Python

No entanto o banco de dados possui drivers ODBC para que você se conecte com qualquer versão do Python, você encontra detalhes sobre os módulos Python mais recentes e vários exemplos neste link:

MaxDB Python Modules: SAP Manual Python

Conectando ao MaxDB em instancia SAP com Python

1 – Caso utilize este tutorial com o NetWeaver primeiro tenha certeza que servidor de aplicação e a instancia SAP do banco de dados está rodando, caso utilize apenas o MaxDb e Python ignore este passo:

SAP - Servidor de Aplicação - e Banco de dados - NetWeaver/MaxDB

SAP – Servidor de Aplicação – e Banco de dados – NetWeaver/MaxDB

2 – Abra o SQL Studio utilizando o servidor MaxDB e o banco de dados NSP ou seu próprio banco de dados caso não utilize o sistema SAP:

NSP - NetWeaver Database

NSP – NetWeaver Database

3 – Crie uma tabela Z que significa uma tabela não SAP Standard que não será transparente no conceito do dicionário de dados do sistemas SAP para isto utilize o script logo abaixo, não se assuste para desenvolvedores não SAP isto é apenas uma tabela comum do banco de dados:

Tabela Não Transparente

Tabela Z Não Transparente

4 – Como estamos utilizando uma versão mais recente do Python utilizaremos os drivers ODBC do MaxDB. No painel de controle escolha ferramentas administrativas e fonte de dados ODBC de 64bit, em drivers verifique seu driver NSP:

Driver SAP MaxDB ODBC 64bit

Driver SAP MaxDB ODBC 64bit

5 – Crie uma nova fonte de dados do usuário escolha o driver NSP ou o driver apropriado e clique em concluir:

Fonte de Dados do Usuário

Fonte de Dados do Usuário

6 – Preencha os dados de conexão com o servidor e o banco de dados:

Dados do DNS da conexão

Dados do DNS da conexão

7 – Clique em testar a conexão e alimente o usuário e senha para o banco de dados:

Testar Conexão - Usuário e Senha

Testar Conexão – Usuário e Senha

8 – Com tudo funcionando conclua a conexão:

Conexão OK

Conexão OK

9 – Utilize o código abaixo para manipular dados utilizando o SAP MaxDB:

MaxDB - Programa Python

MaxDB – Programa Python

10 – Para utilizar o ABAP para ler ou gravar dados nesta mesma tabela não transparente utilizando uma Stored Procedure no MaxDB através de códigos Native SQL, utilize o link abaixo para o procedimento ABAP:

Stored Procedure - Abap

Stored Procedure – Abap

Programa SAP – ABAP Native SQL: MaxDB Stored Procedure parâmetros IN e OUT

 Caso conecte em um banco de dados MaxDB utilizando soluções SAP tenha em mente que você deve respeitar o conceito de dados dos sistemas SAP e verificar os termos de garantia de cada produto SAP, visto que este método ao contrario do RFC  ignora a camada de banco de dados SAP e o dicionário de dados ABAP.

Como você pode verificar na imagem acima no ambiente ABAP o valor flutuante não vem formatado por padrão como estão acostumados os desenvolvedores SAP que utilizam instruções Open SQL e o dicionário ABAP no entanto você pode utilizar campos criados no dicionário apenas para a manipulação do valor de saída da Stored Procedure neste caso você deve alinhar os tipos de dados entre as aplicações Python e aplicações ABAP.

Exemplo:

Neste exemplo utilizamos a linguagem de programação Python para se conectar ao banco de dados SAP MaxDB em uma instancia do banco de dados do NetWeaver e integrar uma tabela não transparente que pode ser manipulada tanto do lado Python como dentro do sistema SAP utilizando Native SQL.

SQL – SAP MaxDB

-- Cria tabela no schema SAPNSP
CREATE TABLE SAPNSP.ZFUNCIONARIO
(
            ID_FUNCIONARIO INT,
            NOME VARCHAR (30),
            SOBRENOME VARCHAR(70),
            CARGO VARCHAR(30),
            SALARIO DECIMAL(9,2)
)

-- Insere dados na tabela
Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56)
Insert into SAPNSP.ZFUNCIONARIO values (2,'Bill','Jobs','Diretor',5143.71)

Python

#!/usr/bin/env python
# -*- coding: cp1252 -*-
# Desenvolvimento Aberto
# MeuSAPMaxDB.py

# importa modulos
from Tkinter import *
import tkMessageBox
import odbc

# Cria formulario
formulario = Tk(className='.::SAP MaxDB - Desenvolvimento Aberto')
formulario.geometry("550x300+300+300")

# Cria janela para menssagem
janela = Tk()
janela.wm_withdraw()

# Cria conexão com o banco de dados
def conectar():
    # Conexão SAPMaxDB
    # SAP MaxDb Drivers necessita que o password seja
    # convertido para letras maisculas (UPPERCASE)
    # Coloque somente caracteres maiusculos no exemplo
    # trate este requerimento no seu codigo fonte
    sconexao =  "SapMaxDB/SAPNSP/password"
    try:
        con = odbc.odbc(sconexao)
    except ValueError:
        tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela)
    return con

# Executa e retorna cursor
def retornaFuncionarioID(sql, con):
    cursor = con.cursor()
    cursor.execute(sql)
    return cursor

# Evento do botão
def on_Pesquisar():
    # Exibe banco de dados
    titulo['text'] = "Database: SAP MaxDB"

    # Cria conexão
    con = conectar()

    # Define e executa SQL
    sql = "Select * From SAPNSP.ZFUNCIONARIO Where  ID_FUNCIONARIO = " + tpesquisa.get()
    tabela = retornaFuncionarioID(sql, con)

    # Retorna dados
    dados = tabela.fetchone()

    # Exibe dados
    tcodigo.insert(0, str(dados[0]))
    tpnome.insert(0, dados[1])
    tsnome.insert(0, dados[2])
    tcargo.insert(0, dados[3])
    tsalario.insert(0, str(dados[4]))

# Cria componentes widgets
titulo = Label(formulario, text="Database: Nenhum")
separador1 = Frame(height=2, bd=1, relief=SUNKEN)
separador2 = Frame(height=2, bd=1, relief=SUNKEN)

# labels
lcodigo = Label(formulario, text="Codigo:")
lpnome = Label(formulario, text="Nome:")
lsnome = Label(formulario, text="Sobrenome:")
lcargo = Label(formulario, text="Cargo:")
lsalario = Label(formulario, text="Salario:")
# Entry
tcodigo = Entry(formulario)
tpnome = Entry(formulario, width=50)
tsnome = Entry(formulario, width=40)
tcargo = Entry(formulario, width=30)
tsalario = Entry(formulario)
# Pesquisa
lpesquisa = Label(formulario, text="Pesquisa:")
tpesquisa = Entry(formulario)
botao = Button(formulario, text = "Pesquisar", command=on_Pesquisar)

# Define Layout
titulo.grid(row=0, sticky=W+E+N+S, pady=20)
separador1.grid(row=1, sticky=W+E+N+S, pady=5, columnspan=4)
lcodigo.grid(row=2, sticky=W, padx=20)
tcodigo.grid(row=2, column=1, sticky=W, pady=5)
lpnome.grid(row=3, sticky=W, padx=20)
tpnome.grid(row=3, column=1, sticky=W, pady=5)
lsnome.grid(row=4, sticky=W, padx=20)
tsnome.grid(row=4, column=1, sticky=W, pady=5)
lcargo.grid(row=5, sticky=W, padx=20)
tcargo.grid(row=5, column=1, sticky=W, pady=5)
lsalario.grid(row=6, sticky=W, padx=20)
tsalario.grid(row=6, column=1, sticky=W, pady=5)
separador2.grid(row=7,sticky=W+E+N+S, pady=5, columnspan=4)
# Layout pesquisa
lpesquisa.grid(row=8, column=0, pady=20)
tpesquisa.grid(row=8, column=1, pady=20)
botao.grid(row=8, column=2,pady=20)

# loop do tcl
mainloop()

Sabendo que a tecnologia Java Server Pages proporcionada pelo servidor de aplicação Tomcat nos possibilita criar aplicações web dinâmicas utilizando JavaBeansServlets, vamos então criar um motor básico que utiliza o principio usado por quase todas as aplicações web para o mundo corporativo, ou seja manipulação de dados.

Em aplicações Enterprise os dados na grande maioria das vezes é manipulado através de um servidor de banco de dados relacional, entretanto neste primeiro exemplo vamos utilizar um objeto Java que possibilita a criação de listas para manipular os dados, ressaltando o que realmente nos interessa neste momento é apenas o esqueleto de uma simples aplicação que mostra, adiciona, edita e deleta dados através de uma interface com o usuário.

Java - Mostar - Adicionar - Editar e Apagar

Java – Mostar – Adicionar – Editar e Apagar

Exemplo:

Neste exemplo utilizaremos um JavaBean que manipula dados através de um objeto List do Java e usamos Servlets para criar a interface com o usuário e manipular as ações requisitadas de entrada, edição e exclusão de dados. Utilize os comentários nos códigos abaixo para entender os processos e técnicas utilizadas.

Java

MeuJavaBean – Manipula Dados

package org.desenvolvimento.aberto;

public class MeuJavaBean {
	// Declara atributo
	private String nome;
	private String comentario;

	// Construtor Default da classe
	public MeuJavaBean() {

	}

	// Construtor Overload
	public MeuJavaBean(String nome, String comentario) {
		this.nome = nome;
		this.comentario = comentario;
	}

	// Métodos Getter e Setter
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getComentario() {
		return comentario;
	}

	public void setComentario(String comentario) {
		this.comentario = comentario;
	}

}

MeuJServlet – Mostra Dados (Página Principal)

package org.desenvolvimento.aberto;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Ler Servlet ao iniciar
@WebServlet(urlPatterns="/MeuJServlet", loadOnStartup = 1)

public class MeuJServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public MeuJServlet() {
		super();
	}

	public void init(ServletConfig config) throws ServletException {		

		// Inicia configuração
		super.init(config);

		// Cria uma Lista com o objeto JavaBean
		List<MeuJavaBean> registros = new ArrayList<MeuJavaBean>();

		// Insere dados na lista
		registros.add(new MeuJavaBean("Ricardo", "Olá Pessoal"));
		registros.add(new MeuJavaBean("Mantovani",
				"Bem-vindos ao Desenvolvimento Aberto, adicione, altere e exclua dados desta tabela"));

		// Define um atributo para o contexto do servlet
		getServletContext().setAttribute("registros", registros);

	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera contexto do JavaBean
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros =  (List<MeuJavaBean>) getServletContext().getAttribute("registros");

		// Cria página HTML
		PrintWriter html = response.getWriter();

		html.println("<!DOCTYPE html>");
		html.println("<head><Title>Desenvolvimento Aberto</title>");

		// CSS
		html.println("<style>");
		html.println("td, th {");
		html.println("border: none;");
		html.println("background-color: #dddddd;");
		html.println("padding: 5px;");
		html.println("width: 200px; }");

		html.println("</style>");
		html.println("</head>");

		//  Corpo da página
		html.println("<html>");
		html.println("<body>");
		html.println("<h1>Desenvolvimento Aberto - Beans e Servlets</h1>");

		// Cria tabela
		html.println("<table>");
		html.println("<tr>");
		html.println("<th>Nome:</th>");
		html.println("<th>Comentário:</th>");
		html.println("<th>Ação:</th>");
		html.println("</tr>");

		for (int id = 0; id < registros.size(); id++) {

			// Recupera identificador
			MeuJavaBean reg = registros.get(id);

			html.println("<tr>");
			html.println("<td>" + reg.getNome() + "</td>");
			html.println("<td>" + reg.getComentario() + "</td>");

			// Link de edição
			html.println("<td><center>");
			html.println("<a href='MeuServletEditar?identificador=" + id + "'>Editar</a> | ");
			html.println("<a href='MeuServletApagar?identificador=" + id + "'>Apagar</a>");
			html.println("</center></td>");

			html.println("</tr>");
		}

		html.println("</table>");

		// Define link para formulario de adicionar dados (Servlet)
		html.println("<P> <a href='MeuServletAdd'>Adicione um comentário</a> </p>");

		html.println("</body>");
		html.println("</html>");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Chama método GET
		doGet(request, response);
	}

}

MeuServletAdd – Adiciona Dados

package org.desenvolvimento.aberto;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MeuServletAdd")
public class MeuServletAdd extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public MeuServletAdd() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Mostra pagina HTML
		response.setContentType("text/html");

		PrintWriter html = response.getWriter();

		html.println("<html>");
		html.println("<body>");
		html.println("<h1>Desenvolvimento Aberto</h1>");
		html.println("<h2>Servlet - Adiciona Dados</h2>");

		// Formulário processa este mesmo Servlet e o método DoPost
		html.println("<form action='MeuServletAdd' method='post'>");
		html.println("Nome: <input type='text' name='nome' size ='55' /> <br>");
		html.println("<textarea name='comentario' cols='50' rows='7'></textarea> <br>");
		html.println("<input type='submit' name='adiciona' value='Adicionar'/> <br>"); 

		html.println("</form>");
		html.println("</body>");
		html.println("</html>");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera parâmetros
		String nome = request.getParameter("nome");
		String comentario = request.getParameter("comentario");

		// Recupera Lista Registros
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros =  (List<MeuJavaBean>) getServletContext().getAttribute("registros");

		// Adiciona dados ao Bean
		registros.add(new MeuJavaBean(nome, comentario));

		// Redireciona para o Servlet principal
		response.sendRedirect("MeuJServlet");

	}

}

MeuServletEditar – Edita Dados

package org.desenvolvimento.aberto;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MeuServletEditar")
public class MeuServletEditar extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// Cria identificador
	private static int id;

	public MeuServletEditar() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera Lista Registros
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros = (List<MeuJavaBean>) getServletContext()
				.getAttribute("registros");

		// Recupera registro por ID
		id = Integer.parseInt(request.getParameter("identificador"));

		MeuJavaBean reg = registros.get(id);

		// Mostra pagina HTML
		response.setContentType("text/html");

		PrintWriter html = response.getWriter();

		html.println("<html>");
		html.println("<body>");
		html.println("<h1>Desenvolvimento Aberto</h1>");
		html.println("<h2>Servlet - Editar Dados</h2>");

		// Formulário processa este mesmo Servlet e o método DoPost
		html.println("<form action='MeuServletEditar' method='post'>");
		html.println("Nome: <input type='text' name='nome' size ='55' value='"
				+ reg.getNome() + "'/> <br>");
		html.println("<textarea name='comentario' cols='50' rows='7'>"
				+ reg.getComentario() + "</textarea> <br>");
		html.println("<input type='submit' name='altera' value='Alterar'/> <br>");

		html.println("</form>");
		html.println("</body>");
		html.println("</html>");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera parâmetros
		String nome = request.getParameter("nome");
		String comentario = request.getParameter("comentario");

		// Recupera Lista Registros
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros = (List<MeuJavaBean>) getServletContext()
				.getAttribute("registros");

		// Altera dados ao Bean
		registros.get(id).setNome(nome);
		registros.get(id).setComentario(comentario);

		// Redireciona para o Servlet principal
		response.sendRedirect("MeuJServlet");

	}

}

MeuServletApagar – Apaga Dados

package org.desenvolvimento.aberto;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MeuServletApagar")
public class MeuServletApagar extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public MeuServletApagar() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera Lista Registros
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros = (List<MeuJavaBean>) getServletContext()
				.getAttribute("registros");

		// Recupera registro por ID
		int id = Integer.parseInt(request.getParameter("identificador"));

		// Remove identificador e redireciona Servlet
		registros.remove(id);

		// Redireciona para o Servlet principal
		response.sendRedirect("MeuJServlet");

	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	}

}

 

O Document Object Model (DOM) ou modelo de objeto de documento é uma convenção multi-plataforma e independente de linguagem para representação e interação com objetos em documentos HTML, XHTML e XML. Os nós de cada documento são organizados em uma estrutura de árvore, chamada de árvore DOM. Os objetos na árvore DOM podem ser endereçados e manipulados pelo uso de métodos sobre os objetos. A interface pública de um DOM é especificada em sua interface de programação de aplicações (API). O JQuery possibilita através de seus métodos de manipulação a capacidade de manusear vários tipos de operações sobre os objetos DOM.

DOM: http://www.w3.org/DOM/

  • append() – Adiciona um elemento no parâmetro especificado no final do elemento.
  • remove() – Remove um elemento do DOM.

Você pode saber mais sobre manipulações DOM no seguinte link:

DOM: http://api.jquery.com/category/manipulation/

JQuery - DOM

JQuery – DOM

Exemplo:

Neste exemplo utilizamos métodos de manipulação para inserir e remover elementos  no modelo de objeto do documento .

JQuery


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8" />
    <title>Desenvolvimento Aberto</title>
    <style type="text/css">
     .imagem {
            border-style: double;
            border-width: 10px;
            width: 500px;
            height: 200px;

        }
    </style>

    <!-- Está é uma instalação do JQuery, você apenas precisa apontar
         para o respectivo script da versão que você deseja utilizar -->

   <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"> </script>

   <!-- Este é um script JQuery básico que manipula o CSS e um evento de clique.
        Todo o script roda no evento equivalent ao OnLoad da pagina html-->   

   <script>

   // Declara eventos de clique
   $( document ).ready(function() {

       $(".imagem").append("<p>Este é um elemento adicionado na arvore DOM</p>");
       // Manipulação de atributos

       $( "#bnt01" ).click(function() {
           $("div").addClass("imagem");
           });

       $( "#bnt02" ).click(function() {
           $("div").removeClass("imagem");
           });            

       $( "#bnt03" ).click(function() {
           $(".imagem").remove();
           });
    });       

   </script>
</head>

<body>

<h1>Desenvolvimento Aberto - DOM</h1>

    <div class="imagem"
         ></div>
<p>
    Escolha uma opção:
    </p>
<button id="bnt01">Adicionar Classe CSS</button>
<button id="bnt02">Remover Classe CSS</button>
<button id="bnt03">Remover Elemento DOM</button>

</body>
</html>

O JQuery possui métodos para que você possa manipular elementos e seus atributos de varias maneiras diferentes, permitindo que você adicione, copie ou remova atributos dos elementos.

  • addClass() – Adiciona classes especificadas nos elementos designados.
  • removeClass() – Remove classes especificadas nos elementos designados.

Você pode saber mais sobre outros métodos de manipulação de atributos no seguinte link:

Manipulation: http://api.jquery.com/category/manipulation/

JQuery - Manipulação

JQuery – Manipulação

Exemplo:

Neste exemplo utilizamos o recurso de manipulação para inserir e remover uma classe CSS nos atributos da imagem.

JQuery

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <meta charset="utf-8" />
        <title>Desenvolvimento Aberto</title>
        <style type="text/css">
         .imagem {
                border-style: dashed;
                border-width: 10px;
            }
        </style>

        <!-- Está é uma instalação do JQuery, você apenas precisa apontar
             para o respectivo script da versão que você deseja utilizar -->

       <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"> </script>

       <!-- Este é um script JQuery básico que manipula o CSS e um evento de clique.
            Todo o script roda no evento equivalent ao OnLoad da pagina html-->    

       <script>

       // Declara eventos de clique
       $( document ).ready(function() {

           // Manipulação de atributos

           $( "#bnt01" ).click(function() {
               $("img").addClass("imagem");
               });

           $( "#bnt02" ).click(function() {
               $("img").removeClass("imagem");
               });           

        });       

       </script>
    </head>

    <body>

    <h1>Desenvolvimento Aberto - Manipulação de Atributos</h1>

    <img src="Imagem/tecnologia.jpg" alt="tecnologia">
    <p>
        Escolha uma opção:
        </p>
    <button id="bnt01">Adicionar Classe CSS</button>
    <button id="bnt02">Remover Classe CSS</button>

    </body>
    </html>

Um servidor de aplicação Java processa paginas JSP e a transforma em um Servlet, mesmo o mais simples código HTML contido em uma pagina JSP é transformado em um Servlet pelo servidor de aplicação, após a obtenção do Servlet este é compilado para uma linguagem intermediaria chamada de ByteCode que então é interpretada pela maquina virtual Java responsável por executar a aplicação.

Com ajuda do servidor de aplicação Java se dá o processo do protocolo de comunicação para que possamos utilizar a pagina processada e interpretada através do nosso navegador web. Deste modo JavaBeans e Servlets são amplamente utilizados na tecnologia Java Server Pages, seja de um modo implícito ou explicito.

JSP

JSP

Ao criarmos uma simples pagina JSP do tipo HTML o servidor Tomcat a converterá em um Servlet para que possa ser compilada para Bytecode para ser executada pela maquina virtual Java. Você pode ver este processo navegando na aba Server do Eclipse escolhendo a opção Browse Deployment Location e navegando na pasta temporária que o Tomcat utiliza para sua aplicação:

Workspace do Eclipse: C:\Desenvolvimento Aberto\Java\workspace\

Pasta temporária do Tomcat: [workspace] .metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\DaWebApp\org\apache\jsp

Para nossa pagina JSP chamada NewFile.jsp o servidor a transforma em NewFile.jsp.java e em seguida em NewFile.jsp.class

NewFile.jsp

NewFile.jsp

NewFile.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Desenvolvimento Aberto</title>
</head>
<body>
<p>Está página se tornará um Servlet</p>
</body>
</html>

NewFile.jsp.Java (Convertida automaticamente em Servlet pelo Tomcat)

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.0.14
 * Generated at: 2014-11-04 21:02:55 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html; charset=ISO-8859-1");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
      out.write("<title>Desenvolvimento Aberto</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<p>Está página se tornará um Servlet</p>\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

Utilizando um Servlet e um Javabean

Agora que já sabemos como o servidor de aplicação Java Tomcat funciona em seus bastidores, também sabemos que não precisamos de uma pagina JSP em si para criar uma aplicação web, já que sabemos que ela é transformada em um Servlet de qualquer modo, podemos criar um Servlet diretamente.

Vamos então utilizar um Servlet para criar uma pagina web utilizando seu método de extensão do protocolo HTTP chamado doGet e utilizar um Javabean para criar uma classe do objeto de dados. Não utilizaremos um Database neste exemplo básico mas sim uma lista contendo Arrays de dados que serão exibidos em uma tabela HTML:

Servlet e JavaBeans

Servlet e JavaBeans

Exemplo:

Neste exemplo utilizamos um Servlet para criar uma pagina html e inicializar dados do objeto JavaBean. Um objeto JavaBean por convenção precisa ter um construtor padrão que possa ser inicializado sem precisar de qualquer parâmetro, mas para facilitar a manipulação do JavaBean pelo Servlet declaramos um construtor Overload, possibilitando que o Servlet mantenha o padrão regido por sua convenção e também possibilite a criação de parâmetros na inicialização do Bean.

Java

Servlet

package org.desenvolvimento.aberto;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Ler Servlet ao iniciar
@WebServlet(urlPatterns="/MeuJServlet", loadOnStartup = 1)

public class MeuJServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public MeuJServlet() {
		super();
	}

	public void init(ServletConfig config) throws ServletException {		

		// Inicia configuração
		super.init(config);

		// Cria uma Lista com o objeto JavaBean
		List<MeuJavaBean> registros = new ArrayList<MeuJavaBean>();

		// Insere dados na lista
		registros.add(new MeuJavaBean("Ricardo", "Olá Pessoal"));
		registros.add(new MeuJavaBean("Mantovani",
				"Bem-vindos ao Desenvolvimento Aberto"));
		registros
				.add(new MeuJavaBean("Ricardo",
						"Fiquem atualizados com as novas e classicas técnicas de programação"));
		registros.add(new MeuJavaBean("Mantovani",
				"Participem dos projetos de código Aberto."));

		// Define um atributo para o contexto do servlet
		getServletContext().setAttribute("registros", registros);

	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Recupera contexto do JavaBean
		@SuppressWarnings("unchecked")
		List<MeuJavaBean> registros =  (List<MeuJavaBean>) getServletContext().getAttribute("registros");

		// Cria página HTML
		PrintWriter html = response.getWriter();

		html.println("<!DOCTYPE html>");
		html.println("<head><Title>Desenvolvimento Aberto</title>");

		// CSS
		html.println("<style>");
		html.println("td, th {");
		html.println("border: none;");
		html.println("background-color: #dddddd;");
		html.println("padding: 5px;");
		html.println("width: 200px; }");

		html.println("</style>");
		html.println("</head>");

		//  Corpo da página
		html.println("<html>");
		html.println("<body>");
		html.println("<h1>Desenvolvimento Aberto</h1>");
		html.println("<h2>Usando Java Servlets e JavaBeans</h2>");

		// Cria tabela
		html.println("<table>");
		html.println("<tr>");
		html.println("<th>Nome:</th>");
		html.println("<th>Comentário:</th>");
		html.println("</tr>");

		for (MeuJavaBean reg : registros) {
			html.println("<tr>");
			html.println("<td>" + reg.getNome() + "</td>");
			html.println("<td>" + reg.getComentario() + "</td>");
			html.println("</tr>");
		}

		html.println("</table>");

		html.println("</body>");
		html.println("</html>");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// Chama método GET
		doGet(request, response);
	}

}

JavaBean

package org.desenvolvimento.aberto;

public class MeuJavaBean {
	// Declara atributo
	private String nome;
	private String comentario;

	// Construtor Default da classe
	public MeuJavaBean() {

	}

	// Construtor Overload
	public MeuJavaBean(String nome, String comentario) {
		this.nome = nome;
		this.comentario = comentario;
	}

	// Métodos Getter e Setter
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getComentario() {
		return comentario;
	}

	public void setComentario(String comentario) {
		this.comentario = comentario;
	}

}

 

JSP – JavaBeans Scope – Session – Java

Publicado: 2 de novembro de 2014 em Java

O escopo de um objeto descreve a disponibilidade de sua abrangência e quem tem acesso a ele. Por exemplo, se um objeto é definido para ter alcance a uma pagina página, então ele está disponível apenas durante a duração da solicitação atual nessa página antes de ser destruído pelo contêiner. Neste caso, somente a página atual tem acesso a esses dados, e ninguém mais pode lê-lo. No outro extremo da escala, se um objeto tem espaço de aplicação, em seguida, qualquer página pode utilizar os dados porque ele estará disponível durante toda a aplicação, o que significa até que o contêiner seja destruído.

Escopos de um JavaBean

  • Page: Os objetos com escopo de página são acessíveis apenas dentro da página em que são criados.
  • Request: Os objetos com escopo de solicitação são acessíveis a partir de páginas que processão o o mesmo pedido em que eles foram criados.
  • Session: Os objetos com escopo de sessão são acessíveis a partir de páginas processadas que estão na mesma sessão em que eles foram criadas.
  • Application: Os objetos com escopo de aplicação são acessíveis a partir de páginas JSP que residem na mesma aplicação. Isso cria um objeto global que está disponível para todas as páginas.

 

Criando uma aplicação com o escopo de Sessão

Caso você não defina um escopo quando você declara o uso de um Bean em uma pagina JSP, o escopo padrão estabelecido será por pagina, ou seja apenas a pagina no qual o Bean pertence poderá acessar os valores das propriedades nelas modificadas.

Quando utilizamos o escopo por sessão os Beans funcionam de certo modo como objetos estáticos ou seja toda a sessão poderá acessar os mesmos valores de suas propriedades não importa a quantidade de paginas existentes na aplicação que utilizam o mesmo Bean. Se aberto uma nova sessão o Bean então será  inicializado de acordo com seus valores no construtor do objeto.

1 – Crie uma aplicação Web com duas paginas JSP chamadas de index.jsp e index2.jsp. Crie um classe chamada de MeuBean.java e utilize os códigos abaixo em cada respectivo arquivo. Note que estamos utilizando o método que altera a propriedade Setter do Bean com parâmetros. Assim que você compilar sua aplicação o construtor do Bean inicializará o valor da propriedade cor do texto do Box como vermelho (Red), utilize manualmente o parâmetro para mudar a cor do texto para azul (Blue) dentro do navegador do Eclipse cujo nos propicia uma sessão única:

?cor=blue
Session - parâmetro cor

Session – parâmetro cor

2 – Apague o parâmetro e mude manualmente a URL do navegador do Eclipse para a index2.jsp, você notará que o Bean manteve a cor da propriedade que definimos na pagina anterior, isto é devido estarmos na mesma sessão, deste modo o construtor da classe não reinicializou o valor da propriedade cor:

Session - Página 2

Session – Página 2

3 – Para abrir outra sessão você precisa somente copiar a URL da pagina 2 do navegador do Eclipse e colar no seu Browser, você verá que quando outra sessão da aplicação web é inicializada o Bean é inicializado novamente. Você pode agora brincar com a aplicação no navegador do Eclipse e no navegador externo, para entender melhor como funciona os JavaBeans por sessão:

Sessão - Firefox

Sessão – Firefox

Exemplo:

Neste exemplo criamos duas paginas JSP e um JavaBean que interage entre as paginas pela sessão do navegador, você poderá brincar com as propriedades de cores no texto da pagina para entender como é utilizado o recurso de sessão de um objeto Bean utilizando o navegador do Eclipse e um navegador externo ao mesmo tempo.

Java

package org.desenvolvimento.aberto;

public class MeuBean {

  // Declara atributo
  private String cor;

  // Construtor da classe
  public MeuBean()
  {
	  cor = "Red";
  }

  // Método Getter
  public String getCor()
  {
	  return cor;
  }

  // Método Setter
  public void setCor(String cor)
  {
	  this.cor = cor;
  }

}

JSP – index.jsp

<html>
<head>
<title>Desenvolvimento Aberto</title>

<!-- Inicializa o JavaBean -->
<jsp:useBean id="meubean" class="org.desenvolvimento.aberto.MeuBean" scope="session" />
<style type="text/css">

div {
    background-color: lightgrey;
    width: 300px;
    padding: 25px;
    border: 25px solid black;
    margin: 25px;
}

</style>
</head>
<body>

	<h1>JavaBeans e Páginas JSP</h1>

	<h2>Escopo: Session - Pagina 1 </h2>

	<h4>Este é o valor da cor:</h4>

	<jsp:setProperty name="meubean" property="cor" param="cor" /> 

	<div style="color: <jsp:getProperty name="meubean" property="cor" />">
	Desenvolvimento Aberto <br> Página 1</div>

	<p>
		<jsp:getProperty name="meubean" property="cor" />
	</p>

</body>
</html>

JSP – index2.jsp

<html>
<head>
<title>Desenvolvimento Aberto</title>

<!-- Inicializa o JavaBean -->
<jsp:useBean id="meubean" class="org.desenvolvimento.aberto.MeuBean" scope="session"/>
<style type="text/css">

div {
    background-color: lightgrey;
    width: 300px;
    padding: 25px;
    border: 25px solid black;
    margin: 25px;
}

</style>
</head>
<body>

	<h1>JavaBeans e Páginas JSP</h1>

	<h2>Escopo: Session - Pagina 2 </h2>

	<h4>Este é o valor da cor:</h4>

	<jsp:setProperty name="meubean" property="cor" param="cor" /> 

	<div style="color: <jsp:getProperty name="meubean" property="cor" />">
	Desenvolvimento Aberto <br> Página 2</div>

	<p>
		<jsp:getProperty name="meubean" property="cor" />
	</p>

</body>
</html>

A especificação JavaBeans foi desenvolvida com o proposito de criar componentes gráficos, mas os JavaBeans representam um padrão de Design Patterns para componentes também sem rosto em um aplicativo do lado do servidor. Os componentes JavaBeans podem ser usado como blocos de construção em aplicações, assim, um usuário pode estar usando algum tipo de ferramenta de criação para se conectar e personalizar um conjunto de componentes para atuar como um aplicativo, por exemplo, um botão em uma aplicação gráfica seria um Bean.

Outros componentes JavaBeans são como aplicações regulares, que pode então ser criadas em conjunto em documentos compostos. Assim, uma planilha Bean pode ser incorporada dentro de uma página Web.

Especificações JavaBean: http://www.oracle.com/technetwork/java/javase/tech/spec-136004.html

Propriedades – Getter e Setter

Propriedades são atributos que afetam a aparência ou o comportamento de um Bean, em algumas linguagens de scripts estas são acessadas diretamente pelos campos de seu objeto, como em javascript:

objeto.label = "rotulo"; // escrita
objeto.label;            // leitura

Um JavaBean por convenção possui propriedades que devem sempre ser acessadas ​​através de chamadas de métodos em seu objeto proprietário. Para propriedades legíveis haverá um método Getter para ler o valor da propriedade. Para propriedades graváveis ​​haverá uma método Setter para permitir que o valor da propriedade seja atualizado:

objeto.setLabel("rotulo"); // escrita
objeto.getLabel();         // leitura

Tipos de Propriedades JavaBeans

  • Read-only – Somente métodos Getters.
  • Write-only – Somente métodos Setters.
  • Read/write – Getters e Setters.

Utilizando Propriedades de um Bean

Em paginas JSP podemos acessar os métodos Getter e Setter de um JavaBean através de propriedades das tags <jsp: / >, que também são conhecidos pelo nome de Scriptlets. Utilizamos um projeto do tipo Maven com o arquétipo Web App, mas caso você queira pode utilizar um projeto dinâmico para web. Crie uma pagina JSP e uma classe Java e utilize o código abaixo para cada respectivo arquivo:

1 – Você pode notar que o primeiro valor utilizado é inicializado no construtor do Bean, para isto você deve excluir a primeira chamada do método Setter da pagina JSP, utilize os comentários no código para saber mais onde excluir:

Valor inicializado no construtor

Getter – Valor inicializado no construtor

2 – Escrevendo a chamada do primeiro método Setter de volta na pagina JSP você estará definindo o valor para o Bean dinamicamente:

Setter - Valor dinâmico

Setter – Valor dinâmico

3 – Se você utilizar um parâmetro na URL do navegador o segundo método Setter irá definir um valor para a propriedade, use este exemplo e ao final da URL digite:

?parametro=Valor+Modificado+Pelo+parametro
Setter - Parâmetros

Setter – Parâmetros

Exemplo:

Neste exemplo criamos um JavaBean e utilizamos suas propriedades para definir e recuper valores em uma pagina JSP.

Java

package org.desenvolvimento.aberto;

public class MeuBean {

  // Declara atributo
  private String nome;

  // Construtor da classe
  public MeuBean()
  {
	  nome = "Desenvolvimento Aberto";
  }

  // Método Getter
  public String getNome()
  {
	  return nome;
  }

  // Método Setter
  public void setNome(String nome)
  {
	  this.nome = nome;
  }

}

JSP

<html>
<head>
<title>Desenvolvimento Aberto</title>
  <style type="text/css">
    p { color:blue }
  </style>
</head>
<body>
	<!-- Inicializa o JavaBean -->

	<jsp:useBean id="meubean" class="org.desenvolvimento.aberto.MeuBean" /> 

	<!-- Exclua está propriedade para utilizar o valor incializado no construtor do Bean --> 

	<jsp:setProperty name="meubean" property="nome" value="Valor modificado pelo metodo Setter" />	

	<!-- Para usar o Setter utilizando um parâmetro: -->

	<jsp:setProperty name="meubean" property="nome" param="parametro" />

	<h1>JavaBeans e Páginas JSP</h1>

	<h2>Propriedades - Getter e Setter</h2>

	<h4>Este é o valor do meu método Getter do Bean:</h4>

	<p>
	   <jsp:getProperty name="meubean" property="nome" />
	</p>		

</body>
</html>