首页 > 解决方案 > Spring On Submit Button 文本框值保持不变,但选择标签变空

问题描述

这是我的 PojoClass

package com.LoginPojo;

    import org.hibernate.validator.constraints.NotEmpty;

    public class LoginDeatils {
    public String state;

    public String district;

    public String userName;



    public String getDistrict() {
        return district;
    }

    public void setDistrict(String district) {
        this.district = district;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }



    }

这是我的 JSP 文件:-

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
        <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
            <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
        <form:form action="login" method="POST" commandName="loginBean" accept-charset="UTF-8">  
        <table> 
        <tr>
            <td>Name:<form:input id="userName" name="userName" path="userName" /><br></td>
             <td align="left"><form:errors path="userName" cssClass="error"/></td>
        </tr>

            <tr>
                <td>State: <form:select path="state" items="${stateList}" onchange="addDistrictValues()"  /><br></td>
            </tr>

            <tr>
                <td>District: <form:select path="district"    /><br></td>

            </tr>

        </table>
        <input type="submit" value="login"/>

    </form:form>
        <script type="text/javascript">

            function addDistrictValues() {
                 document.getElementById("userName").value="abchd";    

                 var x = document.getElementById("district");
                 var option = document.createElement("option");
                 option.text = "Raigad";
                 x.add(option); 


            }
            </script>

    </body>
    </html>

这是我的控制器:

package com.SelectTagPackage;

    import java.util.ArrayList;
    import java.util.List;

    import javax.validation.Valid;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;

    import com.LoginPojo.LoginDeatils;
    import com.validator.LoginValidator;

    @Controller
    @RequestMapping("/login")
    public class SelectTagController {

        @Autowired
        LoginValidator loginValidator;

        public LoginValidator getLoginValidator() {
            return loginValidator;
        }

        public void setLoginValidator(LoginValidator loginValidator) {
            this.loginValidator = loginValidator;
        }

        @RequestMapping (method =  RequestMethod.POST)
         public ModelAndView loginPOST(@Valid @ModelAttribute("loginBean")LoginDeatils loginBean , BindingResult bindingResult,ModelMap map) throws Exception 
         {  
            loginValidator.validate(loginBean, bindingResult);
             if (bindingResult.hasErrors()) {           
                 return  new ModelAndView("pageForSelectTag"); //JSP Page Name
                }
             else
             {
                 System.out.println("bindingResult.hasErrors() else block");
           return  new ModelAndView("pageForSelectTag"); //JSP Page Name
             }
         }

        @RequestMapping (method =  RequestMethod.GET)
         public ModelAndView loginGET(@Valid @ModelAttribute("loginBean")LoginDeatils loginBean , BindingResult bindingResult,ModelMap map) throws Exception 
         {


           return  new ModelAndView("pageForSelectTag");
         }


        @ModelAttribute("stateList")
        public List loadprofessionList() {
             List<String> stateList = new ArrayList<String>();
             stateList.add("Maharashtra");
             stateList.add("Keral");

              return stateList;
        }

    }

这是我的验证器类:-

package com.validator;

    import org.springframework.stereotype.Component;
    import org.springframework.validation.Errors;
    import org.springframework.validation.ValidationUtils;
    import org.springframework.validation.Validator;

    import com.LoginPojo.LoginDeatils;



    @Component
    public class LoginValidator   implements Validator {

        public boolean supports(Class<?> arg0) {
            // TODO Auto-generated method stub
            return LoginDeatils.class.isAssignableFrom(arg0);
        }

        public void validate(Object arg0, Errors errors) {

            LoginDeatils objLoginDeatils=(LoginDeatils)arg0;

            if(!objLoginDeatils.getUserName().equals("milind"))
            {           
                 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "error.userName", "userName is requiredddd.");

            }

        }

    }

我的问题是:-每当我执行状态组合框的 onchange 事件时,都会发生 2 件事

<td>State: <form:select path="state" items="${stateList}" onchange="addDistrictValues()"  /><br></td>

1) addDistrictValues javascript 方法被调用。

function addDistrictValues() {
             document.getElementById("userName").value="abchd";    

             var x = document.getElementById("district");
             var option = document.createElement("option");
             option.text = "Raigad";
             x.add(option); 


        }

将 abchd 值设置为用户名文本框参考:-

document.getElementById("userName").value="abchd";

并且第二个 Raigad 值将被添加到区选择框 JSP 代码中:-

<td>District: <form:select path="district"    /><br></td>

javascript代码:-

var x = document.getElementById("district");
             var option = document.createElement("option");
             option.text = "Raigad";
             x.add(option);

但每当我点击提交按钮时我。e

<input type="submit" value="login"/>

控制器 loginPOST 方法被调用,内部调用 validate 方法并再次加载表单

@RequestMapping (method =  RequestMethod.POST)
     public ModelAndView loginPOST(@Valid @ModelAttribute("loginBean")LoginDeatils loginBean , BindingResult bindingResult,ModelMap map) throws Exception 
     {  
        loginValidator.validate(loginBean, bindingResult);
         if (bindingResult.hasErrors()) {           
             return  new ModelAndView("pageForSelectTag"); //JSP Page Name
            }
         else
         {
             System.out.println("bindingResult.hasErrors() else block");
       return  new ModelAndView("pageForSelectTag"); //JSP Page Name
         }
     }

但是当带有验证方法的控制器方法调用文本框值“abchd”保持在文本框上但我们通过javascript添加的“Raigad”值[也由javascript设置的文本框值]将从选择框中消失

so why only select box value only getting vanish but textbox value remains unchange , both are setting by javascript.

plz help 

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我在谷歌搜索了更多,但我没有从任何地方得到任何合适的解决方案

但是当带有验证方法的控制器方法调用文本框值“abchd”保持在文本框上但我们通过javascript添加的“Raigad”值[也由javascript设置的文本框值]将从选择框中消失

那么为什么在春天只选择框值只会消失但文本框值保持不变,两者都是由javascript设置的。

一旦你看到附加的图片,你的疑问就会变得清晰

请帮助

标签: javascriptjavaspringspring-mvc

解决方案


您没有为“地区”选择控件提供项目列表,就像您为“州”选择控件所做的那样。在你的控制器中试试这个:

    @ModelAttribute("districtMap")
    public List loadDistrictMap() {
         Map<String, String> districts new LinkedHashMap<String, String>();
         districts.put("1", "1st District");
         districts.put("2", "2nd District");
         districts.put("3", "Raigad");
         districts.put("n", "Nth District");

          return districts;
    }

然后在您的 JSP 表单中:

<td>District: <form:select path="district" items="${districtMap}"    /><br></td>

地区地图只是一个示例列表,它可能来自数据库或其他东西,但重点是您的控制器应该以某种方式提供可能的地区选项的完整列表,以便选择控件可以根据“路径”绑定正确的选项属性。


推荐阅读