Java 未保存在数据库中的复选框值

Java 未保存在数据库中的复选框值,java,struts,Java,Struts,我有一个jsp页面,上面有各种复选框 默认情况下,某些复选框处于禁用状态,并且已选中。有一个选项可以创建新模板并为复选框赋值。这些值保存到数据库中 我的问题是,所选复选框的保存值总是比用户选择的值少两个。在调试java代码时,我发现传递的值是由用户选择的。但禁用复选框的值会保存到DB中,用户选择的最后两个值不会保存到DB中 我在此附上选择值的代码和保存复选框值的代码 选择所选复选框值的代码 public ActionForward listSave(ActionMapping mapping,

我有一个jsp页面,上面有各种复选框

默认情况下,某些复选框处于禁用状态,并且已选中。有一个选项可以创建新模板并为复选框赋值。这些值保存到数据库中

我的问题是,所选复选框的保存值总是比用户选择的值少两个。在调试java代码时,我发现传递的值是由用户选择的。但禁用复选框的值会保存到DB中,用户选择的最后两个值不会保存到DB中

我在此附上选择值的代码和保存复选框值的代码

选择所选复选框值的代码

public ActionForward listSave(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    HardwareKey key = SecurityUtils.getKeySecurity();
    key.isFeaturePresent(HardwareKey.WS_DATA_EXCHANGE);

    DataExchangeTemplateForm thisForm = (DataExchangeTemplateForm) form;
    DataExchangeService service = (DataExchangeService) ServiceLocator
            .getServiceWithName(DataExchangeService.class.getName());
    ActionMessages errors = new ActionMessages();
    Integer dexTemplateId = thisForm.getTemplateId();

    String[] paramValues = request.getParameterValues("isRequiredFlag");
    String[] fieldIds = request.getParameterValues("fieldId");
    String[] dataTypeIds = request
            .getParameterValues("dexDataType.dataTypeId");
    String templateType = request.getParameter("templateType");
    boolean isDexTemplate = false;

    String direction = thisForm.getDirection();
    String dexTemplateName = thisForm.getDexTemplateName();
    if (Validator.isNullOrEmpty(dexTemplateName)) {
        ActionMessage msg = new ActionMessage("error.data.exchange",
                " Template name Can't be empty");
        errors.add("error.data.exchange", msg);
        saveErrors(request, errors);
        return view(mapping, form, request, response);
    }
    String dexTemplateVersion = thisForm.getDexVersion();
    if (Validator.isNotNullGreaterThanZero(dexTemplateId)) {
        DexTemplate dexTemplateOld = (DexTemplate) service.getObject(
                DexTemplate.class, dexTemplateId);
        String profileNameOld = dexTemplateOld.getDescription();
        if (!dexTemplateName.equalsIgnoreCase(profileNameOld)
                && service.isDuplicateTemplateName(dexTemplateName)) {
            ActionMessage msg = new ActionMessage("error.data.exchange",
                    "Duplicate Template name");
            errors.add("error.data.exchange", msg);
            saveErrors(request, errors);
            return view(mapping, form, request, response);
        }

        service.updateDexTemplateAndParams(dexTemplateName, direction,
                dexTemplateId, dataTypeIds, paramValues, fieldIds,
                dexTemplateVersion);
    } else {

        if (!service.isDuplicateTemplateName(dexTemplateName)) {
            if(templateType != null && templateType.equals("extranetDex")) {
                isDexTemplate = true;
            }
            dexTemplateId = service.saveDataExchangeTemplate(
                    dexTemplateName, direction, dexTemplateVersion, isDexTemplate);
            // saving params...             
            service.saveDexTemplateParams(dexTemplateId, dataTypeIds,
                    paramValues, fieldIds);
        } else {
            ActionMessage msg = new ActionMessage("error.data.exchange",
                    "Duplicate Template name");
            errors.add("error.data.exchange", msg);
            saveErrors(request, errors);
            return view(mapping, form, request, response);
        }
    }
保存所选复选框值的代码:

public void saveDexTemplateParams(Integer dexTemplateId,
        String[] dataTypeIds, String[] paramValues, String[] fieldIds)
        throws BaajaException {

    DexTemplate dexTemplate = (DexTemplate) getObject(DexTemplate.class,
            dexTemplateId);
    hibernateInitialize(dexTemplate);
    int fieldOrder = 1;
    if(paramValues!=null){
    for (int i = 0; i < paramValues.length; i++) {
        if (!Validator.isNullOrEmpty(paramValues[i])
                && paramValues[i].equalsIgnoreCase("true")) {

            DexTemplateField templatefield = new DexTemplateField();
            DexField dexField = (DexField) getObject(DexField.class,
                    Integer.parseInt(fieldIds[i]));

            templatefield.setDexField(dexField);
            templatefield.setDexTemplate(dexTemplate);
            templatefield.setFieldOrder(fieldOrder++);

            saveObject(templatefield);
        }
public void saveDexTemplateParams(整数dexTemplateId,
字符串[]数据类型ID、字符串[]参数值、字符串[]字段ID)
抛出一个异常{
DexTemplate DexTemplate=(DexTemplate)getObject(DexTemplate.class,
右旋;
hibernate初始化(dexTemplate);
int fieldOrder=1;
if(参数值!=null){
对于(int i=0;i

请建议任何可能的解决方案。

检查最后两个复选框的名称/id是否与其他复选框的名称/id相同


如果您使用的是Struts框架,建议使用FormBean附加到JSP表单。在该FormBean中,使用与
的属性属性相同的名称声明ArrayList。这将帮助您最大限度地减少支持/维护时间。

您可以通过在代码中的不同位置放置调试语句来尝试调试,然后您可以看到保存的值在何处增加了两次,并对其进行更正。代码中的任何位置都不会增加值。我尝试放置调试语句。但在保存时,它会将用户选择的值替换为预选复选框的值。在给定的代码中,我找不到进行此替换的语句ove,paramValues是用户选择的复选框的值。认真地说,是调试语句。您可以找到它的位置。在设置参数映射之前和之后的调试语句
templatefield
,在iBatis之后(或您正在使用的任何语句)在它插入到实际数据库中后接收值。您会找到它。如果它不在途中的链中,请调用数据库上的Ghostbusters。顺便说一下,我真的希望您将整数值指定给这些复选框,否则您的问题就没有意义了……是否即使您取消选中复选框,它也会显示
true在javacode中?