h:outputScript tag and charset attribute, is it possible?

我怕爱的太早我们不能终老 提交于 2019-12-24 03:29:42

问题


First of all, I'd like to say that I've already posted this question in another forum, but as I haven't had any answers until now, and this is an important issue to me, I'm asking it here too.

The HTML <script> tag has the charset attribute, but I can't specify this attribute using the <h:outputScript> tag. I tried to use the preRenderComponent system event and put the attribute manually but it had no effect; the attribute wasn't rendered. Is there a way to specify the charset attribute, even programmatically?


回答1:


Just use UTF-8 all the time. Facelets defaults to UTF-8 already. You should take care that you configure your editor/IDE to save all textbased resources as UTF-8. In Eclipse, you need to go to Window » Preferences and enter filter text encoding. In all of the filtered preferences (Workspace, JSP files, etcetera) you can select the desired encoding from a dropdown.

You might want to make minor edits (add/remove space or something) on existing files to force Eclipse to save them as UTF-8 again.

See also:

  • Unicode - How to get the characters right?



回答2:


If your javascript file resides within another JAR referenced by your webapp and you can't have it converted to another encoding, then you should use a filter to set a content type for that particular file. I noticed that there's no common setting for it in JSF. Also, I found out that it's possible to override the default renderer for javax.faces.resource.Script in JSF but I don't think it would be a good strategy, so if someone finds a better solution, please, post it!

public class SetContentEncodingFilter implements Filter {
private final Map<String, String> pathEncodingMap = new HashMap<>();

@Override
public void destroy() {
    pathEncodingMap.clear();
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    String requestURI = req.getRequestURI();
    if (requestURI != null && pathEncodingMap.containsKey(requestURI)) {
        String encoding = pathEncodingMap.get(requestURI);
        response.setCharacterEncoding(encoding);
    }
    chain.doFilter(request, response);
}

@Override
public void init(FilterConfig config) throws ServletException {
    Enumeration<String> parameterNames = config.getInitParameterNames();
    while (parameterNames.hasMoreElements()) {
        String path = parameterNames.nextElement();
        String encoding = config.getInitParameter(path);
        pathEncodingMap.put(config.getServletContext().getContextPath() + path, encoding);
    }
}

}

Declare the filter in your web.xml:

<filter>
    <filter-name>localizedResources</filter-name>
    <filter-class>br.mpt.mp.recad.config.SetContentEncodingFilter</filter-class>
    <init-param>
        <param-name>/javax.faces.resource/jq/ui/i18n/datepicker-pt.js.xhtml</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>localizedResources</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

or if you prefer, shall you use org.springframework.web.filter.CharacterEncodingFilter from Spring

There's also an OmniFaces alternative: CharacterEncodingFilter



来源:https://stackoverflow.com/questions/5902950/houtputscript-tag-and-charset-attribute-is-it-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!