Я занимаюсь разработкой веб-приложения Grails (в основном в качестве учебного упражнения). Ранее я написал несколько стандартных приложений Grails, но в этом случае я хотел попробовать создать контроллер, который бы перехватывал все запросы (включая статический html) в форме:
<a href="/testApp/testJsp.jsp">test 1</a>
<a href="/testApp/testGsp.gsp">test 2</a>
<a href="/testApp/testHtm.htm">test 3</a>
<a href="/testApp/testHtml.html">test 4</a>
Цель состоит в том, чтобы выполнять простую бизнес-логику (аудит) каждый раз, когда пользователь щелкает ссылку. Я знаю, что могу сделать это с помощью фильтра (или ряда других методов), однако я подумал, что это тоже должно сработать, и хотел сделать это с помощью инфраструктуры Grails.
Я настроил файл Grail UrlMappings.groovy для сопоставления всех URL-адресов этой формы (/ $ myPathParam?) С одним контроллером:
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?"{
constraints {
}
}
"/$path?" (controller: 'auditRecord', action: 'showPage')
"500"(view:'/error')
}
}
В этом контроллере (в соответствующем действии "showPage") я распечатывал информацию о пути, например:
def showPage = {
println "params.path = " + params.path
...
render(view: resultingView)
}
Результаты println в действии showPage для каждой из моих четырех ссылок:
testJsp.jsp
testGsp.gsp
testHtm.htm
testHtml
Почему последний "testHtml", а не "testHtml.html"?
В предыдущем ( запрос переполнения стека ) Olexandr столкнулся с этой проблемой и посоветовал просто объединить значение request.format, которое действительно действительно возвращает "html". Однако request.format также возвращает «html» для всех четырех ссылок.
Мне интересно понять, что делает Grails и почему. Есть ли способ настроить Grails, чтобы переменная params.path в контроллере показывала «testHtml.html», а не удаляла расширение «html»? Кажется, он не удаляет расширение для любого другого типа файла (включая .htm). Есть ли веская причина, по которой он это делает? Я знаю, что немного необычно использовать контроллер для статического HTML, но все же хотел бы понять, что происходит.