1

我遇到的问题是我在下拉列表中有两组值。如果选择了“A”类型,我希望用数据库中的值填充文本框并且是只读的。如果选择类型“B”,则该框为空且可编辑。

我的原始代码是用 jsp/struts 编写的,我通过使用实现了这一点

onchange="javascript:submit()"重新加载页面,但这有一个明显的缺点,即保存您所做的任何更改,这意味着您无法真正取消。

由于这种方法,我在服务器端验证方面也有其他问题。

有没有办法让 jsp 页面在更改时重新加载,这样我可以编写 javascript 来根据会话中保存的值更改页面的外观。这样,只有在正确填写页面并且服务器端验证将按设计工作时才会调用保存/提交功能。

我知道这是 AJAX 擅长做的事情,但如果可能的话,我会尽量避免它。

4

7 回答 7

3

我的朋友,AJAX 是您唯一的其他选择,除非在原始页面加载时加载文本框的所有其他可能值,这样您就不需要返回数据库。好吧,您可以尝试将文本框放在 IFRAME 中,但是使用这种方法可能会遇到比仅使用 AJAX 更多的问题。

于 2008-11-10T17:32:28.087 回答
1

I know a taglib that can fit to your problem: AjaxTags. I use this taglib in my J2EE projects and it is very simple to integrate it into web applications.

This taglib give you several tags designed to execute AJAX request in your jsp files.

Here is the description of each tags: http://ajaxtags.sourceforge.net/usage.html

The tag which will help you is the ajax:select tag. It allows you to populate a select tag which depends on an other field without reloading the entire jsp page.

If you more informations about it, ask me and i'll try to answer quicky.

于 2008-11-11T05:23:45.233 回答
1

如果我对您的理解正确,您是否想要一个下拉菜单 ( <select>) 或一个文本字段 ( <input type="text">),具体取决于表单上方某处的选择(通常是复选框或单选按钮)?

在这种情况下,您可能需要在服务器上以不同的方式处理这两种类型的输入,那么为什么不在表单区域中同时使用具有不同名称和 id 的选择框和文本字段,其中一个是隐藏的(display = none)。然后在选择更改时切换可见性。在服务器上,您选择选择框或文本区域输入(除非您也禁用(disabled="disabled")它们,否则两者都会出现,我认为这是不必要的)取决于选择输入。

当然,如果您期望用户通常只需要文本输入,并且只需要几次,则需要大量列表;最好使用 ajax 来检索列表。但是,如果它是相反的方式(你只需要偶尔的文本字段),正如我上面假设的那样,将两者都以初始形式出现会更快。

如果下拉列表仅包含易于生成的数据,例如从现在到数百年前,使用 Javascript 中的 for 循环生成数据客户端甚至可能更快(在服务器上需要更少的带宽)。

于 2008-11-13T13:13:31.690 回答
1

按照斯特林德豪格所说的,但如果你需要动态数据:

能否让后端将JS写入页面,然后JS根据需要更改表单?后端可以传播一些用于描述等的变量,然后 JS 可以相应地更改/更新表单。如果你不熟悉这个,像jQuery这样的库比rolling-your-own(至少以我的经验)更容易和跨浏览器。

旁白:如果您不使用 AJAX,因为它很难编码(因为我有一段时间没有使用 AJAX,因为我的第一次体验是从零开始,并不漂亮),正如其他人所说,像MooTools之类的库可以做到现在真的很容易。此外,正确使用 AJAX 并不丢人。它的名声很差,因为人们用它做愚蠢的事情,但是如果您不能简单地将预制值写入表单或者您必须进行实时查找,这是 AJAX 的正确用途之一。

于 2008-11-15T16:51:26.567 回答
1

如果没有 AJAX,您所要求的将是困难的。另一种选择(这很丑陋)是将第二个列表框的所有可能值写入数组或字典之类的数据结构中。

然后编写一些 javascript 以在用户从第一个列表框中选择时从数据结构中获取值。完成这项工作并以跨浏览器的方式正确完成工作需要编写大量的 javascript,这比简单地使用 AJAX 困难得多。

于 2008-11-10T17:35:39.263 回答
1

不知道为什么在当今世界你会尝试避免 AJAX,今天的 JS 库让它变得如此简单以至于不尝试它是疯狂的。

我只需要替换文森特指出的那样写的页面。考虑到 4 年前数据的相对大小,我认为当时它对应用程序是有意义的。现在应用程序已经扩展了,页面重复解析数据结构需要超过 30 秒(可能是写得不好的 JS?也许)。

我用一个非常简单的对 servlet 的 AJAX 调用替换了所有逻辑,该 servlet 只是根据传递给它的内容返回第二个下拉列表值的 JSON 响应,并且响应基本上是即时的。

祝你好运。

于 2008-11-10T17:45:57.387 回答
1

一种方法是更改​​表单的操作,以便将表单提交到与“保存”网址不同的网址。这使您可以重新加载表单的某些方面并返回到表单本身,而不是提交数据。

<script>
  function reload() {
    document.forms[0].action="reloadFormData.jsp";
    document.forms[0].submit();
  }
</script>
<form action="saveData.jsp" method="post">
  <select id="A" name="B" onchange="reload()"><!-- blah --></select>
  <select id="B" name="B"><!-- blah B --></select>
  <input type="submit">
</form>
于 2008-11-10T20:13:59.630 回答