Getting a JSF webapp to use UTF-8
tashtego Feb 4, 2009 4:02 PMHi together. Hope someone can help me out, I feel a bit confused ;)
I am developing a JSF webapp using facelets and Richfaces, deploying it on a JBoss 4 AppServer and I am using MySQL database.
So far so good. Everything works fine except some bugs with switching to UTF-8. I am getting misinterpreted signs instead of äöü (german ae, oe, ue. and what you see right here, are the misinterpreted signs even in this forum. seems phpbb isnt utf-8, too ^^). So the first thing was googling. And I googled... and tried...and googled. What I found out so far is, that there are so many different ways to tell the webapp to use UTF-8, its really curious. And.... not a single one works for me :(
1st possibility:
There is a tag inside every .xhtml page, which can be extended through lang="de" (or maybe lang="de_DE"?):
<HTML lang="de">
My question here: Why should I? How does it affect a webapp (in fact in my case it doesnt)
2nd possibility:
Inside the header of every .xhtml page there should be a first entry like this:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
This already seems to sound right. And trying Firefox -> View -> Page Encoding shows me UTF-8 as marked for my .xhtml files. So far so good.
3rd possibility:
I am using windows, which doesnt use UTF-8 as default. Inside Eclipse I found out that you have to pay attention while saving files (properties, .xhtml...). Right Mouse -> Properties shows you wether you saved your files in UTF-8 or still in system default. After switching all my JSF project files to UTF-8 (I didnt switch all my EJB3 project files to UTF-8) I had to redo some text and change to german ae, oe, ue
4th possibility:
This leads us away from the .xhtml files and lets us change our web.xml by adding
<filter> <filter-name>UTF8 Filter</filter-name> <filter-class>myJSFproject.filter.UTF8Filter</filter-class> </filter> <filter-mapping> <filter-name>UTF8 Filter</filter-name> <url-pattern>*.xhtml</url-pattern> </filter-mapping>
and developing a small java class like following:
package myJSFwebapp.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class UTF8Filter implements Filter { public void destroy() {} /** * @param ServletRequest * @param ServletResponse * @param FilterChain */ public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setContentType("application/xhtml+xml"); chain.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException {} }
This one should help changing the request and response to UTF-8... but it actually doesnt. Or thats not enough.
5th possibility:
The database tables must use UTF-8 too. So be sure to have your database schema and tables configured right.
Unfortunately I did. But my problem isnt text from the database (which seems to get me correct german signs!). My problem is reading text from a .properties file which gets shown wrong. So I went on googling...
6th possibility:
The forms can be changed to submit UTF-8 too. Whyever because the request / response should already be changed to UTF-8 through position 4, see above. It would work like:
<form method='post' accept-charset="UTF-8" ...>
And if you dont want every single form to change you can even try this by extendig web.xml once again:
<!-- http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/ --> <!-- Now all forms take only UTF-8 --> <context-param> <param-name>PARAMETER_ENCODING</param-name> <param-value>UTF-8</param-value> </context-param>
Sounds great, but is it really neccesary? And it doesnt help me out because my text is coming from a properties file, not from a submitted inputed text.
7th possibility:
You can even change your f:view tag like following:
<!--How do I change the response contentType?--> <f:view contentType="application/xhtml+xml"> ... </f:view>
It just ...wont help anyways.
and the last and in my opinion really cruelest way would be...
8th possibility:
Set JAVA_OPTS="$JAVA_OPTS -Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8" in start script (run.sh....) from JBOSS.
To be honest... I didnt even try this one. Cant be right, can it??
By the way, you can even change the console output for JBOSS to UTF-8 in Eclipse server view, but that doesnt matter.
So finally I googled, I tried... and found NO way of using UTF-8 :( I really need help with this one and hope, anyone knows a bit more about this and can help me out! Would be great! Thanks in advance! Let me her what you tried and what you know about the above solutions.