2009-12-21 15 views
8

çıkmadan önce, aşağıdaki gibi bu questionEL kullanarak bir JSF bileşeni değerini nasıl alabilirim?

O var JSF form tekrar gösterilir bkz: ben <h:inputText id="amount"> yerine <input type="text" name="amount"> kullandık

<f:view> 
    <h:form> 
     <div> 
      <label>Id</label> 
      <input type="text" name="accountId"/> 
     </div> 
     <div> 
      <label>Amount</label> 
      <input type="text" name="amount"/> 
     </div> 
     <h:commandButton value="Withdraw" action="#{accountService.withdraw(param.accountId, param.amount)}"/> 
    </h:form> 
</f:view> 

Bildirimi. Seam EL çözümleyici kullanarak değerini almak için param.amount kullanın.

<input type="text" kullanırsam ve sunucu tarafında bir şeyler yanlış giderse, sayfayı tekrar göstermem gerekir. Bu nedenle, gönderilmiş değeri, no'lu adres alınmaz, çünkü bu, düz bir html kodudur. Bu nedenle, bunun yerine bir <h:inputText JSF bileşenini kullanmam gerekiyor.

Soru şu: Soru'u kullanarak bir <h:inputText JSF bileşen değeri 'u nasıl alabilirim?

+0

başlatmak için aşağıda gösterilen (yüzler-config.xml) olarak ELResolver

<application> <el-resolver>br.com.view.resolver.ComponentIdResolver</el-resolver> </application> 

? ba, sorunuz oldukça kafa karıştırıcı. Dikiş hikayesinin burada tamamen alakasız gibi gözüküyor. Gelecekte lütfen ** aslında ** sahip olduğunuz ** ** ve ** kodunuzla tam olarak ne yapmak istediğinizi söyleyin. – BalusC

+0

Bu da bir anlam ifade etmiyor. Sade JSP/Servlet'te bunun için 'tuşunu kullanmış olabilirsiniz. – BalusC

+0

JSF'nin "davlumbazlar" ın nasıl çalıştığını anlamak için iyi bir JSF kitabı/öğreticisi edinmenizi tavsiye ederim. Ayrıca "düz vanilya" JSP/Servlet'in öğrenilmesi bunu anlamada çok yardımcı olacaktır. Varsayımlar yapıyorsunuz ve tüm çalışmalarını kendi elinize alarak JSF'nin ideolojisini kırmaya çalışıyorsunuz. Kusura bakmayın, sert geliyorsa, ama gerçek bu. – BalusC

cevap

18

MTU müşteri kimliği en üst UINamingContainer bileşenlerin cliend numarası (örneğin h:form, h:dataTable, f:subview) ile başa getirilir. Oluşturulmuş HTML kaynağını web tarayıcınızda kontrol ederseniz (rightclick, source view), onları görmelisiniz. Üretilen girdi elemanlarının id ve name ana formun id ile hazırlanır. Parametre haritasında anahtarla aynı ismi kullanmanız gerekir. Ayırıcı karakteri olarak, kolon :, EL'de "yasa dışı" bir karakterdir, bunları almak için param['foo:bar'] nota notalarını kullanmanız gerekir.

public void withDraw() { 
    Map<String, String> map = FacesContext.getCurrentInstance().getRequestParameterMap(); 
    String id = map.get("account:id"); 
    String amount = map.get("account:amount"); 
    // ... 
} 
:

Dikiş-EL-benzeri yöntem parametreleri olmadan
<f:view> 
    <h:form id="account"> 
     <div> 
      <label>Id</label> 
      <h:inputText id="id" /> 
     </div> 
     <div> 
      <label>Amount</label> 
      <h:inputText id="amount" /> 
     </div> 
     <h:commandButton value="Withdraw" 
      action="#{accountService.withdraw(param['account:id'], param['account:amount'])}"/> 
    </h:form> 
</f:view> 

da tuşları olarak müşteri kimlikleri kullanarak istek parametresi haritasında erişebilirsiniz, (siz görünüşe/have it istemiyorum)

Bunun kötü olduğunu söylemek gereksiz. Sadece normal JSF yolunu yapın, değerleri fasülye özelliklerine bağlayın.

Düzenleme: düzenlediğiniz son soruya göre:

Yani soru şu: i İfade Dili kullanarak bir <h:inputText JSF bileşen değeri almak nasıl?

Bu daha önce zaten yanıtladı. JSF tarafından oluşturulan adını parametre adı olarak kullanın. Bu, genellikleformId ana UIForm bileşeninin id ve inputIdUIInput bileşeninin id bileşenidir. Oluşturulan <input type="text"> alanının tam adı için oluşturulan HTML çıkışını kontrol edin. Parametre değerini elde etmek için ['name'] destek göstergesini kullanın, çünkü kolonundaki EL harflerini ${param.formId:inputId}'daki gibi kullanamazsınız.Böylece

:

#{param['formId:inputId']} 
+0

Hm, bu sizin kendi cevabınızdı ve bunun çalışması gerekiyordu? Eh, sadece oluşturulan HTML çıktısını isimleri doğru olup olmadığını ve/veya istek parametre haritasında mevcut olup olmadığını kontrol etmeyi düşünüyorum. – BalusC

+0

Yani diyorsun * aslında * aslında * JSF sayfanızda 'h: inputText' var ve' '? Bu şekilde (ve ana form) bir "id" vermeniz ve oluşturulan istemci kimliğiyle paramızı anahtar olarak almanız gerekir. Cevabımı yakında düzenlerim. – BalusC

+0

İstek parametresi haritasındalar. Örneğin içeriğini ayıklar mısınız? System.out.println (requestParameterMap); 'onları ve kalıpları görebilmeniz için? – BalusC

1

parametre adları/inputText için kimlikleri kontrol oluşturucu ile enkapsüle edilmiştir ve ayrıca, sonuç olarak, bir uygulama ayrıntı. Pratikte, clientId'u kullanırlar. Bunları doğrudan parametre haritasından okumaya gerek yoktur; onları modele itmek ve oradan okumak için değer bağlama kullanın.

Bileşeni yönetilen bir fasülyeye bağlayarak değerleri doğrudan EL kullanarak okuyabilirsiniz.

<!-- bind a value to the request map as "foo" --> 
<h:inputText value="#{requestScope.foo}" /> 
<!-- read value from the request scope --> 
#{requestScope.foo} 

genelinde çarpışmaların neden olabilir istek harita (kirliliğine yol açmaması için hiçbir fayda üzerinden bu orada, genellikle,

<!-- bind a UIComponent to the request map as "foo" --> 
<h:inputText binding="#{requestScope.foo}" /> 
<!-- read value from a UIComponent that implements ValueHolder --> 
#{requestScope.foo.value} 

Ama: Kolaylık olması açısından, burada istek kapsamına biri ciltli var görünümler), istek kapsamını doğrudan kullanmak yerine, değerlerinizi alan adına/kapsamına almak için yönetilen bir fasulye kullanın. Sanırım onun müşteri tanımlayıcı aracılığıyla JSF bileşen değer alabilir rağmen şöyle

+0

İyi bir inspirasyon, MCDowell. (1) –

0

, bazı dezavantajı vardır: McDowell sorunun yanıtına göre

  1. , istemci tanımlayıcı istemci tanımlayıcı farklı olabilir bir uygulama ayrıntı
  2. olduğunu Kontrol hiyerarşisinde birden fazla adlandırma konteyneri olduğunda bileşen tanımlayıcısı. istemci tanımlayıcı güvenmek istemiyorsanız aşağıdaki gibi (Eylem kitapta JSF)

Yani, kendi ElResolver uygulayabilir:

public class ComponentIdResolver extends ELResolver { 

    public Object getValue(ELContext context, Object base, Object property) { 
     if (base instanceof UIComponent && property instanceof String) { 
      UIComponent r = ((UIComponent) base).findComponent((String) property); 

      if (r != null) { 
       context.setPropertyResolved(true); 

       return r; 
      } 
     } 

     return null; 
    } 

} 

Şimdi ben şöyle bir şey kullanabilirsiniz (yöntem çekilme edin)

<h:inputText id="accountId" /> 
<h:inputText id="amount" /> 
<h:commandButton value="Withdraw" action="#{accountService.withdraw(view.accountId.value, view.amount.value)}"/> 

görünümü örtülü MTU amacı, (FacesContext.getCurrentInstance() 'e benzer. getViewRoot())

sonra reg Eğer ElResolver hakkında iyi bir fikir Extending the Java EE Unified Expression Language with a Custom ELResolver

saygılarımı bkz öğrenmek istiyorsanız