随笔-39  评论-33  文章-0  trackbacks-0

如何实现表单一次上传多表数据并更新到数据库

胡立新

newxy的标签<nbean:formBean name=”…” sql=”……”/>会经查询语句得到一formBeanformBean中含有记录集。如果sql语句是联表查询,formBean中会有来自多个表的数据。

如果用户在<nhtml:form …>…</nhtml:form>标签产生的表单中修改了数据,如何将这些修改后的多表数据更新到数据库中。可以利用newxy的标签<nlogic:action1/><nlogic:action2/>及标签<nhtml:buttons/><nhtml:button/>来实现。有两种方法。

方法一:将<nlogic:action1/>换成<nlogic:action2/>,其path属性是strutsaction配置的path元素值,通常带有“.do" 这样可在后台Strutsaction中处理。

        BaseDAO baseDao=new BaseDAO();

        DynaDto dto=(DynaDto)formBean.getDto();

        //保存第一个表

        dto.set_table(“table1”);

        baseDao.update(dto);

        //保存第二个表

        dto.set_table(“table2”);

        baseDao.update(dto);

        //保存第三个表

        dto.set_table(“table3”);

        baseDao.update(dto);

   

如果查询结果使用了别名,如select a.field1 as f1,... from table1 a,...,则在update前应作处理,如下:

        dto.set_table(“table1”);

        dto.set('field1',dto.get('f1'));

        baseDao.update(dto);

前台jsp页面类似如下:

        <nlogic:action2 id=”act1” path="/myAction.do"/>

        <nbean:formBean name="form1" sql="..."/>

        <nhtml:form action="" formName="form1">

          <html:hidden property="_table" value="table1"/>

          ......

        </nhtml:form>

        <div><nhtml:buttons actionId="act1"/></div>

前台表单中的_table属性被忽略。如果表单某属性是table1字段也是table2字段,如联表查询时的id,这个id就会更新到table1table2中。

 

方法二:让<nlogic:action1/>更新或插入表table1,在jsp页面上镶入java脚本更新或插入其它表。但要理解<nlogic:action1/>执行动作的条件。

<nlogic:action1/>执行动作的条件是:访问jsp页面的参数含有_actionId_formName,且值分别等于<nlogic:action1/>id值、formName值。这个<nlogic:action1/>"update""remove"还是其它动作要看参数method的值是什么。java脚本执行条件应与<nlogic:action1/>的条件相同。jsp页面应类似这样的:

        <nlogic:action1 id="act1" formName="form1"/>

        <%

          String _actionId=request.getParameter("_actionId");

          String _formName=request.getParameter("_formName");

          if("act1".equals(_actionId) && "form1".equals(_formName)){

              net.newxy.struts_faces.DynaFormBean formBean=(net.newxy.struts_faces.DynaFormBean)session.getAttribute("form1");

              BaseDAO baseDao=new BaseDAO();

              DynaDto dto=(DynaDto)formBean.getDto();

 

              //保存第二个表 第一个table1由标签更新了。

              dto.set_table(“table2”);

              baseDao.update(dto);

              //保存第三个表

              dto.set_table(“table3”);

              baseDao.update(dto);       

          }           

        %>

        <nbean:formBean name="form1" sql="..."/>

        <nhtml:form action="/manager/user/index.jsp" formName="form1">

          <html:hidden property="_table" value="table1"/>

          ......

        </nhtml:form>

        <div><nhtml:buttons actionId="act1"/></div>

       

如果要在一个事务中更新多表,则应使用方法一。如果利用newxy实现事务,可参看newxy的技术文档有关事务部分。

 

newxy新坐标技术网站:http://www.newxy.net

 

posted on 2007-04-09 23:39 newxy新坐标 阅读(1885) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: