Java 在Struts 2中,只更新表单中的单个字段,其他信息保持不变

Java 在Struts 2中,只更新表单中的单个字段,其他信息保持不变,java,jsp,jdbc,struts2,Java,Jsp,Jdbc,Struts2,这里我想更新我现有的信息,但是每当我更新数据时,所有与特定代码相关的数据都会更新 但我不想这样,假设我只想更新密码,所以在我输入密码的表单中,只有密码应该更新,其他信息应该保持不变 但这不会发生,如果我只更新一个字段,其他字段将变为空白。那么解决方案是什么呢?您需要扩展ParameterNameAware并实现acceptableParameterName。在这种方法中,您可以获得输入参数的名称,您可以通过返回true来接受它,或者通过返回false来拒绝它 可以在以下位置找到示例:我得到了您想

这里我想更新我现有的信息,但是每当我更新数据时,所有与特定代码相关的数据都会更新

但我不想这样,假设我只想更新密码,所以在我输入密码的表单中,只有密码应该更新,其他信息应该保持不变


但这不会发生,如果我只更新一个字段,其他字段将变为空白。那么解决方案是什么呢?

您需要扩展
ParameterNameAware
并实现
acceptableParameterName
。在这种方法中,您可以获得输入参数的名称,您可以通过返回
true
来接受它,或者通过返回
false
来拒绝它


可以在以下位置找到示例:

我得到了您想要的,您想要更改只返回指定电子邮件的一条记录的查询。电子邮件在表中应该是唯一的

package org.entity;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

import com.opensymphony.xwork2.ActionSupport;

public class BloodBankEditAction extends ActionSupport {
    BloodBankEdit bupdate;

    public BloodBankEditAction() {
        // TODO Auto-generated constructor stub
    }

    public BloodBankEdit getBupdate() {
        return bupdate;
    }

    public void setBupdate(BloodBankEdit bupdate) {
        this.bupdate = bupdate;
    }

    @Override
    public String execute() throws Exception {
        try {

            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/foryou", "root", "siddheshkk");
            System.out.println("Driver Loaded");
            PreparedStatement st = con
                    .prepareStatement("Update bbinfo SET name=?,address=?,city=?,district=?,contactno=?,password=?,aname=?,email=? where code=?");
            st.setString(9, bupdate.getCode());
            st.setString(1, bupdate.getName());
            st.setString(2, bupdate.getAddress());
            st.setString(3, bupdate.getCity());
            st.setString(4, bupdate.getDistrict());
            st.setString(5, bupdate.getNumber());
            st.setString(6, bupdate.getPassword());
            st.setString(7, bupdate.getAname());
            st.setString(8, bupdate.getEmail());
            System.out.println("Executed");
            st.executeUpdate();
            PreparedStatement st1 = con
                    .prepareStatement("Update stockinfo SET name=?,city=?,address=?,contact=?,email=? where code=?");
            st1.setString(1, bupdate.getName());
            st1.setString(2, bupdate.getCity());
            st1.setString(3, bupdate.getAddress());
            st1.setString(4, bupdate.getNumber());
            st1.setString(5, bupdate.getEmail());
            st1.setString(6, bupdate.getCode());
            st1.executeUpdate();
            System.out.println("Done");
        } catch (Exception e) {
            System.out.println(e);
        }
        return "success";
    }

    @Override
    public void validate() {
        // TODO Auto-generated method stub
        super.validate();
        if (!(bupdate.getConfirm().equals(bupdate.getPassword()))) {
            addFieldError("bupdate.confirm", "Password doesnt match");
        }
    }

}

我如何实现这一点?你能给我的代码或链接,我可以了解吗?不,它没有安全漏洞:-),最新版本已硬编码排除参数,具有更高的优先级。所以给我正确的链接,我可以研究?有人吗?这里我想更新我现有的信息,但是每当我更新数据时,所有与特定代码相关的数据都会更新。但是我不想这样,假设我只想更新密码,所以在我输入密码的表单中,只有密码应该更新,其他信息应该保持不变。但这不会发生,如果我只更新一个字段,其他字段将变为空白。那么解决这个问题的方法是什么呢?除非您输入正确的数据,否则不会更新与特定代码相关的数据。如果您只想更新密码,那么您应该创建一个只返回密码进行更新的查询。
PreparedStatement st = con
.prepareStatement("Update bbinfo SET name=?,address=?,city=?,district=?,contactno=?,password=?,aname=?,code=? where email=?");
st.setString(1, bupdate.getName());
st.setString(2, bupdate.getAddress());
st.setString(3, bupdate.getCity());
st.setString(4, bupdate.getDistrict());
st.setString(5, bupdate.getNumber());
st.setString(6, bupdate.getPassword());
st.setString(7, bupdate.getAname());
st.setString(8, bupdate.getCode());
st.setString(9, bupdate.getEmail());
System.out.println("Executed");
st.executeUpdate();