gpt4 book ai didi

java - 使用 Java Server Faces 将多个输入字段绑定(bind)到支持 bean 属性?

转载 作者:行者123 更新时间:2023-12-02 08:35:38 24 4
gpt4 key购买 nike

假设我选择了月、日和年。每人选一。现在我需要将它们绑定(bind)到单个支持 bean 属性 - java.util.Date。我如何实现我的目标?

最佳答案

三种方式:

  1. 通过 java.util.Calendar 使用三个 getter 和三个 setter 返回或中间它。
  2. 使用转换器,但这会有点棘手。
  3. 使用第三方组件,如 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默认情况下是宽松。因此,例如选择 11 月 31 日将产生 12 月 1 日。如果您想对此发出警告,您可能需要自己实现 DatePartValidator

关于java - 使用 Java Server Faces 将多个输入字段绑定(bind)到支持 bean 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com