【问题标题】:Request method 'GET' not supported Spring MVCSpring MVC 不支持请求方法“GET”
【发布时间】:2018-02-05 23:52:22
【问题描述】:

我在控制器中有以下代码

  private static final String CJOB_MODEL    = "cJobNms";

  @RequestMapping(value = MAIN_VIEW, method = RequestMethod.POST)
  public String showTestXsd(//@ModelAttribute(FORM_MODEL) TestXsdForm xsdForm,
            //@ModelAttribute(MODEL) @Valid
            //TestXsdTable testXsdTable,
            @RequestParam String selected,
            Model model) throws DataException {

        String cJobNm =null;
        List<String> cJobNmList = null;
        System.out.println("selected:"+ selected);
        String xsdView = testXsdService.getXsdString();
        cJobNmList = testXsdService.getCJobNm();
        Set<String> cJobNmSet = new HashSet<String>(cJobNmList);
        TestXsdForm xsdForm = new TestXsdForm();
        model.addAttribute("xsdView", xsdView);
        model.addAttribute("xsdFormModel", xsdForm);
        model.addAttribute(CJOB_MODEL, cJobNmSet);
        xsdForm.setXsdString(xsdView);

        return MAIN_VIEW;
    }

以及我的jsp中的以下代码。

<form:form modelAttribute="testXsdTable" name="xsdForm" action="/xsdtest/testXsdTables"
                        id="xsdForm" method="POST" class="form"
                                            enctype="multipart/form-data" >


            <tr>
             <td>
              <label for="cJobs" class="fieldlabel">Jobs:</label>
               <select id="cJobs" name="cJobs" >
                <option value="${selected}" selected>${selected}</option>
                <c:forEach items="${cJobNms}" var="table">
                    <c:if test="${table != selected}">
                            <option value="${table}">${table}</option>
                        </c:if>
                 </c:forEach>
               </select>
            </td>
            </tr>
            <pre>
               <c:out value="${xsdForm.xsdString}"/>
            </pre>
<div class="confirmbuttons">
    <a href="#"class="button positive" id="saveXsdButton" onclick="saveTestXsd();">
        <span class="confirm">Save</span>
    </a>
</div>

当用户从 cJobNms 列表中选择一个选项时,所选值应显示在控制器方法 showTestXsd 中。请让我知道我做错了什么。

目前我收到一条消息:不支持请求方法“GET”

 @RequestMapping(value = SAVE_VIEW, method = RequestMethod.POST)
public String saveTestXsd( @ModelAttribute(MODEL) @Valid
                            TestXsdTable testXsdTable,
                            final BindingResult result,
                            final Principal principal,
                            Model model) throws DataException {

    boolean isNew = true;
    System.out.println("entering saveTestXsd in controller");
    Map<String,Object> modelMap = model.asMap();
    String xsdView = (String)modelMap.get("xsdView");
    System.out.println("xsdView:::"+ xsdView);
    if(testXsdTable!= null){
         System.out.println("xsdView(testXsdForm):::"+ testXsdTable.getXsdView());
    }


    // Check for validation errors
    if (result.hasErrors()) {
        return SAVE_VIEW;
    }

    // Get the user information
    User loggedInUser = (User) ((Authentication) principal)
                        .getPrincipal();

    return SAVE_VIEW;
}

【问题讨论】:

  • 抱歉贴了这么多代码让大家对这个问题有所了解,我已经贴出来了,我正在学习Spring MVC。希望这个网站的人在发布这么多代码时不会发现问题。如果是这种情况,请道歉.....
  • 我在帖子中的评论的意思是当前显示作业下拉列表,当我选择一个值时,我希望所选值在控制器方法中可用以打印。
  • 请显示saveTestXsd() 的javascript。此外,您可以编辑您的问题以添加更多详细信息。
  • 我有一个 onchange 方法,但我从表单中取出了这个调用。我能够提醒选择的值,但我不确定如何在控制器中获取该值。我在 Js 中有这两行。
  • &lt;a&gt; 元素就像一个链接,它发送一个 GET。在发送 get 之前,由于您的 postForm,您正在发送一个由您的 @RequestMapping 处理的 POST,但您永远看不到响应,因为它隐藏在 ajax 调用中。 &lt;a&gt; 点击通过并尝试对显然不受支持的当前 URL 执行 GET。尝试在 saveTestXsd() 的 javascript 末尾添加 return false;

标签: java spring jsp spring-mvc jstl


【解决方案1】:

我将开始回答并在详细信息可用时添加。对于您当前的错误

org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'selected' is not present

这是因为当你有类似的东西时

@RequestParam String selected,

@RequestParam没有value属性集,Spring会使用参数名去寻找请求参数进行绑定。在您的表单中,您显然没有名为selected 的参数。你想要的是在

<select id="cJobs" name="cJobs" >

所以把你的@RequestParam改成

@RequestParam(value = "cJobs") String selected

匹配select输入元素的name属性。

【讨论】:

  • 所以我确实添加了它,并且我确实在表单中定义了“cJobs”,但是当我这样做时它说字符串参数'cJobs'不存在。
  • 你是什么意思在表单中定义“cJobs”?它已经在那里了。此外,这意味着您没有正确提交表单。你是怎么做到的?
  • 是的,我的意思是它已经存在,我之前在编写表单时已经定义了它。另一件要澄清的事情是我被困在第一阶段,我没有点击任何提交按钮。这个想法是一个页面出现下拉,我选择一个从数据库中获取数据并显示它的值。第二阶段是提交,调用 saveTestXsd() 方法。
  • 当我访问 url 时,我收到一个应用程序错误,错误指出参数 'cJobs' 不存在。
  • 我得到的spring异常是MissingServletRequestParameterException。
【解决方案2】:

替换

@RequestMapping(value = MAIN_VIEW, method = RequestMethod.POST)

@RequestMapping(value = MAIN_VIEW, method = RequestMethod.GET)

您还应该考虑更改表单 POST 方法。您的用例更多的是 Get 而不是 POST

【讨论】:

  • 我将表单中的方法从method="POST"更改为method="GET",也在showTestXsd RequestMapping中更改。它抱怨字符串参数'selected'不存在。
  • 仅此更改是不够的,因为 OP 使用 javascript postForm 发布表单。 IT 与 method="post" 属性无关。
【解决方案3】:

使用下一个代码

@RequestMapping(value = MAIN_VIEW, method = RequestMethod.GET)
//if you want to use both ( post and get ) remove Request Method annotation

//@RequestMapping(value = MAIN_VIEW)
@RequestParam(value="cJobs", required = false) String selected; 
//use this to handle an optional parameter

【讨论】:

    【解决方案4】:

    您只需更改您在代码中使用的@RequestParam,例如

    @RequestParam("studentName") String name
    

    将上面的代码行替换为

    @RequestParam(value="studentName") String name
    

    你的问题一定会解决的。

    【讨论】:

    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多