【问题标题】:How to submit a form partially?如何部分提交表单?
【发布时间】:2013-02-27 05:36:02
【问题描述】:

我有一个包含许多不同字段的表单,此表单的字段与两个表相关联, 提交表单后,我应该怎么做才能只更新受影响的表?

表凭证

ID
username
password
question
answer

表用户

    ID
    name
    surname
    age
    CredentialID

假设用户只是更新了他/她的名字。提交表单后,我只需要更新用户表的名称字段而不是凭据表的任何字段,因为它的关联字段没有更改。我知道一种方法是使用类检查提交的值还有其他选择吗? 我不想更新所有值以提高性能并降低数据库成本的原因。此外,有什么方法可以在客户端进行比较?我正在使用 prepareStatement 来更新数据库。

  public class User{
      ID
      CredentialID
      name
      surname
      age
      username
      password
      question
      answer
  }

表格

  <s:form action="register" method="POST">
   ... name
   surname
   age
   username
   password
   question
   answer ...
 </s:form>

【问题讨论】:

  • 更新那些未更改的值不会产生影响,因为相同的值将被覆盖。这就是您从表单中检索值的方式吗?
  • 这些表之间有什么关系
  • 你是如何更新数据库的?你在使用休眠/JPA 还是其他什么?
  • @UmeshAwasthi,我正在使用preparestatement
  • @PSR,问题已更新

标签: java jquery jsp jakarta-ee struts2


【解决方案1】:

我知道一种方法是使用类检查提交的值还有其他选择吗?

对我来说,您似乎知道您可以通过将类的所有新变量与旧变量进行比较来在服务器端检查这一点,但是您希望有一种更快且资源消耗更少的方式。

所以,我如何实现这一点的基本想法是客户端(浏览器)需要检查“组”(凭据或用户)的值是否已更改并将此信息提交给服务器。我不确定使用 Struts 时的 HTML 标记,但基本上它看起来像这样:

<form>
   <!-- credential fields -->
   <input type="text" name="username" id="username" onchange="credentialChanged()"/>
   <input type="text" name="question" id="question" onchange="credentialChanged()" />
   ...
   <!-- indicates the server if credential fields have changed -->
   <input type="hidden" name="credential-changed" 
          id="credential-changed" value="false" />

   <!-- uer fields -->
   <input type="text" name="name" id="name" onchange="userChanged()"/>
   <input type="text" name="surname" id="surname" onchange="userChanged()"/>
   ...
   <!-- indicates the server if user fields have changed -->
   <input type="hidden" name="user-changed" 
          id="user-changed" value="false" />
</form>

然后你使用javascript函数credentialChanged()userChanged()来更新隐藏字段:

function credentialChanged(){
  document.getElementById("credential-changed").value = "true";
}

function userChanged(){
  document.getElementById("user-changed").value = "true";
}

在服务器端,您可以获取隐藏字段的值并知道值是否已更改。

注意:如果用户将某个字段的值从“UserXYZ”更改为“UserABC”,然后将其改回“UserXYZ”,则将设置相应隐藏字段的值为真。您将不得不添加额外的 Javascript 来比较客户端的新旧值,但这个想法应该很清楚。

【讨论】:

    【解决方案2】:

    您有以下选择:

    1. 维护一个隐藏字段,该字段包含与文本字段相同的值,当提交表单时,将文本框值与隐藏值进行比较,并相应地更新表格,即如果输入的用户名与隐藏的用户名值不匹配,仅更改该凭据表。

    2. 如果是像更新用户信息这样的表单,那么最好将每个单独的字段设置在单独的表单中。

    【讨论】:

    • 如果我选择第二个选项,那么每个表格都会有一个提交按钮,对吧?那么如果我有 10 张桌子呢?
    • 那么我认为第一个选项应该可以正常工作,因为在提交表单之前它将确定它应该谈论哪个表。
    • 我认为第一种方法不是一个好主意,并且需要长时间比较并且仍然影响性能,我认为应该在客户端而不是服务器端做一些事情。跨度>
    • 尝试类似:&lt;form onSubmit="submitForm()"&gt; &lt;input type="text" name="username" onChange="form1FieldChaged()" /&gt; &lt;input type="text" name="password" onChange="form1FieldChaged()" /&gt; &lt;input type="text" name="surname" onChange="form2FieldChaged()" /&gt; &lt;input type="text" name="ID" onChange="form2FieldChaged()" /&gt; &lt;/form &gt; function form1FieldChaged(){ form1Changed = true;} function form2FieldChaged(){ form2Changed = true;} function submit-form(){ if(form1Changed ==true){update table1} else if(form2Changed ==true){update table2} }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2013-03-06
    • 2021-02-03
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多