我正在尝试做教程 - > http://spring.io/guides/gs/serving-web-content/
当我运行它时,它会显示圆形视图路径[问候],为什么?
在本教程中,我不明白的一件事是以下内容及其工作原理:
return "greeting";
代码段:
package hello;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
答案 0 :(得分:9)
检查.pom中的依赖项(如果有)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
答案 1 :(得分:4)
您可能在遵循本教程时跳过了一步。
我会解释为什么你会得到你所看到的行为,然后你可以决定接着做什么。
您可能已经开始使用
了SpringApplication.run(Application.class, args);
教程Application
类'main
方法中的。默认情况下,由于@EnableAutoConfiguration
(以及类路径中的其他组件),将为您注册DispatcherServlet
,其中提供的默认UrlBasedViewResolver
未设置prefix
或suffix
对其解析的观点。
在@Controller
处理程序方法中,当你执行
return "greeting";
Spring将使用UrlBasedViewResolver
来解析视图名称。在这种情况下,视图名称将只是greeting
。在正常情况下,一旦完成,它将使用传递该视图名称的Servlet
API HttpServletRequest#getRequestDispatcher(String)
。该方法返回RequestDispatcher
,指向该路径的处理程序。
在我们的例子中,在获取RequestDispatcher
之前,Spring将比较视图名称(解析为路径)和当前请求的路径。它会发现它们是平等的。换句话说,对/greeting
的请求将通过将视图返回到/greeting
来处理,该视图将由相同的@Controller
处理程序方法处理,并且这将永远存在。 Spring会检测到这一点并告诉您有一个圆形视图路径,即。你会无限循环。
了解@EnableAutoConfiguration
的工作原理并更改您的配置,以便您可以定义自己的UrlBasedViewResolver
或InternalResourceViewResolver
,以便正确设置前缀和后缀。
您可以在official Spring MVC documentation中详细了解视图名称解析。
答案 2 :(得分:2)
public String greeting(){}
应写入public **@ResponseBody** String greeting(){}
,
因此,春天mvc将不会返回视图,你的问题就会消失。
答案 3 :(得分:0)
在这里,你正在点击/greeting
controllew,它返回一个字符串greeting
。
但Spring的视图解析器实际上要做的是重定向到名为greeting
的视图,这在此处不可用。因此,您只需在方法中添加@ResponseBody
即可解决问题。
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public @ResponseBody String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
答案 4 :(得分:0)
在遵循given教程时遇到了同样的错误。 我的maven依赖项出错了,我可以通过删除 .m2 文件夹并再次安装依赖项来解决问题。
答案 5 :(得分:0)
When Spring Boot application running by Intelij Idea views can`t be resolved
添加
class LinkedList
{
private:
struct Node
{
int data;
Node *next;
Node(int data_, Node* next_ = nullptr) :
data(data_),
next(next_)
{
}
};
int size;
Node *head, *tail;
public:
LinkedList();
~LinkedList();
void clear();
// various math
int min() const;
int max() const;
int average() const;
// adding
void append(int data);
void insert(int data, int pos);
// removing
void pop();
void remove(int pos);
};
LinkedList::LinkedList()
{
head = nullptr;
tail = nullptr;
size = 0;
}
LinkedList::~LinkedList()
{
clear();
}
void LinkedList::clear()
{
if (head != nullptr)
{
Node *temp;
while(head != nullptr)
{
temp = head->next;
delete head;
head = temp;
}
}
head = nullptr;
tail = nullptr;
size = 0;
}
void LinkedList::display()
{
Node *temp = head;
for(int i = 0; i < size; i++)
{
std::cout << temp->data << "\t";
temp = temp->next;
}
std::cout << std::endl;
}
void LinkedList::insert(int data, int pos)
{
if (pos == 0)
{
Node* prev_head = head;
head = new Node(data, prev_head);
if (size == 0)
{
tail = head;
}
}
else
{
Node *pre=nullptr;
Node *cur = head;
for(int i = 0 ; i < pos + 1; ++i)
{
pre = cur;
cur = cur->next;
}
Node *temp = new Node(data, cur);
pre->next = temp;
}
++size;
}
void LinkedList::append(int data)
{
insert(data, 0);
}
void LinkedList::pop()
{
if (size == 1)
{
Node *temp = tail;
head = nullptr;
tail = nullptr;
delete temp;
}
else
{
Node *temp = head;
while(temp->next != tail)
{
temp = temp->next;
}
Node* node_to_pop = tail;
tail = temp;
tail->next = nullptr;
delete node_to_pop;
}
--size;
}
int LinkedList::max() const
{
int max = INT_MIN;
for (Node* temp = head; temp != nullptr; temp = temp->next)
{
if (temp->data > max)
{
max = temp->data;
}
}
return max;
}
int LinkedList::min() const
{
int min = INT_MAX;
for(Node* temp = head; temp != nullptr; temp = temp->next)
{
if (head->data < min)
{
min = temp->data;
}
}
return min;
}
int LinkedList::average() const
{
int sum = 0;
for(Node* temp = head; temp != nullptr; temp = temp->next)
{
sum += temp->data;
temp = temp->next;
}
return (double)sum / size;
}
在其他方法无效的情况下为我完成了trick俩。