2009-05-06 3 views

ответ

1

Один из способов сделать это было бы с помощью 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"> 

Образец DataTable используя функцию:

<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: Проблемы, вызывающие функцию beans: проверять с основной причиной java.lang.NullPointerException. Возможно, я пропустил неправильный параметр. .. <ч: Datatable границы = "1" значение = "# {бобы: проверить (расчет) } "var =" entry "> Это не так? –

+0

Я никогда не использовал jsp: useBean with JSF, поэтому я не уверен, в чем проблема. Было бы лучше определить управляемый компонент в вашем файле WEB-INF/faces-config.xml: http://java.sun.com/javaee/5/docs/tutorial/doc/bnapl.html#bnaqc – McDowell

+0

Такая же ошибка без useBean: \ Btw это определено в faces-config тоже, причина, почему я использую jsp: useBean - это то, что я могу передать его в качестве параметра следующим образом: <% method (myBean); %>, потому что этот способ является «видимым» из java-кода jsp. Я смущен, как еще я могу это сделать. Спасибо, вы действительно помогаете, Daniel –

Смежные вопросы