Do you build web applications with JSF and GlassFish? And do you need to process inputs with characters which are coded with multi-bytes using UTF-8, e.g. German Umlauts? You might have recognized a strange behavior if you use GlassFish 4.
Now, let’s check for the problem by building a simple application. With NetBeans, simply choose New Project, Java Web, Web Application. Add JSF as framework. If you need detailed information how to create a web application with NetBeans, please take a look into my JSF tutorial.
This is the web page:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>Test German Umlaut</title> </h:head> <h:body> <h:form> <h:inputText value="#{test.text}"/> <h:commandButton action="#{test.noop}" value="Test"/> </h:form> </h:body> </html>
And here the backing bean:
package web; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named @RequestScoped public class Test { private String _text; public String getText() { return _text; } public void setText(String text) { _text = text; } public String noop(){ return ""; } }
Not very much. Just an input field and a button to invoke an action, which displays the same page again. Now, start the app. Enter some multibyte chars, e.g. “äöü” and press the button. Using GlassFish 3 nothing seems to happen: Since the action returns an empty string, the same page with its data is re-displayed. This behaviour changes, if you use GlassFish 4: Every character (of multibyte chars) is replaced by two or more characters. Even though in the head of the page UTF-8 is declared, GlassFish treats the input as single-byte codes. The reason is GlassFish’s default encoding of iso-8859-1.
Solution:
Create a sun-web.xml or glassfish-xml file. Using Netbeans you may choose New, Other, GlassFish, GlassFish Descriptor. Add this line to change the default encoding:
<parameter-encoding default-charset="UTF-8"/>
That’s it.
Do you want to support this blog? You may help to finance the needed hardware.
Want to read more about software development? Purchase one of my books:
Start application development with Java. Learn development foundation, quality control and more.
A Journey through Java EE Technologies whilst developing Web Applications with JavaServer Faces.
Java Lambdas and Parallel Streams
The compact starter: Foundation, supporting structures, parallel processing
No software development, just nature:
A photographic image book. Get it for free. Or pay whatever you like.
the solution is use a FILTER
This is not a solution, just a workaround.
If you deploy on another server it will fail.
You’re right. I’m still seeking for a solution.
Has anybody out there a hint for us?
Then what’s the solution, I am searching for it too.