假設我有一個月,一天和一年的選擇。每一個選擇一個。現在我需要將它們綁定到單個支持bean屬性 - java.util.Date。我如何實現我的目標?使用Java Server Faces將多個輸入字段綁定到支持bean屬性?
0
A
回答
2
方式三:
- 後退或中間它通過
java.util.Calendar
三獲得者和三名制定者。 - 使用
Converter
,但這將是有點hacky。 - 使用第三方組件,如
rich:calendar
。
編輯:根據評論,這裏是選項2的樣子。
page.jsp
:
<h:form>
<h:selectOneMenu value="#{myBean.date}">
<f:converter converterId="datePartConverter" />
<f:attribute name="part" value="day" />
<f:selectItems value="#{myBean.days}" />
</h:selectOneMenu>
<h:selectOneMenu value="#{myBean.date}">
<f:converter converterId="datePartConverter" />
<f:attribute name="part" value="month" />
<f:selectItems value="#{myBean.months}" />
</h:selectOneMenu>
<h:selectOneMenu value="#{myBean.date}">
<f:converter converterId="datePartConverter" />
<f:attribute name="part" value="year" />
<f:selectItems value="#{myBean.years}" />
</h:selectOneMenu>
<h:commandButton value="submit" action="#{myBean.submit}"/>
<h:messages />
</h:form>
mypackage.MyBean
:
package mypackage;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.model.SelectItem;
public class MyBean {
private static List<SelectItem> days = new ArrayList<SelectItem>();
private static List<SelectItem> months = new ArrayList<SelectItem>();
private static List<SelectItem> years = new ArrayList<SelectItem>();
static {
// Just do your thing to fill them. Only ensure that those are Strings,
// else you'll need to change the type in Converter accordingly.
for (int i = 1; i <= 31; i++) days.add(new SelectItem(String.valueOf(i)));
for (int i = 1; i <= 12; i++) months.add(new SelectItem(String.valueOf(i)));
for (int i = 2000; i <= 2020; i++) years.add(new SelectItem(String.valueOf(i)));
}
private Date date;
public void submit() {
// Print submitted date to stdout.
System.out.println("Submitted date: " + date);
}
public List<SelectItem> getDays() {
return days;
}
public List<SelectItem> getMonths() {
return months;
}
public List<SelectItem> getYears() {
return years;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
mypackage.DatePartConverter
:
package mypackage;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
public class DatePartConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
String part = (String) component.getAttributes().get("part");
Date date = null;
if (context.getRenderResponse()) {
// Convert any default/selected date for display.
Date selectedDate = (Date) ((UIInput) component).getValue();
if (selectedDate != null) {
if (("day".equals(part) && new SimpleDateFormat("d").format(selectedDate).equals(value))
|| ("month".equals(part) && new SimpleDateFormat("M").format(selectedDate).equals(value))
|| ("year".equals(part) && new SimpleDateFormat("yyyy").format(selectedDate).equals(value)))
{
date = selectedDate;
}
}
} else {
// Convert submitted date after submit.
Map<String, Object> map = context.getExternalContext().getRequestMap();
if ("day".equals(part)) {
map.put("DatePartConverter.day", value); // Save until we have all parts.
} else if ("month".equals(part)) {
map.put("DatePartConverter.month", value); // Save until we have all parts.
} else if ("year".equals(part)) {
String day = (String) map.get("DatePartConverter.day");
String month = (String) map.get("DatePartConverter.month");
String dateString = String.format("%s-%s-%s", day, month, value);
try {
date = new SimpleDateFormat("d-M-yyyy").parse(dateString);
} catch (ParseException e) {
throw new ConverterException(new FacesMessage(e.getMessage()), e);
}
}
}
return date;
}
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
// Not relevant here. Just return SelectItem's value.
return (String) value;
}
faces-config.xml
<converter>
<converter-id>datePartConverter</converter-id>
<converter-class>mypackage.DatePartConverter</converter-class>
</converter>
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>mypackage.MyBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
請注意,沒有Validator
,並且SimpleDateFormat
默認爲lenient
。因此,選擇例如11月31日將產生1月1日。如果您想提醒您,可能需要自行實施DatePartValidator
。
0
時說:「結合」和「支持bean」,你應該參考以下:
<h:inputText binding="#{myBean.myTextField}" />
,並在bean有private UIInput
。
如果是這樣 - 不,你不能這樣綁定。那麼,我不確定你是否在技術上可以 - 但它肯定會產生意想不到的效果。
但是,如果你希望定位管Bean屬性,那麼你就可以,例如:
<h:inputText value="#{myBean.myProperty.day}" />
<h:inputText value="#{myBean.myProperty.year}" />
+0
感謝您的回覆。任何解決方法? – 2009-12-18 20:58:51
相關問題
- 1. 如何使用嚮導將輸入框值綁定到支持bean屬性中的映射值
- 2. 如何在綁定到支持bean後獲得自定義後處理? Java Server Faces
- 3. 將Model屬性綁定到多個字段
- 4. 綁定到陣列支持的屬性
- 5. 使用knockout.js將兩個值綁定到輸入字段
- 6. 將輸入字段綁定到列表
- 7. 綁定到多個屬性
- 8. 對一個屬性使用多個輸入字段
- 9. 如果將相同的支持bean屬性綁定到同一表單中的兩個輸入字段,那麼JSF的行爲是什麼?
- 10. 如何將Java Spring time屬性綁定到Thymeleaf字段?
- 11. Java綁定bean到字符串空屬性
- 12. 如何將多個片段綁定到表單中的一個輸入字段
- 13. 如何使用JAXB將子元素屬性綁定到字段?
- 14. ASP.NET:將HyperLinkColumn綁定到多個字段
- 15. 屬性到多個字段
- 16. 強制JSF bean驗證我的bean的所有字段,不僅綁定到輸入字段的那些字段
- 17. 在Java Server Faces中使用託管屬性和命令按鈕
- 18. 什麼瀏覽器支持輸入屬性 - 多個
- 19. WTForms支持輸入只讀屬性?
- 20. Backbone綁定模型屬性到輸入
- 21. 使用Java Server Faces的HTTPS
- 22. 如何將<rich:dataTable>綁定到支持bean?
- 23. 需要將<h:link>綁定到我的支持bean中
- 24. Java Server Faces - 導入圖像
- 25. 如何將多個bean中定義的屬性合併爲單個(屬性)bean?
- 26. 將DetailsView字段綁定到函數而不是屬性
- 27. 將多個字段綁定到MVC 3視圖模型的相同屬性
- 28. 將Bean屬性綁定到GXT 3.0中的TextField中
- 29. 是否可以在Java Server Faces中創建只寫字段綁定?
- 30. UWP C#/ XAML Slider值不支持綁定的支持屬性
哪個JSF版本? 1.2還是2.0?任何第三方組件庫? – BalusC 2009-12-18 22:25:02
@BalusC JSF 1.2 – 2009-12-19 17:52:08