दिलचस्प मामले (यदि आप viewParam राज्यविहीन स्टेटफुल पर गूगल आप कुछ और अधिक जानकारी मिल जाएगा)। हर किसी के लिए, निम्न न्यूनतम कोड reproduces इस:
Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<f:metadata>
<f:viewParam id="id" name="id" value="#{viewParamBean.id}"/>
</f:metadata>
<h:body>
<h:messages />
#{viewParamBean.id} <br/>
<h:form>
<h:inputText value="#{viewParamBean.text}" >
<f:validateLength minimum="2"/>
</h:inputText>
<h:commandButton value="test" action="#{viewParamBean.actionMethod}"/>
</h:form>
</h:body>
</html>
बीन:
@ManagedBean
@RequestScoped
public class ViewParamBean {
private long id;
private String text;
public void actionMethod() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
यदि आप viewparam.xhtml?id=12
साथ Facelet फोन यह 12
परदे पर प्रदर्शित करेगा। यदि आप फिर कुछ मान्य इनपुट करते हैं, उदा। aaaaa
, आईडी यूआरएल से गायब हो जाएगी, लेकिन स्क्रीन पर प्रदर्शित होती रहती है (यूई घटकों की राज्य की प्रकृति के स्वामित्व में)।
हालांकि ... जैसा कि ओपी ने बताया है, जैसे ही कोई वैधकर्ता त्रुटि होती है (जैसे a
दर्ज करना), आईडी स्थायी रूप से खो जाएगी। बाद में वैध इनपुट दर्ज करना इसे वापस नहीं लाएगा। यह लगभग एक बग की तरह लगता है, लेकिन मैंने दोनों Mojarra 2.1 और Myfaces 2.1 की कोशिश की और दोनों का एक ही व्यवहार है।
अद्यतन:
public void encodeAll(FacesContext context) throws IOException {
if (context == null) {
throw new NullPointerException();
}
// if there is a value expression, update view parameter w/ latest value after render
// QUESTION is it okay that a null string value may be suppressing the view parameter value?
// ANSWER: I'm not sure.
setSubmittedValue(getStringValue(context));
}
और फिर अधिक विशेष रूप से इस विधि:
public String getStringValue(FacesContext context) {
String result = null;
if (hasValueExpression()) {
result = getStringValueFromModel(context);
} else {
result = (null != rawValue) ? rawValue : (String) getValue();
}
return result;
}
कुछ निरीक्षण के बाद, समस्या लगती है `UIViewParameter '(Mojarra) की इस पद्धति में होने की
क्योंकि hasValueExpression()
सत्य है, यह मॉडल (बैकिंग बीन) से मूल्य प्राप्त करने का प्रयास करेगा। लेकिन चूंकि इस बीन को अनुरोध किया गया था कि इस अनुरोध के लिए इसका कोई मूल्य नहीं होगा, क्योंकि सत्यापन अभी विफल रहा है और इस प्रकार कोई मूल्य निर्धारित नहीं किया गया है।असल में, UIViewParameter
का राज्य मूल्य जो भी बैकिंग बीन डिफ़ॉल्ट रूप से लौटाता है (आमतौर पर शून्य, लेकिन यह निश्चित रूप से आपके बीन पर निर्भर करता है) द्वारा अधिलेखित किया जाता है।
एक वर्कअराउंड अपने बीन @ViewScoped
बनाने के लिए है, जो अक्सर एक बेहतर दायरा है (मुझे लगता है कि आप किसी सेवा से उपयोगकर्ता को प्राप्त करने के लिए पैरामीटर का उपयोग करते हैं, और शायद यह हर पोस्टबैक में बार-बार ऐसा करने के लिए अनावश्यक है) ।
एक और विकल्प UIViewParameter
का अपना संस्करण बनाना है जो वैधता विफल होने पर मॉडल से मूल्य प्राप्त करने का प्रयास नहीं करता है (मूल रूप से अन्य सभी UIInput
घटक करते हैं)।
आप अपने प्रस्तुत कार्रवाई में उपयोग कर रहे हैं 'includeViewParams = TRUE'? – bluefoot
नहीं, लेकिन मेरे एक्शन हैंडलर को नहीं कहा जाता है: सबमिट सत्यापन चरण में पहले विफल रहता है। – DenisGL