【问题标题】:Automatically set value of a managed bean variable with JSF使用 JSF 自动设置托管 bean 变量的值
【发布时间】:2017-06-10 17:08:24
【问题描述】:

我想在后台将值传递给托管 bean。所以我有这个托管 bean:

@ManagedBean(name = "mbWorkOrderController")
@SessionScoped
public class WorkOrderController {

    // more attributes...

    private WorkOrder workOrderCurrent;

    // more code here...

    public WorkOrder getWorkOrderCurrent() {
        return workOrderCurrent;
    }

    public void setWorkOrderCurrent(WorkOrder workOrderCurrent) {
        this.workOrderCurrent = workOrderCurrent;
    }
}

它包含一个自定义类型WorkOrder 的参数workOrderCurrentWorkOrder 类有一个 applicant 类型为 String 的属性。

目前我在inputtext 中使用placeholder 来向用户展示他需要在inputText 中输入的内容。

<p:inputText id="applicant"
    value="#{mbWorkOrderController.workOrderCurrent.applicant}"
    required="true" maxlength="6"
    placeholder="#{mbUserController.userLoggedIn.username}" />

我想要做的是自动将mbUserController.userLoggedIn.username 的值传递给mbWorkOrderController.workOrderCurrent.applicant,并从我的表单中完全删除applicantinputText

我尝试使用c:set

<c:set value="#{mbUserController.userLoggedIn.username}" target="#{mbWorkOrderController}" property="workOrderCurrent.applicant" />

但不幸的是,我收到了 javax.servlet.ServletException 的消息:

“WorkOrderController”类没有“workOrderCurrent.applicant”属性。

有人给点建议吗?

【问题讨论】:

    标签: jsf primefaces jsf-2 managed-bean


    【解决方案1】:

    “WorkOrderController”类没有“workOrderCurrent.applicant”属性。

    您的&lt;c:set&gt; 语法不正确。

    <c:set value="#{mbUserController.userLoggedIn.username}"
           target="#{mbWorkOrderController}" 
           property="workOrderCurrent.applicant" />
    

    你似乎在想那个部分..

    value="#{mbWorkOrderController.workOrderCurrent.applicant}"
    

    ..在下面的封面下工作:

    WorkOrderCurrent workOrderCurrent = mbWorkOrderController.getWorkOrderCurrent();
    workOrderCurrent.setApplicant(applicant);
    mbWorkOrderController.setWorkOrderCurrent(workOrderCurrent);
    

    这不是真的。它的工作原理如下:

    mbWorkOrderController.getWorkOrderCurrent().setApplicant(applicant);
    

    因此,正确的&lt;c:set&gt; 语法如下:

    <c:set value="#{mbUserController.userLoggedIn.username}"
           target="#{mbWorkOrderController.workOrderCurrent}" 
           property="applicant" />
    

    也就是说,所有这些都不是the concrete problem you actually tried to solve 的正确解决方案。您应该在模型本身中执行模型预填充。这可以通过使用@ManagedProperty 引用另一个bean 属性并使用@PostConstruct 执行基于它的初始化来实现。

    @ManagedBean(name = "mbWorkOrderController")
    @SessionScoped
    public class WorkOrderController {
    
        @ManagedProperty("#{mbUserController.userLoggedIn}")
        private User userLoggedIn;
    
        @PostConstruct
        public void init() {
            workOrderCurrent.setApplicant(userLoggedIn.getUsername());
        }
    
        // ...
    }
    

    【讨论】:

    • 非常感谢您提供的大量帖子!这解决了我的问题。
    【解决方案2】:

    也许您可以多解释一下上下文,但这里有另一种解决方案。如果您从另一个页面导航,您可以在 URL 中传递一些工作 WorkOrder 的标识符,例如 http://host:port/context/page.xhtml?workOrderId=1

    然后,您可以像这样在托管 bean 中设置标识符:

    <h:html>
        <f:viewParam name="workOrderId" value="#{mbWorkOrderController.id}"/>
    </h:html>
    

    您必须向您的 bean 添加一个新属性:

    public class WorkOrderController {
        private long id;
        public long getId() { return id; }
        public void setId(long id) { this.id = id; }
    
        // ...
    }
    

    然后,在 JSF 设置属性后,您可以在生命周期事件中找到工单:

    <h:html>
        <f:viewParam name="workOrderId" value="#{mbWorkOrderController.id}"/>
        <f:event type="preRenderView" listener="#{mbWorkOrderController.findWorkOrder()}"/>
    </h:html>
    
    public class WorkOrderController {
        private long id;
        public long getId() { return id; }
        public void setId(long id) { this.id = id; }
    
        public void findWorkOrder() {
            this.workOrderCurrent = null /* some way of finding the work order */
        }
    
        // ...
    }
    

    此策略的优点是让您拥有可收藏的 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-29
      • 2011-06-22
      • 2014-07-17
      • 2014-10-15
      • 2012-03-24
      • 1970-01-01
      • 2012-07-31
      • 2023-03-05
      相关资源
      最近更新 更多