Веб-приложение Grails не отображает страницу gsp

#grails #gsp

#grails #gsp

Вопрос:

У меня возникли некоторые проблемы с отображением файла .gsp, и я не совсем уверен, почему. У меня есть следующий код:

 class UrlMappings{
    static mappings = {
        "/"(controller: 'index', action: 'index')
    }
}

class IndexController{
    def index(){
        render(view: "index")
    } 
}
  

А затем в grails-app / views / index у меня есть index.gsp:

 <!DOCTYPE html>
<html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        Hello World
    </body>
</html>
  

Когда я нажал http://localhost:8080 / Я получаю ошибку кода состояния 500. Если, однако, я изменю IndexController на

 render "Hello World" 
  

он отобразит «Hello World», поэтому приложение, похоже, запускается.

Кто-нибудь знает, что происходит? Часть трассировки стека:

 17:09:40.677 [http-nio-8080-exec-1] ERROR o.a.c.c.C.[.[.[.[grailsDispatcherServlet] - Servlet.service() for servlet [grailsDispatcherServlet] in context with path [] threw exception [Could not resolve view with name '/index/index' in servlet with name 'grailsDispatcherServlet'] with root cause
javax.servlet.ServletException: Could not resolve view with name '/index/index' in servlet with name 'grailsDispatcherServlet'
  

Комментарии:

1. Кажется странным. Просто убедитесь, что вы запустили classic grails clean вместе с перезапуском Grails runtime.

2. Избегайте использования имен, которые имеют конкретное значение в рамках. Если вы измените индекс на что-то другое, вы получите ту же ошибку?

3. Также не http://host/index/index выглядело бы немного неправильно? в любом случае, как насчет «/ index» (контроллер: «ага», действие: «приятно»), который затем перенаправляет /index на какое-то другое действие контроллера, для которого вы /index/index тоже могли бы его написать, но думаю, что это выглядит немного странно, люди начинают сомневаться в навыках разработчика 🙂

Ответ №1:

Ошибка, которую вы получаете, связана с тем, что Grails не удается определить местоположение вашего представления.

Хорошо избегайте имен, которые имеют некоторый предопределенный контекст в фреймворке (просто предложение, а не проблема в вашем случае).

Поскольку вы использовали контроллер index for, измените его на что-то другое

Итак, в вашем случае, когда вы нажмете URL http://localhost:8080 / your URLMapping перенаправит его на index действие вашего контроллера, и он отобразит соответствующее представление.

Как показано ниже

 class UrlMappings{
    static mappings = {
        "/"(controller: 'provision', action: 'index')
    }
}

class ProvisionController{

    def index(){ 
        // You don't really need to render it grails will render
        // it automatically as our view has same name as action
        render(view: "index")   
    } 
}
  

А затем в grails-app/views/provision/ create index.gsp

 <!DOCTYPE html>
<html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        Hello World
    </body>
</html>
  

Вы добавляли представление в неправильном месте grails-app/views/index.gsp , переместите его в grails-app/views/provision/index.gsp

Переименовано IndexController ProvisionController в приведенном выше примере.

Комментарии:

1. Привет, Пракаш, спасибо за ваш ответ. Мне удалось понять, почему он ведет себя так, как есть. Я не верю, что у меня это было в неправильном месте, так как у меня был index.gsp в grails-app/views/index/. Причина, по которой я думаю, что это не сработало, заключалась в том, что в build.gradle я установил профиль «org.grails.profiles:rest-api» вместо:web (когда я впервые начал свой маленький проект, меня интересовала только функциональность API, и я не беспокоился о интерфейсе)