Spring控制器,返回页面的特定区域

时间:2017-03-19 14:26:27

标签: java spring spring-mvc

我有这个html文件

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Form</h1>
    <form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
        <p>Id: <input type="text" th:field="*{id}" /></p>
        <p>Message: <input type="text" th:field="*{content}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>

    <div style="height: 1200px">
    </div>

    <p id="rightHere">
      There there
    </p>
</body>
</html>

和这个控制器:

@GetMapping("/greeting")
public String greetingForm(Model model) {
    model.addAttribute("greeting", new Greeting());
    return "greeting";
}

我想要做的就是回到问候#右边,但我无法让它发挥作用。有关如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

这是一个对我有用的解决方案:

@GetMapping("/greeting")
public String greetingForm(Model model) {
    model.addAttribute("greeting", new Greeting());
    return "redirect:greeting#rightHere";
}

答案 1 :(得分:0)

我认为说“return greeting#rightHere”是不合理的。这是一个超链接,如果您正在创建REST API,则会返回超链接。不确定像Spring这样的框架是否知道#之后会发生什么。 #假设是为浏览器,它将滚动到该元素,如果它存在。虽然我可能错了,但我相信Spring Controller不会知道来自greeting#rightHeregreeting的get URL请求之间的差异,而不会访问底层的HTTP请求对象(大多数时候你应该这样做)从来没有)你的应用程序中的行为应该是相同的。

我建议对此进行测试,确保在页面上分配了大量文本,以便您可以注意到使用id = rightHere跳转到您的html元素。并在您的应用程序/greeting#rightHere的某处添加超链接,看看它是否有效。我认为它会,你不应该在你的Spring控制器中做任何事情。

编辑:我认为现在还不清楚这里有什么问题。我假设你想要的是当你点击网页/greeting#rightHere上的链接时,你希望网络浏览器导航到问候页面,然后滚动到id为rightHere的html元素。而且我告诉你Spring对于#之后的内容一无所知,#是针对浏览器的,浏览器本身会查看URL /greeting#rightHere,导航到问候语,然后看看对于id为rightHere的HTML元素,并在页面加载后滚动。

但也许你的意思是你希望你的控制器返回问候页面的一个子部分,就像只有rightHere元素一样,你可以用模板或者包含在JSP中。但是很难确定你在问什么,因为你似乎不明白我写的是什么,混合谈论两个不同的东西,回归和跳跃...请考虑重写你的问题,并简明扼要你想要的使用正确的语言来实现。