0

我是 Jsf 的新手,我的要求是获取图像名称列表(如 id=1 的 n1.jpg、n2.jpg..etc 和 id= 的 n3.jpg、n4.jpg、n5.jpg...等2) 对于数据库中的特定 id,将其附加到“resources/Images/”并在浏览器中显示带有暂停和恢复按钮的幻灯片。我正在使用 primefaces 4.0、jsf 2.2、mojarra 2.2.0。我正在使用 p:imageswitch 实现幻灯片放映任务,但未显示图像。谁能帮我追踪我的错误,我也没有收到任何错误。以下是xhtml代码:

<h:selectOneMenu value="#{imageBean.selectedmp}" id="ulist">
      <f:selectItems value="#{imageBean.dropdownValues}"/>
 </h:selectOneMenu>
 <h:commandButton value="Display Images" action="#{imageBean.executeQueryImages}" />
    <div id="slider">
      <p:imageSwitch  widgetVar="switcher2" effect="none"         slideshowSpeed="100" slideshowAuto="false" >
         <ui:repeat value="#{imageBean.images}" var="image">
             <p:graphicImage value="/resources/images/#{image}" />
        </ui:repeat>
    </p:imageSwitch>  
  </div>

这是我用于执行查询并获取图像名称列表的 java 代码。我能够生成列表:

 public void executeQueryImages() {
      String query1 = "some query";
        ResultSet rs = null;
            try {
                connection = ConnectionFactory.getConnection();
                statement = connection.createStatement();
                rs = statement.executeQuery(query1);
                images = new ArrayList<String>();
                   while (rs.next()) {
                     Events ev = new Events();
                     ev.setImagename(rs.getString("simagename"));
                     String Imagename = ev.getImagename();
                     System.out.println("path:::"+Imagename);
                     images.add(Imagename);                 
                }
              }
            catch(Exception e)
            {
             e.printStackTrace();
            }
            finally
            {
                DBUtil.close(rs);
                DBUtil.close(statement);
                DBUtil.close(connection);
            }
        }
         public List<String> getImages() {
            return images;
        }
4

2 回答 2

2

这里只是一个疯狂的猜测,因为我不知道你的Image样子。

在这里,您返回图像列表:

public List<Image> getImages() {
    return images;
}

但是在这里你使用它就好像它是String

<ui:repeat value="#{imageBean.images}" var="image">
     <p:graphicImage value="/resources/images/#{image}" />
</ui:repeat>

你看,ui:repeat循环通过List<Image>你从返回getImages(),但你需要的是String(图像名称)。因此,如果您没有Image返回图像名称的方法,您可能需要一个。

/* this assumes you have field imageName in your Image class */
public String getImageName() {
    return this.imageName;
}

然后您可以将页面代码修改为以下内容:

<ui:repeat value="#{imageBean.images}" var="image">
     <p:graphicImage value="/resources/images/#{image.imageName}" />
</ui:repeat>

更新

一句警告 - 我可以在您的代码中看到您正在混合 JSF 和 PrimeFaces 组件来构建您的页面。虽然这通常不是问题,但在行为上存在一些差异 - 例如,p:commandButtonPrimeFaces 默认发出 Ajax 请求,但h:commandButton只会重新加载整个页面,除非您明确启用 Ajax。

因此,malaguna关于不更新您的评论p:imageSwitch只有在您使用p:commandButton. 此外,您似乎在按钮的action属性中有错字 - 缺少左花括号。所以它可能看起来像这样:

<p:commandButton value="Display Images" update="switchComponent"
    action="#{imageBean.executeQueryImages}" />

更新#2

PrimeFaces 4.0 似乎有一些问题 - 如果我打开浏览器控制台并重新加载页面,我可以看到消息Uncaught TypeError: Cannot read property 'msie' of undefined,来自imageswitch.js

如果您能够切换到 5.2,您的问题中的代码应该可以按预期工作 - 您只需添加两个按钮来启动/停止幻灯片:

<p:commandButton id="btnPlay" widgetVar="btnPlayWidget"
    type="button" value="Start"
    onclick="PF('switcher2').getJQ().cycle('fade'); PF('btnPlayWidget').disable(); PF('btnStopWidget').enable();" />

<p:commandButton id="btnStop" widgetVar="btnStopWidget"
    type="button" value="Stop" disabled="true"
    onclick="PF('switcher2').getJQ().cycle('stop'); PF('btnStopWidget').disable(); PF('btnPlayWidget').enable();" />

使用给定的cycle('fade')效果开始幻灯片放映(您可以在那里提供任何支持的效果)。

于 2015-09-24T13:25:38.353 回答
0

嗯,有一点很清楚,你commandButton是默认配置的,也就是使用ajax,但它并没有更新你的imageSwitch组件。

你必须给id你的imageSwitch组件一个,然后从commandButton.

就像是:

<h:commandButton 
   value="Display Images" update="switchComponent"
   action="#imageBean.executeQueryImages}" />

<div id="slider">
  <p:imageSwitch  id="switchComponent"
      widgetVar="switcher2" effect="none"
      slideshowSpeed="100" slideshowAuto="false" >

     <ui:repeat value="#{imageBean.images}" var="image">
         <p:graphicImage value="/resources/images/#{image}" />
    </ui:repeat>
  </p:imageSwitch>
</div>

如果您管理正确的图像,那么您必须这样做。我不清楚您的情况如何,因此,如果按照建议更改代码不足以解决您的问题,您将不得不向我们提供更多信息。

于 2015-09-24T12:15:45.793 回答