2017-01-25 6 views
0

Я хотел бы передать значение управляемому компоненту под капотом. Так что у меня есть это управляемый компонент:Автоматически устанавливать значение переменной управляемого компонента в JSF

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

Он держит параметр workOrderCurrent пользовательского типа WorkOrder. Класс WorkOrder имеет атрибут applicant типа String.

На данный момент я использую placeholder внутри своего inputtext, чтобы показать пользователю, что ему нужно ввести внутри inputText.

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

То, что я хочу сделать, это автоматически передать значение mbUserController.userLoggedIn.username в mbWorkOrderController.workOrderCurrent.applicant и удалить inputText для applicant полностью из моей формы.

Я пытался использовать c:set:

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

Но к сожалению, я получаю javax.servlet.ServletException с сообщением:

Класс 'WorkOrderController' не имеет свойство 'workOrderCurrent.applicant'.

У кого-нибудь есть совет?

ответ

2

Класс «WorkOrderController» не имеет свойства «workOrderCurrent.applicant».

Ваш <c:set> Синтаксис неверен.

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

Вы, кажется, думает, что часть ..

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

..works под одеялом, как показано ниже:

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

Это не верно. Он работает под одеялом, как показано ниже:

mbWorkOrderController.getWorkOrderCurrent().setApplicant(applicant); 

Правильный синтаксис <c:set> поэтому, как показано ниже:

<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()); 
    } 

    // ... 
} 
+0

Большое спасибо за обширное сообщение! Это решило мою проблему. – antarkt1s

0

Возможно, вы могли бы объяснить контекст немного больше, но вот еще одно решение. Если вы переходите с другой страницы, вы можете передать некоторый идентификатор работы WorkOrder в URL-адресе, например, http://host:port/context/page.xhtml?workOrderId=1.

Затем вы можете установить идентификатор в управляемом компоненте, как это:

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

Вы должны добавить новое свойство к вашему боба:

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 */ 
    } 

    // ... 
} 

Эта стратегия имеет dvantage позволяет вам иметь URL-адреса, доступные для закладок.

Смежные вопросы