gpt4 book ai didi

java - JSF selectOneRadio 函数返回值作为 itemValue。 For 循环创建 selectItems

转载 作者:行者123 更新时间:2023-12-01 13:01:47 24 4
gpt4 key购买 nike

我对下面的代码有两个问题。

第一个是,如何在 selectItem 中为 selectOneRadio 提供一个 itemValue 作为函数的返回值?我知道这适用于普通的 itemValue,如果我只输入“0”,它会显示在下一页上,但任何 getCaseValueByIndex() 都不会返回任何内容。

我的第二个问题是,我可以动态创建它们,而不是一一列出每个 selectItem 吗?我的想法是创建一个名为 getCasesCount 的函数,它将返回 case 数组的大小(在本例中为 6),然后运行一个 for 循环,如下所示:

for (int i = 0; i < casesCount; i++) {
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(i)}" itemLabel="# {CustomBuild.getCaseKey(i)}"/>
}

那么接下来会发生的情况是,它将创建与我相同的代码,但动态地这样,如果我在 LinkedHashMap 中添加或删除项目,代码将反射(reflect)这些更改,而不是因越界或空指针错误而崩溃。

index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<link href="css/stylesheet.css" rel="stylesheet" type="text/css" />

<title>Jadestar's PC Solutions</title>
</head>

<body>


<h4>Please choose your components.</h4>
<h4>To be eligible for the system builder's discount,
you must select at least <span class ='highlight'> 1 </span> component from each category.</h4>
<br></br>
#{CustomBuild.initialize()}
<h3>Computer Case</h3>
<h:form>
<h:selectOneRadio value="#{CustomBuild.chosenCase}">
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(0)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(0)}"/>
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(1)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(1)}"/>
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(2)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(2)}"/>
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(3)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(3)}"/>
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(4)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(4)}"/>
<f:selectItem itemValue="#{CustomBuild.getCaseValueByIndex(5)}" itemLabel="#{CustomBuild.getCaseKeyByIndex(5)}"/>
</h:selectOneRadio>

<br></br>
<h:commandButton id="submit" value="submit" action="responsePage" />
</h:form>

</body>
</html>

responsePage.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<link href="css/stylesheet.css" rel="stylesheet" type="text/css" />

<title>Response</title>
</head>

<body>


<h4><h:outputText escape="false" value="#{CustomBuild.chosenCase}"/></h4>


<h:form prependId="false">

<h:commandButton id="backButton" value="Back" action="index" />

</h:form>

</body>
</html>

自定义构建.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Part1;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
*
* @author Administrator
*/
@ManagedBean(name = "CustomBuild")
@SessionScoped
public class CustomBuild implements Serializable {

LinkedHashMap <String, String> cases = new LinkedHashMap<String, String>();

String chosenCase;

public String getChosenCase() {
return chosenCase;
}

public void setChosenCase(String chosenCase) {
this.chosenCase = chosenCase;
}

public float getCaseValueByKeyFloat(String key) {
float caseValueByValue = Float.parseFloat(cases.get(key));
return caseValueByValue;
}

public String getCaseKeyByIndex(int index) {

Object newKey = cases.keySet().toArray()[index];
//String tempKey = getCaseValueByIndex(index);
//String newKey = getCaseKeyByValue(tempKey);
return newKey.toString();
}

public String getCaseValueByIndex(int index) {
String caseValue = (new ArrayList<String>(cases.values())).get(index);
return caseValue;
}

public void initialize() {
cases.put("59.95" ,"Eleo 500 $59.95");
cases.put("79.95" ,"Eleo 700 $79.95");
cases.put("99.95" ,"Star Maker $99.95");
cases.put("104.95" ,"Anzooc 1200 $104.95");
cases.put("119.95" ,"Eleo 900 $119.95");
cases.put("139.95" ,"Criticase 1000 $139.95");
}

public CustomBuild() {
System.out.println("Custom Computer");

}
}

最佳答案

您可以创建一个保存键和值对的对象。

之后,您可以在 bean 中使用这些对象的列表,并在 xhtml 中使用以下代码:

<h:selectOneRadio value="#{CustomBuild.chosenCase}">
<f:selectItems value="#{CustomBuild.getCases}" var="case" itemValue="#{case.value}" itemLabel="#{case.key}" />
</h:selectOneRadio>

注意:如果您在 selectItem 的值中使用对象,则需要一个转换器,并且要设置正确的值,您需要在 bean 中使用正确的 equals。

如果您想坚持使用 HashMap ,这里有一个可能的解决方案:

<h:selectOneRadio value="#{CustomBuild.chosenCase}">
<f:selectItems value="#{CustomBuild.cases.keySet()}" var="key" itemValue="#{CustomBuild.getValueByKez(key)}" itemLabel="#{key}" />
</h:selectOneRadio>

关于java - JSF selectOneRadio 函数返回值作为 itemValue。 For 循环创建 selectItems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23464297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com