当前位置: 技术问答>java相关
关于在jsp和servlet间多次传值的问题,欢迎讨论
来源: 互联网 发布时间:2015-10-05
本文导语: jsp中有两个form,分别是form1,form2,要求form1填写一次,form2填写多次,首先填form1,然后form2,这时点提交sbt按钮,将form1和form2的值传给servlet,servlet返回jsp,这时form1中有servlet传回的上次填的form1的值,然后再填form2,提交...
jsp中有两个form,分别是form1,form2,要求form1填写一次,form2填写多次,首先填form1,然后form2,这时点提交sbt按钮,将form1和form2的值传给servlet,servlet返回jsp,这时form1中有servlet传回的上次填的form1的值,然后再填form2,提交,最后一次点完成fns按钮,提交form1和form2给servlet.
这个过程可以有几种实现方法,有什么有缺点,欢迎讨论。
这个过程可以有几种实现方法,有什么有缺点,欢迎讨论。
|
可以在jsp和servlet中个设个Vector,jsp每传一个form2,就存在servlet中的Vector中,返回jsp时将Vector传回,保存在jsp中,然后jsp提交servlet,将新的form2存在vector中.就是用vector存信息,通过把vector当参数传递来保存vector。
还有就是可以用session
还有就是可以用session
|
我的想法:
form1的内容如果在每个页面都需要,可以考虑把它存在session中,就是说第一次提交后,判断如果session中没有这个valuebean,则保存,以后只需让jsp页从session取这个valuebean显示即可。
于是,jsp页就当成一个只包含form2的页面来处理,应该不难了。
form1的内容如果在每个页面都需要,可以考虑把它存在session中,就是说第一次提交后,判断如果session中没有这个valuebean,则保存,以后只需让jsp页从session取这个valuebean显示即可。
于是,jsp页就当成一个只包含form2的页面来处理,应该不难了。
|
form2的多次提交问题我觉得可以这样:
每次提交后存在session中,最后一次再写到DB中。
如果是用EJB来实现,可以用有状态的会话bean,很方便。
或者也可以用JDBC的事务来处理,设置它不是自动commit,然后手工提交,每次都insert,但直到最后才commit。
不知道你觉得哪种比较合适?
每次提交后存在session中,最后一次再写到DB中。
如果是用EJB来实现,可以用有状态的会话bean,很方便。
或者也可以用JDBC的事务来处理,设置它不是自动commit,然后手工提交,每次都insert,但直到最后才commit。
不知道你觉得哪种比较合适?
|
我觉得可以给form2一个专门的值Bean,放在Servlet中,每次提交后都把form2提交的内容写入值Bean,等到最后由Servlet将这个值Bean内的数据一起写到DB中去。
BTW:为什么要多次提交form2呢?我觉得应该可以没提交一次就往数据库里写一次吧。
BTW:为什么要多次提交form2呢?我觉得应该可以没提交一次就往数据库里写一次吧。
|
从你的程序和描述的现象看,是有些奇怪。因为即便是插入相同的对象,vector的size也会增加的。
感觉上象是,每次都没有从session中取到保存的vector,所以每次都是新建的m2PortVector,因此vector的size就是1。
你可以增加这样的系统输出看看:
if(session.getAttribute("vector")!=null)
{
m2PortVector=(Vector)session.getAttribute("vector");
//add:
System.out.println("Get m2PortVector from Session(Id:"+session.getId()+"). The size is:"+m2PortVector.size());
}
首先,你看看有没有这句输出,如果有,再看看Session的Id是否相同;最关键是看看每次vector的size到底有没有增加!
另外你的serial有什么意义啊?每次的初值都是0,然后加1存入(没有起到累加的作用)。
感觉上象是,每次都没有从session中取到保存的vector,所以每次都是新建的m2PortVector,因此vector的size就是1。
你可以增加这样的系统输出看看:
if(session.getAttribute("vector")!=null)
{
m2PortVector=(Vector)session.getAttribute("vector");
//add:
System.out.println("Get m2PortVector from Session(Id:"+session.getId()+"). The size is:"+m2PortVector.size());
}
首先,你看看有没有这句输出,如果有,再看看Session的Id是否相同;最关键是看看每次vector的size到底有没有增加!
另外你的serial有什么意义啊?每次的初值都是0,然后加1存入(没有起到累加的作用)。
|
这个问题你也可以JScript + DHtml 实现。
用JScript在客户端生成一颗DOM树,附表录入的每一条数据都先保存在客户的DOM树中,也可以将主表信息保存在同一颗DOM树中。最终提交时:可以以XML文件的方式提交,也可以以字符串的形式提交。
到后台,对这颗树进行解析。数据同时保存在数据库中。
这样做的优点在于:
1、录入的附表数据在未提交之前可以方便修改和删除。
2、数据便于管理。
用JScript在客户端生成一颗DOM树,附表录入的每一条数据都先保存在客户的DOM树中,也可以将主表信息保存在同一颗DOM树中。最终提交时:可以以XML文件的方式提交,也可以以字符串的形式提交。
到后台,对这颗树进行解析。数据同时保存在数据库中。
这样做的优点在于:
1、录入的附表数据在未提交之前可以方便修改和删除。
2、数据便于管理。
|
为什么要自找麻烦呢,把fore1,与form2 分开到两个不同的jsp叶面不好吗?
|
1。既然每次都要既提交form1又form2,为何不合并?
2。开始不提交form1,最后finish时候,才提交,考虑用javascript进行控制
2。开始不提交form1,最后finish时候,才提交,考虑用javascript进行控制
|
把2个form写在一个jsp文件中可以用javascript实现
function test1{
document.form1.action="/tech-qa-java/1.html";
document.submit;
}
function test2{
document.form2.action="/tech-qa-java/2.html";
document.submit;
}
function test1{
document.form1.action="/tech-qa-java/1.html";
document.submit;
}
function test2{
document.form2.action="/tech-qa-java/2.html";
document.submit;
}
|
这可以变通嘛:就是这个JSP页面中的FORM 提交给自己。这个JSP再把数据保存在SESSION中。如果FORM提交时数据已经输入完,JSP就转到下一个JSP页,
这下个JSP页中SESSION中取数据,并且保存起来,这就完成了数据处理
这下个JSP页中SESSION中取数据,并且保存起来,这就完成了数据处理
|
这么长,头晕。
你说只能看到最后一次的记录,可能的原因是:
在每次提交后你没有创建新的元素加入,Vector的add只是加引用,如果你每次用同一个对象,当然是只有一个元素了。
是不是作为servlet的全局了?是不是没有new一个对象再加入,等等,还是你自己看一下吧。
-----------
我是燕赤霞,替人办事是要收钱的。
你说只能看到最后一次的记录,可能的原因是:
在每次提交后你没有创建新的元素加入,Vector的add只是加引用,如果你每次用同一个对象,当然是只有一个元素了。
是不是作为servlet的全局了?是不是没有new一个对象再加入,等等,还是你自己看一下吧。
-----------
我是燕赤霞,替人办事是要收钱的。
|
大体上看了你的code 想问一下:如果你是在form2中每提交一次就调用一次这个servlet(也就是说新建了一个Vector的对象m2PortVector,虽然都叫
m2PortVector,但事实上没调用一次servlet,就新建了一个。没有对先前的进行存储。具体如何解决,就看看老前辈的办法吧。
m2PortVector,但事实上没调用一次servlet,就新建了一个。没有对先前的进行存储。具体如何解决,就看看老前辈的办法吧。