Pull to refresh

Решение проблемы кодировки в GSP-страницах (без Grails)

Reading time3 min
Views2.2K
В какой-то момент проявилась одна заметная проблема, мешающая мне осуществить абсолютно 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 на сервере.
Tags:
Hubs:
Total votes 2: ↑2 and ↓0+2
Comments0

Articles