当前位置: 首页 > 面试题库 >

通过使用Java Server Faces将多个输入字段绑定到支持bean属性?

汪安然
2023-03-14
问题内容

假设我有一个月,日和年选择。每个选择一个。现在,我需要将它们绑定到单个后备bean属性-java.util.Date。我如何实现目标?


问题答案:

三种方式:

  1. 通过java.util.Calendar三个getter和三个setter来返回或居中。
  2. 利用,Converter但是这会有点麻烦。
  3. 利用第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默认情况下是lenient。因此,例如选择11月31日将产生12月1日。DatePartValidator如果要警告自己,则可能需要自己实施。



 类似资料:
  • 我正在开发一个简单的Java程序来完成一些简单的mySQL内容。它有一个用JavaFX制作的小GUI。 GUI的控制器有一个SimpleBoleanProperty,我们称之为X,它指示到数据库的连接状态。我将一些简单的东西绑定到它,比如按钮的disableProperty so send querys,如果没有连接,应该禁用它。到现在为止,一直都还不错。 我有一个标签,用于执行以下操作: 如果X

  • 问题内容: 无论如何,我可以将两个模型值绑定到一个输入字段吗? 假设我有一个输入字段,我想将其作为范围内两个变量的值,例如: 问题答案: 您不能,但是有一些解决方法。 1.使用ngChange更新其他模型 2.您可以观看模型,并在更改时更新另一个模型 如果您想使它们保持同步,则还需要注意其中的变化。 这里的例子

  • 问题内容: 我有一个带有文本字段和按钮的简单fxml。如果文本字段为空,我想禁用按钮。所以我在控制器中插入如下内容: ..那很好。问题是当我添加第二个文本字段时,如果其中一个文本字段为空,希望禁用我的按钮。那该怎么办?我尝试了以下操作,但这不起作用: 问题答案: 可以通过以下方式绑定到布尔表达式:

  • 我有一个带有文本字段和按钮的简单fxml。如果文本字段为空,我想禁用按钮。所以我在我的控制器中插入如下内容: ..这很好用。问题是,当我添加第二个文本字段时,如果其中一个文本字段为空,我希望禁用我的按钮。那怎么办呢?我尝试了以下方法,但不起作用:

  • 我有6个输入框,每个输入框有4位数字。输入4位数字后,光标将自动转到下一个输入框。所有这些都是强制性的。 现在,可以在“onChange”事件中将自动聚焦设置为下一个文本框。但如何将这6个输入框的值绑定到表单上的一个字段。我有办法吗?

  • 我有一个预览页面,需要添加或编辑模型,并显示预览。 我需要从添加表单页和编辑表单页调用预览。我要通过的模型是相同的,但来自不同的形式。 (1) ModelAttribute是否有支持这种多属性名称映射的方法?(2) 我怎么能考虑重新设计这个?考虑(a)在表单提交之前重命名表单名称/属性以使用相同的属性名称。(b) 完全删除ModelAttribute——这不是我的选项,因为我使用的是SpringM