繁体   English   中英

如何在facelet模板中将托管bean作为参数传递

[英]How to pass a managed bean as param at a facelet template

我在尝试将托管bean作为facelet模板的参数传递时遇到很多麻烦。 我正在尝试在facelet模板上创建一个变量,并将其值通过ui:param传递,但是我一直在出现“ Target Unreachable,标识符'bean'解析为null”的错误。 我已经尝试将其设置为:

<p:commandButton value="Save" actionListener="#{sessionScope[bean].save}" />

并且它再次不起作用。

谁能帮我吗?

这是代码:

crud_template.xhtml

<ui:define name="content">

    <h:form>
        <ui:insert name="create_form">
            <!-- Default -->
        </ui:insert>

        <br />
        <br />
        <p:separator />
        <p:commandButton value="Save" actionListener="#{bean.save}" />
        <p:commandButton value="Cancel" actionListener="#{bean.cancel}" />
    </h:form>

</ui:define>

familyPersist.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:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="/WEB-INF/templates/crud_template.xhtml">

    <ui:param name="bean" value="#{familyBean}" />

    <ui:define name="create_form">
        <h:panelGrid columns="3">
            <h:outputLabel value="Name*:" for="itemName" />
            <p:inputText id="itemName" required="true"
                value="#{familyBean.item.nmFamily}" />
        </h:panelGrid>
    </ui:define>

</ui:composition>
</html>

CrudBean.java

public abstract class CrudBean<T> {

    protected T item;

    private String redirect() {
        return "/pages/protected/" + getEntityName() + "List.jsf";
    }

    public String save() {
        return redirect();
    }

    public String cancel() {
        return redirect();
    }

    public abstract String getEntityName();

    /**
     * @return the item
     */
    public T getItem() {
        return item;
    }

    /**
     * @param item the item to set
     */
    public void setItem(T item) {
        this.item = item;
    }

}

FamilyBean.java

@Model
public class FamilyBean extends CrudBean<Family> {

    public FamilyBean() {
        item = new Family();
    }

    @Override
    public String getEntityName() {
        return "Family";
    }

}

最后,错误:

22:11:50,178 GRAVE [javax.faces.event] (http-localhost-127.0.0.1-8080-4) javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
    at org.apache.el.parser.AstValue.getTarget(AstValue.java:98)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:244)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:489)
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Thread.java:662)

编辑:

我使用以下maven命令创建项目:

mvn archetype:generate \
    -DarchetypeArtifactId=jboss-javaee6-webapp-archetype \
    -DarchetypeGroupId=org.jboss.spec.archetypes \
    -DarchetypeVersion=7.1.1.CR2

我尝试了以上所有建议,但没有运气。 最后对我有用的唯一方法是在调用方法时使用括号'()'。 我猜该属性未找到异常应该是它混淆了属性和方法的线索。 我认为这是faceface的错误,因为它与传统的JSF actionListener和操作方法调用不一致。

上面的示例适用于:

<p:commandButton value="Save" actionListener="#{bean.save()}" />

哪里

<ui:param name="bean" value="#{familyBean}" />

我从文档中读取的内容@Model等同于具有RequestScoped的@ManagedBean。

因此,如果我尝试解决此问题,则可以执行以下操作:

用户界面:PARAM

<ui:param name="bean" value="familyBean" />

crud_template.xhtml中

<p:commandButton value="Save" actionListener="#{requestscope[bean].save}" />

试试看,这应该工作。

编辑:

我确实尝试复制相同的内容,并且能够解决。

我将示例代码发布在这里供您参考。

还想分享一件事:如果未在xhtml中一次注入bean,则将无法从中获取引用。

Template page:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j">

<h:head></h:head>

<h:form>
    <ui:insert name="create_form">
        <!-- Default -->
    </ui:insert>

    <br />
    <br />

    <h:commandLink id="link" value="Name Converted">
        <f:ajax event="click" listener="#{requestScope[beantt].convertNameToUpperCase2}" execute="dateOfExpense" render="dateOfExpense" />
    </h:commandLink>

</h:form>
</ui:composition>

测试页样本:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j">

<f:view>
    <h:body>
        <ui:composition template="testTemplate.xhtml">

            <ui:param name="beantt" value="helloWorld" />

            <ui:define name="create_form">
                <h:panelGrid columns="3">
                    <h:outputLabel value="Name*:" for="itemName" />
                    <h:inputText size="20" value="#{helloWorld.name}" id="dateOfExpense"/>
                    <h:outputText value="#{requestScope}" />
                </h:panelGrid>

            </ui:define>

        </ui:composition>

    </h:body>
</f:view>

</ui:composition>

后端bean类:(不适用于原型)

 @Named("helloWorld")   //@Model was not available in my project
 public class HelloWorldBean {

    private String name;

    //Getters and Setters

    Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

    public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
         LOG.debug("Inside Bean");
         name = name.toUpperCase();
    }
 }

更新的豆类

 @javax.faces.bean.ManagedBean(name="helloWorld")
 @javax.enterprise.context.RequestScoped
 public class HelloWorldBean {

private String name;

// Getters and Setters

// Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
    // LOG.debug("Inside Bean");
    name = name.toUpperCase();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

我还显示了请求范围内的所有可用变量,这将有助于查找所寻找的键是否实际可用。

更新这是我到目前为止的观察。 如果尝试连接@ Named,@ Model(在UI中无法正常使用,则意味着无法在xhtmls中解析)。

CDI更像是将服务注入控制器或此处的ManagedBean。

例如,展示CDI的样本:

@Named("testCon")
public class TestConsumer {

public String convertNameToUpperCase2(String name) {
    // LOG.debug("Inside Bean");
    return  name.toUpperCase();
}

}

@ javax.faces.bean.ManagedBean(name =“ helloWorld”)@ javax.enterprise.context.RequestScoped公共类HelloWorldBean {

@Inject
@Named("testCon")
private TestConsumer test;

private String name;

// Getters and Setters

// Logger LOG = LoggerFactory.getLogger(HelloWorldBean.class);

public void convertNameToUpperCase2(AjaxBehaviorEvent event) {
    name = test.convertNameToUpperCase2(name);
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM