循环视图路径错误,Spring MVC

时间:2013-11-01 18:22:01

标签: java spring spring-mvc view

我正在尝试做教程 - > 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";
    }
}

6 个答案:

答案 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未设置prefixsuffix对其解析的观点。

@Controller处理程序方法中,当你执行

return "greeting";

Spring将使用UrlBasedViewResolver来解析视图名称。在这种情况下,视图名称将只是greeting。在正常情况下,一旦完成,它将使用传递该视图名称的Servlet API HttpServletRequest#getRequestDispatcher(String)。该方法返回RequestDispatcher,指向该路径的处理程序。

在我们的例子中,在获取RequestDispatcher之前,Spring将比较视图名称(解析为路径)和当前请求的路径。它会发现它们是平等的。换句话说,对/greeting的请求将通过将视图返回到/greeting来处理,该视图将由相同的@Controller处理程序方法处理,并且这将永远存在。 Spring会检测到这一点并告诉您有一个圆形视图路径,即。你会无限循环。

了解@EnableAutoConfiguration的工作原理并更改您的配置,以便您可以定义自己的UrlBasedViewResolverInternalResourceViewResolver,以便正确设置前缀和后缀。


您可以在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俩。