MySQL YEAR 字段 - 如何从 jsf 输入

标签 mysql jsf jsf-2 ejb ejb-3.0

在实体中创建此字段的工具:

@Entity
@Table(name = "movies")
public class Movie implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int idmovie;
    // etc
    @Temporal(TemporalType.DATE)
    @Column(name = "year_of_release")
    @Past(message = "Back from the future ?") // added by me
    @NotNull(message = "Please enter the year of the movie") // added by me
    private Date yearOfRelease;
}

我想从表单中输入年份 - 我找不到任何可以生成年份下拉菜单并将其转换为“年份”字段的内容(出现数据截断异常)。

我得到的最接近:

<h:outputLabel for="yearOfRelease">Year of release</h:outputLabel>
<h:inputText id="yearOfRelease"
    value="#{movieController.movie.yearOfRelease}" redisplay="true"
    converterMessage="Please enter date in yyyy-MM-dd format">
    <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>
<h:message id="yearOfReleaseMessage" for="yearOfRelease" />

似乎没有找到一个转换器来告诉jsf转换为年份。

整数是我唯一的选择吗?

另外理想情况下我想要一个下拉菜单。 I found things like

<h:selectOneListbox value="#{form.year}" size="5">
    <f:selectItem itemValue="1900" itemLabel="1900"/>
    <f:selectItem itemValue="1901" itemLabel="1901"/> ... </h:selectOneListbox>

但是肯定有办法让它自动化吗?

我是 JSF 新手,我宁愿保留普通 JavaEE(没有面孔库)。我使用的是 glassfish 4。

部分答案

// YEAR
private static final short MIN_YEAR = 1901;
private static final short MAX_YEAR = 2014; // (short) new
// java.util.Date().getYear(); // does not play with message
private static final List<Short> YEARS = new ArrayList<>(MAX_YEAR
    - MIN_YEAR + 1);
static {
    for (short i = MIN_YEAR; i <= MAX_YEAR; ++i) {
        YEARS.add(i);
    }
}
private static final String MIN_MSG = "Min release year: " + MIN_YEAR;
private static final String MAX_MSG = "Max release year: " + MAX_YEAR;
@Column(name = "year_of_release")
@NotNull(message = "Please enter the year of release of the movie")
@Min(value = 1901, message = MIN_MSG)
@Max(value = 2014, message = MAX_MSG)
private short yearOfRelease = 2014;

public List<Short> getYears() {
    return YEARS;
}

形式为:

<h:selectOneListbox id="yearOfRelease" redisplay="true"
    value="#{movieController.movie.yearOfRelease}" size="8">
    <f:selectItems value="#{movieController.movie.years}" var="entry"
        itemValue="#{entry}" itemLabel="#{entry}" />
    <f:ajax event="blur" render="yearOfReleaseMessage" />
</h:selectOneListbox>

如果有人能想出一些更优雅的东西(比如一些现成的年份下拉列表,可以验证@Past并转换为适合MySQL年份数据类型的东西),我很乐意接受。

最佳答案

您可以声明<f:selectItems />并用 bean 中的值填充它,就像这样

@RequestScoped
@ManagedBean
public class Form {

    private List<String> items = new ArrayList<>();

    @PostConstruct
    public void init() {
        for(int i=1900;i<2000;i++) {
            items.add(i);
        }
    }

    public List<String> getItems() {
        return items;
    }
}

然后在您的页面中

<h:selectOneListbox value="#{form.year}" size="5">
    <f:selectItems value="#{form.items}" var="entry"
       itemValue="#{entry}" itemLabel="#{entry}" />
</h:selectOneListbox>

关于MySQL YEAR 字段 - 如何从 jsf 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21661758/

相关文章:

jsf-2 - a4j :commandButton passing values in callback

JSF2 异常处理

php - SQL 搜索语法错误

javascript - getElementById().value 不设置隐藏输入

java - 未调用actionListener中的方法

JSF 输出文本条件显示/样式。视情况而异

image - Facelets 图像的国际化 (i18n)。是否可以?

python - 警告 : (1265L, u“第 1 行 'test_end_date' 列的数据被截断”)

mysql - 为什么我的 JOIN 会增加/可能会增加查询中的 SUM?

mysql - 获取不同值的总数