惊天一问。JSF。一个页中有很多文本框,数据库输出的,我修改了一个文本框 怎么将他的值重新获得?具体如下

poko 2007-04-16 02:39:44
惊天一问。JSF。一个页中有很多文本框,数据库输出的,我修改了一个文本框 怎么将他的值重新获得?具体如下

数据库有100个产品。
我讲她全部用<h:inputText输出了,我修改了其中几个,然后按确定后怎么将其更新到数据库,因为必须得到数据库的id,但是我不知道把ID放哪里?

因为只有1个确定按钮
...全文
525 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
poko 2007-04-18
  • 打赏
  • 举报
回复
这么快,像QQ一样啊

谢谢。
WIN_ANGEL 2007-04-18
  • 打赏
  • 举报
回复
^_^ 我升级啦 前几天刚来的时候还是一个三角裤 现在2个啦 我要变成猩猩 HOHO~
我们一起学习一起提高 叔的话你可以看一下这里xiekaiwen发的《请问树读取数据库的难题》也是比较靠上的帖子 也许对你会有用
poko 2007-04-18
  • 打赏
  • 举报
回复
我忘记说重要的一点了。

我那里的情况是一个树,因为是产品的分类
具体是这样的
比如:
百货
└卫生用品
└餐具
家电
└厨房电器
└烧水类

是这样的一个不定深度的树组成的。页面显示用的是tree2,
让tree2每个节点显示为一个<h:inputText
然后修改了之后全部更新到数据库。所以我需要对应<h:inputText输出数据的那个id。

啊。,你的做法应该确实是可行的,我现在明白了。

原来我一直担心2次数据之间没关联,现在知道了
后台数据关联这一步是JSF自己完成的。
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
晕 我好像知道问题出在哪了 确实可能是那两个list的问题 换个笨办法
public class ProductPage {
private ArrayList browselist;
private ArrayList modifylist;

public ArrayList getModifylist() {
return modifylist;
}
public void setModifylist(ArrayList modifylist) {
this.modifylist = modifylist;
}

public ArrayList getBrowselist() {
return Browselist;
}
public void setBrowselist(ArrayList browselist) {
this.browselist = browselist;
}

public String toList(){
.......
.......
modifylist = XXXXX.YYYY();
browselist = XXXXX.YYYY(); //这句 够笨吧 和上句一样得到相同的结果集 因为之前的复制方法两个list里相对应的对象一样的所以当他们都调用getXXXX()取值时会出现问题 换这个方法试试 只是访问了2次数据库 比较差的解决办法 先试试看看能不能实现你想要的 然后再想优化的方法 先实现后优化嘛 ^_^
}

public String toModify() {
int i = 0;
String[] products_id = new String[modifylist.size()];
Iterator it = modifylist.iterator();
Iterator it2 = browselist.iterator();
while (it.hasNext()) {
Product PB = (Product) it.next();
Product PB2 = (Product) it2.next();
if (!(PB.getProduct_name.equals(PB2.getProduct_name))) {
products_id[i] = PB.getProduct_id();
i++;
}
}
......
......
return "next";
}
}
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
因为我在此之前用做过一个批量删除的工作 就是迭代出来的所有记录前都有个<h:selectBooleanCheckbox>(单选框)可以选中多个 然后点下面有个总的删除按钮 就可以将所有选中的记录删除 用的就是类似上面给出的方法 我相信楼主的问题可以用同样的方法解决 应该不用动用js的
因为现在手上有工作 所以没办法专门调试 楼主在之前说到的“会乱掉”具体是怎么回事呢?可以具体描述一下么 或者你用断点调试跟踪一下看看是哪里出了问题 因为我上面的代码只是给出个思想 程序里可能会有错 这个问题我本身也很感兴趣 希望能通过继续的讨论把它解决掉
leojay1 2007-04-17
  • 打赏
  • 举报
回复
WIN_ANGEL(WIN_ANGEL) ( ) 方法应该可以,没有试过

但是理论上是可以的,因为jsf 可以把你页面的list修改和后台自动绑定过去

所以你提交的时候,数据修改直接就体现在了那个list上了,而list 里面是bean信息,循环就可以进行处理了
zhaochunhui 2007-04-17
  • 打赏
  • 举报
回复
用js辅助下不是挺好吗
poko 2007-04-17
  • 打赏
  • 举报
回复
会乱掉啊

我暂时也没好办法了
快3天了,今天打算用JS辅助一下,

好象真没办法了
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
回楼主 上面leojay1(绯村剑心) 也说过了 “因为jsf 可以把你页面的list修改和后台自动绑定过去” list显示在页面上的值和普通属性一样 是被绑定的 因此你修改后里面的值自然就变了 而且不会出现错乱的现象 只改变了值没有改变顺序 所以我才给出了上面的方法 因为以前我做过类似的方法 是成批的删除 被选中的多个记录也是通过1个按钮全部删除 而且在此之前我也曾与你提的这个问题擦肩而过 有一次做项目差点就要求这样做了 不知道后来上面为什么取消了这个决定 但当时确实有提出过 我也简单的想过 当时大概的考虑就是上面给出的那个方法 因为最后没有做 所以也就没深考虑 直到前几天看到你提的这个问题才又想起了这个话题 我感觉单纯用JSF和JAVA是完全可以实现的 你做的项目里id应该是主键吧 只要知道那些记录不同就可以将修改过的list里的值取出 然后连接数据库通过id为条件进行update
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
???楼主指的是怎么乱掉?因为只是随手写了一下没有考虑太多 只是给你提供这样一个思路 可能不是最优的 但是是我能想到比较好的办法了 我们可以讨论一下 因为这个题目说不准以后我也会用上
poko 2007-04-17
  • 打赏
  • 举报
回复
WIN_ANGEL(WIN_ANGEL)

1、第2个arrayList是根据浏览器回传的数据组成的,
浏览器会不会把原来第2位置的那条数据先传回来呢?或者他是按照什么次序来传递数据的

2、这到没什么,只是想说明下那些数据重复,如果没重复,到好办我直接对比就知道。
我的功能是修改产品分类数据。先将这些分类全部显示出来,然后修改,然后再保存回数据库,
我想一次性全部修改好后保存,但是修改后不知道这些数据对于原来的哪条了

也可以我的方向错误了,我想自己写个组件也未必能解决
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
楼主
“我猜想这1、2 两个步骤没有指定任何排序的方法,也无法指定,会不会在传递中把数据的次序排列弄混乱。”
上面那句我没太明白 因为ArrayList 本身是有序的 因此不会出现排列次序混乱的情况(指从modifylist取出再装入browselist 那这两个list里数据的顺序应该是一样的)

“这些数据的内容也有重复的,其实只要让我记录一下数据库的id到该条数据就可以了”这句里的“数据库的id到该条数据就可以了”我没太理解 你能再具体描述一下你的需求么?
poko 2007-04-17
  • 打赏
  • 举报
回复
WIN_ANGEL(WIN_ANGEL)

我理解你的方法是这样,
1、先从数据库把数据输出到页面
2、获得从页面提交的数据,
3、把2次数据对比

我猜想这1、2 两个步骤没有指定任何排序的方法,也无法指定,会不会在传递中把数据的次序排列弄混乱。

这些数据的内容也有重复的,其实只要让我记录一下数据库的id到该条数据就可以了
可是就是没地方,我试了讲<h:inputText的 name和id属性设置为数据库中的id。但是都不允许。

要是实在没办法,只能自己写一个可以带id的组件了,只是太浪费时间。
我想扩展一下原来的<h:inputText或者myfaces的<t:inputText 可是还没找到他的源代码的文件。
不知道放在哪个文件中?
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
楼主指的乱了是指
for(int i=0;i<modifylist.size-1;i++){
browselist.add(modifylist.get(i));
}

确实不小心打错了 应当是i<modifylist.size; 不好意思
改下看看能好用不 不行的话就换后来说的访问2次数据库的方法
希望能有高手来指点一下 有什么比较好的办法 能知道一个list存的 对象 的属性 被改动过
WIN_ANGEL 2007-04-17
  • 打赏
  • 举报
回复
回fufengchun()
正如leojay1(绯村剑心) 所说“因为jsf 可以把你页面的list修改和后台自动绑定过去
所以你提交的时候,数据修改直接就体现在了那个list上了,而list 里面是bean信息”
其实当在toModify() 里操作modifylist时 modifylist就是那个已经改过的list 现在问题是楼主只想要改过的那些记录 而不是所有的 这就要比较哪些是改过的 我也在想有没有好的办法能知道哪些是改过的 希望能有高手给出好的办法
fufengchun 2007-04-17
  • 打赏
  • 举报
回复
为什么不放在request里面呢,首先从数据库中取出记录,通过Product.java里面的get方法,可以取出所有的结果。如果你修改了表单里面的数据,最后提交的时候通过Product.java里面的set方法,从新就值放进去放在一个list里面,在操作数据库的时候再从list里面取不就得了。
poko 2007-04-16
  • 打赏
  • 举报
回复
办法是个好办法,但是想问下。这2次数据传递后顺序不会乱掉吗?

有点担心
WIN_ANGEL 2007-04-16
  • 打赏
  • 举报
回复
首先更正一下
if (!(PB.product_name.equals(PB2.product_name))) 这句应为
if (!(PB.getProduct_name.equals(PB2.getProduct_name)))

<h:outputText value = "#{list.product_name}" />这句按楼主的需要赢改为
<h:inputText value = "#{list.product_name}" />
下面我对上述代码做一下说明:
Product.java这个类没什么说的只是用来存储数据
ProductPage.java 这个类是具体操作的类 在JSF的配置文件里将它的传值方法设为session传值(这点很重要)
toList()方法是得到显示结果modifylist的方法(假设modifylist存储的是从数据库里取得的product_id和product_name) 也就是触发它得到结果然后通过return "list";导航到显示的页面上 其中的for循环是用来将modifylist做一个备份以便以后比较 当然你也可以用clone或其它方法达到相同的目的 这里只是为了演示
return "list";这句中的字符串"list"是在JSF配置文件里定义的导航字符串 用来导航到含有上面页面代码的页面
toModify()方法应该就是楼主想要的方法 也就是楼主所说的那一个按钮要触发的方法 因为ProductPage.java是用session传值所以modifylist始终存在所以在toModify()方法里可以直接用 用两个迭代器分别迭代修改过的modifylist和备份的browselist 并对其中的product_name属性进行比较 如果不同则将product_id取出存入数组String[] products_id
估计以上所写应该对楼主有所帮助吧
wuhuawu09 2007-04-16
  • 打赏
  • 举报
回复
不明白,帮顶
WIN_ANGEL 2007-04-16
  • 打赏
  • 举报
回复
一个数据仓库Product.java如下:
public class Product{
private String product_id;
private String product_name;

public String getProduct_id() {
return product_id;
}
public void setProduct_id(String product_id) {
this.product_id = product_id;
}
public String getProduct_name() {
return product_name;
}
public void setProduct_name(String product_name) {
this.product_name = product_name;
}
}
又有一个ProductPage.java 如下:
public class ProductPage {
private ArrayList browselist;
private ArrayList modifylist;

public ArrayList getModifylist() {
return modifylist;
}
public void setModifylist(ArrayList modifylist) {
this.modifylist = modifylist;
}

public String toList(){
.......
.......
modifylist = XXXXX.YYYY();
browselist = new ArrayList();
for(int i=0;i<modifylist.size-1;i++){
browselist.add(modifylist.get(i));
}
return "list";
}

public String toModify() {
int i = 0;
String[] products_id = new String[modifylist.size()];
Iterator it = modifylist.iterator();
Iterator it2 = browselist.iterator();
while (it.hasNext()) {
Product PB = (Product) it.next();
Product PB2 = (Product) it2.next();
if (!(PB.product_name.equals(PB2.product_name))) {
products_id[i] = PB.getProduct_id();
i++;
}
}
......
......
return "next";
}
}
页面当中有如下代码片段:
<t:dataTable var = "list" value = "#{ProductPage.modifylist}">
<h:column>
<f:facet name="header">
<h:outputText value = "产品名" />
</f:facet>
<h:outputText value = "#{list.product_name}" />
</h:column>
</t:dataTable>

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧