p:inputText inside ui:repeat 仅适用于最后一个元素
p:inputText inside ui:repeat works only for last element
我正在使用 JSF 和 PrimeFaces 创建图片库。我在内部使用 ui:repeat 和 p:graphicImage 来显示从数据库中检索到的图像列表。每个图像都有一个点击 p:dialog(及其各自的 id)也在 ui:repeat 中定义。在 p:dialog 中,我再次显示点击的图像,还有一个 h:form,里面有一个 p:inputText 和一个 p:commandbutton 来保存 p:inputText 的文本到 bean 的字符串 属性。问题是只有列表的最后一个图像由 ui:repeat "sees" bean 显示并设置 属性。如果在 ui:repeat 显示的最后一张图片的对话框中,我写了一条评论并单击它设置 bean 的字符串文本的命令按钮,如果我对其他图片执行相同的操作,则字符串文本为空。可能是 bean 可见性的问题。我尝试为该 bean 使用不同的范围,但无论如何它都不起作用。
这是 JSF 代码:
<ui:repeat value="#{imageShowController.images}" var="img">
<h:outputLink value="javascript:void(0)"
onclick="PF('picDialog-#{img.id}').show();">
<p:graphicImage value="#{imageShowController.streamedContent}"
width="250" height="250" cache="false">
<f:param name="id" value="#{img.id}" />
</p:graphicImage>
</h:outputLink>
<p:dialog id="picDialog-#{img.id}" widgetVar="picDialog-#{img.id}"
width="500" height="500">
<p:graphicImage value="#{imageShowController.streamedContent}">
<f:param name="id" value="#{img.id}" />
</p:graphicImage>
<h:form>
<h:panelGrid columns="2" cellpadding="5">
<p:inputText value="#{imageShowController.txt}" />
<p:commandButton value="Submit comment"
action="#{imageShowController.saveComment()}">
<f:param name="id" value="#{img.id}" />
</p:commandButton>
</h:panelGrid>
</h:form>
</p:dialog>
</ui:repeat>
这是豆子(Java):
@ManagedBean
@RequestScoped
public class ImageShowController {
@Inject
private UserSessionBean userSession;
@Inject
private ImageDaoService imagedao;
@Inject
private CommentDaoService commentdao;
private List<Image> images;
private String text;
private String id;
@PostConstruct
public void init() throws SQLException {
images = new ArrayList<>();
images = imagedao.findImagesByUserId( userSession.getUserId() );
}
public void saveComment(){
FacesContext context = FacesContext.getCurrentInstance();
String id =
context.getExternalContext().getRequestParameterMap().get("id");
Comment comment = new Comment();
comment.setText(text);
comment.setDate(new Date());
comment.setImage(imagedao.findById(Long.valueOf(id)).get(0));
commentdao.addComment(comment);
}
public StreamedContent getStreamedContent() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
return new DefaultStreamedContent();
}
else {
id =
context.getExternalContext().getRequestParameterMap().get("id");
System.out.println("INDEX: "+id);
byte [] b = null;
for (int i = 0; i < images.size(); i++) {
if(images.get(i).getId() == Long.valueOf(id)){
b = images.get(i).getPicture();
break;
}
}
return new DefaultStreamedContent(new ByteArrayInputStream(b));
}
}
}
我使用 JSTL 的标签 c:forEach 而不是 ui:repeat 解决了问题。有效!!
我正在使用 JSF 和 PrimeFaces 创建图片库。我在内部使用 ui:repeat 和 p:graphicImage 来显示从数据库中检索到的图像列表。每个图像都有一个点击 p:dialog(及其各自的 id)也在 ui:repeat 中定义。在 p:dialog 中,我再次显示点击的图像,还有一个 h:form,里面有一个 p:inputText 和一个 p:commandbutton 来保存 p:inputText 的文本到 bean 的字符串 属性。问题是只有列表的最后一个图像由 ui:repeat "sees" bean 显示并设置 属性。如果在 ui:repeat 显示的最后一张图片的对话框中,我写了一条评论并单击它设置 bean 的字符串文本的命令按钮,如果我对其他图片执行相同的操作,则字符串文本为空。可能是 bean 可见性的问题。我尝试为该 bean 使用不同的范围,但无论如何它都不起作用。
这是 JSF 代码:
<ui:repeat value="#{imageShowController.images}" var="img">
<h:outputLink value="javascript:void(0)"
onclick="PF('picDialog-#{img.id}').show();">
<p:graphicImage value="#{imageShowController.streamedContent}"
width="250" height="250" cache="false">
<f:param name="id" value="#{img.id}" />
</p:graphicImage>
</h:outputLink>
<p:dialog id="picDialog-#{img.id}" widgetVar="picDialog-#{img.id}"
width="500" height="500">
<p:graphicImage value="#{imageShowController.streamedContent}">
<f:param name="id" value="#{img.id}" />
</p:graphicImage>
<h:form>
<h:panelGrid columns="2" cellpadding="5">
<p:inputText value="#{imageShowController.txt}" />
<p:commandButton value="Submit comment"
action="#{imageShowController.saveComment()}">
<f:param name="id" value="#{img.id}" />
</p:commandButton>
</h:panelGrid>
</h:form>
</p:dialog>
</ui:repeat>
这是豆子(Java):
@ManagedBean
@RequestScoped
public class ImageShowController {
@Inject
private UserSessionBean userSession;
@Inject
private ImageDaoService imagedao;
@Inject
private CommentDaoService commentdao;
private List<Image> images;
private String text;
private String id;
@PostConstruct
public void init() throws SQLException {
images = new ArrayList<>();
images = imagedao.findImagesByUserId( userSession.getUserId() );
}
public void saveComment(){
FacesContext context = FacesContext.getCurrentInstance();
String id =
context.getExternalContext().getRequestParameterMap().get("id");
Comment comment = new Comment();
comment.setText(text);
comment.setDate(new Date());
comment.setImage(imagedao.findById(Long.valueOf(id)).get(0));
commentdao.addComment(comment);
}
public StreamedContent getStreamedContent() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
return new DefaultStreamedContent();
}
else {
id =
context.getExternalContext().getRequestParameterMap().get("id");
System.out.println("INDEX: "+id);
byte [] b = null;
for (int i = 0; i < images.size(); i++) {
if(images.get(i).getId() == Long.valueOf(id)){
b = images.get(i).getPicture();
break;
}
}
return new DefaultStreamedContent(new ByteArrayInputStream(b));
}
}
}
我使用 JSTL 的标签 c:forEach 而不是 ui:repeat 解决了问题。有效!!