Проблема в реализации h: DataTable

#jsf #jsf-2

#jsf #jsf-2

Вопрос:

Я не могу получить значения таблицы с помощью h:DataTable.

Пожалуйста, ответьте?

Класс компонента:-

  public class Employee implements Serializable{
        private int eId;
        private String eName; 
        private ResultSet viewEmployee;
    public Connection getVConnection() throws Exception{
            String driver = "oracle.jdbc.driver.OracleDriver";
            String url = "jdbc:oracle:thin:@localhost:1521:globldb3";
            String username = "scott";
            String password = "tiger";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            return conn;
          }

public ResultSet getViewEmployee()  throws Exception{
            Connection conn = null;
            PreparedStatement pstmt = null;
            try {
              conn = getVConnection();
              String query = "select * from employee where e_id>?";
              pstmt = conn.prepareStatement(query); // create a statement
              pstmt.setInt(1,this.eId); // set input parameter
              result = pstmt.executeQuery();
                return resu<
            }finally {
              try {
                result.close();
                pstmt.close();
                conn.close();
              } catch (Exception e) {
                e.printStackTrace();
              }
            }
        }
    public String v2(){
        try{
            getViewEmployee();
            return "view-employee-p.xhtml";
        }catch(Exception e){
            e.printStackTrace();
            return "home.xhtml";
         }
    }
  

JSF страница 1:-

 <h:panelGrid columns="3" cellpadding="2" border="2" styleClass="panelGridColums">           Id   
<h:inputText id="id" label="amp;#160;"  value="#{employee.eId}" 
    required="true" requiredMessage="Field cannot be left blank"
    converterMessage="Not a valid id, id must be betwenn 1 and 9999." maxlength="4">
    <f:convertNumber/>      
</h:inputText>      
 <h:message for="id" styleClass="errorMessages" showDetail="false" showSummary="true"/>
 </h:panelGrid>
<h:commandButton value="View" action="view-page.xhtml"/>
  

просмотр-страница.xhtml:

       <h:dataTable value="#{employee.viewEmployee}" var="e">
<h:column>
    <f:facet name="header">Employee id</f:facet>
    #{e.E_ID};
</h:column>

<h:column>
    <f:facet name="header">Employee id</f:facet>
    #{e.E_Name};
</h:column>
</h:dataTable>
  

Заранее спасибо.

Комментарии:

1. Не могли бы вы, пожалуйста, перестать указывать «Очень маленькую проблему» или что-то в этомроде в заголовках? На первый взгляд это не дает четкой картины конкретной проблемы. Я уже несколько раз редактировал их. Пожалуйста, придумайте сами четкое название, которое суммирует конкретную проблему в одном предложении, и нажмите на edit ссылку.

Ответ №1:

Вам необходимо предоставить обычные методы получения и установки. EL не будет обращаться к свойствам по полям, он будет обращаться к ним только с помощью getters и изменять их только с помощью setters. Если вам лень печатать, вы даже можете разрешить своей IDE (такой как Eclipse / Netbeans / IntelliJ) автоматически генерировать их.

 public class Employee {

    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
  

С

 <h:inputText value="#{employee.id}" />
  

и

 <h:dataTable value="#{bean.employees}" var="employee">
    <h:column>#{employee.id}</h:column>
    <h:column>#{employee.name}</h:column>
</h:dataTable>
  

Пожалуйста, обратите внимание, что он чувствителен к регистру и должен соответствовать правилам спецификации Javabeans. #{employee.id} Ожидает public Object getId() метод (где Object это тот тип, который вы хотите, чтобы он был). В вашем примере у вас есть #{employee.eId} который может быть недопустимым. Если первые два символа идентификатора public Object getEId() указаны в верхнем регистре, вы должны получить к нему доступ с помощью #{employee.EId} . Но, в конце концов, использование венгерских обозначений or с префиксами не имеет смысла. Просто избавьтесь от e префикса. Это также делает код более самодокументируемым.

Не забудьте соответствующим образом изменить свой код JDBC

 preparedStatement.setInt(1, employee.getId());
  

и

 Employee employee = new Employee();
employee.setId(resultSet.getInt("id"));
employee.setName(resultSet.getString("name"));
  

Обратите внимание, что передача ResultSet в качестве возвращаемого значения метода — плохая идея. Как только вы закроете его перед возвратом, вы больше не сможете получать из него значения. И когда вы не закрываете его, происходит утечка ресурсов. Вам нужно обработать его внутри того же блока методов, в котором вы его открывали и закрывали. В приведенном выше примере просто сделайте return employee; .

Чтобы узнать, как начать работу с базовым DAO, ознакомьтесь с этой статьей.

Комментарии:

1. Спасибо. Не могли бы вы, пожалуйста, дать мне некоторый намек на реализацию метода list, упомянутого в вашем ответе.

2. Просто позвольте ему вернуть список. Выполните задание предварительной загрузки в constructor или postconstruct.