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 acima mencionado correspondente a uma determinada tabela) e, em seguida, chama as funções de inserção, atualização e exclusão em table1_bean para completar o armazenamento da tabela de dados e retornar os resultados da execução. Por exemplo: <%boolean success =table.insert() %> O primeiro método é simples e intuitivo, mas requer a escrita de procedimentos de processamento de dados correspondentes 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='user1' ; //user1 Seja 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 SELECT b.table_name, b.column_name, b.position 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 principal do programa
1) Inicialização do programa
String tablename=request.getParameter("tablename"); //Extrair nome da tabela
String OperType=request.getParameter("OperType"); //Extrair tipo de operação
String sFieldValue="";/ /Armazenando o valor dos dados do campo enviado pelo formulário
String fieldname="", Datatype="" //Armazenando o nome do campo, tipo de dados do campo
int iFieldvalue=0;
String updateSql="", whereSql=" where ", insSql1="; ", insSql2 ="", opSql="", strSql ="";
ResultSet rs1=null, rs2=null;
insSql1="inserir em "+tablename+" (";
insSql2="values(";
2) Gerar instrução sql campos-chave Gerar parcialmente
a parte do campo-chave da instrução de inserção, como: inserir na tabela1 (id e valores (100));
usar apenas os campos-chave para gerar a instrução de atualização e exclusão, como: onde id = 100); ;
quando o tipo de operação for atualizado, os dados dos campos-chave não serão modificados no formulário web.
rs1=Stmt.executeQuery("SELECIONE nome_coluna FROM v_pkey_column WHERE nome_tabela='"+nometabela+"'"); //Obter o nome do campo-chave while(rs1.next()){ nomedocampo=rs1.getString("nome_coluna"); rs2=Stmt.executeQuery("SELECIONE tipo de dados FROM v_dbstru WHERE nome_tabela='"+nometabela+"' AND column_name='"+fieldname+"'"); //Obtém 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 "+nomedatabela); rs2.next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+","; }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); |
3) A parte do campo não-chave da instrução SQL gera
uma instrução de atualização, como: atualizar tabela1 definir coluna1=valor1,… onde id=100
inserir instrução, como: inserir na tabela1 (id, coluna1,…) valores (100, valor1,…)
updateSql="atualizar "+nomedatabela+"set"; strSql="SELECIONE nome_coluna, tipo_dados, comprimento_dados, precisão_dados, escala_dados FROM v_dbstru a "+"onde nome_tabela='"+nometabela+"' E a.column_name não está em (SELECT b.column_name FROM v_pkey_column b onde b.table_name=a.table_name)"; rs1=Stmt.executeQuery(strSql); //Obter o nome do campo não-chave e o tipo de dados while(rs1.next()){ nomedocampo=rs1.getString("nome_coluna"); tipo de dados=rs1.getString("tipo_dados"); sFieldValue=request.getParameter(fieldname.toLowerCase()); //Se o formulário não enviar o valor deste campo, ignore o processamento deste campo 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 da tabela ... onde nomedocampo=... if(OperType.equals("atualização")){ 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.fechar(); |
4) Gere uma instrução SQL completa e execute-a
if(OperType.equals("inserir")) 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. Não é necessário desenvolver programas correspondentes de forma independente para cada formulário ou tabela de dados. . 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.