英文:
Not able to get response with @Controller, while @RestController works fine
问题
我正试图将项目中的URL /function/hash
映射到特定的HTML页面 html/hashcode.html
。这是一个Spring Boot项目,不使用Thymeleaf。
这是我的代码:
// package ...;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public String hashPage(Model m) {
return "html/hashcode.html";
}
}
以上代码在我尝试访问 localhost:8080/function/hash
时返回404错误。
我还尝试了以下方式:
@Controller
@RequestMapping("/function")
public class FunctionController {
@RequestMapping("/hash")
public String hashPage(Model m) {
return "html/hashcode.html";
}
}
但是当我访问 localhost:8080/function/hash
时仍然返回404错误。
直接使用 @RequestMapping("/hash")
将页面映射到 /hash
是可以正常工作的,以防你想知道函数的返回值是否不正确。
我还发现在 @RestController
类中使用多层URL,比如 @RequestMapping("/api/test")
是可以正常工作的,但不知何故在上面的这个 @Controller
类中却不起作用。
英文:
I am trying to map the URL /function/hash
in my project to a specific HTML page html/hashcode.html
. This is a spring boot project without using thymeleaf.
This is my code:
// package ...;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public String hashPage(Model m) {
return "html/hashcode.html";
}
}
The above code returns a 404 when I try to access localhost:8080/function/hash
.
I also tried
@Controller
@RequestMapping("/function")
public class FunctionController {
@RequestMapping("/hash")
public String hashPage(Model m) {
return "html/hashcode.html";
}
}
which also yields a 404 when I go to localhost:8080/function/hash
.
Directly using @RequestMapping("/hash")
to map the page to /hash
works, in case you wonder if the return value of the function is incorrect.
I also find that using multiple layer url like @RequestMapping("/api/test")
is working in @RestController
classes, but somehow it doesn't work in this @Controller
class above.
答案1
得分: 1
返回 `"/html/hashcode.html"`(前缀 `/`),
并创建 `<project-root>/src/main/resources/static/html/hashcode.html`
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public String hashPage(final Model m) {
return "/html/hashcode.html";
}
}
---
当返回 `"html/hashcode.html"` 时:
o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for GET "/function/html/hashcode.html", parameters={}
另一方面,当返回 `"/html/hashcode.html"` 时:
o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for GET "/html/hashcode.html", parameters={}
<details>
<summary>英文:</summary>
Return `"/html/hashcode.html"`(prefix `/`),
and create `<project-root>/src/main/resources/static/html/hashcode.html`
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public String hashPage(final Model m) {
return "/html/hashcode.html";
}
}
---
When return `"html/hashcode.html"`:
o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for GET "/function/html/hashcode.html", parameters={}
On the other hand, when return `"/html/hashcode.html"`:
o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for GET "/html/hashcode.html", parameters={}
</details>
# 答案2
**得分**: 0
在请求映射中使用 `path`。
示例:
`@RequestMapping(path="/hash")`
<details>
<summary>英文:</summary>
use `path` in request mapping.
Ex:
`@RequestMapping(path="/hash")`
</details>
# 答案3
**得分**: 0
`@RestController`是`@Controller + @ResponseBody`的组合。在使用`@Controller`时,我们必须在方法中添加`@ResponseBody`。您可以在[这里][1]找到更多详细信息。
```java
@Controller
public class MappingController {
@RequestMapping("/endpoint1") //返回404
public String endPoint1() {
return "Hello endpoint1";
}
@RequestMapping("/endpoint2") //因为有@ResponseBody而正常工作
public @ResponseBody String endPoint2() {
return "Hello endpoint2";
}
}
添加@ResponseBody
后,这两者应该可以正常工作。
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
@Controller
@RequestMapping("/function")
public class FunctionController {
@RequestMapping("/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
英文:
@RestController
is combination of @Controller + @ResponseBody
. While using @Controller
we have to add the @ResponseBody
with our methods. You can find more details here
@Controller
public class MappingController {
@RequestMapping("/endpoint1") //returns 404
public String endPoint1() {
return "Hello endpoint1";
}
@RequestMapping("/endpoint2") //works well because of @ResponseBody
public @ResponseBody String endPoint2() {
return "Hello endpoint2";
}
}
Add @ResponseBody
and these both should work fine
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
@Controller
@RequestMapping("/function")
public class FunctionController {
@RequestMapping("/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
答案4
得分: 0
添加@ResponseBody注解,@Controller是一个常用的注解,用于将类标记为Spring MVC控制器,而@RestController是一种特殊的控制器,用于RESTFul Web服务,并且相当于@Controller + @ResponseBody。
如果添加@ResponseBody,它将起作用。使用以下代码:
// 包名...;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
英文:
add @ResponseBody annotation, The @Controller is a common annotation which is used to mark a class as Spring MVC Controller while the @RestController is a special controller used in RESTFul web services and the equivalent of @Controller + @ResponseBody
if u add @ResponseBody it will work. use below code
// package ...;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FunctionController {
@RequestMapping("/function/hash")
public @ResponseBody String hashPage(Model m) {
return "html/hashcode.html";
}
}
答案5
得分: 0
如果 HTML 文件是静态资源,请考虑在 Spring Boot 中使用静态内容支持。
配置 spring.resources.static-locations
来指定资源位置。
spring.resources.static-locations=file:/opt/files/,classpath:/static-files
如果您不想将其映射到根路径,可以设置映射模式。
spring.mvc.static-path-pattern=/content/**
(对于 Spring Webflux 应用程序,请使用 spring.webflux.static-path-pattern
)
现在,您可以通过 http://localhost:8080/content/some.html 查看资源。
英文:
If the html files are static resources, consider the static content support in Spring Boot.
Configure a spring.resources.static-locations
to specify the resource localtions.
spring.resources.static-locations=file:/opt/files/,classpath:/static-files
And set the mapping pattern if you do not want to map it the root path.
pring.mvc.static-path-pattern=/content/**
(Or spring.webflux.static-path-pattern
for Spring webflux application)
Now you can view the resources via http://localhost:8080/content/some.html
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论