【问题标题】:How to get field values by alias, not by name in JSF?如何通过别名而不是 JSF 中的名称获取字段值?
【发布时间】:2013-07-09 08:43:52
【问题描述】:

我遇到了一个问题:当我向具有字段名称别名的数据库发出 SQL 请求时,我无法使用 h:dataTable 显示它们(我使用 JSF)。

这里是例子。请求:

SELECT 
    computers.name AS computers_name,
FROM
    computers
WHERE
    computers.id IS NOT NULL AND (computers.group_id=1);

XHTML 代码:

            <h:dataTable value="#{advancedSearchComp.computers}"  
                    var="computer" rowClasses="oddTableRow, evenTableRow"
                    headerClass="tableHeader" styleClass="table">
                <h:column>
                    <f:facet name="header">name</f:facet>
                    #{computer.computers_name}
                </h:column>
            </h:dataTable>

还有一个问题是因为h:column不能通过别名获取字段值,只能通过实名获取,返回null。

什么是最好的解决方案?

如有任何提示,我将不胜感激。

更新。我所知道的所有手册只考虑琐碎的情况“SELECT * FROM table”。

有没有一种通用的方法在 JSF 中显示 ResultSet 而没有棘手的方法?

更新。我做到了:

<h:dataTable value="#{advancedSearchComp.selectedComputers}" var="computer" rowClasses="oddTableRow, evenTableRow"
                         headerClass="tableHeader" styleClass="table">
                <h:column>
                    <f:facet name="header">id</f:facet>
                    #{computer.computers_id}
                </h:column>
                <h:column>
                    <f:facet name="name">Name</f:facet>
                    #{computer.computers_name}
                </h:column>
                <h:column>
                    <f:facet name="header">Location</f:facet>
                    #{computer.locations_name}
                </h:column>
                <h:column>
                    <f:facet name="header">Rack</f:facet>
                    #{computer.racks_name}
                </h:column>
                <h:column>
                    <f:facet name="header">Rack unit</f:facet>
                    #{computer.computers_rack_unit}
                </h:column>
                <h:column>
                    <f:facet name="header">Serial</f:facet>
                    #{computer.computers_serial}
                </h:column>
                <h:column>
                    <f:facet name="header">Inv number</f:facet>
                    #{computer.computers_inv_number}
                </h:column>
                <h:column>
                    <f:facet name="header">Status</f:facet>
                    #{computer.computers_status_name}
                </h:column>
            </h:dataTable>

public List<ComputerWrapper> getSelectedComputers() throws SQLException{
    ComputerWrapper computer;
    selectedComputers.clear();
    if (query==null) {
        return null;
    }
    else {
        Statement sth=dbhIrmdb.createStatement();
        ResultSet rowSet=sth.executeQuery(query);
        while (rowSet.next()) {
            computer=new ComputerWrapper();
            computer.setComputers_id(rowSet.getString("computers_id"));
            computer.setComputers_name(rowSet.getString("computers_name"));
            computer.setLocations_name(rowSet.getString("locations_name"));
            computer.setRacks_name(rowSet.getString("racks_name"));
            computer.setComputers_rack_unit(rowSet.getString("computers_rack_unit"));
            computer.setComputers_serial(rowSet.getString("computers_serial"));
            computer.setComputers_inv_number(rowSet.getString("computers_inv_number"));
              computer.setComputers_status_name(rowSet.getString("computers_status_name"));
            selectedComputers.add(computer);
        }         
        sth.close();
        return selectedComputers;
    }

// 返回空值; }

公共类 ComputerWrapper { 私有字符串computers_id,computers_name,locations_name,racks_name,computers_rack_unit, 计算机序列号、计算机序列号、计算机状态名称;

public String getComputers_id() {
    return computers_id;
}

public void setComputers_id(String computers_id) {
    this.computers_id=computers_id;
}

public String getComputers_name() {
    return computers_name;
}

public void setComputers_name(String computers_name) {
    this.computers_name=computers_name;
}

public String getLocations_name() {
    return locations_name;
}

public void setLocations_name(String locations_name) {
    this.locations_name=locations_name;
}

public String getRacks_name() {
    return racks_name;
}

public void setRacks_name(String racks_name) {
    this.racks_name=racks_name;
}

public String getComputers_rack_unit() {
    return computers_rack_unit;
}

public void setComputers_rack_unit(String computers_rack_unit) {
    this.computers_rack_unit=computers_rack_unit;
}

public String getComputers_serial() {
    return computers_serial;
}

public void setComputers_serial(String computers_serial) {
    this.computers_serial=computers_serial;
}

public String getComputers_inv_number() {
    return computers_inv_number;
}

public void setComputers_inv_number(String computers_inv_number) {
    this.computers_inv_number=computers_inv_number;
}

public String getComputers_status_name() {
    return computers_status_name;
}

public void setComputers_status_name(String computers_status_name) {
    this.computers_status_name=computers_status_name;
}

public ComputerWrapper() {
    computers_id=""; computers_name=""; locations_name=""; racks_name=""; computers_rack_unit="";
    computers_serial=""; computers_inv_number=""; computers_status_name="";
}

【问题讨论】:

  • advancedSearchComp 托管 bean 中的 computers 属性是什么?
  • 是的,它是返回 ResultSet 的 JavaBean 访问器。
  • 如何将查询结果绑定到视图,即如何从@ManagedBean 或使用JSTL &lt;sql:query&gt; 执行查询?这看起来真的很奇怪。另外,您使用的是哪个版本的 JSF?
  • 我在一个托管 Bean 中执行查询,函数返回 ResultSet。我也使用 JSF 2.2

标签: java mysql jsf jakarta-ee jdbc


【解决方案1】:

没有办法通过别名获取它。您必须将其分配给 bean 中某处的实际对象。如果您尚未创建定制的对象来存储来自 ResultSet 的结果,请执行此操作,将其传递到您的页面并显示。

它还有助于将你的名字包裹在 outputText 标记周围,例如

<h:outputText value="#{computer.computersName}" />

【讨论】:

  • 这太奇怪了。 ResultSet.getString() 与列别名完美配合。
  • 快!您在我写答案时发现了这一点:)
【解决方案2】:

如果advancedSearchComp 中的computers 属性是ResultSet 类型,那么你应该可以这样写:

<h:dataTable value="#{advancedSearchComp.computers}" var="computer">
  <h:column>
    <f:facet name="header">name</f:facet>
    <h:outputText value="#{computer.getString('computers_name')}" />
  </h:column>
</h:dataTable>

【讨论】:

  • 这很奇怪。 不工作。
  • 不,表格消失了。
【解决方案3】:

你需要创建一个类Computer

public class Computer{
    private String computerName;
    // getter-setter
}

advancedSearchComp 托管 bean

@ManagedBean (name = "advancedSearchComp")
public class AdvancedSearchComp{
    private List<Computer> computers;
    // getter-setter
    // code to populate computers and map result set to the Computer bean
}

要将结果集映射到 java bean,您需要遍历结果集并准备一个列表。

然后在 XHTML 中

<h:dataTable value="#{advancedSearchComp.computers}"  
    var="computer" rowClasses="oddTableRow, evenTableRow"
    headerClass="tableHeader" styleClass="table">
    <h:column>
          <f:facet name="header">name</f:facet>
          <h:outputText value = "#{computer.computerName}"/>
    </h:column>
</h:dataTable>

更新: 如果要显示 16 个或大量字段,您有以下两种选择:

选项1添加bean中的所有字段,然后如上显示

Option2 在 bean 中添加一个映射,然后在 XHTML 中使用这个映射。

public class Computer{
    private Map<String, Object> dataMap;
    // getter-setter
}

在 XHTML 上

<h:dataTable value="#{advancedSearchComp.computers}"  
    var="computer" rowClasses="oddTableRow, evenTableRow"
    headerClass="tableHeader" styleClass="table">
    <h:column>
          <f:facet name="header">name</f:facet>
          <h:outputText value = "#{computer.dataMap['computerName']}"/>
    </h:column>
    <h:column>
          <f:facet name="header">Brand</f:facet>
          <h:outputText value = "#{computer.dataMap['computerBrand']}"/>
    </h:column>
</h:dataTable>

遍历结果集以填充 dataMap

ResultSet rs= statement.executeQuery();
if(rs!= null){
dataMap = new HashMap<String, Object>();
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
    for(int _iterator = 0; _iterator < rsmd.getColumnCount(); _iterator++){
        String columnName = rsmd.getColumnName(_iterator + 1);
    Object columnValue = rs.getObject(_iterator + 1);
        dataMap.put(columnName , columnValue );
    }
}
}

【讨论】:

  • 我考虑到了。但我必须显示 16 个字段,所以这不是一个花哨的决定。我必须创建 16 个字段。
  • 如果要显示 16 个字段,是的,您可以在 Computer 类中创建 16 个字段,或者您可以创建一个映射来保存键值(字段名 - 字段值),然后在数据表中显示此映射
  • 我考虑重写 ResultSet 类,以便能够通过别名而不是真实的列名来寻址字段。
  • 我会尝试使用 HashMap> 的选项 2
  • 我照你说的做了。 h:dataTable 中的单元格又是空的,看起来是同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2014-09-09
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 2014-04-09
相关资源
最近更新 更多