#java #model-view-controller #grails #groovy
#java #модель-представление-контроллер #grails #groovy
Вопрос:
Я замечаю какое-то странное поведение, redirect
когда я устанавливаю свой app.context
определенный путь. Я обнаружил ошибку в Grails JIRA, которая отлично описывает мою проблему, но она была помечена как UTR: http://jira.grails.org/browse/GRAILS-7546
Вот мое описание проблемы:
В настоящее время я использую Grails 2.0 М2. У меня есть следующие свойства, определенные в моем файле application.properties:
app.context=/
app.name=foobar
Когда я вызываю redirect
контроллер, redirect
он добавляет имя приложения в предоставленный мной uri, что затем вызывает 404. Вот как я это делаю:
String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
redirect(uri: partialUrl) // INCORRECTLY redirects to
// `http://mysite.com/foobar/hello/world`
// instead of `http://mysite.com/hello/world`
Предположим, что у меня есть сопоставление URL с именем helloworld
, определенным в моем UrlMappings.groovy
файле с путем /hello/world
.
Итак, короче говоря, если я установлю значение app.context
to /
, я БЫ НЕ ожидал app.name
, что оно появится в моем конечном URL-адресе перенаправления.
Это ошибка или ожидаемое поведение? Есть идеи о самом простом способе, которым я мог бы создать URL-адрес перенаправления, не выполняя слишком много ручных шагов?
Ответ №1:
Мне неприятно это говорить, но я тоже не могу это воспроизвести. Я создал тестовый проект с одним контроллером (с именем Hello), используя ваш код для создания действия, которое ничего не делает, кроме перенаправления:
HelloController.groovy
package test1
class HelloController {
def index() {
def model = [:]
model.content = 'content...'
model
}
def redir() {
String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
redirect(uri: partialUrl) // INCORRECTLY redirects to
// `http://mysite.com/foobar/hello/world`
// instead of `http://mysite.com/hello/world`
}
}
Я создал индексную страницу index.gsp в views / hello
index.gsp
<h1>index.gsp</h1>
<html>
<body>
<p>This data is coming from the model:</p>
<p>content: ${content}</p>
</body>
</html>
Настройте helloworld в UrlMappings для сопоставления с действием индекса контроллера hello:
UrlMappings.groovy
class UrlMappings {
static mappings = {
"/helloworld"(controller: "hello", action: "index")
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}
}
"/"(view:"/index")
"500"(view:'/error')
}
}
И изменил application.properties, чтобы иметь app.context =/
application.properties
#Grails Metadata file
#Sun Nov 06 14:51:56 EST 2011
app.grails.version=2.0.0.RC1
app.context=/
app.name=test1
app.servlet.version=2.5
app.version=0.1
Когда я запустил приложение, я мог перейти на localhost: 8080 / hello, и это показало бы мой простой GSP. Я попробовал localhost: 8080 / helloworld и также получил его, как и ожидалось, в соответствии с отображением. Затем я попробовал localhost: 8080 /hello / redir, и я был правильно перенаправлен на localhost: 8080 / helloworld.
Однако, если вы все еще сталкиваетесь с этой проблемой, у меня есть несколько предложений 1) Попробуйте использовать новый генератор ссылок, доступный в версии 2.0, вместо createLink. Возможно, это не делает ничего другого, но стоит попробовать: grailsLinkGenerator.link(mapping: 'helloworld')
2) Если это только для перенаправления из контроллеров, вы можете просто добавить http://mysite.com разделите себя на части. 3) В крайнем случае, напишите фильтр, прикрепленный к afterView, который выполняет поиск по регулярному выражению и заменяет содержимое на mysite.com/foobar . Не уверен, что это приведет к перенаправлению, но если что-то произойдет, я бы предположил, что это так, поскольку фильтры могут применяться на широком уровне.
Ответ №2:
def yourAction = {
redirect(uri:"helloworld")
}
Это не работает для вас?
Ответ №3:
Это не прямой ответ на ваш вопрос, но моя практика такова: я никогда не изменяю app.context в свойствах grails, поскольку tomcat переопределяет его при производстве, и мне все равно, какой контекст он использует в моем разработчике.
Комментарии:
1. Правильно… Tomcat может переопределить app.context в рабочей среде, однако проблема по-прежнему остается в том
redirect
, что Grails использует app.name при создании URL-адресов перенаправления вместо использования app.context.