简体   繁体   English

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

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

I'm having a lot of trouble trying to pass a managed bean as param at a facelet template. 我在尝试将托管bean作为facelet模板的参数传递时遇到很多麻烦。 I'm trying to create a variable at a facelet template and pass its value through ui:param, but i'm constantly having the "Target Unreachable, identifier 'bean' resolved to null" error. 我正在尝试在facelet模板上创建一个变量,并将其值通过ui:param传递,但是我一直在出现“ Target Unreachable,标识符'bean'解析为null”的错误。 I already tryed to set it like: 我已经尝试将其设置为:

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

and it again do not work. 并且它再次不起作用。

Can anyone help me please? 谁能帮我吗?

Here is the code: 这是代码:

crud_template.xhtml 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 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 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 FamilyBean.java

@Model
public class FamilyBean extends CrudBean<Family> {

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

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

}

And finally, the error: 最后,错误:

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)

EDIT: 编辑:

I create my project using this maven command: 我使用以下maven命令创建项目:

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

I tried all the above suggestions but no luck. 我尝试了以上所有建议,但没有运气。 The only thing that finally worked for me is to use Parentheses '()' when invoking a method. 最后对我有用的唯一方法是在调用方法时使用括号'()'。 I guess that the property not found exception should have been a clue that it confused property with method. 我猜该属性未找到异常应该是它混淆了属性和方法的线索。 I believe this to be a bug with facelets as it is inconsistent with traditional JSF actionListener and action methods invocation. 我认为这是faceface的错误,因为它与传统的JSF actionListener和操作方法调用不一致。

the example above should work with: 上面的示例适用于:

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

where 哪里

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

What I read from the documents, @Model is equivalent to @ManagedBean with RequestScoped. 我从文档中读取的内容@Model等同于具有RequestScoped的@ManagedBean。

So if I try to fix the same, I can do something like: 因此,如果我尝试解决此问题,则可以执行以下操作:

ui:param 用户界面:PARAM

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

In crud_template.xhtml : crud_template.xhtml中

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

Try this out, this should work. 试试看,这应该工作。

Edit: 编辑:

I did try to replicate the same, and was able to work it out. 我确实尝试复制相同的内容,并且能够解决。

I am posting the sample code here for your reference. 我将示例代码发布在这里供您参考。

Also would like to share one thing: If the bean is not inject once inside the xhtml, you will not be able to get the reference out of it. 还想分享一件事:如果未在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>

Sample test 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">

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

Backend bean class: (Not working with archetype) 后端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();
    }
 }

UPDATED BEAN CLASS 更新的豆类

 @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;
}
}

I have also displayed all the available variables in request scope, this will help in finding out whether the key being looked for was actually available or not. 我还显示了请求范围内的所有可用变量,这将有助于查找所寻找的键是否实际可用。

Update This is my observation so far. 更新这是我到目前为止的观察。 If you try to wire @Named, @Model (it doesn't work well with UI, means cannot resolve in xhtmls). 如果尝试连接@ Named,@ Model(在UI中无法正常使用,则意味着无法在xhtmls中解析)。

CDI is more like, injecting services into the controllers or here ManagedBean. CDI更像是将服务注入控制器或此处的ManagedBean。

eg Sample demonstrating the CDI: 例如,展示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 public class HelloWorldBean { @ 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