gpt4 book ai didi

java - JSF 传递 Bean 来查看失败

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

我正在尝试编写一个简单的 JSF 页面,该页面最初包含两个 subview /包含,并将支持 bean 传递给其中一个包含,因为包含意味着可重用(并且可能在较大的应用程序中包含多次) .

这是相关代码:

page1.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:pf="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
template="templates/template1.xhtml">

<ui:define name="subheader">
Person Details
</ui:define>

<ui:define name="bodyContent">
<h:form>
<c:forEach items="#{page1Bean.blockNames}" var="blockName">
<c:choose>
<c:when test="#{blockName} eq 'block1'">
<ui:include src="block1.xhtml" >
<ui:param name="bean" value="#{page1Bean.myBean}"/>
</ui:include>
</c:when>
<c:otherwise>
<ui:include src="#{blockName}.xhtml" />
</c:otherwise>
</c:choose>
</c:forEach>
<pf:commandButton value="Ajax Button" action="#{page1Bean.ajaxSubmit()}"/>
</h:form>

</ui:define>
</ui:composition>

block 1.xhtml

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
xmlns:pf="http://primefaces.org/ui">

<h3>This is the first block</h3>
<h:panelGrid columns="3" style="margin-bottom:10px" cellpadding="5">

<pf:outputLabel for="firstName" value="Nombre:" />
<pf:inputText id="firstName" value="#{bean.firstName}" />
<h:message id="firstNameMessage" for="firstName" />

</h:panelGrid>
</ui:composition>

Page1Bean.java

package com.views.prototype;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class Page1Bean {

private List<String> blockNames;

private Block1Bean myBean;

public Page1Bean() {
blockNames = new ArrayList<String>();

blockNames.add("block2");
blockNames.add("block1");

myBean = new Block1Bean();
}

public void ajaxSubmit() {
}

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

public List<String> getBlockNames() {
return blockNames;
}

public void setBlockNames(List<String> blockNames) {
this.blockNames = blockNames;
}

public Block1Bean getMyBean() {
return myBean;
}

public void setMyBean(Block1Bean myBean) {
this.myBean = myBean;
}
}

Block1Bean.java

package com.views.prototype;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Block1Bean {
private String firstName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

@Override
public String toString() {
return "Block1Bean [firstName=" + firstName + "]";
}
}

页面呈现正常,但当我单击“提交”时,我得到:

value="#{bean.firstName}":目标无法访问,标识符“bean”解析为 null

据我所知,我使用与这些示例的解决方案相同的语法:

Reusing the same page multiple times

Passing the backing bean as a parameter to a Facelet include

关于我哪里出错了有什么想法吗?

最佳答案

事实证明,问题是 JSTL 和 JSF 之间的冲突,如多个线程中所述:

JSTL c:choose c:when not working in a JSF page

Specify conditional rendering of element inside <ui:repeat>? The <c:if> does not seem to work

所以我重写了循环,不使用 JSTL,它消除了原始问题中的直接问题:

        <ui:repeat var="blockName" value="#{page1Bean.blockNames}" varStatus="status">
<ui:fragment rendered="#{blockName == 'block1'}">
<ui:include src="#{page1Bean.theBlockName}" >
<ui:param name="bean" value="#{page1Bean.myBean}"/>
</ui:include>
</ui:fragment>

<ui:fragment rendered="#{blockName != 'block1' }">
<ui:include src="block2.xhtml" />
</ui:fragment>

</ui:repeat>

(这在功能上并不等同于损坏的预期目的,但重点是它不使用 JSTL)。

关于java - JSF 传递 Bean 来查看失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24486010/

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