请求方法'GET'不受支持 Spring MVC。

5

我在控制器中有以下代码

  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;
}

请展示 saveTestXsd() 的 JavaScript 代码。另外,您可以编辑您的问题以添加更多细节。 - Sotirios Delimanolis
我曾经为此编写了一个onchange方法,但我从表单中删除了这个调用。我能够警报所选值,但我不确定如何在控制器中获取该值。我在Js中有这两行代码。 - user2684404
用户将选择一个选项,根据所选选项进行数据库调用以检索数据并显示它,在内容显示后再保存。因此,目前我在saveTestXsd()中没有太多代码。但我可以添加它。 - user2684404
1
一个<a>元素就像一个链接,它发送一个GET请求。在发送GET请求之前,由于你的postForm操作,你正在发送一个POST请求,由@RequestMapping处理,但是你永远看不到响应,因为它被隐藏在ajax调用中。<a>单击事件会尝试转向并尝试对当前URL进行GET请求,显然是不支持的。尝试在saveTestXsd() JavaScript函数末尾添加return false; - Sotirios Delimanolis
亲爱的用户2684404,欢迎来到StackOverflow。实际上没有必要删除这个问题。在StackOverflow上,我们更喜欢保留已经得到答案的问题,以便其他人能够从中学习到一些东西。 - Simon Forsberg
显示剩余8条评论
4个回答

5
我将开始回答,并随着细节的逐步披露而添加。针对您当前的错误,
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'selected' is not present

这是因为在类似以下的情况下会发生这种情况:

。该内容中包含HTML标签,请注意不要删除它们。
@RequestParam String selected,

如果@RequestParam没有设置value属性,Spring将使用参数名称查找要绑定的请求参数。在您的表单中,显然没有名为selected的参数。您想要的是获取值。
<select id="cJobs" name="cJobs" >

所以把你的@RequestParam改为

@RequestParam(value = "cJobs") String selected

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


所以我确实添加了那个,也在表单中定义了“cJobs”,但是当我这样做时,它会说字符串参数“cJobs”不存在。 - user2684404
你说的“在表单中定义”cJobs是什么意思?它已经存在了。这也意味着你没有正确提交表单。你是怎么做的? - Sotirios Delimanolis
是的,我的意思是那已经存在了,在我编写表格时我已经定义过它了。另一件要澄清的事情是,我卡在了第一阶段,我没有点击任何提交按钮。想法是打开一个页面,有下拉菜单,我选择一个值,从数据库中获取数据并显示出来。第二阶段是提交,这会调用saveTestXsd()方法。 - user2684404
@user2684404 是的,请使用GET方法,该方法应由showTestXsd()处理。该方法将呈现一个带有来自数据库的值的HTML表单,并将其作为响应发送。在您的客户端(浏览器)中,您可以从下拉列表中选择一个值。然后提交表单(jaavscript或提交按钮),这将发送一个POST请求,该请求应由saveTestXsd()处理。这就是您可能想要的选定值请求参数的地方。 - Sotirios Delimanolis
如果我移除它,表单将会出现,但我的意图是在控制器中访问下拉列表框中选择的值。我该怎么做呢?我需要根据该选择从数据库中拉取必要的数据以便在下拉列表框下方显示数据。 - user2684404
显示剩余14条评论

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

使用

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

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


我将表单中的方法从method="POST"更改为method="GET",并在showTestXsd RequestMapping中进行了更改。它抱怨字符串参数“selected”不存在。 - user2684404
这个改变本身是不够的,因为 OP 正在使用 JavaScript 的 postForm 来提交表单。它与 method="post" 属性无关。 - Sotirios Delimanolis

0
请使用以下代码。
@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

-3

您只需要在代码中使用的@RequestParam做出更改即可。

@RequestParam("studentName") String name

将上面的代码行替换为

@RequestParam(value="studentName") String name

您的问题一定会得到解决。


我们可以缩写这个注解。当一个注解只有一个成员并且该成员命名为“value”时,您可以(并且应该)在注解中省略“value=”。 - Scala Enthusiast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接