1

UTF-8 レンダリングがメッセージに適用されていないことがわかったとき、古い JSF-1.x プロジェクトでメッセージ/文字列の国際化に取り組んでいました。

私はここで同様の問題に遭遇しました: - JSF 2.0 アプリケーションの UTF-8 でエンコードされたプロパティ ファイルを使用した i18n

しかし、それはJSF-2アプリケーションでは機能し、そこで説明されているのと同じ方法でカスタムリソースバンドルを登録できません.(名前空間が一致しないというデプロイエラーが表示されます.)

JSF-1.x 用の faces-config.xml にカスタム リソース バンドルを登録するのに助けが必要です。

(そこでメッセージバンドルを使用していました。しかし、リソースバンドルタグでできるように、バンドルクラスをメッセージバンドルに登録できません)

4

1 に答える 1

1

ではJSF-1.x、自分のカスタムResourceBundleクラスを登録するためのサポートはありません。

<x:loadBundle>したがって、プロパティファイルを正しいエンコーディングでエンコードするカスタムタグを作成する必要があります。

に登録するには、レンダリングされないFaceletsカスタムタグを参照Tag Library XMLしてくださいweb.xml。次に、でTagLibrary XML、次の設定を行います:-

<tag>
            <tag-name>loadBundle</tag-name>
            <handler-class>org.somepackage.facelets.tag.jsf.handler.LoadBundleHandler</handler-class>
</tag>

そして、カスタムLoadBundleHandlerを拡張してTagHandlerファセットクラスを拡張します-(コードはLoadBundleHandler@と同じになりますcom.sun.facelets.tag.jsf.core.LoadBundleHandler

そして今、あなたは質問の私の参照された投稿のようにControlクラスをオーバーライドすることができます。したがって、全体として、クラスは次のようになります。-

public final class LoadBundleHandler extends TagHandler {


    private static final String BUNDLE_EXTENSION = "properties";    // The default extension for langauge Strings (.properties)

    private static final String CHARSET = "UTF-8";

    private static final Control UTF8_CONTROL = new UTF8Control();  

    private final static class ResourceBundleMap implements Map {
        private final static class ResourceEntry implements Map.Entry {

            protected final String key;

            protected final String value;

            public ResourceEntry(String key, String value) {
                this.key = key;
                this.value = value;
            }

            public Object getKey() {
                return this.key;
            }

            public Object getValue() {
                return this.value;
            }

            public Object setValue(Object value) {
                throw new UnsupportedOperationException();
            }

            public int hashCode() {
                return this.key.hashCode();
            }

            public boolean equals(Object obj) {
                return (obj instanceof ResourceEntry && this.hashCode() == obj
                        .hashCode());
            }
        }

        protected final ResourceBundle bundle;

        public ResourceBundleMap(ResourceBundle bundle) {
            this.bundle = bundle;
        }

        public void clear() {
            throw new UnsupportedOperationException();
        }

        public boolean containsKey(Object key) {
            try {
                bundle.getString(key.toString());
                return true;
            } catch (MissingResourceException e) {
                return false;
            }
        }

        public boolean containsValue(Object value) {
            throw new UnsupportedOperationException();
        }

        public Set entrySet() {
            Enumeration e = this.bundle.getKeys();
            Set s = new HashSet();
            String k;
            while (e.hasMoreElements()) {
                k = (String) e.nextElement();
                s.add(new ResourceEntry(k, this.bundle.getString(k)));
            }
            return s;
        }

        public Object get(Object key) {
            try {
                return this.bundle.getObject((String) key);
            } catch( java.util.MissingResourceException mre ) {
                return "???"+key+"???";
            }
        }

        public boolean isEmpty() {
            return false;
        }

        public Set keySet() {
            Enumeration e = this.bundle.getKeys();
            Set s = new HashSet();
            while (e.hasMoreElements()) {
                s.add(e.nextElement());
            }
            return s;
        }

        public Object put(Object key, Object value) {
            throw new UnsupportedOperationException();
        }

        public void putAll(Map t) {
            throw new UnsupportedOperationException();
        }

        public Object remove(Object key) {
            throw new UnsupportedOperationException();
        }

        public int size() {
            return this.keySet().size();
        }

        public Collection values() {
            Enumeration e = this.bundle.getKeys();
            Set s = new HashSet();
            while (e.hasMoreElements()) {
                s.add(this.bundle.getObject((String) e.nextElement()));
            }
            return s;
        }
    }

    private final TagAttribute basename;

    private final TagAttribute var;


    public LoadBundleHandler(TagConfig config) {
        super(config);
        this.basename = this.getRequiredAttribute("basename");
        this.var = this.getRequiredAttribute("var");
    }


    public void apply(FaceletContext ctx, UIComponent parent)
            throws IOException, FacesException, FaceletException, ELException {
        UIViewRoot root = ComponentSupport.getViewRoot(ctx, parent);
        ResourceBundle bundle = null;
        FacesContext faces = ctx.getFacesContext();
        String name = this.basename.getValue(ctx);
        try {
            ClassLoader cl = Thread.currentThread().getContextClassLoader();
            if (root != null && root.getLocale() != null) {
                bundle = ResourceBundle.getBundle(name, root.getLocale(), cl, UTF8_CONTROL);
            } else {
                bundle = ResourceBundle
                        .getBundle(name, Locale.getDefault(), cl);
            }
        } catch (Exception e) {
            throw new TagAttributeException(this.tag, null , e);
        }
        ResourceBundleMap map = new ResourceBundleMap(bundle);
        faces.getExternalContext().getRequestMap().put(this.var.getValue(ctx),
                map);
    }



    protected static class UTF8Control extends Control {
        public ResourceBundle newBundle
            (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
                throws IllegalAccessException, InstantiationException, IOException
        {
            String bundleName = toBundleName(baseName, locale);
            String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);
            ResourceBundle bundle = null;
            InputStream stream = null;
            if (reload) {
                URL url = loader.getResource(resourceName);
                if (url != null) {
                    URLConnection connection = url.openConnection();
                    if (connection != null) {
                        connection.setUseCaches(false);
                        stream = connection.getInputStream();
                    }
                }
            } else {
                stream = loader.getResourceAsStream(resourceName);
            }
            if (stream != null) {
                try {
                    bundle = new PropertyResourceBundle(new InputStreamReader(stream, UTF8_CONTROL));
                } finally {
                    stream.close();
                }
            }
            return bundle;
        }
    }


}

このクラスのプロパティを削除することで、basename設定をスキップすることもできます。<x:loadbundle var="msg basename="resources">basename

于 2013-02-15T08:37:00.863 に答える