【问题标题】:Method Not Allowed, status=405, HTML form using Thymeleaf方法不允许,状态 = 405,使用 Thymeleaf 的 HTML 表单
【发布时间】:2021-10-17 09:27:08
【问题描述】:

我使用 Thymeleaf 制作了一个表单,但遇到了这个问题。 我阅读了很多文章,但没有找到任何解决方案。
您可以提出任何解决方案吗?

项目控制器 ->

@Controller
public class Controllers {

@GetMapping("/home")
public ModelAndView home(){
    System.out.println("User is in Homepage");
    return new ModelAndView("index");
}

@GetMapping("/service")
public ModelAndView service(){
    System.out.println("User is in Service Page");
    return new ModelAndView("service");
}

@GetMapping("/about")
public ModelAndView about(){
    System.out.println("User is in About page");
    return new ModelAndView("about");
}

这是提交表单的控制器类 ->

 @Controller

public class SavingUser{

@Autowired
private UserRepository userRepository;


@PostMapping("/registerUser")
public ModelAndView user(@ModelAttribute Customer customer, ModelMap model){
    System.out.println("User in registration page..");
    userRepository.save(customer);
    model.addAttribute("saveUser", customer);
    return new ModelAndView("index");
 }
}

这是我的 HTML 表单 -

    <div id="form">
    <form action="registerUser" th:action="@{/registerUser}"  th:object="${saveUser}" method="POST">
        <br />
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
        <label for="name">Your Name:</label><br />
        <input type="text" th:field="*{name}"  placeholder="" /><br />

        <label for="suburb">Your Suburb</label><br />
        <input type="text"  th:field="*{suburb}"  placeholder="" /><br />

        
            <input class="submit" type="submit" value="Submit"  />
            <br /><br />
        </div>
    </form>
    </div>

我尝试删除 action="",但还是没有用。

【问题讨论】:

    标签: java html spring spring-mvc thymeleaf


    【解决方案1】:

    好吧,从我在代码中看到的内容来看,您错过了控制器中的 @GetMapping 方法来实际显示页面。不是很清楚您在哪一步获得 405 状态。如果您还从控制台添加相关的异常消息,这将很有用。

    编辑: 要回答原始问题,您会得到 405,因为在 Post Controller 中,您向不存在的“/services”发出 POST 请求(只有服务存在 GET)。

        @PostMapping("/registerUser")
        public ModelAndView user(@Valid @ModelAttribute Customer customer, BindingResult result, ModelMap model){
            [...]
            return new ModelAndView("service"); // this makes a POST to "service" endpoint!
        }
    

    要纠正这个问题,您必须像这样重定向到页面:

        @PostMapping("/registerUser")
        public ModelAndView user(@Valid @ModelAttribute Customer customer, BindingResult result, ModelMap model){
            [...]
            return new ModelAndView("redirect:/service"); // this makes a GET to "service" endpoint
        }
    

    除此之外,还有很多可以改进的地方。首先,您没有在项目中使用 Thymeleaf。不会处理任何 Thymeleaf 标记。要使用它,您必须首先添加依赖项,然后将 Thymeleaf 配置为您的 HTML 解析器。做这一切的正确方法详细here

    另外,我真的建议阅读 Thymeleaf documentation 并遵循一些教程来了解事情的工作原理。

    【讨论】:

    • 你能澄清一下@GetMapping 在这里做什么以及应该返回什么?对于已经很好地显示视图的所有控制器,我有另一个控制器类。这个表单,当我点击提交时,控制台消息是'方法'POST'不支持'
    • @WaisShuja 我指的是显示页面的控制器类。有很多事情可能会触发 405 状态,没有额外的信息很难调试。例如,它可能由安全设置、不兼容的对象导致的错误方法调用或混淆 https 和 http 触发。
    • @WaisShuja 描述中仍然缺少显示“注册用户”页面的控制器。用 Thymeleaf 提交表单的难度和 JSP 一样,没什么花哨的。这里的问题在于尚未显示的东西。如果项目不合理,您可以压缩项目并在此处提供链接吗?更容易看到实际发生的事情。
    • @WaisShuja 我会调查它并返回答案,不用担心。
    • @WaisShuja 看到项目后更新了原始答案。干杯!
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多