【问题标题】:Bind request mapping to submit input button in html (Springboot)绑定请求映射以在html中提交输入按钮(Springboot)
【发布时间】:2017-02-09 02:21:15
【问题描述】:

我的请求控制器:

@Controller
@RequestMapping("/request")
public class RequestsController {

    private static final Logger log = LoggerFactory.getLogger(TmtApplication.class);

    @Autowired
    RequestRepository requestRepository;

    @Autowired
    UsersRepository usersRepository;

    @RequestMapping("/save")
    String saveRequest()
    {
        Request requestObj = new Request(usersRepository.findOne(1L), new Date());
        requestObj.setDescription("I got so bored");
        requestObj.setStatus(false);
        requestObj.setRequestDate(new Date());
        requestRepository.save(requestObj);
        return "index";
    }
}

我的按钮:

<input type="submit" value="Submit Request" style="display: block;">

我正在尝试让我的按钮触发此请求。我应该在我的 HTML 中添加什么来启动 /save 调用?

更新:

表格:

<form action="/request/save" method="post" commandName="requestData">
    <input type="text" id="dateInput" value="" style="display: none;"/>
    <div style="width: 200px;"><input type="submit" value="Submit Request" style="display: block;">
    </div>
</form>

控制器:

@RequestMapping(value = "/save", method = RequestMethod.POST)
    String saveRequest(@ModelAttribute("requestData") Request requestData, Map<String, Object> map,
                       HttpServletRequest request)
    {
        Request requestObj = new Request(usersRepository.findOne(1L), new Date());
        requestObj.setDescription(requestData.getDescription());
        requestObj.setStatus(false);
        requestObj.setRequestDate(requestData.getRequestDate());
        requestRepository.save(requestObj);
        return "save";
    }

【问题讨论】:

    标签: java html spring spring-boot


    【解决方案1】:

    要按原样使用 spring 代码使其工作,您必须用表单包围您的标签。

    <form action="save">
         <input type="submit" value="Submit Request" style="display: block;">
    </form>
    

    此外,您必须从正确的 URL 调用它才能使其工作。表单操作可以相对于您所在的页面,也可以相对于 URL 的根。

    您有两个选项可以点击 RequestMapping,解析为:

    /request/save
    

    一种是使用相对动作。您必须在此 url 上提供您的 HTML:

        {server:port}/request
    

    然后你的行动应该是:

        "save"
    

    第二个选项是为表单操作使用绝对路径:

        "/request/save"
    

    无论您的 HTML 在此服务器上的何处提供,都可以使用。

    总结

    您需要提交一些东西(表单),并告诉它提交到哪里(操作)。因此,您需要同步您的 URL、表单和提交端点。

    此外,最好在 RequestMapping 上指定请求方法,以便您可以单独处理 POST/GET。根据Spring Documentation,默认行为是映射所有HTTP方法:

    上面的例子没有指定 GET 与 PUT、POST 等, 因为@RequestMapping 默认映射所有HTTP方法。

    为表单提交指定 POST 是个好主意。

        @RequestMapping(value = "/save", method = RequestMethod.POST)
    

    这是你应该走的方向,因为表单提交应该是一个 POST 操作,以便表单的内容进入请求正文,最终你会希望它从表单中获取用于 POST 的字段,并将它们映射到 Controller 类中的对象。

    一些提示:

    考虑使用模板引擎,例如 Thymeleaf(spring 经常在他们的教程中提供)或 JSP+taglibs。 Thymeleaf 更轻量级,如果您使用它,您将受益于 Spring 编写的许多示例的方式。有关示例,请参阅本教程:

    Spring Boot: Handling Form Submission

    或者,如果有人只是想测试一个请求映射,或者你只是想验证你的 MVC 端点是否按照你的想法做,那么使用像 Postman 这样的工具会简单得多(我强烈推荐)提交您的请求。这将为您消除一些变量,因此您可以专注于您正在尝试开发的内容(REST API?),而不是测试设置。

    【讨论】:

    • 我已将请求映射修改为POST 方法。表单操作应该是save 还是request/save
    • 这取决于提供 HTML 的 URL。您可以使用“/request/save”(注意斜杠前缀),它将与您的根目录相关。我怀疑这对你最有效。或者,如果您的 HTML 是从 /request 提供的,您可以使用“保存”的相关操作
    • 默认方法不是GET@RequestMappingmethod 参数没有默认值,这意味着如果您不缩小方法类型,它将处理所有类型的请求。
    • 谢谢@sedooe。我会修改的。
    • 我更新了我的代码。你介意看看吗? @JoshHull
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多