工具在实体中创建了此字段:
@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;
}
我想从表单中输入年份 - 我找不到任何产生一年下拉的内容并将其转换为YEAR字段(获得Data truncation
个例外)。
我最接近的是:
<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的新手,我宁愿留下vanilla JavaEE(没有面孔库)。我在玻璃鱼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 Year数据类型的好东西),我很乐意接受它。
答案 0 :(得分:0)
您可以声明<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>