RSS
 

Groovy GSP charset problem resolving

27 Сен

В какой-то момент проявилась одна заметная проблема, мешающая мне осуществить абсолютно 100% замену PHP на Groovy для веба без использования относительно тяжеловесного MVC-фреймворка Grails.

Это касается *.gsp страниц (Groovy Server Pages), представляющих собой html-страницы со вставками вида <% .. %> с произвольным кодом на Groovy или Java, или на языке оригинала: «GSP means GroovyServer Pages, which is similar to JSP (JavaServer Pages).»

Точно такая же функциональность в PHP реализуется вставками <? .. ?> (причем для PHP наличие такого блока является обязательным, даже если он реализует классы или бизнес-логику; если после такого блока будет находиться обычно невидимый пробел или перенос строки, то он попадёт в вывод, что может привести к проблемам).

На сайте груви написано: «GSP are not maintained as a standalone module. But it has been forked and reintegrated in Grails.» Но, тем не менее, как и груви-сервлеты, gsp-страницы работают без Grails, достаточно просто подключить груви к приложению.

Проблема заключалась в том, что в этих gsp-страницах русский текст превращался в «кракозябры». В груви-сервлетах, как в «настоящих», так и скриптового вида, такого не наблюдалось.

Методом научного тыка выяснилось, что если исходник gsp перевести в кодировку по-умолчанию на системе (например, cp1251 для Windows), то проблема решается (при этом вывод страницы идет уже в кодировке UTF-8).

А это чистой воды подсказка: идем в исходники сервлета groovy.servlet.TemplateServlet.java, который отвечает за разбор таких страниц, и находим там строку:

private static final String GROOVY_SOURCE_ENCODING = "groovy.source.encoding";

Там же видно, как этот параметр влияет на создание экземпляра Reader-а.

Прописываем в web.xml приложения параметр сервлету со значением «UTF-8″, и вуаля, – проблема решена.

Полный текст web.xml приложения, в котором все произвольные *.groovy и *.gsp файлы будут компилироваться в сервлеты и корректно выводить кириллицу:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">

	<servlet>
		<servlet-name>GroovyServlet</servlet-name>
		<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>GroovyServlet</servlet-name>
		<url-pattern>*.groovy</url-pattern>
		<url-pattern>*.grv</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>GSP</servlet-name>
		<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
		<init-param>
			<param-name>groovy.source.encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>GSP</servlet-name>
		<url-pattern>*.gsp</url-pattern>
	</servlet-mapping>
</web-app>

Здесь так же показано, как длинное расширение .groovy, которое будет «светиться» в url-адресах можно заменить произвольным коротким, например .grv (или .php – just 4 fun).

Теперь можно быстро и просто писать сайты, веб-приложения, фреймворки на Groovy, для чего понадобятся только установленные Java и Tomcat на сервере.

 
 

Leave a Reply

 
*

 
 
Rambler's Top100