2009-05-06 16 views

答えて

1

これはJavaBean APIcustom 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を参照してください。

+0

ありがとうございました! 私はこれを試しましたが、エラーが発生します: javax.servlet.ServletException:java.lang.NullPointerExceptionの根本原因で関数 'beans:inspect'を呼び出す際に問題が発生しました。 おそらく、間違ったパラメータを渡しています。 .. これは間違っていますか? –

+0

私はjsp:useBeanをJSFで使ったことがないので、問題が何であるかはわかりません。管理対象BeanをWEB-INF/faces-config.xmlファイルで定義する方がよいでしょう。http://java.sun.com/javaee/5/docs/tutorial/doc/bnapl.html#bnaqc – McDowell

+0

同じエラー\ Btwはfaces-configでも定義されているので、私がjsp:useBeanを使用している理由は、このようにパラメータとして渡すことができます:<%method(myBean); %>、この方法では、BeanはjspのJavaコードから「可視」になります。私は他にどのようにそれをすることができるか混乱している。 ありがとう、本当に役に立ちました ダニエル –

関連する問題