2

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

表凭证

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>
4

2 回答 2

2

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

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

因此,我如何实现这一点的基本想法是客户端(浏览器)需要检查“组”(凭据或用户)的值是否已更改并将此信息提交给服务器。我不确定使用 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”,则相应隐藏字段的值将设置为 true。您将不得不添加额外的 Javascript 来比较客户端的新旧值,但这个想法应该很清楚。

于 2013-02-27T06:12:10.913 回答
1

您有以下选择:

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

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

于 2013-02-27T05:50:07.613 回答