`
condor_mk7
  • 浏览: 43553 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

JSP中表单数据存储的通用方法

阅读更多
本文以Oracle数据库为例,介绍了在采用JSP技术开发WEB应用时一种简便通用的表单数据存储处理方法,以减轻开发工作量,同时提供了主要的程序代码。

引言

J2EE(Java 2 Enterprise Edition)技术已广泛应用在Web应用开发中,其中的JavaBean、Servlet技术为开发者提供了更为清晰的开发环境,使用JSP技术表现页面,使用Servlet技术完成大量的业务处理,使用Bean来存储数据及一些业务处理。在WEB应用中,业务数据存储到数据库中的处理工作经常很繁重,其中一种主要的形式就是表单数据存储到数据库,整个应用处理过程牵涉到大量的这种数据存储操作,对每个表单都要单独编写相应的数据存储程序,花费了开发人员大量的时间和精力。采用什么方法来减轻表单数据存储的开发工作量是值得研究的问题。

两种常见的表单数据存储处理方法

1、对每一表单都编写相应的程序代码

在JSP页面或JavaBean或Servlet中,使用request. getparameter()函数逐一提取表单提交的数据,或编写相应的JavaBean,使用setProperty方法将数据自动取到 JavaBean中,然后生成SQL语句(insert,update,delete),最后执行executeupdate()函数完成数据表存储。

2、对每一数据表自动生成一个JavaBean程序代码

数据库系统必须支持用户能够读取表结构,并识别关键字段。利用面向对象快速开发工具,如PowerBuilder、Delphi等,自行开发一个java代码自动生成程序。在该程序中读取数据库表的结构:字段名、数据类型、数据长度,自动生成一个JavaBean代码。在该代码中定义与表中字段对应的同名变量,建立所有变量的setValue和getValue方法,建立 insert、update、delete函数分别处理insert、update、delete的SQL语句生成和执行。

在表单提交的数据处理页面中,编写如下代码,将表单数据存储到JavaBean中:

<jsp:useBean id="table" class="table1_bean" />

<jsp:setProperty name="table" property="*" />

(注:table1_bean为上述自动生成的对应某一个表的JavaBean)

然后调用table1_bean中insert、update、delete函数完成数据表存储,并返回执行结果。如:

<%boolean success =table.insert(); %>

第一种方法简单直观,但对每一表单都需要编写相应的数据处理程序。对稍微大一点的应用,表单数量可能很多,开发工作量很大,开发工作效率低。表结构变动如增加、减少字段时,需修改相应的数据处理程序。 软件开发网

第二种方法相对第一种简便得多,每一数据表的数据处理由对应的JavaBean实现,JavaBean自动生成,不需编写,表结构变动时只需重新生成新的JavaBean,经java编译后覆盖原java类即可。但该方法需要开发 JavaBean自动生成程序,表结构变动时JavaBean需要重新生成和编译。

介绍一种简便通用的方法实现表单数据存储

在WEB应用开发中,很多表单在经过前台浏览器端简单的数据校验后,提交后台服务器,服务器对数据不用作任何处理直接将数据存储到一个数据表中。对这种情况,我们可以只编写一个程序,对这些表单统一处理,将数据存储到相应的一个数据表中。该方法同样要求数据库系统支持表结构读取和关键字段识别。我们采用JSP技术编写该程序,程序文件取名为DbdataStore.jsp。

1、调用格式

在网页中表单的Action调用方法如下:

<Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…">

table1为数据将要存储的数据库表的表名,OperType操作类型分为三种:insert,update,delete。

表单中的<input type=text name=…>,<textarea name=…><select name=…>等中的name值应与数据表的字段名相同,DBdataStore.jsp中逐一提取表单提交的对应字段名的数据值,若表单中未定义输入,得到的值为空值,则对该字段不作处理。



2、以oracle为例的视图定义

1) 建立表各列数据类型视图

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 owner='user1';//user1为数据表的属主。

2) 建立表的关键列视图

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、主要程序代码

1) 程序初始化

String tablename=request.getParameter("tablename");//提取表名

String OperType=request.getParameter("OperType");//提取操作类型

String sFieldValue="";//存放表单提交的字段数据值

String fieldname="",Datatype="" //存放字段名,字段数据类型

int iFieldvalue=0;

String updateSql="",whereSql=" where ",insSql1="",insSql2="",opSql="",strSql ="";

ResultSet rs1=null,rs2=null;

insSql1="insert into "+tablename+" (";

insSql2="values(";

2)生成sql语句关键字段部分

生成insert语句关键字段部分,如:insert into table1(id 和 values(100));

只使用关键字段生成update,delete语句where部分,如:where id=100;

在操作类型为update时,网页form表单中不对关键字段的数据进行修改。

rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'");
//取关键字段字段名
while(rs1.next()){
 fieldname=rs1.getString("column_name");
 rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE  table_name='"+tablename+"'
AND column_name='"+fieldname+"'");//取关键字段数据类型
 if(rs2.next()){

  Datatype=rs2.getString("data_type");
  sFieldValue=request.getParameter(fieldname.toLowerCase());
  //生成insert语句关键字段部分
  if(OperType.equals("insert")){
   insSql1+=fieldname+",";
   if((sFieldValue==null) ){
    //表单未提交关键字段数据值时,本文只按数字型处理,数据值按下一流水号计算。
    rs2= Stmt. executeQuery("SELECT max("+fieldname+")+1 FROM "+tablename);
rs2. next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+",";
}else if(Datatype.equals("DATE")){
    insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
   }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
insSql2+="'" + sFieldValue+"',";}
   else /*NUMBER,FLOAT */ insSql2+=sFieldValue+",";}
   //生成update,delete语句where部分:where fieldname=... AND
   if(OperType.equals("update") || OperType.equals("delete")){
    if(Datatype.equals("DATE")){
     whereSql+=fieldname+"=To_Date('" + sFieldValue + "','YYYY-MM-DD') AND ";
    }else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
     whereSql+=fieldname+"='" + sFieldValue+"' AND ";}
    else /*NUMBER,FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";}
  }
 }
whereSql=whereSql.substring(0,whereSql.length()-4);

3)非关键字段部分sql语句生成

update语句,如:update table1 set column1=value1,… where id=100

insert语句,如:insert into table1(id,column1,…)values(100,value1,…)

updateSql="update "+tablename+" set ";
strSql="SELECT column_name,data_type,data_length,data_precision,data_scale FROM
v_dbstru a "+"where table_name='"+tablename+"'

AND a.column_name not in (SELECT
b.column_name FROM v_pkey_column b where b.table_name=a.table_name)";
rs1=Stmt.executeQuery(strSql);//取非关键字段字段名和数据类型
while(rs1.next()){
 fieldname=rs1.getString("column_name");Datatype=rs1.getString("data_type");
   sFieldValue=request.getParameter(fieldname.toLowerCase());
//若表单未提交该字段的值,则忽略该字段的处理
 if((sFieldValue!=null)){
  //生成insert语句=insSql1+insSql2 即insert into tablename(… 和 values(…
  if(OperType.equals("insert")){ insSql1+=fieldname+",";
  if(Datatype.equals("DATE")){
   insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
  } else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
   insSql2+="'" + sFieldValue+"',";}else /*NUMBER,FLOAT*/ insSql2+= sFieldValue+",";}
  //生成update语句=updateSql+whereSql 即update tablename set ... where

fieldname=... if(OperType.equals("update")){
if(Datatype.equals("DATE")){
updateSql+=fieldname+"=To_Date('" + sFieldValue + "','YYYY-MM-DD'),";
}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){
updateSql+=fieldname+"='" + sFieldValue,1}+"',";}else /*NUMBER,FLOAT*/
updateSql+=fieldname+"="+sFieldValue+",";} ))
 rs1.close();

4)生成完整的sql语句并执行

if(OperType.equals("insert"))
 opSql=insSql1.substring(0,insSql1.length()-1)+")"+insSql2.substring(0,insSql2.length()-1)+")";
if(OperType.equals("update"))
 opSql=updateSql.substring(0,updateSql.length()-1)+" "+whereSql;if(OperType.equals("delete"))
 opSql="delete FROM "+tablename+" "+whereSql;
//已生成完整的sql语句opSql
try{sqlnrows=Stmt.executeUpdate(opSql);}
catch(SQLException e){out.println("SQLException:
"+opSql);}

4、特点

该方法对所有这种直接存储的表单都统一使用本程序,具有通用性,不必对每个表单或每个数据表独立开发相应程序,开发工作量非常少,调用也非常简便。同时,在表结构变动时,不用修改DBdataStore.jsp程序。本程序也可改写为 Servelet,调用格式为<Form Name=Frm1 Method=Post Action="DBdataStoreServelet?tablename=table1&OperType=…">。

总结

在Web应用中,如果表单数据在提交后,还需要服务器后台作进一步的数据校验或处理,则需要采用第二种方法。但很多情况是用户在表单中输入或修改数据,在前台浏览器端使用javascript对数据进行简单校验或处理,然后提交,在后台服务器端不作任何处理,直接将表单提交的数据存储到数据库的一个表中。这时候采用第三种方法非常简便,可以大大减轻开发人员的工作量。
分享到:
评论

相关推荐

    对于JSP中表单数据存储的一种通用方法

    JSP学习的基础资料 适合初学者自学使用

    JSP+Oracle简便通用的表单数据存储处理方法文章出处

    jsp学习(JSP+Oracle简便通用的表单数据存储处理方法文章出处)

    jsp文件上传下载通用包

    而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中

    基于JSP的办公自动化系统

    三层结构设计 程序逻辑结构分用户界面、业务逻辑处理和数据存储 <br>.面向对象设计 <br>.人性化设计 <br>软件产品介质: 1.oa.rar 2.oaclass.rar 3.oalib.rar 4.oadatabase.rar 4.Web版...

    办公自动化系统OA(jsp java)

    三层结构设计 程序逻辑结构分用户界面、业务逻辑处理和数据存储 .面向对象设计 .人性化设计 软件产品介质: 1.oa.rar 2.oaclass.rar 3.oalib.rar 4.oadatabase.rar 4.Web版办公自动化OA系统使用手册.doc 5.web...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    超级有影响力霸气的Java面试题大全文档

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    JAVA面试题最全集

    如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多...

    java 面试题 总结

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    NTKO文档在线编辑控件4.0.1.2

    10 支持在提交编辑文档的同时,提交表单的其它数据,包括其它的文件上传 采用我们独创的“智能提交”技术,让您在提交编辑文档的同时,提交表单的其它数据,以及表单中其它的文件上传。这可以让您更加快速的集成现有...

    同学录管理系统

    数据存储:MySqL 系统设计采用了B/S模式 (浏览器/服务器)。不需要在客户机上再安装客户端软件,只要客户端有浏览器就可以进行访问了。所以能具有很强的通用性,也好维护。采用javabean+servlet+jsp的三层架构。Jsp...

    Spring.3.x企业应用开发实战(完整版).part2

    15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 ...

    Spring3.x企业应用开发实战(完整版) part1

    15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 15.4.1 认识视图 15.4.2 认识视图解析器 15.4.3 JSP和JSTL 15.4.4 模板视图 15.4.5 ...

    ARCH4系统开发指南

    2.19 用AJAX获取数据(通用做法) 36 2.19.1 “查看条款内容”的操作情景 36 2.19.2 前台JS函数调用后台JAVA类 36 2.19.3 后台JAVA类为前台JS函数返回结果 42 2.19.4 总结 45 2.20 金额的JAVA精确计算 45 2.20.1 ...

    Spring面试题

    -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; -(4)如果...

    Java Web程序设计教程

    13.1.2通用的数据访问模板及抽象支持类 261 13.2spring的jdbc 262 13.2.1为什么需要jdbctemplate 262 13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的常用数据操作方法 264 13.3spring...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    NTKO文档在线编辑控件独立安装包4.0.6.5(适合TA2009\2010\2011版本)

    ★ 采用我们独创的“智能提交”技术,基于国际标准提交数据而非自定义协议,让您在提交编辑文档的同时,提交表单的其它数据,以及表单中其它的文件上传。这可以让您更加快速的集成现有的应用程序,或者创建新的应用...

    Spring中文帮助文档

    使用@SessionAttributes指定存储在会话中的属性 13.12.7. 自定义WebDataBinder初始化 13.13. 更多资源 14. 集成视图技术 14.1. 简介 14.2. JSP和JSTL 14.2.1. 视图解析器 14.2.2. 'Plain-old' JSPs versus ...

    低清版 大型门户网站是这样炼成的.pdf

    5.12 hibernate调用存储过程 343 5.13 xml数据持久化 346 5.14 小结 348 第6章 充分利用spring 2.5的ioc利器统管bean世界 349 6.1 java程序员的春天厚礼—spring 2.5 349 6.1.1 爱上spring 2.5的十大理由 350 ...

Global site tag (gtag.js) - Google Analytics