当我尝试使用linkedhashmap来保存数据库中的条目时,此问题到了。我不知道XHTML代码在多大程度上工作,但表面上看起来很好。
问题在XHTML的这一部分中:
<tbody>
<tr>
<td>Movie:</td>
<!--td>
<h:selectOneMenu id="foundmovieid" value="#{webRental.idmovie}">
<f:selectItems id="movieid" value="#{webMovie.get_all_movies()}"></f:selectItems>
</h:selectOneMenu>
</td-->
<td>
<h:selectOneMenu value="#{webRental.idmovie}">
<f:selectItems value="#{webMovie.availableMovies.entrySet()}" var="entry"
itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</h:selectOneMenu>
</td>
</tr>
</tbody>
</table>
<h:commandButton value="Submit" action="#{webRental.save()}"></h:commandButton>
这是webrental.java:
public class WebRental {
@EJB
private RentalsFacade rf;
private String iduser;
private String idmovie;
//getters and setters
public List<Rentals> get_all_rents() {
return rf.findAll();
}
public void save() {
try {
rf.Save(iduser, idmovie);
} catch (Exception e) {
}
}
}
和webmovie.java,他的Moviefacade有一个EntityManager和一种坚持新的Pbjject电影(ID,Title,Title,Director的名称和长度(的方法:
@Named
@RequestScoped
public class WebMovie {
@EJB
private MoviesFacade mf;
private String id;
private String title;
private String director;
private int length;
private Map<String, String> availableMovies;
//geters and setters
public List<Movies> get_all_movies() {
availableMovies = new LinkedHashMap<>();
List<Movies> found = mf.findAll();
found.forEach((m) -> {
String first = m.getId();
String second = m.getTitle() + ", " + m.getDirector() + ", " + m.getLength() + " minutes.";
availableMovies.put(first,second);
});
return mf.findAll();
}
public void save() {
try {
mf.Save(id, title, director, length);
} catch (Exception e) {
}
}
}
在XHTML中,有一个静音部分,这正是我要做的(获取ID并提交它们(,但您只能看到ID。未经未来的部分是我遇到麻烦的部分,因为它说该值无效。
要解决这个问题,我必须使用"转换器"?如果是这样,我该如何实施?如果没有,我的错误是什么?
另外,在"静音"部分中,也有一个呼吁" get_all_movies((",但由于它被静音,因此不应该称呼它。我该如何在该静音部分之外称呼该功能,以便在获得映射工作后可以删除整个部分?
使用地图结果非常奇怪...我如何解决这是通过删除大多数选择性的方法,以便它是:
<f:selectItems value="#{webMovie.availableMovies}" />
然后更改我将所有内容插入地图的方式:
@PostConstruct
public void init() {
availableMovies = new HashMap<>();
mf.findAll().forEach((m) -> {
availableMovies.put((String) m.getTitle() + ", " + m.getDirector() + ", " + m.getLength() + " minutes.",(String) m.getId());
});
//Turns out that, for the selectItems to read properly the map, you have to insert the text you want to be displayed as the key, and then the value as value. I was doing it backwards.
}
这样,我就不必依赖!