先说一下场景,技术是struts2+jsp。我的一个页面a.jsp中有放了一个div,用于动态加载另一个b.jsp的内容。b.jsp中可能有多个<s:file>,也可能没有。提交按钮是放在a.jsp的,也就是说a.jsp要负责上传b.jsp中选择的文件。现在的问题是:
用struts2传统的方法,在action上先定义好一个私有成员,取名跟界面上的id一致。但是我的case里b.jsp的文件上传控件id是随别人定的,我顶多是要求id必须是*_file的格式,所以这个预先定义的私有成员名字就搞不定,更别说与之关联的ContentType和FileName了。我自己考虑了一个解法方案,但由于技术不到家却实现不出来,请各位帮帮忙:
1.action中直接定义一个File[] 私有成员,以及FileContentType[]和FileName[],我不用struts2的set和get,用老方法直接在servlet中取。问题是在servlet取这些东东的API是什么?
2.把数组填值写在拦截器里。问题是struts2哪个拦截器是干这个的,如何实现?

解决方案 »

  1.   

    设置一些File[] FileContentType[] FileName[],这三个set和get方法    在页面上 建议使用 html的 file 标签  不过 你的file标签有多少个   struts2只截取file的 name属性值
      

  2.   

    我的麻烦问题就是因为file的name属性值不定造成的。
      

  3.   

    好像有点困难,楼主最好考虑下,使用iframe
      

  4.   

    学了FileUploadInterceptor,发现可以这样搞://先得到ActionInvocation invocation;ActionContext ac = invocation.getInvocationContext();HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);if (!(request instanceof MultiPartRequestWrapper)) {
        //TODO mj:报错
    }
    MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) request;
    if (multiWrapper.hasErrors()) {
        //TODO mj:报错
    }//所以request里的参数和值都在这
    Map<String, Object> params = ac.getParameters();//这个枚举是所以的file型
    Enumeration fileParameterNames = multiWrapper.getFileParameterNames();
    while (fileParameterNames != null && fileParameterNames.hasMoreElements()) {
        //取file型控件名
        String inputName = (String) fileParameterNames.nextElement();    //取文件实体
        File file = (File) params.get(inputName);
        
        //取文件类型
        String contentType = params.get(inputName + "ContentType");
        
        //取文件名
        String fileName = params.get(inputName + "FileName");    //组装在我自己的File[], FileContentType[], FileName[]中
        ……
    }这些代码直接写在action的execute里。没用拦截器,我太优雅。目前还没来得及测试,不过应该是可行的。