【问题标题】:Spring MVC HttpServletRequest request: which button clicked onSpring MVC HttpServletRequest 请求:单击了哪个按钮
【发布时间】:2013-04-25 02:25:57
【问题描述】:

我有一个包含三个按钮的表单,一个用于保存、更新和查询,但是我想知道服务器端用户单击了哪个按钮。我尝试使用 request.getParameter("action") 和 request.getAttribute("action") 但它们都返回 null。有什么方法可以在服务器上获取它,也许我可以在会话中存储“动作”值?如果是这样,我如何创建和存储会话变量?

代码

<button class="btn" value="save"  id="action"></button>

<button class="btn" value="update"  id="action"></button>

<button class="btn" value="query"  id="action"></button>

基本上我试图避免重新发布到服务器。我知道我想使用 POST/redirect/GET 模式,但是我的方法不支持重定向,即使更改并且表单有错误,我也无法返回服务器验证。

控制器

@RequestMapping(value = "crime_registration_save.htm", method = RequestMethod.POST)
    public ModelAndView handleSave(@Valid @ModelAttribute Crime crime,HttpServletRequest request,
            HttpServletResponse response,BindingResult result, ModelMap m, Model model) throws Exception {


        String action = request.getParameter("action");

    logger.info("The requested action is "+ action);
        if (result.hasErrors()) {

            logger.debug("Has Errors In crime_registration_save");
            model.addAttribute("dbcriminals", myCriminalList);
            model.addAttribute("dbvictims", myVictimList);
            model.addAttribute("status", myStatusList);
            model.addAttribute("crimeCategory", myCrimeCategoryList);
            model.addAttribute("crimeLevel", myCrimeLevelList);
            model.addAttribute("officers", myOfficerList);

            model.addAttribute("victimList", crime.getVictims());
            model.addAttribute("criminalList", crime.getCriminals());

            model.addAttribute("crimeTypeList",
                    crimeTypeManager.getCrimeTypeList(crime.getOffenceCatId()));
            model.addAttribute("icon", "ui-icon ui-icon-circle-close");
            model.addAttribute("results", "Error: Unable to Save Record!");

            return new ModelAndView("crime_registration");
        }
        logger.debug("No errors going to preform save");

        int crimeRecNo;

        crimeRecNo = crimeManager.saveCrime(crime);

        model.addAttribute("dbcriminals", myCriminalList);
        model.addAttribute("dbvictims", myVictimList);
        model.addAttribute("status", myStatusList);
        model.addAttribute("crimeCategory", myCrimeCategoryList);
        model.addAttribute("crimeLevel", myCrimeLevelList);
        model.addAttribute("officers", myOfficerList);
        model.addAttribute("save", "disabled");
        model.addAttribute("victimList", crime.getVictims());
        model.addAttribute("criminalList", crime.getCriminals());

        model.addAttribute("crimeTypeList",
                crimeTypeManager.getCrimeTypeList(crime.getOffenceCatId()));
        model.addAttribute("crimeRecNo", crimeRecNo);
        model.addAttribute("crimeRecordNoStatus", "true");
        model.addAttribute("icon", "ui-icon ui-icon-circle-check");
        model.addAttribute("results", "Record Was Saved");



        return new ModelAndView("crime_registration");
    }

jquery

function submitPage(urlMapping,method,action) {
        alert(urlMapping);
        document.getElementById("crime_registration").action = urlMapping;
        document.getElementById("crime_registration").target = "_self";
        document.getElementById("crime_registration").method = method;
        document.getElementById("crime_registration").submit();
        $('#action').val(action);

        alert($('#action').val());
        return false;
    }

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    表单的东西不是请求属性,它们是参数。

    使用提交,给它一个名称,然后通过该名称检索参数。

    <input type="submit" class="btn" value="save" name="action" />
    
    String button = request.getParameter("action");
    

    如果它在表单中不是,您将需要一些 JavaScript,但您的问题暗示它是。

    【讨论】:

    • 我无法使用提交按钮,因为我正在使用 java 脚本发布表单
    • @dev_darin 这没有任何意义;您可以使用提交元素对按钮元素执行任何操作。
    • @dev_darin 代替按钮单击事件,您可以添加表单提交处理程序来处理您的案例
    【解决方案2】:

    这里的解决方案是有一个名为action 的隐藏变量,点击按钮后,您可以使用点击按钮的值更新隐藏变量,然后提交表单。

    例如:

    <form action="" method="post" name="myform">
        <input type="hidden" name="action" />
    
        ....
    
        <button class="btn" value="save"  id="action" onclick="submitForm(this)"></button>
        <button class="btn" value="update"  id="action" onclick="submitForm(this)"></button>
        <button class="btn" value="query"  id="action" onclick="submitForm(this)"></button>
    </form>
    

    然后

    <script>
    
        function submitForm(btn){
            var frm = document.myform;
    
            frm.action.value = btn.value;
            frm.submit();
            return false;
    
        }
    
    </script>
    

    【讨论】:

    • 即使点击了浏览器重载按钮,重新提交帖子,隐藏字段是否会得到它的值?
    • 是的,重新加载按钮将重新提交包含该操作的 POST
    • 我这样做了,我还设置了 action 的值,并显示了 $('#action').val() 的警报,它准确地显示了设置的值,但是当我执行 request.getParameter (“动作”)它的空白没有显示
    • @dev_darin 你在用 jquery 吗?也可以分享一下表单是如何提交的
    • @dev_darin 你能分享一下html和javascript部分吗
    【解决方案3】:

    您需要添加到按钮的只是属性 type="submit" 和属性 name="parametername"。然后按钮标签就像提交类型的输入一样,其优点是值可以不同于显示文本或您放在按钮标签内的任何内容。

    如果您想使用 ajax 提交表单,我现在会使用 jquery ajaxform 插件来处理这个问题。

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      相关资源
      最近更新 更多