#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, и я не беспокоился о интерфейсе)