Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JSF中,如何通过别名而不是名称获取字段值?_Java_Mysql_Jsf_Jakarta Ee_Jdbc - Fatal编程技术网

Java 在JSF中,如何通过别名而不是名称获取字段值?

Java 在JSF中,如何通过别名而不是名称获取字段值?,java,mysql,jsf,jakarta-ee,jdbc,Java,Mysql,Jsf,Jakarta Ee,Jdbc,我遇到了一个问题:当我向字段名带有别名的数据库发出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="#{a

我遇到了一个问题:当我向字段名带有别名的数据库发出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>

您需要创建一个类
计算机

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

@ManagedBean (name = "advancedSearchComp")
public class AdvancedSearchComp{
    private List<Computer> computers;
    // getter-setter
    // code to populate computers and map result set to the Computer bean
}
@ManagedBean(name=“advancedSearchComp”)
公共类高级搜索公司{
私人名单计算机;
//吸气剂设定器
//用于填充计算机并将结果集映射到计算机bean的代码
}
要将结果集映射到JavaBean,需要迭代结果集并准备一个列表

然后在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中的所有字段,然后如上所示显示它们

选项2在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>

名称
烙印
在resultset上迭代以填充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 );
    }
}
}
ResultSet rs=statement.executeQuery();
如果(rs!=null){
dataMap=newhashmap();
ResultSetMetaData rsmd=rs.getMetaData();
while(rs.next()){
对于(int _iterator=0;_iterator
无法通过alias获取它。您必须将它指定给bean中某个实际的对象。如果您还没有创建一个定制的对象来存储ResultSet中的结果,请将其传递到页面并显示

它还有助于将您的名字包装在outputText标记周围,如

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

如果
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>

名称

advancedSearchComp
managed bean中的
computers
属性是什么?是的,它是返回结果集的JavaBean访问器。您如何将查询结果绑定到视图,即如何从
@ManagedBean
或使用JSTL
执行查询?这看起来真奇怪。另外,您使用的是哪个版本的JSF?我在托管Bean中执行查询,函数返回ResultSet。我还使用了JSF2.2I,并将其考虑在内。但我必须显示16个字段,所以这不是一个花哨的决定。我必须创建16个字段。如果要显示16个字段,可以在计算机类中创建16个字段,也可以创建一个映射来保存键值(fieldname-fieldvalue)然后在DataTable中显示此映射我考虑重写ResultSet类,以便能够通过别名而不是实名来寻址字段。我会尝试使用HashMapI选项2,就像您所说的那样。h:dataTable中的单元格又是空的,看起来是同一个问题。这太奇怪了。getString()可以很好地处理列别名。Snap!你是在我写答案的时候发现的:)真奇怪。不起作用。不,桌子不见了。
<h:outputText value="#{computer.computersName}" />
<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>