2011-10-16 78 views
0

在我的申请,我有我使用JSP时以下常量类JSF 2.0:我怎么能动态生成输入组件

public class Constants { 
    ... 
    public static final int MAX_NUM_OF_PICTURES = 2 
    ... 
} 

早些时候,我设法动态地呈现输入字段在此基础上的文件上传常量如下:

<% 
    for (int i = 1; i < Constants.MAX_NUM_OF_PICTURES + 1; i++) { 
%> 
<tr> 
    <td>Upload Picture <%= i %></td> 
    <td><input name="<%= i%>" type="file" /></td> 
</tr> 
<tr> 
    <td>Description <%= i %></td> 
    <td><input type="text" name="<%= "description" + i%>" id="description" /></td> 
</tr> 
<% 
    } 
%> 

目前,我正在尝试使用JSF来实现上述任务。如果这些输入字段不是动态生成的,我可以很容易地在我的支持bean定义以下属性:

@ManagedBean 
@RequestScoped 
public class MrBean { 
    ... 
    private UploadedFile picture1; 
    private String  pictDescription1; 
    ... 
} 

然而,由于这些领域目前动态生成的,我不知道我需要多少属性来定义提前捕获这些上传的文件。

如果有人能给我一个关于如何解决这个问题的建议,我将不胜感激。

最好的问候,

詹姆斯陈

回答

2

把那些性质在另一个JavaBean类,并将这些JavaBeans集合在你的托管bean。

E.g.

public class Picture { 

    private UploadedFile file; 
    private String description; 

    // ... 
} 

@ManagedBean 
@ViewScoped 
public class Profile { 

    List<Picture> pictures; 

    public Profile() { 
     pictures = new ArrayList<Picture>(); 

     for (int i = 0; i < Constants.MAX_NUM_OF_PICTURES; i++) { 
      pictures.add(new Picture()); 
     } 
    } 

    // ... 
} 

然后你可以遍历它在例如<ui:repeat>(或者<h:dataTable>,但如果你想两个重复行而不是一个,这是不是真的适合)。

<table> 
    <ui:repeat value="#{profile.pictures}" var="picture" varStatus="loop"> 
     <tr> 
      <td>Upload Picture #{loop.index + 1}</td> 
      <td><t:inputFileUpload value="#{picture.file}" /></td> 
     </tr> 
     <tr> 
      <td>Description #{loop.index + 1}</td> 
      <td><h:inputText value="#{picture.description}" /></td> 
     </tr> 
    </ui:repeat> 
</table> 

我不知道你用什么组件库来上传文件,所以我认为它只是Tomahawk。

+0

非常感谢您的帮助!我从来不知道“ui:repeat”标签。你对战斧是对的。其实,我遵循你的[迷你教程](http://stackoverflow.com/questions/5418292/jsf-2-0-file-upload/5424229#5424229)来实现这个文件上传功能。 =) –