Resumo
Este artigo toma o banco de dados Oracle como exemplo para apresentar um método simples e universal de armazenamento e processamento de dados no desenvolvimento de aplicações WEB usando a tecnologia JSP para reduzir a carga de trabalho de desenvolvimento e fornecer o código do programa principal.
Introdução
A tecnologia J2EE (Java 2 Enterprise Edition) tem sido amplamente utilizada no desenvolvimento de aplicativos da Web. As tecnologias JavaBean e Servlet fornecem aos desenvolvedores um ambiente de desenvolvimento mais claro. A tecnologia JSP é usada para exibir páginas e a tecnologia Servlet é usada para completar um grande número de. processos de negócios, usando Beans para armazenar dados e algum processamento de negócios. Em aplicativos WEB, o trabalho de processamento de armazenamento de dados de negócios no banco de dados é muitas vezes muito árduo. Uma das principais formas é armazenar dados de formulário no banco de dados. Todo o processo de processamento do aplicativo envolve um grande número dessas operações de armazenamento de dados. o formulário precisa ser processado. Os desenvolvedores levam muito tempo e energia para escrever o programa de armazenamento de dados correspondente separadamente. Quais métodos usar para reduzir a carga de trabalho de desenvolvimento do armazenamento de dados de formulários é uma questão que vale a pena estudar.
Dois métodos comuns de armazenamento e processamento de dados de formulário:
1. Escreva o código de programa correspondente para cada formulário
na página JSP ou JavaBean ou Servlet Use a função request.getparameter() para extrair os dados enviados pelo formulário um por um, ou escreva o. JavaBean correspondente Use o método setProperty para buscar automaticamente os dados no JavaBean, em seguida, gere instruções SQL (inserir, atualizar, excluir) e, finalmente, executar a função executeupdate() para concluir o armazenamento da tabela de dados.
2. Gere automaticamente um código de programa JavaBean para cada tabela de dados.
O sistema de banco de dados deve oferecer suporte aos usuários para ler a estrutura da tabela e identificar os campos-chave. Use ferramentas de desenvolvimento rápido orientadas a objetos, como PowerBuilder, Delphi, etc., para desenvolver um programa de geração automática de código Java. Neste programa, a estrutura da tabela do banco de dados é lida: nome do campo, tipo de dados, comprimento dos dados e um código JavaBean é gerado automaticamente. Neste código, defina variáveis com os mesmos nomes correspondentes aos campos da tabela, estabeleça os métodos setValue e getValue para todas as variáveis e estabeleça funções de inserção, atualização e exclusão para lidar com a geração e execução de instruções SQL para inserção, atualização, e excluir respectivamente.
Na página de processamento de dados enviada pelo formulário, escreva o seguinte código para armazenar os dados do formulário em JavaBean:
<jsp: useBean id="table" class="table1_bean" />
<jsp:setProperty name="table" property="*" />
(Nota: table1_bean é o JavaBean gerado automaticamente correspondente a uma determinada tabela mencionada acima)
Em seguida, chame as funções insert, update e delete em table1_bean para concluir o armazenamento da tabela de dados e retornar os resultados da execução. como:
<%boolean success =table.insert() %>
O primeiro método é simples e intuitivo, mas você precisa escrever um programa de processamento de dados correspondente para cada formulário. Para aplicativos um pouco maiores, o número de formulários pode ser grande, resultando em uma pesada carga de trabalho de desenvolvimento e em baixa eficiência de desenvolvimento. Quando a estrutura da tabela muda, como adicionar ou subtrair campos, o programa de processamento de dados correspondente precisa ser modificado.
O segundo método é muito mais simples que o primeiro. O processamento de dados de cada tabela de dados é implementado pelo JavaBean correspondente. O JavaBean é gerado automaticamente e não precisa ser gravado quando a estrutura da tabela é alterada. JavaBean e sobrescrevê-lo após compilar com Java. A classe Java original pode ser usada. No entanto, este método requer o desenvolvimento de um programa de geração automática de JavaBeans, e os JavaBeans precisam ser regenerados e compilados quando a estrutura da tabela muda.
Apresentando um método simples e universal para armazenar dados de formulário
no desenvolvimento de aplicativos WEB. Muitos formulários são enviados ao servidor back-end após uma simples verificação de dados no navegador front-end. uma tabela de banco de dados. Neste caso, podemos simplesmente escrever um programa para processar esses formulários de maneira uniforme e armazenar os dados em uma tabela de dados correspondente. Este método também requer que o sistema de banco de dados suporte a leitura da estrutura da tabela e a identificação dos campos-chave. Usamos a tecnologia JSP para escrever este programa, e o arquivo do programa é denominado DbdataStore.jsp.
1. Formato de chamada
O método de chamada de ação do formulário na página da web é o seguinte:
<Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…">
table1 é o nome da tabela do banco de dados onde os dados serão armazenados e a operação OperType Existem três tipos: inserir, atualizar e excluir.
Os valores dos nomes em <input type=text name=…>, <textarea name=…><select name=…> no formulário devem ser iguais aos nomes dos campos da tabela de dados. form são extraídos um por um em DBdataStore.jsp Se não houver nenhuma entrada definida no formulário e o valor resultante for um valor nulo, o campo não será processado.
2. Definição de visualização tomando Oracle como exemplo
1) Crie uma visualização de tipo de dados para cada coluna da tabela
CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name, column_name, data_type, data_length, data_precision, data_scale, column_id
FROM all_tab_columns WHERE proprietário='usuário1'; //usuário1 é o proprietário da tabela de dados.
2) Crie a visualização da coluna chave da tabela
CREATE OR REPLACE VIEW v_pkey_column AS
SELECIONE b.nome_tabela, b.nome_coluna, b.posição
FROM all_constraints a, all_cons_columns b
WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner='user1' AND a.constraint_type='P'
3. Código do programa principal
1) Inicialização do programa
String tablename=request.getParameter("; tablename"); //Extrai o nome da tabela
String OperType=request.getParameter("OperType"); //Extrair tipo de operação
String sFieldValue="";//Armazena o valor dos dados do campo enviado pelo formulário
String fieldname="", Datatype="" //Nome do campo de armazenamento, tipo de dados do campo
int iFieldvalor=0;
String updateSql="", whereSql=" where ", insSql1="", insSql2="", opSql="", strSql="";
Conjunto de resultados rs1=nulo, rs2=nulo;
insSql1="inserir em "+nomedatabela+" (";
insSql2="values(";
2) Gere a parte do campo-chave da instrução sql
e
gere a parte do campo-chave da instrução de inserção, como: insira na tabela1(id e valores(100));
gerar a instrução update e delete where parts , como: where id=100
quando o tipo de operação for update, os dados dos campos-chave não serão modificados no formulário web.
rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'");
enquanto(rs1.next()){
nomedocampo=rs1.getString("nome_coluna");
rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE table_name='"+tablename+"' AND column_name='"+fieldname+"'" //Obter o tipo de dados do campo-chave if(rs2.next()){
Tipo de dados=rs2.getString("tipo_dados");
sFieldValue=request.getParameter(fieldname.toLowerCase());
//Gere a parte do campo-chave da instrução de inserção if(OperType.equals("insert")){
insSql1+=nomedocampo+",";
if((sFieldValue==null) ){
//Quando o valor dos dados do campo-chave não for enviado no formulário, este artigo irá processá-lo apenas como um tipo numérico e o valor dos dados será calculado de acordo com o número de série.
rs2= Stmt. executeQuery("SELECT max("+nomedocampo+")+1 FROM "+nomedocampo()+"," ; }else if(Datatype.equals("DATA")){
insSql2+= "To_Date('" + sFieldValue + "','AAAA-MM-DD'),";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+="'" + sFieldValue+"',";}
else /*NUMBER, FLOAT */ insSql2+=sFieldValue+","}
//Gerar instrução de atualização e exclusão where part: where fieldname=... AND
if(OperType.equals("atualizar") || OperType.equals("excluir")){
if(Datatype.equals("DATA")){
whereSql+=nomedocampo+"=To_Date('" + sFieldValue + "','AAAA-MM-DD') AND ";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
whereSql+=nomedocampo+"='" + sFieldValue+"' AND ";}
else /*NUMBER, FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";}
}
}
whereSql=whereSql.substring(0, whereSql.length()-4);
A instrução sql da parte do campo não-chave gera
uma instrução de atualização, como: update table1 set column1=value1,... where id= 100
instrução de inserção, como: inserir na tabela1(id, coluna1,…)valores(100, valor1,…)
updateSql="update "+tablename+" set ";
strSql="SELECT nome_coluna, tipo_dados, comprimento_dados, precisão dos dados, escala de dados FROM v_dbstru a "+"onde nome_tabela='"+nome_tabela+"' AND a.column_name não está em (SELECT b.column_name FROM v_pkey_column b onde b.nome_tabela=a.nome_tabela )”;
rs1=Stmt.executeQuery(strSql); //Obter o nome do campo e o tipo de dados dos campos não-chave
enquanto(rs1.next()){
fieldname=rs1.getString("column_name"); Datatype=rs1.getString("data_type"); sFieldValue=request.getParameter(fieldname.toLowerCase()); o campo Processando if((sFieldValue!=null)){
//Gerar instrução de inserção =insSql1+insSql2, ou seja, inserir em tablename(… e valores(…)
if(OperType.equals("inserir")){ insSql1+=nomedocampo+",";
if(Datatype.equals("DATA")){
insSql2+= "To_Date('" + sFieldValue + "','AAAA-MM-DD'),";
} else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+="'" + sFieldValue+"'",;}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+",";}
//Gerar instrução de atualização=updateSql+whereSql, ou seja, atualizar conjunto de nome de tabela... onde nomedecampo=... if(OperType.equals("update")){
if(Datatype.equals("DATA")){
updateSql+=nomedocampo+"=To_Date('" + sFieldValue + "','AAAA-MM-DD'),";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
updateSql+=nomedocampo+"='" + sFieldValue,1}+"'",;}else /*NUMBER,FLOAT*/ updateSql+=nomedocampo+"="+sFieldValue+",";}))
rs1.close();
4) Gere uma instrução sql completa e execute
if(OperType.equals("insert"))
opSql=insSql1.substring(0, insSql1.length()-1)+")"+insSql2.substring(0, insSql2.length()-1)+")";
if(OperType.equals("atualização"))
opSql=updateSql.substring(0, updateSql.length()-1)+" "+whereSql if(OperType.equals("delete"))
opSql="delete FROM "+nomedatabela+" "+whereSql;
//A instrução sql completa opSql foi gerada
tente{sqlnrows=Stmt.executeUpdate(opSql);}
catch(SQLException e){out.println("SQLException:"+opSql);}
4. Recursos
Este método usa este programa uniformemente para todos os formulários armazenados diretamente. Ele é universal e não precisa ser usado para todos os formulários ou para todos. formulário O programa correspondente é desenvolvido de forma independente para a tabela de dados. A carga de trabalho de desenvolvimento é muito pequena e a chamada é muito simples. Ao mesmo tempo, quando a estrutura da tabela muda, não há necessidade de modificar o programa DBdataStore.jsp. Este programa também pode ser reescrito como Servelet, e o formato de chamada é <Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">.
Conclusão
Em uma aplicação web, se os dados do formulário exigirem verificação adicional ou processamento de dados em segundo plano do servidor após o envio, o segundo método deverá ser usado. Mas, em muitos casos, os usuários inserem ou modificam dados no formulário, usam JavaScript para simplesmente verificar ou processar os dados no navegador front-end e, em seguida, enviam-nos. Nenhum processamento é feito no servidor back-end e os dados são enviados. pelo formulário é armazenado diretamente no banco de dados em uma tabela. Neste momento, usar o terceiro método é muito simples e pode reduzir bastante a carga de trabalho do desenvolvedor.