Динамический идентификатор в JSF/Seam

Попробуйте использовать указатель или ссылку на структуру данных с ответом в нем, и std :: condition_variable, чтобы сообщить вам, когда ответ был вычислен:

#include <iostream>           
#include <thread>             
#include <mutex>              
#include <condition_variable> 

#include <chrono>
#include <vector>

std::vector<double> g_my_answer;
std::mutex g_mtx;
std::condition_variable g_cv;
bool g_ready = false;


void Worker_treadfun_with_init()
{
  //Do your initialization here
  {
     std::unique_lock<std::mutex> lck( g_mtx );
     for( double val = 0; val < 10; val += 0.3 )
       g_my_answer.push_back( val );

     g_ready = true;
     lck.unlock();
     g_cv.notify_one();
  }

  //Keep doing your other work..., here we'll just sleep
  for( int i = 0; i < 100; ++i )
  {
    std::this_thread::sleep_for( std::chrono::seconds(1) );
  }
}

void Caller()  
{
  std::unique_lock<std::mutex> lck(g_mtx);

  std::thread worker_thread = std::thread( Worker_treadfun_with_init );

  //Calling wait will cause current thread to sleep until g_cv.notify_one() is called.
  g_cv.wait( lck, [&g_ready](){ return g_ready; } ); 

  //Print out the answer as the worker thread continues doing its work
  for( auto val : g_my_answer )
    std::cout << val << std::endl;

  //Unlock mutex (or better yet have unique_lock go out of scope)
  // incase worker thread needs to lock again to finish
  lck.unlock();  

  //...

  //Make sure to join the worker thread some time later on.
  worker_thread.join();
}

Конечно, в реальном коде вы не использовал бы глобальные переменные, а вместо этого передавал бы их по указателю или по ссылке (или как переменные-члены SomeClass) в рабочую функцию, но вы понимаете, в чем дело.

5
задан Lee Theobald 25 November 2008 в 09:17
поделиться

3 ответа

Вы видите, почему они не позволяют Вам установить идентификатор, правильно? JSF принимает идентификационное создание, потому что Вы находитесь в повторном цикле компонентов и, если бы они позволяют Вам просто установить идентификатор, Вы закончили бы с дублирующимися идентификаторами, которые не помогли бы Вам так или иначе.

Не зная, ПОЧЕМУ Вы хотите установить идентификатор явно, трудно дать Вам обходное решение. Если это для JavaScript, можно сделать то, что предлагает Grant Wagner, и позвольте JSF дать Вам, что это поместило как идентификатор. Можно также посмотреть на сгенерированный HTML и видеть, в каком формате идентификатор находится. JSF обычно использует

"form_id:loop_id:loop_index:component_id" 

как идентификатор это генерирует для компонентов в форме/повторении. Необходимо было бы быть уверены и дать идентификатор форме и тегам ui:repeat для знания, каковы они были.

Хорошо, Вы ответили, что хотите иметь тег h:message для определенного inputText в цикле, это легко.

<h:inputText id="myInput" .... />
<h:message for="myInput" ... />

Теперь, сообщения, сгенерированные для входа, будут отображены в сообщении, и JSF исказит "для" атрибута (хотя это не сгенерировано к HTML) точно так же, как это будет "идентификационный" атрибут в inputText, таким образом, они будут соответствовать.

Можно даже сделать СОБСТВЕННЫЕ сообщения в коде обработчика для движения в определенный h:message, но необходимо будет использовать вызов для clientId для получения цели сообщения, учитывая отступающий боб (не боб поддержки значения) рассматриваемого компонента.

8
ответ дан 13 December 2019 в 19:38
поделиться

Я предполагаю, что Вы хотите управлять идентификатором своего входного компонента, таким образом, можно сослаться на него позже в JavaScript?

Так как Вы не можете установить идентификатор через выражение, я делаю это:

<h:inputText id="whatever" value="..." />

Затем позже в коде:

<script type="text/javascript">
var theElement = document.getElementById('<h:outputText value="#{pagecode.whateverClientId}"/ >');
...
</script>

В pagecode:

protected HtmlInputText getWhatever() {
    if (whatever == null) {
        whatever = (HtmlInputText) findComponentInRoot("whatever");
    }
}

public String getWhateverClientId() {
    return getWhatever().getClientId(getFacesContext());
}

Надежда, которая помогает.

3
ответ дан 13 December 2019 в 19:38
поделиться

Вы попробовали использование facelets?

Это позволит Вам присваивать свои собственные идентификаторы т.е.:

me:labelKeyThingo может затем использовать идентификатор =# {labelKey} для создания уникальной маркировки. Вот пример facelet назван m:textPassword из моего плохого кода:

   <!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:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jstl/core" xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

   <ui:composition>

    <c:set var="styleClass" value="formPrompt" />
    <c:set var="requiredLabel" value="" />
    <c:choose>
        <c:when test="${required=='true'}">

            <c:set var="required" value="true" />
            <c:set var="styleClass" value="formRequiredPrompt" />
            <c:set var="requiredLabel" value="*" />
        </c:when>
    </c:choose>

    <h:panelGroup id="#{id}_formRowTemplateLabel_panelGroup">
        <h:outputLabel for="#{id}" styleClass="#{styleClass}" id="#{id}_formRowTemplate_outPut"
            value="#{label}" />
        <c:if test="${required == 'true'}">
            <h:outputText value="#{requiredLabel}" styleClass="formRequiredPromptAsterix"></h:outputText>
        </c:if>
    </h:panelGroup>

    <h:panelGroup id="#{id}_textPasswordTemplate_panelGroup">
        <h:inputSecret required="${required}" id="#{id}" value="#{property}"
            styleClass="formText">

            <f:validator validatorId="Maserati.Password" />
            <f:validateLength maximum="16" minimum="8" />
            <ui:insert name="additionalTags"></ui:insert>
        </h:inputSecret>

        <h:message styleClass="formErrorMsg" id="#{id}_textPasswordTemplate_msg" for="#{id}" />
    </h:panelGroup>

   </ui:composition>

   </html>

Это используется таким образом:

 <m:textPassword id="password" label="#{msgs.passwordPrompt}"
 property="#{individualApplicationMBean.password}"
 required="true" maxlength="16" />
0
ответ дан 13 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: