我尝试熟悉JSF。我正在处理2014年以来的一本书。Facelet就像下面的
<f:view contracts="#{view.locale.language}">
<ui:composition template="/template.xhtml">
<ui:define name="content">
<h1> Meine Aktion </h1>
<h:form>
<h:dataTable value="#campaignListProducer.campaigns}" var="campaign_">
<h:column>
<h:commandLink value="x" actionListener="{listCampaignsController.doDeleteCampaign(campaign_)}" />
</h:column>
<h:column>
<f:facet name="header">Name</f:facet>
<h:outputText value="#{campaign_.name}" />
</h:column>
<h:column>
<f:facet name="header">Spendenziel</f:facet>
<h:outputText value="#{campaign_.targetAmount}">
<f:convertNumber type="currency" currencyCode="EUR" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Bisher gespendet</f:facet>
<h:outputText value="#{campaign_.amountDonatedSoFar}">
<f.convertNumber type="currency" currencyCode="EUR" />
</h:outputText>
</h:column>
<h:column>
<h:commandLink value="Editieren" action="#{listCampaignsController.doEditCampaign(campaign_)}" />
</h:column>
<h:column>
<h:commandLink value="Spendenliste" action="#{listCampaignsController.doListDonation(campaign_)}" />
</h:column>
<h:column>
<h:commandLink value="Formular" action="#{listCampaignsController.doEditDonationForm(campaign_)}" />
</h:column>
</h:dataTable>
<h:commandButton value="Aktion hinzufügen" action="#{listCampaignscontroller.doAddCampaign}" />
</h:form>
</ui:define>
</ui:composition>
</f:view>
campaign_变量将被识别为字符串。我的错误代码看起来像是
javax.servlet.ServletException: /listCampaigns.xhtml @17,52 value="#{campaign_.name}": The class 'java.lang.String' does not have the property 'name'.
广告系列类通常被编码为Bean。
public class Campaign implements Serializable{
private static final long serialVersionUID = -1828666L;
private String name;
private Double targetAmount;
private Double donationMinimum;
private Double amountDonatedSoFar;
private Account account;
private Long id;
private List<Donation> donations;
public Campaign(){
account = new Account();
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Double getTargetAmount(){
return targetAmount;
}
public void setTargetAmount(Double targetAmount){
this.targetAmount = targetAmount;
}
public Double getDonationMinimum(){
return donationMinimum;
}
public void setDonationMinimum(Double donatinMinimum) {
this.donationMinimum = donationMinimum;
}
public Double getAmountDonatedSoFar(){
return amountDonatedSoFar;
}
public void setAmountDonatedSoFar(Double amountDonatedSoFar){
this.amountDonatedSoFar = amountDonatedSoFar;
}
public Account getAccount(){
return account;
}
public void setAccount(Account account){
this.account = account;
}
public void setId(Long id){
this.id = id;
}
public Long getId(){
return id;
}
public List<Donation> getDonations(){
return donations;
}
public void setDonations(List<Donation> donations){
this.donations = donations;
}
}
CampaignListProducer类是一个实现为列表的模拟
public class CampaignListProducer implements Serializable {
private static final long serialVersionUID = -182866L;
private List<Campaign> campaigns;
public CampaignListProducer(){
campaigns = createMockCampaigns();
}
public List<Campaign> getCampaigns(){
return campaigns;
}
public List<Campaign> createMockCampaigns() {
Donation donation1 = new Donation();
donation1.setDonorName("Heinz Schmidt");
donation1.setAmount(20d);
donation1.setReceiptRequested(true);
donation1.setStatus(Status.TRANSFERRED);
donation1.setAccount(new Account(donation1.getDonorName(),"XXX Bank", "de456"));
Donation donation2 = new Donation();
donation2.setDonorName("Karl Meier");
donation2.setAmount(30d);
donation2.setReceiptRequested(false);
donation2.setStatus(Status.IN_PROCESS);
donation2.setAccount(new Account(donation1.getDonorName(),"YYY Bank", "de456"));
List<Donation> spenden = new LinkedList<>();
spenden.add(donation1);
spenden.add(donation2);
Campaign campaign1 = new Campaign();
campaign1.setName("Trikots für A-Jugend");
campaign1.setTargetAmount(1000d);
campaign1.setAmountDonatedSoFar(258d);
campaign1.setDonationMinimum(20d);
campaign1.setId(1L);
campaign1.setAccount(new Account("Max Mustermann", "ABC Bank", "de123"));
campaign1.setDonations(spenden);
Campaign campaign2 = new Campaign();
campaign2.setName("Rollstuhl für Maria");
campaign2.setTargetAmount(2500d);
campaign2.setAmountDonatedSoFar(742d);
campaign2.setDonationMinimum(25d);
campaign2.setId(2L);
campaign2.setAccount(campaign1.getAccount());
campaign2.setDonations(spenden);
List<Campaign> ret = new LinkedList<>();
ret.add(campaign1);
ret.add(campaign2);
return ret;
}
}
我为CampaignListProducer放置了@SessionScoped和@Named注释