struts 框架,加入filter, 用MultipartRequest 修改request 某些值,放回request 。到action 后, form 没有值。为什么??????谢!

解决方案 »

  1.   

    检查formBean,看页面名称与formBean是否一样
      

  2.   

    if (contentType!=null && contentType.startsWith("multipart/form-data")) {
    try {
    String uploadFolder = getFilterConfig().getInitParameter("UploadFolder");
    if (uploadFolder == null)
       uploadFolder = ".";MultipartRequest multi = new MultipartRequest(servletReq,uploadFolder, 1 * 1024 * 1024);
    Enumeration params = multi.getParameterNames();
    boolean pwdFlag = false;
    String decryptedRandKey = null;
    while (params.hasMoreElements()) {
    String name = (String) params.nextElement();
    String value = multi.getParameter(name);

    if (RANDOMKEY.equals(name)){
    pwdFlag = true;
    value = decryptRandomKey(value);
    decryptedRandKey = value;
           }
           else if (pwdFlag && decryptedRandKey != null){
    //2.look for encrypted passwords and encrypt and change the value
    if (name.equals(PASSWORD)){
    value = updateRequest(value,decryptedRandKey);
    }}Enumeration files = multi.getFileNames();
        
    while (files.hasMoreElements()) {
    String name = (String) files.nextElement();
    String filename = multi.getFilesystemName(name);
    String type = multi.getContentType(name);
    File f = multi.getFile(name);
    // At this point, do something with the
    // file, as necessary
    }
    } catch (IOException e) {
    logger.error("error reading or saving file" + e);
    }chain.doFilter(request, response);
    logger.warn("----------multipart filter -Filter done!!!");

    } // end if
    ............
      

  3.   

    filter 主要内容在上面。
    formbean 没有问题。 没有filter ,系统工作的很好。想知道form和MultipartRequest 的关系。多谢。
      

  4.   

    看一下RequestProcecssor.populate方法,及其调用的RequestUtils.populate方法。对multipart的处理在里面。很早以前看的代码,具体内容全忘记了,好像涉及到几个Multipart*类
      

  5.   

    不好意思,上面fitler 落了一句,见红字:(其实那个updateRequest没有做什么,就拿到一个值而已。)if (contentType!=null && contentType.startsWith("multipart/form-data")) {
    try {
    String uploadFolder = getFilterConfig().getInitParameter("UploadFolder");
    if (uploadFolder == null)
      uploadFolder = ".";MultipartRequest multi = new MultipartRequest(servletReq,uploadFolder, 1 * 1024 * 1024);
    Enumeration params = multi.getParameterNames();
    boolean pwdFlag = false;
    String decryptedRandKey = null;
    while (params.hasMoreElements()) {
    String name = (String) params.nextElement();
    String value = multi.getParameter(name);if (RANDOMKEY.equals(name)){
    pwdFlag = true;
    value = decryptRandomKey(value);
    decryptedRandKey = value;
      }
      else if (pwdFlag && decryptedRandKey != null){
    //2.look for encrypted passwords and encrypt and change the value
    if (name.equals(PASSWORD)){
    value = updateRequest(value,decryptedRandKey);
    }}
    request.setAttribute(name, value);
    Enumeration files = multi.getFileNames();
     
    while (files.hasMoreElements()) {
    String name = (String) files.nextElement();
    String filename = multi.getFilesystemName(name);
    String type = multi.getContentType(name);
    File f = multi.getFile(name);
    // At this point, do something with the
    // file, as necessary
    }
    } catch (IOException e) {
    logger.error("error reading or saving file" + e);
    }chain.doFilter(request, response);
    logger.warn("----------multipart filter -Filter done!!!");} // end if
    ............
      

  6.   

    request.getParameterMap().put(name, value)
    试试,
    这个估计与action和formbean映射的取值方法有关系。
      

  7.   

    在filter 里 parameterMap.locked。
      

  8.   

    顶~To shine,还有其他的选择吗? 对RequestProcecssor不太有把握,还要改动web.xml... 不想改动太多我就是想知道,request里数据跟 multipart 方式提交的form啥关系????
    为啥数据在request里,form却没有。
      

  9.   

    不用改动web.xml,而是改struts-config.xml<controller>配置multipart的数据就是在上面说的地方特殊处理后变成form的令外,你红色的request.setAttribute什么意思,那个和form没关系的
      

  10.   

    哦,我说错了,我是想说改变struts-config.xml。我不想这么做,是因为,系统比较大的,而且我现在做的只是系统的某些页面需要改动,如果改strutsconfig ,感觉整个系统动到,有点心虚,刚刚接触这个系统不久;)另外,我明白你说的意思了,其实我不太应该放进request.setAttribute 应该是parameter但是filter 中这里的parameter 又不可以写 不知道这里可不可以用request wrapper, 就想上次你讲的郁闷
      

  11.   


    关键的问题是,用了multipart 之后,那个parameter 的map 完全不同了,
    难道我可以把data硬硬塞进去吗?
      

  12.   

    从form到后台的传值方法不一样 ,获取的方式也不一样把
      

  13.   

    我很久以前做过对multipart的改造,动的就是RequestProcessor不过那时弄的不是parameter,没用wrapper。主要是针对的flash的文件上传中的一个bug,他的上传报文,不符合rfc1867协议,最后竟然不是--BoundaryXxxxxxx--,而是一个"Sumbitted"或者其他什么,导致Struts1的FileUpload解析失败。按照我的经验,如果你改动的和我一样,只是针对特定问题,应该没什么问题。
      

  14.   

    我想先试一下用wrapper 把data 硬硬放到map,看看是否可以不行就用的你的方法了谢谢:-)