0

我正在尝试通过构建简单的网站来学习 Spring 框架,现在我遇到了一个问题。

我想做这样的事情:用户选择要上传的文件并从列表中选择它是什么类型的文件。现在我有这样的事情:

<form:form modelAttribute="uploadItem" method="post" enctype="multipart/form-data">
<fieldset>
    <div class="form_elem">
        <label for="file">File</label> 
        <input type="file" name="fileData"/>
</div>
<div class="form_elem">
        <label for="file_type">File type</label> 
        <form:select path="fileType">
                    <form:options items="${fileTypes}" />
        </form:select>
</div>
<input type="submit"/>
</fieldset>

现在在我的控制器中我有

@RequestMapping(value = "/addWordFile", method = RequestMethod.GET)
public String showFileAdder(Model model) {
    model.addAttribute(new UploadItem());
    model.addAttribute("fileTypes", Arrays.asList("first type", "second type"));
    return "questionFileAdd";
}

@RequestMapping(value = "/addWordFile", method = RequestMethod.POST)
public String processUploadedFile(UploadItem uploadItem, Model model)
        throws Exception {
    String type=uploadItem.getFileType();
    return showFileAdder(model);
}

这是问题所在,当用户选择文件类型时,我只得到一个字符串,我需要手动创建一个对象,比如 SimpleFileFileReader 使用类作为名称,或者只对我支持的每种文件类型使用大 switch-case 语句。

是否可以以 html 形式显示字符串,但是当它被处理时,我会得到某个类的对象?

4

1 回答 1

1

这是一个 OO 问题而不是 Spring 问题。你想要的是一个 SimpleFileReader 的工厂。简单地使用 aMap<String, SimpleFileReader>可能是您的解决方案:

  • 地图的keySet()包含所有文件类型
  • 从 GUI 获取文件类型后,使用map.get(fileType)获取与此类型关联的 SimpleFileReader

你也可以使用 en 枚举:

public enum FileType {
    TYPE_1 {
        public SimpleFileReader getFileReader() {
            return new Type1SimpleFileReader();
        }
    },

    TYPE_2 {
        public SimpleFileReader getFileReader() {
            return new Type2SimpleFileReader();
        }
    };

    public abstract SimpleFileReader getFileReader();
}

为您提供文件类型的FileType.values()数组。Spring 可以自动将输入字段映射到枚举,获取关联的文件阅读器就像

SimpleFileReader reader = fileType.getFileReader();
于 2012-05-04T10:59:36.173 回答