2
自動生成された方法でバッキングBeanの内容を出力したいとします。したがって、すべてのコンテンツはJSPに表示されます。とにかくこれは可能ですか?事前にJSFアプリケーションでリフレクトされたマネージドBeanの内容を読み取る
おかげで、 ダニエル
自動生成された方法でバッキングBeanの内容を出力したいとします。したがって、すべてのコンテンツはJSPに表示されます。とにかくこれは可能ですか?事前にJSFアプリケーションでリフレクトされたマネージドBeanの内容を読み取る
おかげで、 ダニエル
これはJavaBean APIとcustom tag functionを使用されるだろう行う一つの方法。
WEB-INF/TLD/beans.tld:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>Bean inspector.</description>
<display-name>Bean inspector utils</display-name>
<tlib-version>1.2</tlib-version>
<short-name>beans</short-name>
<uri>http://acme.demo</uri>
<function>
<name>inspect</name>
<function-class>props.Inspector</function-class>
<function-signature>
java.util.List inspect(java.lang.Object)
</function-signature>
</function>
</taglib>
実装:
public class Inspector {
public static List<Map.Entry<String, Object>> inspect(
Object bean) {
Map<String, Object> props = new LinkedHashMap<String, Object>();
try {
BeanInfo info = Introspector.getBeanInfo(bean
.getClass(), Object.class);
for (PropertyDescriptor propertyDesc : info
.getPropertyDescriptors()) {
String name = propertyDesc.getDisplayName();
Method reader = propertyDesc.getReadMethod();
Object value = reader.invoke(bean);
props.put(name, value == null ? "" : value);
}
} catch (IntrospectionException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
return new ArrayList<Map.Entry<String, Object>>(props
.entrySet());
}
}
このタグライブラリは、その後、JSPヘッダーにインポートされる:
<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" xmlns:beans="http://acme.demo">
サンプルデータテーブル関数を使用して:
<h:dataTable border="1" value="#{beans:inspect(demoPropsBean)}" var="entry">
<h:column id="column1">
<f:facet name="header">
<h:outputText value="property" />
</f:facet>
<h:outputText value="#{entry.key}" />
</h:column>
<h:column id="column2">
<f:facet name="header">
<h:outputText value="value" />
</f:facet>
<h:outputText value="#{entry.value}" />
</h:column>
</h:dataTable>
ローカライズされたプロパティ名などを提供する方法については、JavaBean specを参照してください。
ありがとうございました! 私はこれを試しましたが、エラーが発生します: javax.servlet.ServletException:java.lang.NullPointerExceptionの根本原因で関数 'beans:inspect'を呼び出す際に問題が発生しました。 おそらく、間違ったパラメータを渡しています。 .. これは間違っていますか? –
私はjsp:useBeanをJSFで使ったことがないので、問題が何であるかはわかりません。管理対象BeanをWEB-INF/faces-config.xmlファイルで定義する方がよいでしょう。http://java.sun.com/javaee/5/docs/tutorial/doc/bnapl.html#bnaqc – McDowell
同じエラー\ Btwはfaces-configでも定義されているので、私がjsp:useBeanを使用している理由は、このようにパラメータとして渡すことができます:<%method(myBean); %>、この方法では、BeanはjspのJavaコードから「可視」になります。私は他にどのようにそれをすることができるか混乱している。 ありがとう、本当に役に立ちました ダニエル –